From 0d8aa7ccc0e1222b95991efb9f44ba11e4996dec Mon Sep 17 00:00:00 2001 From: Alex de Mulder Date: Fri, 22 Aug 2014 17:51:26 +0200 Subject: [PATCH 1/4] Added the groups.visibility option and example --- dist/vis.js | 9717 +++++++++++++------------ docs/graph2d.html | 9 + examples/graph2d/14_toggleGroups.html | 145 + examples/graph2d/index.html | 1 + lib/timeline/Graph2d.js | 2 +- lib/timeline/component/LineGraph.js | 9 +- 6 files changed, 5022 insertions(+), 4861 deletions(-) create mode 100644 examples/graph2d/14_toggleGroups.html diff --git a/dist/vis.js b/dist/vis.js index b52076f0..52e61e0d 100644 --- a/dist/vis.js +++ b/dist/vis.js @@ -6553,7 +6553,7 @@ return /******/ (function(modules) { // webpackBootstrap */ Graph2d.prototype.isGroupVisible = function(groupId) { if (this.linegraph.groups[groupId] !== undefined) { - return this.linegraph.groups[groupId].visible; + return (this.linegraph.groups[groupId].visible && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)); } else { return false; @@ -6827,7 +6827,7 @@ return /******/ (function(modules) { // webpackBootstrap /***/ function(module, exports, __webpack_require__) { var util = __webpack_require__(1); - var hammerUtil = __webpack_require__(44); + var hammerUtil = __webpack_require__(43); var moment = __webpack_require__(40); var Component = __webpack_require__(18); @@ -8019,7 +8019,7 @@ return /******/ (function(modules) { // webpackBootstrap var util = __webpack_require__(1); var Component = __webpack_require__(18); var moment = __webpack_require__(40); - var locales = __webpack_require__(43); + var locales = __webpack_require__(44); /** * A current time bar @@ -8167,7 +8167,7 @@ return /******/ (function(modules) { // webpackBootstrap var util = __webpack_require__(1); var Component = __webpack_require__(18); var moment = __webpack_require__(40); - var locales = __webpack_require__(43); + var locales = __webpack_require__(44); /** * A custom time bar @@ -11116,6 +11116,9 @@ return /******/ (function(modules) { // webpackBootstrap visible: true, position: 'top-right' // top/bottom - left,right } + }, + groups: { + visibility: {} } }; @@ -11226,7 +11229,7 @@ return /******/ (function(modules) { // webpackBootstrap */ LineGraph.prototype.setOptions = function(options) { if (options) { - var fields = ['sampling','defaultGroup','graphHeight','yAxisOrientation','style','barChart','dataAxis','sort']; + var fields = ['sampling','defaultGroup','graphHeight','yAxisOrientation','style','barChart','dataAxis','sort','groups']; util.selectiveDeepExtend(fields, this.options, options); util.mergeOptions(this.options, options,'catmullRom'); util.mergeOptions(this.options, options,'drawPoints'); @@ -11599,7 +11602,7 @@ return /******/ (function(modules) { // webpackBootstrap for (var groupId in this.groups) { if (this.groups.hasOwnProperty(groupId)) { group = this.groups[groupId]; - if (group.visible == true) { + if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) { groupIds.push(groupId); } } @@ -11948,7 +11951,7 @@ return /******/ (function(modules) { // webpackBootstrap for (i = 0; i < groupIds.length; i++) { group = this.groups[groupIds[i]]; if (group.options.style == 'bar') { - if (group.visible == true) { + if (group.visible == true && (this.options.groups.visibility[groupIds[i]] === undefined || this.options.groups.visibility[groupIds[i]] == true)) { for (j = 0; j < processedGroupData[groupIds[i]].length; j++) { combinedData.push({ x: processedGroupData[groupIds[i]][j].x, @@ -13661,9 +13664,9 @@ return /******/ (function(modules) { // webpackBootstrap var Emitter = __webpack_require__(49); var Hammer = __webpack_require__(41); - var mousetrap = __webpack_require__(50); + var mousetrap = __webpack_require__(52); var util = __webpack_require__(1); - var hammerUtil = __webpack_require__(44); + var hammerUtil = __webpack_require__(43); var DataSet = __webpack_require__(3); var DataView = __webpack_require__(4); var dotparser = __webpack_require__(38); @@ -19236,7 +19239,7 @@ return /******/ (function(modules) { // webpackBootstrap // Only load hammer.js when in a browser environment // (loading hammer.js in a node.js environment gives errors) if (typeof window !== 'undefined') { - module.exports = window['Hammer'] || __webpack_require__(52); + module.exports = window['Hammer'] || __webpack_require__(50); } else { module.exports = function () { @@ -20001,27 +20004,6 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, /* 43 */ -/***/ function(module, exports, __webpack_require__) { - - // English - exports['en'] = { - current: 'current', - time: 'time' - }; - exports['en_EN'] = exports['en']; - exports['en_US'] = exports['en']; - - // Dutch - exports['nl'] = { - custom: 'aangepaste', - time: 'tijd' - }; - exports['nl_NL'] = exports['nl']; - exports['nl_BE'] = exports['nl']; - - -/***/ }, -/* 44 */ /***/ function(module, exports, __webpack_require__) { var Hammer = __webpack_require__(41); @@ -20054,6 +20036,27 @@ return /******/ (function(modules) { // webpackBootstrap }; +/***/ }, +/* 44 */ +/***/ function(module, exports, __webpack_require__) { + + // English + exports['en'] = { + current: 'current', + time: 'time' + }; + exports['en_EN'] = exports['en']; + exports['en_US'] = exports['en']; + + // Dutch + exports['nl'] = { + custom: 'aangepaste', + time: 'tijd' + }; + exports['nl_NL'] = exports['nl']; + exports['nl_BE'] = exports['nl']; + + /***/ }, /* 45 */ /***/ function(module, exports, __webpack_require__) { @@ -20534,7 +20537,7 @@ return /******/ (function(modules) { // webpackBootstrap /* 48 */ /***/ function(module, exports, __webpack_require__) { - var mousetrap = __webpack_require__(50); + var mousetrap = __webpack_require__(52); var Emitter = __webpack_require__(49); var Hammer = __webpack_require__(41); var util = __webpack_require__(1); @@ -20856,5590 +20859,5590 @@ return /******/ (function(modules) { // webpackBootstrap /* 50 */ /***/ function(module, exports, __webpack_require__) { - /** - * Copyright 2012 Craig Campbell - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + var __WEBPACK_AMD_DEFINE_RESULT__;/*! Hammer.JS - v1.1.3 - 2014-05-20 + * http://eightmedia.github.io/hammer.js * - * Mousetrap is a simple keyboard shortcut library for Javascript with - * no external dependencies + * Copyright (c) 2014 Jorik Tangelder ; + * Licensed under the MIT license */ + + (function(window, undefined) { + 'use strict'; + + /** + * @main + * @module hammer * - * @version 1.1.2 - * @url craig.is/killing/mice + * @class Hammer + * @static */ - /** - * mapping of special keycodes to their corresponding keys - * - * everything in this dictionary cannot use keypress events - * so it has to be here to map to the correct keycodes for - * keyup/keydown events - * - * @type {Object} - */ - var _MAP = { - 8: 'backspace', - 9: 'tab', - 13: 'enter', - 16: 'shift', - 17: 'ctrl', - 18: 'alt', - 20: 'capslock', - 27: 'esc', - 32: 'space', - 33: 'pageup', - 34: 'pagedown', - 35: 'end', - 36: 'home', - 37: 'left', - 38: 'up', - 39: 'right', - 40: 'down', - 45: 'ins', - 46: 'del', - 91: 'meta', - 93: 'meta', - 224: 'meta' - }, + /** + * Hammer, use this to create instances + * ```` + * var hammertime = new Hammer(myElement); + * ```` + * + * @method Hammer + * @param {HTMLElement} element + * @param {Object} [options={}] + * @return {Hammer.Instance} + */ + var Hammer = function Hammer(element, options) { + return new Hammer.Instance(element, options || {}); + }; - /** - * mapping for special characters so they can support - * - * this dictionary is only used incase you want to bind a - * keyup or keydown event to one of these keys - * - * @type {Object} - */ - _KEYCODE_MAP = { - 106: '*', - 107: '+', - 109: '-', - 110: '.', - 111 : '/', - 186: ';', - 187: '=', - 188: ',', - 189: '-', - 190: '.', - 191: '/', - 192: '`', - 219: '[', - 220: '\\', - 221: ']', - 222: '\'' - }, + /** + * version, as defined in package.json + * the value will be set at each build + * @property VERSION + * @final + * @type {String} + */ + Hammer.VERSION = '1.1.3'; - /** - * this is a mapping of keys that require shift on a US keypad - * back to the non shift equivelents - * - * this is so you can use keyup events with these keys - * - * note that this will only work reliably on US keyboards - * - * @type {Object} - */ - _SHIFT_MAP = { - '~': '`', - '!': '1', - '@': '2', - '#': '3', - '$': '4', - '%': '5', - '^': '6', - '&': '7', - '*': '8', - '(': '9', - ')': '0', - '_': '-', - '+': '=', - ':': ';', - '\"': '\'', - '<': ',', - '>': '.', - '?': '/', - '|': '\\' - }, + /** + * default settings. + * more settings are defined per gesture at `/gestures`. Each gesture can be disabled/enabled + * by setting it's name (like `swipe`) to false. + * You can set the defaults for all instances by changing this object before creating an instance. + * @example + * ```` + * Hammer.defaults.drag = false; + * Hammer.defaults.behavior.touchAction = 'pan-y'; + * delete Hammer.defaults.behavior.userSelect; + * ```` + * @property defaults + * @type {Object} + */ + Hammer.defaults = { + /** + * this setting object adds styles and attributes to the element to prevent the browser from doing + * its native behavior. The css properties are auto prefixed for the browsers when needed. + * @property defaults.behavior + * @type {Object} + */ + behavior: { + /** + * Disables text selection to improve the dragging gesture. When the value is `none` it also sets + * `onselectstart=false` for IE on the element. Mainly for desktop browsers. + * @property defaults.behavior.userSelect + * @type {String} + * @default 'none' + */ + userSelect: 'none', - /** - * this is a list of special strings you can use to map - * to modifier keys when you specify your keyboard shortcuts - * - * @type {Object} - */ - _SPECIAL_ALIASES = { - 'option': 'alt', - 'command': 'meta', - 'return': 'enter', - 'escape': 'esc' - }, + /** + * Specifies whether and how a given region can be manipulated by the user (for instance, by panning or zooming). + * Used by Chrome 35> and IE10>. By default this makes the element blocking any touch event. + * @property defaults.behavior.touchAction + * @type {String} + * @default: 'pan-y' + */ + touchAction: 'pan-y', - /** - * variable to store the flipped version of _MAP from above - * needed to check if we should use keypress or not when no action - * is specified - * - * @type {Object|undefined} - */ - _REVERSE_MAP, + /** + * Disables the default callout shown when you touch and hold a touch target. + * On iOS, when you touch and hold a touch target such as a link, Safari displays + * a callout containing information about the link. This property allows you to disable that callout. + * @property defaults.behavior.touchCallout + * @type {String} + * @default 'none' + */ + touchCallout: 'none', - /** - * a list of all the callbacks setup via Mousetrap.bind() - * - * @type {Object} - */ - _callbacks = {}, + /** + * Specifies whether zooming is enabled. Used by IE10> + * @property defaults.behavior.contentZooming + * @type {String} + * @default 'none' + */ + contentZooming: 'none', - /** - * direct map of string combinations to callbacks used for trigger() - * - * @type {Object} - */ - _direct_map = {}, + /** + * Specifies that an entire element should be draggable instead of its contents. + * Mainly for desktop browsers. + * @property defaults.behavior.userDrag + * @type {String} + * @default 'none' + */ + userDrag: 'none', - /** - * keeps track of what level each sequence is at since multiple - * sequences can start out with the same sequence - * - * @type {Object} - */ - _sequence_levels = {}, + /** + * Overrides the highlight color shown when the user taps a link or a JavaScript + * clickable element in Safari on iPhone. This property obeys the alpha value, if specified. + * + * If you don't specify an alpha value, Safari on iPhone applies a default alpha value + * to the color. To disable tap highlighting, set the alpha value to 0 (invisible). + * If you set the alpha value to 1.0 (opaque), the element is not visible when tapped. + * @property defaults.behavior.tapHighlightColor + * @type {String} + * @default 'rgba(0,0,0,0)' + */ + tapHighlightColor: 'rgba(0,0,0,0)' + } + }; - /** - * variable to store the setTimeout call - * - * @type {null|number} - */ - _reset_timer, + /** + * hammer document where the base events are added at + * @property DOCUMENT + * @type {HTMLElement} + * @default window.document + */ + Hammer.DOCUMENT = document; - /** - * temporary state where we will ignore the next keyup - * - * @type {boolean|string} - */ - _ignore_next_keyup = false, + /** + * detect support for pointer events + * @property HAS_POINTEREVENTS + * @type {Boolean} + */ + Hammer.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled; - /** - * are we currently inside of a sequence? - * type of action ("keyup" or "keydown" or "keypress") or false - * - * @type {boolean|string} - */ - _inside_sequence = false; + /** + * detect support for touch events + * @property HAS_TOUCHEVENTS + * @type {Boolean} + */ + Hammer.HAS_TOUCHEVENTS = ('ontouchstart' in window); - /** - * loop through the f keys, f1 to f19 and add them to the map - * programatically - */ - for (var i = 1; i < 20; ++i) { - _MAP[111 + i] = 'f' + i; - } + /** + * detect mobile browsers + * @property IS_MOBILE + * @type {Boolean} + */ + Hammer.IS_MOBILE = /mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent); - /** - * loop through to map numbers on the numeric keypad - */ - for (i = 0; i <= 9; ++i) { - _MAP[i + 96] = i; - } + /** + * detect if we want to support mouseevents at all + * @property NO_MOUSEEVENTS + * @type {Boolean} + */ + Hammer.NO_MOUSEEVENTS = (Hammer.HAS_TOUCHEVENTS && Hammer.IS_MOBILE) || Hammer.HAS_POINTEREVENTS; - /** - * cross browser add event method - * - * @param {Element|HTMLDocument} object - * @param {string} type - * @param {Function} callback - * @returns void - */ - function _addEvent(object, type, callback) { - if (object.addEventListener) { - return object.addEventListener(type, callback, false); - } + /** + * interval in which Hammer recalculates current velocity/direction/angle in ms + * @property CALCULATE_INTERVAL + * @type {Number} + * @default 25 + */ + Hammer.CALCULATE_INTERVAL = 25; - object.attachEvent('on' + type, callback); - } + /** + * eventtypes per touchevent (start, move, end) are filled by `Event.determineEventTypes` on `setup` + * the object contains the DOM event names per type (`EVENT_START`, `EVENT_MOVE`, `EVENT_END`) + * @property EVENT_TYPES + * @private + * @writeOnce + * @type {Object} + */ + var EVENT_TYPES = {}; - /** - * takes the event and returns the key character - * - * @param {Event} e - * @return {string} - */ - function _characterFromEvent(e) { + /** + * direction strings, for safe comparisons + * @property DIRECTION_DOWN|LEFT|UP|RIGHT + * @final + * @type {String} + * @default 'down' 'left' 'up' 'right' + */ + var DIRECTION_DOWN = Hammer.DIRECTION_DOWN = 'down'; + var DIRECTION_LEFT = Hammer.DIRECTION_LEFT = 'left'; + var DIRECTION_UP = Hammer.DIRECTION_UP = 'up'; + var DIRECTION_RIGHT = Hammer.DIRECTION_RIGHT = 'right'; - // for keypress events we should return the character as is - if (e.type == 'keypress') { - return String.fromCharCode(e.which); - } + /** + * pointertype strings, for safe comparisons + * @property POINTER_MOUSE|TOUCH|PEN + * @final + * @type {String} + * @default 'mouse' 'touch' 'pen' + */ + var POINTER_MOUSE = Hammer.POINTER_MOUSE = 'mouse'; + var POINTER_TOUCH = Hammer.POINTER_TOUCH = 'touch'; + var POINTER_PEN = Hammer.POINTER_PEN = 'pen'; - // for non keypress events the special maps are needed - if (_MAP[e.which]) { - return _MAP[e.which]; - } + /** + * eventtypes + * @property EVENT_START|MOVE|END|RELEASE|TOUCH + * @final + * @type {String} + * @default 'start' 'change' 'move' 'end' 'release' 'touch' + */ + var EVENT_START = Hammer.EVENT_START = 'start'; + var EVENT_MOVE = Hammer.EVENT_MOVE = 'move'; + var EVENT_END = Hammer.EVENT_END = 'end'; + var EVENT_RELEASE = Hammer.EVENT_RELEASE = 'release'; + var EVENT_TOUCH = Hammer.EVENT_TOUCH = 'touch'; - if (_KEYCODE_MAP[e.which]) { - return _KEYCODE_MAP[e.which]; - } + /** + * if the window events are set... + * @property READY + * @writeOnce + * @type {Boolean} + * @default false + */ + Hammer.READY = false; - // if it is not in the special map - return String.fromCharCode(e.which).toLowerCase(); - } + /** + * plugins namespace + * @property plugins + * @type {Object} + */ + Hammer.plugins = Hammer.plugins || {}; - /** - * should we stop this event before firing off callbacks - * - * @param {Event} e - * @return {boolean} - */ - function _stop(e) { - var element = e.target || e.srcElement, - tag_name = element.tagName; + /** + * gestures namespace + * see `/gestures` for the definitions + * @property gestures + * @type {Object} + */ + Hammer.gestures = Hammer.gestures || {}; - // if the element has the class "mousetrap" then no need to stop - if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) { - return false; - } + /** + * setup events to detect gestures on the document + * this function is called when creating an new instance + * @private + */ + function setup() { + if(Hammer.READY) { + return; + } - // stop for input, select, and textarea - return tag_name == 'INPUT' || tag_name == 'SELECT' || tag_name == 'TEXTAREA' || (element.contentEditable && element.contentEditable == 'true'); - } + // find what eventtypes we add listeners to + Event.determineEventTypes(); - /** - * checks if two arrays are equal - * - * @param {Array} modifiers1 - * @param {Array} modifiers2 - * @returns {boolean} - */ - function _modifiersMatch(modifiers1, modifiers2) { - return modifiers1.sort().join(',') === modifiers2.sort().join(','); - } + // Register all gestures inside Hammer.gestures + Utils.each(Hammer.gestures, function(gesture) { + Detection.register(gesture); + }); - /** - * resets all sequence counters except for the ones passed in - * - * @param {Object} do_not_reset - * @returns void - */ - function _resetSequences(do_not_reset) { - do_not_reset = do_not_reset || {}; - - var active_sequences = false, - key; + // Add touch events on the document + Event.onTouch(Hammer.DOCUMENT, EVENT_MOVE, Detection.detect); + Event.onTouch(Hammer.DOCUMENT, EVENT_END, Detection.detect); - for (key in _sequence_levels) { - if (do_not_reset[key]) { - active_sequences = true; - continue; - } - _sequence_levels[key] = 0; - } + // Hammer is ready...! + Hammer.READY = true; + } - if (!active_sequences) { - _inside_sequence = false; - } - } + /** + * @module hammer + * + * @class Utils + * @static + */ + var Utils = Hammer.utils = { + /** + * extend method, could also be used for cloning when `dest` is an empty object. + * changes the dest object + * @method extend + * @param {Object} dest + * @param {Object} src + * @param {Boolean} [merge=false] do a merge + * @return {Object} dest + */ + extend: function extend(dest, src, merge) { + for(var key in src) { + if(!src.hasOwnProperty(key) || (dest[key] !== undefined && merge)) { + continue; + } + dest[key] = src[key]; + } + return dest; + }, - /** - * finds all callbacks that match based on the keycode, modifiers, - * and action - * - * @param {string} character - * @param {Array} modifiers - * @param {string} action - * @param {boolean=} remove - should we remove any matches - * @param {string=} combination - * @returns {Array} - */ - function _getMatches(character, modifiers, action, remove, combination) { - var i, - callback, - matches = []; + /** + * simple addEventListener wrapper + * @method on + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + */ + on: function on(element, type, handler) { + element.addEventListener(type, handler, false); + }, - // if there are no events related to this keycode - if (!_callbacks[character]) { - return []; - } + /** + * simple removeEventListener wrapper + * @method off + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + */ + off: function off(element, type, handler) { + element.removeEventListener(type, handler, false); + }, - // if a modifier key is coming up on its own we should allow it - if (action == 'keyup' && _isModifier(character)) { - modifiers = [character]; - } + /** + * forEach over arrays and objects + * @method each + * @param {Object|Array} obj + * @param {Function} iterator + * @param {any} iterator.item + * @param {Number} iterator.index + * @param {Object|Array} iterator.obj the source object + * @param {Object} context value to use as `this` in the iterator + */ + each: function each(obj, iterator, context) { + var i, len; - // loop through all callbacks for the key that was pressed - // and see if any of them match - for (i = 0; i < _callbacks[character].length; ++i) { - callback = _callbacks[character][i]; + // native forEach on arrays + if('forEach' in obj) { + obj.forEach(iterator, context); + // arrays + } else if(obj.length !== undefined) { + for(i = 0, len = obj.length; i < len; i++) { + if(iterator.call(context, obj[i], i, obj) === false) { + return; + } + } + // objects + } else { + for(i in obj) { + if(obj.hasOwnProperty(i) && + iterator.call(context, obj[i], i, obj) === false) { + return; + } + } + } + }, - // if this is a sequence but it is not at the right level - // then move onto the next match - if (callback.seq && _sequence_levels[callback.seq] != callback.level) { - continue; - } + /** + * find if a string contains the string using indexOf + * @method inStr + * @param {String} src + * @param {String} find + * @return {Boolean} found + */ + inStr: function inStr(src, find) { + return src.indexOf(find) > -1; + }, - // if the action we are looking for doesn't match the action we got - // then we should keep going - if (action != callback.action) { - continue; - } + /** + * find if a array contains the object using indexOf or a simple polyfill + * @method inArray + * @param {String} src + * @param {String} find + * @return {Boolean|Number} false when not found, or the index + */ + inArray: function inArray(src, find) { + if(src.indexOf) { + var index = src.indexOf(find); + return (index === -1) ? false : index; + } else { + for(var i = 0, len = src.length; i < len; i++) { + if(src[i] === find) { + return i; + } + } + return false; + } + }, - // if this is a keypress event that means that we need to only - // look at the character, otherwise check the modifiers as - // well - if (action == 'keypress' || _modifiersMatch(modifiers, callback.modifiers)) { + /** + * convert an array-like object (`arguments`, `touchlist`) to an array + * @method toArray + * @param {Object} obj + * @return {Array} + */ + toArray: function toArray(obj) { + return Array.prototype.slice.call(obj, 0); + }, - // remove is used so if you change your mind and call bind a - // second time with a new function the first one is overwritten - if (remove && callback.combo == combination) { - _callbacks[character].splice(i, 1); - } + /** + * find if a node is in the given parent + * @method hasParent + * @param {HTMLElement} node + * @param {HTMLElement} parent + * @return {Boolean} found + */ + hasParent: function hasParent(node, parent) { + while(node) { + if(node == parent) { + return true; + } + node = node.parentNode; + } + return false; + }, - matches.push(callback); - } - } + /** + * get the center of all the touches + * @method getCenter + * @param {Array} touches + * @return {Object} center contains `pageX`, `pageY`, `clientX` and `clientY` properties + */ + getCenter: function getCenter(touches) { + var pageX = [], + pageY = [], + clientX = [], + clientY = [], + min = Math.min, + max = Math.max; - return matches; - } + // no need to loop when only one touch + if(touches.length === 1) { + return { + pageX: touches[0].pageX, + pageY: touches[0].pageY, + clientX: touches[0].clientX, + clientY: touches[0].clientY + }; + } - /** - * takes a key event and figures out what the modifiers are - * - * @param {Event} e - * @returns {Array} - */ - function _eventModifiers(e) { - var modifiers = []; + Utils.each(touches, function(touch) { + pageX.push(touch.pageX); + pageY.push(touch.pageY); + clientX.push(touch.clientX); + clientY.push(touch.clientY); + }); - if (e.shiftKey) { - modifiers.push('shift'); - } + return { + pageX: (min.apply(Math, pageX) + max.apply(Math, pageX)) / 2, + pageY: (min.apply(Math, pageY) + max.apply(Math, pageY)) / 2, + clientX: (min.apply(Math, clientX) + max.apply(Math, clientX)) / 2, + clientY: (min.apply(Math, clientY) + max.apply(Math, clientY)) / 2 + }; + }, - if (e.altKey) { - modifiers.push('alt'); - } - - if (e.ctrlKey) { - modifiers.push('ctrl'); - } - - if (e.metaKey) { - modifiers.push('meta'); - } + /** + * calculate the velocity between two points. unit is in px per ms. + * @method getVelocity + * @param {Number} deltaTime + * @param {Number} deltaX + * @param {Number} deltaY + * @return {Object} velocity `x` and `y` + */ + getVelocity: function getVelocity(deltaTime, deltaX, deltaY) { + return { + x: Math.abs(deltaX / deltaTime) || 0, + y: Math.abs(deltaY / deltaTime) || 0 + }; + }, - return modifiers; - } + /** + * calculate the angle between two coordinates + * @method getAngle + * @param {Touch} touch1 + * @param {Touch} touch2 + * @return {Number} angle + */ + getAngle: function getAngle(touch1, touch2) { + var x = touch2.clientX - touch1.clientX, + y = touch2.clientY - touch1.clientY; - /** - * actually calls the callback function - * - * if your callback function returns false this will use the jquery - * convention - prevent default and stop propogation on the event - * - * @param {Function} callback - * @param {Event} e - * @returns void - */ - function _fireCallback(callback, e) { - if (callback(e) === false) { - if (e.preventDefault) { - e.preventDefault(); - } + return Math.atan2(y, x) * 180 / Math.PI; + }, - if (e.stopPropagation) { - e.stopPropagation(); - } + /** + * do a small comparision to get the direction between two touches. + * @method getDirection + * @param {Touch} touch1 + * @param {Touch} touch2 + * @return {String} direction matches `DIRECTION_LEFT|RIGHT|UP|DOWN` + */ + getDirection: function getDirection(touch1, touch2) { + var x = Math.abs(touch1.clientX - touch2.clientX), + y = Math.abs(touch1.clientY - touch2.clientY); - e.returnValue = false; - e.cancelBubble = true; - } - } + if(x >= y) { + return touch1.clientX - touch2.clientX > 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + return touch1.clientY - touch2.clientY > 0 ? DIRECTION_UP : DIRECTION_DOWN; + }, - /** - * handles a character key event - * - * @param {string} character - * @param {Event} e - * @returns void - */ - function _handleCharacter(character, e) { + /** + * calculate the distance between two touches + * @method getDistance + * @param {Touch}touch1 + * @param {Touch} touch2 + * @return {Number} distance + */ + getDistance: function getDistance(touch1, touch2) { + var x = touch2.clientX - touch1.clientX, + y = touch2.clientY - touch1.clientY; - // if this event should not happen stop here - if (_stop(e)) { - return; - } + return Math.sqrt((x * x) + (y * y)); + }, - var callbacks = _getMatches(character, _eventModifiers(e), e.type), - i, - do_not_reset = {}, - processed_sequence_callback = false; + /** + * calculate the scale factor between two touchLists + * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out + * @method getScale + * @param {Array} start array of touches + * @param {Array} end array of touches + * @return {Number} scale + */ + getScale: function getScale(start, end) { + // need two fingers... + if(start.length >= 2 && end.length >= 2) { + return this.getDistance(end[0], end[1]) / this.getDistance(start[0], start[1]); + } + return 1; + }, - // loop through matching callbacks for this key event - for (i = 0; i < callbacks.length; ++i) { + /** + * calculate the rotation degrees between two touchLists + * @method getRotation + * @param {Array} start array of touches + * @param {Array} end array of touches + * @return {Number} rotation + */ + getRotation: function getRotation(start, end) { + // need two fingers + if(start.length >= 2 && end.length >= 2) { + return this.getAngle(end[1], end[0]) - this.getAngle(start[1], start[0]); + } + return 0; + }, - // fire for all sequence callbacks - // this is because if for example you have multiple sequences - // bound such as "g i" and "g t" they both need to fire the - // callback for matching g cause otherwise you can only ever - // match the first one - if (callbacks[i].seq) { - processed_sequence_callback = true; + /** + * find out if the direction is vertical * + * @method isVertical + * @param {String} direction matches `DIRECTION_UP|DOWN` + * @return {Boolean} is_vertical + */ + isVertical: function isVertical(direction) { + return direction == DIRECTION_UP || direction == DIRECTION_DOWN; + }, - // keep a list of which sequences were matches for later - do_not_reset[callbacks[i].seq] = 1; - _fireCallback(callbacks[i].callback, e); - continue; - } + /** + * set css properties with their prefixes + * @param {HTMLElement} element + * @param {String} prop + * @param {String} value + * @param {Boolean} [toggle=true] + * @return {Boolean} + */ + setPrefixedCss: function setPrefixedCss(element, prop, value, toggle) { + var prefixes = ['', 'Webkit', 'Moz', 'O', 'ms']; + prop = Utils.toCamelCase(prop); - // if there were no sequence matches but we are still here - // that means this is a regular match so we should fire that - if (!processed_sequence_callback && !_inside_sequence) { - _fireCallback(callbacks[i].callback, e); - } - } + for(var i = 0; i < prefixes.length; i++) { + var p = prop; + // prefixes + if(prefixes[i]) { + p = prefixes[i] + p.slice(0, 1).toUpperCase() + p.slice(1); + } - // if you are inside of a sequence and the key you are pressing - // is not a modifier key then we should reset all sequences - // that were not matched by this key event - if (e.type == _inside_sequence && !_isModifier(character)) { - _resetSequences(do_not_reset); - } - } + // test the style + if(p in element.style) { + element.style[p] = (toggle == null || toggle) && value || ''; + break; + } + } + }, - /** - * handles a keydown event - * - * @param {Event} e - * @returns void - */ - function _handleKey(e) { + /** + * toggle browser default behavior by setting css properties. + * `userSelect='none'` also sets `element.onselectstart` to false + * `userDrag='none'` also sets `element.ondragstart` to false + * + * @method toggleBehavior + * @param {HtmlElement} element + * @param {Object} props + * @param {Boolean} [toggle=true] + */ + toggleBehavior: function toggleBehavior(element, props, toggle) { + if(!props || !element || !element.style) { + return; + } - // normalize e.which for key events - // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion - e.which = typeof e.which == "number" ? e.which : e.keyCode; + // set the css properties + Utils.each(props, function(value, prop) { + Utils.setPrefixedCss(element, prop, value, toggle); + }); - var character = _characterFromEvent(e); + var falseFn = toggle && function() { + return false; + }; - // no character found then stop - if (!character) { - return; - } + // also the disable onselectstart + if(props.userSelect == 'none') { + element.onselectstart = falseFn; + } + // and disable ondragstart + if(props.userDrag == 'none') { + element.ondragstart = falseFn; + } + }, - if (e.type == 'keyup' && _ignore_next_keyup == character) { - _ignore_next_keyup = false; - return; - } + /** + * convert a string with underscores to camelCase + * so prevent_default becomes preventDefault + * @param {String} str + * @return {String} camelCaseStr + */ + toCamelCase: function toCamelCase(str) { + return str.replace(/[_-]([a-z])/g, function(s) { + return s[1].toUpperCase(); + }); + } + }; - _handleCharacter(character, e); - } - /** - * determines if the keycode specified is a modifier key or not - * - * @param {string} key - * @returns {boolean} - */ - function _isModifier(key) { - return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta'; - } + /** + * @module hammer + */ + /** + * @class Event + * @static + */ + var Event = Hammer.event = { + /** + * when touch events have been fired, this is true + * this is used to stop mouse events + * @property prevent_mouseevents + * @private + * @type {Boolean} + */ + preventMouseEvents: false, - /** - * called to set a 1 second timeout on the specified sequence - * - * this is so after each key press in the sequence you have 1 second - * to press the next key before you have to start over - * - * @returns void - */ - function _resetSequenceTimer() { - clearTimeout(_reset_timer); - _reset_timer = setTimeout(_resetSequences, 1000); - } + /** + * if EVENT_START has been fired + * @property started + * @private + * @type {Boolean} + */ + started: false, - /** - * reverses the map lookup so that we can look for specific keys - * to see what can and can't use keypress - * - * @return {Object} - */ - function _getReverseMap() { - if (!_REVERSE_MAP) { - _REVERSE_MAP = {}; - for (var key in _MAP) { + /** + * when the mouse is hold down, this is true + * @property should_detect + * @private + * @type {Boolean} + */ + shouldDetect: false, - // pull out the numeric keypad from here cause keypress should - // be able to detect the keys from the character - if (key > 95 && key < 112) { - continue; - } + /** + * simple event binder with a hook and support for multiple types + * @method on + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + * @param {Function} [hook] + * @param {Object} hook.type + */ + on: function on(element, type, handler, hook) { + var types = type.split(' '); + Utils.each(types, function(type) { + Utils.on(element, type, handler); + hook && hook(type); + }); + }, - if (_MAP.hasOwnProperty(key)) { - _REVERSE_MAP[_MAP[key]] = key; - } - } - } - return _REVERSE_MAP; - } + /** + * simple event unbinder with a hook and support for multiple types + * @method off + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + * @param {Function} [hook] + * @param {Object} hook.type + */ + off: function off(element, type, handler, hook) { + var types = type.split(' '); + Utils.each(types, function(type) { + Utils.off(element, type, handler); + hook && hook(type); + }); + }, - /** - * picks the best action based on the key combination - * - * @param {string} key - character for key - * @param {Array} modifiers - * @param {string=} action passed in - */ - function _pickBestAction(key, modifiers, action) { + /** + * the core touch event handler. + * this finds out if we should to detect gestures + * @method onTouch + * @param {HTMLElement} element + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {Function} handler + * @return onTouchHandler {Function} the core event handler + */ + onTouch: function onTouch(element, eventType, handler) { + var self = this; - // if no action was picked in we should try to pick the one - // that we think would work best for this key - if (!action) { - action = _getReverseMap()[key] ? 'keydown' : 'keypress'; - } + var onTouchHandler = function onTouchHandler(ev) { + var srcType = ev.type.toLowerCase(), + isPointer = Hammer.HAS_POINTEREVENTS, + isMouse = Utils.inStr(srcType, 'mouse'), + triggerType; - // modifier keys don't work as expected with keypress, - // switch to keydown - if (action == 'keypress' && modifiers.length) { - action = 'keydown'; - } + // if we are in a mouseevent, but there has been a touchevent triggered in this session + // we want to do nothing. simply break out of the event. + if(isMouse && self.preventMouseEvents) { + return; - return action; - } + // mousebutton must be down + } else if(isMouse && eventType == EVENT_START && ev.button === 0) { + self.preventMouseEvents = false; + self.shouldDetect = true; + } else if(isPointer && eventType == EVENT_START) { + self.shouldDetect = (ev.buttons === 1 || PointerEvent.matchType(POINTER_TOUCH, ev)); + // just a valid start event, but no mouse + } else if(!isMouse && eventType == EVENT_START) { + self.preventMouseEvents = true; + self.shouldDetect = true; + } - /** - * binds a key sequence to an event - * - * @param {string} combo - combo specified in bind call - * @param {Array} keys - * @param {Function} callback - * @param {string=} action - * @returns void - */ - function _bindSequence(combo, keys, callback, action) { + // update the pointer event before entering the detection + if(isPointer && eventType != EVENT_END) { + PointerEvent.updatePointer(eventType, ev); + } - // start off by adding a sequence level record for this combination - // and setting the level to 0 - _sequence_levels[combo] = 0; + // we are in a touch/down state, so allowed detection of gestures + if(self.shouldDetect) { + triggerType = self.doDetect.call(self, ev, eventType, element, handler); + } - // if there is no action pick the best one for the first key - // in the sequence - if (!action) { - action = _pickBestAction(keys[0], []); - } + // ...and we are done with the detection + // so reset everything to start each detection totally fresh + if(triggerType == EVENT_END) { + self.preventMouseEvents = false; + self.shouldDetect = false; + PointerEvent.reset(); + // update the pointerevent object after the detection + } - /** - * callback to increase the sequence level for this sequence and reset - * all other sequences that were active - * - * @param {Event} e - * @returns void - */ - var _increaseSequence = function(e) { - _inside_sequence = action; - ++_sequence_levels[combo]; - _resetSequenceTimer(); - }, + if(isPointer && eventType == EVENT_END) { + PointerEvent.updatePointer(eventType, ev); + } + }; - /** - * wraps the specified callback inside of another function in order - * to reset all sequence counters as soon as this sequence is done - * - * @param {Event} e - * @returns void - */ - _callbackAndReset = function(e) { - _fireCallback(callback, e); + this.on(element, EVENT_TYPES[eventType], onTouchHandler); + return onTouchHandler; + }, - // we should ignore the next key up if the action is key down - // or keypress. this is so if you finish a sequence and - // release the key the final key will not trigger a keyup - if (action !== 'keyup') { - _ignore_next_keyup = _characterFromEvent(e); - } + /** + * the core detection method + * this finds out what hammer-touch-events to trigger + * @method doDetect + * @param {Object} ev + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {HTMLElement} element + * @param {Function} handler + * @return {String} triggerType matches `EVENT_START|MOVE|END` + */ + doDetect: function doDetect(ev, eventType, element, handler) { + var touchList = this.getTouchList(ev, eventType); + var touchListLength = touchList.length; + var triggerType = eventType; + var triggerChange = touchList.trigger; // used by fakeMultitouch plugin + var changedLength = touchListLength; - // weird race condition if a sequence ends with the key - // another sequence begins with - setTimeout(_resetSequences, 10); - }, - i; + // at each touchstart-like event we want also want to trigger a TOUCH event... + if(eventType == EVENT_START) { + triggerChange = EVENT_TOUCH; + // ...the same for a touchend-like event + } else if(eventType == EVENT_END) { + triggerChange = EVENT_RELEASE; - // loop through keys one at a time and bind the appropriate callback - // function. for any key leading up to the final one it should - // increase the sequence. after the final, it should reset all sequences - for (i = 0; i < keys.length; ++i) { - _bindSingle(keys[i], i < keys.length - 1 ? _increaseSequence : _callbackAndReset, action, combo, i); - } - } - - /** - * binds a single keyboard combination - * - * @param {string} combination - * @param {Function} callback - * @param {string=} action - * @param {string=} sequence_name - name of sequence if part of sequence - * @param {number=} level - what part of the sequence the command is - * @returns void - */ - function _bindSingle(combination, callback, action, sequence_name, level) { + // keep track of how many touches have been removed + changedLength = touchList.length - ((ev.changedTouches) ? ev.changedTouches.length : 1); + } - // make sure multiple spaces in a row become a single space - combination = combination.replace(/\s+/g, ' '); + // after there are still touches on the screen, + // we just want to trigger a MOVE event. so change the START or END to a MOVE + // but only after detection has been started, the first time we actualy want a START + if(changedLength > 0 && this.started) { + triggerType = EVENT_MOVE; + } - var sequence = combination.split(' '), - i, - key, - keys, - modifiers = []; + // detection has been started, we keep track of this, see above + this.started = true; - // if this pattern is a sequence of keys then run through this method - // to reprocess each pattern one key at a time - if (sequence.length > 1) { - return _bindSequence(combination, sequence, callback, action); - } + // generate some event data, some basic information + var evData = this.collectEventData(element, triggerType, touchList, ev); - // take the keys from this pattern and figure out what the actual - // pattern is all about - keys = combination === '+' ? ['+'] : combination.split('+'); + // trigger the triggerType event before the change (TOUCH, RELEASE) events + // but the END event should be at last + if(eventType != EVENT_END) { + handler.call(Detection, evData); + } - for (i = 0; i < keys.length; ++i) { - key = keys[i]; + // trigger a change (TOUCH, RELEASE) event, this means the length of the touches changed + if(triggerChange) { + evData.changedLength = changedLength; + evData.eventType = triggerChange; - // normalize key names - if (_SPECIAL_ALIASES[key]) { - key = _SPECIAL_ALIASES[key]; - } + handler.call(Detection, evData); - // if this is not a keypress event then we should - // be smart about using shift keys - // this will only work for US keyboards however - if (action && action != 'keypress' && _SHIFT_MAP[key]) { - key = _SHIFT_MAP[key]; - modifiers.push('shift'); - } + evData.eventType = triggerType; + delete evData.changedLength; + } - // if this key is a modifier then add it to the list of modifiers - if (_isModifier(key)) { - modifiers.push(key); - } - } + // trigger the END event + if(triggerType == EVENT_END) { + handler.call(Detection, evData); - // depending on what the key combination is - // we will try to pick the best event for it - action = _pickBestAction(key, modifiers, action); + // ...and we are done with the detection + // so reset everything to start each detection totally fresh + this.started = false; + } - // make sure to initialize array if this is the first time - // a callback is added for this key - if (!_callbacks[key]) { - _callbacks[key] = []; - } + return triggerType; + }, - // remove an existing match if there is one - _getMatches(key, modifiers, action, !sequence_name, combination); + /** + * we have different events for each device/browser + * determine what we need and set them in the EVENT_TYPES constant + * the `onTouch` method is bind to these properties. + * @method determineEventTypes + * @return {Object} events + */ + determineEventTypes: function determineEventTypes() { + var types; + if(Hammer.HAS_POINTEREVENTS) { + if(window.PointerEvent) { + types = [ + 'pointerdown', + 'pointermove', + 'pointerup pointercancel lostpointercapture' + ]; + } else { + types = [ + 'MSPointerDown', + 'MSPointerMove', + 'MSPointerUp MSPointerCancel MSLostPointerCapture' + ]; + } + } else if(Hammer.NO_MOUSEEVENTS) { + types = [ + 'touchstart', + 'touchmove', + 'touchend touchcancel' + ]; + } else { + types = [ + 'touchstart mousedown', + 'touchmove mousemove', + 'touchend touchcancel mouseup' + ]; + } - // add this call back to the array - // if it is a sequence put it at the beginning - // if not put it at the end - // - // this is important because the way these are processed expects - // the sequence ones to come first - _callbacks[key][sequence_name ? 'unshift' : 'push']({ - callback: callback, - modifiers: modifiers, - action: action, - seq: sequence_name, - level: level, - combo: combination - }); - } + EVENT_TYPES[EVENT_START] = types[0]; + EVENT_TYPES[EVENT_MOVE] = types[1]; + EVENT_TYPES[EVENT_END] = types[2]; + return EVENT_TYPES; + }, - /** - * binds multiple combinations to the same callback - * - * @param {Array} combinations - * @param {Function} callback - * @param {string|undefined} action - * @returns void - */ - function _bindMultiple(combinations, callback, action) { - for (var i = 0; i < combinations.length; ++i) { - _bindSingle(combinations[i], callback, action); - } - } + /** + * create touchList depending on the event + * @method getTouchList + * @param {Object} ev + * @param {String} eventType + * @return {Array} touches + */ + getTouchList: function getTouchList(ev, eventType) { + // get the fake pointerEvent touchlist + if(Hammer.HAS_POINTEREVENTS) { + return PointerEvent.getTouchList(); + } - // start! - _addEvent(document, 'keypress', _handleKey); - _addEvent(document, 'keydown', _handleKey); - _addEvent(document, 'keyup', _handleKey); + // get the touchlist + if(ev.touches) { + if(eventType == EVENT_MOVE) { + return ev.touches; + } - var mousetrap = { + var identifiers = []; + var concat = [].concat(Utils.toArray(ev.touches), Utils.toArray(ev.changedTouches)); + var touchList = []; - /** - * binds an event to mousetrap - * - * can be a single key, a combination of keys separated with +, - * a comma separated list of keys, an array of keys, or - * a sequence of keys separated by spaces - * - * be sure to list the modifier keys first to make sure that the - * correct key ends up getting bound (the last key in the pattern) - * - * @param {string|Array} keys - * @param {Function} callback - * @param {string=} action - 'keypress', 'keydown', or 'keyup' - * @returns void - */ - bind: function(keys, callback, action) { - _bindMultiple(keys instanceof Array ? keys : [keys], callback, action); - _direct_map[keys + ':' + action] = callback; - return this; - }, + Utils.each(concat, function(touch) { + if(Utils.inArray(identifiers, touch.identifier) === false) { + touchList.push(touch); + } + identifiers.push(touch.identifier); + }); - /** - * unbinds an event to mousetrap - * - * the unbinding sets the callback function of the specified key combo - * to an empty function and deletes the corresponding key in the - * _direct_map dict. - * - * the keycombo+action has to be exactly the same as - * it was defined in the bind method - * - * TODO: actually remove this from the _callbacks dictionary instead - * of binding an empty function - * - * @param {string|Array} keys - * @param {string} action - * @returns void - */ - unbind: function(keys, action) { - if (_direct_map[keys + ':' + action]) { - delete _direct_map[keys + ':' + action]; - this.bind(keys, function() {}, action); - } - return this; - }, + return touchList; + } - /** - * triggers an event that has already been bound - * - * @param {string} keys - * @param {string=} action - * @returns void - */ - trigger: function(keys, action) { - _direct_map[keys + ':' + action](); - return this; - }, + // make fake touchList from mouse position + ev.identifier = 1; + return [ev]; + }, - /** - * resets the library back to its initial state. this is useful - * if you want to clear out the current keyboard shortcuts and bind - * new ones - for example if you switch to another page - * - * @returns void - */ - reset: function() { - _callbacks = {}; - _direct_map = {}; - return this; - } - }; + /** + * collect basic event data + * @method collectEventData + * @param {HTMLElement} element + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {Array} touches + * @param {Object} ev + * @return {Object} ev + */ + collectEventData: function collectEventData(element, eventType, touches, ev) { + // find out pointerType + var pointerType = POINTER_TOUCH; + if(Utils.inStr(ev.type, 'mouse') || PointerEvent.matchType(POINTER_MOUSE, ev)) { + pointerType = POINTER_MOUSE; + } else if(PointerEvent.matchType(POINTER_PEN, ev)) { + pointerType = POINTER_PEN; + } - module.exports = mousetrap; + return { + center: Utils.getCenter(touches), + timeStamp: Date.now(), + target: ev.target, + touches: touches, + eventType: eventType, + pointerType: pointerType, + srcEvent: ev, + /** + * prevent the browser default actions + * mostly used to disable scrolling of the browser + */ + preventDefault: function() { + var srcEvent = this.srcEvent; + srcEvent.preventManipulation && srcEvent.preventManipulation(); + srcEvent.preventDefault && srcEvent.preventDefault(); + }, + /** + * stop bubbling the event up to its parents + */ + stopPropagation: function() { + this.srcEvent.stopPropagation(); + }, -/***/ }, -/* 51 */ -/***/ function(module, exports, __webpack_require__) { + /** + * immediately stop gesture detection + * might be useful after a swipe was detected + * @return {*} + */ + stopDetect: function() { + return Detection.stopDetect(); + } + }; + } + }; - var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(global, module) {//! moment.js - //! version : 2.7.0 - //! authors : Tim Wood, Iskren Chernev, Moment.js contributors - //! license : MIT - //! momentjs.com - (function (undefined) { + /** + * @module hammer + * + * @class PointerEvent + * @static + */ + var PointerEvent = Hammer.PointerEvent = { + /** + * holds all pointers, by `identifier` + * @property pointers + * @type {Object} + */ + pointers: {}, - /************************************ - Constants - ************************************/ + /** + * get the pointers as an array + * @method getTouchList + * @return {Array} touchlist + */ + getTouchList: function getTouchList() { + var touchlist = []; + // we can use forEach since pointerEvents only is in IE10 + Utils.each(this.pointers, function(pointer) { + touchlist.push(pointer); + }); + return touchlist; + }, - var moment, - VERSION = "2.7.0", - // the global-scope this is NOT the global object in Node.js - globalScope = typeof global !== 'undefined' ? global : this, - oldGlobalMoment, - round = Math.round, - i, + /** + * update the position of a pointer + * @method updatePointer + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {Object} pointerEvent + */ + updatePointer: function updatePointer(eventType, pointerEvent) { + if(eventType == EVENT_END || (eventType != EVENT_END && pointerEvent.buttons !== 1)) { + delete this.pointers[pointerEvent.pointerId]; + } else { + pointerEvent.identifier = pointerEvent.pointerId; + this.pointers[pointerEvent.pointerId] = pointerEvent; + } + }, - YEAR = 0, - MONTH = 1, - DATE = 2, - HOUR = 3, - MINUTE = 4, - SECOND = 5, - MILLISECOND = 6, + /** + * check if ev matches pointertype + * @method matchType + * @param {String} pointerType matches `POINTER_MOUSE|TOUCH|PEN` + * @param {PointerEvent} ev + */ + matchType: function matchType(pointerType, ev) { + if(!ev.pointerType) { + return false; + } - // internal storage for language config files - languages = {}, + var pt = ev.pointerType, + types = {}; - // moment internal properties - momentProperties = { - _isAMomentObject: null, - _i : null, - _f : null, - _l : null, - _strict : null, - _tzm : null, - _isUTC : null, - _offset : null, // optional. Combine with _isUTC - _pf : null, - _lang : null // optional - }, + types[POINTER_MOUSE] = (pt === (ev.MSPOINTER_TYPE_MOUSE || POINTER_MOUSE)); + types[POINTER_TOUCH] = (pt === (ev.MSPOINTER_TYPE_TOUCH || POINTER_TOUCH)); + types[POINTER_PEN] = (pt === (ev.MSPOINTER_TYPE_PEN || POINTER_PEN)); + return types[pointerType]; + }, - // check for nodeJS - hasModule = (typeof module !== 'undefined' && module.exports), + /** + * reset the stored pointers + * @method reset + */ + reset: function resetList() { + this.pointers = {}; + } + }; - // ASP.NET json date format regex - aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, - aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, - // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html - // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere - isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, + /** + * @module hammer + * + * @class Detection + * @static + */ + var Detection = Hammer.detection = { + // contains all registred Hammer.gestures in the correct order + gestures: [], - // format tokens - formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g, - localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g, + // data of the current Hammer.gesture detection session + current: null, - // parsing token regexes - parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 - parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 - parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 - parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 - parseTokenDigits = /\d+/, // nonzero number of digits - parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. - parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z - parseTokenT = /T/i, // T (ISO separator) - parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 - parseTokenOrdinal = /\d{1,2}/, + // the previous Hammer.gesture session data + // is a full clone of the previous gesture.current object + previous: null, - //strict parsing regexes - parseTokenOneDigit = /\d/, // 0 - 9 - parseTokenTwoDigits = /\d\d/, // 00 - 99 - parseTokenThreeDigits = /\d{3}/, // 000 - 999 - parseTokenFourDigits = /\d{4}/, // 0000 - 9999 - parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 - parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf + // when this becomes true, no gestures are fired + stopped: false, - // iso 8601 regex - // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) - isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, + /** + * start Hammer.gesture detection + * @method startDetect + * @param {Hammer.Instance} inst + * @param {Object} eventData + */ + startDetect: function startDetect(inst, eventData) { + // already busy with a Hammer.gesture detection on an element + if(this.current) { + return; + } - isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', + this.stopped = false; - isoDates = [ - ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/], - ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/], - ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/], - ['GGGG-[W]WW', /\d{4}-W\d{2}/], - ['YYYY-DDD', /\d{4}-\d{3}/] - ], + // holds current session + this.current = { + inst: inst, // reference to HammerInstance we're working for + startEvent: Utils.extend({}, eventData), // start eventData for distances, timing etc + lastEvent: false, // last eventData + lastCalcEvent: false, // last eventData for calculations. + futureCalcEvent: false, // last eventData for calculations. + lastCalcData: {}, // last lastCalcData + name: '' // current gesture we're in/detected, can be 'tap', 'hold' etc + }; - // iso time formats and regexes - isoTimes = [ - ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], - ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], - ['HH:mm', /(T| )\d\d:\d\d/], - ['HH', /(T| )\d\d/] - ], + this.detect(eventData); + }, - // timezone chunker "+10:00" > ["10", "00"] or "-1530" > ["-15", "30"] - parseTimezoneChunker = /([\+\-]|\d\d)/gi, + /** + * Hammer.gesture detection + * @method detect + * @param {Object} eventData + * @return {any} + */ + detect: function detect(eventData) { + if(!this.current || this.stopped) { + return; + } - // getter and setter names - proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), - unitMillisecondFactors = { - 'Milliseconds' : 1, - 'Seconds' : 1e3, - 'Minutes' : 6e4, - 'Hours' : 36e5, - 'Days' : 864e5, - 'Months' : 2592e6, - 'Years' : 31536e6 - }, + // extend event data with calculations about scale, distance etc + eventData = this.extendEventData(eventData); - unitAliases = { - ms : 'millisecond', - s : 'second', - m : 'minute', - h : 'hour', - d : 'day', - D : 'date', - w : 'week', - W : 'isoWeek', - M : 'month', - Q : 'quarter', - y : 'year', - DDD : 'dayOfYear', - e : 'weekday', - E : 'isoWeekday', - gg: 'weekYear', - GG: 'isoWeekYear' - }, + // hammer instance and instance options + var inst = this.current.inst, + instOptions = inst.options; - camelFunctions = { - dayofyear : 'dayOfYear', - isoweekday : 'isoWeekday', - isoweek : 'isoWeek', - weekyear : 'weekYear', - isoweekyear : 'isoWeekYear' - }, + // call Hammer.gesture handlers + Utils.each(this.gestures, function triggerGesture(gesture) { + // only when the instance options have enabled this gesture + if(!this.stopped && inst.enabled && instOptions[gesture.name]) { + gesture.handler.call(gesture, eventData, inst); + } + }, this); - // format function strings - formatFunctions = {}, + // store as previous event event + if(this.current) { + this.current.lastEvent = eventData; + } - // default relative time thresholds - relativeTimeThresholds = { - s: 45, //seconds to minutes - m: 45, //minutes to hours - h: 22, //hours to days - dd: 25, //days to month (month == 1) - dm: 45, //days to months (months > 1) - dy: 345 //days to year - }, + if(eventData.eventType == EVENT_END) { + this.stopDetect(); + } - // tokens to ordinalize and pad - ordinalizeTokens = 'DDD w W M D d'.split(' '), - paddedTokens = 'M D H h m s w W'.split(' '), + return eventData; + }, - formatTokenFunctions = { - M : function () { - return this.month() + 1; - }, - MMM : function (format) { - return this.lang().monthsShort(this, format); - }, - MMMM : function (format) { - return this.lang().months(this, format); - }, - D : function () { - return this.date(); - }, - DDD : function () { - return this.dayOfYear(); - }, - d : function () { - return this.day(); - }, - dd : function (format) { - return this.lang().weekdaysMin(this, format); - }, - ddd : function (format) { - return this.lang().weekdaysShort(this, format); - }, - dddd : function (format) { - return this.lang().weekdays(this, format); - }, - w : function () { - return this.week(); - }, - W : function () { - return this.isoWeek(); - }, - YY : function () { - return leftZeroFill(this.year() % 100, 2); - }, - YYYY : function () { - return leftZeroFill(this.year(), 4); - }, - YYYYY : function () { - return leftZeroFill(this.year(), 5); - }, - YYYYYY : function () { - var y = this.year(), sign = y >= 0 ? '+' : '-'; - return sign + leftZeroFill(Math.abs(y), 6); - }, - gg : function () { - return leftZeroFill(this.weekYear() % 100, 2); - }, - gggg : function () { - return leftZeroFill(this.weekYear(), 4); - }, - ggggg : function () { - return leftZeroFill(this.weekYear(), 5); - }, - GG : function () { - return leftZeroFill(this.isoWeekYear() % 100, 2); - }, - GGGG : function () { - return leftZeroFill(this.isoWeekYear(), 4); - }, - GGGGG : function () { - return leftZeroFill(this.isoWeekYear(), 5); - }, - e : function () { - return this.weekday(); - }, - E : function () { - return this.isoWeekday(); - }, - a : function () { - return this.lang().meridiem(this.hours(), this.minutes(), true); - }, - A : function () { - return this.lang().meridiem(this.hours(), this.minutes(), false); - }, - H : function () { - return this.hours(); - }, - h : function () { - return this.hours() % 12 || 12; - }, - m : function () { - return this.minutes(); - }, - s : function () { - return this.seconds(); - }, - S : function () { - return toInt(this.milliseconds() / 100); - }, - SS : function () { - return leftZeroFill(toInt(this.milliseconds() / 10), 2); - }, - SSS : function () { - return leftZeroFill(this.milliseconds(), 3); - }, - SSSS : function () { - return leftZeroFill(this.milliseconds(), 3); - }, - Z : function () { - var a = -this.zone(), - b = "+"; - if (a < 0) { - a = -a; - b = "-"; - } - return b + leftZeroFill(toInt(a / 60), 2) + ":" + leftZeroFill(toInt(a) % 60, 2); - }, - ZZ : function () { - var a = -this.zone(), - b = "+"; - if (a < 0) { - a = -a; - b = "-"; - } - return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); - }, - z : function () { - return this.zoneAbbr(); - }, - zz : function () { - return this.zoneName(); - }, - X : function () { - return this.unix(); - }, - Q : function () { - return this.quarter(); - } - }, + /** + * clear the Hammer.gesture vars + * this is called on endDetect, but can also be used when a final Hammer.gesture has been detected + * to stop other Hammer.gestures from being fired + * @method stopDetect + */ + stopDetect: function stopDetect() { + // clone current data to the store as the previous gesture + // used for the double tap gesture, since this is an other gesture detect session + this.previous = Utils.extend({}, this.current); - lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin']; + // reset the current + this.current = null; + this.stopped = true; + }, - // Pick the first defined of two or three arguments. dfl comes from - // default. - function dfl(a, b, c) { - switch (arguments.length) { - case 2: return a != null ? a : b; - case 3: return a != null ? a : b != null ? b : c; - default: throw new Error("Implement me"); - } - } + /** + * calculate velocity, angle and direction + * @method getVelocityData + * @param {Object} ev + * @param {Object} center + * @param {Number} deltaTime + * @param {Number} deltaX + * @param {Number} deltaY + */ + getCalculatedData: function getCalculatedData(ev, center, deltaTime, deltaX, deltaY) { + var cur = this.current, + recalc = false, + calcEv = cur.lastCalcEvent, + calcData = cur.lastCalcData; - function defaultParsingFlags() { - // We need to deep clone this object, and es5 standard is not very - // helpful. - return { - empty : false, - unusedTokens : [], - unusedInput : [], - overflow : -2, - charsLeftOver : 0, - nullInput : false, - invalidMonth : null, - invalidFormat : false, - userInvalidated : false, - iso: false - }; - } - - function deprecate(msg, fn) { - var firstTime = true; - function printMsg() { - if (moment.suppressDeprecationWarnings === false && - typeof console !== 'undefined' && console.warn) { - console.warn("Deprecation warning: " + msg); - } + if(calcEv && ev.timeStamp - calcEv.timeStamp > Hammer.CALCULATE_INTERVAL) { + center = calcEv.center; + deltaTime = ev.timeStamp - calcEv.timeStamp; + deltaX = ev.center.clientX - calcEv.center.clientX; + deltaY = ev.center.clientY - calcEv.center.clientY; + recalc = true; } - return extend(function () { - if (firstTime) { - printMsg(); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); - } - - function padToken(func, count) { - return function (a) { - return leftZeroFill(func.call(this, a), count); - }; - } - function ordinalizeToken(func, period) { - return function (a) { - return this.lang().ordinal(func.call(this, a), period); - }; - } - while (ordinalizeTokens.length) { - i = ordinalizeTokens.pop(); - formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); - } - while (paddedTokens.length) { - i = paddedTokens.pop(); - formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); - } - formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); + if(ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) { + cur.futureCalcEvent = ev; + } + if(!cur.lastCalcEvent || recalc) { + calcData.velocity = Utils.getVelocity(deltaTime, deltaX, deltaY); + calcData.angle = Utils.getAngle(center, ev.center); + calcData.direction = Utils.getDirection(center, ev.center); - /************************************ - Constructors - ************************************/ + cur.lastCalcEvent = cur.futureCalcEvent || ev; + cur.futureCalcEvent = ev; + } - function Language() { + ev.velocityX = calcData.velocity.x; + ev.velocityY = calcData.velocity.y; + ev.interimAngle = calcData.angle; + ev.interimDirection = calcData.direction; + }, - } + /** + * extend eventData for Hammer.gestures + * @method extendEventData + * @param {Object} ev + * @return {Object} ev + */ + extendEventData: function extendEventData(ev) { + var cur = this.current, + startEv = cur.startEvent, + lastEv = cur.lastEvent || startEv; - // Moment prototype object - function Moment(config) { - checkOverflow(config); - extend(this, config); - } + // update the start touchlist to calculate the scale/rotation + if(ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) { + startEv.touches = []; + Utils.each(ev.touches, function(touch) { + startEv.touches.push({ + clientX: touch.clientX, + clientY: touch.clientY + }); + }); + } - // Duration Constructor - function Duration(duration) { - var normalizedInput = normalizeObjectUnits(duration), - years = normalizedInput.year || 0, - quarters = normalizedInput.quarter || 0, - months = normalizedInput.month || 0, - weeks = normalizedInput.week || 0, - days = normalizedInput.day || 0, - hours = normalizedInput.hour || 0, - minutes = normalizedInput.minute || 0, - seconds = normalizedInput.second || 0, - milliseconds = normalizedInput.millisecond || 0; + var deltaTime = ev.timeStamp - startEv.timeStamp, + deltaX = ev.center.clientX - startEv.center.clientX, + deltaY = ev.center.clientY - startEv.center.clientY; - // representation for dateAddRemove - this._milliseconds = +milliseconds + - seconds * 1e3 + // 1000 - minutes * 6e4 + // 1000 * 60 - hours * 36e5; // 1000 * 60 * 60 - // Because of dateAddRemove treats 24 hours as different from a - // day when working around DST, we need to store them separately - this._days = +days + - weeks * 7; - // It is impossible translate months into days without knowing - // which months you are are talking about, so we have to store - // it separately. - this._months = +months + - quarters * 3 + - years * 12; + this.getCalculatedData(ev, lastEv.center, deltaTime, deltaX, deltaY); - this._data = {}; + Utils.extend(ev, { + startEvent: startEv, - this._bubble(); - } + deltaTime: deltaTime, + deltaX: deltaX, + deltaY: deltaY, - /************************************ - Helpers - ************************************/ + distance: Utils.getDistance(startEv.center, ev.center), + angle: Utils.getAngle(startEv.center, ev.center), + direction: Utils.getDirection(startEv.center, ev.center), + scale: Utils.getScale(startEv.touches, ev.touches), + rotation: Utils.getRotation(startEv.touches, ev.touches) + }); + return ev; + }, - function extend(a, b) { - for (var i in b) { - if (b.hasOwnProperty(i)) { - a[i] = b[i]; - } + /** + * register new gesture + * @method register + * @param {Object} gesture object, see `gestures/` for documentation + * @return {Array} gestures + */ + register: function register(gesture) { + // add an enable gesture options if there is no given + var options = gesture.defaults || {}; + if(options[gesture.name] === undefined) { + options[gesture.name] = true; } - if (b.hasOwnProperty("toString")) { - a.toString = b.toString; - } + // extend Hammer default options with the Hammer.gesture options + Utils.extend(Hammer.defaults, options, true); - if (b.hasOwnProperty("valueOf")) { - a.valueOf = b.valueOf; - } + // set its index + gesture.index = gesture.index || 1000; - return a; - } + // add Hammer.gesture to the list + this.gestures.push(gesture); - function cloneMoment(m) { - var result = {}, i; - for (i in m) { - if (m.hasOwnProperty(i) && momentProperties.hasOwnProperty(i)) { - result[i] = m[i]; + // sort the list by index + this.gestures.sort(function(a, b) { + if(a.index < b.index) { + return -1; } - } + if(a.index > b.index) { + return 1; + } + return 0; + }); - return result; + return this.gestures; } + }; - function absRound(number) { - if (number < 0) { - return Math.ceil(number); - } else { - return Math.floor(number); - } - } - // left zero fill a number - // see http://jsperf.com/left-zero-filling for performance comparison - function leftZeroFill(number, targetLength, forceSign) { - var output = '' + Math.abs(number), - sign = number >= 0; + /** + * @module hammer + */ - while (output.length < targetLength) { - output = '0' + output; - } - return (sign ? (forceSign ? '+' : '') : '-') + output; - } + /** + * create new hammer instance + * all methods should return the instance itself, so it is chainable. + * + * @class Instance + * @constructor + * @param {HTMLElement} element + * @param {Object} [options={}] options are merged with `Hammer.defaults` + * @return {Hammer.Instance} + */ + Hammer.Instance = function(element, options) { + var self = this; - // helper function for _.addTime and _.subtractTime - function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { - var milliseconds = duration._milliseconds, - days = duration._days, - months = duration._months; - updateOffset = updateOffset == null ? true : updateOffset; + // setup HammerJS window events and register all gestures + // this also sets up the default options + setup(); - if (milliseconds) { - mom._d.setTime(+mom._d + milliseconds * isAdding); - } - if (days) { - rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); - } - if (months) { - rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); - } - if (updateOffset) { - moment.updateOffset(mom, days || months); - } - } + /** + * @property element + * @type {HTMLElement} + */ + this.element = element; - // check if is an array - function isArray(input) { - return Object.prototype.toString.call(input) === '[object Array]'; - } + /** + * @property enabled + * @type {Boolean} + * @protected + */ + this.enabled = true; - function isDate(input) { - return Object.prototype.toString.call(input) === '[object Date]' || - input instanceof Date; - } + /** + * options, merged with the defaults + * options with an _ are converted to camelCase + * @property options + * @type {Object} + */ + Utils.each(options, function(value, name) { + delete options[name]; + options[Utils.toCamelCase(name)] = value; + }); - // compare two arrays, return the number of differences - function compareArrays(array1, array2, dontConvert) { - var len = Math.min(array1.length, array2.length), - lengthDiff = Math.abs(array1.length - array2.length), - diffs = 0, - i; - for (i = 0; i < len; i++) { - if ((dontConvert && array1[i] !== array2[i]) || - (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { - diffs++; - } - } - return diffs + lengthDiff; - } + this.options = Utils.extend(Utils.extend({}, Hammer.defaults), options || {}); - function normalizeUnits(units) { - if (units) { - var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); - units = unitAliases[units] || camelFunctions[lowered] || lowered; - } - return units; + // add some css to the element to prevent the browser from doing its native behavoir + if(this.options.behavior) { + Utils.toggleBehavior(this.element, this.options.behavior, true); } - function normalizeObjectUnits(inputObject) { - var normalizedInput = {}, - normalizedProp, - prop; - - for (prop in inputObject) { - if (inputObject.hasOwnProperty(prop)) { - normalizedProp = normalizeUnits(prop); - if (normalizedProp) { - normalizedInput[normalizedProp] = inputObject[prop]; - } - } + /** + * event start handler on the element to start the detection + * @property eventStartHandler + * @type {Object} + */ + this.eventStartHandler = Event.onTouch(element, EVENT_START, function(ev) { + if(self.enabled && ev.eventType == EVENT_START) { + Detection.startDetect(self, ev); + } else if(ev.eventType == EVENT_TOUCH) { + Detection.detect(ev); } + }); - return normalizedInput; - } - - function makeList(field) { - var count, setter; + /** + * keep a list of user event handlers which needs to be removed when calling 'dispose' + * @property eventHandlers + * @type {Array} + */ + this.eventHandlers = []; + }; - if (field.indexOf('week') === 0) { - count = 7; - setter = 'day'; - } - else if (field.indexOf('month') === 0) { - count = 12; - setter = 'month'; - } - else { - return; - } + Hammer.Instance.prototype = { + /** + * bind events to the instance + * @method on + * @chainable + * @param {String} gestures multiple gestures by splitting with a space + * @param {Function} handler + * @param {Object} handler.ev event object + */ + on: function onEvent(gestures, handler) { + var self = this; + Event.on(self.element, gestures, handler, function(type) { + self.eventHandlers.push({ gesture: type, handler: handler }); + }); + return self; + }, - moment[field] = function (format, index) { - var i, getter, - method = moment.fn._lang[field], - results = []; + /** + * unbind events to the instance + * @method off + * @chainable + * @param {String} gestures + * @param {Function} handler + */ + off: function offEvent(gestures, handler) { + var self = this; - if (typeof format === 'number') { - index = format; - format = undefined; + Event.off(self.element, gestures, handler, function(type) { + var index = Utils.inArray({ gesture: type, handler: handler }); + if(index !== false) { + self.eventHandlers.splice(index, 1); } + }); + return self; + }, - getter = function (i) { - var m = moment().utc().set(setter, i); - return method.call(moment.fn._lang, m, format || ''); - }; - - if (index != null) { - return getter(index); - } - else { - for (i = 0; i < count; i++) { - results.push(getter(i)); - } - return results; - } - }; - } + /** + * trigger gesture event + * @method trigger + * @chainable + * @param {String} gesture + * @param {Object} [eventData] + */ + trigger: function triggerEvent(gesture, eventData) { + // optional + if(!eventData) { + eventData = {}; + } - function toInt(argumentForCoercion) { - var coercedNumber = +argumentForCoercion, - value = 0; + // create DOM event + var event = Hammer.DOCUMENT.createEvent('Event'); + event.initEvent(gesture, true, true); + event.gesture = eventData; - if (coercedNumber !== 0 && isFinite(coercedNumber)) { - if (coercedNumber >= 0) { - value = Math.floor(coercedNumber); - } else { - value = Math.ceil(coercedNumber); - } + // trigger on the target if it is in the instance element, + // this is for event delegation tricks + var element = this.element; + if(Utils.hasParent(eventData.target, element)) { + element = eventData.target; } - return value; - } + element.dispatchEvent(event); + return this; + }, - function daysInMonth(year, month) { - return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); - } + /** + * enable of disable hammer.js detection + * @method enable + * @chainable + * @param {Boolean} state + */ + enable: function enable(state) { + this.enabled = state; + return this; + }, - function weeksInYear(year, dow, doy) { - return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; - } + /** + * dispose this hammer instance + * @method dispose + * @return {Null} + */ + dispose: function dispose() { + var i, eh; - function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; - } + // undo all changes made by stop_browser_behavior + Utils.toggleBehavior(this.element, this.options.behavior, false); - function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; - } + // unbind all custom event handlers + for(i = -1; (eh = this.eventHandlers[++i]);) { + Utils.off(this.element, eh.gesture, eh.handler); + } - function checkOverflow(m) { - var overflow; - if (m._a && m._pf.overflow === -2) { - overflow = - m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : - m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : - m._a[HOUR] < 0 || m._a[HOUR] > 23 ? HOUR : - m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : - m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : - m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : - -1; + this.eventHandlers = []; - if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { - overflow = DATE; - } + // unbind the start event listener + Event.off(this.element, EVENT_TYPES[EVENT_START], this.eventStartHandler); - m._pf.overflow = overflow; - } + return null; } + }; - function isValid(m) { - if (m._isValid == null) { - m._isValid = !isNaN(m._d.getTime()) && - m._pf.overflow < 0 && - !m._pf.empty && - !m._pf.invalidMonth && - !m._pf.nullInput && - !m._pf.invalidFormat && - !m._pf.userInvalidated; - if (m._strict) { - m._isValid = m._isValid && - m._pf.charsLeftOver === 0 && - m._pf.unusedTokens.length === 0; - } - } - return m._isValid; - } - - function normalizeLanguage(key) { - return key ? key.toLowerCase().replace('_', '-') : key; - } + /** + * @module gestures + */ + /** + * Move with x fingers (default 1) around on the page. + * Preventing the default browser behavior is a good way to improve feel and working. + * ```` + * hammertime.on("drag", function(ev) { + * console.log(ev); + * ev.gesture.preventDefault(); + * }); + * ```` + * + * @class Drag + * @static + */ + /** + * @event drag + * @param {Object} ev + */ + /** + * @event dragstart + * @param {Object} ev + */ + /** + * @event dragend + * @param {Object} ev + */ + /** + * @event drapleft + * @param {Object} ev + */ + /** + * @event dragright + * @param {Object} ev + */ + /** + * @event dragup + * @param {Object} ev + */ + /** + * @event dragdown + * @param {Object} ev + */ - // Return a moment from input, that is local/utc/zone equivalent to model. - function makeAs(input, model) { - return model._isUTC ? moment(input).zone(model._offset || 0) : - moment(input).local(); - } + /** + * @param {String} name + */ + (function(name) { + var triggered = false; - /************************************ - Languages - ************************************/ + function dragGesture(ev, inst) { + var cur = Detection.current; + // max touches + if(inst.options.dragMaxTouches > 0 && + ev.touches.length > inst.options.dragMaxTouches) { + return; + } - extend(Language.prototype, { + switch(ev.eventType) { + case EVENT_START: + triggered = false; + break; - set : function (config) { - var prop, i; - for (i in config) { - prop = config[i]; - if (typeof prop === 'function') { - this[i] = prop; - } else { - this['_' + i] = prop; + case EVENT_MOVE: + // when the distance we moved is too small we skip this gesture + // or we can be already in dragging + if(ev.distance < inst.options.dragMinDistance && + cur.name != name) { + return; } - } - }, - - _months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), - months : function (m) { - return this._months[m.month()]; - }, - - _monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), - monthsShort : function (m) { - return this._monthsShort[m.month()]; - }, - monthsParse : function (monthName) { - var i, mom, regex; + var startCenter = cur.startEvent.center; - if (!this._monthsParse) { - this._monthsParse = []; - } + // we are dragging! + if(cur.name != name) { + cur.name = name; + if(inst.options.dragDistanceCorrection && ev.distance > 0) { + // When a drag is triggered, set the event center to dragMinDistance pixels from the original event center. + // Without this correction, the dragged distance would jumpstart at dragMinDistance pixels instead of at 0. + // It might be useful to save the original start point somewhere + var factor = Math.abs(inst.options.dragMinDistance / ev.distance); + startCenter.pageX += ev.deltaX * factor; + startCenter.pageY += ev.deltaY * factor; + startCenter.clientX += ev.deltaX * factor; + startCenter.clientY += ev.deltaY * factor; - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - if (!this._monthsParse[i]) { - mom = moment.utc([2000, i]); - regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); - this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (this._monthsParse[i].test(monthName)) { - return i; + // recalculate event data using new start point + ev = Detection.extendEventData(ev); + } } - } - }, - _weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), - weekdays : function (m) { - return this._weekdays[m.day()]; - }, + // lock drag to axis? + if(cur.lastEvent.dragLockToAxis || + ( inst.options.dragLockToAxis && + inst.options.dragLockMinDistance <= ev.distance + )) { + ev.dragLockToAxis = true; + } - _weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), - weekdaysShort : function (m) { - return this._weekdaysShort[m.day()]; - }, + // keep direction on the axis that the drag gesture started on + var lastDirection = cur.lastEvent.direction; + if(ev.dragLockToAxis && lastDirection !== ev.direction) { + if(Utils.isVertical(lastDirection)) { + ev.direction = (ev.deltaY < 0) ? DIRECTION_UP : DIRECTION_DOWN; + } else { + ev.direction = (ev.deltaX < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + } - _weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), - weekdaysMin : function (m) { - return this._weekdaysMin[m.day()]; - }, + // first time, trigger dragstart event + if(!triggered) { + inst.trigger(name + 'start', ev); + triggered = true; + } - weekdaysParse : function (weekdayName) { - var i, mom, regex; + // trigger events + inst.trigger(name, ev); + inst.trigger(name + ev.direction, ev); - if (!this._weekdaysParse) { - this._weekdaysParse = []; - } + var isVertical = Utils.isVertical(ev.direction); - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - if (!this._weekdaysParse[i]) { - mom = moment([2000, 1]).day(i); - regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); - this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + // block the browser events + if((inst.options.dragBlockVertical && isVertical) || + (inst.options.dragBlockHorizontal && !isVertical)) { + ev.preventDefault(); } - // test the regex - if (this._weekdaysParse[i].test(weekdayName)) { - return i; + break; + + case EVENT_RELEASE: + if(triggered && ev.changedLength <= inst.options.dragMaxTouches) { + inst.trigger(name + 'end', ev); + triggered = false; } - } - }, + break; - _longDateFormat : { - LT : "h:mm A", - L : "MM/DD/YYYY", - LL : "MMMM D YYYY", - LLL : "MMMM D YYYY LT", - LLLL : "dddd, MMMM D YYYY LT" - }, - longDateFormat : function (key) { - var output = this._longDateFormat[key]; - if (!output && this._longDateFormat[key.toUpperCase()]) { - output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { - return val.slice(1); - }); - this._longDateFormat[key] = output; - } - return output; - }, + case EVENT_END: + triggered = false; + break; + } + } - isPM : function (input) { - // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays - // Using charAt should be more compatible. - return ((input + '').toLowerCase().charAt(0) === 'p'); - }, + Hammer.gestures.Drag = { + name: name, + index: 50, + handler: dragGesture, + defaults: { + /** + * minimal movement that have to be made before the drag event gets triggered + * @property dragMinDistance + * @type {Number} + * @default 10 + */ + dragMinDistance: 10, - _meridiemParse : /[ap]\.?m?\.?/i, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'pm' : 'PM'; - } else { - return isLower ? 'am' : 'AM'; - } - }, + /** + * Set dragDistanceCorrection to true to make the starting point of the drag + * be calculated from where the drag was triggered, not from where the touch started. + * Useful to avoid a jerk-starting drag, which can make fine-adjustments + * through dragging difficult, and be visually unappealing. + * @property dragDistanceCorrection + * @type {Boolean} + * @default true + */ + dragDistanceCorrection: true, - _calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - calendar : function (key, mom) { - var output = this._calendar[key]; - return typeof output === 'function' ? output.apply(mom) : output; - }, - - _relativeTime : { - future : "in %s", - past : "%s ago", - s : "a few seconds", - m : "a minute", - mm : "%d minutes", - h : "an hour", - hh : "%d hours", - d : "a day", - dd : "%d days", - M : "a month", - MM : "%d months", - y : "a year", - yy : "%d years" - }, - relativeTime : function (number, withoutSuffix, string, isFuture) { - var output = this._relativeTime[string]; - return (typeof output === 'function') ? - output(number, withoutSuffix, string, isFuture) : - output.replace(/%d/i, number); - }, - pastFuture : function (diff, output) { - var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); - }, - - ordinal : function (number) { - return this._ordinal.replace("%d", number); - }, - _ordinal : "%d", - - preparse : function (string) { - return string; - }, + /** + * set 0 for unlimited, but this can conflict with transform + * @property dragMaxTouches + * @type {Number} + * @default 1 + */ + dragMaxTouches: 1, - postformat : function (string) { - return string; - }, + /** + * prevent default browser behavior when dragging occurs + * be careful with it, it makes the element a blocking element + * when you are using the drag gesture, it is a good practice to set this true + * @property dragBlockHorizontal + * @type {Boolean} + * @default false + */ + dragBlockHorizontal: false, - week : function (mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; - }, + /** + * same as `dragBlockHorizontal`, but for vertical movement + * @property dragBlockVertical + * @type {Boolean} + * @default false + */ + dragBlockVertical: false, - _week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - }, + /** + * dragLockToAxis keeps the drag gesture on the axis that it started on, + * It disallows vertical directions if the initial direction was horizontal, and vice versa. + * @property dragLockToAxis + * @type {Boolean} + * @default false + */ + dragLockToAxis: false, - _invalidDate: 'Invalid date', - invalidDate: function () { - return this._invalidDate; + /** + * drag lock only kicks in when distance > dragLockMinDistance + * This way, locking occurs only when the distance has become large enough to reliably determine the direction + * @property dragLockMinDistance + * @type {Number} + * @default 25 + */ + dragLockMinDistance: 25 } - }); + }; + })('drag'); - // Loads a language definition into the `languages` cache. The function - // takes a key and optionally values. If not in the browser and no values - // are provided, it will load the language file module. As a convenience, - // this function also returns the language values. - function loadLang(key, values) { - values.abbr = key; - if (!languages[key]) { - languages[key] = new Language(); - } - languages[key].set(values); - return languages[key]; + /** + * @module gestures + */ + /** + * trigger a simple gesture event, so you can do anything in your handler. + * only usable if you know what your doing... + * + * @class Gesture + * @static + */ + /** + * @event gesture + * @param {Object} ev + */ + Hammer.gestures.Gesture = { + name: 'gesture', + index: 1337, + handler: function releaseGesture(ev, inst) { + inst.trigger(this.name, ev); } + }; - // Remove a language from the `languages` cache. Mostly useful in tests. - function unloadLang(key) { - delete languages[key]; - } + /** + * @module gestures + */ + /** + * Touch stays at the same place for x time + * + * @class Hold + * @static + */ + /** + * @event hold + * @param {Object} ev + */ - // Determines which language definition to use and returns it. - // - // With no parameters, it will return the global language. If you - // pass in a language key, such as 'en', it will return the - // definition for 'en', so long as 'en' has already been loaded using - // moment.lang. - function getLangDefinition(key) { - var i = 0, j, lang, next, split, - get = function (k) { - if (!languages[k] && hasModule) { - try { - __webpack_require__(60)("./" + k); - } catch (e) { } - } - return languages[k]; - }; + /** + * @param {String} name + */ + (function(name) { + var timer; - if (!key) { - return moment.fn._lang; - } + function holdGesture(ev, inst) { + var options = inst.options, + current = Detection.current; - if (!isArray(key)) { - //short-circuit everything else - lang = get(key); - if (lang) { - return lang; - } - key = [key]; - } + switch(ev.eventType) { + case EVENT_START: + clearTimeout(timer); - //pick the language from the array - //try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each - //substring from most specific to least, but move to the next array item if it's a more specific variant than the current root - while (i < key.length) { - split = normalizeLanguage(key[i]).split('-'); - j = split.length; - next = normalizeLanguage(key[i + 1]); - next = next ? next.split('-') : null; - while (j > 0) { - lang = get(split.slice(0, j).join('-')); - if (lang) { - return lang; - } - if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { - //the next array item is better than a shallower substring of this one - break; - } - j--; - } - i++; - } - return moment.fn._lang; - } + // set the gesture so we can check in the timeout if it still is + current.name = name; - /************************************ - Formatting - ************************************/ + // set timer and if after the timeout it still is hold, + // we trigger the hold event + timer = setTimeout(function() { + if(current && current.name == name) { + inst.trigger(name, ev); + } + }, options.holdTimeout); + break; + case EVENT_MOVE: + if(ev.distance > options.holdThreshold) { + clearTimeout(timer); + } + break; - function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|\]$/g, ""); + case EVENT_RELEASE: + clearTimeout(timer); + break; } - return input.replace(/\\/g, ""); } - function makeFormatFunction(format) { - var array = format.match(formattingTokens), i, length; - - for (i = 0, length = array.length; i < length; i++) { - if (formatTokenFunctions[array[i]]) { - array[i] = formatTokenFunctions[array[i]]; - } else { - array[i] = removeFormattingTokens(array[i]); - } - } + Hammer.gestures.Hold = { + name: name, + index: 10, + defaults: { + /** + * @property holdTimeout + * @type {Number} + * @default 500 + */ + holdTimeout: 500, - return function (mom) { - var output = ""; - for (i = 0; i < length; i++) { - output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; - } - return output; - }; + /** + * movement allowed while holding + * @property holdThreshold + * @type {Number} + * @default 2 + */ + holdThreshold: 2 + }, + handler: holdGesture + }; + })('hold'); + + /** + * @module gestures + */ + /** + * when a touch is being released from the page + * + * @class Release + * @static + */ + /** + * @event release + * @param {Object} ev + */ + Hammer.gestures.Release = { + name: 'release', + index: Infinity, + handler: function releaseGesture(ev, inst) { + if(ev.eventType == EVENT_RELEASE) { + inst.trigger(this.name, ev); + } } + }; - // format date using native date object - function formatMoment(m, format) { + /** + * @module gestures + */ + /** + * triggers swipe events when the end velocity is above the threshold + * for best usage, set `preventDefault` (on the drag gesture) to `true` + * ```` + * hammertime.on("dragleft swipeleft", function(ev) { + * console.log(ev); + * ev.gesture.preventDefault(); + * }); + * ```` + * + * @class Swipe + * @static + */ + /** + * @event swipe + * @param {Object} ev + */ + /** + * @event swipeleft + * @param {Object} ev + */ + /** + * @event swiperight + * @param {Object} ev + */ + /** + * @event swipeup + * @param {Object} ev + */ + /** + * @event swipedown + * @param {Object} ev + */ + Hammer.gestures.Swipe = { + name: 'swipe', + index: 40, + defaults: { + /** + * @property swipeMinTouches + * @type {Number} + * @default 1 + */ + swipeMinTouches: 1, - if (!m.isValid()) { - return m.lang().invalidDate(); - } + /** + * @property swipeMaxTouches + * @type {Number} + * @default 1 + */ + swipeMaxTouches: 1, - format = expandFormat(format, m.lang()); + /** + * horizontal swipe velocity + * @property swipeVelocityX + * @type {Number} + * @default 0.6 + */ + swipeVelocityX: 0.6, - if (!formatFunctions[format]) { - formatFunctions[format] = makeFormatFunction(format); - } + /** + * vertical swipe velocity + * @property swipeVelocityY + * @type {Number} + * @default 0.6 + */ + swipeVelocityY: 0.6 + }, - return formatFunctions[format](m); - } + handler: function swipeGesture(ev, inst) { + if(ev.eventType == EVENT_RELEASE) { + var touches = ev.touches.length, + options = inst.options; - function expandFormat(format, lang) { - var i = 5; + // max touches + if(touches < options.swipeMinTouches || + touches > options.swipeMaxTouches) { + return; + } - function replaceLongDateFormatTokens(input) { - return lang.longDateFormat(input) || input; + // when the distance we moved is too small we skip this gesture + // or we can be already in dragging + if(ev.velocityX > options.swipeVelocityX || + ev.velocityY > options.swipeVelocityY) { + // trigger swipe events + inst.trigger(this.name, ev); + inst.trigger(this.name + ev.direction, ev); + } } + } + }; - localFormattingTokens.lastIndex = 0; - while (i >= 0 && localFormattingTokens.test(format)) { - format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); - localFormattingTokens.lastIndex = 0; - i -= 1; - } + /** + * @module gestures + */ + /** + * Single tap and a double tap on a place + * + * @class Tap + * @static + */ + /** + * @event tap + * @param {Object} ev + */ + /** + * @event doubletap + * @param {Object} ev + */ - return format; + /** + * @param {String} name + */ + (function(name) { + var hasMoved = false; + + function tapGesture(ev, inst) { + var options = inst.options, + current = Detection.current, + prev = Detection.previous, + sincePrev, + didDoubleTap; + + switch(ev.eventType) { + case EVENT_START: + hasMoved = false; + break; + + case EVENT_MOVE: + hasMoved = hasMoved || (ev.distance > options.tapMaxDistance); + break; + + case EVENT_END: + if(!Utils.inStr(ev.srcEvent.type, 'cancel') && ev.deltaTime < options.tapMaxTime && !hasMoved) { + // previous gesture, for the double tap since these are two different gesture detections + sincePrev = prev && prev.lastEvent && ev.timeStamp - prev.lastEvent.timeStamp; + didDoubleTap = false; + + // check if double tap + if(prev && prev.name == name && + (sincePrev && sincePrev < options.doubleTapInterval) && + ev.distance < options.doubleTapDistance) { + inst.trigger('doubletap', ev); + didDoubleTap = true; + } + + // do a single tap + if(!didDoubleTap || options.tapAlways) { + current.name = name; + inst.trigger(current.name, ev); + } + } + break; + } } + Hammer.gestures.Tap = { + name: name, + index: 100, + handler: tapGesture, + defaults: { + /** + * max time of a tap, this is for the slow tappers + * @property tapMaxTime + * @type {Number} + * @default 250 + */ + tapMaxTime: 250, - /************************************ - Parsing - ************************************/ + /** + * max distance of movement of a tap, this is for the slow tappers + * @property tapMaxDistance + * @type {Number} + * @default 10 + */ + tapMaxDistance: 10, + /** + * always trigger the `tap` event, even while double-tapping + * @property tapAlways + * @type {Boolean} + * @default true + */ + tapAlways: true, - // get the regex to find the next token - function getParseRegexForToken(token, config) { - var a, strict = config._strict; - switch (token) { - case 'Q': - return parseTokenOneDigit; - case 'DDDD': - return parseTokenThreeDigits; - case 'YYYY': - case 'GGGG': - case 'gggg': - return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; - case 'Y': - case 'G': - case 'g': - return parseTokenSignedNumber; - case 'YYYYYY': - case 'YYYYY': - case 'GGGGG': - case 'ggggg': - return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; - case 'S': - if (strict) { return parseTokenOneDigit; } - /* falls through */ - case 'SS': - if (strict) { return parseTokenTwoDigits; } - /* falls through */ - case 'SSS': - if (strict) { return parseTokenThreeDigits; } - /* falls through */ - case 'DDD': - return parseTokenOneToThreeDigits; - case 'MMM': - case 'MMMM': - case 'dd': - case 'ddd': - case 'dddd': - return parseTokenWord; - case 'a': - case 'A': - return getLangDefinition(config._l)._meridiemParse; - case 'X': - return parseTokenTimestampMs; - case 'Z': - case 'ZZ': - return parseTokenTimezone; - case 'T': - return parseTokenT; - case 'SSSS': - return parseTokenDigits; - case 'MM': - case 'DD': - case 'YY': - case 'GG': - case 'gg': - case 'HH': - case 'hh': - case 'mm': - case 'ss': - case 'ww': - case 'WW': - return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; - case 'M': - case 'D': - case 'd': - case 'H': - case 'h': - case 'm': - case 's': - case 'w': - case 'W': - case 'e': - case 'E': - return parseTokenOneOrTwoDigits; - case 'Do': - return parseTokenOrdinal; - default : - a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), "i")); - return a; + /** + * max distance between two taps + * @property doubleTapDistance + * @type {Number} + * @default 20 + */ + doubleTapDistance: 20, + + /** + * max time between two taps + * @property doubleTapInterval + * @type {Number} + * @default 300 + */ + doubleTapInterval: 300 } - } + }; + })('tap'); - function timezoneMinutesFromString(string) { - string = string || ""; - var possibleTzMatches = (string.match(parseTokenTimezone) || []), - tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], - parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], - minutes = +(parts[1] * 60) + toInt(parts[2]); + /** + * @module gestures + */ + /** + * when a touch is being touched at the page + * + * @class Touch + * @static + */ + /** + * @event touch + * @param {Object} ev + */ + Hammer.gestures.Touch = { + name: 'touch', + index: -Infinity, + defaults: { + /** + * call preventDefault at touchstart, and makes the element blocking by disabling the scrolling of the page, + * but it improves gestures like transforming and dragging. + * be careful with using this, it can be very annoying for users to be stuck on the page + * @property preventDefault + * @type {Boolean} + * @default false + */ + preventDefault: false, - return parts[0] === '+' ? -minutes : minutes; + /** + * disable mouse events, so only touch (or pen!) input triggers events + * @property preventMouse + * @type {Boolean} + * @default false + */ + preventMouse: false + }, + handler: function touchGesture(ev, inst) { + if(inst.options.preventMouse && ev.pointerType == POINTER_MOUSE) { + ev.stopDetect(); + return; + } + + if(inst.options.preventDefault) { + ev.preventDefault(); + } + + if(ev.eventType == EVENT_TOUCH) { + inst.trigger('touch', ev); + } } + }; - // function to convert string input to date - function addTimeToArrayFromToken(token, input, config) { - var a, datePartArray = config._a; + /** + * @module gestures + */ + /** + * User want to scale or rotate with 2 fingers + * Preventing the default browser behavior is a good way to improve feel and working. This can be done with the + * `preventDefault` option. + * + * @class Transform + * @static + */ + /** + * @event transform + * @param {Object} ev + */ + /** + * @event transformstart + * @param {Object} ev + */ + /** + * @event transformend + * @param {Object} ev + */ + /** + * @event pinchin + * @param {Object} ev + */ + /** + * @event pinchout + * @param {Object} ev + */ + /** + * @event rotate + * @param {Object} ev + */ - switch (token) { - // QUARTER - case 'Q': - if (input != null) { - datePartArray[MONTH] = (toInt(input) - 1) * 3; - } - break; - // MONTH - case 'M' : // fall through to MM - case 'MM' : - if (input != null) { - datePartArray[MONTH] = toInt(input) - 1; - } - break; - case 'MMM' : // fall through to MMMM - case 'MMMM' : - a = getLangDefinition(config._l).monthsParse(input); - // if we didn't find a month name, mark the date as invalid. - if (a != null) { - datePartArray[MONTH] = a; - } else { - config._pf.invalidMonth = input; - } - break; - // DAY OF MONTH - case 'D' : // fall through to DD - case 'DD' : - if (input != null) { - datePartArray[DATE] = toInt(input); - } - break; - case 'Do' : - if (input != null) { - datePartArray[DATE] = toInt(parseInt(input, 10)); - } - break; - // DAY OF YEAR - case 'DDD' : // fall through to DDDD - case 'DDDD' : - if (input != null) { - config._dayOfYear = toInt(input); - } + /** + * @param {String} name + */ + (function(name) { + var triggered = false; - break; - // YEAR - case 'YY' : - datePartArray[YEAR] = moment.parseTwoDigitYear(input); - break; - case 'YYYY' : - case 'YYYYY' : - case 'YYYYYY' : - datePartArray[YEAR] = toInt(input); - break; - // AM / PM - case 'a' : // fall through to A - case 'A' : - config._isPm = getLangDefinition(config._l).isPM(input); - break; - // 24 HOUR - case 'H' : // fall through to hh - case 'HH' : // fall through to hh - case 'h' : // fall through to hh - case 'hh' : - datePartArray[HOUR] = toInt(input); - break; - // MINUTE - case 'm' : // fall through to mm - case 'mm' : - datePartArray[MINUTE] = toInt(input); - break; - // SECOND - case 's' : // fall through to ss - case 'ss' : - datePartArray[SECOND] = toInt(input); - break; - // MILLISECOND - case 'S' : - case 'SS' : - case 'SSS' : - case 'SSSS' : - datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); - break; - // UNIX TIMESTAMP WITH MS - case 'X': - config._d = new Date(parseFloat(input) * 1000); - break; - // TIMEZONE - case 'Z' : // fall through to ZZ - case 'ZZ' : - config._useUTC = true; - config._tzm = timezoneMinutesFromString(input); - break; - // WEEKDAY - human - case 'dd': - case 'ddd': - case 'dddd': - a = getLangDefinition(config._l).weekdaysParse(input); - // if we didn't get a weekday name, mark the date as invalid - if (a != null) { - config._w = config._w || {}; - config._w['d'] = a; - } else { - config._pf.invalidWeekday = input; - } - break; - // WEEK, WEEK DAY - numeric - case 'w': - case 'ww': - case 'W': - case 'WW': - case 'd': - case 'e': - case 'E': - token = token.substr(0, 1); - /* falls through */ - case 'gggg': - case 'GGGG': - case 'GGGGG': - token = token.substr(0, 2); - if (input) { - config._w = config._w || {}; - config._w[token] = toInt(input); - } - break; - case 'gg': - case 'GG': - config._w = config._w || {}; - config._w[token] = moment.parseTwoDigitYear(input); + function transformGesture(ev, inst) { + switch(ev.eventType) { + case EVENT_START: + triggered = false; + break; + + case EVENT_MOVE: + // at least multitouch + if(ev.touches.length < 2) { + return; + } + + var scaleThreshold = Math.abs(1 - ev.scale); + var rotationThreshold = Math.abs(ev.rotation); + + // when the distance we moved is too small we skip this gesture + // or we can be already in dragging + if(scaleThreshold < inst.options.transformMinScale && + rotationThreshold < inst.options.transformMinRotation) { + return; + } + + // we are transforming! + Detection.current.name = name; + + // first time, trigger dragstart event + if(!triggered) { + inst.trigger(name + 'start', ev); + triggered = true; + } + + inst.trigger(name, ev); // basic transform event + + // trigger rotate event + if(rotationThreshold > inst.options.transformMinRotation) { + inst.trigger('rotate', ev); + } + + // trigger pinch event + if(scaleThreshold > inst.options.transformMinScale) { + inst.trigger('pinch', ev); + inst.trigger('pinch' + (ev.scale < 1 ? 'in' : 'out'), ev); + } + break; + + case EVENT_RELEASE: + if(triggered && ev.changedLength < 2) { + inst.trigger(name + 'end', ev); + triggered = false; + } + break; } } - function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp, lang; + Hammer.gestures.Transform = { + name: name, + index: 45, + defaults: { + /** + * minimal scale factor, no scale is 1, zoomin is to 0 and zoomout until higher then 1 + * @property transformMinScale + * @type {Number} + * @default 0.01 + */ + transformMinScale: 0.01, + + /** + * rotation in degrees + * @property transformMinRotation + * @type {Number} + * @default 1 + */ + transformMinRotation: 1 + }, + + handler: transformGesture + }; + })('transform'); + + /** + * @module hammer + */ + + // AMD export + if(true) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { + return Hammer; + }.call(exports, __webpack_require__, exports, module)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + // commonjs export + } else if(typeof module !== 'undefined' && module.exports) { + module.exports = Hammer; + // browser export + } else { + window.Hammer = Hammer; + } + + })(window); + +/***/ }, +/* 51 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(global, module) {//! moment.js + //! version : 2.7.0 + //! authors : Tim Wood, Iskren Chernev, Moment.js contributors + //! license : MIT + //! momentjs.com + + (function (undefined) { + + /************************************ + Constants + ************************************/ + + var moment, + VERSION = "2.7.0", + // the global-scope this is NOT the global object in Node.js + globalScope = typeof global !== 'undefined' ? global : this, + oldGlobalMoment, + round = Math.round, + i, + + YEAR = 0, + MONTH = 1, + DATE = 2, + HOUR = 3, + MINUTE = 4, + SECOND = 5, + MILLISECOND = 6, + + // internal storage for language config files + languages = {}, + + // moment internal properties + momentProperties = { + _isAMomentObject: null, + _i : null, + _f : null, + _l : null, + _strict : null, + _tzm : null, + _isUTC : null, + _offset : null, // optional. Combine with _isUTC + _pf : null, + _lang : null // optional + }, + + // check for nodeJS + hasModule = (typeof module !== 'undefined' && module.exports), + + // ASP.NET json date format regex + aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, + aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, + + // format tokens + formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g, + localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g, + + // parsing token regexes + parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 + parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 + parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 + parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 + parseTokenDigits = /\d+/, // nonzero number of digits + parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. + parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z + parseTokenT = /T/i, // T (ISO separator) + parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 + parseTokenOrdinal = /\d{1,2}/, + + //strict parsing regexes + parseTokenOneDigit = /\d/, // 0 - 9 + parseTokenTwoDigits = /\d\d/, // 00 - 99 + parseTokenThreeDigits = /\d{3}/, // 000 - 999 + parseTokenFourDigits = /\d{4}/, // 0000 - 9999 + parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 + parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - dow = 1; - doy = 4; + isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', - // TODO: We need to take the current isoWeekYear, but that depends on - // how we interpret now (local, utc, fixed offset). So create - // a now version of current config (take local/utc/offset flags, and - // create now). - weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); - week = dfl(w.W, 1); - weekday = dfl(w.E, 1); - } else { - lang = getLangDefinition(config._l); - dow = lang._week.dow; - doy = lang._week.doy; + isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/], + ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/], + ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/], + ['GGGG-[W]WW', /\d{4}-W\d{2}/], + ['YYYY-DDD', /\d{4}-\d{3}/] + ], - weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); - week = dfl(w.w, 1); + // iso time formats and regexes + isoTimes = [ + ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], + ['HH:mm', /(T| )\d\d:\d\d/], + ['HH', /(T| )\d\d/] + ], - if (w.d != null) { - // weekday -- low day numbers are considered next week - weekday = w.d; - if (weekday < dow) { - ++week; - } - } else if (w.e != null) { - // local weekday -- counting starts from begining of week - weekday = w.e + dow; - } else { - // default to begining of week - weekday = dow; - } - } - temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + // timezone chunker "+10:00" > ["10", "00"] or "-1530" > ["-15", "30"] + parseTimezoneChunker = /([\+\-]|\d\d)/gi, - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; - } + // getter and setter names + proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), + unitMillisecondFactors = { + 'Milliseconds' : 1, + 'Seconds' : 1e3, + 'Minutes' : 6e4, + 'Hours' : 36e5, + 'Days' : 864e5, + 'Months' : 2592e6, + 'Years' : 31536e6 + }, - // convert an array to a date. - // the array should mirror the parameters below - // note: all values past the year are optional and will default to the lowest possible value. - // [year, month, day , hour, minute, second, millisecond] - function dateFromConfig(config) { - var i, date, input = [], currentDate, yearToUse; + unitAliases = { + ms : 'millisecond', + s : 'second', + m : 'minute', + h : 'hour', + d : 'day', + D : 'date', + w : 'week', + W : 'isoWeek', + M : 'month', + Q : 'quarter', + y : 'year', + DDD : 'dayOfYear', + e : 'weekday', + E : 'isoWeekday', + gg: 'weekYear', + GG: 'isoWeekYear' + }, - if (config._d) { - return; - } + camelFunctions = { + dayofyear : 'dayOfYear', + isoweekday : 'isoWeekday', + isoweek : 'isoWeek', + weekyear : 'weekYear', + isoweekyear : 'isoWeekYear' + }, - currentDate = currentDateArray(config); + // format function strings + formatFunctions = {}, - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - dayOfYearFromWeekInfo(config); - } + // default relative time thresholds + relativeTimeThresholds = { + s: 45, //seconds to minutes + m: 45, //minutes to hours + h: 22, //hours to days + dd: 25, //days to month (month == 1) + dm: 45, //days to months (months > 1) + dy: 345 //days to year + }, - //if the day of the year is set, figure out what it is - if (config._dayOfYear) { - yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); + // tokens to ordinalize and pad + ordinalizeTokens = 'DDD w W M D d'.split(' '), + paddedTokens = 'M D H h m s w W'.split(' '), - if (config._dayOfYear > daysInYear(yearToUse)) { - config._pf._overflowDayOfYear = true; + formatTokenFunctions = { + M : function () { + return this.month() + 1; + }, + MMM : function (format) { + return this.lang().monthsShort(this, format); + }, + MMMM : function (format) { + return this.lang().months(this, format); + }, + D : function () { + return this.date(); + }, + DDD : function () { + return this.dayOfYear(); + }, + d : function () { + return this.day(); + }, + dd : function (format) { + return this.lang().weekdaysMin(this, format); + }, + ddd : function (format) { + return this.lang().weekdaysShort(this, format); + }, + dddd : function (format) { + return this.lang().weekdays(this, format); + }, + w : function () { + return this.week(); + }, + W : function () { + return this.isoWeek(); + }, + YY : function () { + return leftZeroFill(this.year() % 100, 2); + }, + YYYY : function () { + return leftZeroFill(this.year(), 4); + }, + YYYYY : function () { + return leftZeroFill(this.year(), 5); + }, + YYYYYY : function () { + var y = this.year(), sign = y >= 0 ? '+' : '-'; + return sign + leftZeroFill(Math.abs(y), 6); + }, + gg : function () { + return leftZeroFill(this.weekYear() % 100, 2); + }, + gggg : function () { + return leftZeroFill(this.weekYear(), 4); + }, + ggggg : function () { + return leftZeroFill(this.weekYear(), 5); + }, + GG : function () { + return leftZeroFill(this.isoWeekYear() % 100, 2); + }, + GGGG : function () { + return leftZeroFill(this.isoWeekYear(), 4); + }, + GGGGG : function () { + return leftZeroFill(this.isoWeekYear(), 5); + }, + e : function () { + return this.weekday(); + }, + E : function () { + return this.isoWeekday(); + }, + a : function () { + return this.lang().meridiem(this.hours(), this.minutes(), true); + }, + A : function () { + return this.lang().meridiem(this.hours(), this.minutes(), false); + }, + H : function () { + return this.hours(); + }, + h : function () { + return this.hours() % 12 || 12; + }, + m : function () { + return this.minutes(); + }, + s : function () { + return this.seconds(); + }, + S : function () { + return toInt(this.milliseconds() / 100); + }, + SS : function () { + return leftZeroFill(toInt(this.milliseconds() / 10), 2); + }, + SSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + SSSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + Z : function () { + var a = -this.zone(), + b = "+"; + if (a < 0) { + a = -a; + b = "-"; + } + return b + leftZeroFill(toInt(a / 60), 2) + ":" + leftZeroFill(toInt(a) % 60, 2); + }, + ZZ : function () { + var a = -this.zone(), + b = "+"; + if (a < 0) { + a = -a; + b = "-"; + } + return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); + }, + z : function () { + return this.zoneAbbr(); + }, + zz : function () { + return this.zoneName(); + }, + X : function () { + return this.unix(); + }, + Q : function () { + return this.quarter(); } + }, - date = makeUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); - } - - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; - } - - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; - } + lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin']; - config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); - // Apply timezone offset from input. The actual zone can be changed - // with parseZone. - if (config._tzm != null) { - config._d.setUTCMinutes(config._d.getUTCMinutes() + config._tzm); + // Pick the first defined of two or three arguments. dfl comes from + // default. + function dfl(a, b, c) { + switch (arguments.length) { + case 2: return a != null ? a : b; + case 3: return a != null ? a : b != null ? b : c; + default: throw new Error("Implement me"); } } - function dateFromObject(config) { - var normalizedInput; - - if (config._d) { - return; - } - - normalizedInput = normalizeObjectUnits(config._i); - config._a = [ - normalizedInput.year, - normalizedInput.month, - normalizedInput.day, - normalizedInput.hour, - normalizedInput.minute, - normalizedInput.second, - normalizedInput.millisecond - ]; - - dateFromConfig(config); + function defaultParsingFlags() { + // We need to deep clone this object, and es5 standard is not very + // helpful. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso: false + }; } - function currentDateArray(config) { - var now = new Date(); - if (config._useUTC) { - return [ - now.getUTCFullYear(), - now.getUTCMonth(), - now.getUTCDate() - ]; - } else { - return [now.getFullYear(), now.getMonth(), now.getDate()]; + function deprecate(msg, fn) { + var firstTime = true; + function printMsg() { + if (moment.suppressDeprecationWarnings === false && + typeof console !== 'undefined' && console.warn) { + console.warn("Deprecation warning: " + msg); + } } + return extend(function () { + if (firstTime) { + printMsg(); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); } - // date from string and format string - function makeDateFromStringAndFormat(config) { - - if (config._f === moment.ISO_8601) { - parseISO(config); - return; - } - - config._a = []; - config._pf.empty = true; + function padToken(func, count) { + return function (a) { + return leftZeroFill(func.call(this, a), count); + }; + } + function ordinalizeToken(func, period) { + return function (a) { + return this.lang().ordinal(func.call(this, a), period); + }; + } - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var lang = getLangDefinition(config._l), - string = '' + config._i, - i, parsedInput, tokens, token, skipped, - stringLength = string.length, - totalParsedInputLength = 0; + while (ordinalizeTokens.length) { + i = ordinalizeTokens.pop(); + formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); + } + while (paddedTokens.length) { + i = paddedTokens.pop(); + formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); + } + formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); - tokens = expandFormat(config._f, lang).match(formattingTokens) || []; - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - config._pf.unusedInput.push(skipped); - } - string = string.slice(string.indexOf(parsedInput) + parsedInput.length); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - config._pf.empty = false; - } - else { - config._pf.unusedTokens.push(token); - } - addTimeToArrayFromToken(token, parsedInput, config); - } - else if (config._strict && !parsedInput) { - config._pf.unusedTokens.push(token); - } - } + /************************************ + Constructors + ************************************/ - // add remaining unparsed input length to the string - config._pf.charsLeftOver = stringLength - totalParsedInputLength; - if (string.length > 0) { - config._pf.unusedInput.push(string); - } + function Language() { - // handle am pm - if (config._isPm && config._a[HOUR] < 12) { - config._a[HOUR] += 12; - } - // if is 12 am, change hours to 0 - if (config._isPm === false && config._a[HOUR] === 12) { - config._a[HOUR] = 0; - } + } - dateFromConfig(config); + // Moment prototype object + function Moment(config) { checkOverflow(config); + extend(this, config); } - function unescapeFormat(s) { - return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { - return p1 || p2 || p3 || p4; - }); - } + // Duration Constructor + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; - // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript - function regexpEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); - } + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; - // date from string and array of format strings - function makeDateFromStringAndArray(config) { - var tempConfig, - bestMoment, + this._data = {}; - scoreToBeat, - i, - currentScore; + this._bubble(); + } - if (config._f.length === 0) { - config._pf.invalidFormat = true; - config._d = new Date(NaN); - return; - } + /************************************ + Helpers + ************************************/ - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - tempConfig = extend({}, config); - tempConfig._pf = defaultParsingFlags(); - tempConfig._f = config._f[i]; - makeDateFromStringAndFormat(tempConfig); - if (!isValid(tempConfig)) { - continue; + function extend(a, b) { + for (var i in b) { + if (b.hasOwnProperty(i)) { + a[i] = b[i]; } + } - // if there is any input that was not parsed add a penalty for that format - currentScore += tempConfig._pf.charsLeftOver; + if (b.hasOwnProperty("toString")) { + a.toString = b.toString; + } - //or tokens - currentScore += tempConfig._pf.unusedTokens.length * 10; + if (b.hasOwnProperty("valueOf")) { + a.valueOf = b.valueOf; + } - tempConfig._pf.score = currentScore; + return a; + } - if (scoreToBeat == null || currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; + function cloneMoment(m) { + var result = {}, i; + for (i in m) { + if (m.hasOwnProperty(i) && momentProperties.hasOwnProperty(i)) { + result[i] = m[i]; } } - extend(config, bestMoment || tempConfig); + return result; } - // date from iso format - function parseISO(config) { - var i, l, - string = config._i, - match = isoRegex.exec(string); - - if (match) { - config._pf.iso = true; - for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(string)) { - // match[5] should be "T" or undefined - config._f = isoDates[i][0] + (match[6] || " "); - break; - } - } - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(string)) { - config._f += isoTimes[i][0]; - break; - } - } - if (string.match(parseTokenTimezone)) { - config._f += "Z"; - } - makeDateFromStringAndFormat(config); + function absRound(number) { + if (number < 0) { + return Math.ceil(number); } else { - config._isValid = false; + return Math.floor(number); } } - // date from iso format or fallback - function makeDateFromString(config) { - parseISO(config); - if (config._isValid === false) { - delete config._isValid; - moment.createFromInputFallback(config); + // left zero fill a number + // see http://jsperf.com/left-zero-filling for performance comparison + function leftZeroFill(number, targetLength, forceSign) { + var output = '' + Math.abs(number), + sign = number >= 0; + + while (output.length < targetLength) { + output = '0' + output; } + return (sign ? (forceSign ? '+' : '') : '-') + output; } - function makeDateFromInput(config) { - var input = config._i, - matched = aspNetJsonRegex.exec(input); + // helper function for _.addTime and _.subtractTime + function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = duration._days, + months = duration._months; + updateOffset = updateOffset == null ? true : updateOffset; - if (input === undefined) { - config._d = new Date(); - } else if (matched) { - config._d = new Date(+matched[1]); - } else if (typeof input === 'string') { - makeDateFromString(config); - } else if (isArray(input)) { - config._a = input.slice(0); - dateFromConfig(config); - } else if (isDate(input)) { - config._d = new Date(+input); - } else if (typeof(input) === 'object') { - dateFromObject(config); - } else if (typeof(input) === 'number') { - // from milliseconds - config._d = new Date(input); - } else { - moment.createFromInputFallback(config); + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + if (days) { + rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); + } + if (months) { + rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); + } + if (updateOffset) { + moment.updateOffset(mom, days || months); } } - function makeDate(y, m, d, h, M, s, ms) { - //can't just apply() to create a date: - //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply - var date = new Date(y, m, d, h, M, s, ms); + // check if is an array + function isArray(input) { + return Object.prototype.toString.call(input) === '[object Array]'; + } - //the date constructor doesn't accept years < 1970 - if (y < 1970) { - date.setFullYear(y); - } - return date; + function isDate(input) { + return Object.prototype.toString.call(input) === '[object Date]' || + input instanceof Date; } - function makeUTCDate(y) { - var date = new Date(Date.UTC.apply(null, arguments)); - if (y < 1970) { - date.setUTCFullYear(y); + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } } - return date; + return diffs + lengthDiff; } - function parseWeekday(input, language) { - if (typeof input === 'string') { - if (!isNaN(input)) { - input = parseInt(input, 10); - } - else { - input = language.weekdaysParse(input); - if (typeof input !== 'number') { - return null; - } - } + function normalizeUnits(units) { + if (units) { + var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); + units = unitAliases[units] || camelFunctions[lowered] || lowered; } - return input; + return units; } - /************************************ - Relative Time - ************************************/ + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + for (prop in inputObject) { + if (inputObject.hasOwnProperty(prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } - // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize - function substituteTimeAgo(string, number, withoutSuffix, isFuture, lang) { - return lang.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + return normalizedInput; } - function relativeTime(milliseconds, withoutSuffix, lang) { - var seconds = round(Math.abs(milliseconds) / 1000), - minutes = round(seconds / 60), - hours = round(minutes / 60), - days = round(hours / 24), - years = round(days / 365), - args = seconds < relativeTimeThresholds.s && ['s', seconds] || - minutes === 1 && ['m'] || - minutes < relativeTimeThresholds.m && ['mm', minutes] || - hours === 1 && ['h'] || - hours < relativeTimeThresholds.h && ['hh', hours] || - days === 1 && ['d'] || - days <= relativeTimeThresholds.dd && ['dd', days] || - days <= relativeTimeThresholds.dm && ['M'] || - days < relativeTimeThresholds.dy && ['MM', round(days / 30)] || - years === 1 && ['y'] || ['yy', years]; - args[2] = withoutSuffix; - args[3] = milliseconds > 0; - args[4] = lang; - return substituteTimeAgo.apply({}, args); - } + function makeList(field) { + var count, setter; + if (field.indexOf('week') === 0) { + count = 7; + setter = 'day'; + } + else if (field.indexOf('month') === 0) { + count = 12; + setter = 'month'; + } + else { + return; + } - /************************************ - Week of Year - ************************************/ + moment[field] = function (format, index) { + var i, getter, + method = moment.fn._lang[field], + results = []; + if (typeof format === 'number') { + index = format; + format = undefined; + } - // firstDayOfWeek 0 = sun, 6 = sat - // the day of the week that starts the week - // (usually sunday or monday) - // firstDayOfWeekOfYear 0 = sun, 6 = sat - // the first week is the week that contains the first - // of this day of the week - // (eg. ISO weeks use thursday (4)) - function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { - var end = firstDayOfWeekOfYear - firstDayOfWeek, - daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), - adjustedMoment; + getter = function (i) { + var m = moment().utc().set(setter, i); + return method.call(moment.fn._lang, m, format || ''); + }; + if (index != null) { + return getter(index); + } + else { + for (i = 0; i < count; i++) { + results.push(getter(i)); + } + return results; + } + }; + } - if (daysToDayOfWeek > end) { - daysToDayOfWeek -= 7; - } + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; - if (daysToDayOfWeek < end - 7) { - daysToDayOfWeek += 7; + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + if (coercedNumber >= 0) { + value = Math.floor(coercedNumber); + } else { + value = Math.ceil(coercedNumber); + } } - adjustedMoment = moment(mom).add('d', daysToDayOfWeek); - return { - week: Math.ceil(adjustedMoment.dayOfYear() / 7), - year: adjustedMoment.year() - }; + return value; } - //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { - var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } - d = d === 0 ? 7 : d; - weekday = weekday != null ? weekday : firstDayOfWeek; - daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); - dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + function weeksInYear(year, dow, doy) { + return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; + } - return { - year: dayOfYear > 0 ? year : year - 1, - dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear - }; + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; } - /************************************ - Top Level Functions - ************************************/ + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } - function makeMoment(config) { - var input = config._i, - format = config._f; + function checkOverflow(m) { + var overflow; + if (m._a && m._pf.overflow === -2) { + overflow = + m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : + m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : + m._a[HOUR] < 0 || m._a[HOUR] > 23 ? HOUR : + m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : + m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : + m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : + -1; - if (input === null || (format === undefined && input === '')) { - return moment.invalid({nullInput: true}); - } + if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } - if (typeof input === 'string') { - config._i = input = getLangDefinition().preparse(input); + m._pf.overflow = overflow; } + } - if (moment.isMoment(input)) { - config = cloneMoment(input); + function isValid(m) { + if (m._isValid == null) { + m._isValid = !isNaN(m._d.getTime()) && + m._pf.overflow < 0 && + !m._pf.empty && + !m._pf.invalidMonth && + !m._pf.nullInput && + !m._pf.invalidFormat && + !m._pf.userInvalidated; - config._d = new Date(+input._d); - } else if (format) { - if (isArray(format)) { - makeDateFromStringAndArray(config); - } else { - makeDateFromStringAndFormat(config); + if (m._strict) { + m._isValid = m._isValid && + m._pf.charsLeftOver === 0 && + m._pf.unusedTokens.length === 0; } - } else { - makeDateFromInput(config); } - - return new Moment(config); + return m._isValid; } - moment = function (input, format, lang, strict) { - var c; + function normalizeLanguage(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } - if (typeof(lang) === "boolean") { - strict = lang; - lang = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c = {}; - c._isAMomentObject = true; - c._i = input; - c._f = format; - c._l = lang; - c._strict = strict; - c._isUTC = false; - c._pf = defaultParsingFlags(); + // Return a moment from input, that is local/utc/zone equivalent to model. + function makeAs(input, model) { + return model._isUTC ? moment(input).zone(model._offset || 0) : + moment(input).local(); + } - return makeMoment(c); - }; + /************************************ + Languages + ************************************/ - moment.suppressDeprecationWarnings = false; - moment.createFromInputFallback = deprecate( - "moment construction falls back to js Date. This is " + - "discouraged and will be removed in upcoming major " + - "release. Please refer to " + - "https://github.com/moment/moment/issues/1407 for more info.", - function (config) { - config._d = new Date(config._i); - }); + extend(Language.prototype, { - // Pick a moment m from moments so that m[fn](other) is true for all - // other. This relies on the function fn to be transitive. - // - // moments should either be an array of moment objects or an array, whose - // first element is an array of moment objects. - function pickBy(fn, moments) { - var res, i; - if (moments.length === 1 && isArray(moments[0])) { - moments = moments[0]; - } - if (!moments.length) { - return moment(); - } - res = moments[0]; - for (i = 1; i < moments.length; ++i) { - if (moments[i][fn](res)) { - res = moments[i]; + set : function (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (typeof prop === 'function') { + this[i] = prop; + } else { + this['_' + i] = prop; + } } - } - return res; - } + }, - moment.min = function () { - var args = [].slice.call(arguments, 0); + _months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), + months : function (m) { + return this._months[m.month()]; + }, - return pickBy('isBefore', args); - }; + _monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), + monthsShort : function (m) { + return this._monthsShort[m.month()]; + }, - moment.max = function () { - var args = [].slice.call(arguments, 0); + monthsParse : function (monthName) { + var i, mom, regex; - return pickBy('isAfter', args); - }; + if (!this._monthsParse) { + this._monthsParse = []; + } - // creating with utc - moment.utc = function (input, format, lang, strict) { - var c; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + if (!this._monthsParse[i]) { + mom = moment.utc([2000, i]); + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._monthsParse[i].test(monthName)) { + return i; + } + } + }, - if (typeof(lang) === "boolean") { - strict = lang; - lang = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c = {}; - c._isAMomentObject = true; - c._useUTC = true; - c._isUTC = true; - c._l = lang; - c._i = input; - c._f = format; - c._strict = strict; - c._pf = defaultParsingFlags(); + _weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + weekdays : function (m) { + return this._weekdays[m.day()]; + }, - return makeMoment(c).utc(); - }; + _weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), + weekdaysShort : function (m) { + return this._weekdaysShort[m.day()]; + }, - // creating with unix timestamp (in seconds) - moment.unix = function (input) { - return moment(input * 1000); - }; + _weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), + weekdaysMin : function (m) { + return this._weekdaysMin[m.day()]; + }, - // duration - moment.duration = function (input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - parseIso; + weekdaysParse : function (weekdayName) { + var i, mom, regex; - if (moment.isDuration(input)) { - duration = { - ms: input._milliseconds, - d: input._days, - M: input._months - }; - } else if (typeof input === 'number') { - duration = {}; - if (key) { - duration[key] = input; - } else { - duration.milliseconds = input; + if (!this._weekdaysParse) { + this._weekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + if (!this._weekdaysParse[i]) { + mom = moment([2000, 1]).day(i); + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + }, + + _longDateFormat : { + LT : "h:mm A", + L : "MM/DD/YYYY", + LL : "MMMM D YYYY", + LLL : "MMMM D YYYY LT", + LLLL : "dddd, MMMM D YYYY LT" + }, + longDateFormat : function (key) { + var output = this._longDateFormat[key]; + if (!output && this._longDateFormat[key.toUpperCase()]) { + output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + this._longDateFormat[key] = output; } - } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { - sign = (match[1] === "-") ? -1 : 1; - duration = { - y: 0, - d: toInt(match[DATE]) * sign, - h: toInt(match[HOUR]) * sign, - m: toInt(match[MINUTE]) * sign, - s: toInt(match[SECOND]) * sign, - ms: toInt(match[MILLISECOND]) * sign - }; - } else if (!!(match = isoDurationRegex.exec(input))) { - sign = (match[1] === "-") ? -1 : 1; - parseIso = function (inp) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; - }; - duration = { - y: parseIso(match[2]), - M: parseIso(match[3]), - d: parseIso(match[4]), - h: parseIso(match[5]), - m: parseIso(match[6]), - s: parseIso(match[7]), - w: parseIso(match[8]) - }; - } + return output; + }, - ret = new Duration(duration); + isPM : function (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + }, - if (moment.isDuration(input) && input.hasOwnProperty('_lang')) { - ret._lang = input._lang; - } + _meridiemParse : /[ap]\.?m?\.?/i, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + }, - return ret; - }; + _calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendar[key]; + return typeof output === 'function' ? output.apply(mom) : output; + }, - // version number - moment.version = VERSION; + _relativeTime : { + future : "in %s", + past : "%s ago", + s : "a few seconds", + m : "a minute", + mm : "%d minutes", + h : "an hour", + hh : "%d hours", + d : "a day", + dd : "%d days", + M : "a month", + MM : "%d months", + y : "a year", + yy : "%d years" + }, + relativeTime : function (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (typeof output === 'function') ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + }, + pastFuture : function (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + }, - // default format - moment.defaultFormat = isoFormat; + ordinal : function (number) { + return this._ordinal.replace("%d", number); + }, + _ordinal : "%d", - // constant that refers to the ISO standard - moment.ISO_8601 = function () {}; + preparse : function (string) { + return string; + }, - // Plugins that add properties should also add the key here (null value), - // so we can properly clone ourselves. - moment.momentProperties = momentProperties; + postformat : function (string) { + return string; + }, - // This function will be called whenever a moment is mutated. - // It is intended to keep the offset in sync with the timezone. - moment.updateOffset = function () {}; + week : function (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + }, - // This function allows you to set a threshold for relative time strings - moment.relativeTimeThreshold = function(threshold, limit) { - if (relativeTimeThresholds[threshold] === undefined) { - return false; - } - relativeTimeThresholds[threshold] = limit; - return true; - }; + _week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }, - // This function will load languages and then set the global language. If - // no arguments are passed in, it will simply return the current global - // language key. - moment.lang = function (key, values) { - var r; - if (!key) { - return moment.fn._lang._abbr; - } - if (values) { - loadLang(normalizeLanguage(key), values); - } else if (values === null) { - unloadLang(key); - key = 'en'; - } else if (!languages[key]) { - getLangDefinition(key); + _invalidDate: 'Invalid date', + invalidDate: function () { + return this._invalidDate; } - r = moment.duration.fn._lang = moment.fn._lang = getLangDefinition(key); - return r._abbr; - }; + }); - // returns language data - moment.langData = function (key) { - if (key && key._lang && key._lang._abbr) { - key = key._lang._abbr; + // Loads a language definition into the `languages` cache. The function + // takes a key and optionally values. If not in the browser and no values + // are provided, it will load the language file module. As a convenience, + // this function also returns the language values. + function loadLang(key, values) { + values.abbr = key; + if (!languages[key]) { + languages[key] = new Language(); } - return getLangDefinition(key); - }; - - // compare moment object - moment.isMoment = function (obj) { - return obj instanceof Moment || - (obj != null && obj.hasOwnProperty('_isAMomentObject')); - }; - - // for typechecking Duration objects - moment.isDuration = function (obj) { - return obj instanceof Duration; - }; + languages[key].set(values); + return languages[key]; + } - for (i = lists.length - 1; i >= 0; --i) { - makeList(lists[i]); + // Remove a language from the `languages` cache. Mostly useful in tests. + function unloadLang(key) { + delete languages[key]; } - moment.normalizeUnits = function (units) { - return normalizeUnits(units); - }; + // Determines which language definition to use and returns it. + // + // With no parameters, it will return the global language. If you + // pass in a language key, such as 'en', it will return the + // definition for 'en', so long as 'en' has already been loaded using + // moment.lang. + function getLangDefinition(key) { + var i = 0, j, lang, next, split, + get = function (k) { + if (!languages[k] && hasModule) { + try { + __webpack_require__(60)("./" + k); + } catch (e) { } + } + return languages[k]; + }; - moment.invalid = function (flags) { - var m = moment.utc(NaN); - if (flags != null) { - extend(m._pf, flags); - } - else { - m._pf.userInvalidated = true; + if (!key) { + return moment.fn._lang; } - return m; - }; - - moment.parseZone = function () { - return moment.apply(null, arguments).parseZone(); - }; + if (!isArray(key)) { + //short-circuit everything else + lang = get(key); + if (lang) { + return lang; + } + key = [key]; + } - moment.parseTwoDigitYear = function (input) { - return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); - }; + //pick the language from the array + //try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + //substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + while (i < key.length) { + split = normalizeLanguage(key[i]).split('-'); + j = split.length; + next = normalizeLanguage(key[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + lang = get(split.slice(0, j).join('-')); + if (lang) { + return lang; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return moment.fn._lang; + } /************************************ - Moment Prototype + Formatting ************************************/ - extend(moment.fn = Moment.prototype, { - - clone : function () { - return moment(this); - }, - - valueOf : function () { - return +this._d + ((this._offset || 0) * 60000); - }, - - unix : function () { - return Math.floor(+this / 1000); - }, - - toString : function () { - return this.clone().lang('en').format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ"); - }, + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ""); + } + return input.replace(/\\/g, ""); + } - toDate : function () { - return this._offset ? new Date(+this) : this._d; - }, + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; - toISOString : function () { - var m = moment(this).utc(); - if (0 < m.year() && m.year() <= 9999) { - return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; } else { - return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + array[i] = removeFormattingTokens(array[i]); } - }, - - toArray : function () { - var m = this; - return [ - m.year(), - m.month(), - m.date(), - m.hours(), - m.minutes(), - m.seconds(), - m.milliseconds() - ]; - }, - - isValid : function () { - return isValid(this); - }, - - isDSTShifted : function () { + } - if (this._a) { - return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + return function (mom) { + var output = ""; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; } + return output; + }; + } - return false; - }, + // format date using native date object + function formatMoment(m, format) { - parsingFlags : function () { - return extend({}, this._pf); - }, + if (!m.isValid()) { + return m.lang().invalidDate(); + } - invalidAt: function () { - return this._pf.overflow; - }, + format = expandFormat(format, m.lang()); - utc : function () { - return this.zone(0); - }, + if (!formatFunctions[format]) { + formatFunctions[format] = makeFormatFunction(format); + } - local : function () { - this.zone(0); - this._isUTC = false; - return this; - }, + return formatFunctions[format](m); + } - format : function (inputString) { - var output = formatMoment(this, inputString || moment.defaultFormat); - return this.lang().postformat(output); - }, + function expandFormat(format, lang) { + var i = 5; - add : function (input, val) { - var dur; - // switch args to support add('s', 1) and add(1, 's') - if (typeof input === 'string' && typeof val === 'string') { - dur = moment.duration(isNaN(+val) ? +input : +val, isNaN(+val) ? val : input); - } else if (typeof input === 'string') { - dur = moment.duration(+val, input); - } else { - dur = moment.duration(input, val); - } - addOrSubtractDurationFromMoment(this, dur, 1); - return this; - }, + function replaceLongDateFormatTokens(input) { + return lang.longDateFormat(input) || input; + } - subtract : function (input, val) { - var dur; - // switch args to support subtract('s', 1) and subtract(1, 's') - if (typeof input === 'string' && typeof val === 'string') { - dur = moment.duration(isNaN(+val) ? +input : +val, isNaN(+val) ? val : input); - } else if (typeof input === 'string') { - dur = moment.duration(+val, input); - } else { - dur = moment.duration(input, val); - } - addOrSubtractDurationFromMoment(this, dur, -1); - return this; - }, + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } - diff : function (input, units, asFloat) { - var that = makeAs(input, this), - zoneDiff = (this.zone() - that.zone()) * 6e4, - diff, output; + return format; + } - units = normalizeUnits(units); - if (units === 'year' || units === 'month') { - // average number of days in the months in the given dates - diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2 - // difference in months - output = ((this.year() - that.year()) * 12) + (this.month() - that.month()); - // adjust by taking difference in days, average number of days - // and dst in the given months. - output += ((this - moment(this).startOf('month')) - - (that - moment(that).startOf('month'))) / diff; - // same as above but with zones, to negate all dst - output -= ((this.zone() - moment(this).startOf('month').zone()) - - (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff; - if (units === 'year') { - output = output / 12; - } - } else { - diff = (this - that); - output = units === 'second' ? diff / 1e3 : // 1000 - units === 'minute' ? diff / 6e4 : // 1000 * 60 - units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 - units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst - units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst - diff; - } - return asFloat ? output : absRound(output); - }, + /************************************ + Parsing + ************************************/ - from : function (time, withoutSuffix) { - return moment.duration(this.diff(time)).lang(this.lang()._abbr).humanize(!withoutSuffix); - }, - fromNow : function (withoutSuffix) { - return this.from(moment(), withoutSuffix); - }, + // get the regex to find the next token + function getParseRegexForToken(token, config) { + var a, strict = config._strict; + switch (token) { + case 'Q': + return parseTokenOneDigit; + case 'DDDD': + return parseTokenThreeDigits; + case 'YYYY': + case 'GGGG': + case 'gggg': + return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; + case 'Y': + case 'G': + case 'g': + return parseTokenSignedNumber; + case 'YYYYYY': + case 'YYYYY': + case 'GGGGG': + case 'ggggg': + return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; + case 'S': + if (strict) { return parseTokenOneDigit; } + /* falls through */ + case 'SS': + if (strict) { return parseTokenTwoDigits; } + /* falls through */ + case 'SSS': + if (strict) { return parseTokenThreeDigits; } + /* falls through */ + case 'DDD': + return parseTokenOneToThreeDigits; + case 'MMM': + case 'MMMM': + case 'dd': + case 'ddd': + case 'dddd': + return parseTokenWord; + case 'a': + case 'A': + return getLangDefinition(config._l)._meridiemParse; + case 'X': + return parseTokenTimestampMs; + case 'Z': + case 'ZZ': + return parseTokenTimezone; + case 'T': + return parseTokenT; + case 'SSSS': + return parseTokenDigits; + case 'MM': + case 'DD': + case 'YY': + case 'GG': + case 'gg': + case 'HH': + case 'hh': + case 'mm': + case 'ss': + case 'ww': + case 'WW': + return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; + case 'M': + case 'D': + case 'd': + case 'H': + case 'h': + case 'm': + case 's': + case 'w': + case 'W': + case 'e': + case 'E': + return parseTokenOneOrTwoDigits; + case 'Do': + return parseTokenOrdinal; + default : + a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), "i")); + return a; + } + } - calendar : function (time) { - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're zone'd or not. - var now = time || moment(), - sod = makeAs(now, this).startOf('day'), - diff = this.diff(sod, 'days', true), - format = diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; - return this.format(this.lang().calendar(format, this)); - }, + function timezoneMinutesFromString(string) { + string = string || ""; + var possibleTzMatches = (string.match(parseTokenTimezone) || []), + tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], + parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], + minutes = +(parts[1] * 60) + toInt(parts[2]); - isLeapYear : function () { - return isLeapYear(this.year()); - }, + return parts[0] === '+' ? -minutes : minutes; + } - isDST : function () { - return (this.zone() < this.clone().month(0).zone() || - this.zone() < this.clone().month(5).zone()); - }, + // function to convert string input to date + function addTimeToArrayFromToken(token, input, config) { + var a, datePartArray = config._a; - day : function (input) { - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + switch (token) { + // QUARTER + case 'Q': if (input != null) { - input = parseWeekday(input, this.lang()); - return this.add({ d : input - day }); - } else { - return day; + datePartArray[MONTH] = (toInt(input) - 1) * 3; } - }, - - month : makeAccessor('Month', true), - - startOf: function (units) { - units = normalizeUnits(units); - // the following switch intentionally omits break keywords - // to utilize falling through the cases. - switch (units) { - case 'year': - this.month(0); - /* falls through */ - case 'quarter': - case 'month': - this.date(1); - /* falls through */ - case 'week': - case 'isoWeek': - case 'day': - this.hours(0); - /* falls through */ - case 'hour': - this.minutes(0); - /* falls through */ - case 'minute': - this.seconds(0); - /* falls through */ - case 'second': - this.milliseconds(0); - /* falls through */ + break; + // MONTH + case 'M' : // fall through to MM + case 'MM' : + if (input != null) { + datePartArray[MONTH] = toInt(input) - 1; } - - // weeks are a special case - if (units === 'week') { - this.weekday(0); - } else if (units === 'isoWeek') { - this.isoWeekday(1); + break; + case 'MMM' : // fall through to MMMM + case 'MMMM' : + a = getLangDefinition(config._l).monthsParse(input); + // if we didn't find a month name, mark the date as invalid. + if (a != null) { + datePartArray[MONTH] = a; + } else { + config._pf.invalidMonth = input; } - - // quarters are also special - if (units === 'quarter') { - this.month(Math.floor(this.month() / 3) * 3); + break; + // DAY OF MONTH + case 'D' : // fall through to DD + case 'DD' : + if (input != null) { + datePartArray[DATE] = toInt(input); } - - return this; - }, - - endOf: function (units) { - units = normalizeUnits(units); - return this.startOf(units).add((units === 'isoWeek' ? 'week' : units), 1).subtract('ms', 1); - }, - - isAfter: function (input, units) { - units = typeof units !== 'undefined' ? units : 'millisecond'; - return +this.clone().startOf(units) > +moment(input).startOf(units); - }, - - isBefore: function (input, units) { - units = typeof units !== 'undefined' ? units : 'millisecond'; - return +this.clone().startOf(units) < +moment(input).startOf(units); - }, - - isSame: function (input, units) { - units = units || 'ms'; - return +this.clone().startOf(units) === +makeAs(input, this).startOf(units); - }, - - min: deprecate( - "moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548", - function (other) { - other = moment.apply(null, arguments); - return other < this ? this : other; - } - ), - - max: deprecate( - "moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548", - function (other) { - other = moment.apply(null, arguments); - return other > this ? this : other; - } - ), - - // keepTime = true means only change the timezone, without affecting - // the local hour. So 5:31:26 +0300 --[zone(2, true)]--> 5:31:26 +0200 - // It is possible that 5:31:26 doesn't exist int zone +0200, so we - // adjust the time as needed, to be valid. - // - // Keeping the time actually adds/subtracts (one hour) - // from the actual represented time. That is why we call updateOffset - // a second time. In case it wants us to change the offset again - // _changeInProgress == true case, then we have to adjust, because - // there is no such time in the given timezone. - zone : function (input, keepTime) { - var offset = this._offset || 0; + break; + case 'Do' : if (input != null) { - if (typeof input === "string") { - input = timezoneMinutesFromString(input); - } - if (Math.abs(input) < 16) { - input = input * 60; - } - this._offset = input; - this._isUTC = true; - if (offset !== input) { - if (!keepTime || this._changeInProgress) { - addOrSubtractDurationFromMoment(this, - moment.duration(offset - input, 'm'), 1, false); - } else if (!this._changeInProgress) { - this._changeInProgress = true; - moment.updateOffset(this, true); - this._changeInProgress = null; - } - } - } else { - return this._isUTC ? offset : this._d.getTimezoneOffset(); + datePartArray[DATE] = toInt(parseInt(input, 10)); } - return this; - }, - - zoneAbbr : function () { - return this._isUTC ? "UTC" : ""; - }, - - zoneName : function () { - return this._isUTC ? "Coordinated Universal Time" : ""; - }, - - parseZone : function () { - if (this._tzm) { - this.zone(this._tzm); - } else if (typeof this._i === 'string') { - this.zone(this._i); + break; + // DAY OF YEAR + case 'DDD' : // fall through to DDDD + case 'DDDD' : + if (input != null) { + config._dayOfYear = toInt(input); } - return this; - }, - hasAlignedHourOffset : function (input) { - if (!input) { - input = 0; + break; + // YEAR + case 'YY' : + datePartArray[YEAR] = moment.parseTwoDigitYear(input); + break; + case 'YYYY' : + case 'YYYYY' : + case 'YYYYYY' : + datePartArray[YEAR] = toInt(input); + break; + // AM / PM + case 'a' : // fall through to A + case 'A' : + config._isPm = getLangDefinition(config._l).isPM(input); + break; + // 24 HOUR + case 'H' : // fall through to hh + case 'HH' : // fall through to hh + case 'h' : // fall through to hh + case 'hh' : + datePartArray[HOUR] = toInt(input); + break; + // MINUTE + case 'm' : // fall through to mm + case 'mm' : + datePartArray[MINUTE] = toInt(input); + break; + // SECOND + case 's' : // fall through to ss + case 'ss' : + datePartArray[SECOND] = toInt(input); + break; + // MILLISECOND + case 'S' : + case 'SS' : + case 'SSS' : + case 'SSSS' : + datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); + break; + // UNIX TIMESTAMP WITH MS + case 'X': + config._d = new Date(parseFloat(input) * 1000); + break; + // TIMEZONE + case 'Z' : // fall through to ZZ + case 'ZZ' : + config._useUTC = true; + config._tzm = timezoneMinutesFromString(input); + break; + // WEEKDAY - human + case 'dd': + case 'ddd': + case 'dddd': + a = getLangDefinition(config._l).weekdaysParse(input); + // if we didn't get a weekday name, mark the date as invalid + if (a != null) { + config._w = config._w || {}; + config._w['d'] = a; + } else { + config._pf.invalidWeekday = input; } - else { - input = moment(input).zone(); + break; + // WEEK, WEEK DAY - numeric + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'd': + case 'e': + case 'E': + token = token.substr(0, 1); + /* falls through */ + case 'gggg': + case 'GGGG': + case 'GGGGG': + token = token.substr(0, 2); + if (input) { + config._w = config._w || {}; + config._w[token] = toInt(input); } + break; + case 'gg': + case 'GG': + config._w = config._w || {}; + config._w[token] = moment.parseTwoDigitYear(input); + } + } - return (this.zone() - input) % 60 === 0; - }, - - daysInMonth : function () { - return daysInMonth(this.year(), this.month()); - }, - - dayOfYear : function (input) { - var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add("d", (input - dayOfYear)); - }, + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, lang; - quarter : function (input) { - return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); - }, + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; - weekYear : function (input) { - var year = weekOfYear(this, this.lang()._week.dow, this.lang()._week.doy).year; - return input == null ? year : this.add("y", (input - year)); - }, + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); + week = dfl(w.W, 1); + weekday = dfl(w.E, 1); + } else { + lang = getLangDefinition(config._l); + dow = lang._week.dow; + doy = lang._week.doy; - isoWeekYear : function (input) { - var year = weekOfYear(this, 1, 4).year; - return input == null ? year : this.add("y", (input - year)); - }, + weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); + week = dfl(w.w, 1); - week : function (input) { - var week = this.lang().week(this); - return input == null ? week : this.add("d", (input - week) * 7); - }, + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < dow) { + ++week; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + } else { + // default to begining of week + weekday = dow; + } + } + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); - isoWeek : function (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add("d", (input - week) * 7); - }, + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } - weekday : function (input) { - var weekday = (this.day() + 7 - this.lang()._week.dow) % 7; - return input == null ? weekday : this.add("d", input - weekday); - }, + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function dateFromConfig(config) { + var i, date, input = [], currentDate, yearToUse; - isoWeekday : function (input) { - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. - return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); - }, + if (config._d) { + return; + } - isoWeeksInYear : function () { - return weeksInYear(this.year(), 1, 4); - }, + currentDate = currentDateArray(config); - weeksInYear : function () { - var weekInfo = this._lang._week; - return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); - }, + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } - get : function (units) { - units = normalizeUnits(units); - return this[units](); - }, + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); - set : function (units, value) { - units = normalizeUnits(units); - if (typeof this[units] === 'function') { - this[units](value); + if (config._dayOfYear > daysInYear(yearToUse)) { + config._pf._overflowDayOfYear = true; } - return this; - }, - // If passed a language key, it will set the language for this - // instance. Otherwise, it will return the language configuration - // variables for this instance. - lang : function (key) { - if (key === undefined) { - return this._lang; - } else { - this._lang = getLangDefinition(key); - return this; - } + date = makeUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); } - }); - function rawMonthSetter(mom, value) { - var dayOfMonth; - - // TODO: Move this out of here! - if (typeof value === 'string') { - value = mom.lang().monthsParse(value); - // TODO: Another silent failure? - if (typeof value !== 'number') { - return mom; - } + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; } - dayOfMonth = Math.min(mom.date(), - daysInMonth(mom.year(), value)); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); - return mom; - } - - function rawGetter(mom, unit) { - return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); - } - - function rawSetter(mom, unit, value) { - if (unit === 'Month') { - return rawMonthSetter(mom, value); - } else { - return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; } - } - function makeAccessor(unit, keepTime) { - return function (value) { - if (value != null) { - rawSetter(this, unit, value); - moment.updateOffset(this, keepTime); - return this; - } else { - return rawGetter(this, unit); - } - }; + config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + // Apply timezone offset from input. The actual zone can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() + config._tzm); + } } - moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); - moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); - moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); - // Setting the hour should keep the time, because the user explicitly - // specified which hour he wants. So trying to maintain the same hour (in - // a new timezone) makes sense. Adding/subtracting hours does not follow - // this rule. - moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); - // moment.fn.month is defined separately - moment.fn.date = makeAccessor('Date', true); - moment.fn.dates = deprecate("dates accessor is deprecated. Use date instead.", makeAccessor('Date', true)); - moment.fn.year = makeAccessor('FullYear', true); - moment.fn.years = deprecate("years accessor is deprecated. Use year instead.", makeAccessor('FullYear', true)); - - // add plural methods - moment.fn.days = moment.fn.day; - moment.fn.months = moment.fn.month; - moment.fn.weeks = moment.fn.week; - moment.fn.isoWeeks = moment.fn.isoWeek; - moment.fn.quarters = moment.fn.quarter; - - // add aliased format methods - moment.fn.toJSON = moment.fn.toISOString; + function dateFromObject(config) { + var normalizedInput; - /************************************ - Duration Prototype - ************************************/ + if (config._d) { + return; + } + normalizedInput = normalizeObjectUnits(config._i); + config._a = [ + normalizedInput.year, + normalizedInput.month, + normalizedInput.day, + normalizedInput.hour, + normalizedInput.minute, + normalizedInput.second, + normalizedInput.millisecond + ]; - extend(moment.duration.fn = Duration.prototype, { + dateFromConfig(config); + } - _bubble : function () { - var milliseconds = this._milliseconds, - days = this._days, - months = this._months, - data = this._data, - seconds, minutes, hours, years; + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [ + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate() + ]; + } else { + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } + } - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; + // date from string and format string + function makeDateFromStringAndFormat(config) { - seconds = absRound(milliseconds / 1000); - data.seconds = seconds % 60; + if (config._f === moment.ISO_8601) { + parseISO(config); + return; + } - minutes = absRound(seconds / 60); - data.minutes = minutes % 60; + config._a = []; + config._pf.empty = true; - hours = absRound(minutes / 60); - data.hours = hours % 24; + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var lang = getLangDefinition(config._l), + string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; - days += absRound(hours / 24); - data.days = days % 30; + tokens = expandFormat(config._f, lang).match(formattingTokens) || []; - months += absRound(days / 30); - data.months = months % 12; + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + config._pf.unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + config._pf.empty = false; + } + else { + config._pf.unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + config._pf.unusedTokens.push(token); + } + } - years = absRound(months / 12); - data.years = years; - }, + // add remaining unparsed input length to the string + config._pf.charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + config._pf.unusedInput.push(string); + } - weeks : function () { - return absRound(this.days() / 7); - }, + // handle am pm + if (config._isPm && config._a[HOUR] < 12) { + config._a[HOUR] += 12; + } + // if is 12 am, change hours to 0 + if (config._isPm === false && config._a[HOUR] === 12) { + config._a[HOUR] = 0; + } - valueOf : function () { - return this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6; - }, + dateFromConfig(config); + checkOverflow(config); + } - humanize : function (withSuffix) { - var difference = +this, - output = relativeTime(difference, !withSuffix, this.lang()); + function unescapeFormat(s) { + return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }); + } - if (withSuffix) { - output = this.lang().pastFuture(difference, output); - } + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function regexpEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } - return this.lang().postformat(output); - }, + // date from string and array of format strings + function makeDateFromStringAndArray(config) { + var tempConfig, + bestMoment, - add : function (input, val) { - // supports only 2.0-style add(1, 's') or add(moment) - var dur = moment.duration(input, val); + scoreToBeat, + i, + currentScore; - this._milliseconds += dur._milliseconds; - this._days += dur._days; - this._months += dur._months; + if (config._f.length === 0) { + config._pf.invalidFormat = true; + config._d = new Date(NaN); + return; + } - this._bubble(); + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = extend({}, config); + tempConfig._pf = defaultParsingFlags(); + tempConfig._f = config._f[i]; + makeDateFromStringAndFormat(tempConfig); - return this; - }, + if (!isValid(tempConfig)) { + continue; + } - subtract : function (input, val) { - var dur = moment.duration(input, val); + // if there is any input that was not parsed add a penalty for that format + currentScore += tempConfig._pf.charsLeftOver; - this._milliseconds -= dur._milliseconds; - this._days -= dur._days; - this._months -= dur._months; + //or tokens + currentScore += tempConfig._pf.unusedTokens.length * 10; - this._bubble(); + tempConfig._pf.score = currentScore; - return this; - }, + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } - get : function (units) { - units = normalizeUnits(units); - return this[units.toLowerCase() + 's'](); - }, + extend(config, bestMoment || tempConfig); + } - as : function (units) { - units = normalizeUnits(units); - return this['as' + units.charAt(0).toUpperCase() + units.slice(1) + 's'](); - }, + // date from iso format + function parseISO(config) { + var i, l, + string = config._i, + match = isoRegex.exec(string); - lang : moment.fn.lang, + if (match) { + config._pf.iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(string)) { + // match[5] should be "T" or undefined + config._f = isoDates[i][0] + (match[6] || " "); + break; + } + } + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (string.match(parseTokenTimezone)) { + config._f += "Z"; + } + makeDateFromStringAndFormat(config); + } else { + config._isValid = false; + } + } - toIsoString : function () { - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var years = Math.abs(this.years()), - months = Math.abs(this.months()), - days = Math.abs(this.days()), - hours = Math.abs(this.hours()), - minutes = Math.abs(this.minutes()), - seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + // date from iso format or fallback + function makeDateFromString(config) { + parseISO(config); + if (config._isValid === false) { + delete config._isValid; + moment.createFromInputFallback(config); + } + } - if (!this.asSeconds()) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } + function makeDateFromInput(config) { + var input = config._i, + matched = aspNetJsonRegex.exec(input); - return (this.asSeconds() < 0 ? '-' : '') + - 'P' + - (years ? years + 'Y' : '') + - (months ? months + 'M' : '') + - (days ? days + 'D' : '') + - ((hours || minutes || seconds) ? 'T' : '') + - (hours ? hours + 'H' : '') + - (minutes ? minutes + 'M' : '') + - (seconds ? seconds + 'S' : ''); + if (input === undefined) { + config._d = new Date(); + } else if (matched) { + config._d = new Date(+matched[1]); + } else if (typeof input === 'string') { + makeDateFromString(config); + } else if (isArray(input)) { + config._a = input.slice(0); + dateFromConfig(config); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if (typeof(input) === 'object') { + dateFromObject(config); + } else if (typeof(input) === 'number') { + // from milliseconds + config._d = new Date(input); + } else { + moment.createFromInputFallback(config); } - }); - - function makeDurationGetter(name) { - moment.duration.fn[name] = function () { - return this._data[name]; - }; } - function makeDurationAsGetter(name, factor) { - moment.duration.fn['as' + name] = function () { - return +this / factor; - }; - } + function makeDate(y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); - for (i in unitMillisecondFactors) { - if (unitMillisecondFactors.hasOwnProperty(i)) { - makeDurationAsGetter(i, unitMillisecondFactors[i]); - makeDurationGetter(i.toLowerCase()); + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); } + return date; } - makeDurationAsGetter('Weeks', 6048e5); - moment.duration.fn.asMonths = function () { - return (+this - this.years() * 31536e6) / 2592e6 + this.years() * 12; - }; + function makeUTCDate(y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); + } + return date; + } + function parseWeekday(input, language) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = language.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } + } + return input; + } /************************************ - Default Lang + Relative Time ************************************/ - // Set default language, other languages will inherit from English. - moment.lang('en', { - ordinal : function (number) { - var b = number % 10, - output = (toInt(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, lang) { + return lang.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime(milliseconds, withoutSuffix, lang) { + var seconds = round(Math.abs(milliseconds) / 1000), + minutes = round(seconds / 60), + hours = round(minutes / 60), + days = round(hours / 24), + years = round(days / 365), + args = seconds < relativeTimeThresholds.s && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < relativeTimeThresholds.m && ['mm', minutes] || + hours === 1 && ['h'] || + hours < relativeTimeThresholds.h && ['hh', hours] || + days === 1 && ['d'] || + days <= relativeTimeThresholds.dd && ['dd', days] || + days <= relativeTimeThresholds.dm && ['M'] || + days < relativeTimeThresholds.dy && ['MM', round(days / 30)] || + years === 1 && ['y'] || ['yy', years]; + args[2] = withoutSuffix; + args[3] = milliseconds > 0; + args[4] = lang; + return substituteTimeAgo.apply({}, args); + } - /* EMBED_LANGUAGES */ /************************************ - Exposing Moment + Week of Year ************************************/ - function makeGlobal(shouldDeprecate) { - /*global ender:false */ - if (typeof ender !== 'undefined') { - return; - } - oldGlobalMoment = globalScope.moment; - if (shouldDeprecate) { - globalScope.moment = deprecate( - "Accessing Moment through the global scope is " + - "deprecated, and will be removed in an upcoming " + - "release.", - moment); - } else { - globalScope.moment = moment; - } - } - // CommonJS module is defined - if (hasModule) { - module.exports = moment; - } else if (true) { - !(__WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, module) { - if (module.config && module.config() && module.config().noGlobal === true) { - // release the global variable - globalScope.moment = oldGlobalMoment; - } - - return moment; - }.call(exports, __webpack_require__, exports, module)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - makeGlobal(true); - } else { - makeGlobal(); - } - }).call(this); - - /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(64)(module))) + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; -/***/ }, -/* 52 */ -/***/ function(module, exports, __webpack_require__) { - var __WEBPACK_AMD_DEFINE_RESULT__;/*! Hammer.JS - v1.1.3 - 2014-05-20 - * http://eightmedia.github.io/hammer.js - * - * Copyright (c) 2014 Jorik Tangelder ; - * Licensed under the MIT license */ + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; + } - (function(window, undefined) { - 'use strict'; + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } - /** - * @main - * @module hammer - * - * @class Hammer - * @static - */ + adjustedMoment = moment(mom).add('d', daysToDayOfWeek); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; + } - /** - * Hammer, use this to create instances - * ```` - * var hammertime = new Hammer(myElement); - * ```` - * - * @method Hammer - * @param {HTMLElement} element - * @param {Object} [options={}] - * @return {Hammer.Instance} - */ - var Hammer = function Hammer(element, options) { - return new Hammer.Instance(element, options || {}); - }; + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; - /** - * version, as defined in package.json - * the value will be set at each build - * @property VERSION - * @final - * @type {String} - */ - Hammer.VERSION = '1.1.3'; + d = d === 0 ? 7 : d; + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; - /** - * default settings. - * more settings are defined per gesture at `/gestures`. Each gesture can be disabled/enabled - * by setting it's name (like `swipe`) to false. - * You can set the defaults for all instances by changing this object before creating an instance. - * @example - * ```` - * Hammer.defaults.drag = false; - * Hammer.defaults.behavior.touchAction = 'pan-y'; - * delete Hammer.defaults.behavior.userSelect; - * ```` - * @property defaults - * @type {Object} - */ - Hammer.defaults = { - /** - * this setting object adds styles and attributes to the element to prevent the browser from doing - * its native behavior. The css properties are auto prefixed for the browsers when needed. - * @property defaults.behavior - * @type {Object} - */ - behavior: { - /** - * Disables text selection to improve the dragging gesture. When the value is `none` it also sets - * `onselectstart=false` for IE on the element. Mainly for desktop browsers. - * @property defaults.behavior.userSelect - * @type {String} - * @default 'none' - */ - userSelect: 'none', + return { + year: dayOfYear > 0 ? year : year - 1, + dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; + } - /** - * Specifies whether and how a given region can be manipulated by the user (for instance, by panning or zooming). - * Used by Chrome 35> and IE10>. By default this makes the element blocking any touch event. - * @property defaults.behavior.touchAction - * @type {String} - * @default: 'pan-y' - */ - touchAction: 'pan-y', + /************************************ + Top Level Functions + ************************************/ - /** - * Disables the default callout shown when you touch and hold a touch target. - * On iOS, when you touch and hold a touch target such as a link, Safari displays - * a callout containing information about the link. This property allows you to disable that callout. - * @property defaults.behavior.touchCallout - * @type {String} - * @default 'none' - */ - touchCallout: 'none', + function makeMoment(config) { + var input = config._i, + format = config._f; - /** - * Specifies whether zooming is enabled. Used by IE10> - * @property defaults.behavior.contentZooming - * @type {String} - * @default 'none' - */ - contentZooming: 'none', + if (input === null || (format === undefined && input === '')) { + return moment.invalid({nullInput: true}); + } - /** - * Specifies that an entire element should be draggable instead of its contents. - * Mainly for desktop browsers. - * @property defaults.behavior.userDrag - * @type {String} - * @default 'none' - */ - userDrag: 'none', + if (typeof input === 'string') { + config._i = input = getLangDefinition().preparse(input); + } - /** - * Overrides the highlight color shown when the user taps a link or a JavaScript - * clickable element in Safari on iPhone. This property obeys the alpha value, if specified. - * - * If you don't specify an alpha value, Safari on iPhone applies a default alpha value - * to the color. To disable tap highlighting, set the alpha value to 0 (invisible). - * If you set the alpha value to 1.0 (opaque), the element is not visible when tapped. - * @property defaults.behavior.tapHighlightColor - * @type {String} - * @default 'rgba(0,0,0,0)' - */ - tapHighlightColor: 'rgba(0,0,0,0)' + if (moment.isMoment(input)) { + config = cloneMoment(input); + + config._d = new Date(+input._d); + } else if (format) { + if (isArray(format)) { + makeDateFromStringAndArray(config); + } else { + makeDateFromStringAndFormat(config); + } + } else { + makeDateFromInput(config); + } + + return new Moment(config); } - }; - /** - * hammer document where the base events are added at - * @property DOCUMENT - * @type {HTMLElement} - * @default window.document - */ - Hammer.DOCUMENT = document; + moment = function (input, format, lang, strict) { + var c; - /** - * detect support for pointer events - * @property HAS_POINTEREVENTS - * @type {Boolean} - */ - Hammer.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled; + if (typeof(lang) === "boolean") { + strict = lang; + lang = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._i = input; + c._f = format; + c._l = lang; + c._strict = strict; + c._isUTC = false; + c._pf = defaultParsingFlags(); - /** - * detect support for touch events - * @property HAS_TOUCHEVENTS - * @type {Boolean} - */ - Hammer.HAS_TOUCHEVENTS = ('ontouchstart' in window); + return makeMoment(c); + }; - /** - * detect mobile browsers - * @property IS_MOBILE - * @type {Boolean} - */ - Hammer.IS_MOBILE = /mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent); + moment.suppressDeprecationWarnings = false; - /** - * detect if we want to support mouseevents at all - * @property NO_MOUSEEVENTS - * @type {Boolean} - */ - Hammer.NO_MOUSEEVENTS = (Hammer.HAS_TOUCHEVENTS && Hammer.IS_MOBILE) || Hammer.HAS_POINTEREVENTS; + moment.createFromInputFallback = deprecate( + "moment construction falls back to js Date. This is " + + "discouraged and will be removed in upcoming major " + + "release. Please refer to " + + "https://github.com/moment/moment/issues/1407 for more info.", + function (config) { + config._d = new Date(config._i); + }); - /** - * interval in which Hammer recalculates current velocity/direction/angle in ms - * @property CALCULATE_INTERVAL - * @type {Number} - * @default 25 - */ - Hammer.CALCULATE_INTERVAL = 25; + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return moment(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } - /** - * eventtypes per touchevent (start, move, end) are filled by `Event.determineEventTypes` on `setup` - * the object contains the DOM event names per type (`EVENT_START`, `EVENT_MOVE`, `EVENT_END`) - * @property EVENT_TYPES - * @private - * @writeOnce - * @type {Object} - */ - var EVENT_TYPES = {}; + moment.min = function () { + var args = [].slice.call(arguments, 0); - /** - * direction strings, for safe comparisons - * @property DIRECTION_DOWN|LEFT|UP|RIGHT - * @final - * @type {String} - * @default 'down' 'left' 'up' 'right' - */ - var DIRECTION_DOWN = Hammer.DIRECTION_DOWN = 'down'; - var DIRECTION_LEFT = Hammer.DIRECTION_LEFT = 'left'; - var DIRECTION_UP = Hammer.DIRECTION_UP = 'up'; - var DIRECTION_RIGHT = Hammer.DIRECTION_RIGHT = 'right'; + return pickBy('isBefore', args); + }; - /** - * pointertype strings, for safe comparisons - * @property POINTER_MOUSE|TOUCH|PEN - * @final - * @type {String} - * @default 'mouse' 'touch' 'pen' - */ - var POINTER_MOUSE = Hammer.POINTER_MOUSE = 'mouse'; - var POINTER_TOUCH = Hammer.POINTER_TOUCH = 'touch'; - var POINTER_PEN = Hammer.POINTER_PEN = 'pen'; + moment.max = function () { + var args = [].slice.call(arguments, 0); - /** - * eventtypes - * @property EVENT_START|MOVE|END|RELEASE|TOUCH - * @final - * @type {String} - * @default 'start' 'change' 'move' 'end' 'release' 'touch' - */ - var EVENT_START = Hammer.EVENT_START = 'start'; - var EVENT_MOVE = Hammer.EVENT_MOVE = 'move'; - var EVENT_END = Hammer.EVENT_END = 'end'; - var EVENT_RELEASE = Hammer.EVENT_RELEASE = 'release'; - var EVENT_TOUCH = Hammer.EVENT_TOUCH = 'touch'; + return pickBy('isAfter', args); + }; - /** - * if the window events are set... - * @property READY - * @writeOnce - * @type {Boolean} - * @default false - */ - Hammer.READY = false; + // creating with utc + moment.utc = function (input, format, lang, strict) { + var c; - /** - * plugins namespace - * @property plugins - * @type {Object} - */ - Hammer.plugins = Hammer.plugins || {}; + if (typeof(lang) === "boolean") { + strict = lang; + lang = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._useUTC = true; + c._isUTC = true; + c._l = lang; + c._i = input; + c._f = format; + c._strict = strict; + c._pf = defaultParsingFlags(); - /** - * gestures namespace - * see `/gestures` for the definitions - * @property gestures - * @type {Object} - */ - Hammer.gestures = Hammer.gestures || {}; + return makeMoment(c).utc(); + }; + + // creating with unix timestamp (in seconds) + moment.unix = function (input) { + return moment(input * 1000); + }; + + // duration + moment.duration = function (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + parseIso; + + if (moment.isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { + sign = (match[1] === "-") ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoDurationRegex.exec(input))) { + sign = (match[1] === "-") ? -1 : 1; + parseIso = function (inp) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + }; + duration = { + y: parseIso(match[2]), + M: parseIso(match[3]), + d: parseIso(match[4]), + h: parseIso(match[5]), + m: parseIso(match[6]), + s: parseIso(match[7]), + w: parseIso(match[8]) + }; + } - /** - * setup events to detect gestures on the document - * this function is called when creating an new instance - * @private - */ - function setup() { - if(Hammer.READY) { - return; - } + ret = new Duration(duration); - // find what eventtypes we add listeners to - Event.determineEventTypes(); + if (moment.isDuration(input) && input.hasOwnProperty('_lang')) { + ret._lang = input._lang; + } - // Register all gestures inside Hammer.gestures - Utils.each(Hammer.gestures, function(gesture) { - Detection.register(gesture); - }); + return ret; + }; - // Add touch events on the document - Event.onTouch(Hammer.DOCUMENT, EVENT_MOVE, Detection.detect); - Event.onTouch(Hammer.DOCUMENT, EVENT_END, Detection.detect); + // version number + moment.version = VERSION; - // Hammer is ready...! - Hammer.READY = true; - } + // default format + moment.defaultFormat = isoFormat; - /** - * @module hammer - * - * @class Utils - * @static - */ - var Utils = Hammer.utils = { - /** - * extend method, could also be used for cloning when `dest` is an empty object. - * changes the dest object - * @method extend - * @param {Object} dest - * @param {Object} src - * @param {Boolean} [merge=false] do a merge - * @return {Object} dest - */ - extend: function extend(dest, src, merge) { - for(var key in src) { - if(!src.hasOwnProperty(key) || (dest[key] !== undefined && merge)) { - continue; - } - dest[key] = src[key]; - } - return dest; - }, + // constant that refers to the ISO standard + moment.ISO_8601 = function () {}; - /** - * simple addEventListener wrapper - * @method on - * @param {HTMLElement} element - * @param {String} type - * @param {Function} handler - */ - on: function on(element, type, handler) { - element.addEventListener(type, handler, false); - }, + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + moment.momentProperties = momentProperties; - /** - * simple removeEventListener wrapper - * @method off - * @param {HTMLElement} element - * @param {String} type - * @param {Function} handler - */ - off: function off(element, type, handler) { - element.removeEventListener(type, handler, false); - }, + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + moment.updateOffset = function () {}; - /** - * forEach over arrays and objects - * @method each - * @param {Object|Array} obj - * @param {Function} iterator - * @param {any} iterator.item - * @param {Number} iterator.index - * @param {Object|Array} iterator.obj the source object - * @param {Object} context value to use as `this` in the iterator - */ - each: function each(obj, iterator, context) { - var i, len; + // This function allows you to set a threshold for relative time strings + moment.relativeTimeThreshold = function(threshold, limit) { + if (relativeTimeThresholds[threshold] === undefined) { + return false; + } + relativeTimeThresholds[threshold] = limit; + return true; + }; - // native forEach on arrays - if('forEach' in obj) { - obj.forEach(iterator, context); - // arrays - } else if(obj.length !== undefined) { - for(i = 0, len = obj.length; i < len; i++) { - if(iterator.call(context, obj[i], i, obj) === false) { - return; - } - } - // objects - } else { - for(i in obj) { - if(obj.hasOwnProperty(i) && - iterator.call(context, obj[i], i, obj) === false) { - return; - } - } + // This function will load languages and then set the global language. If + // no arguments are passed in, it will simply return the current global + // language key. + moment.lang = function (key, values) { + var r; + if (!key) { + return moment.fn._lang._abbr; } - }, - - /** - * find if a string contains the string using indexOf - * @method inStr - * @param {String} src - * @param {String} find - * @return {Boolean} found - */ - inStr: function inStr(src, find) { - return src.indexOf(find) > -1; - }, + if (values) { + loadLang(normalizeLanguage(key), values); + } else if (values === null) { + unloadLang(key); + key = 'en'; + } else if (!languages[key]) { + getLangDefinition(key); + } + r = moment.duration.fn._lang = moment.fn._lang = getLangDefinition(key); + return r._abbr; + }; - /** - * find if a array contains the object using indexOf or a simple polyfill - * @method inArray - * @param {String} src - * @param {String} find - * @return {Boolean|Number} false when not found, or the index - */ - inArray: function inArray(src, find) { - if(src.indexOf) { - var index = src.indexOf(find); - return (index === -1) ? false : index; - } else { - for(var i = 0, len = src.length; i < len; i++) { - if(src[i] === find) { - return i; - } - } - return false; + // returns language data + moment.langData = function (key) { + if (key && key._lang && key._lang._abbr) { + key = key._lang._abbr; } - }, + return getLangDefinition(key); + }; - /** - * convert an array-like object (`arguments`, `touchlist`) to an array - * @method toArray - * @param {Object} obj - * @return {Array} - */ - toArray: function toArray(obj) { - return Array.prototype.slice.call(obj, 0); - }, + // compare moment object + moment.isMoment = function (obj) { + return obj instanceof Moment || + (obj != null && obj.hasOwnProperty('_isAMomentObject')); + }; - /** - * find if a node is in the given parent - * @method hasParent - * @param {HTMLElement} node - * @param {HTMLElement} parent - * @return {Boolean} found - */ - hasParent: function hasParent(node, parent) { - while(node) { - if(node == parent) { - return true; - } - node = node.parentNode; - } - return false; - }, + // for typechecking Duration objects + moment.isDuration = function (obj) { + return obj instanceof Duration; + }; - /** - * get the center of all the touches - * @method getCenter - * @param {Array} touches - * @return {Object} center contains `pageX`, `pageY`, `clientX` and `clientY` properties - */ - getCenter: function getCenter(touches) { - var pageX = [], - pageY = [], - clientX = [], - clientY = [], - min = Math.min, - max = Math.max; + for (i = lists.length - 1; i >= 0; --i) { + makeList(lists[i]); + } - // no need to loop when only one touch - if(touches.length === 1) { - return { - pageX: touches[0].pageX, - pageY: touches[0].pageY, - clientX: touches[0].clientX, - clientY: touches[0].clientY - }; + moment.normalizeUnits = function (units) { + return normalizeUnits(units); + }; + + moment.invalid = function (flags) { + var m = moment.utc(NaN); + if (flags != null) { + extend(m._pf, flags); + } + else { + m._pf.userInvalidated = true; } - Utils.each(touches, function(touch) { - pageX.push(touch.pageX); - pageY.push(touch.pageY); - clientX.push(touch.clientX); - clientY.push(touch.clientY); - }); + return m; + }; - return { - pageX: (min.apply(Math, pageX) + max.apply(Math, pageX)) / 2, - pageY: (min.apply(Math, pageY) + max.apply(Math, pageY)) / 2, - clientX: (min.apply(Math, clientX) + max.apply(Math, clientX)) / 2, - clientY: (min.apply(Math, clientY) + max.apply(Math, clientY)) / 2 - }; - }, + moment.parseZone = function () { + return moment.apply(null, arguments).parseZone(); + }; - /** - * calculate the velocity between two points. unit is in px per ms. - * @method getVelocity - * @param {Number} deltaTime - * @param {Number} deltaX - * @param {Number} deltaY - * @return {Object} velocity `x` and `y` - */ - getVelocity: function getVelocity(deltaTime, deltaX, deltaY) { - return { - x: Math.abs(deltaX / deltaTime) || 0, - y: Math.abs(deltaY / deltaTime) || 0 - }; - }, + moment.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; - /** - * calculate the angle between two coordinates - * @method getAngle - * @param {Touch} touch1 - * @param {Touch} touch2 - * @return {Number} angle - */ - getAngle: function getAngle(touch1, touch2) { - var x = touch2.clientX - touch1.clientX, - y = touch2.clientY - touch1.clientY; + /************************************ + Moment Prototype + ************************************/ - return Math.atan2(y, x) * 180 / Math.PI; - }, - /** - * do a small comparision to get the direction between two touches. - * @method getDirection - * @param {Touch} touch1 - * @param {Touch} touch2 - * @return {String} direction matches `DIRECTION_LEFT|RIGHT|UP|DOWN` - */ - getDirection: function getDirection(touch1, touch2) { - var x = Math.abs(touch1.clientX - touch2.clientX), - y = Math.abs(touch1.clientY - touch2.clientY); + extend(moment.fn = Moment.prototype, { - if(x >= y) { - return touch1.clientX - touch2.clientX > 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; - } - return touch1.clientY - touch2.clientY > 0 ? DIRECTION_UP : DIRECTION_DOWN; - }, + clone : function () { + return moment(this); + }, - /** - * calculate the distance between two touches - * @method getDistance - * @param {Touch}touch1 - * @param {Touch} touch2 - * @return {Number} distance - */ - getDistance: function getDistance(touch1, touch2) { - var x = touch2.clientX - touch1.clientX, - y = touch2.clientY - touch1.clientY; + valueOf : function () { + return +this._d + ((this._offset || 0) * 60000); + }, - return Math.sqrt((x * x) + (y * y)); - }, + unix : function () { + return Math.floor(+this / 1000); + }, - /** - * calculate the scale factor between two touchLists - * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out - * @method getScale - * @param {Array} start array of touches - * @param {Array} end array of touches - * @return {Number} scale - */ - getScale: function getScale(start, end) { - // need two fingers... - if(start.length >= 2 && end.length >= 2) { - return this.getDistance(end[0], end[1]) / this.getDistance(start[0], start[1]); - } - return 1; - }, + toString : function () { + return this.clone().lang('en').format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ"); + }, - /** - * calculate the rotation degrees between two touchLists - * @method getRotation - * @param {Array} start array of touches - * @param {Array} end array of touches - * @return {Number} rotation - */ - getRotation: function getRotation(start, end) { - // need two fingers - if(start.length >= 2 && end.length >= 2) { - return this.getAngle(end[1], end[0]) - this.getAngle(start[1], start[0]); - } - return 0; - }, + toDate : function () { + return this._offset ? new Date(+this) : this._d; + }, - /** - * find out if the direction is vertical * - * @method isVertical - * @param {String} direction matches `DIRECTION_UP|DOWN` - * @return {Boolean} is_vertical - */ - isVertical: function isVertical(direction) { - return direction == DIRECTION_UP || direction == DIRECTION_DOWN; - }, + toISOString : function () { + var m = moment(this).utc(); + if (0 < m.year() && m.year() <= 9999) { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + }, - /** - * set css properties with their prefixes - * @param {HTMLElement} element - * @param {String} prop - * @param {String} value - * @param {Boolean} [toggle=true] - * @return {Boolean} - */ - setPrefixedCss: function setPrefixedCss(element, prop, value, toggle) { - var prefixes = ['', 'Webkit', 'Moz', 'O', 'ms']; - prop = Utils.toCamelCase(prop); + toArray : function () { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hours(), + m.minutes(), + m.seconds(), + m.milliseconds() + ]; + }, - for(var i = 0; i < prefixes.length; i++) { - var p = prop; - // prefixes - if(prefixes[i]) { - p = prefixes[i] + p.slice(0, 1).toUpperCase() + p.slice(1); - } + isValid : function () { + return isValid(this); + }, - // test the style - if(p in element.style) { - element.style[p] = (toggle == null || toggle) && value || ''; - break; + isDSTShifted : function () { + + if (this._a) { + return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; } - } - }, - /** - * toggle browser default behavior by setting css properties. - * `userSelect='none'` also sets `element.onselectstart` to false - * `userDrag='none'` also sets `element.ondragstart` to false - * - * @method toggleBehavior - * @param {HtmlElement} element - * @param {Object} props - * @param {Boolean} [toggle=true] - */ - toggleBehavior: function toggleBehavior(element, props, toggle) { - if(!props || !element || !element.style) { - return; - } + return false; + }, - // set the css properties - Utils.each(props, function(value, prop) { - Utils.setPrefixedCss(element, prop, value, toggle); - }); + parsingFlags : function () { + return extend({}, this._pf); + }, - var falseFn = toggle && function() { - return false; - }; + invalidAt: function () { + return this._pf.overflow; + }, + + utc : function () { + return this.zone(0); + }, + + local : function () { + this.zone(0); + this._isUTC = false; + return this; + }, + + format : function (inputString) { + var output = formatMoment(this, inputString || moment.defaultFormat); + return this.lang().postformat(output); + }, + + add : function (input, val) { + var dur; + // switch args to support add('s', 1) and add(1, 's') + if (typeof input === 'string' && typeof val === 'string') { + dur = moment.duration(isNaN(+val) ? +input : +val, isNaN(+val) ? val : input); + } else if (typeof input === 'string') { + dur = moment.duration(+val, input); + } else { + dur = moment.duration(input, val); + } + addOrSubtractDurationFromMoment(this, dur, 1); + return this; + }, - // also the disable onselectstart - if(props.userSelect == 'none') { - element.onselectstart = falseFn; - } - // and disable ondragstart - if(props.userDrag == 'none') { - element.ondragstart = falseFn; - } - }, + subtract : function (input, val) { + var dur; + // switch args to support subtract('s', 1) and subtract(1, 's') + if (typeof input === 'string' && typeof val === 'string') { + dur = moment.duration(isNaN(+val) ? +input : +val, isNaN(+val) ? val : input); + } else if (typeof input === 'string') { + dur = moment.duration(+val, input); + } else { + dur = moment.duration(input, val); + } + addOrSubtractDurationFromMoment(this, dur, -1); + return this; + }, - /** - * convert a string with underscores to camelCase - * so prevent_default becomes preventDefault - * @param {String} str - * @return {String} camelCaseStr - */ - toCamelCase: function toCamelCase(str) { - return str.replace(/[_-]([a-z])/g, function(s) { - return s[1].toUpperCase(); - }); - } - }; + diff : function (input, units, asFloat) { + var that = makeAs(input, this), + zoneDiff = (this.zone() - that.zone()) * 6e4, + diff, output; + units = normalizeUnits(units); - /** - * @module hammer - */ - /** - * @class Event - * @static - */ - var Event = Hammer.event = { - /** - * when touch events have been fired, this is true - * this is used to stop mouse events - * @property prevent_mouseevents - * @private - * @type {Boolean} - */ - preventMouseEvents: false, + if (units === 'year' || units === 'month') { + // average number of days in the months in the given dates + diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2 + // difference in months + output = ((this.year() - that.year()) * 12) + (this.month() - that.month()); + // adjust by taking difference in days, average number of days + // and dst in the given months. + output += ((this - moment(this).startOf('month')) - + (that - moment(that).startOf('month'))) / diff; + // same as above but with zones, to negate all dst + output -= ((this.zone() - moment(this).startOf('month').zone()) - + (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff; + if (units === 'year') { + output = output / 12; + } + } else { + diff = (this - that); + output = units === 'second' ? diff / 1e3 : // 1000 + units === 'minute' ? diff / 6e4 : // 1000 * 60 + units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + diff; + } + return asFloat ? output : absRound(output); + }, - /** - * if EVENT_START has been fired - * @property started - * @private - * @type {Boolean} - */ - started: false, + from : function (time, withoutSuffix) { + return moment.duration(this.diff(time)).lang(this.lang()._abbr).humanize(!withoutSuffix); + }, - /** - * when the mouse is hold down, this is true - * @property should_detect - * @private - * @type {Boolean} - */ - shouldDetect: false, + fromNow : function (withoutSuffix) { + return this.from(moment(), withoutSuffix); + }, - /** - * simple event binder with a hook and support for multiple types - * @method on - * @param {HTMLElement} element - * @param {String} type - * @param {Function} handler - * @param {Function} [hook] - * @param {Object} hook.type - */ - on: function on(element, type, handler, hook) { - var types = type.split(' '); - Utils.each(types, function(type) { - Utils.on(element, type, handler); - hook && hook(type); - }); - }, + calendar : function (time) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're zone'd or not. + var now = time || moment(), + sod = makeAs(now, this).startOf('day'), + diff = this.diff(sod, 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.lang().calendar(format, this)); + }, - /** - * simple event unbinder with a hook and support for multiple types - * @method off - * @param {HTMLElement} element - * @param {String} type - * @param {Function} handler - * @param {Function} [hook] - * @param {Object} hook.type - */ - off: function off(element, type, handler, hook) { - var types = type.split(' '); - Utils.each(types, function(type) { - Utils.off(element, type, handler); - hook && hook(type); - }); - }, + isLeapYear : function () { + return isLeapYear(this.year()); + }, - /** - * the core touch event handler. - * this finds out if we should to detect gestures - * @method onTouch - * @param {HTMLElement} element - * @param {String} eventType matches `EVENT_START|MOVE|END` - * @param {Function} handler - * @return onTouchHandler {Function} the core event handler - */ - onTouch: function onTouch(element, eventType, handler) { - var self = this; + isDST : function () { + return (this.zone() < this.clone().month(0).zone() || + this.zone() < this.clone().month(5).zone()); + }, - var onTouchHandler = function onTouchHandler(ev) { - var srcType = ev.type.toLowerCase(), - isPointer = Hammer.HAS_POINTEREVENTS, - isMouse = Utils.inStr(srcType, 'mouse'), - triggerType; + day : function (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.lang()); + return this.add({ d : input - day }); + } else { + return day; + } + }, - // if we are in a mouseevent, but there has been a touchevent triggered in this session - // we want to do nothing. simply break out of the event. - if(isMouse && self.preventMouseEvents) { - return; + month : makeAccessor('Month', true), - // mousebutton must be down - } else if(isMouse && eventType == EVENT_START && ev.button === 0) { - self.preventMouseEvents = false; - self.shouldDetect = true; - } else if(isPointer && eventType == EVENT_START) { - self.shouldDetect = (ev.buttons === 1 || PointerEvent.matchType(POINTER_TOUCH, ev)); - // just a valid start event, but no mouse - } else if(!isMouse && eventType == EVENT_START) { - self.preventMouseEvents = true; - self.shouldDetect = true; + startOf: function (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + /* falls through */ } - // update the pointer event before entering the detection - if(isPointer && eventType != EVENT_END) { - PointerEvent.updatePointer(eventType, ev); + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } else if (units === 'isoWeek') { + this.isoWeekday(1); } - // we are in a touch/down state, so allowed detection of gestures - if(self.shouldDetect) { - triggerType = self.doDetect.call(self, ev, eventType, element, handler); + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); } - // ...and we are done with the detection - // so reset everything to start each detection totally fresh - if(triggerType == EVENT_END) { - self.preventMouseEvents = false; - self.shouldDetect = false; - PointerEvent.reset(); - // update the pointerevent object after the detection - } + return this; + }, + + endOf: function (units) { + units = normalizeUnits(units); + return this.startOf(units).add((units === 'isoWeek' ? 'week' : units), 1).subtract('ms', 1); + }, + + isAfter: function (input, units) { + units = typeof units !== 'undefined' ? units : 'millisecond'; + return +this.clone().startOf(units) > +moment(input).startOf(units); + }, - if(isPointer && eventType == EVENT_END) { - PointerEvent.updatePointer(eventType, ev); - } - }; + isBefore: function (input, units) { + units = typeof units !== 'undefined' ? units : 'millisecond'; + return +this.clone().startOf(units) < +moment(input).startOf(units); + }, - this.on(element, EVENT_TYPES[eventType], onTouchHandler); - return onTouchHandler; - }, + isSame: function (input, units) { + units = units || 'ms'; + return +this.clone().startOf(units) === +makeAs(input, this).startOf(units); + }, - /** - * the core detection method - * this finds out what hammer-touch-events to trigger - * @method doDetect - * @param {Object} ev - * @param {String} eventType matches `EVENT_START|MOVE|END` - * @param {HTMLElement} element - * @param {Function} handler - * @return {String} triggerType matches `EVENT_START|MOVE|END` - */ - doDetect: function doDetect(ev, eventType, element, handler) { - var touchList = this.getTouchList(ev, eventType); - var touchListLength = touchList.length; - var triggerType = eventType; - var triggerChange = touchList.trigger; // used by fakeMultitouch plugin - var changedLength = touchListLength; + min: deprecate( + "moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548", + function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + } + ), - // at each touchstart-like event we want also want to trigger a TOUCH event... - if(eventType == EVENT_START) { - triggerChange = EVENT_TOUCH; - // ...the same for a touchend-like event - } else if(eventType == EVENT_END) { - triggerChange = EVENT_RELEASE; + max: deprecate( + "moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548", + function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + } + ), - // keep track of how many touches have been removed - changedLength = touchList.length - ((ev.changedTouches) ? ev.changedTouches.length : 1); - } + // keepTime = true means only change the timezone, without affecting + // the local hour. So 5:31:26 +0300 --[zone(2, true)]--> 5:31:26 +0200 + // It is possible that 5:31:26 doesn't exist int zone +0200, so we + // adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + zone : function (input, keepTime) { + var offset = this._offset || 0; + if (input != null) { + if (typeof input === "string") { + input = timezoneMinutesFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + this._offset = input; + this._isUTC = true; + if (offset !== input) { + if (!keepTime || this._changeInProgress) { + addOrSubtractDurationFromMoment(this, + moment.duration(offset - input, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + moment.updateOffset(this, true); + this._changeInProgress = null; + } + } + } else { + return this._isUTC ? offset : this._d.getTimezoneOffset(); + } + return this; + }, - // after there are still touches on the screen, - // we just want to trigger a MOVE event. so change the START or END to a MOVE - // but only after detection has been started, the first time we actualy want a START - if(changedLength > 0 && this.started) { - triggerType = EVENT_MOVE; - } + zoneAbbr : function () { + return this._isUTC ? "UTC" : ""; + }, - // detection has been started, we keep track of this, see above - this.started = true; + zoneName : function () { + return this._isUTC ? "Coordinated Universal Time" : ""; + }, - // generate some event data, some basic information - var evData = this.collectEventData(element, triggerType, touchList, ev); + parseZone : function () { + if (this._tzm) { + this.zone(this._tzm); + } else if (typeof this._i === 'string') { + this.zone(this._i); + } + return this; + }, - // trigger the triggerType event before the change (TOUCH, RELEASE) events - // but the END event should be at last - if(eventType != EVENT_END) { - handler.call(Detection, evData); - } + hasAlignedHourOffset : function (input) { + if (!input) { + input = 0; + } + else { + input = moment(input).zone(); + } - // trigger a change (TOUCH, RELEASE) event, this means the length of the touches changed - if(triggerChange) { - evData.changedLength = changedLength; - evData.eventType = triggerChange; + return (this.zone() - input) % 60 === 0; + }, - handler.call(Detection, evData); + daysInMonth : function () { + return daysInMonth(this.year(), this.month()); + }, - evData.eventType = triggerType; - delete evData.changedLength; - } + dayOfYear : function (input) { + var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add("d", (input - dayOfYear)); + }, - // trigger the END event - if(triggerType == EVENT_END) { - handler.call(Detection, evData); + quarter : function (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + }, - // ...and we are done with the detection - // so reset everything to start each detection totally fresh - this.started = false; - } + weekYear : function (input) { + var year = weekOfYear(this, this.lang()._week.dow, this.lang()._week.doy).year; + return input == null ? year : this.add("y", (input - year)); + }, - return triggerType; - }, + isoWeekYear : function (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add("y", (input - year)); + }, - /** - * we have different events for each device/browser - * determine what we need and set them in the EVENT_TYPES constant - * the `onTouch` method is bind to these properties. - * @method determineEventTypes - * @return {Object} events - */ - determineEventTypes: function determineEventTypes() { - var types; - if(Hammer.HAS_POINTEREVENTS) { - if(window.PointerEvent) { - types = [ - 'pointerdown', - 'pointermove', - 'pointerup pointercancel lostpointercapture' - ]; - } else { - types = [ - 'MSPointerDown', - 'MSPointerMove', - 'MSPointerUp MSPointerCancel MSLostPointerCapture' - ]; - } - } else if(Hammer.NO_MOUSEEVENTS) { - types = [ - 'touchstart', - 'touchmove', - 'touchend touchcancel' - ]; - } else { - types = [ - 'touchstart mousedown', - 'touchmove mousemove', - 'touchend touchcancel mouseup' - ]; - } + week : function (input) { + var week = this.lang().week(this); + return input == null ? week : this.add("d", (input - week) * 7); + }, - EVENT_TYPES[EVENT_START] = types[0]; - EVENT_TYPES[EVENT_MOVE] = types[1]; - EVENT_TYPES[EVENT_END] = types[2]; - return EVENT_TYPES; - }, + isoWeek : function (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add("d", (input - week) * 7); + }, - /** - * create touchList depending on the event - * @method getTouchList - * @param {Object} ev - * @param {String} eventType - * @return {Array} touches - */ - getTouchList: function getTouchList(ev, eventType) { - // get the fake pointerEvent touchlist - if(Hammer.HAS_POINTEREVENTS) { - return PointerEvent.getTouchList(); - } + weekday : function (input) { + var weekday = (this.day() + 7 - this.lang()._week.dow) % 7; + return input == null ? weekday : this.add("d", input - weekday); + }, - // get the touchlist - if(ev.touches) { - if(eventType == EVENT_MOVE) { - return ev.touches; - } + isoWeekday : function (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + }, - var identifiers = []; - var concat = [].concat(Utils.toArray(ev.touches), Utils.toArray(ev.changedTouches)); - var touchList = []; + isoWeeksInYear : function () { + return weeksInYear(this.year(), 1, 4); + }, + + weeksInYear : function () { + var weekInfo = this._lang._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units](); + }, - Utils.each(concat, function(touch) { - if(Utils.inArray(identifiers, touch.identifier) === false) { - touchList.push(touch); - } - identifiers.push(touch.identifier); - }); + set : function (units, value) { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + this[units](value); + } + return this; + }, - return touchList; + // If passed a language key, it will set the language for this + // instance. Otherwise, it will return the language configuration + // variables for this instance. + lang : function (key) { + if (key === undefined) { + return this._lang; + } else { + this._lang = getLangDefinition(key); + return this; + } } + }); - // make fake touchList from mouse position - ev.identifier = 1; - return [ev]; - }, + function rawMonthSetter(mom, value) { + var dayOfMonth; - /** - * collect basic event data - * @method collectEventData - * @param {HTMLElement} element - * @param {String} eventType matches `EVENT_START|MOVE|END` - * @param {Array} touches - * @param {Object} ev - * @return {Object} ev - */ - collectEventData: function collectEventData(element, eventType, touches, ev) { - // find out pointerType - var pointerType = POINTER_TOUCH; - if(Utils.inStr(ev.type, 'mouse') || PointerEvent.matchType(POINTER_MOUSE, ev)) { - pointerType = POINTER_MOUSE; - } else if(PointerEvent.matchType(POINTER_PEN, ev)) { - pointerType = POINTER_PEN; + // TODO: Move this out of here! + if (typeof value === 'string') { + value = mom.lang().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } } - return { - center: Utils.getCenter(touches), - timeStamp: Date.now(), - target: ev.target, - touches: touches, - eventType: eventType, - pointerType: pointerType, - srcEvent: ev, + dayOfMonth = Math.min(mom.date(), + daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } - /** - * prevent the browser default actions - * mostly used to disable scrolling of the browser - */ - preventDefault: function() { - var srcEvent = this.srcEvent; - srcEvent.preventManipulation && srcEvent.preventManipulation(); - srcEvent.preventDefault && srcEvent.preventDefault(); - }, + function rawGetter(mom, unit) { + return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + } - /** - * stop bubbling the event up to its parents - */ - stopPropagation: function() { - this.srcEvent.stopPropagation(); - }, + function rawSetter(mom, unit, value) { + if (unit === 'Month') { + return rawMonthSetter(mom, value); + } else { + return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } - /** - * immediately stop gesture detection - * might be useful after a swipe was detected - * @return {*} - */ - stopDetect: function() { - return Detection.stopDetect(); + function makeAccessor(unit, keepTime) { + return function (value) { + if (value != null) { + rawSetter(this, unit, value); + moment.updateOffset(this, keepTime); + return this; + } else { + return rawGetter(this, unit); } }; } - }; - - - /** - * @module hammer - * - * @class PointerEvent - * @static - */ - var PointerEvent = Hammer.PointerEvent = { - /** - * holds all pointers, by `identifier` - * @property pointers - * @type {Object} - */ - pointers: {}, - - /** - * get the pointers as an array - * @method getTouchList - * @return {Array} touchlist - */ - getTouchList: function getTouchList() { - var touchlist = []; - // we can use forEach since pointerEvents only is in IE10 - Utils.each(this.pointers, function(pointer) { - touchlist.push(pointer); - }); - return touchlist; - }, - - /** - * update the position of a pointer - * @method updatePointer - * @param {String} eventType matches `EVENT_START|MOVE|END` - * @param {Object} pointerEvent - */ - updatePointer: function updatePointer(eventType, pointerEvent) { - if(eventType == EVENT_END || (eventType != EVENT_END && pointerEvent.buttons !== 1)) { - delete this.pointers[pointerEvent.pointerId]; - } else { - pointerEvent.identifier = pointerEvent.pointerId; - this.pointers[pointerEvent.pointerId] = pointerEvent; - } - }, - /** - * check if ev matches pointertype - * @method matchType - * @param {String} pointerType matches `POINTER_MOUSE|TOUCH|PEN` - * @param {PointerEvent} ev - */ - matchType: function matchType(pointerType, ev) { - if(!ev.pointerType) { - return false; - } + moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); + moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); + moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); + // Setting the hour should keep the time, because the user explicitly + // specified which hour he wants. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); + // moment.fn.month is defined separately + moment.fn.date = makeAccessor('Date', true); + moment.fn.dates = deprecate("dates accessor is deprecated. Use date instead.", makeAccessor('Date', true)); + moment.fn.year = makeAccessor('FullYear', true); + moment.fn.years = deprecate("years accessor is deprecated. Use year instead.", makeAccessor('FullYear', true)); - var pt = ev.pointerType, - types = {}; + // add plural methods + moment.fn.days = moment.fn.day; + moment.fn.months = moment.fn.month; + moment.fn.weeks = moment.fn.week; + moment.fn.isoWeeks = moment.fn.isoWeek; + moment.fn.quarters = moment.fn.quarter; - types[POINTER_MOUSE] = (pt === (ev.MSPOINTER_TYPE_MOUSE || POINTER_MOUSE)); - types[POINTER_TOUCH] = (pt === (ev.MSPOINTER_TYPE_TOUCH || POINTER_TOUCH)); - types[POINTER_PEN] = (pt === (ev.MSPOINTER_TYPE_PEN || POINTER_PEN)); - return types[pointerType]; - }, + // add aliased format methods + moment.fn.toJSON = moment.fn.toISOString; - /** - * reset the stored pointers - * @method reset - */ - reset: function resetList() { - this.pointers = {}; - } - }; + /************************************ + Duration Prototype + ************************************/ - /** - * @module hammer - * - * @class Detection - * @static - */ - var Detection = Hammer.detection = { - // contains all registred Hammer.gestures in the correct order - gestures: [], + extend(moment.duration.fn = Duration.prototype, { - // data of the current Hammer.gesture detection session - current: null, + _bubble : function () { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, minutes, hours, years; - // the previous Hammer.gesture session data - // is a full clone of the previous gesture.current object - previous: null, + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; - // when this becomes true, no gestures are fired - stopped: false, + seconds = absRound(milliseconds / 1000); + data.seconds = seconds % 60; - /** - * start Hammer.gesture detection - * @method startDetect - * @param {Hammer.Instance} inst - * @param {Object} eventData - */ - startDetect: function startDetect(inst, eventData) { - // already busy with a Hammer.gesture detection on an element - if(this.current) { - return; - } + minutes = absRound(seconds / 60); + data.minutes = minutes % 60; - this.stopped = false; + hours = absRound(minutes / 60); + data.hours = hours % 24; - // holds current session - this.current = { - inst: inst, // reference to HammerInstance we're working for - startEvent: Utils.extend({}, eventData), // start eventData for distances, timing etc - lastEvent: false, // last eventData - lastCalcEvent: false, // last eventData for calculations. - futureCalcEvent: false, // last eventData for calculations. - lastCalcData: {}, // last lastCalcData - name: '' // current gesture we're in/detected, can be 'tap', 'hold' etc - }; + days += absRound(hours / 24); + data.days = days % 30; - this.detect(eventData); - }, + months += absRound(days / 30); + data.months = months % 12; - /** - * Hammer.gesture detection - * @method detect - * @param {Object} eventData - * @return {any} - */ - detect: function detect(eventData) { - if(!this.current || this.stopped) { - return; - } + years = absRound(months / 12); + data.years = years; + }, - // extend event data with calculations about scale, distance etc - eventData = this.extendEventData(eventData); + weeks : function () { + return absRound(this.days() / 7); + }, - // hammer instance and instance options - var inst = this.current.inst, - instOptions = inst.options; + valueOf : function () { + return this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6; + }, - // call Hammer.gesture handlers - Utils.each(this.gestures, function triggerGesture(gesture) { - // only when the instance options have enabled this gesture - if(!this.stopped && inst.enabled && instOptions[gesture.name]) { - gesture.handler.call(gesture, eventData, inst); + humanize : function (withSuffix) { + var difference = +this, + output = relativeTime(difference, !withSuffix, this.lang()); + + if (withSuffix) { + output = this.lang().pastFuture(difference, output); } - }, this); - // store as previous event event - if(this.current) { - this.current.lastEvent = eventData; - } + return this.lang().postformat(output); + }, - if(eventData.eventType == EVENT_END) { - this.stopDetect(); - } + add : function (input, val) { + // supports only 2.0-style add(1, 's') or add(moment) + var dur = moment.duration(input, val); - return eventData; - }, + this._milliseconds += dur._milliseconds; + this._days += dur._days; + this._months += dur._months; - /** - * clear the Hammer.gesture vars - * this is called on endDetect, but can also be used when a final Hammer.gesture has been detected - * to stop other Hammer.gestures from being fired - * @method stopDetect - */ - stopDetect: function stopDetect() { - // clone current data to the store as the previous gesture - // used for the double tap gesture, since this is an other gesture detect session - this.previous = Utils.extend({}, this.current); + this._bubble(); - // reset the current - this.current = null; - this.stopped = true; - }, + return this; + }, - /** - * calculate velocity, angle and direction - * @method getVelocityData - * @param {Object} ev - * @param {Object} center - * @param {Number} deltaTime - * @param {Number} deltaX - * @param {Number} deltaY - */ - getCalculatedData: function getCalculatedData(ev, center, deltaTime, deltaX, deltaY) { - var cur = this.current, - recalc = false, - calcEv = cur.lastCalcEvent, - calcData = cur.lastCalcData; + subtract : function (input, val) { + var dur = moment.duration(input, val); - if(calcEv && ev.timeStamp - calcEv.timeStamp > Hammer.CALCULATE_INTERVAL) { - center = calcEv.center; - deltaTime = ev.timeStamp - calcEv.timeStamp; - deltaX = ev.center.clientX - calcEv.center.clientX; - deltaY = ev.center.clientY - calcEv.center.clientY; - recalc = true; - } + this._milliseconds -= dur._milliseconds; + this._days -= dur._days; + this._months -= dur._months; - if(ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) { - cur.futureCalcEvent = ev; - } + this._bubble(); - if(!cur.lastCalcEvent || recalc) { - calcData.velocity = Utils.getVelocity(deltaTime, deltaX, deltaY); - calcData.angle = Utils.getAngle(center, ev.center); - calcData.direction = Utils.getDirection(center, ev.center); + return this; + }, - cur.lastCalcEvent = cur.futureCalcEvent || ev; - cur.futureCalcEvent = ev; - } + get : function (units) { + units = normalizeUnits(units); + return this[units.toLowerCase() + 's'](); + }, - ev.velocityX = calcData.velocity.x; - ev.velocityY = calcData.velocity.y; - ev.interimAngle = calcData.angle; - ev.interimDirection = calcData.direction; - }, + as : function (units) { + units = normalizeUnits(units); + return this['as' + units.charAt(0).toUpperCase() + units.slice(1) + 's'](); + }, - /** - * extend eventData for Hammer.gestures - * @method extendEventData - * @param {Object} ev - * @return {Object} ev - */ - extendEventData: function extendEventData(ev) { - var cur = this.current, - startEv = cur.startEvent, - lastEv = cur.lastEvent || startEv; + lang : moment.fn.lang, - // update the start touchlist to calculate the scale/rotation - if(ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) { - startEv.touches = []; - Utils.each(ev.touches, function(touch) { - startEv.touches.push({ - clientX: touch.clientX, - clientY: touch.clientY - }); - }); + toIsoString : function () { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var years = Math.abs(this.years()), + months = Math.abs(this.months()), + days = Math.abs(this.days()), + hours = Math.abs(this.hours()), + minutes = Math.abs(this.minutes()), + seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + + if (!this.asSeconds()) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + return (this.asSeconds() < 0 ? '-' : '') + + 'P' + + (years ? years + 'Y' : '') + + (months ? months + 'M' : '') + + (days ? days + 'D' : '') + + ((hours || minutes || seconds) ? 'T' : '') + + (hours ? hours + 'H' : '') + + (minutes ? minutes + 'M' : '') + + (seconds ? seconds + 'S' : ''); } + }); - var deltaTime = ev.timeStamp - startEv.timeStamp, - deltaX = ev.center.clientX - startEv.center.clientX, - deltaY = ev.center.clientY - startEv.center.clientY; + function makeDurationGetter(name) { + moment.duration.fn[name] = function () { + return this._data[name]; + }; + } - this.getCalculatedData(ev, lastEv.center, deltaTime, deltaX, deltaY); + function makeDurationAsGetter(name, factor) { + moment.duration.fn['as' + name] = function () { + return +this / factor; + }; + } - Utils.extend(ev, { - startEvent: startEv, + for (i in unitMillisecondFactors) { + if (unitMillisecondFactors.hasOwnProperty(i)) { + makeDurationAsGetter(i, unitMillisecondFactors[i]); + makeDurationGetter(i.toLowerCase()); + } + } - deltaTime: deltaTime, - deltaX: deltaX, - deltaY: deltaY, + makeDurationAsGetter('Weeks', 6048e5); + moment.duration.fn.asMonths = function () { + return (+this - this.years() * 31536e6) / 2592e6 + this.years() * 12; + }; - distance: Utils.getDistance(startEv.center, ev.center), - angle: Utils.getAngle(startEv.center, ev.center), - direction: Utils.getDirection(startEv.center, ev.center), - scale: Utils.getScale(startEv.touches, ev.touches), - rotation: Utils.getRotation(startEv.touches, ev.touches) - }); - return ev; - }, + /************************************ + Default Lang + ************************************/ - /** - * register new gesture - * @method register - * @param {Object} gesture object, see `gestures/` for documentation - * @return {Array} gestures - */ - register: function register(gesture) { - // add an enable gesture options if there is no given - var options = gesture.defaults || {}; - if(options[gesture.name] === undefined) { - options[gesture.name] = true; + + // Set default language, other languages will inherit from English. + moment.lang('en', { + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; } + }); - // extend Hammer default options with the Hammer.gesture options - Utils.extend(Hammer.defaults, options, true); + /* EMBED_LANGUAGES */ - // set its index - gesture.index = gesture.index || 1000; + /************************************ + Exposing Moment + ************************************/ - // add Hammer.gesture to the list - this.gestures.push(gesture); + function makeGlobal(shouldDeprecate) { + /*global ender:false */ + if (typeof ender !== 'undefined') { + return; + } + oldGlobalMoment = globalScope.moment; + if (shouldDeprecate) { + globalScope.moment = deprecate( + "Accessing Moment through the global scope is " + + "deprecated, and will be removed in an upcoming " + + "release.", + moment); + } else { + globalScope.moment = moment; + } + } - // sort the list by index - this.gestures.sort(function(a, b) { - if(a.index < b.index) { - return -1; - } - if(a.index > b.index) { - return 1; + // CommonJS module is defined + if (hasModule) { + module.exports = moment; + } else if (true) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, module) { + if (module.config && module.config() && module.config().noGlobal === true) { + // release the global variable + globalScope.moment = oldGlobalMoment; } - return 0; - }); - return this.gestures; + return moment; + }.call(exports, __webpack_require__, exports, module)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + makeGlobal(true); + } else { + makeGlobal(); } - }; - + }).call(this); + + /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(64)(module))) - /** - * @module hammer - */ +/***/ }, +/* 52 */ +/***/ function(module, exports, __webpack_require__) { /** - * create new hammer instance - * all methods should return the instance itself, so it is chainable. + * Copyright 2012 Craig Campbell * - * @class Instance - * @constructor - * @param {HTMLElement} element - * @param {Object} [options={}] options are merged with `Hammer.defaults` - * @return {Hammer.Instance} + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Mousetrap is a simple keyboard shortcut library for Javascript with + * no external dependencies + * + * @version 1.1.2 + * @url craig.is/killing/mice */ - Hammer.Instance = function(element, options) { - var self = this; - - // setup HammerJS window events and register all gestures - // this also sets up the default options - setup(); - /** - * @property element - * @type {HTMLElement} - */ - this.element = element; + /** + * mapping of special keycodes to their corresponding keys + * + * everything in this dictionary cannot use keypress events + * so it has to be here to map to the correct keycodes for + * keyup/keydown events + * + * @type {Object} + */ + var _MAP = { + 8: 'backspace', + 9: 'tab', + 13: 'enter', + 16: 'shift', + 17: 'ctrl', + 18: 'alt', + 20: 'capslock', + 27: 'esc', + 32: 'space', + 33: 'pageup', + 34: 'pagedown', + 35: 'end', + 36: 'home', + 37: 'left', + 38: 'up', + 39: 'right', + 40: 'down', + 45: 'ins', + 46: 'del', + 91: 'meta', + 93: 'meta', + 224: 'meta' + }, - /** - * @property enabled - * @type {Boolean} - * @protected - */ - this.enabled = true; + /** + * mapping for special characters so they can support + * + * this dictionary is only used incase you want to bind a + * keyup or keydown event to one of these keys + * + * @type {Object} + */ + _KEYCODE_MAP = { + 106: '*', + 107: '+', + 109: '-', + 110: '.', + 111 : '/', + 186: ';', + 187: '=', + 188: ',', + 189: '-', + 190: '.', + 191: '/', + 192: '`', + 219: '[', + 220: '\\', + 221: ']', + 222: '\'' + }, - /** - * options, merged with the defaults - * options with an _ are converted to camelCase - * @property options - * @type {Object} - */ - Utils.each(options, function(value, name) { - delete options[name]; - options[Utils.toCamelCase(name)] = value; - }); + /** + * this is a mapping of keys that require shift on a US keypad + * back to the non shift equivelents + * + * this is so you can use keyup events with these keys + * + * note that this will only work reliably on US keyboards + * + * @type {Object} + */ + _SHIFT_MAP = { + '~': '`', + '!': '1', + '@': '2', + '#': '3', + '$': '4', + '%': '5', + '^': '6', + '&': '7', + '*': '8', + '(': '9', + ')': '0', + '_': '-', + '+': '=', + ':': ';', + '\"': '\'', + '<': ',', + '>': '.', + '?': '/', + '|': '\\' + }, - this.options = Utils.extend(Utils.extend({}, Hammer.defaults), options || {}); + /** + * this is a list of special strings you can use to map + * to modifier keys when you specify your keyboard shortcuts + * + * @type {Object} + */ + _SPECIAL_ALIASES = { + 'option': 'alt', + 'command': 'meta', + 'return': 'enter', + 'escape': 'esc' + }, - // add some css to the element to prevent the browser from doing its native behavoir - if(this.options.behavior) { - Utils.toggleBehavior(this.element, this.options.behavior, true); - } + /** + * variable to store the flipped version of _MAP from above + * needed to check if we should use keypress or not when no action + * is specified + * + * @type {Object|undefined} + */ + _REVERSE_MAP, - /** - * event start handler on the element to start the detection - * @property eventStartHandler - * @type {Object} - */ - this.eventStartHandler = Event.onTouch(element, EVENT_START, function(ev) { - if(self.enabled && ev.eventType == EVENT_START) { - Detection.startDetect(self, ev); - } else if(ev.eventType == EVENT_TOUCH) { - Detection.detect(ev); - } - }); + /** + * a list of all the callbacks setup via Mousetrap.bind() + * + * @type {Object} + */ + _callbacks = {}, - /** - * keep a list of user event handlers which needs to be removed when calling 'dispose' - * @property eventHandlers - * @type {Array} - */ - this.eventHandlers = []; - }; + /** + * direct map of string combinations to callbacks used for trigger() + * + * @type {Object} + */ + _direct_map = {}, - Hammer.Instance.prototype = { - /** - * bind events to the instance - * @method on - * @chainable - * @param {String} gestures multiple gestures by splitting with a space - * @param {Function} handler - * @param {Object} handler.ev event object - */ - on: function onEvent(gestures, handler) { - var self = this; - Event.on(self.element, gestures, handler, function(type) { - self.eventHandlers.push({ gesture: type, handler: handler }); - }); - return self; - }, + /** + * keeps track of what level each sequence is at since multiple + * sequences can start out with the same sequence + * + * @type {Object} + */ + _sequence_levels = {}, - /** - * unbind events to the instance - * @method off - * @chainable - * @param {String} gestures - * @param {Function} handler - */ - off: function offEvent(gestures, handler) { - var self = this; + /** + * variable to store the setTimeout call + * + * @type {null|number} + */ + _reset_timer, - Event.off(self.element, gestures, handler, function(type) { - var index = Utils.inArray({ gesture: type, handler: handler }); - if(index !== false) { - self.eventHandlers.splice(index, 1); - } - }); - return self; - }, + /** + * temporary state where we will ignore the next keyup + * + * @type {boolean|string} + */ + _ignore_next_keyup = false, - /** - * trigger gesture event - * @method trigger - * @chainable - * @param {String} gesture - * @param {Object} [eventData] - */ - trigger: function triggerEvent(gesture, eventData) { - // optional - if(!eventData) { - eventData = {}; - } + /** + * are we currently inside of a sequence? + * type of action ("keyup" or "keydown" or "keypress") or false + * + * @type {boolean|string} + */ + _inside_sequence = false; - // create DOM event - var event = Hammer.DOCUMENT.createEvent('Event'); - event.initEvent(gesture, true, true); - event.gesture = eventData; + /** + * loop through the f keys, f1 to f19 and add them to the map + * programatically + */ + for (var i = 1; i < 20; ++i) { + _MAP[111 + i] = 'f' + i; + } - // trigger on the target if it is in the instance element, - // this is for event delegation tricks - var element = this.element; - if(Utils.hasParent(eventData.target, element)) { - element = eventData.target; - } + /** + * loop through to map numbers on the numeric keypad + */ + for (i = 0; i <= 9; ++i) { + _MAP[i + 96] = i; + } - element.dispatchEvent(event); - return this; - }, + /** + * cross browser add event method + * + * @param {Element|HTMLDocument} object + * @param {string} type + * @param {Function} callback + * @returns void + */ + function _addEvent(object, type, callback) { + if (object.addEventListener) { + return object.addEventListener(type, callback, false); + } - /** - * enable of disable hammer.js detection - * @method enable - * @chainable - * @param {Boolean} state - */ - enable: function enable(state) { - this.enabled = state; - return this; - }, + object.attachEvent('on' + type, callback); + } - /** - * dispose this hammer instance - * @method dispose - * @return {Null} - */ - dispose: function dispose() { - var i, eh; + /** + * takes the event and returns the key character + * + * @param {Event} e + * @return {string} + */ + function _characterFromEvent(e) { - // undo all changes made by stop_browser_behavior - Utils.toggleBehavior(this.element, this.options.behavior, false); + // for keypress events we should return the character as is + if (e.type == 'keypress') { + return String.fromCharCode(e.which); + } - // unbind all custom event handlers - for(i = -1; (eh = this.eventHandlers[++i]);) { - Utils.off(this.element, eh.gesture, eh.handler); - } + // for non keypress events the special maps are needed + if (_MAP[e.which]) { + return _MAP[e.which]; + } - this.eventHandlers = []; + if (_KEYCODE_MAP[e.which]) { + return _KEYCODE_MAP[e.which]; + } - // unbind the start event listener - Event.off(this.element, EVENT_TYPES[EVENT_START], this.eventStartHandler); + // if it is not in the special map + return String.fromCharCode(e.which).toLowerCase(); + } - return null; - } - }; + /** + * should we stop this event before firing off callbacks + * + * @param {Event} e + * @return {boolean} + */ + function _stop(e) { + var element = e.target || e.srcElement, + tag_name = element.tagName; + // if the element has the class "mousetrap" then no need to stop + if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) { + return false; + } - /** - * @module gestures - */ - /** - * Move with x fingers (default 1) around on the page. - * Preventing the default browser behavior is a good way to improve feel and working. - * ```` - * hammertime.on("drag", function(ev) { - * console.log(ev); - * ev.gesture.preventDefault(); - * }); - * ```` - * - * @class Drag - * @static - */ - /** - * @event drag - * @param {Object} ev - */ - /** - * @event dragstart - * @param {Object} ev - */ - /** - * @event dragend - * @param {Object} ev - */ - /** - * @event drapleft - * @param {Object} ev - */ - /** - * @event dragright - * @param {Object} ev - */ - /** - * @event dragup - * @param {Object} ev - */ - /** - * @event dragdown - * @param {Object} ev - */ + // stop for input, select, and textarea + return tag_name == 'INPUT' || tag_name == 'SELECT' || tag_name == 'TEXTAREA' || (element.contentEditable && element.contentEditable == 'true'); + } - /** - * @param {String} name - */ - (function(name) { - var triggered = false; + /** + * checks if two arrays are equal + * + * @param {Array} modifiers1 + * @param {Array} modifiers2 + * @returns {boolean} + */ + function _modifiersMatch(modifiers1, modifiers2) { + return modifiers1.sort().join(',') === modifiers2.sort().join(','); + } - function dragGesture(ev, inst) { - var cur = Detection.current; + /** + * resets all sequence counters except for the ones passed in + * + * @param {Object} do_not_reset + * @returns void + */ + function _resetSequences(do_not_reset) { + do_not_reset = do_not_reset || {}; - // max touches - if(inst.options.dragMaxTouches > 0 && - ev.touches.length > inst.options.dragMaxTouches) { - return; - } + var active_sequences = false, + key; - switch(ev.eventType) { - case EVENT_START: - triggered = false; - break; + for (key in _sequence_levels) { + if (do_not_reset[key]) { + active_sequences = true; + continue; + } + _sequence_levels[key] = 0; + } - case EVENT_MOVE: - // when the distance we moved is too small we skip this gesture - // or we can be already in dragging - if(ev.distance < inst.options.dragMinDistance && - cur.name != name) { - return; - } + if (!active_sequences) { + _inside_sequence = false; + } + } - var startCenter = cur.startEvent.center; + /** + * finds all callbacks that match based on the keycode, modifiers, + * and action + * + * @param {string} character + * @param {Array} modifiers + * @param {string} action + * @param {boolean=} remove - should we remove any matches + * @param {string=} combination + * @returns {Array} + */ + function _getMatches(character, modifiers, action, remove, combination) { + var i, + callback, + matches = []; - // we are dragging! - if(cur.name != name) { - cur.name = name; - if(inst.options.dragDistanceCorrection && ev.distance > 0) { - // When a drag is triggered, set the event center to dragMinDistance pixels from the original event center. - // Without this correction, the dragged distance would jumpstart at dragMinDistance pixels instead of at 0. - // It might be useful to save the original start point somewhere - var factor = Math.abs(inst.options.dragMinDistance / ev.distance); - startCenter.pageX += ev.deltaX * factor; - startCenter.pageY += ev.deltaY * factor; - startCenter.clientX += ev.deltaX * factor; - startCenter.clientY += ev.deltaY * factor; + // if there are no events related to this keycode + if (!_callbacks[character]) { + return []; + } - // recalculate event data using new start point - ev = Detection.extendEventData(ev); - } - } + // if a modifier key is coming up on its own we should allow it + if (action == 'keyup' && _isModifier(character)) { + modifiers = [character]; + } - // lock drag to axis? - if(cur.lastEvent.dragLockToAxis || - ( inst.options.dragLockToAxis && - inst.options.dragLockMinDistance <= ev.distance - )) { - ev.dragLockToAxis = true; - } + // loop through all callbacks for the key that was pressed + // and see if any of them match + for (i = 0; i < _callbacks[character].length; ++i) { + callback = _callbacks[character][i]; - // keep direction on the axis that the drag gesture started on - var lastDirection = cur.lastEvent.direction; - if(ev.dragLockToAxis && lastDirection !== ev.direction) { - if(Utils.isVertical(lastDirection)) { - ev.direction = (ev.deltaY < 0) ? DIRECTION_UP : DIRECTION_DOWN; - } else { - ev.direction = (ev.deltaX < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT; - } - } + // if this is a sequence but it is not at the right level + // then move onto the next match + if (callback.seq && _sequence_levels[callback.seq] != callback.level) { + continue; + } - // first time, trigger dragstart event - if(!triggered) { - inst.trigger(name + 'start', ev); - triggered = true; - } + // if the action we are looking for doesn't match the action we got + // then we should keep going + if (action != callback.action) { + continue; + } - // trigger events - inst.trigger(name, ev); - inst.trigger(name + ev.direction, ev); + // if this is a keypress event that means that we need to only + // look at the character, otherwise check the modifiers as + // well + if (action == 'keypress' || _modifiersMatch(modifiers, callback.modifiers)) { - var isVertical = Utils.isVertical(ev.direction); + // remove is used so if you change your mind and call bind a + // second time with a new function the first one is overwritten + if (remove && callback.combo == combination) { + _callbacks[character].splice(i, 1); + } - // block the browser events - if((inst.options.dragBlockVertical && isVertical) || - (inst.options.dragBlockHorizontal && !isVertical)) { - ev.preventDefault(); - } - break; + matches.push(callback); + } + } - case EVENT_RELEASE: - if(triggered && ev.changedLength <= inst.options.dragMaxTouches) { - inst.trigger(name + 'end', ev); - triggered = false; - } - break; + return matches; + } - case EVENT_END: - triggered = false; - break; - } - } + /** + * takes a key event and figures out what the modifiers are + * + * @param {Event} e + * @returns {Array} + */ + function _eventModifiers(e) { + var modifiers = []; - Hammer.gestures.Drag = { - name: name, - index: 50, - handler: dragGesture, - defaults: { - /** - * minimal movement that have to be made before the drag event gets triggered - * @property dragMinDistance - * @type {Number} - * @default 10 - */ - dragMinDistance: 10, + if (e.shiftKey) { + modifiers.push('shift'); + } - /** - * Set dragDistanceCorrection to true to make the starting point of the drag - * be calculated from where the drag was triggered, not from where the touch started. - * Useful to avoid a jerk-starting drag, which can make fine-adjustments - * through dragging difficult, and be visually unappealing. - * @property dragDistanceCorrection - * @type {Boolean} - * @default true - */ - dragDistanceCorrection: true, + if (e.altKey) { + modifiers.push('alt'); + } - /** - * set 0 for unlimited, but this can conflict with transform - * @property dragMaxTouches - * @type {Number} - * @default 1 - */ - dragMaxTouches: 1, + if (e.ctrlKey) { + modifiers.push('ctrl'); + } - /** - * prevent default browser behavior when dragging occurs - * be careful with it, it makes the element a blocking element - * when you are using the drag gesture, it is a good practice to set this true - * @property dragBlockHorizontal - * @type {Boolean} - * @default false - */ - dragBlockHorizontal: false, + if (e.metaKey) { + modifiers.push('meta'); + } - /** - * same as `dragBlockHorizontal`, but for vertical movement - * @property dragBlockVertical - * @type {Boolean} - * @default false - */ - dragBlockVertical: false, + return modifiers; + } - /** - * dragLockToAxis keeps the drag gesture on the axis that it started on, - * It disallows vertical directions if the initial direction was horizontal, and vice versa. - * @property dragLockToAxis - * @type {Boolean} - * @default false - */ - dragLockToAxis: false, + /** + * actually calls the callback function + * + * if your callback function returns false this will use the jquery + * convention - prevent default and stop propogation on the event + * + * @param {Function} callback + * @param {Event} e + * @returns void + */ + function _fireCallback(callback, e) { + if (callback(e) === false) { + if (e.preventDefault) { + e.preventDefault(); + } - /** - * drag lock only kicks in when distance > dragLockMinDistance - * This way, locking occurs only when the distance has become large enough to reliably determine the direction - * @property dragLockMinDistance - * @type {Number} - * @default 25 - */ - dragLockMinDistance: 25 - } - }; - })('drag'); + if (e.stopPropagation) { + e.stopPropagation(); + } - /** - * @module gestures - */ - /** - * trigger a simple gesture event, so you can do anything in your handler. - * only usable if you know what your doing... - * - * @class Gesture - * @static - */ - /** - * @event gesture - * @param {Object} ev - */ - Hammer.gestures.Gesture = { - name: 'gesture', - index: 1337, - handler: function releaseGesture(ev, inst) { - inst.trigger(this.name, ev); - } - }; + e.returnValue = false; + e.cancelBubble = true; + } + } - /** - * @module gestures - */ - /** - * Touch stays at the same place for x time - * - * @class Hold - * @static - */ - /** - * @event hold - * @param {Object} ev - */ + /** + * handles a character key event + * + * @param {string} character + * @param {Event} e + * @returns void + */ + function _handleCharacter(character, e) { - /** - * @param {String} name - */ - (function(name) { - var timer; + // if this event should not happen stop here + if (_stop(e)) { + return; + } - function holdGesture(ev, inst) { - var options = inst.options, - current = Detection.current; + var callbacks = _getMatches(character, _eventModifiers(e), e.type), + i, + do_not_reset = {}, + processed_sequence_callback = false; - switch(ev.eventType) { - case EVENT_START: - clearTimeout(timer); + // loop through matching callbacks for this key event + for (i = 0; i < callbacks.length; ++i) { - // set the gesture so we can check in the timeout if it still is - current.name = name; + // fire for all sequence callbacks + // this is because if for example you have multiple sequences + // bound such as "g i" and "g t" they both need to fire the + // callback for matching g cause otherwise you can only ever + // match the first one + if (callbacks[i].seq) { + processed_sequence_callback = true; - // set timer and if after the timeout it still is hold, - // we trigger the hold event - timer = setTimeout(function() { - if(current && current.name == name) { - inst.trigger(name, ev); - } - }, options.holdTimeout); - break; + // keep a list of which sequences were matches for later + do_not_reset[callbacks[i].seq] = 1; + _fireCallback(callbacks[i].callback, e); + continue; + } - case EVENT_MOVE: - if(ev.distance > options.holdThreshold) { - clearTimeout(timer); - } - break; + // if there were no sequence matches but we are still here + // that means this is a regular match so we should fire that + if (!processed_sequence_callback && !_inside_sequence) { + _fireCallback(callbacks[i].callback, e); + } + } - case EVENT_RELEASE: - clearTimeout(timer); - break; - } - } + // if you are inside of a sequence and the key you are pressing + // is not a modifier key then we should reset all sequences + // that were not matched by this key event + if (e.type == _inside_sequence && !_isModifier(character)) { + _resetSequences(do_not_reset); + } + } - Hammer.gestures.Hold = { - name: name, - index: 10, - defaults: { - /** - * @property holdTimeout - * @type {Number} - * @default 500 - */ - holdTimeout: 500, + /** + * handles a keydown event + * + * @param {Event} e + * @returns void + */ + function _handleKey(e) { - /** - * movement allowed while holding - * @property holdThreshold - * @type {Number} - * @default 2 - */ - holdThreshold: 2 - }, - handler: holdGesture - }; - })('hold'); + // normalize e.which for key events + // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion + e.which = typeof e.which == "number" ? e.which : e.keyCode; - /** - * @module gestures - */ - /** - * when a touch is being released from the page - * - * @class Release - * @static - */ - /** - * @event release - * @param {Object} ev - */ - Hammer.gestures.Release = { - name: 'release', - index: Infinity, - handler: function releaseGesture(ev, inst) { - if(ev.eventType == EVENT_RELEASE) { - inst.trigger(this.name, ev); - } - } - }; + var character = _characterFromEvent(e); - /** - * @module gestures - */ - /** - * triggers swipe events when the end velocity is above the threshold - * for best usage, set `preventDefault` (on the drag gesture) to `true` - * ```` - * hammertime.on("dragleft swipeleft", function(ev) { - * console.log(ev); - * ev.gesture.preventDefault(); - * }); - * ```` - * - * @class Swipe - * @static - */ - /** - * @event swipe - * @param {Object} ev - */ - /** - * @event swipeleft - * @param {Object} ev - */ - /** - * @event swiperight - * @param {Object} ev - */ - /** - * @event swipeup - * @param {Object} ev - */ - /** - * @event swipedown - * @param {Object} ev - */ - Hammer.gestures.Swipe = { - name: 'swipe', - index: 40, - defaults: { - /** - * @property swipeMinTouches - * @type {Number} - * @default 1 - */ - swipeMinTouches: 1, + // no character found then stop + if (!character) { + return; + } - /** - * @property swipeMaxTouches - * @type {Number} - * @default 1 - */ - swipeMaxTouches: 1, + if (e.type == 'keyup' && _ignore_next_keyup == character) { + _ignore_next_keyup = false; + return; + } - /** - * horizontal swipe velocity - * @property swipeVelocityX - * @type {Number} - * @default 0.6 - */ - swipeVelocityX: 0.6, + _handleCharacter(character, e); + } - /** - * vertical swipe velocity - * @property swipeVelocityY - * @type {Number} - * @default 0.6 - */ - swipeVelocityY: 0.6 - }, + /** + * determines if the keycode specified is a modifier key or not + * + * @param {string} key + * @returns {boolean} + */ + function _isModifier(key) { + return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta'; + } - handler: function swipeGesture(ev, inst) { - if(ev.eventType == EVENT_RELEASE) { - var touches = ev.touches.length, - options = inst.options; + /** + * called to set a 1 second timeout on the specified sequence + * + * this is so after each key press in the sequence you have 1 second + * to press the next key before you have to start over + * + * @returns void + */ + function _resetSequenceTimer() { + clearTimeout(_reset_timer); + _reset_timer = setTimeout(_resetSequences, 1000); + } - // max touches - if(touches < options.swipeMinTouches || - touches > options.swipeMaxTouches) { - return; - } + /** + * reverses the map lookup so that we can look for specific keys + * to see what can and can't use keypress + * + * @return {Object} + */ + function _getReverseMap() { + if (!_REVERSE_MAP) { + _REVERSE_MAP = {}; + for (var key in _MAP) { - // when the distance we moved is too small we skip this gesture - // or we can be already in dragging - if(ev.velocityX > options.swipeVelocityX || - ev.velocityY > options.swipeVelocityY) { - // trigger swipe events - inst.trigger(this.name, ev); - inst.trigger(this.name + ev.direction, ev); - } - } - } - }; + // pull out the numeric keypad from here cause keypress should + // be able to detect the keys from the character + if (key > 95 && key < 112) { + continue; + } - /** - * @module gestures - */ - /** - * Single tap and a double tap on a place - * - * @class Tap - * @static - */ - /** - * @event tap - * @param {Object} ev - */ - /** - * @event doubletap - * @param {Object} ev - */ + if (_MAP.hasOwnProperty(key)) { + _REVERSE_MAP[_MAP[key]] = key; + } + } + } + return _REVERSE_MAP; + } - /** - * @param {String} name - */ - (function(name) { - var hasMoved = false; + /** + * picks the best action based on the key combination + * + * @param {string} key - character for key + * @param {Array} modifiers + * @param {string=} action passed in + */ + function _pickBestAction(key, modifiers, action) { - function tapGesture(ev, inst) { - var options = inst.options, - current = Detection.current, - prev = Detection.previous, - sincePrev, - didDoubleTap; + // if no action was picked in we should try to pick the one + // that we think would work best for this key + if (!action) { + action = _getReverseMap()[key] ? 'keydown' : 'keypress'; + } - switch(ev.eventType) { - case EVENT_START: - hasMoved = false; - break; + // modifier keys don't work as expected with keypress, + // switch to keydown + if (action == 'keypress' && modifiers.length) { + action = 'keydown'; + } - case EVENT_MOVE: - hasMoved = hasMoved || (ev.distance > options.tapMaxDistance); - break; + return action; + } - case EVENT_END: - if(!Utils.inStr(ev.srcEvent.type, 'cancel') && ev.deltaTime < options.tapMaxTime && !hasMoved) { - // previous gesture, for the double tap since these are two different gesture detections - sincePrev = prev && prev.lastEvent && ev.timeStamp - prev.lastEvent.timeStamp; - didDoubleTap = false; + /** + * binds a key sequence to an event + * + * @param {string} combo - combo specified in bind call + * @param {Array} keys + * @param {Function} callback + * @param {string=} action + * @returns void + */ + function _bindSequence(combo, keys, callback, action) { - // check if double tap - if(prev && prev.name == name && - (sincePrev && sincePrev < options.doubleTapInterval) && - ev.distance < options.doubleTapDistance) { - inst.trigger('doubletap', ev); - didDoubleTap = true; - } + // start off by adding a sequence level record for this combination + // and setting the level to 0 + _sequence_levels[combo] = 0; - // do a single tap - if(!didDoubleTap || options.tapAlways) { - current.name = name; - inst.trigger(current.name, ev); - } - } - break; - } - } + // if there is no action pick the best one for the first key + // in the sequence + if (!action) { + action = _pickBestAction(keys[0], []); + } - Hammer.gestures.Tap = { - name: name, - index: 100, - handler: tapGesture, - defaults: { - /** - * max time of a tap, this is for the slow tappers - * @property tapMaxTime - * @type {Number} - * @default 250 - */ - tapMaxTime: 250, + /** + * callback to increase the sequence level for this sequence and reset + * all other sequences that were active + * + * @param {Event} e + * @returns void + */ + var _increaseSequence = function(e) { + _inside_sequence = action; + ++_sequence_levels[combo]; + _resetSequenceTimer(); + }, - /** - * max distance of movement of a tap, this is for the slow tappers - * @property tapMaxDistance - * @type {Number} - * @default 10 - */ - tapMaxDistance: 10, + /** + * wraps the specified callback inside of another function in order + * to reset all sequence counters as soon as this sequence is done + * + * @param {Event} e + * @returns void + */ + _callbackAndReset = function(e) { + _fireCallback(callback, e); - /** - * always trigger the `tap` event, even while double-tapping - * @property tapAlways - * @type {Boolean} - * @default true - */ - tapAlways: true, + // we should ignore the next key up if the action is key down + // or keypress. this is so if you finish a sequence and + // release the key the final key will not trigger a keyup + if (action !== 'keyup') { + _ignore_next_keyup = _characterFromEvent(e); + } - /** - * max distance between two taps - * @property doubleTapDistance - * @type {Number} - * @default 20 - */ - doubleTapDistance: 20, + // weird race condition if a sequence ends with the key + // another sequence begins with + setTimeout(_resetSequences, 10); + }, + i; - /** - * max time between two taps - * @property doubleTapInterval - * @type {Number} - * @default 300 - */ - doubleTapInterval: 300 - } - }; - })('tap'); + // loop through keys one at a time and bind the appropriate callback + // function. for any key leading up to the final one it should + // increase the sequence. after the final, it should reset all sequences + for (i = 0; i < keys.length; ++i) { + _bindSingle(keys[i], i < keys.length - 1 ? _increaseSequence : _callbackAndReset, action, combo, i); + } + } - /** - * @module gestures - */ - /** - * when a touch is being touched at the page - * - * @class Touch - * @static - */ - /** - * @event touch - * @param {Object} ev - */ - Hammer.gestures.Touch = { - name: 'touch', - index: -Infinity, - defaults: { - /** - * call preventDefault at touchstart, and makes the element blocking by disabling the scrolling of the page, - * but it improves gestures like transforming and dragging. - * be careful with using this, it can be very annoying for users to be stuck on the page - * @property preventDefault - * @type {Boolean} - * @default false - */ - preventDefault: false, + /** + * binds a single keyboard combination + * + * @param {string} combination + * @param {Function} callback + * @param {string=} action + * @param {string=} sequence_name - name of sequence if part of sequence + * @param {number=} level - what part of the sequence the command is + * @returns void + */ + function _bindSingle(combination, callback, action, sequence_name, level) { - /** - * disable mouse events, so only touch (or pen!) input triggers events - * @property preventMouse - * @type {Boolean} - * @default false - */ - preventMouse: false - }, - handler: function touchGesture(ev, inst) { - if(inst.options.preventMouse && ev.pointerType == POINTER_MOUSE) { - ev.stopDetect(); - return; - } + // make sure multiple spaces in a row become a single space + combination = combination.replace(/\s+/g, ' '); - if(inst.options.preventDefault) { - ev.preventDefault(); - } + var sequence = combination.split(' '), + i, + key, + keys, + modifiers = []; - if(ev.eventType == EVENT_TOUCH) { - inst.trigger('touch', ev); - } - } - }; + // if this pattern is a sequence of keys then run through this method + // to reprocess each pattern one key at a time + if (sequence.length > 1) { + return _bindSequence(combination, sequence, callback, action); + } - /** - * @module gestures - */ - /** - * User want to scale or rotate with 2 fingers - * Preventing the default browser behavior is a good way to improve feel and working. This can be done with the - * `preventDefault` option. - * - * @class Transform - * @static - */ - /** - * @event transform - * @param {Object} ev - */ - /** - * @event transformstart - * @param {Object} ev - */ - /** - * @event transformend - * @param {Object} ev - */ - /** - * @event pinchin - * @param {Object} ev - */ - /** - * @event pinchout - * @param {Object} ev - */ - /** - * @event rotate - * @param {Object} ev - */ + // take the keys from this pattern and figure out what the actual + // pattern is all about + keys = combination === '+' ? ['+'] : combination.split('+'); - /** - * @param {String} name - */ - (function(name) { - var triggered = false; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; - function transformGesture(ev, inst) { - switch(ev.eventType) { - case EVENT_START: - triggered = false; - break; + // normalize key names + if (_SPECIAL_ALIASES[key]) { + key = _SPECIAL_ALIASES[key]; + } - case EVENT_MOVE: - // at least multitouch - if(ev.touches.length < 2) { - return; - } + // if this is not a keypress event then we should + // be smart about using shift keys + // this will only work for US keyboards however + if (action && action != 'keypress' && _SHIFT_MAP[key]) { + key = _SHIFT_MAP[key]; + modifiers.push('shift'); + } - var scaleThreshold = Math.abs(1 - ev.scale); - var rotationThreshold = Math.abs(ev.rotation); + // if this key is a modifier then add it to the list of modifiers + if (_isModifier(key)) { + modifiers.push(key); + } + } - // when the distance we moved is too small we skip this gesture - // or we can be already in dragging - if(scaleThreshold < inst.options.transformMinScale && - rotationThreshold < inst.options.transformMinRotation) { - return; - } + // depending on what the key combination is + // we will try to pick the best event for it + action = _pickBestAction(key, modifiers, action); - // we are transforming! - Detection.current.name = name; + // make sure to initialize array if this is the first time + // a callback is added for this key + if (!_callbacks[key]) { + _callbacks[key] = []; + } - // first time, trigger dragstart event - if(!triggered) { - inst.trigger(name + 'start', ev); - triggered = true; - } + // remove an existing match if there is one + _getMatches(key, modifiers, action, !sequence_name, combination); - inst.trigger(name, ev); // basic transform event + // add this call back to the array + // if it is a sequence put it at the beginning + // if not put it at the end + // + // this is important because the way these are processed expects + // the sequence ones to come first + _callbacks[key][sequence_name ? 'unshift' : 'push']({ + callback: callback, + modifiers: modifiers, + action: action, + seq: sequence_name, + level: level, + combo: combination + }); + } - // trigger rotate event - if(rotationThreshold > inst.options.transformMinRotation) { - inst.trigger('rotate', ev); - } + /** + * binds multiple combinations to the same callback + * + * @param {Array} combinations + * @param {Function} callback + * @param {string|undefined} action + * @returns void + */ + function _bindMultiple(combinations, callback, action) { + for (var i = 0; i < combinations.length; ++i) { + _bindSingle(combinations[i], callback, action); + } + } - // trigger pinch event - if(scaleThreshold > inst.options.transformMinScale) { - inst.trigger('pinch', ev); - inst.trigger('pinch' + (ev.scale < 1 ? 'in' : 'out'), ev); - } - break; + // start! + _addEvent(document, 'keypress', _handleKey); + _addEvent(document, 'keydown', _handleKey); + _addEvent(document, 'keyup', _handleKey); - case EVENT_RELEASE: - if(triggered && ev.changedLength < 2) { - inst.trigger(name + 'end', ev); - triggered = false; - } - break; - } - } + var mousetrap = { - Hammer.gestures.Transform = { - name: name, - index: 45, - defaults: { - /** - * minimal scale factor, no scale is 1, zoomin is to 0 and zoomout until higher then 1 - * @property transformMinScale - * @type {Number} - * @default 0.01 - */ - transformMinScale: 0.01, + /** + * binds an event to mousetrap + * + * can be a single key, a combination of keys separated with +, + * a comma separated list of keys, an array of keys, or + * a sequence of keys separated by spaces + * + * be sure to list the modifier keys first to make sure that the + * correct key ends up getting bound (the last key in the pattern) + * + * @param {string|Array} keys + * @param {Function} callback + * @param {string=} action - 'keypress', 'keydown', or 'keyup' + * @returns void + */ + bind: function(keys, callback, action) { + _bindMultiple(keys instanceof Array ? keys : [keys], callback, action); + _direct_map[keys + ':' + action] = callback; + return this; + }, - /** - * rotation in degrees - * @property transformMinRotation - * @type {Number} - * @default 1 - */ - transformMinRotation: 1 - }, + /** + * unbinds an event to mousetrap + * + * the unbinding sets the callback function of the specified key combo + * to an empty function and deletes the corresponding key in the + * _direct_map dict. + * + * the keycombo+action has to be exactly the same as + * it was defined in the bind method + * + * TODO: actually remove this from the _callbacks dictionary instead + * of binding an empty function + * + * @param {string|Array} keys + * @param {string} action + * @returns void + */ + unbind: function(keys, action) { + if (_direct_map[keys + ':' + action]) { + delete _direct_map[keys + ':' + action]; + this.bind(keys, function() {}, action); + } + return this; + }, - handler: transformGesture - }; - })('transform'); + /** + * triggers an event that has already been bound + * + * @param {string} keys + * @param {string=} action + * @returns void + */ + trigger: function(keys, action) { + _direct_map[keys + ':' + action](); + return this; + }, - /** - * @module hammer - */ + /** + * resets the library back to its initial state. this is useful + * if you want to clear out the current keyboard shortcuts and bind + * new ones - for example if you switch to another page + * + * @returns void + */ + reset: function() { + _callbacks = {}; + _direct_map = {}; + return this; + } + }; + + module.exports = mousetrap; - // AMD export - if(true) { - !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { - return Hammer; - }.call(exports, __webpack_require__, exports, module)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - // commonjs export - } else if(typeof module !== 'undefined' && module.exports) { - module.exports = Hammer; - // browser export - } else { - window.Hammer = Hammer; - } - })(window); /***/ }, /* 53 */ diff --git a/docs/graph2d.html b/docs/graph2d.html index 6a6952ac..2c9b7726 100644 --- a/docs/graph2d.html +++ b/docs/graph2d.html @@ -430,6 +430,15 @@ The options colored in green can also be used as options for the groups. All opt true Show or hide the data axis. + + groups.visibility + Object + + You can use this to toggle the visibility of groups per graph2D instance. This is different from setting the visibility flag of the groups since + this is not communicated across instances of graph2d. Take a look at Example 14 + for more explaination. + + legend Boolean diff --git a/examples/graph2d/14_toggleGroups.html b/examples/graph2d/14_toggleGroups.html new file mode 100644 index 00000000..9b3ee0ba --- /dev/null +++ b/examples/graph2d/14_toggleGroups.html @@ -0,0 +1,145 @@ + + + + Graph2d | Toggle Groups Example + + + + + + + + +

Graph2d | Groups Example

+
+ This example shows the groups visibility functionality within Graph2d. Groups have their own visibility option. By using this, + all graph2d instances using those groups would show or hide that group. If you have multiple instances sharing the same data and groups, + you can use the groups.visibility option to set it on an instance level. The graphs below all share the same groups, items and initial options. + We then use a setOptions like so: + + +
+        graph2d1.setOptions({
+            groups:{
+                visibility:{
+                    0:true,               // group id:0 visible
+                    1:false,              // group id:1 hidden
+                    2:false,              // group id:2 hidden
+                    3:false,              // group id:3 hidden
+                    "__ungrouped__":false // default group hidden
+                }
+            }
+        })
+    
+
+
+ +
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/examples/graph2d/index.html b/examples/graph2d/index.html index 3d116670..ca5dfe0a 100644 --- a/examples/graph2d/index.html +++ b/examples/graph2d/index.html @@ -20,6 +20,7 @@

11_barsSideBySideGroups.html

12_customRange.html

13_localization.html

+

14_toggleGroups.html

diff --git a/lib/timeline/Graph2d.js b/lib/timeline/Graph2d.js index 61ab239d..b165d162 100644 --- a/lib/timeline/Graph2d.js +++ b/lib/timeline/Graph2d.js @@ -190,7 +190,7 @@ Graph2d.prototype.getLegend = function(groupId, width, height) { */ Graph2d.prototype.isGroupVisible = function(groupId) { if (this.linegraph.groups[groupId] !== undefined) { - return this.linegraph.groups[groupId].visible; + return (this.linegraph.groups[groupId].visible && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)); } else { return false; diff --git a/lib/timeline/component/LineGraph.js b/lib/timeline/component/LineGraph.js index 8f19e7e9..c8b71a5c 100644 --- a/lib/timeline/component/LineGraph.js +++ b/lib/timeline/component/LineGraph.js @@ -68,6 +68,9 @@ function LineGraph(body, options) { visible: true, position: 'top-right' // top/bottom - left,right } + }, + groups: { + visibility: {} } }; @@ -178,7 +181,7 @@ LineGraph.prototype._create = function(){ */ LineGraph.prototype.setOptions = function(options) { if (options) { - var fields = ['sampling','defaultGroup','graphHeight','yAxisOrientation','style','barChart','dataAxis','sort']; + var fields = ['sampling','defaultGroup','graphHeight','yAxisOrientation','style','barChart','dataAxis','sort','groups']; util.selectiveDeepExtend(fields, this.options, options); util.mergeOptions(this.options, options,'catmullRom'); util.mergeOptions(this.options, options,'drawPoints'); @@ -551,7 +554,7 @@ LineGraph.prototype._updateGraph = function () { for (var groupId in this.groups) { if (this.groups.hasOwnProperty(groupId)) { group = this.groups[groupId]; - if (group.visible == true) { + if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) { groupIds.push(groupId); } } @@ -900,7 +903,7 @@ LineGraph.prototype._drawBarGraphs = function (groupIds, processedGroupData) { for (i = 0; i < groupIds.length; i++) { group = this.groups[groupIds[i]]; if (group.options.style == 'bar') { - if (group.visible == true) { + if (group.visible == true && (this.options.groups.visibility[groupIds[i]] === undefined || this.options.groups.visibility[groupIds[i]] == true)) { for (j = 0; j < processedGroupData[groupIds[i]].length; j++) { combinedData.push({ x: processedGroupData[groupIds[i]][j].x, From 7e8246b1510d31e46d20b88dfa5fee363abd8963 Mon Sep 17 00:00:00 2001 From: Alex de Mulder Date: Fri, 22 Aug 2014 17:56:03 +0200 Subject: [PATCH 2/4] updates vis dist and history --- HISTORY.md | 6 ++- dist/vis.js | 133 +++++++++++++++++++++++------------------------ dist/vis.map | 2 +- dist/vis.min.css | 2 +- dist/vis.min.js | 18 +++---- 5 files changed, 79 insertions(+), 82 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 40214d13..595d738c 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -27,11 +27,13 @@ http://visjs.org ### Graph2D -- Added 'allowOverlap' option for barCharts. -- Added two examples showing the two additions above. +- Added 'handleOverlap' to support overlap, sideBySide and stack. +- Added two examples showing the 'handleOverlap' functionality. - Added 'customRange' for the Y axis and an example showing how it works. - Added localization support. - Implemented option `clickToUse`. +- Fixed bugs. +- Added groups.visibility functionality and an example showing how it works. ## 2014-08-14, version 3.2.0 diff --git a/dist/vis.js b/dist/vis.js index b52076f0..8149e3e4 100644 --- a/dist/vis.js +++ b/dist/vis.js @@ -6243,20 +6243,18 @@ return /******/ (function(modules) { // webpackBootstrap /** * Set selected items by their id. Replaces the current selection * Unknown id's are silently ignored. - * @param {Array} [ids] An array with zero or more id's of the items to be - * selected. If ids is an empty array, all items will be - * unselected. - * @param {Object} [options] Available options: - * `focus: boolean` If true, focus will be set - * to the selected item(s) + * @param {string[] | string} [ids] An array with zero or more id's of the items to be + * selected. If ids is an empty array, all items will be + * unselected. + * @param {Object} [options] Available options: + * `focus: boolean` If true, focus will be set + * to the selected item(s) */ Timeline.prototype.setSelection = function(ids, options) { this.itemSet && this.itemSet.setSelection(ids); - if (ids && options) { - if (options.focus) { - this.focus(ids); - } + if (options && options.focus) { + this.focus(ids); } }; @@ -6274,27 +6272,24 @@ return /******/ (function(modules) { // webpackBootstrap * @param {String | String[]} id An item id or array with item ids */ Timeline.prototype.focus = function(id) { - if (!this.itemsData) return; + if (!this.itemsData || id == undefined) return; + + var ids = Array.isArray(id) ? id : [id]; // get the specified item(s) - var itemsData = this.itemsData.getDataSet().get(id, { + var itemsData = this.itemsData.getDataSet().get(ids, { type: { start: 'Date', end: 'Date' } }); - // turn into an array in case of a single item - if (!Array.isArray(itemsData)) { - itemsData = [itemsData]; - } - // calculate minimum start and maximum end of specified items var start = null; var end = null; itemsData.forEach(function (itemData) { var s = itemData.start.valueOf(); - var e = 'end' in itemData ? itemData.end.valueOf() :itemData.start.valueOf(); + var e = 'end' in itemData ? itemData.end.valueOf() : itemData.start.valueOf(); if (start === null || s < start) { start = s; @@ -6553,7 +6548,7 @@ return /******/ (function(modules) { // webpackBootstrap */ Graph2d.prototype.isGroupVisible = function(groupId) { if (this.linegraph.groups[groupId] !== undefined) { - return this.linegraph.groups[groupId].visible; + return (this.linegraph.groups[groupId].visible && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)); } else { return false; @@ -6827,7 +6822,7 @@ return /******/ (function(modules) { // webpackBootstrap /***/ function(module, exports, __webpack_require__) { var util = __webpack_require__(1); - var hammerUtil = __webpack_require__(44); + var hammerUtil = __webpack_require__(43); var moment = __webpack_require__(40); var Component = __webpack_require__(18); @@ -8019,7 +8014,7 @@ return /******/ (function(modules) { // webpackBootstrap var util = __webpack_require__(1); var Component = __webpack_require__(18); var moment = __webpack_require__(40); - var locales = __webpack_require__(43); + var locales = __webpack_require__(44); /** * A current time bar @@ -8167,7 +8162,7 @@ return /******/ (function(modules) { // webpackBootstrap var util = __webpack_require__(1); var Component = __webpack_require__(18); var moment = __webpack_require__(40); - var locales = __webpack_require__(43); + var locales = __webpack_require__(44); /** * A custom time bar @@ -9819,34 +9814,31 @@ return /******/ (function(modules) { // webpackBootstrap /** * Set selected items by their id. Replaces the current selection * Unknown id's are silently ignored. - * @param {Array} [ids] An array with zero or more id's of the items to be - * selected. If ids is an empty array, all items will be - * unselected. + * @param {string[] | string} [ids] An array with zero or more id's of the items to be + * selected, or a single item id. If ids is undefined + * or an empty array, all items will be unselected. */ ItemSet.prototype.setSelection = function(ids) { var i, ii, id, item; - if (ids) { - if (!Array.isArray(ids)) { - throw new TypeError('Array expected'); - } + if (ids == undefined) ids = []; + if (!Array.isArray(ids)) ids = [ids]; - // unselect currently selected items - for (i = 0, ii = this.selection.length; i < ii; i++) { - id = this.selection[i]; - item = this.items[id]; - if (item) item.unselect(); - } + // unselect currently selected items + for (i = 0, ii = this.selection.length; i < ii; i++) { + id = this.selection[i]; + item = this.items[id]; + if (item) item.unselect(); + } - // select items - this.selection = []; - for (i = 0, ii = ids.length; i < ii; i++) { - id = ids[i]; - item = this.items[id]; - if (item) { - this.selection.push(id); - item.select(); - } + // select items + this.selection = []; + for (i = 0, ii = ids.length; i < ii; i++) { + id = ids[i]; + item = this.items[id]; + if (item) { + this.selection.push(id); + item.select(); } } }; @@ -11116,6 +11108,9 @@ return /******/ (function(modules) { // webpackBootstrap visible: true, position: 'top-right' // top/bottom - left,right } + }, + groups: { + visibility: {} } }; @@ -11226,7 +11221,7 @@ return /******/ (function(modules) { // webpackBootstrap */ LineGraph.prototype.setOptions = function(options) { if (options) { - var fields = ['sampling','defaultGroup','graphHeight','yAxisOrientation','style','barChart','dataAxis','sort']; + var fields = ['sampling','defaultGroup','graphHeight','yAxisOrientation','style','barChart','dataAxis','sort','groups']; util.selectiveDeepExtend(fields, this.options, options); util.mergeOptions(this.options, options,'catmullRom'); util.mergeOptions(this.options, options,'drawPoints'); @@ -11599,7 +11594,7 @@ return /******/ (function(modules) { // webpackBootstrap for (var groupId in this.groups) { if (this.groups.hasOwnProperty(groupId)) { group = this.groups[groupId]; - if (group.visible == true) { + if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) { groupIds.push(groupId); } } @@ -11948,7 +11943,7 @@ return /******/ (function(modules) { // webpackBootstrap for (i = 0; i < groupIds.length; i++) { group = this.groups[groupIds[i]]; if (group.options.style == 'bar') { - if (group.visible == true) { + if (group.visible == true && (this.options.groups.visibility[groupIds[i]] === undefined || this.options.groups.visibility[groupIds[i]] == true)) { for (j = 0; j < processedGroupData[groupIds[i]].length; j++) { combinedData.push({ x: processedGroupData[groupIds[i]][j].x, @@ -13663,7 +13658,7 @@ return /******/ (function(modules) { // webpackBootstrap var Hammer = __webpack_require__(41); var mousetrap = __webpack_require__(50); var util = __webpack_require__(1); - var hammerUtil = __webpack_require__(44); + var hammerUtil = __webpack_require__(43); var DataSet = __webpack_require__(3); var DataView = __webpack_require__(4); var dotparser = __webpack_require__(38); @@ -20001,27 +19996,6 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, /* 43 */ -/***/ function(module, exports, __webpack_require__) { - - // English - exports['en'] = { - current: 'current', - time: 'time' - }; - exports['en_EN'] = exports['en']; - exports['en_US'] = exports['en']; - - // Dutch - exports['nl'] = { - custom: 'aangepaste', - time: 'tijd' - }; - exports['nl_NL'] = exports['nl']; - exports['nl_BE'] = exports['nl']; - - -/***/ }, -/* 44 */ /***/ function(module, exports, __webpack_require__) { var Hammer = __webpack_require__(41); @@ -20054,6 +20028,27 @@ return /******/ (function(modules) { // webpackBootstrap }; +/***/ }, +/* 44 */ +/***/ function(module, exports, __webpack_require__) { + + // English + exports['en'] = { + current: 'current', + time: 'time' + }; + exports['en_EN'] = exports['en']; + exports['en_US'] = exports['en']; + + // Dutch + exports['nl'] = { + custom: 'aangepaste', + time: 'tijd' + }; + exports['nl_NL'] = exports['nl']; + exports['nl_BE'] = exports['nl']; + + /***/ }, /* 45 */ /***/ function(module, exports, __webpack_require__) { diff --git a/dist/vis.map b/dist/vis.map index 4131f97b..2b4d59f2 100644 --- a/dist/vis.map +++ b/dist/vis.map @@ -1 +1 @@ -{"version":3,"file":"vis.map","sources":["./dist/vis.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","util","DOMutil","DataSet","DataView","Graph3d","graph3d","Camera","Filter","Point2d","Point3d","Slider","StepNumber","Timeline","Graph2d","timeline","DataStep","Range","stack","TimeStep","components","items","Item","ItemBox","ItemPoint","ItemRange","Component","CurrentTime","CustomTime","DataAxis","GraphGroup","Group","ItemSet","Legend","LineGraph","TimeAxis","Network","network","Edge","Groups","Images","Node","Popup","dotparser","gephiParser","Graph","Error","moment","hammer","isNumber","object","Number","isString","String","isDate","Date","match","ASPDateRegex","exec","isNaN","parse","isDataTable","google","visualization","DataTable","randomUUID","S4","Math","floor","random","toString","extend","a","i","len","arguments","length","other","prop","hasOwnProperty","selectiveExtend","props","Array","isArray","selectiveDeepExtend","b","TypeError","constructor","Object","undefined","deepExtend","selectiveNotDeepExtend","indexOf","equalArray","convert","type","Boolean","valueOf","isMoment","toDate","getType","toISOString","value","getAbsoluteLeft","elem","getBoundingClientRect","left","window","pageXOffset","getAbsoluteTop","top","pageYOffset","addClassName","className","classes","split","push","join","removeClassName","index","splice","forEach","callback","toArray","array","updateProperty","key","addEventListener","element","action","listener","useCapture","navigator","userAgent","attachEvent","removeEventListener","detachEvent","preventDefault","event","returnValue","getTarget","target","srcElement","nodeType","parentNode","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","GiveDec","Hex","Value","eval","GiveHex","Dec","parseColor","color","isValidRGB","rgb","substr","RGBToHex","isValidHex","hsv","hexToHSV","lighterColorHSV","h","s","v","min","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","hexToRGB","hex","replace","toUpperCase","substring","d","e","f","r","g","red","green","blue","RGBToHSV","minRGB","maxRGB","max","hue","saturation","HSVToRGB","q","t","isOk","test","selectiveBridgeObject","fields","referenceObject","objectTo","create","bridgeObject","mergeOptions","mergeTarget","options","enabled","binarySearch","orderedItems","range","field","field2","maxIterations","iteration","found","low","high","newLow","newHigh","guess","isVisible","start","console","log","binarySearchGeneric","sidePreference","newGuess","prevValue","nextValue","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","removeChild","getSVGElement","svgContainer","shift","document","createElementNS","appendChild","getDOMElement","DOMContainer","createElement","drawPoint","x","y","group","point","drawPoints","style","setAttributeNS","size","drawBar","width","height","rect","data","_options","_data","_fieldId","fieldId","_type","_subscribers","add","prototype","on","subscribers","subscribe","off","filter","unsubscribe","_trigger","params","senderId","concat","subscriber","addedIds","me","_addItem","columns","_getColumnNames","row","rows","getNumberOfRows","item","col","cols","getValue","update","updatedIds","addOrUpdate","_updateItem","get","ids","firstType","returnType","allowedValues","itemId","_getItem","order","_sort","_filterFields","_appendRow","result","getIds","getDataSet","map","mappedItems","filteredItem","name","sort","av","bv","remove","removedId","removedIds","_remove","clear","keys","maxField","itemField","minField","distinct","values","fieldType","count","exists","types","raw","converted","JSON","stringify","dataTable","getNumberOfColumns","getColumnId","getColumnLabel","addRow","setValue","_ids","_onEvent","apply","setData","viewOptions","getArguments","defaultFilter","dataSet","added","updated","removed","container","SyntaxError","containerElement","margin","defaultXCenter","defaultYCenter","xLabel","yLabel","zLabel","filterLabel","legendLabel","STYLE","DOT","showPerspective","showGrid","keepAspectRatio","showShadow","showGrayBottom","showTooltip","verticalRatio","animationInterval","animationPreload","camera","eye","dataPoints","colX","colY","colZ","colValue","colFilter","xMin","xStep","xMax","yMin","yStep","yMax","zMin","zStep","zMax","valueMin","valueMax","xBarWidth","yBarWidth","colorAxis","colorGrid","colorDot","colorDotBorder","setOptions","Emitter","_setScale","scale","z","xCenter","yCenter","zCenter","setArmLocation","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","ax","ay","az","cx","getCameraLocation","cy","cz","sinTx","sin","getCameraRotation","cosTx","cos","sinTy","cosTy","sinTz","cosTz","dx","dy","dz","bx","by","ex","ey","ez","getArmLength","xcenter","frame","canvas","clientWidth","ycenter","_setBackgroundColor","backgroundColor","fill","stroke","strokeWidth","borderColor","borderWidth","borderStyle","BAR","BARCOLOR","BARSIZE","DOTLINE","DOTCOLOR","DOTSIZE","GRID","LINE","SURFACE","_getStyleNumber","styleName","_determineColumnIndexes","counter","column","getDistinctValues","distinctValues","getColumnRange","minMax","_dataInitialize","rawData","_onChange","dataFilter","setOnLoadCallback","redraw","withBars","defaultXBarWidth","dataX","defaultYBarWidth","dataY","xRange","defaultXMin","defaultXMax","defaultXStep","yRange","defaultYMin","defaultYMax","defaultYStep","zRange","defaultZMin","defaultZMax","defaultZStep","valueRange","defaultValueMin","defaultValueMax","_getDataPoints","sortNumber","obj","dataMatrix","xIndex","yIndex","trans","screen","bottom","pointRight","pointTop","pointCross","hasChildNodes","firstChild","position","overflow","noCanvas","fontWeight","padding","innerHTML","onmousedown","_onMouseDown","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","onkeydown","setSize","_resizeCanvas","clientHeight","animationStart","slider","play","animationStop","stop","_resizeCenter","charAt","parseFloat","setCameraPosition","pos","horizontal","vertical","setArmRotation","distance","setArmLength","getCameraPosition","getArmRotation","_readData","_redrawFilter","animationAutoStart","cameraPosition","styleNumber","tooltip","showAnimationControls","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGrid","_redrawDataLine","_redrawDataBar","_redrawDataDot","_redrawInfo","_redrawLegend","ctx","getContext","clearRect","widthMin","widthMax","dotSize","right","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","fillStyle","closePath","gridLineLen","step","getCurrent","next","end","textAlign","textBaseline","fillText","label","visible","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","from","to","prettyStep","text","xText","yText","zText","offset","xOffset","yOffset","xMin2d","xMax2d","gridLenX","gridLenY","textMargin","armAngle","H","S","V","R","G","B","C","Hi","X","abs","parseInt","cross","topSideVisible","zAvg","transBottom","dist","sortDepth","aDiff","subtract","bDiff","crossproduct","crossProduct","radius","arc","PI","j","surface","corners","xWidth","yWidth","surfaces","center","avg","transCenter","diff","leftButtonDown","_onMouseUp","which","button","touchDown","startMouseX","getMouseX","startMouseY","getMouseY","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","diffX","diffY","horizontalNew","verticalNew","snapAngle","snapValue","round","parameters","emit","delay","mouseX","mouseY","tooltipTimeout","clearTimeout","_hideTooltip","dataPoint","_dataPointFromXY","_showTooltip","setTimeout","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","delta","wheelDelta","detail","oldLength","newLength","_insideTriangle","triangle","sign","as","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","sqrt","content","line","dot","dom","borderRadius","boxShadow","borderLeft","contentWidth","offsetWidth","contentHeight","offsetHeight","lineHeight","dotWidth","dotHeight","clientX","targetTouches","clientY","armLocation","armRotation","armLength","cameraLocation","cameraRotation","calculateCameraOrientation","rot","graph","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","dataView","progress","sub","sum","prev","bar","MozBorderRadius","slide","onclick","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","setIndex","playNext","interval","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","_start","_end","_step","precision","_current","setRange","setStep","calculatePrettyStep","log10","LN10","step1","pow","step2","step5","toPrecision","getStep","defaultOptions","autoResize","orientation","maxHeight","minHeight","_create","body","domProps","emitter","bind","snap","toScreen","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","timeAxis","currentTime","customTime","itemSet","itemsData","groupsData","setItems","Core","newDataSet","initialLoad","fit","setWindow","setGroups","groups","setSelection","focus","getSelection","itemData","middle","getItemRange","dataset","minItem","maxStartItem","maxEndItem","linegraph","getLegend","groupId","isGroupVisible","minimumStep","containerHeight","customRange","current","autoScale","stepIndex","marginStart","marginEnd","deadSpace","majorSteps","minorSteps","setMinimumStep","setFirst","safeSize","minimumStepValue","orderOfMagnitude","minorStepIdx","magnitudefactor","solutionFound","stepSize","niceStart","niceEnd","roundToMinor","marginRange","rounded","hasNext","previous","slice","isMajor","now","hours","minutes","seconds","milliseconds","clone","direction","moveable","zoomable","zoomMin","zoomMax","touch","_onDragStart","_onDrag","_onDragEnd","_onHold","_onMouseWheel","_onTouch","_onPinch","validateDirection","getPointer","pageX","pageY","hammerUtil","changed","_applyRange","newStart","newEnd","getRange","conversion","allowDragging","gesture","deltaX","deltaY","diffRange","fakeGesture","pointer","pointerDate","_pointerToDate","zoom","touches","initDate","move","EPSILON","orderByStart","orderByEnd","aTime","bTime","force","iMax","axis","collidingItem","jj","collision","nostack","SCALE","DAY","MILLISECOND","SECOND","MINUTE","HOUR","WEEKDAY","MONTH","YEAR","first","setFullYear","getFullYear","setMonth","setDate","setHours","setMinutes","setSeconds","setMilliseconds","getMilliseconds","getSeconds","getMinutes","getHours","getDate","getMonth","setScale","newScale","newStep","setAutoScale","enable","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","date","year","getLabelMinor","format","getLabelMajor","destroy","_isResized","resized","_previousWidth","_previousHeight","showCurrentTime","locales","locale","parent","backgroundVertical","title","time","currentTimeTimer","showCustomTime","eventParams","Hammer","drag","prevent_default","setCustomTime","getCustomTime","dragging","stopPropagation","svg","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","linegraphSVG","DOMelements","lines","labels","conversionFactor","minWidth","stepPixels","stepPixelsForced","lineOffset","master","svgElements","amountOfGroups","addGroup","graphOptions","updateGroup","removeGroup","hide","show","lineContainer","display","_redrawGroupIcons","iconHeight","iconOffset","drawIcon","backgroundHorizontal","changeCalled","activeGroups","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineWidth","minorLineHeight","majorLineWidth","majorLineHeight","_redrawLabels","amountOfSteps","stepDifference","valueAtZero","marginStartPos","maxLabelSize","_redrawLabel","_redrawLine","convertValue","invertedValue","convertedValue","characterHeight","largestWidth","majorCharWidth","minorCharWidth","textMinor","createTextNode","measureCharMinor","textMajor","measureCharMajor","groupsUsingDefaultStyles","usingDefaultStyle","zeroPosition","setZeroPosition","catmullRom","parametrization","alpha","SVGcontainer","path","fillPath","fillHeight","outline","shaded","barWidth","bar1Height","bar2Height","icon","yAxisOrientation","visibleItems","byStart","byEnd","inner","foreground","marker","visibility","Element","getLabelWidth","restack","_updateVisibleItems","markerHeight","lastMarkerHeight","dirty","displayed","offsetTop","offsetLeft","ii","repositionY","labelSet","setParent","_checkIfVisible","removeFromDataSet","removeItem","_constructByEndArray","endArray","initialPosByStart","newVisibleItems","initialPosByEnd","_checkIfInvisible","repositionX","align","groupOrder","selectable","editable","updateTime","onAdd","onUpdate","onMove","onRemove","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","selection","stackDirty","touchParams","_moveToGroup","oldGroup","UNGROUPED","box","_updateUngrouped","centerContainer","_onSelectItem","_onMultiSelectItem","_onAddItem","addCallback","fn","Function","markDirty","unselect","select","getVisibleItems","rawVisibleItems","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","lastWidth","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","firstGroupIndex","firstGroupId","ungrouped","getLabelSet","oldItemsData","getItems","_order","getGroups","_removeItem","groupData","groupOptions","oldGroupId","itemFromTarget","selected","dragLeftItem","dragRightItem","itemProps","groupFromTarget","changes","ctrlKey","srcEvent","shiftKey","oldSelection","newSelection","xAbs","newItem","itemSetFromTarget","side","iconSize","iconSpacing","textArea","drawLegendIcons","getComputedStyle","paddingTop","defaultGroup","sampling","graphHeight","barChart","handleOverlap","dataAxis","legend","abortedGraphUpdate","lastStart","rangePerPixelInv","_updateGraph","yAxisLeft","yAxisRight","legendLeft","legendRight","_updateAllGroupData","_updateGroup","groupsContent","ungroupedCounter","preprocessedGroupData","processedGroupData","groupRanges","minDate","maxDate","_getRelevantData","_convertXcoordinates","_getYRanges","_updateYAxis","_convertYcoordinates","_drawLineGraph","_drawBarGraphs","dataContainer","_applySampling","increment","amountOfPoints","xDistance","pointsPerPixel","ceil","sampledData","barCombinedData","barCombinedDataLeft","barCombinedDataRight","ignore","intersections","_getDataIntersections","_getStackedBarYRange","combinedData","accumulated","xpos","minVal","maxVal","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","_toggleAxisVisiblity","drawIcons","axisUsed","coreDistance","drawData","barPoints","heightOffset","_getSafeDrawData","nextKey","amount","resolved","prevKey","svgHeight","_catmullRom","_linear","dFill","_drawPoints","datapoints","xValue","yValue","extractedData","_catmullRomUniform","p0","p1","p2","p3","bp1","bp2","normalization","d1","d2","d3","A","N","M","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","majorLines","majorTexts","minorLines","minorTexts","lineTop","lang","parentChanged","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","insertBefore","xFirstMajorLabel","cur","_repaintMinorText","_repaintMajorText","_repaintMajorLine","_repaintMinorLine","leftTime","leftText","widthText","arr","pop","childNodes","nodeValue","_repaintDeleteButton","anchor","deleteButton","itemSetHeight","marginLeft","baseClassName","_repaintDragLeft","_repaintDragRight","contentLeft","parentWidth","boxWidth","dragLeft","dragRight","_initializeMixinLoaders","renderRefreshRate","renderTimestep","renderTime","maxPhysicsTicksPerRender","physicsDiscreteStepsize","initializing","triggerFunctions","edit","editEdge","connect","del","nodes","mass","radiusMin","radiusMax","shape","image","fixed","fontColor","fontSize","fontFace","level","highlightColor","edges","widthSelectionMultiplier","hoverWidth","fontFill","arrowScaleFactor","dash","gap","altLength","inheritColor","configurePhysics","physics","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","repulsion","nodeDistance","hierarchicalRepulsion","clustering","initialMaxNodes","clusterThreshold","reduceToNodes","chainThreshold","clusterEdgeThreshold","sectorThreshold","screenSizeThreshold","fontSizeMultiplier","maxFontSize","forceAmplification","distanceAmplification","edgeGrowth","nodeScaling","maxNodeSizeIncrements","activeAreaBoxSize","clusterLevelDifference","navigation","keyboard","speed","dataManipulation","initiallyVisible","hierarchicalLayout","levelSeparation","nodeSpacing","freezeForStabilization","smoothCurves","dynamic","roundness","dynamicSmoothCurves","maxVelocity","minVelocity","stabilize","stabilizationIterations","dragNetwork","dragNodes","hideEdgesOnDrag","hideNodesOnDrag","constants","hoverObj","controlNodesActive","images","setOnloadCallback","_redraw","xIncrement","yIncrement","zoomIncrement","_loadPhysicsSystem","_loadSectorSystem","_loadClusterSystem","_loadSelectionSystem","_loadHierarchySystem","_setTranslation","freezeSimulation","cachedFunctions","calculationNodes","calculationNodeIndices","nodeIndices","canvasTopLeft","canvasBottomRight","pointerPosition","areaCenter","previousScale","nodesData","edgesData","nodesListeners","_addNodes","_updateNodes","_removeNodes","edgesListeners","_addEdges","_updateEdges","_removeEdges","moving","timer","_setupHierarchicalLayout","zoomExtent","startWithClustering","mousetrap","MixinLoader","Activator","_getScriptPath","scripts","getElementsByTagName","src","_getRange","node","minY","maxY","minX","maxX","nodeId","_findCenter","_centerNetwork","initialZoom","disableStart","zoomLevel","numberOfNodes","factor","yDistance","xZoomLevel","yZoomLevel","_updateNodeIndexList","_clearNodeIndexList","idx","dotData","DOTToGraph","gephi","gephiData","parseGephi","_setNodes","_setEdges","_putDataInSector","_stabilize","onEdit","onEditEdge","onConnect","onDelete","editMode","newColorObj","groupname","clickToUse","activator","_createKeyBinds","_loadNavigationControls","_loadManipulationSystem","_configureSmoothCurves","pinch","_onTap","_onDoubleTap","_onRelease","_onMouseMoveTitle","reset","isActive","_moveUp","_yStopMoving","_moveDown","_moveLeft","_xStopMoving","_moveRight","_zoomIn","_stopZoom","_zoomOut","_createManipulatorBar","_deleteSelected","_getPointer","pinched","_getScale","_handleTouch","_handleDragStart","_getNodeAt","_getTranslation","isSelected","_selectObject","objectId","selectionObj","xFixed","yFixed","_handleOnDrag","_XconvertDOMtoCanvas","_XconvertCanvasToDOM","_YconvertDOMtoCanvas","_YconvertCanvasToDOM","_handleTap","_handleDoubleTap","_handleOnHold","_handleOnRelease","_zoom","scaleOld","preScaleDragPointer","DOMtoCanvas","scaleFrac","tx","ty","updateClustersDefault","postScaleDragPointer","canvasToDOM","popupObj","_checkHidePopup","checkShow","_checkShowPopup","popupTimer","edgeId","_getEdgeAt","_hoverObject","_blurObject","lastPopupNode","getTitle","isOverlappingWith","edge","connected","popup","setPosition","setText","oldNodesData","_updateSelection","angle","_resetLevels","_updateCalculationNodes","_reconnectEdges","_updateValueRange","updateLabels","setProperties","properties","oldEdgesData","oldEdge","disconnect","showInternalIds","_createBezierNodes","via","sectors","setValueRange","w","save","translate","_doInAllSectors","restore","offsetX","offsetY","_drawNodes","alwaysShow","setScaleAndPos","inArea","draw","sMax","_drawEdges","_drawControlNodes","_freezeDefinedNodes","_physicsTick","_restoreFrozenNodes","iterations","fixedData","_isMoving","vmin","isMoving","_discreteStepNodes","checkMovement","nodesPresent","discreteStepLimited","discreteStep","vminCorrected","_doInAllActiveSectors","_doInSupportSector","_animationStep","_handleNavigation","calculationTime","maxSteps","timeRequired","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","ua","toLowerCase","requiresTimeout","toggleFreeze","parentEdgeId","internalMultiplier","positionBezierNode","mixin","storePosition","dataArray","allowedToMoveX","allowedToMoveY","focusOnNode","nodePosition","requiredScale","canvasCenter","distanceFromCenter","active","networkConstants","fromId","toId","widthSelected","originalFromId","originalToId","widthFixed","lengthFixed","controlNodesEnabled","controlNodes","positions","connectedNode","_drawLine","_drawArrow","_drawArrowCenter","_drawDashLine","attachEdge","detachEdge","xFrom","yFrom","xTo","yTo","xObj","yObj","_getDistanceToEdge","_getColor","colorObj","_getLineWidth","_line","midpointX","midpointY","_pointOnLine","_label","resize","_circle","_pointOnCircle","networkScaleInv","_getViaCoordinates","xVia","yVia","quadraticCurveTo","measureText","fillRect","mozDash","setLineDash","pattern","lineDashOffset","mozDashOffset","lineCap","dashedLine","percentage","atan2","arrow","edgeSegmentLength","fromBorderDist","distanceToBorder","fromBorderPoint","toBorderDist","toBorderPoint","x1","y1","x2","y2","x3","y3","lastX","lastY","minDistance","_getDistanceToLine","px","py","something","u","nodeIdFrom","nodeIdTo","getControlNodePositions","_enableControlNodes","_disableControlNodes","_getSelectedControlNode","fromDistance","toDistance","_restoreControlNodes","defaultIndex","DEFAULT","load","url","img","Image","onload","imagelist","grouplist","dynamicEdges","reroutedEdges","fontDrawThreshold","horizontalAlignLeft","verticalAlignTop","baseRadiusValue","radiusFixed","preassignedLevel","fx","fy","vx","vy","resetCluster","dynamicEdgesLength","clusterSession","clusterSizeWidthFactor","clusterSizeHeightFactor","clusterSizeRadiusFactor","growthIndicator","networkScale","formationScale","clusterSize","containedNodes","containedEdges","clusterSessions","originalLabel","triggerFunction","groupObj","imageObj","_drawDatabase","_resizeDatabase","_drawBox","_resizeBox","_drawCircle","_resizeCircle","_drawEllipse","_resizeEllipse","_drawImage","_resizeImage","_drawText","_resizeText","_drawDot","_resizeShape","_drawSquare","_drawTriangle","_drawTriangleDown","_drawStar","_reset","clearSizeCache","_setForce","_addForce","isFixed","velocity","getDistance","globalAlpha","drawImage","textSize","getTextSize","clusterLineWidth","selectionLineWidth","borderWidthSelected","roundRect","database","diameter","circle","defaultSize","ellipse","_drawShape","radiusMultiplier","baseline","labelUnderNode","lineCount","yLine","inView","clearVelocity","updateVelocity","massBeforeClustering","energyBefore","styleAttr","fontFamily","WebkitBorderRadius","whiteSpace","maxWidth","parseDOT","parseGraph","nextPreview","isAlphaNumeric","regexAlphaNumeric","merge","o","addNode","graphs","attr","addEdge","createEdge","getToken","tokenType","TOKENTYPE","NULL","token","isComment","DELIMITER","c2","DELIMITERS","IDENTIFIER","newSyntaxError","UNKNOWN","chop","strict","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","message","maxLength","forEach2","array1","array2","elem1","elem2","convertEdge","dotEdge","graphEdge","graphData","dotNode","graphNode","subEdge","{","}","[","]",";","=",",","->","--","gephiJSON","allowedToMove","gEdges","gNodes","gEdge","source","attributes","gNode","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","listeners","events","args","scrollTop","scrollTopMin","_initAutoResize","component","_stopAutoResize","what","dataRange","getWindow","borderRootHeight","borderRootWidth","autoHeight","centerWidth","_updateScrollTop","visibilityTop","visibilityBottom","repaint","_startAutoResize","_onResize","lastHeight","watchTimer","setInterval","initialScrollTop","oldScrollTop","_getScrollTop","newScrollTop","_setScrollTop","eventType","getTouchList","collectEventData","custom","back","editNode","addDescription","edgeDescription","editEdgeDescription","createEdgeError","deleteClusterError","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","n","r2d","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","wEllipse","hEllipse","ymb","yeb","xt","yt","xi","yi","xl","yl","xr","yr","dashArray","dashLength","dashCount","slope","distRemaining","dashIndex","PhysicsMixin","ClusterMixin","SectorsMixin","SelectionMixin","ManipulationMixin","NavigationMixin","HierarchicalLayoutMixin","_loadMixin","sourceVariable","mixinFunction","_clearMixin","_loadSelectedForceSolver","_loadPhysicsConfiguration","hubThreshold","activeSector","drawingNode","blockConnectingEdgeSelection","forceAppendSelection","manipulationDiv","editModeDiv","closeDiv","_cleanNavigation","_loadNavigationElements","overlay","_onTapOverlay","windowHammer","_hasParent","deactivate","escListener","activate","unbind","_callbacks","once","self","removeListener","removeAllListeners","callbacks","cb","hasListeners","_addEvent","_characterFromEvent","fromCharCode","_MAP","_KEYCODE_MAP","_stop","tag_name","tagName","contentEditable","_modifiersMatch","modifiers1","modifiers2","_resetSequences","do_not_reset","active_sequences","_sequence_levels","_inside_sequence","_getMatches","character","modifiers","combination","matches","_isModifier","seq","combo","_eventModifiers","altKey","metaKey","_fireCallback","cancelBubble","_handleCharacter","processed_sequence_callback","_handleKey","keyCode","_ignore_next_keyup","_resetSequenceTimer","_reset_timer","_getReverseMap","_REVERSE_MAP","_pickBestAction","_bindSequence","_increaseSequence","_callbackAndReset","_bindSingle","sequence_name","sequence","_SPECIAL_ALIASES","_SHIFT_MAP","_bindMultiple","combinations",8,9,13,16,17,18,20,27,32,33,34,35,36,37,38,39,40,45,46,91,93,224,106,107,109,110,111,186,187,188,189,190,191,192,219,220,221,222,"~","!","@","#","$","%","^","&","*","(",")","_","+",":","\"","<",">","?","|","command","return","escape","_direct_map","trigger","__WEBPACK_AMD_DEFINE_RESULT__","global","dfl","defaultParsingFlags","empty","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","printMsg","msg","suppressDeprecationWarnings","warn","deprecate","firstTime","deprecateSimple","deprecations","padToken","func","leftZeroFill","ordinalizeToken","period","localeData","ordinal","Locale","Moment","config","skipOverflow","checkOverflow","copyConfig","_d","Duration","duration","normalizedInput","normalizeObjectUnits","years","quarters","quarter","months","month","weeks","week","days","day","hour","minute","second","millisecond","_milliseconds","_days","_months","_locale","_bubble","val","_isAMomentObject","_i","_f","_l","_strict","_tzm","_isUTC","_offset","_pf","momentProperties","absRound","number","targetLength","forceSign","output","positiveMomentsDifference","base","res","isAfter","momentsDifference","makeAs","isBefore","createAdder","dur","tmp","addOrSubtractDurationFromMoment","mom","isAdding","updateOffset","setTime","rawSetter","rawGetter","rawMonthSetter","input","compareArrays","dontConvert","lengthDiff","diffs","toInt","normalizeUnits","units","lowered","unitAliases","camelFunctions","inputObject","normalizedProp","makeList","setter","getter","method","results","utc","set","argumentForCoercion","coercedNumber","isFinite","daysInMonth","UTC","getUTCDate","weeksInYear","dow","doy","weekOfYear","daysInYear","isLeapYear","_a","DATE","_overflowDayOfYear","isValid","_isValid","getTime","normalizeLocale","chooseLocale","names","loadLocale","oldLocale","hasModule","code","model","zone","local","removeFormattingTokens","makeFormatFunction","formattingTokens","formatTokenFunctions","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","lastIndex","getParseRegexForToken","parseTokenOneDigit","parseTokenThreeDigits","parseTokenFourDigits","parseTokenOneToFourDigits","parseTokenSignedNumber","parseTokenSixDigits","parseTokenOneToSixDigits","parseTokenTwoDigits","parseTokenOneToThreeDigits","parseTokenWord","_meridiemParse","parseTokenTimestampMs","parseTokenTimezone","parseTokenT","parseTokenDigits","parseTokenOneOrTwoDigits","parseTokenOrdinal","RegExp","regexpEscape","unescapeFormat","timezoneMinutesFromString","string","possibleTzMatches","tzChunk","parts","parseTimezoneChunker","addTimeToArrayFromToken","datePartArray","monthsParse","_dayOfYear","parseTwoDigitYear","_isPm","isPM","_useUTC","weekdaysParse","_w","invalidWeekday","dayOfYearFromWeekInfo","weekYear","weekday","temp","GG","W","E","_week","gg","dayOfYearFromWeeks","dayOfYear","dateFromConfig","currentDate","yearToUse","currentDateArray","makeUTCDate","getUTCMonth","makeDate","setUTCMinutes","getUTCMinutes","dateFromObject","getUTCFullYear","makeDateFromStringAndFormat","ISO_8601","parseISO","parsedInput","tokens","skipped","stringLength","totalParsedInputLength","matched","p4","makeDateFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","NaN","score","l","isoRegex","isoDates","isoTimes","makeDateFromString","createFromInputFallback","makeDateFromInput","aspNetJsonRegex","ms","setUTCFullYear","parseWeekday","substituteTimeAgo","withoutSuffix","isFuture","relativeTime","posNegDuration","relativeTimeThresholds","firstDayOfWeek","firstDayOfWeekOfYear","adjustedMoment","daysToDayOfWeek","daysToAdd","getUTCDay","makeMoment","invalid","preparse","pickBy","moments","dayOfMonth","unit","makeAccessor","keepTime","daysToYears","yearsToDays","makeDurationGetter","makeGlobal","shouldDeprecate","ender","oldGlobalMoment","globalScope","VERSION","aspNetTimeSpanJsonRegex","isoDurationRegex","isoFormat","unitMillisecondFactors","Milliseconds","Seconds","Minutes","Hours","Days","Months","Years","D","Q","DDD","dayofyear","isoweekday","isoweek","weekyear","isoweekyear","ordinalizeTokens","paddedTokens","MMM","monthsShort","MMMM","dd","weekdaysMin","ddd","weekdaysShort","dddd","weekdays","isoWeek","YY","YYYY","YYYYY","YYYYYY","gggg","ggggg","isoWeekYear","GGGG","GGGGG","isoWeekday","meridiem","SS","SSS","SSSS","Z","ZZ","zoneAbbr","zz","zoneName","unix","lists","DDDD","_monthsShort","monthName","regex","_monthsParse","_weekdays","_weekdaysShort","_weekdaysMin","weekdayName","_weekdaysParse","_longDateFormat","LT","L","LL","LLL","LLLL","isLower","_calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","_relativeTime","future","past","mm","hh","MM","yy","pastFuture","_ordinal","postformat","_invalidDate","ret","parseIso","diffRes","isDuration","inp","version","defaultFormat","relativeTimeThreshold","threshold","limit","defineLocale","_abbr","abbr","langData","flags","parseZone","isDSTShifted","parsingFlags","invalidAt","keepLocalTime","getTimezoneOffset","inputString","asFloat","that","zoneDiff","startOf","humanize","fromNow","sod","isDST","getDay","endOf","isSame","localAdjust","_changeInProgress","hasAlignedHourOffset","isoWeeksInYear","weekInfo","dates","isoWeeks","toJSON","withSuffix","toIsoString","asSeconds","asMilliseconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","require","noGlobal","setup","READY","Event","determineEventTypes","Utils","each","gestures","Detection","register","onTouch","DOCUMENT","EVENT_MOVE","detect","EVENT_END","Instance","defaults","behavior","userSelect","touchAction","touchCallout","contentZooming","userDrag","tapHighlightColor","HAS_POINTEREVENTS","pointerEnabled","msPointerEnabled","HAS_TOUCHEVENTS","IS_MOBILE","NO_MOUSEEVENTS","CALCULATE_INTERVAL","EVENT_TYPES","DIRECTION_DOWN","DIRECTION_LEFT","DIRECTION_UP","DIRECTION_RIGHT","POINTER_MOUSE","POINTER_TOUCH","POINTER_PEN","EVENT_START","EVENT_RELEASE","EVENT_TOUCH","plugins","utils","dest","handler","iterator","context","inStr","find","inArray","hasParent","getCenter","getVelocity","deltaTime","getAngle","touch1","touch2","getDirection","getScale","getRotation","isVertical","setPrefixedCss","toggle","prefixes","toCamelCase","toggleBehavior","falseFn","onselectstart","ondragstart","str","preventMouseEvents","started","shouldDetect","hook","onTouchHandler","ev","triggerType","srcType","isPointer","isMouse","buttons","PointerEvent","matchType","updatePointer","doDetect","touchList","touchListLength","triggerChange","changedLength","changedTouches","evData","identifiers","identifier","pointerType","timeStamp","preventManipulation","stopDetect","pointers","touchlist","pointerEvent","pointerId","pt","MSPOINTER_TYPE_MOUSE","MSPOINTER_TYPE_TOUCH","MSPOINTER_TYPE_PEN","detection","stopped","startDetect","inst","eventData","startEvent","lastEvent","lastCalcEvent","futureCalcEvent","lastCalcData","extendEventData","instOptions","getCalculatedData","recalc","calcEv","calcData","velocityX","velocityY","interimAngle","interimDirection","startEv","lastEv","rotation","eventStartHandler","eventHandlers","createEvent","initEvent","dispatchEvent","state","dispose","eh","dragGesture","dragMaxTouches","triggered","dragMinDistance","startCenter","dragDistanceCorrection","dragLockToAxis","dragLockMinDistance","lastDirection","dragBlockVertical","dragBlockHorizontal","Drag","Gesture","holdGesture","holdTimeout","holdThreshold","Hold","Release","Infinity","Swipe","swipeMinTouches","swipeMaxTouches","swipeVelocityX","swipeVelocityY","tapGesture","sincePrev","didDoubleTap","hasMoved","tapMaxDistance","tapMaxTime","doubleTapInterval","doubleTapDistance","tapAlways","Tap","Touch","preventMouse","transformGesture","scaleThreshold","rotationThreshold","transformMinScale","transformMinRotation","Transform","clusterToFit","maxNumberOfNodes","reposition","maxLevels","forceAggregateHubs","normalizeClusterLevels","increaseClusterLevel","repositionNodes","openCluster","isMovingBeforeClustering","_nodeInActiveArea","_sector","_addSector","decreaseClusterLevel","_expandClusterNode","_updateDynamicEdges","updateClusters","zoomDirection","recursive","doNotStart","amountOfNodes","_collapseSector","_formClusters","_openClusters","_openClustersBySize","_aggregateHubs","handleChains","chainPercentage","_getChainFraction","_reduceAmountOfChains","_getHubSize","_formClustersByHub","openAll","containedNodeId","childNode","_expelChildFromParent","_unselectAll","_releaseContainedEdges","_connectEdgeBackToChild","_validateEdges","othersPresent","childNodeId","_repositionBezierNodes","_formClustersByZoom","_forceClustersByZoom","minLength","_addToCluster","_clusterToSmallestNeighbour","smallestNeighbour","smallestNeighbourNode","neighbour","onlyEqual","_formClusterFromHub","hubNode","absorptionSizeOffset","allowCluster","edgesIdarray","amountOfInitialEdges","_addToContainedEdges","_connectEdgeToCluster","_containCircularEdgesFromNode","massBefore","correction","edgeToId","edgeFromId","k","_addToReroutedEdges","maxLevel","minLevel","clusterLevel","targetLevel","average","averageSquared","hubCounter","largestHub","variance","standardDeviation","fraction","reduceAmount","chains","total","_switchToSector","sectorId","sectorType","_switchToActiveSector","_switchToFrozenSector","_switchToSupportSector","_loadLatestSector","_previousSector","_setActiveSector","newId","_forgetLastSector","_createNewSector","_deleteActiveSector","_deleteFrozenSector","_freezeSector","_activateSector","_mergeThisWithFrozen","_collapseThisToSingleCluster","sector","unqiueIdentifier","previousSector","runFunction","argument","_doInAllFrozenSectors","_drawSectorNodes","_drawAllSectorNodes","_getNodesOverlappingWith","overlappingNodes","_getAllNodesOverlappingWith","_pointerToPositionObject","positionObject","_getEdgesOverlappingWith","overlappingEdges","_getAllEdgesOverlappingWith","_addToSelection","_addToHover","_removeFromSelection","doNotTrigger","_unselectClusters","_getSelectedNodeCount","_getSelectedNode","_getSelectedEdge","_getSelectedEdgeCount","_getSelectedObjectCount","_selectionIsEmpty","_clusterInSelection","_selectConnectedEdges","_hoverConnectedEdges","_unselectConnectedEdges","append","highlightEdges","nodeIds","getSelectedNodes","edgeIds","getSelectedEdges","idArray","RangeError","selectNodes","selectEdges","_clearManipulatorBar","_restoreOverloadedFunctions","functionName","_toggleEditMode","toolbar","getElementById","boundFunction","edgeBeingEdited","selectedControlNode","addNodeButton","_createAddNodeToolbar","addEdgeButton","_createAddEdgeToolbar","editButton","_editNode","_createEditEdgeToolbar","editModeButton","backButton","_addNode","_handleConnect","_finishConnect","_selectControlNode","_controlNodeDrag","_releaseControlNode","newNode","_editEdge","alert","smooth","connectFromId","_createEdge","defaultData","finalizedData","sourceNodeId","targetNodeId","selectedNodes","selectedEdges","wrapper","navigationDivs","navigationDivActions","_stopMovement","hubsize","definedLevel","undefinedLevel","_changeConstants","_determineLevels","distribution","_getDistribution","_placeNodesByHierarchy","minPos","_placeBranchNodes","maxCount","_setLevel","parentId","parentLevel","nodeMoved","_restoreNodes","graphToggleSmoothCurves","graph_toggleSmooth","graphRepositionNodes","showValueOfRange","graphGenerateOptions","optionsSpecific","radioButton1","radioButton2","checked","backupConstants","optionsDiv","switchConfigurations","radioButton","querySelector","tableId","table","constantsVariableName","valueId","rangeValue","_overWriteGraphConstants","RepulsionMixin","HierarchialRepulsionMixin","BarnesHutMixin","_toggleBarnesHut","barnesHutTree","_initializeForceCalculation","_calculateForces","_calculateGravitationalForces","_calculateNodeForces","_calculateSpringForcesWithSupport","_calculateHierarchicalSpringForces","_calculateSpringForces","supportNodes","supportNodeId","gravity","gravityForce","edgeLength","springForce","combinedClusterSize","node1","node2","node3","_calculateSpringForce","physicsConfiguration","hierarchicalLayoutDirections","parentElement","rangeElement","radioButton3","graph_repositionNodes","graph_generateOptions","nameArray","webpackContext","req","resolve","repulsingForce","a_base","minimumDistance","steepness","springFx","springFy","totalFx","totalFy","correctionFx","correctionFy","nodeCount","_formBarnesHutTree","_getForceContribution","children","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","MAX_VALUE","sizeDiff","minimumTreeSize","rootSize","halfRootSize","centerX","centerY","_splitBranch","_placeInTree","_updateBranchMass","totalMass","totalMassInv","biggestSize","skipMassUpdate","_placeInRegion","region","containedNode","_insertRegion","childSize","_drawTree","_drawBranch","branch","webpackPolyfill","paths"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"vis.map","sources":["./dist/vis.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","util","DOMutil","DataSet","DataView","Graph3d","graph3d","Camera","Filter","Point2d","Point3d","Slider","StepNumber","Timeline","Graph2d","timeline","DataStep","Range","stack","TimeStep","components","items","Item","ItemBox","ItemPoint","ItemRange","Component","CurrentTime","CustomTime","DataAxis","GraphGroup","Group","ItemSet","Legend","LineGraph","TimeAxis","Network","network","Edge","Groups","Images","Node","Popup","dotparser","gephiParser","Graph","Error","moment","hammer","isNumber","object","Number","isString","String","isDate","Date","match","ASPDateRegex","exec","isNaN","parse","isDataTable","google","visualization","DataTable","randomUUID","S4","Math","floor","random","toString","extend","a","i","len","arguments","length","other","prop","hasOwnProperty","selectiveExtend","props","Array","isArray","selectiveDeepExtend","b","TypeError","constructor","Object","undefined","deepExtend","selectiveNotDeepExtend","indexOf","equalArray","convert","type","Boolean","valueOf","isMoment","toDate","getType","toISOString","value","getAbsoluteLeft","elem","getBoundingClientRect","left","window","pageXOffset","getAbsoluteTop","top","pageYOffset","addClassName","className","classes","split","push","join","removeClassName","index","splice","forEach","callback","toArray","array","updateProperty","key","addEventListener","element","action","listener","useCapture","navigator","userAgent","attachEvent","removeEventListener","detachEvent","preventDefault","event","returnValue","getTarget","target","srcElement","nodeType","parentNode","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","GiveDec","Hex","Value","eval","GiveHex","Dec","parseColor","color","isValidRGB","rgb","substr","RGBToHex","isValidHex","hsv","hexToHSV","lighterColorHSV","h","s","v","min","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","hexToRGB","hex","replace","toUpperCase","substring","d","e","f","r","g","red","green","blue","RGBToHSV","minRGB","maxRGB","max","hue","saturation","HSVToRGB","q","t","isOk","test","selectiveBridgeObject","fields","referenceObject","objectTo","create","bridgeObject","mergeOptions","mergeTarget","options","enabled","binarySearch","orderedItems","range","field","field2","maxIterations","iteration","found","low","high","newLow","newHigh","guess","isVisible","start","console","log","binarySearchGeneric","sidePreference","newGuess","prevValue","nextValue","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","removeChild","getSVGElement","svgContainer","shift","document","createElementNS","appendChild","getDOMElement","DOMContainer","createElement","drawPoint","x","y","group","point","drawPoints","style","setAttributeNS","size","drawBar","width","height","rect","data","_options","_data","_fieldId","fieldId","_type","_subscribers","add","prototype","on","subscribers","subscribe","off","filter","unsubscribe","_trigger","params","senderId","concat","subscriber","addedIds","me","_addItem","columns","_getColumnNames","row","rows","getNumberOfRows","item","col","cols","getValue","update","updatedIds","addOrUpdate","_updateItem","get","ids","firstType","returnType","allowedValues","itemId","_getItem","order","_sort","_filterFields","_appendRow","result","getIds","getDataSet","map","mappedItems","filteredItem","name","sort","av","bv","remove","removedId","removedIds","_remove","clear","keys","maxField","itemField","minField","distinct","values","fieldType","count","exists","types","raw","converted","JSON","stringify","dataTable","getNumberOfColumns","getColumnId","getColumnLabel","addRow","setValue","_ids","_onEvent","apply","setData","viewOptions","getArguments","defaultFilter","dataSet","added","updated","removed","container","SyntaxError","containerElement","margin","defaultXCenter","defaultYCenter","xLabel","yLabel","zLabel","filterLabel","legendLabel","STYLE","DOT","showPerspective","showGrid","keepAspectRatio","showShadow","showGrayBottom","showTooltip","verticalRatio","animationInterval","animationPreload","camera","eye","dataPoints","colX","colY","colZ","colValue","colFilter","xMin","xStep","xMax","yMin","yStep","yMax","zMin","zStep","zMax","valueMin","valueMax","xBarWidth","yBarWidth","colorAxis","colorGrid","colorDot","colorDotBorder","setOptions","Emitter","_setScale","scale","z","xCenter","yCenter","zCenter","setArmLocation","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","ax","ay","az","cx","getCameraLocation","cy","cz","sinTx","sin","getCameraRotation","cosTx","cos","sinTy","cosTy","sinTz","cosTz","dx","dy","dz","bx","by","ex","ey","ez","getArmLength","xcenter","frame","canvas","clientWidth","ycenter","_setBackgroundColor","backgroundColor","fill","stroke","strokeWidth","borderColor","borderWidth","borderStyle","BAR","BARCOLOR","BARSIZE","DOTLINE","DOTCOLOR","DOTSIZE","GRID","LINE","SURFACE","_getStyleNumber","styleName","_determineColumnIndexes","counter","column","getDistinctValues","distinctValues","getColumnRange","minMax","_dataInitialize","rawData","_onChange","dataFilter","setOnLoadCallback","redraw","withBars","defaultXBarWidth","dataX","defaultYBarWidth","dataY","xRange","defaultXMin","defaultXMax","defaultXStep","yRange","defaultYMin","defaultYMax","defaultYStep","zRange","defaultZMin","defaultZMax","defaultZStep","valueRange","defaultValueMin","defaultValueMax","_getDataPoints","sortNumber","obj","dataMatrix","xIndex","yIndex","trans","screen","bottom","pointRight","pointTop","pointCross","hasChildNodes","firstChild","position","overflow","noCanvas","fontWeight","padding","innerHTML","onmousedown","_onMouseDown","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","onkeydown","setSize","_resizeCanvas","clientHeight","animationStart","slider","play","animationStop","stop","_resizeCenter","charAt","parseFloat","setCameraPosition","pos","horizontal","vertical","setArmRotation","distance","setArmLength","getCameraPosition","getArmRotation","_readData","_redrawFilter","animationAutoStart","cameraPosition","styleNumber","tooltip","showAnimationControls","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGrid","_redrawDataLine","_redrawDataBar","_redrawDataDot","_redrawInfo","_redrawLegend","ctx","getContext","clearRect","widthMin","widthMax","dotSize","right","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","fillStyle","closePath","gridLineLen","step","getCurrent","next","end","textAlign","textBaseline","fillText","label","visible","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","from","to","prettyStep","text","xText","yText","zText","offset","xOffset","yOffset","xMin2d","xMax2d","gridLenX","gridLenY","textMargin","armAngle","H","S","V","R","G","B","C","Hi","X","abs","parseInt","cross","topSideVisible","zAvg","transBottom","dist","sortDepth","aDiff","subtract","bDiff","crossproduct","crossProduct","radius","arc","PI","j","surface","corners","xWidth","yWidth","surfaces","center","avg","transCenter","diff","leftButtonDown","_onMouseUp","which","button","touchDown","startMouseX","getMouseX","startMouseY","getMouseY","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","diffX","diffY","horizontalNew","verticalNew","snapAngle","snapValue","round","parameters","emit","delay","mouseX","mouseY","tooltipTimeout","clearTimeout","_hideTooltip","dataPoint","_dataPointFromXY","_showTooltip","setTimeout","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","delta","wheelDelta","detail","oldLength","newLength","_insideTriangle","triangle","sign","as","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","sqrt","content","line","dot","dom","borderRadius","boxShadow","borderLeft","contentWidth","offsetWidth","contentHeight","offsetHeight","lineHeight","dotWidth","dotHeight","clientX","targetTouches","clientY","armLocation","armRotation","armLength","cameraLocation","cameraRotation","calculateCameraOrientation","rot","graph","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","dataView","progress","sub","sum","prev","bar","MozBorderRadius","slide","onclick","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","setIndex","playNext","interval","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","_start","_end","_step","precision","_current","setRange","setStep","calculatePrettyStep","log10","LN10","step1","pow","step2","step5","toPrecision","getStep","defaultOptions","autoResize","orientation","maxHeight","minHeight","_create","body","domProps","emitter","bind","snap","toScreen","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","timeAxis","currentTime","customTime","itemSet","itemsData","groupsData","setItems","Core","newDataSet","initialLoad","fit","setWindow","setGroups","groups","setSelection","focus","getSelection","itemData","middle","getItemRange","dataset","minItem","maxStartItem","maxEndItem","linegraph","getLegend","groupId","isGroupVisible","visibility","minimumStep","containerHeight","customRange","current","autoScale","stepIndex","marginStart","marginEnd","deadSpace","majorSteps","minorSteps","setMinimumStep","setFirst","safeSize","minimumStepValue","orderOfMagnitude","minorStepIdx","magnitudefactor","solutionFound","stepSize","niceStart","niceEnd","roundToMinor","marginRange","rounded","hasNext","previous","slice","isMajor","now","hours","minutes","seconds","milliseconds","clone","direction","moveable","zoomable","zoomMin","zoomMax","touch","_onDragStart","_onDrag","_onDragEnd","_onHold","_onMouseWheel","_onTouch","_onPinch","validateDirection","getPointer","pageX","pageY","hammerUtil","changed","_applyRange","newStart","newEnd","getRange","conversion","allowDragging","gesture","deltaX","deltaY","diffRange","fakeGesture","pointer","pointerDate","_pointerToDate","zoom","touches","initDate","move","EPSILON","orderByStart","orderByEnd","aTime","bTime","force","iMax","axis","collidingItem","jj","collision","nostack","SCALE","DAY","MILLISECOND","SECOND","MINUTE","HOUR","WEEKDAY","MONTH","YEAR","first","setFullYear","getFullYear","setMonth","setDate","setHours","setMinutes","setSeconds","setMilliseconds","getMilliseconds","getSeconds","getMinutes","getHours","getDate","getMonth","setScale","newScale","newStep","setAutoScale","enable","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","date","year","getLabelMinor","format","getLabelMajor","destroy","_isResized","resized","_previousWidth","_previousHeight","showCurrentTime","locales","locale","parent","backgroundVertical","title","time","currentTimeTimer","showCustomTime","eventParams","Hammer","drag","prevent_default","setCustomTime","getCustomTime","dragging","stopPropagation","svg","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","linegraphSVG","DOMelements","lines","labels","conversionFactor","minWidth","stepPixels","stepPixelsForced","lineOffset","master","svgElements","amountOfGroups","addGroup","graphOptions","updateGroup","removeGroup","hide","show","lineContainer","display","_redrawGroupIcons","iconHeight","iconOffset","drawIcon","backgroundHorizontal","changeCalled","activeGroups","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineWidth","minorLineHeight","majorLineWidth","majorLineHeight","_redrawLabels","amountOfSteps","stepDifference","valueAtZero","marginStartPos","maxLabelSize","_redrawLabel","_redrawLine","convertValue","invertedValue","convertedValue","characterHeight","largestWidth","majorCharWidth","minorCharWidth","textMinor","createTextNode","measureCharMinor","textMajor","measureCharMajor","groupsUsingDefaultStyles","usingDefaultStyle","zeroPosition","setZeroPosition","catmullRom","parametrization","alpha","SVGcontainer","path","fillPath","fillHeight","outline","shaded","barWidth","bar1Height","bar2Height","icon","yAxisOrientation","visibleItems","byStart","byEnd","inner","foreground","marker","Element","getLabelWidth","restack","_updateVisibleItems","markerHeight","lastMarkerHeight","dirty","displayed","offsetTop","offsetLeft","ii","repositionY","labelSet","setParent","_checkIfVisible","removeFromDataSet","removeItem","_constructByEndArray","endArray","initialPosByStart","newVisibleItems","initialPosByEnd","_checkIfInvisible","repositionX","align","groupOrder","selectable","editable","updateTime","onAdd","onUpdate","onMove","onRemove","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","selection","stackDirty","touchParams","_moveToGroup","oldGroup","UNGROUPED","box","_updateUngrouped","centerContainer","_onSelectItem","_onMultiSelectItem","_onAddItem","addCallback","fn","Function","markDirty","unselect","select","getVisibleItems","rawVisibleItems","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","lastWidth","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","firstGroupIndex","firstGroupId","ungrouped","getLabelSet","oldItemsData","getItems","_order","getGroups","_removeItem","groupData","groupOptions","oldGroupId","itemFromTarget","selected","dragLeftItem","dragRightItem","itemProps","groupFromTarget","changes","ctrlKey","srcEvent","shiftKey","oldSelection","newSelection","xAbs","newItem","itemSetFromTarget","side","iconSize","iconSpacing","textArea","drawLegendIcons","getComputedStyle","paddingTop","defaultGroup","sampling","graphHeight","barChart","handleOverlap","dataAxis","legend","abortedGraphUpdate","lastStart","rangePerPixelInv","_updateGraph","yAxisLeft","yAxisRight","legendLeft","legendRight","_updateAllGroupData","_updateGroup","groupsContent","ungroupedCounter","preprocessedGroupData","processedGroupData","groupRanges","minDate","maxDate","_getRelevantData","_convertXcoordinates","_getYRanges","_updateYAxis","_convertYcoordinates","_drawLineGraph","_drawBarGraphs","dataContainer","_applySampling","increment","amountOfPoints","xDistance","pointsPerPixel","ceil","sampledData","barCombinedData","barCombinedDataLeft","barCombinedDataRight","ignore","intersections","_getDataIntersections","_getStackedBarYRange","combinedData","accumulated","xpos","minVal","maxVal","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","_toggleAxisVisiblity","drawIcons","axisUsed","coreDistance","drawData","barPoints","heightOffset","_getSafeDrawData","nextKey","amount","resolved","prevKey","svgHeight","_catmullRom","_linear","dFill","_drawPoints","datapoints","xValue","yValue","extractedData","_catmullRomUniform","p0","p1","p2","p3","bp1","bp2","normalization","d1","d2","d3","A","N","M","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","majorLines","majorTexts","minorLines","minorTexts","lineTop","lang","parentChanged","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","insertBefore","xFirstMajorLabel","cur","_repaintMinorText","_repaintMajorText","_repaintMajorLine","_repaintMinorLine","leftTime","leftText","widthText","arr","pop","childNodes","nodeValue","_repaintDeleteButton","anchor","deleteButton","itemSetHeight","marginLeft","baseClassName","_repaintDragLeft","_repaintDragRight","contentLeft","parentWidth","boxWidth","dragLeft","dragRight","_initializeMixinLoaders","renderRefreshRate","renderTimestep","renderTime","maxPhysicsTicksPerRender","physicsDiscreteStepsize","initializing","triggerFunctions","edit","editEdge","connect","del","nodes","mass","radiusMin","radiusMax","shape","image","fixed","fontColor","fontSize","fontFace","level","highlightColor","edges","widthSelectionMultiplier","hoverWidth","fontFill","arrowScaleFactor","dash","gap","altLength","inheritColor","configurePhysics","physics","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","repulsion","nodeDistance","hierarchicalRepulsion","clustering","initialMaxNodes","clusterThreshold","reduceToNodes","chainThreshold","clusterEdgeThreshold","sectorThreshold","screenSizeThreshold","fontSizeMultiplier","maxFontSize","forceAmplification","distanceAmplification","edgeGrowth","nodeScaling","maxNodeSizeIncrements","activeAreaBoxSize","clusterLevelDifference","navigation","keyboard","speed","dataManipulation","initiallyVisible","hierarchicalLayout","levelSeparation","nodeSpacing","freezeForStabilization","smoothCurves","dynamic","roundness","dynamicSmoothCurves","maxVelocity","minVelocity","stabilize","stabilizationIterations","dragNetwork","dragNodes","hideEdgesOnDrag","hideNodesOnDrag","constants","hoverObj","controlNodesActive","images","setOnloadCallback","_redraw","xIncrement","yIncrement","zoomIncrement","_loadPhysicsSystem","_loadSectorSystem","_loadClusterSystem","_loadSelectionSystem","_loadHierarchySystem","_setTranslation","freezeSimulation","cachedFunctions","calculationNodes","calculationNodeIndices","nodeIndices","canvasTopLeft","canvasBottomRight","pointerPosition","areaCenter","previousScale","nodesData","edgesData","nodesListeners","_addNodes","_updateNodes","_removeNodes","edgesListeners","_addEdges","_updateEdges","_removeEdges","moving","timer","_setupHierarchicalLayout","zoomExtent","startWithClustering","mousetrap","MixinLoader","Activator","_getScriptPath","scripts","getElementsByTagName","src","_getRange","node","minY","maxY","minX","maxX","nodeId","_findCenter","_centerNetwork","initialZoom","disableStart","zoomLevel","numberOfNodes","factor","yDistance","xZoomLevel","yZoomLevel","_updateNodeIndexList","_clearNodeIndexList","idx","dotData","DOTToGraph","gephi","gephiData","parseGephi","_setNodes","_setEdges","_putDataInSector","_stabilize","onEdit","onEditEdge","onConnect","onDelete","editMode","newColorObj","groupname","clickToUse","activator","_createKeyBinds","_loadNavigationControls","_loadManipulationSystem","_configureSmoothCurves","pinch","_onTap","_onDoubleTap","_onRelease","_onMouseMoveTitle","reset","isActive","_moveUp","_yStopMoving","_moveDown","_moveLeft","_xStopMoving","_moveRight","_zoomIn","_stopZoom","_zoomOut","_createManipulatorBar","_deleteSelected","_getPointer","pinched","_getScale","_handleTouch","_handleDragStart","_getNodeAt","_getTranslation","isSelected","_selectObject","objectId","selectionObj","xFixed","yFixed","_handleOnDrag","_XconvertDOMtoCanvas","_XconvertCanvasToDOM","_YconvertDOMtoCanvas","_YconvertCanvasToDOM","_handleTap","_handleDoubleTap","_handleOnHold","_handleOnRelease","_zoom","scaleOld","preScaleDragPointer","DOMtoCanvas","scaleFrac","tx","ty","updateClustersDefault","postScaleDragPointer","canvasToDOM","popupObj","_checkHidePopup","checkShow","_checkShowPopup","popupTimer","edgeId","_getEdgeAt","_hoverObject","_blurObject","lastPopupNode","getTitle","isOverlappingWith","edge","connected","popup","setPosition","setText","oldNodesData","_updateSelection","angle","_resetLevels","_updateCalculationNodes","_reconnectEdges","_updateValueRange","updateLabels","setProperties","properties","oldEdgesData","oldEdge","disconnect","showInternalIds","_createBezierNodes","via","sectors","setValueRange","w","save","translate","_doInAllSectors","restore","offsetX","offsetY","_drawNodes","alwaysShow","setScaleAndPos","inArea","draw","sMax","_drawEdges","_drawControlNodes","_freezeDefinedNodes","_physicsTick","_restoreFrozenNodes","iterations","fixedData","_isMoving","vmin","isMoving","_discreteStepNodes","checkMovement","nodesPresent","discreteStepLimited","discreteStep","vminCorrected","_doInAllActiveSectors","_doInSupportSector","_animationStep","_handleNavigation","calculationTime","maxSteps","timeRequired","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","ua","toLowerCase","requiresTimeout","toggleFreeze","parentEdgeId","internalMultiplier","positionBezierNode","mixin","storePosition","dataArray","allowedToMoveX","allowedToMoveY","focusOnNode","nodePosition","requiredScale","canvasCenter","distanceFromCenter","active","networkConstants","fromId","toId","widthSelected","originalFromId","originalToId","widthFixed","lengthFixed","controlNodesEnabled","controlNodes","positions","connectedNode","_drawLine","_drawArrow","_drawArrowCenter","_drawDashLine","attachEdge","detachEdge","xFrom","yFrom","xTo","yTo","xObj","yObj","_getDistanceToEdge","_getColor","colorObj","_getLineWidth","_line","midpointX","midpointY","_pointOnLine","_label","resize","_circle","_pointOnCircle","networkScaleInv","_getViaCoordinates","xVia","yVia","quadraticCurveTo","measureText","fillRect","mozDash","setLineDash","pattern","lineDashOffset","mozDashOffset","lineCap","dashedLine","percentage","atan2","arrow","edgeSegmentLength","fromBorderDist","distanceToBorder","fromBorderPoint","toBorderDist","toBorderPoint","x1","y1","x2","y2","x3","y3","lastX","lastY","minDistance","_getDistanceToLine","px","py","something","u","nodeIdFrom","nodeIdTo","getControlNodePositions","_enableControlNodes","_disableControlNodes","_getSelectedControlNode","fromDistance","toDistance","_restoreControlNodes","defaultIndex","DEFAULT","load","url","img","Image","onload","imagelist","grouplist","dynamicEdges","reroutedEdges","fontDrawThreshold","horizontalAlignLeft","verticalAlignTop","baseRadiusValue","radiusFixed","preassignedLevel","fx","fy","vx","vy","resetCluster","dynamicEdgesLength","clusterSession","clusterSizeWidthFactor","clusterSizeHeightFactor","clusterSizeRadiusFactor","growthIndicator","networkScale","formationScale","clusterSize","containedNodes","containedEdges","clusterSessions","originalLabel","triggerFunction","groupObj","imageObj","_drawDatabase","_resizeDatabase","_drawBox","_resizeBox","_drawCircle","_resizeCircle","_drawEllipse","_resizeEllipse","_drawImage","_resizeImage","_drawText","_resizeText","_drawDot","_resizeShape","_drawSquare","_drawTriangle","_drawTriangleDown","_drawStar","_reset","clearSizeCache","_setForce","_addForce","isFixed","velocity","getDistance","globalAlpha","drawImage","textSize","getTextSize","clusterLineWidth","selectionLineWidth","borderWidthSelected","roundRect","database","diameter","circle","defaultSize","ellipse","_drawShape","radiusMultiplier","baseline","labelUnderNode","lineCount","yLine","inView","clearVelocity","updateVelocity","massBeforeClustering","energyBefore","styleAttr","fontFamily","WebkitBorderRadius","whiteSpace","maxWidth","parseDOT","parseGraph","nextPreview","isAlphaNumeric","regexAlphaNumeric","merge","o","addNode","graphs","attr","addEdge","createEdge","getToken","tokenType","TOKENTYPE","NULL","token","isComment","DELIMITER","c2","DELIMITERS","IDENTIFIER","newSyntaxError","UNKNOWN","chop","strict","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","message","maxLength","forEach2","array1","array2","elem1","elem2","convertEdge","dotEdge","graphEdge","graphData","dotNode","graphNode","subEdge","{","}","[","]",";","=",",","->","--","gephiJSON","allowedToMove","gEdges","gNodes","gEdge","source","attributes","gNode","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","listeners","events","args","scrollTop","scrollTopMin","_initAutoResize","component","_stopAutoResize","what","dataRange","getWindow","borderRootHeight","borderRootWidth","autoHeight","centerWidth","_updateScrollTop","visibilityTop","visibilityBottom","repaint","_startAutoResize","_onResize","lastHeight","watchTimer","setInterval","initialScrollTop","oldScrollTop","_getScrollTop","newScrollTop","_setScrollTop","eventType","getTouchList","collectEventData","custom","back","editNode","addDescription","edgeDescription","editEdgeDescription","createEdgeError","deleteClusterError","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","n","r2d","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","wEllipse","hEllipse","ymb","yeb","xt","yt","xi","yi","xl","yl","xr","yr","dashArray","dashLength","dashCount","slope","distRemaining","dashIndex","PhysicsMixin","ClusterMixin","SectorsMixin","SelectionMixin","ManipulationMixin","NavigationMixin","HierarchicalLayoutMixin","_loadMixin","sourceVariable","mixinFunction","_clearMixin","_loadSelectedForceSolver","_loadPhysicsConfiguration","hubThreshold","activeSector","drawingNode","blockConnectingEdgeSelection","forceAppendSelection","manipulationDiv","editModeDiv","closeDiv","_cleanNavigation","_loadNavigationElements","overlay","_onTapOverlay","windowHammer","_hasParent","deactivate","escListener","activate","unbind","_callbacks","once","self","removeListener","removeAllListeners","callbacks","cb","hasListeners","_addEvent","_characterFromEvent","fromCharCode","_MAP","_KEYCODE_MAP","_stop","tag_name","tagName","contentEditable","_modifiersMatch","modifiers1","modifiers2","_resetSequences","do_not_reset","active_sequences","_sequence_levels","_inside_sequence","_getMatches","character","modifiers","combination","matches","_isModifier","seq","combo","_eventModifiers","altKey","metaKey","_fireCallback","cancelBubble","_handleCharacter","processed_sequence_callback","_handleKey","keyCode","_ignore_next_keyup","_resetSequenceTimer","_reset_timer","_getReverseMap","_REVERSE_MAP","_pickBestAction","_bindSequence","_increaseSequence","_callbackAndReset","_bindSingle","sequence_name","sequence","_SPECIAL_ALIASES","_SHIFT_MAP","_bindMultiple","combinations",8,9,13,16,17,18,20,27,32,33,34,35,36,37,38,39,40,45,46,91,93,224,106,107,109,110,111,186,187,188,189,190,191,192,219,220,221,222,"~","!","@","#","$","%","^","&","*","(",")","_","+",":","\"","<",">","?","|","command","return","escape","_direct_map","trigger","__WEBPACK_AMD_DEFINE_RESULT__","global","dfl","defaultParsingFlags","empty","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","deprecate","msg","printMsg","suppressDeprecationWarnings","warn","firstTime","padToken","func","leftZeroFill","ordinalizeToken","period","ordinal","Language","Moment","config","checkOverflow","Duration","duration","normalizedInput","normalizeObjectUnits","years","quarters","quarter","months","month","weeks","week","days","day","hour","minute","second","millisecond","_milliseconds","_days","_months","_bubble","cloneMoment","momentProperties","absRound","number","targetLength","forceSign","output","addOrSubtractDurationFromMoment","mom","isAdding","updateOffset","_d","setTime","rawSetter","rawGetter","rawMonthSetter","input","compareArrays","dontConvert","lengthDiff","diffs","toInt","normalizeUnits","units","lowered","unitAliases","camelFunctions","inputObject","normalizedProp","makeList","setter","getter","method","_lang","results","utc","set","argumentForCoercion","coercedNumber","isFinite","daysInMonth","UTC","getUTCDate","weeksInYear","dow","doy","weekOfYear","daysInYear","isLeapYear","_a","_pf","DATE","_overflowDayOfYear","isValid","_isValid","getTime","_strict","normalizeLanguage","makeAs","model","_isUTC","zone","_offset","local","loadLang","abbr","languages","unloadLang","getLangDefinition","k","hasModule","removeFormattingTokens","makeFormatFunction","formattingTokens","formatTokenFunctions","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","lastIndex","getParseRegexForToken","parseTokenOneDigit","parseTokenThreeDigits","parseTokenFourDigits","parseTokenOneToFourDigits","parseTokenSignedNumber","parseTokenSixDigits","parseTokenOneToSixDigits","parseTokenTwoDigits","parseTokenOneToThreeDigits","parseTokenWord","_l","_meridiemParse","parseTokenTimestampMs","parseTokenTimezone","parseTokenT","parseTokenDigits","parseTokenOneOrTwoDigits","parseTokenOrdinal","RegExp","regexpEscape","unescapeFormat","timezoneMinutesFromString","string","possibleTzMatches","tzChunk","parts","parseTimezoneChunker","addTimeToArrayFromToken","datePartArray","monthsParse","_dayOfYear","parseTwoDigitYear","_isPm","isPM","_useUTC","_tzm","weekdaysParse","_w","invalidWeekday","dayOfYearFromWeekInfo","weekYear","weekday","temp","GG","W","E","_week","gg","dayOfYearFromWeeks","dayOfYear","dateFromConfig","currentDate","yearToUse","currentDateArray","makeUTCDate","getUTCMonth","makeDate","setUTCMinutes","getUTCMinutes","dateFromObject","_i","getUTCFullYear","makeDateFromStringAndFormat","_f","ISO_8601","parseISO","parsedInput","tokens","skipped","stringLength","totalParsedInputLength","matched","p4","makeDateFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","NaN","score","l","isoRegex","isoDates","isoTimes","makeDateFromString","createFromInputFallback","makeDateFromInput","aspNetJsonRegex","ms","setUTCFullYear","parseWeekday","language","substituteTimeAgo","withoutSuffix","isFuture","relativeTime","relativeTimeThresholds","dd","dm","firstDayOfWeek","firstDayOfWeekOfYear","adjustedMoment","daysToDayOfWeek","daysToAdd","getUTCDay","makeMoment","invalid","preparse","pickBy","moments","res","dayOfMonth","unit","makeAccessor","keepTime","makeDurationGetter","makeDurationAsGetter","makeGlobal","shouldDeprecate","ender","oldGlobalMoment","globalScope","VERSION","_isAMomentObject","aspNetTimeSpanJsonRegex","isoDurationRegex","isoFormat","unitMillisecondFactors","Milliseconds","Seconds","Minutes","Hours","Days","Months","Years","D","Q","DDD","dayofyear","isoweekday","isoweek","weekyear","isoweekyear","ordinalizeTokens","paddedTokens","MMM","monthsShort","MMMM","weekdaysMin","ddd","weekdaysShort","dddd","weekdays","isoWeek","YY","YYYY","YYYYY","YYYYYY","gggg","ggggg","isoWeekYear","GGGG","GGGGG","isoWeekday","meridiem","SS","SSS","SSSS","Z","ZZ","zoneAbbr","zz","zoneName","unix","lists","DDDD","_monthsShort","monthName","regex","_monthsParse","_weekdays","_weekdaysShort","_weekdaysMin","weekdayName","_weekdaysParse","_longDateFormat","LT","L","LL","LLL","LLLL","val","isLower","_calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","_relativeTime","future","past","mm","hh","MM","yy","pastFuture","_ordinal","postformat","_invalidDate","ret","parseIso","isDuration","inp","version","defaultFormat","relativeTimeThreshold","threshold","limit","_abbr","langData","flags","parseZone","isDSTShifted","parsingFlags","invalidAt","inputString","dur","asFloat","that","zoneDiff","startOf","humanize","fromNow","sod","isDST","getDay","endOf","isAfter","isBefore","isSame","getTimezoneOffset","_changeInProgress","hasAlignedHourOffset","isoWeeksInYear","weekInfo","dates","isoWeeks","toJSON","withSuffix","difference","toIsoString","asSeconds","asMonths","require","noGlobal","setup","READY","Event","determineEventTypes","Utils","each","gestures","Detection","register","onTouch","DOCUMENT","EVENT_MOVE","detect","EVENT_END","Instance","defaults","behavior","userSelect","touchAction","touchCallout","contentZooming","userDrag","tapHighlightColor","HAS_POINTEREVENTS","pointerEnabled","msPointerEnabled","HAS_TOUCHEVENTS","IS_MOBILE","NO_MOUSEEVENTS","CALCULATE_INTERVAL","EVENT_TYPES","DIRECTION_DOWN","DIRECTION_LEFT","DIRECTION_UP","DIRECTION_RIGHT","POINTER_MOUSE","POINTER_TOUCH","POINTER_PEN","EVENT_START","EVENT_RELEASE","EVENT_TOUCH","plugins","utils","dest","handler","iterator","context","inStr","find","inArray","hasParent","getCenter","getVelocity","deltaTime","getAngle","touch1","touch2","getDirection","getScale","getRotation","isVertical","setPrefixedCss","toggle","prefixes","toCamelCase","toggleBehavior","falseFn","onselectstart","ondragstart","str","preventMouseEvents","started","shouldDetect","hook","onTouchHandler","ev","triggerType","srcType","isPointer","isMouse","buttons","PointerEvent","matchType","updatePointer","doDetect","touchList","touchListLength","triggerChange","changedLength","changedTouches","evData","identifiers","identifier","pointerType","timeStamp","preventManipulation","stopDetect","pointers","touchlist","pointerEvent","pointerId","pt","MSPOINTER_TYPE_MOUSE","MSPOINTER_TYPE_TOUCH","MSPOINTER_TYPE_PEN","detection","stopped","startDetect","inst","eventData","startEvent","lastEvent","lastCalcEvent","futureCalcEvent","lastCalcData","extendEventData","instOptions","getCalculatedData","recalc","calcEv","calcData","velocityX","velocityY","interimAngle","interimDirection","startEv","lastEv","rotation","eventStartHandler","eventHandlers","createEvent","initEvent","dispatchEvent","state","dispose","eh","dragGesture","dragMaxTouches","triggered","dragMinDistance","startCenter","dragDistanceCorrection","dragLockToAxis","dragLockMinDistance","lastDirection","dragBlockVertical","dragBlockHorizontal","Drag","Gesture","holdGesture","holdTimeout","holdThreshold","Hold","Release","Infinity","Swipe","swipeMinTouches","swipeMaxTouches","swipeVelocityX","swipeVelocityY","tapGesture","sincePrev","didDoubleTap","hasMoved","tapMaxDistance","tapMaxTime","doubleTapInterval","doubleTapDistance","tapAlways","Tap","Touch","preventMouse","transformGesture","scaleThreshold","rotationThreshold","transformMinScale","transformMinRotation","Transform","clusterToFit","maxNumberOfNodes","reposition","maxLevels","forceAggregateHubs","normalizeClusterLevels","increaseClusterLevel","repositionNodes","openCluster","isMovingBeforeClustering","_nodeInActiveArea","_sector","_addSector","decreaseClusterLevel","_expandClusterNode","_updateDynamicEdges","updateClusters","zoomDirection","recursive","doNotStart","amountOfNodes","_collapseSector","_formClusters","_openClusters","_openClustersBySize","_aggregateHubs","handleChains","chainPercentage","_getChainFraction","_reduceAmountOfChains","_getHubSize","_formClustersByHub","openAll","containedNodeId","childNode","_expelChildFromParent","_unselectAll","_releaseContainedEdges","_connectEdgeBackToChild","_validateEdges","othersPresent","childNodeId","_repositionBezierNodes","_formClustersByZoom","_forceClustersByZoom","minLength","_addToCluster","_clusterToSmallestNeighbour","smallestNeighbour","smallestNeighbourNode","neighbour","onlyEqual","_formClusterFromHub","hubNode","absorptionSizeOffset","allowCluster","edgesIdarray","amountOfInitialEdges","_addToContainedEdges","_connectEdgeToCluster","_containCircularEdgesFromNode","massBefore","correction","edgeToId","edgeFromId","_addToReroutedEdges","maxLevel","minLevel","clusterLevel","targetLevel","average","averageSquared","hubCounter","largestHub","variance","standardDeviation","fraction","reduceAmount","chains","total","_switchToSector","sectorId","sectorType","_switchToActiveSector","_switchToFrozenSector","_switchToSupportSector","_loadLatestSector","_previousSector","_setActiveSector","newId","_forgetLastSector","_createNewSector","_deleteActiveSector","_deleteFrozenSector","_freezeSector","_activateSector","_mergeThisWithFrozen","_collapseThisToSingleCluster","sector","unqiueIdentifier","previousSector","runFunction","argument","_doInAllFrozenSectors","_drawSectorNodes","_drawAllSectorNodes","_getNodesOverlappingWith","overlappingNodes","_getAllNodesOverlappingWith","_pointerToPositionObject","positionObject","_getEdgesOverlappingWith","overlappingEdges","_getAllEdgesOverlappingWith","_addToSelection","_addToHover","_removeFromSelection","doNotTrigger","_unselectClusters","_getSelectedNodeCount","_getSelectedNode","_getSelectedEdge","_getSelectedEdgeCount","_getSelectedObjectCount","_selectionIsEmpty","_clusterInSelection","_selectConnectedEdges","_hoverConnectedEdges","_unselectConnectedEdges","append","highlightEdges","nodeIds","getSelectedNodes","edgeIds","getSelectedEdges","idArray","RangeError","selectNodes","selectEdges","_clearManipulatorBar","_restoreOverloadedFunctions","functionName","_toggleEditMode","toolbar","getElementById","boundFunction","edgeBeingEdited","selectedControlNode","addNodeButton","_createAddNodeToolbar","addEdgeButton","_createAddEdgeToolbar","editButton","_editNode","_createEditEdgeToolbar","editModeButton","backButton","_addNode","_handleConnect","_finishConnect","_selectControlNode","_controlNodeDrag","_releaseControlNode","newNode","_editEdge","alert","smooth","connectFromId","_createEdge","defaultData","finalizedData","sourceNodeId","targetNodeId","selectedNodes","selectedEdges","wrapper","navigationDivs","navigationDivActions","_stopMovement","hubsize","definedLevel","undefinedLevel","_changeConstants","_determineLevels","distribution","_getDistribution","_placeNodesByHierarchy","minPos","_placeBranchNodes","maxCount","_setLevel","parentId","parentLevel","nodeMoved","_restoreNodes","graphToggleSmoothCurves","graph_toggleSmooth","graphRepositionNodes","showValueOfRange","graphGenerateOptions","optionsSpecific","radioButton1","radioButton2","checked","backupConstants","optionsDiv","switchConfigurations","radioButton","querySelector","tableId","table","constantsVariableName","valueId","rangeValue","_overWriteGraphConstants","RepulsionMixin","HierarchialRepulsionMixin","BarnesHutMixin","_toggleBarnesHut","barnesHutTree","_initializeForceCalculation","_calculateForces","_calculateGravitationalForces","_calculateNodeForces","_calculateSpringForcesWithSupport","_calculateHierarchicalSpringForces","_calculateSpringForces","supportNodes","supportNodeId","gravity","gravityForce","edgeLength","springForce","combinedClusterSize","node1","node2","node3","_calculateSpringForce","physicsConfiguration","hierarchicalLayoutDirections","parentElement","rangeElement","radioButton3","graph_repositionNodes","graph_generateOptions","nameArray","webpackContext","req","webpackContextResolve","resolve","repulsingForce","a_base","minimumDistance","steepness","springFx","springFy","totalFx","totalFy","correctionFx","correctionFy","nodeCount","_formBarnesHutTree","_getForceContribution","children","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","MAX_VALUE","sizeDiff","minimumTreeSize","rootSize","halfRootSize","centerX","centerY","_splitBranch","_placeInTree","_updateBranchMass","totalMass","totalMassInv","biggestSize","skipMassUpdate","_placeInRegion","region","containedNode","_insertRegion","childSize","_drawTree","_drawBranch","branch","webpackPolyfill","paths"],"mappings":"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"} \ No newline at end of file diff --git a/dist/vis.min.css b/dist/vis.min.css index fe54c64a..6e4838b3 100755 --- a/dist/vis.min.css +++ b/dist/vis.min.css @@ -1 +1 @@ -.vis .overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-active{box-shadow:0 0 10px #86d5f8}.vis.timeline.root{position:relative;border:1px solid #bfbfbf;overflow:hidden;padding:0;margin:0;box-sizing:border-box}.vis.timeline .vispanel{position:absolute;padding:0;margin:0;box-sizing:border-box}.vis.timeline .vispanel.bottom,.vis.timeline .vispanel.center,.vis.timeline .vispanel.left,.vis.timeline .vispanel.right,.vis.timeline .vispanel.top{border:1px #bfbfbf}.vis.timeline .vispanel.center,.vis.timeline .vispanel.left,.vis.timeline .vispanel.right{border-top-style:solid;border-bottom-style:solid;overflow:hidden}.vis.timeline .vispanel.bottom,.vis.timeline .vispanel.center,.vis.timeline .vispanel.top{border-left-style:solid;border-right-style:solid}.vis.timeline .background{overflow:hidden}.vis.timeline .vispanel>.content{position:relative}.vis.timeline .vispanel .shadow{position:absolute;width:100%;height:1px;box-shadow:0 0 10px rgba(0,0,0,.8)}.vis.timeline .vispanel .shadow.top{top:-1px;left:0}.vis.timeline .vispanel .shadow.bottom{bottom:-1px;left:0}.vis.timeline .labelset{position:relative;width:100%;overflow:hidden;box-sizing:border-box}.vis.timeline .labelset .vlabel{position:relative;left:0;top:0;width:100%;color:#4d4d4d;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis.timeline .labelset .vlabel:last-child{border-bottom:none}.vis.timeline .labelset .vlabel .inner{display:inline-block;padding:5px}.vis.timeline .labelset .vlabel .inner.hidden{padding:0}.vis.timeline .itemset{position:relative;padding:0;margin:0;box-sizing:border-box}.vis.timeline .itemset .background,.vis.timeline .itemset .foreground{position:absolute;width:100%;height:100%}.vis.timeline .axis{position:absolute;width:100%;height:0;left:0}.vis.timeline .foreground .group{position:relative;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis.timeline .foreground .group:last-child{border-bottom:none}.vis.timeline .item{position:absolute;color:#1A1A1A;border-color:#97B0F8;border-width:1px;background-color:#D5DDF6;display:inline-block;padding:5px}.vis.timeline .item.selected{border-color:#FFC200;background-color:#FFF785;z-index:2}.vis.timeline .editable .item.selected{cursor:move}.vis.timeline .item.point.selected{background-color:#FFF785}.vis.timeline .item.box{text-align:center;border-style:solid;border-radius:2px}.vis.timeline .item.point{background:0 0}.vis.timeline .item.dot{position:absolute;padding:0;border-width:4px;border-style:solid;border-radius:4px}.vis.timeline .item.range{border-style:solid;border-radius:2px;box-sizing:border-box}.vis.timeline .item.range .content{position:relative;display:inline-block;overflow:hidden;max-width:100%}.vis.timeline .item.line{padding:0;position:absolute;width:0;border-left-width:1px;border-left-style:solid}.vis.timeline .item .content{white-space:nowrap;overflow:hidden}.vis.timeline .item .delete{background:url(img/timeline/delete.png) top center no-repeat;position:absolute;width:24px;height:24px;top:0;right:-24px;cursor:pointer}.vis.timeline .item.range .drag-left{position:absolute;width:24px;height:100%;top:0;left:-4px;cursor:w-resize}.vis.timeline .item.range .drag-right{position:absolute;width:24px;height:100%;top:0;right:-4px;cursor:e-resize}.vis.timeline .timeaxis{position:relative;overflow:hidden}.vis.timeline .timeaxis.foreground{top:0;left:0;width:100%}.vis.timeline .timeaxis.background{position:absolute;top:0;left:0;width:100%;height:100%}.vis.timeline .timeaxis .text{position:absolute;color:#4d4d4d;padding:3px;white-space:nowrap}.vis.timeline .timeaxis .text.measure{position:absolute;padding-left:0;padding-right:0;margin-left:0;margin-right:0;visibility:hidden}.vis.timeline .timeaxis .grid.vertical{position:absolute;width:0;border-right:1px solid}.vis.timeline .timeaxis .grid.minor{border-color:#e5e5e5}.vis.timeline .timeaxis .grid.major{border-color:#bfbfbf}.vis.timeline .currenttime{background-color:#FF7F6E;width:2px;z-index:1}.vis.timeline .customtime{background-color:#6E94FF;width:2px;cursor:move;z-index:1}.vis.timeline .vispanel.background.horizontal .grid.horizontal{position:absolute;width:100%;height:0;border-bottom:1px solid}.vis.timeline .vispanel.background.horizontal .grid.minor{border-color:#e5e5e5}.vis.timeline .vispanel.background.horizontal .grid.major{border-color:#bfbfbf}.vis.timeline .dataaxis .yAxis.major{width:100%;position:absolute;color:#4d4d4d;white-space:nowrap}.vis.timeline .dataaxis .yAxis.major.measure{padding:0;margin:0;visibility:hidden;width:auto}.vis.timeline .dataaxis .yAxis.minor{position:absolute;width:100%;color:#bebebe;white-space:nowrap}.vis.timeline .dataaxis .yAxis.minor.measure{padding:0;margin:0;visibility:hidden;width:auto}.vis.timeline .legend{background-color:rgba(247,252,255,.65);padding:5px;border-color:#b3b3b3;border-style:solid;border-width:1px;box-shadow:2px 2px 10px rgba(154,154,154,.55)}.vis.timeline .legendText{white-space:nowrap;display:inline-block}.vis.timeline .graphGroup0{fill:#4f81bd;fill-opacity:0;stroke-width:2px;stroke:#4f81bd}.vis.timeline .graphGroup1{fill:#f79646;fill-opacity:0;stroke-width:2px;stroke:#f79646}.vis.timeline .graphGroup2{fill:#8c51cf;fill-opacity:0;stroke-width:2px;stroke:#8c51cf}.vis.timeline .graphGroup3{fill:#75c841;fill-opacity:0;stroke-width:2px;stroke:#75c841}.vis.timeline .graphGroup4{fill:#ff0100;fill-opacity:0;stroke-width:2px;stroke:#ff0100}.vis.timeline .graphGroup5{fill:#37d8e6;fill-opacity:0;stroke-width:2px;stroke:#37d8e6}.vis.timeline .graphGroup6{fill:#042662;fill-opacity:0;stroke-width:2px;stroke:#042662}.vis.timeline .graphGroup7{fill:#00ff26;fill-opacity:0;stroke-width:2px;stroke:#00ff26}.vis.timeline .graphGroup8{fill:#f0f;fill-opacity:0;stroke-width:2px;stroke:#f0f}.vis.timeline .graphGroup9{fill:#8f3938;fill-opacity:0;stroke-width:2px;stroke:#8f3938}.vis.timeline .fill{fill-opacity:.1;stroke:none}.vis.timeline .bar{fill-opacity:.5;stroke-width:1px}.vis.timeline .point{stroke-width:2px;fill-opacity:1}.vis.timeline .legendBackground{stroke-width:1px;fill-opacity:.9;fill:#fff;stroke:#c2c2c2}.vis.timeline .outline{stroke-width:1px;fill-opacity:1;fill:#fff;stroke:#e5e5e5}.vis.timeline .iconFill{fill-opacity:.3;stroke:none}div.network-manipulationDiv{border-width:0;border-bottom:1px;border-style:solid;border-color:#d6d9d8;background:#fff;background:-moz-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#fff),color-stop(48%,#fcfcfc),color-stop(50%,#fafafa),color-stop(100%,#fcfcfc));background:-webkit-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-o-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-ms-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:linear-gradient(to bottom,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#fcfcfc', GradientType=0);position:absolute;left:0;top:0;width:100%;height:30px}div.network-manipulation-editMode{position:absolute;left:0;top:0;height:30px;margin-top:20px}div.network-manipulation-closeDiv{position:absolute;left:0;top:0;width:30px;height:30px;margin-top:3px;margin-left:590px;background-position:0 0;background-repeat:no-repeat;background-image:url(img/network/cross.png);cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.network-manipulationUI{font-family:verdana;font-size:12px;-moz-border-radius:15px;border-radius:15px;display:inline-block;background-position:0 0;background-repeat:no-repeat;height:24px;margin:-14px 0 0 10px;vertical-align:middle;cursor:pointer;padding:0 8px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.network-manipulationUI:hover{box-shadow:1px 1px 8px rgba(0,0,0,.2)}span.network-manipulationUI:active{box-shadow:1px 1px 8px rgba(0,0,0,.5)}span.network-manipulationUI.back{background-image:url(img/network/backIcon.png)}span.network-manipulationUI.none:hover{box-shadow:1px 1px 8px transparent;cursor:default}span.network-manipulationUI.none:active{box-shadow:1px 1px 8px transparent}span.network-manipulationUI.none{padding:0}span.network-manipulationUI.notification{margin:2px;font-weight:700}span.network-manipulationUI.add{background-image:url(img/network/addNodeIcon.png)}span.network-manipulationUI.edit{background-image:url(img/network/editIcon.png)}span.network-manipulationUI.edit.editmode{background-color:#fcfcfc;border-style:solid;border-width:1px;border-color:#ccc}span.network-manipulationUI.connect{background-image:url(img/network/connectIcon.png)}span.network-manipulationUI.delete{background-image:url(img/network/deleteIcon.png)}span.network-manipulationLabel{margin:0 0 0 23px;line-height:25px}div.network-seperatorLine{display:inline-block;width:1px;height:20px;background-color:#bdbdbd;margin:5px 7px 0 15px}div.network-navigation_wrapper{position:absolute;left:0;top:0;width:100%;height:100%}div.network-navigation{width:34px;height:34px;-moz-border-radius:17px;border-radius:17px;position:absolute;display:inline-block;background-position:2px 2px;background-repeat:no-repeat;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.network-navigation:hover{box-shadow:0 0 3px 3px rgba(56,207,21,.3)}div.network-navigation:active{box-shadow:0 0 1px 3px rgba(56,207,21,.95)}div.network-navigation.up{background-image:url(img/network/upArrow.png);bottom:50px;left:55px}div.network-navigation.down{background-image:url(img/network/downArrow.png);bottom:10px;left:55px}div.network-navigation.left{background-image:url(img/network/leftArrow.png);bottom:10px;left:15px}div.network-navigation.right{background-image:url(img/network/rightArrow.png);bottom:10px;left:95px}div.network-navigation.zoomIn{background-image:url(img/network/plus.png);bottom:10px;right:15px}div.network-navigation.zoomOut{background-image:url(img/network/minus.png);bottom:10px;right:55px}div.network-navigation.zoomExtends{background-image:url(img/network/zoomExtends.png);bottom:50px;right:15px} \ No newline at end of file +.vis .overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-active{box-shadow:0 0 10px #86d5f8}.vis.timeline.root{position:relative;border:1px solid #bfbfbf;overflow:hidden;padding:0;margin:0;box-sizing:border-box}.vis.timeline .vispanel{position:absolute;padding:0;margin:0;box-sizing:border-box}.vis.timeline .vispanel.bottom,.vis.timeline .vispanel.center,.vis.timeline .vispanel.left,.vis.timeline .vispanel.right,.vis.timeline .vispanel.top{border:1px #bfbfbf}.vis.timeline .vispanel.center,.vis.timeline .vispanel.left,.vis.timeline .vispanel.right{border-top-style:solid;border-bottom-style:solid;overflow:hidden}.vis.timeline .vispanel.bottom,.vis.timeline .vispanel.center,.vis.timeline .vispanel.top{border-left-style:solid;border-right-style:solid}.vis.timeline .background{overflow:hidden}.vis.timeline .vispanel>.content{position:relative}.vis.timeline .vispanel .shadow{position:absolute;width:100%;height:1px;box-shadow:0 0 10px rgba(0,0,0,.8)}.vis.timeline .vispanel .shadow.top{top:-1px;left:0}.vis.timeline .vispanel .shadow.bottom{bottom:-1px;left:0}.vis.timeline .labelset{position:relative;width:100%;overflow:hidden;box-sizing:border-box}.vis.timeline .labelset .vlabel{position:relative;left:0;top:0;width:100%;color:#4d4d4d;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis.timeline .labelset .vlabel:last-child{border-bottom:none}.vis.timeline .labelset .vlabel .inner{display:inline-block;padding:5px}.vis.timeline .labelset .vlabel .inner.hidden{padding:0}.vis.timeline .itemset{position:relative;padding:0;margin:0;box-sizing:border-box}.vis.timeline .itemset .background,.vis.timeline .itemset .foreground{position:absolute;width:100%;height:100%}.vis.timeline .axis{position:absolute;width:100%;height:0;left:0}.vis.timeline .foreground .group{position:relative;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis.timeline .foreground .group:last-child{border-bottom:none}.vis.timeline .item{position:absolute;color:#1A1A1A;border-color:#97B0F8;border-width:1px;background-color:#D5DDF6;display:inline-block;padding:5px}.vis.timeline .item.selected{border-color:#FFC200;background-color:#FFF785;z-index:2}.vis.timeline .editable .item.selected{cursor:move}.vis.timeline .item.point.selected{background-color:#FFF785}.vis.timeline .item.box{text-align:center;border-style:solid;border-radius:2px}.vis.timeline .item.point{background:0 0}.vis.timeline .item.dot{position:absolute;padding:0;border-width:4px;border-style:solid;border-radius:4px}.vis.timeline .item.range{border-style:solid;border-radius:2px;box-sizing:border-box}.vis.timeline .item.range .content{position:relative;display:inline-block;overflow:hidden;max-width:100%}.vis.timeline .item.line{padding:0;position:absolute;width:0;border-left-width:1px;border-left-style:solid}.vis.timeline .item .content{white-space:nowrap;overflow:hidden}.vis.timeline .item .delete{background:url(img/timeline/delete.png) no-repeat top center;position:absolute;width:24px;height:24px;top:0;right:-24px;cursor:pointer}.vis.timeline .item.range .drag-left{position:absolute;width:24px;height:100%;top:0;left:-4px;cursor:w-resize}.vis.timeline .item.range .drag-right{position:absolute;width:24px;height:100%;top:0;right:-4px;cursor:e-resize}.vis.timeline .timeaxis{position:relative;overflow:hidden}.vis.timeline .timeaxis.foreground{top:0;left:0;width:100%}.vis.timeline .timeaxis.background{position:absolute;top:0;left:0;width:100%;height:100%}.vis.timeline .timeaxis .text{position:absolute;color:#4d4d4d;padding:3px;white-space:nowrap}.vis.timeline .timeaxis .text.measure{position:absolute;padding-left:0;padding-right:0;margin-left:0;margin-right:0;visibility:hidden}.vis.timeline .timeaxis .grid.vertical{position:absolute;width:0;border-right:1px solid}.vis.timeline .timeaxis .grid.minor{border-color:#e5e5e5}.vis.timeline .timeaxis .grid.major{border-color:#bfbfbf}.vis.timeline .currenttime{background-color:#FF7F6E;width:2px;z-index:1}.vis.timeline .customtime{background-color:#6E94FF;width:2px;cursor:move;z-index:1}.vis.timeline .vispanel.background.horizontal .grid.horizontal{position:absolute;width:100%;height:0;border-bottom:1px solid}.vis.timeline .vispanel.background.horizontal .grid.minor{border-color:#e5e5e5}.vis.timeline .vispanel.background.horizontal .grid.major{border-color:#bfbfbf}.vis.timeline .dataaxis .yAxis.major{width:100%;position:absolute;color:#4d4d4d;white-space:nowrap}.vis.timeline .dataaxis .yAxis.major.measure{padding:0;margin:0;visibility:hidden;width:auto}.vis.timeline .dataaxis .yAxis.minor{position:absolute;width:100%;color:#bebebe;white-space:nowrap}.vis.timeline .dataaxis .yAxis.minor.measure{padding:0;margin:0;visibility:hidden;width:auto}.vis.timeline .legend{background-color:rgba(247,252,255,.65);padding:5px;border-color:#b3b3b3;border-style:solid;border-width:1px;box-shadow:2px 2px 10px rgba(154,154,154,.55)}.vis.timeline .legendText{white-space:nowrap;display:inline-block}.vis.timeline .graphGroup0{fill:#4f81bd;fill-opacity:0;stroke-width:2px;stroke:#4f81bd}.vis.timeline .graphGroup1{fill:#f79646;fill-opacity:0;stroke-width:2px;stroke:#f79646}.vis.timeline .graphGroup2{fill:#8c51cf;fill-opacity:0;stroke-width:2px;stroke:#8c51cf}.vis.timeline .graphGroup3{fill:#75c841;fill-opacity:0;stroke-width:2px;stroke:#75c841}.vis.timeline .graphGroup4{fill:#ff0100;fill-opacity:0;stroke-width:2px;stroke:#ff0100}.vis.timeline .graphGroup5{fill:#37d8e6;fill-opacity:0;stroke-width:2px;stroke:#37d8e6}.vis.timeline .graphGroup6{fill:#042662;fill-opacity:0;stroke-width:2px;stroke:#042662}.vis.timeline .graphGroup7{fill:#00ff26;fill-opacity:0;stroke-width:2px;stroke:#00ff26}.vis.timeline .graphGroup8{fill:#f0f;fill-opacity:0;stroke-width:2px;stroke:#f0f}.vis.timeline .graphGroup9{fill:#8f3938;fill-opacity:0;stroke-width:2px;stroke:#8f3938}.vis.timeline .fill{fill-opacity:.1;stroke:none}.vis.timeline .bar{fill-opacity:.5;stroke-width:1px}.vis.timeline .point{stroke-width:2px;fill-opacity:1}.vis.timeline .legendBackground{stroke-width:1px;fill-opacity:.9;fill:#fff;stroke:#c2c2c2}.vis.timeline .outline{stroke-width:1px;fill-opacity:1;fill:#fff;stroke:#e5e5e5}.vis.timeline .iconFill{fill-opacity:.3;stroke:none}div.network-manipulationDiv{border-width:0;border-bottom:1px;border-style:solid;border-color:#d6d9d8;background:#fff;background:-moz-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#fff),color-stop(48%,#fcfcfc),color-stop(50%,#fafafa),color-stop(100%,#fcfcfc));background:-webkit-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-o-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-ms-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:linear-gradient(to bottom,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#fcfcfc', GradientType=0);position:absolute;left:0;top:0;width:100%;height:30px}div.network-manipulation-editMode{position:absolute;left:0;top:0;height:30px;margin-top:20px}div.network-manipulation-closeDiv{position:absolute;left:0;top:0;width:30px;height:30px;margin-top:3px;margin-left:590px;background-position:0 0;background-repeat:no-repeat;background-image:url(img/network/cross.png);cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.network-manipulationUI{font-family:verdana;font-size:12px;-moz-border-radius:15px;border-radius:15px;display:inline-block;background-position:0 0;background-repeat:no-repeat;height:24px;margin:-14px 0 0 10px;vertical-align:middle;cursor:pointer;padding:0 8px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.network-manipulationUI:hover{box-shadow:1px 1px 8px rgba(0,0,0,.2)}span.network-manipulationUI:active{box-shadow:1px 1px 8px rgba(0,0,0,.5)}span.network-manipulationUI.back{background-image:url(img/network/backIcon.png)}span.network-manipulationUI.none:hover{box-shadow:1px 1px 8px transparent;cursor:default}span.network-manipulationUI.none:active{box-shadow:1px 1px 8px transparent}span.network-manipulationUI.none{padding:0}span.network-manipulationUI.notification{margin:2px;font-weight:700}span.network-manipulationUI.add{background-image:url(img/network/addNodeIcon.png)}span.network-manipulationUI.edit{background-image:url(img/network/editIcon.png)}span.network-manipulationUI.edit.editmode{background-color:#fcfcfc;border-style:solid;border-width:1px;border-color:#ccc}span.network-manipulationUI.connect{background-image:url(img/network/connectIcon.png)}span.network-manipulationUI.delete{background-image:url(img/network/deleteIcon.png)}span.network-manipulationLabel{margin:0 0 0 23px;line-height:25px}div.network-seperatorLine{display:inline-block;width:1px;height:20px;background-color:#bdbdbd;margin:5px 7px 0 15px}div.network-navigation_wrapper{position:absolute;left:0;top:0;width:100%;height:100%}div.network-navigation{width:34px;height:34px;-moz-border-radius:17px;border-radius:17px;position:absolute;display:inline-block;background-position:2px 2px;background-repeat:no-repeat;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.network-navigation:hover{box-shadow:0 0 3px 3px rgba(56,207,21,.3)}div.network-navigation:active{box-shadow:0 0 1px 3px rgba(56,207,21,.95)}div.network-navigation.up{background-image:url(img/network/upArrow.png);bottom:50px;left:55px}div.network-navigation.down{background-image:url(img/network/downArrow.png);bottom:10px;left:55px}div.network-navigation.left{background-image:url(img/network/leftArrow.png);bottom:10px;left:15px}div.network-navigation.right{background-image:url(img/network/rightArrow.png);bottom:10px;left:95px}div.network-navigation.zoomIn{background-image:url(img/network/plus.png);bottom:10px;right:15px}div.network-navigation.zoomOut{background-image:url(img/network/minus.png);bottom:10px;right:55px}div.network-navigation.zoomExtends{background-image:url(img/network/zoomExtends.png);bottom:50px;right:15px} \ No newline at end of file diff --git a/dist/vis.min.js b/dist/vis.min.js index d3e49277..e3a1bfa4 100644 --- a/dist/vis.min.js +++ b/dist/vis.min.js @@ -24,14 +24,14 @@ */ !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):"object"==typeof exports?exports.vis=e():t.vis=e()}(this,function(){return function(t){function e(s){if(i[s])return i[s].exports;var o=i[s]={exports:{},id:s,loaded:!1};return t[s].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){e.util=i(1),e.DOMutil=i(2),e.DataSet=i(3),e.DataView=i(4),e.Graph3d=i(5),e.graph3d={Camera:i(6),Filter:i(7),Point2d:i(8),Point3d:i(9),Slider:i(10),StepNumber:i(11)},e.Timeline=i(12),e.Graph2d=i(13),e.timeline={DataStep:i(14),Range:i(15),stack:i(16),TimeStep:i(17),components:{items:{Item:i(28),ItemBox:i(29),ItemPoint:i(30),ItemRange:i(31)},Component:i(18),CurrentTime:i(19),CustomTime:i(20),DataAxis:i(21),GraphGroup:i(22),Group:i(23),ItemSet:i(24),Legend:i(25),LineGraph:i(26),TimeAxis:i(27)}},e.Network=i(32),e.network={Edge:i(33),Groups:i(34),Images:i(35),Node:i(36),Popup:i(37),dotparser:i(38),gephiParser:i(39)},e.Graph=function(){throw new Error("Graph is renamed to Network. Please create a graph as new vis.Network(...)")},e.moment=i(40),e.hammer=i(41)},function(module,exports,__webpack_require__){var moment=__webpack_require__(40);exports.isNumber=function(t){return t instanceof Number||"number"==typeof t},exports.isString=function(t){return t instanceof String||"string"==typeof t},exports.isDate=function(t){if(t instanceof Date)return!0;if(exports.isString(t)){var e=ASPDateRegex.exec(t);if(e)return!0;if(!isNaN(Date.parse(t)))return!0}return!1},exports.isDataTable=function(t){return"undefined"!=typeof google&&google.visualization&&google.visualization.DataTable&&t instanceof google.visualization.DataTable},exports.randomUUID=function(){var t=function(){return Math.floor(65536*Math.random()).toString(16)};return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},exports.extend=function(t){for(var e=1,i=arguments.length;i>e;e++){var s=arguments[e];for(var o in s)s.hasOwnProperty(o)&&(t[o]=s[o])}return t},exports.selectiveExtend=function(t,e){if(!Array.isArray(t))throw new Error("Array with property names expected as first argument");for(var i=2;ii;i++)if(t[i]!=e[i])return!1;return!0},exports.convert=function(t,e){var i;if(void 0===t)return void 0;if(null===t)return null;if(!e)return t;if("string"!=typeof e&&!(e instanceof String))throw new Error("Type must be a string");switch(e){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(moment.isMoment(t))return new Date(t.valueOf());if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])):moment(t).toDate();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"Moment":if(exports.isNumber(t))return moment(t);if(t instanceof Date)return moment(t.valueOf());if(moment.isMoment(t))return moment(t);if(exports.isString(t))return i=ASPDateRegex.exec(t),moment(i?Number(i[1]):t);throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"ISODate":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(moment.isMoment(t))return t.toDate().toISOString();if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])).toISOString():new Date(t).toISOString();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ISODate");case"ASPDate":if(exports.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(exports.isString(t)){i=ASPDateRegex.exec(t);var s;return s=i?new Date(Number(i[1])).valueOf():new Date(t).valueOf(),"/Date("+s+")/"}throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ASPDate");default:throw new Error('Unknown type "'+e+'"')}};var ASPDateRegex=/^\/?Date\((\-?\d+)/i;exports.getType=function(t){var e=typeof t;return"object"==e?null==t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":t instanceof Array?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":e},exports.getAbsoluteLeft=function(t){return t.getBoundingClientRect().left+window.pageXOffset},exports.getAbsoluteTop=function(t){return t.getBoundingClientRect().top+window.pageYOffset},exports.addClassName=function(t,e){var i=t.className.split(" ");-1==i.indexOf(e)&&(i.push(e),t.className=i.join(" "))},exports.removeClassName=function(t,e){var i=t.className.split(" "),s=i.indexOf(e);-1!=s&&(i.splice(s,1),t.className=i.join(" "))},exports.forEach=function(t,e){var i,s;if(t instanceof Array)for(i=0,s=t.length;s>i;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},exports.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e},exports.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},exports.addEventListener=function(t,e,i,s){t.addEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,s)):t.attachEvent("on"+e,i)},exports.removeEventListener=function(t,e,i,s){t.removeEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,s)):t.detachEvent("on"+e,i)},exports.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},exports.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},exports.option={},exports.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},exports.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},exports.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},exports.option.asSize=function(t,e){return"function"==typeof t&&(t=t()),exports.isString(t)?t:exports.isNumber(t)?t+"px":e||null},exports.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},exports.GiveDec=function(Hex){var Value;return Value="A"==Hex?10:"B"==Hex?11:"C"==Hex?12:"D"==Hex?13:"E"==Hex?14:"F"==Hex?15:eval(Hex)},exports.GiveHex=function(t){var e;return e=10==t?"A":11==t?"B":12==t?"C":13==t?"D":14==t?"E":15==t?"F":""+t},exports.parseColor=function(t){var e;if(exports.isString(t)){if(exports.isValidRGB(t)){var i=t.substr(4).substr(0,t.length-5).split(",");t=exports.RGBToHex(i[0],i[1],i[2])}if(exports.isValidHex(t)){var s=exports.hexToHSV(t),o={h:s.h,s:.45*s.s,v:Math.min(1,1.05*s.v)},n={h:s.h,s:Math.min(1,1.25*s.v),v:.6*s.v},r=exports.HSVToHex(n.h,n.h,n.v),a=exports.HSVToHex(o.h,o.s,o.v);e={background:t,border:r,highlight:{background:a,border:r},hover:{background:a,border:r}}}else e={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else e={},e.background=t.background||"white",e.border=t.border||e.background,exports.isString(t.highlight)?e.highlight={border:t.highlight,background:t.highlight}:(e.highlight={},e.highlight.background=t.highlight&&t.highlight.background||e.background,e.highlight.border=t.highlight&&t.highlight.border||e.border),exports.isString(t.hover)?e.hover={border:t.hover,background:t.hover}:(e.hover={},e.hover.background=t.hover&&t.hover.background||e.background,e.hover.border=t.hover&&t.hover.border||e.border);return e},exports.hexToRGB=function(t){t=t.replace("#","").toUpperCase();var e=exports.GiveDec(t.substring(0,1)),i=exports.GiveDec(t.substring(1,2)),s=exports.GiveDec(t.substring(2,3)),o=exports.GiveDec(t.substring(3,4)),n=exports.GiveDec(t.substring(4,5)),r=exports.GiveDec(t.substring(5,6)),a=16*e+i,h=16*s+o,i=16*n+r;return{r:a,g:h,b:i}},exports.RGBToHex=function(t,e,i){var s=exports.GiveHex(Math.floor(t/16)),o=exports.GiveHex(t%16),n=exports.GiveHex(Math.floor(e/16)),r=exports.GiveHex(e%16),a=exports.GiveHex(Math.floor(i/16)),h=exports.GiveHex(i%16),d=s+o+n+r+a+h;return"#"+d},exports.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var s=Math.min(t,Math.min(e,i)),o=Math.max(t,Math.max(e,i));if(s==o)return{h:0,s:0,v:s};var n=t==s?e-i:i==s?t-e:i-t,r=t==s?3:i==s?1:5,a=60*(r-n/(o-s))/360,h=(o-s)/o,d=o;return{h:a,s:h,v:d}},exports.HSVToRGB=function(t,e,i){var s,o,n,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:s=i,o=l,n=h;break;case 1:s=d,o=i,n=h;break;case 2:s=h,o=i,n=l;break;case 3:s=h,o=d,n=i;break;case 4:s=l,o=h,n=i;break;case 5:s=i,o=h,n=d}return{r:Math.floor(255*s),g:Math.floor(255*o),b:Math.floor(255*n)}},exports.HSVToHex=function(t,e,i){var s=exports.HSVToRGB(t,e,i);return exports.RGBToHex(s.r,s.g,s.b)},exports.hexToHSV=function(t){var e=exports.hexToRGB(t);return exports.RGBToHSV(e.r,e.g,e.b)},exports.isValidHex=function(t){var e=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t);return e},exports.isValidRGB=function(t){t=t.replace(" ","");var e=/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t);return e},exports.selectiveBridgeObject=function(t,e){if("object"==typeof e){for(var i=Object.create(e),s=0;sa;)o=void 0===s?n[u][i]:n[u][i][s],n[u].isVisible(e)?h=!0:(o=r&&console.log("BinarySearch too many iterations. Aborting.")}return u},exports.binarySearchGeneric=function(t,e,i,s){var o,n,r,a,h=1e4,d=0,l=t,c=!1,p=0,u=l.length,f=p,m=u,g=Math.floor(.5*(u+p));if(0==u)g=-1;else if(1==u)r=l[g][i],g=r==e?0:-1;else{for(u-=1;0==c&&h>d;)n=l[Math.max(0,g-1)][i],r=l[g][i],a=l[Math.min(l.length-1,g+1)][i],r==e||e>n&&r>e||e>r&&a>e?(c=!0,r!=e&&("before"==s?e>n&&r>e&&(g=Math.max(0,g-1)):e>r&&a>e&&(g=Math.min(l.length-1,g+1)))):(e>r?f=Math.floor(.5*(u+p)):m=Math.floor(.5*(u+p)),o=Math.floor(.5*(u+p)),p==f&&u==m?(g=-1,c=!0):(u=m,p=f,g=Math.floor(.5*(u+p)))),d++;d>=h&&console.log("BinarySearch too many iterations. Aborting.")}return g}},function(t,e){e.prepareElements=function(t){for(var e in t)t.hasOwnProperty(e)&&(t[e].redundant=t[e].used,t[e].used=[])},e.cleanupElements=function(t){for(var e in t)if(t.hasOwnProperty(e)&&t[e].redundant){for(var i=0;i0?(s=e[t].redundant[0],e[t].redundant.shift()):(s=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(s)):(s=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(s)),e[t].used.push(s),s},e.getDOMElement=function(t,e,i){var s;return e.hasOwnProperty(t)?e[t].redundant.length>0?(s=e[t].redundant[0],e[t].redundant.shift()):(s=document.createElement(t),i.appendChild(s)):(s=document.createElement(t),e[t]={used:[],redundant:[]},i.appendChild(s)),e[t].used.push(s),s},e.drawPoint=function(t,i,s,o,n){var r;return"circle"==s.options.drawPoints.style?(r=e.getSVGElement("circle",o,n),r.setAttributeNS(null,"cx",t),r.setAttributeNS(null,"cy",i),r.setAttributeNS(null,"r",.5*s.options.drawPoints.size),r.setAttributeNS(null,"class",s.className+" point")):(r=e.getSVGElement("rect",o,n),r.setAttributeNS(null,"x",t-.5*s.options.drawPoints.size),r.setAttributeNS(null,"y",i-.5*s.options.drawPoints.size),r.setAttributeNS(null,"width",s.options.drawPoints.size),r.setAttributeNS(null,"height",s.options.drawPoints.size),r.setAttributeNS(null,"class",s.className+" point")),r},e.drawBar=function(t,i,s,o,n,r,a){var h=e.getSVGElement("rect",r,a);h.setAttributeNS(null,"x",t-.5*s),h.setAttributeNS(null,"y",i),h.setAttributeNS(null,"width",s),h.setAttributeNS(null,"height",o),h.setAttributeNS(null,"class",n)}},function(t,e,i){function s(t,e){if(!t||Array.isArray(t)||o.isDataTable(t)||(e=t,t=null),this._options=e||{},this._data={},this._fieldId=this._options.fieldId||"id",this._type={},this._options.type)for(var i in this._options.type)if(this._options.type.hasOwnProperty(i)){var s=this._options.type[i];this._type[i]="Date"==s||"ISODate"==s||"ASPDate"==s?"Date":s}if(this._options.convert)throw new Error('Option "convert" is deprecated. Use "type" instead.');this._subscribers={},t&&this.add(t)}var o=i(1);s.prototype.on=function(t,e){var i=this._subscribers[t];i||(i=[],this._subscribers[t]=i),i.push({callback:e})},s.prototype.subscribe=s.prototype.on,s.prototype.off=function(t,e){var i=this._subscribers[t];i&&(this._subscribers[t]=i.filter(function(t){return t.callback!=e}))},s.prototype.unsubscribe=s.prototype.off,s.prototype._trigger=function(t,e,i){if("*"==t)throw new Error("Cannot trigger event *");var s=[];t in this._subscribers&&(s=s.concat(this._subscribers[t])),"*"in this._subscribers&&(s=s.concat(this._subscribers["*"]));for(var o=0;or;r++)i=n._addItem(t[r]),s.push(i);else if(o.isDataTable(t))for(var h=this._getColumnNames(t),d=0,l=t.getNumberOfRows();l>d;d++){for(var c={},p=0,u=h.length;u>p;p++){var f=h[p];c[f]=t.getValue(d,p)}i=n._addItem(c),s.push(i)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");i=n._addItem(t),s.push(i)}return s.length&&this._trigger("add",{items:s},e),s},s.prototype.update=function(t,e){var i=[],s=[],n=this,r=n._fieldId,a=function(t){var e=t[r];n._data[e]?(e=n._updateItem(t),s.push(e)):(e=n._addItem(t),i.push(e))};if(Array.isArray(t))for(var h=0,d=t.length;d>h;h++)a(t[h]);else if(o.isDataTable(t))for(var l=this._getColumnNames(t),c=0,p=t.getNumberOfRows();p>c;c++){for(var u={},f=0,m=l.length;m>f;f++){var g=l[f];u[g]=t.getValue(c,f)}a(u)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");a(t)}return i.length&&this._trigger("add",{items:i},e),s.length&&this._trigger("update",{items:s},e),i.concat(s)},s.prototype.get=function(){var t,e,i,s,n=this,r=o.getType(arguments[0]);"String"==r||"Number"==r?(t=arguments[0],i=arguments[1],s=arguments[2]):"Array"==r?(e=arguments[0],i=arguments[1],s=arguments[2]):(i=arguments[0],s=arguments[1]);var a;if(i&&i.returnType){var h=["DataTable","Array","Object"];if(a=-1==h.indexOf(i.returnType)?"Array":i.returnType,s&&a!=o.getType(s))throw new Error('Type of parameter "data" ('+o.getType(s)+") does not correspond with specified options.type ("+i.type+")");if("DataTable"==a&&!o.isDataTable(s))throw new Error('Parameter "data" must be a DataTable when options.type is "DataTable"')}else a=s&&"DataTable"==o.getType(s)?"DataTable":"Array";var d,l,c,p,u=i&&i.type||this._options.type,f=i&&i.filter,m=[];if(void 0!=t)d=n._getItem(t,u),f&&!f(d)&&(d=null);else if(void 0!=e)for(c=0,p=e.length;p>c;c++)d=n._getItem(e[c],u),(!f||f(d))&&m.push(d);else for(l in this._data)this._data.hasOwnProperty(l)&&(d=n._getItem(l,u),(!f||f(d))&&m.push(d));if(i&&i.order&&void 0==t&&this._sort(m,i.order),i&&i.fields){var g=i.fields;if(void 0!=t)d=this._filterFields(d,g);else for(c=0,p=m.length;p>c;c++)m[c]=this._filterFields(m[c],g)}if("DataTable"==a){var v=this._getColumnNames(s);if(void 0!=t)n._appendRow(s,v,d);else for(c=0;cc;c++)s.push(m[c]);return s}return m},s.prototype.getIds=function(t){var e,i,s,o,n,r=this._data,a=t&&t.filter,h=t&&t.order,d=t&&t.type||this._options.type,l=[];if(a)if(h){n=[];for(s in r)r.hasOwnProperty(s)&&(o=this._getItem(s,d),a(o)&&n.push(o));for(this._sort(n,h),e=0,i=n.length;i>e;e++)l[e]=n[e][this._fieldId]}else for(s in r)r.hasOwnProperty(s)&&(o=this._getItem(s,d),a(o)&&l.push(o[this._fieldId]));else if(h){n=[];for(s in r)r.hasOwnProperty(s)&&n.push(r[s]);for(this._sort(n,h),e=0,i=n.length;i>e;e++)l[e]=n[e][this._fieldId]}else for(s in r)r.hasOwnProperty(s)&&(o=r[s],l.push(o[this._fieldId]));return l},s.prototype.getDataSet=function(){return this},s.prototype.forEach=function(t,e){var i,s,o=e&&e.filter,n=e&&e.type||this._options.type,r=this._data;if(e&&e.order)for(var a=this.get(e),h=0,d=a.length;d>h;h++)i=a[h],s=i[this._fieldId],t(i,s);else for(s in r)r.hasOwnProperty(s)&&(i=this._getItem(s,n),(!o||o(i))&&t(i,s))},s.prototype.map=function(t,e){var i,s=e&&e.filter,o=e&&e.type||this._options.type,n=[],r=this._data;for(var a in r)r.hasOwnProperty(a)&&(i=this._getItem(a,o),(!s||s(i))&&n.push(t(i,a)));return e&&e.order&&this._sort(n,e.order),n},s.prototype._filterFields=function(t,e){var i={};for(var s in t)t.hasOwnProperty(s)&&-1!=e.indexOf(s)&&(i[s]=t[s]);return i},s.prototype._sort=function(t,e){if(o.isString(e)){var i=e;t.sort(function(t,e){var s=t[i],o=e[i];return s>o?1:o>s?-1:0})}else{if("function"!=typeof e)throw new TypeError("Order must be a function or a string");t.sort(e)}},s.prototype.remove=function(t,e){var i,s,o,n=[];if(Array.isArray(t))for(i=0,s=t.length;s>i;i++)o=this._remove(t[i]),null!=o&&n.push(o);else o=this._remove(t),null!=o&&n.push(o);return n.length&&this._trigger("remove",{items:n},e),n},s.prototype._remove=function(t){if(o.isNumber(t)||o.isString(t)){if(this._data[t])return delete this._data[t],t}else if(t instanceof Object){var e=t[this._fieldId];if(e&&this._data[e])return delete this._data[e],e}return null},s.prototype.clear=function(t){var e=Object.keys(this._data);return this._data={},this._trigger("remove",{items:e},t),e},s.prototype.max=function(t){var e=this._data,i=null,s=null;for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],r=n[t];null!=r&&(!i||r>s)&&(i=n,s=r)}return i},s.prototype.min=function(t){var e=this._data,i=null,s=null;for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],r=n[t];null!=r&&(!i||s>r)&&(i=n,s=r)}return i},s.prototype.distinct=function(t){var e,i=this._data,s=[],n=this._options.type&&this._options.type[t]||null,r=0;for(var a in i)if(i.hasOwnProperty(a)){var h=i[a],d=h[t],l=!1;for(e=0;r>e;e++)if(s[e]==d){l=!0;break}l||void 0===d||(s[r]=d,r++)}if(n)for(e=0;ei;i++)e[i]=t.getColumnId(i)||t.getColumnLabel(i);return e},s.prototype._appendRow=function(t,e,i){for(var s=t.addRow(),o=0,n=e.length;n>o;o++){var r=e[o];t.setValue(s,o,i[r])}},t.exports=s},function(t,e,i){function s(t,e){this._data=null,this._ids={},this._options=e||{},this._fieldId="id",this._subscribers={};var i=this;this.listener=function(){i._onEvent.apply(i,arguments)},this.setData(t)}var o=i(1),n=i(3);s.prototype.setData=function(t){var e,i,s;if(this._data){this._data.unsubscribe&&this._data.unsubscribe("*",this.listener),e=[];for(var o in this._ids)this._ids.hasOwnProperty(o)&&e.push(o);this._ids={},this._trigger("remove",{items:e})}if(this._data=t,this._data){for(this._fieldId=this._options.fieldId||this._data&&this._data.options&&this._data.options.fieldId||"id",e=this._data.getIds({filter:this._options&&this._options.filter}),i=0,s=e.length;s>i;i++)o=e[i],this._ids[o]=!0;this._trigger("add",{items:e}),this._data.on&&this._data.on("*",this.listener)}},s.prototype.get=function(){var t,e,i,s=this,n=o.getType(arguments[0]);"String"==n||"Number"==n||"Array"==n?(t=arguments[0],e=arguments[1],i=arguments[2]):(e=arguments[0],i=arguments[1]);var r=o.extend({},this._options,e);this._options.filter&&e&&e.filter&&(r.filter=function(t){return s._options.filter(t)&&e.filter(t)});var a=[];return void 0!=t&&a.push(t),a.push(r),a.push(i),this._data&&this._data.get.apply(this._data,a)},s.prototype.getIds=function(t){var e;if(this._data){var i,s=this._options.filter;i=t&&t.filter?s?function(e){return s(e)&&t.filter(e)}:t.filter:s,e=this._data.getIds({filter:i,order:t&&t.order})}else e=[];return e},s.prototype.getDataSet=function(){for(var t=this;t instanceof s;)t=t._data;return t||null},s.prototype._onEvent=function(t,e,i){var s,o,n,r,a=e&&e.items,h=this._data,d=[],l=[],c=[];if(a&&h){switch(t){case"add":for(s=0,o=a.length;o>s;s++)n=a[s],r=this.get(n),r&&(this._ids[n]=!0,d.push(n));break;case"update":for(s=0,o=a.length;o>s;s++)n=a[s],r=this.get(n),r?this._ids[n]?l.push(n):(this._ids[n]=!0,d.push(n)):this._ids[n]&&(delete this._ids[n],c.push(n));break;case"remove":for(s=0,o=a.length;o>s;s++)n=a[s],this._ids[n]&&(delete this._ids[n],c.push(n))}d.length&&this._trigger("add",{items:d},i),l.length&&this._trigger("update",{items:l},i),c.length&&this._trigger("remove",{items:c},i)}},s.prototype.on=n.prototype.on,s.prototype.off=n.prototype.off,s.prototype._trigger=n.prototype._trigger,s.prototype.subscribe=s.prototype.on,s.prototype.unsubscribe=s.prototype.off,t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.width="400px",this.height="400px",this.margin=10,this.defaultXCenter="55%",this.defaultYCenter="50%",this.xLabel="x",this.yLabel="y",this.zLabel="z",this.filterLabel="time",this.legendLabel="value",this.style=s.STYLE.DOT,this.showPerspective=!0,this.showGrid=!0,this.keepAspectRatio=!0,this.showShadow=!1,this.showGrayBottom=!1,this.showTooltip=!1,this.verticalRatio=.5,this.animationInterval=1e3,this.animationPreload=!1,this.camera=new l,this.eye=new h(0,0,-1),this.dataTable=null,this.dataPoints=null,this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.colFilter=void 0,this.xMin=0,this.xStep=void 0,this.xMax=1,this.yMin=0,this.yStep=void 0,this.yMax=1,this.zMin=0,this.zStep=void 0,this.zMax=1,this.valueMin=0,this.valueMax=1,this.xBarWidth=1,this.yBarWidth=1,this.colorAxis="#4D4D4D",this.colorGrid="#D3D3D3",this.colorDot="#7DC1FF",this.colorDotBorder="#3267D2",this.create(),this.setOptions(i),e&&this.setData(e)}var o=i(49),n=i(3),r=i(4),a=i(1),h=i(9),d=i(8),l=i(6),c=i(7),p=i(10),u=i(11);o(s.prototype),s.prototype._setScale=function(){this.scale=new h(1/(this.xMax-this.xMin),1/(this.yMax-this.yMin),1/(this.zMax-this.zMin)),this.keepAspectRatio&&(this.scale.x3&&(this.colFilter=3);else{if(this.style!==s.STYLE.DOTCOLOR&&this.style!==s.STYLE.DOTSIZE&&this.style!==s.STYLE.BARCOLOR&&this.style!==s.STYLE.BARSIZE)throw'Unknown style "'+this.style+'"';this.colX=0,this.colY=1,this.colZ=2,this.colValue=3,t.getNumberOfColumns()>4&&(this.colFilter=4)}},s.prototype.getNumberOfRows=function(t){return t.length},s.prototype.getNumberOfColumns=function(t){var e=0;for(var i in t[0])t[0].hasOwnProperty(i)&&e++;return e},s.prototype.getDistinctValues=function(t,e){for(var i=[],s=0;st[s][e]&&(i.min=t[s][e]),i.maxt;t++){var m=(t-p)/(f-p),g=240*m,v=this._hsv2rgb(g,1,1);c.strokeStyle=v,c.beginPath(),c.moveTo(h,r+t),c.lineTo(a,r+t),c.stroke()}c.strokeStyle=this.colorAxis,c.strokeRect(h,r,i,n)}if(this.style===s.STYLE.DOTSIZE&&(c.strokeStyle=this.colorAxis,c.fillStyle=this.colorDot,c.beginPath(),c.moveTo(h,r),c.lineTo(a,r),c.lineTo(a-i+e,d),c.lineTo(h,d),c.closePath(),c.fill(),c.stroke()),this.style===s.STYLE.DOTCOLOR||this.style===s.STYLE.DOTSIZE){var y=5,b=new u(this.valueMin,this.valueMax,(this.valueMax-this.valueMin)/5,!0);for(b.start(),b.getCurrent()0?this.yMin:this.yMax,o=this._convert3Dto2D(new h(x,r,this.zMin)),Math.cos(2*_)>0?(g.textAlign="center",g.textBaseline="top",o.y+=b):Math.sin(2*_)<0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(" "+i.getCurrent()+" ",o.x,o.y),i.next()}for(g.lineWidth=1,s=void 0===this.defaultYStep,i=new u(this.yMin,this.yMax,this.yStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,o=this._convert3Dto2D(new h(n,i.getCurrent(),this.zMin)),Math.cos(2*_)<0?(g.textAlign="center",g.textBaseline="top",o.y+=b):Math.sin(2*_)>0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(" "+i.getCurrent()+" ",o.x,o.y),i.next();for(g.lineWidth=1,s=void 0===this.defaultZStep,i=new u(this.zMin,this.zMax,this.zStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax;!i.end();)t=this._convert3Dto2D(new h(n,r,i.getCurrent())),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(t.x-b,t.y),g.stroke(),g.textAlign="right",g.textBaseline="middle",g.fillStyle=this.colorAxis,g.fillText(i.getCurrent()+" ",t.x-5,t.y),i.next();g.lineWidth=1,t=this._convert3Dto2D(new h(n,r,this.zMin)),e=this._convert3Dto2D(new h(n,r,this.zMax)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke(),g.lineWidth=1,p=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),f=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(p.x,p.y),g.lineTo(f.x,f.y),g.stroke(),p=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),f=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(p.x,p.y),g.lineTo(f.x,f.y),g.stroke(),g.lineWidth=1,t=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke(),t=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke();var w=this.xLabel;w.length>0&&(c=.1/this.scale.y,n=(this.xMin+this.xMax)/2,r=Math.cos(_)>0?this.yMin-c:this.yMax+c,o=this._convert3Dto2D(new h(n,r,this.zMin)),Math.cos(2*_)>0?(g.textAlign="center",g.textBaseline="top"):Math.sin(2*_)<0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(w,o.x,o.y));var S=this.yLabel;S.length>0&&(l=.1/this.scale.x,n=Math.sin(_)>0?this.xMin-l:this.xMax+l,r=(this.yMin+this.yMax)/2,o=this._convert3Dto2D(new h(n,r,this.zMin)),Math.cos(2*_)<0?(g.textAlign="center",g.textBaseline="top"):Math.sin(2*_)>0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(S,o.x,o.y));var M=this.zLabel;M.length>0&&(d=30,n=Math.cos(_)>0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax,a=(this.zMin+this.zMax)/2,o=this._convert3Dto2D(new h(n,r,a)),g.textAlign="right",g.textBaseline="middle",g.fillStyle=this.colorAxis,g.fillText(M,o.x-d,o.y))},s.prototype._hsv2rgb=function(t,e,i){var s,o,n,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:s=r,o=h,n=0;break;case 1:s=h,o=r,n=0;break;case 2:s=0,o=r,n=h;break;case 3:s=0,o=h,n=r;break;case 4:s=h,o=0,n=r;break;case 5:s=r,o=0,n=h;break;default:s=0,o=0,n=0}return"RGB("+parseInt(255*s)+","+parseInt(255*o)+","+parseInt(255*n)+")"},s.prototype._redrawDataGrid=function(){var t,e,i,o,n,r,a,d,l,c,p,u,f,m=this.frame.canvas,g=m.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(n=0;n0}else r=!0;r?(f=(t.point.z+e.point.z+i.point.z+o.point.z)/4,c=240*(1-(f-this.zMin)*this.scale.z/this.verticalRatio),p=1,this.showShadow?(u=Math.min(1+S.x/M/2,1),a=this._hsv2rgb(c,p,u),d=a):(u=1,a=this._hsv2rgb(c,p,u),d=this.colorAxis)):(a="gray",d=this.colorAxis),l=.5,g.lineWidth=l,g.fillStyle=a,g.strokeStyle=d,g.beginPath(),g.moveTo(t.screen.x,t.screen.y),g.lineTo(e.screen.x,e.screen.y),g.lineTo(o.screen.x,o.screen.y),g.lineTo(i.screen.x,i.screen.y),g.closePath(),g.fill(),g.stroke()}}else for(n=0;np&&(p=0);var u,f,m;this.style===s.STYLE.DOTCOLOR?(u=240*(1-(d.point.value-this.valueMin)*this.scale.value),f=this._hsv2rgb(u,1,1),m=this._hsv2rgb(u,1,.8)):this.style===s.STYLE.DOTSIZE?(f=this.colorDot,m=this.colorDotBorder):(u=240*(1-(d.point.z-this.zMin)*this.scale.z/this.verticalRatio),f=this._hsv2rgb(u,1,1),m=this._hsv2rgb(u,1,.8)),i.lineWidth=1,i.strokeStyle=m,i.fillStyle=f,i.beginPath(),i.arc(d.screen.x,d.screen.y,p,0,2*Math.PI,!0),i.fill(),i.stroke()}}},s.prototype._redrawDataBar=function(){var t,e,i,o,n=this.frame.canvas,r=n.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(t=0;t0&&(t=this.dataPoints[0],s.lineWidth=1,s.strokeStyle="blue",s.beginPath(),s.moveTo(t.screen.x,t.screen.y)),e=1;e0&&s.stroke()}},s.prototype._onMouseDown=function(t){if(t=t||window.event,this.leftButtonDown&&this._onMouseUp(t),this.leftButtonDown=t.which?1===t.which:1===t.button,this.leftButtonDown||this.touchDown){this.startMouseX=getMouseX(t),this.startMouseY=getMouseY(t),this.startStart=new Date(this.start),this.startEnd=new Date(this.end),this.startArmRotation=this.camera.getArmRotation(),this.frame.style.cursor="move";var e=this;this.onmousemove=function(t){e._onMouseMove(t)},this.onmouseup=function(t){e._onMouseUp(t)},a.addEventListener(document,"mousemove",e.onmousemove),a.addEventListener(document,"mouseup",e.onmouseup),a.preventDefault(t)}},s.prototype._onMouseMove=function(t){t=t||window.event;var e=parseFloat(getMouseX(t))-this.startMouseX,i=parseFloat(getMouseY(t))-this.startMouseY,s=this.startArmRotation.horizontal+e/200,o=this.startArmRotation.vertical+i/200,n=4,r=Math.sin(n/360*2*Math.PI);Math.abs(Math.sin(s))0?1:0>t?-1:0}var s=e[0],o=e[1],n=e[2],r=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x)),a=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),h=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},s.prototype._dataPointFromXY=function(t,e){var i,o=100,n=null,r=null,a=null,h=new d(t,e);if(this.style===s.STYLE.BAR||this.style===s.STYLE.BARCOLOR||this.style===s.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var l=n.surfaces;if(l)for(var c=l.length-1;c>=0;c--){var p=l[c],u=p.corners,f=[u[0].screen,u[1].screen,u[2].screen],m=[u[2].screen,u[3].screen,u[0].screen];if(this._insideTriangle(h,f)||this._insideTriangle(h,m))return n}}else for(i=0;ib)&&o>b&&(a=b,r=n)}}return r},s.prototype._showTooltip=function(t){var e,i,s;this.tooltip?(e=this.tooltip.dom.content,i=this.tooltip.dom.line,s=this.tooltip.dom.dot):(e=document.createElement("div"),e.style.position="absolute",e.style.padding="10px",e.style.border="1px solid #4d4d4d",e.style.color="#1a1a1a",e.style.background="rgba(255,255,255,0.7)",e.style.borderRadius="2px",e.style.boxShadow="5px 5px 10px rgba(128,128,128,0.5)",i=document.createElement("div"),i.style.position="absolute",i.style.height="40px",i.style.width="0",i.style.borderLeft="1px solid #4d4d4d",s=document.createElement("div"),s.style.position="absolute",s.style.height="0",s.style.width="0",s.style.border="5px solid #4d4d4d",s.style.borderRadius="5px",this.tooltip={dataPoint:null,dom:{content:e,line:i,dot:s}}),this._hideTooltip(),this.tooltip.dataPoint=t,e.innerHTML="function"==typeof this.showTooltip?this.showTooltip(t.point):"
x:"+t.point.x+"
y:"+t.point.y+"
z:"+t.point.z+"
",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(s);var o=e.offsetWidth,n=e.offsetHeight,r=i.offsetHeight,a=s.offsetWidth,h=s.offsetHeight,d=t.screen.x-o/2;d=Math.min(Math.max(d,10),this.frame.clientWidth-10-o),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=d+"px",e.style.top=t.screen.y-r-n+"px",s.style.left=t.screen.x-a/2+"px",s.style.top=t.screen.y-h/2+"px"},s.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},getMouseX=function(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0},getMouseY=function(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0},t.exports=s},function(t,e,i){var s=i(9);Camera=function(){this.armLocation=new s,this.armRotation={},this.armRotation.horizontal=0,this.armRotation.vertical=0,this.armLength=1.7,this.cameraLocation=new s,this.cameraRotation=new s(.5*Math.PI,0,0),this.calculateCameraOrientation()},Camera.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},Camera.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),(void 0!==t||void 0!==e)&&this.calculateCameraOrientation()},Camera.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},Camera.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.calculateCameraOrientation())},Camera.prototype.getArmLength=function(){return this.armLength},Camera.prototype.getCameraLocation=function(){return this.cameraLocation},Camera.prototype.getCameraRotation=function(){return this.cameraRotation},Camera.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal},t.exports=Camera},function(t,e,i){function s(t,e,i){this.data=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=i.getDistinctValues(t.get(),this.column),this.values.sort(function(t,e){return t>e?1:e>t?-1:0}),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var o=i(4);s.prototype.isLoaded=function(){return this.loaded},s.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},s.prototype.getLabel=function(){return this.graph.filterLabel},s.prototype.getColumn=function(){return this.column},s.prototype.getSelectedValue=function(){return void 0===this.index?void 0:this.values[this.index]},s.prototype.getValues=function(){return this.values},s.prototype.getValue=function(t){if(t>=this.values.length)throw"Error: index out of range";return this.values[t]},s.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var s=new o(this.data,{filter:function(t){return t[i.column]==i.value}}).get();e=this.graph._getDataPoints(s),this.dataPoints[t]=e}return e},s.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},s.prototype.selectValue=function(t){if(t>=this.values.length)throw"Error: index out of range";this.index=t,this.value=this.values[t]},s.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t0&&(t--,this.setIndex(t))},s.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},s.prototype.setIndex=function(t){if(!(ts&&(s=0),s>this.values.length-1&&(s=this.values.length-1),s},s.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10,i=t/(this.values.length-1)*e,s=i+3;return s},s.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,s=this.leftToIndex(i);this.setIndex(s),o.preventDefault()},s.prototype._onMouseUp=function(){this.frame.style.cursor="auto",o.removeEventListener(document,"mousemove",this.onmousemove),o.removeEventListener(document,"mouseup",this.onmouseup),o.preventDefault()},t.exports=s},function(t){function e(t,e,i,s){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,s)}e.prototype.setRange=function(t,e,i,s){this._start=t?t:0,this._end=e?e:0,this.setStep(i,s)},e.prototype.setStep=function(t,i){void 0===t||0>=t||(void 0!==i&&(this.prettyStep=i),this._step=this.prettyStep===!0?e.calculatePrettyStep(t):t)},e.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),s=2*Math.pow(10,Math.round(e(t/2))),o=5*Math.pow(10,Math.round(e(t/5))),n=i;return Math.abs(s-t)<=Math.abs(n-t)&&(n=s),Math.abs(o-t)<=Math.abs(n-t)&&(n=o),0>=n&&(n=1),n},e.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},e.prototype.getStep=function(){return this._step},e.prototype.start=function(){this._current=this._start-this._start%this._step},e.prototype.next=function(){this._current+=this._step},e.prototype.end=function(){return this._current>this._end},t.exports=e},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");var n=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},util:{snap:null,toScreen:n._toScreen.bind(n),toGlobalScreen:n._toGlobalScreen.bind(n),toTime:n._toTime.bind(n),toGlobalTime:n._toGlobalTime.bind(n)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.itemSet=new p(this.body),this.components.push(this.itemSet),this.itemsData=null,this.groupsData=null,i&&this.setOptions(i),e?this.setItems(e):this.redraw()}var o=(i(49),i(41),i(1)),n=i(3),r=i(4),a=i(15),h=i(42),d=i(27),l=i(19),c=i(20),p=i(24);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e),i&&("start"in this.options||"end"in this.options)){this.fit();var s="start"in this.options?o.convert(this.options.start,"Date"):null,a="end"in this.options?o.convert(this.options.end,"Date"):null;this.setWindow(s,a)}},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.itemSet.setGroups(e)},s.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t)},s.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},s.prototype.focus=function(t){if(this.itemsData&&void 0!=t){var e=Array.isArray(t)?t:[t],i=this.itemsData.getDataSet().get(e,{type:{start:"Date",end:"Date"}}),s=null,o=null;i.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===s||s>e)&&(s=e),(null===o||i>o)&&(o=i)});var n=(s+o)/2,r=Math.max(this.range.end-this.range.start,1.1*(o-s));this.range.setRange(n-r/2,n+r/2)}},s.prototype.getItemRange=function(){var t=this.itemsData.getDataSet(),e=null,i=null;if(t){var s=t.min("start");e=s?o.convert(s.start,"Date").valueOf():null;var n=t.max("start");n&&(i=o.convert(n.start,"Date").valueOf());var r=t.max("end");r&&(i=null==i?o.convert(r.end,"Date").valueOf():Math.max(i,o.convert(r.end,"Date").valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},t.exports=s},function(t,e,i){function s(t,e,i,s){var n=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},util:{snap:null,toScreen:n._toScreen.bind(n),toGlobalScreen:n._toGlobalScreen.bind(n),toTime:n._toTime.bind(n),toGlobalTime:n._toGlobalTime.bind(n)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.linegraph=new p(this.body),this.components.push(this.linegraph),this.itemsData=null,this.groupsData=null,i&&this.setOptions(i),s&&this.setGroups(s),e?this.setItems(e):this.redraw()}var o=(i(49),i(41),i(1)),n=i(3),r=i(4),a=i(15),h=i(42),d=i(27),l=i(19),c=i(20),p=i(26);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.linegraph&&this.linegraph.setItems(e),i&&("start"in this.options||"end"in this.options)){this.fit();var s="start"in this.options?o.convert(this.options.start,"Date"):null,a="end"in this.options?o.convert(this.options.end,"Date"):null;this.setWindow(s,a)}},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.linegraph.setGroups(e)},s.prototype.getLegend=function(t,e,i){return void 0===e&&(e=15),void 0===i&&(i=15),void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].getLegend(e,i):"cannot find group:"+t},s.prototype.isGroupVisible=function(t){return void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].visible:!1},s.prototype.getItemRange=function(){var t=null,e=null;for(var i in this.linegraph.groups)if(this.linegraph.groups.hasOwnProperty(i)&&1==this.linegraph.groups[i].visible)for(var s=0;sr?r:t,e=null==e?r:r>e?r:e}return{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},t.exports=s},function(t){function e(t,e,i,s,o){this.current=0,this.autoScale=!0,this.stepIndex=0,this.step=1,this.scale=1,this.marginStart,this.marginEnd,this.deadSpace=0,this.majorSteps=[1,2,5,10],this.minorSteps=[.25,.5,1,2],this.setRange(t,e,i,s,o)}e.prototype.setRange=function(t,e,i,s,o){this._start=void 0===o.min?t:o.min,this._end=void 0===o.max?e:o.max,t==e&&(this._start=t-.75,this._end=e+1),this.autoScale&&this.setMinimumStep(i,s),this.setFirst(o)},e.prototype.setMinimumStep=function(t,e){var i=this._end-this._start,s=1.2*i,o=t*(s/e),n=Math.round(Math.log(s)/Math.LN10),r=-1,a=Math.pow(10,n),h=0;0>n&&(h=n);for(var d=!1,l=h;Math.abs(l)<=Math.abs(n);l++){a=Math.pow(10,l);for(var c=0;c=o){d=!0,r=c;break}}if(1==d)break}this.stepIndex=r,this.scale=a,this.step=a*this.minorSteps[r]},e.prototype.setFirst=function(t){void 0===t&&(t={});var e=void 0===t.min?this._start-2*this.scale*this.minorSteps[this.stepIndex]:t.min,i=void 0===t.max?this._end+this.scale*this.minorSteps[this.stepIndex]:t.max;this.marginEnd=void 0===t.max?this.roundToMinor(i):t.max,this.marginStart=void 0===t.min?this.roundToMinor(e):t.min,this.deadSpace=this.roundToMinor(i)-i+this.roundToMinor(e)-e,this.marginRange=this.marginEnd-this.marginStart,this.current=this.marginEnd},e.prototype.roundToMinor=function(t){var e=t-t%(this.scale*this.minorSteps[this.stepIndex]);return t%(this.scale*this.minorSteps[this.stepIndex])>.5*this.scale*this.minorSteps[this.stepIndex]?e+this.scale*this.minorSteps[this.stepIndex]:e},e.prototype.hasNext=function(){return this.current>=this.marginStart},e.prototype.next=function(){var t=this.current;this.current-=this.step,this.current==t&&(this.current=this._end)},e.prototype.previous=function(){this.current+=this.step,this.marginEnd+=this.step,this.marginRange=this.marginEnd-this.marginStart},e.prototype.getCurrent=function(){for(var t=""+Number(this.current).toPrecision(5),e=t.length-1;e>0;e--){if("0"!=t[e]){if("."==t[e]||","==t[e]){t=t.slice(0,e);break}break}t=t.slice(0,e)}return t},e.prototype.snap=function(){},e.prototype.isMajor=function(){return this.current%(this.scale*this.majorSteps[this.stepIndex])==0},t.exports=e},function(t,e,i){function s(t,e){var i=h().hours(0).minutes(0).seconds(0).milliseconds(0);this.start=i.clone().add("days",-3).valueOf(),this.end=i.clone().add("days",4).valueOf(),this.body=t,this.defaultOptions={start:null,end:null,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10},this.options=r.extend({},this.defaultOptions),this.props={touch:{}},this.body.emitter.on("dragstart",this._onDragStart.bind(this)),this.body.emitter.on("drag",this._onDrag.bind(this)),this.body.emitter.on("dragend",this._onDragEnd.bind(this)),this.body.emitter.on("hold",this._onHold.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("DOMMouseScroll",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.setOptions(e)}function o(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}function n(t,e){return{x:t.pageX-r.getAbsoluteLeft(e),y:t.pageY-r.getAbsoluteTop(e)}}var r=i(1),a=i(43),h=i(40),d=i(18);s.prototype=new d,s.prototype.setOptions=function(t){if(t){var e=["direction","min","max","zoomMin","zoomMax","moveable","zoomable"];r.selectiveExtend(e,this.options,t),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},s.prototype.setRange=function(t,e){var i=this._applyRange(t,e);if(i){var s={start:new Date(this.start),end:new Date(this.end)};this.body.emitter.emit("rangechange",s),this.body.emitter.emit("rangechanged",s)}},s.prototype._applyRange=function(t,e){var i,s=null!=t?r.convert(t,"Date").valueOf():this.start,o=null!=e?r.convert(e,"Date").valueOf():this.end,n=null!=this.options.max?r.convert(this.options.max,"Date").valueOf():null,a=null!=this.options.min?r.convert(this.options.min,"Date").valueOf():null;if(isNaN(s)||null===s)throw new Error('Invalid start "'+t+'"');if(isNaN(o)||null===o)throw new Error('Invalid end "'+e+'"');if(s>o&&(o=s),null!==a&&a>s&&(i=a-s,s+=i,o+=i,null!=n&&o>n&&(o=n)),null!==n&&o>n&&(i=o-n,s-=i,o-=i,null!=a&&a>s&&(s=a)),null!==this.options.zoomMin){var h=parseFloat(this.options.zoomMin);0>h&&(h=0),h>o-s&&(this.end-this.start===h?(s=this.start,o=this.end):(i=h-(o-s),s-=i/2,o+=i/2))}if(null!==this.options.zoomMax){var d=parseFloat(this.options.zoomMax);0>d&&(d=0),o-s>d&&(this.end-this.start===d?(s=this.start,o=this.end):(i=o-s-d,s+=i/2,o-=i/2))}var l=this.start!=s||this.end!=o;return this.start=s,this.end=o,l},s.prototype.getRange=function(){return{start:this.start,end:this.end}},s.prototype.conversion=function(t){return s.conversion(this.start,this.end,t)},s.conversion=function(t,e,i){return 0!=i&&e-t!=0?{offset:t,scale:i/(e-t)}:{offset:0,scale:1}},s.prototype._onDragStart=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.start=this.start,this.props.touch.end=this.end,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},s.prototype._onDrag=function(t){if(this.options.moveable){var e=this.options.direction;if(o(e),this.props.touch.allowDragging){var i="horizontal"==e?t.gesture.deltaX:t.gesture.deltaY,s=this.props.touch.end-this.props.touch.start,n="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height,r=-i/n*s;this._applyRange(this.props.touch.start+r,this.props.touch.end+r),this.body.emitter.emit("rangechange",{start:new Date(this.start),end:new Date(this.end)})}}},s.prototype._onDragEnd=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end)}))},s.prototype._onMouseWheel=function(t){if(this.options.zoomable&&this.options.moveable){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i;i=0>e?1-e/5:1/(1+e/5);var s=a.fakeGesture(this,t),o=n(s.center,this.body.dom.center),r=this._pointerToDate(o);this.zoom(i,r)}t.preventDefault()}},s.prototype._onTouch=function(){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null},s.prototype._onHold=function(){this.props.touch.allowDragging=!1},s.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable&&(this.props.touch.allowDragging=!1,t.gesture.touches.length>1)){this.props.touch.center||(this.props.touch.center=n(t.gesture.center,this.body.dom.center));var e=1/t.gesture.scale,i=this._pointerToDate(this.props.touch.center),s=parseInt(i+(this.props.touch.start-i)*e),o=parseInt(i+(this.props.touch.end-i)*e);this.setRange(s,o)}},s.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(o(i),"horizontal"==i){var s=this.body.domProps.center.width;return e=this.conversion(s),t.x/e.scale+e.offset}var n=this.body.domProps.center.height;return e=this.conversion(n),t.y/e.scale+e.offset},s.prototype.zoom=function(t,e){null==e&&(e=(this.start+this.end)/2);var i=e+(this.start-e)*t,s=e+(this.end-e)*t;this.setRange(i,s)},s.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,s=this.end+e*t;this.start=i,this.end=s},s.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,s=this.start-i,o=this.end-i;this.setRange(s,o)},t.exports=s},function(t,e){var i=.001;e.orderByStart=function(t){t.sort(function(t,e){return t.data.start-e.data.start})},e.orderByEnd=function(t){t.sort(function(t,e){var i="end"in t.data?t.data.end:t.data.start,s="end"in e.data?e.data.end:e.data.start;return i-s})},e.stack=function(t,i,s){var o,n;if(s)for(o=0,n=t.length;n>o;o++)t[o].top=null;for(o=0,n=t.length;n>o;o++){var r=t[o];if(null===r.top){r.top=i.axis;do{for(var a=null,h=0,d=t.length;d>h;h++){var l=t[h];if(null!==l.top&&l!==r&&e.collision(r,l,i.item)){a=l;break}}null!=a&&(r.top=a.top+a.height+i.item.vertical)}while(a)}}},e.nostack=function(t,e){var i,s;for(i=0,s=t.length;s>i;i++)t[i].top=e.axis},e.collision=function(t,e,s){return t.left-s.horizontal+ie.left&&t.top-s.vertical+ie.top}},function(t,e,i){function s(t,e,i){this.current=new Date,this._start=new Date,this._end=new Date,this.autoScale=!0,this.scale=s.SCALE.DAY,this.step=1,this.setRange(t,e,i)}var o=i(40);s.SCALE={MILLISECOND:1,SECOND:2,MINUTE:3,HOUR:4,DAY:5,WEEKDAY:6,MONTH:7,YEAR:8},s.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?new Date(t.valueOf()):new Date,this._end=void 0!=e?new Date(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},s.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},s.prototype.roundToMinor=function(){switch(this.scale){case s.SCALE.YEAR:this.current.setFullYear(this.step*Math.floor(this.current.getFullYear()/this.step)),this.current.setMonth(0);case s.SCALE.MONTH:this.current.setDate(1);case s.SCALE.DAY:case s.SCALE.WEEKDAY:this.current.setHours(0);case s.SCALE.HOUR:this.current.setMinutes(0);case s.SCALE.MINUTE:this.current.setSeconds(0);case s.SCALE.SECOND:this.current.setMilliseconds(0)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.setMilliseconds(this.current.getMilliseconds()-this.current.getMilliseconds()%this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()-this.current.getSeconds()%this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()-this.current.getMinutes()%this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()-this.current.getHours()%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()-1-(this.current.getDate()-1)%this.step+1);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()-this.current.getMonth()%this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()-this.current.getFullYear()%this.step)}},s.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},s.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current=new Date(this.current.valueOf()+1e3*this.step);break;case s.SCALE.MINUTE:this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case s.SCALE.HOUR:this.current=new Date(this.current.valueOf()+1e3*this.step*60*60);var e=this.current.getHours();this.current.setHours(e-e%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}else switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()+this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()+this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()+this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.getMilliseconds()0&&(this.step=e),this.autoScale=!1},s.prototype.setAutoScale=function(t){this.autoScale=t},s.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,o=864e5,n=36e5,r=6e4,a=1e3,h=1;1e3*e>t&&(this.scale=s.SCALE.YEAR,this.step=1e3),500*e>t&&(this.scale=s.SCALE.YEAR,this.step=500),100*e>t&&(this.scale=s.SCALE.YEAR,this.step=100),50*e>t&&(this.scale=s.SCALE.YEAR,this.step=50),10*e>t&&(this.scale=s.SCALE.YEAR,this.step=10),5*e>t&&(this.scale=s.SCALE.YEAR,this.step=5),e>t&&(this.scale=s.SCALE.YEAR,this.step=1),3*i>t&&(this.scale=s.SCALE.MONTH,this.step=3),i>t&&(this.scale=s.SCALE.MONTH,this.step=1),5*o>t&&(this.scale=s.SCALE.DAY,this.step=5),2*o>t&&(this.scale=s.SCALE.DAY,this.step=2),o>t&&(this.scale=s.SCALE.DAY,this.step=1),o/2>t&&(this.scale=s.SCALE.WEEKDAY,this.step=1),4*n>t&&(this.scale=s.SCALE.HOUR,this.step=4),n>t&&(this.scale=s.SCALE.HOUR,this.step=1),15*r>t&&(this.scale=s.SCALE.MINUTE,this.step=15),10*r>t&&(this.scale=s.SCALE.MINUTE,this.step=10),5*r>t&&(this.scale=s.SCALE.MINUTE,this.step=5),r>t&&(this.scale=s.SCALE.MINUTE,this.step=1),15*a>t&&(this.scale=s.SCALE.SECOND,this.step=15),10*a>t&&(this.scale=s.SCALE.SECOND,this.step=10),5*a>t&&(this.scale=s.SCALE.SECOND,this.step=5),a>t&&(this.scale=s.SCALE.SECOND,this.step=1),200*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=200),100*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=100),50*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=50),10*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=10),5*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=5),h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=1)}},s.prototype.snap=function(t){var e=new Date(t.valueOf());if(this.scale==s.SCALE.YEAR){var i=e.getFullYear()+Math.round(e.getMonth()/12);e.setFullYear(Math.round(i/this.step)*this.step),e.setMonth(0),e.setDate(0),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MONTH)e.getDate()>15?(e.setDate(1),e.setMonth(e.getMonth()+1)):e.setDate(1),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0);else if(this.scale==s.SCALE.DAY){switch(this.step){case 5:case 2:e.setHours(24*Math.round(e.getHours()/24));break;default:e.setHours(12*Math.round(e.getHours()/12))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.WEEKDAY){switch(this.step){case 5:case 2:e.setHours(12*Math.round(e.getHours()/12));break;default:e.setHours(6*Math.round(e.getHours()/6))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.HOUR){switch(this.step){case 4:e.setMinutes(60*Math.round(e.getMinutes()/60));break;default:e.setMinutes(30*Math.round(e.getMinutes()/30))}e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MINUTE){switch(this.step){case 15:case 10:e.setMinutes(5*Math.round(e.getMinutes()/5)),e.setSeconds(0);break;case 5:e.setSeconds(60*Math.round(e.getSeconds()/60));break;default:e.setSeconds(30*Math.round(e.getSeconds()/30))}e.setMilliseconds(0)}else if(this.scale==s.SCALE.SECOND)switch(this.step){case 15:case 10:e.setSeconds(5*Math.round(e.getSeconds()/5)),e.setMilliseconds(0);break;case 5:e.setMilliseconds(1e3*Math.round(e.getMilliseconds()/1e3));break;default:e.setMilliseconds(500*Math.round(e.getMilliseconds()/500))}else if(this.scale==s.SCALE.MILLISECOND){var o=this.step>5?this.step/2:1;e.setMilliseconds(Math.round(e.getMilliseconds()/o)*o)}return e},s.prototype.isMajor=function(){switch(this.scale){case s.SCALE.MILLISECOND:return 0==this.current.getMilliseconds();case s.SCALE.SECOND:return 0==this.current.getSeconds();case s.SCALE.MINUTE:return 0==this.current.getHours()&&0==this.current.getMinutes();case s.SCALE.HOUR:return 0==this.current.getHours();case s.SCALE.WEEKDAY:case s.SCALE.DAY:return 1==this.current.getDate();case s.SCALE.MONTH:return 0==this.current.getMonth();case s.SCALE.YEAR:return!1;default:return!1}},s.prototype.getLabelMinor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("SSS");case s.SCALE.SECOND:return o(t).format("s");case s.SCALE.MINUTE:return o(t).format("HH:mm");case s.SCALE.HOUR:return o(t).format("HH:mm");case s.SCALE.WEEKDAY:return o(t).format("ddd D");case s.SCALE.DAY:return o(t).format("D");case s.SCALE.MONTH:return o(t).format("MMM");case s.SCALE.YEAR:return o(t).format("YYYY");default:return""}},s.prototype.getLabelMajor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("HH:mm:ss");case s.SCALE.SECOND:return o(t).format("D MMMM HH:mm");case s.SCALE.MINUTE:case s.SCALE.HOUR:return o(t).format("ddd D MMMM");case s.SCALE.WEEKDAY:case s.SCALE.DAY:return o(t).format("MMMM YYYY");case s.SCALE.MONTH:return o(t).format("YYYY");case s.SCALE.YEAR:return"";default:return""}},t.exports=s},function(t){function e(){this.options=null,this.props=null}e.prototype.setOptions=function(t){t&&util.extend(this.options,t)},e.prototype.redraw=function(){return!1},e.prototype.destroy=function(){},e.prototype._isResized=function(){var t=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;return this.props._previousWidth=this.props.width,this.props._previousHeight=this.props.height,t},t.exports=e},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCurrentTime:!0,locales:a,locale:"en"},this.options=o.extend({},this.defaultOptions),this._create(),this.setOptions(e)}var o=i(1),n=i(18),r=i(40),a=i(44);s.prototype=new n,s.prototype._create=function(){var t=document.createElement("div");t.className="currenttime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},s.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},s.prototype.setOptions=function(t){t&&o.selectiveExtend(["showCurrentTime","locale","locales"],this.options,t)},s.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=new Date,i=this.body.util.toScreen(e),s=this.options.locales[this.options.locale],o=s.current+" "+s.time+": "+r(e).format("dddd, MMMM Do YYYY, H:mm:ss");o=o.charAt(0).toUpperCase()+o.substring(1),this.bar.style.left=i+"px",this.bar.title=o}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},s.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,s=1/i/10;30>s&&(s=30),s>1e3&&(s=1e3),e.redraw(),e.currentTimeTimer=setTimeout(t,s)}var e=this;t()},s.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCustomTime:!1,locales:h,locale:"en"},this.options=n.extend({},this.defaultOptions),this.customTime=new Date,this.eventParams={},this._create(),this.setOptions(e)}var o=i(41),n=i(1),r=i(18),a=i(40),h=i(44);s.prototype=new r,s.prototype.setOptions=function(t){t&&n.selectiveExtend(["showCustomTime","locale","locales"],this.options,t)},s.prototype._create=function(){var t=document.createElement("div");t.className="customtime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t;var e=document.createElement("div");e.style.position="relative",e.style.top="0px",e.style.left="-10px",e.style.height="100%",e.style.width="20px",t.appendChild(e),this.hammer=o(t,{prevent_default:!0}),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this))},s.prototype.destroy=function(){this.options.showCustomTime=!1,this.redraw(),this.hammer.enable(!1),this.hammer=null,this.body=null},s.prototype.redraw=function(){if(this.options.showCustomTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar));var e=this.body.util.toScreen(this.customTime),i=this.options.locales[this.options.locale],s=i.time+": "+a(this.customTime).format("dddd, MMMM Do YYYY, H:mm:ss");s=s.charAt(0).toUpperCase()+s.substring(1),this.bar.style.left=e+"px",this.bar.title=s}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar);return!1},s.prototype.setCustomTime=function(t){this.customTime=new Date(t.valueOf()),this.redraw()},s.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())},s.prototype._onDragStart=function(t){this.eventParams.dragging=!0,this.eventParams.customTime=this.customTime,t.stopPropagation(),t.preventDefault()},s.prototype._onDrag=function(t){if(this.eventParams.dragging){var e=t.gesture.deltaX,i=this.body.util.toScreen(this.eventParams.customTime)+e,s=this.body.util.toTime(i);this.setCustomTime(s),this.body.emitter.emit("timechange",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault()}},s.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.body.emitter.emit("timechanged",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault())},t.exports=s},function(t,e,i){function s(t,e,i){this.id=o.randomUUID(),this.body=t,this.defaultOptions={orientation:"left",showMinorLabels:!0,showMajorLabels:!0,icons:!0,majorLinesOffset:7,minorLinesOffset:4,labelOffsetX:10,labelOffsetY:2,iconWidth:20,width:"40px",visible:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}}},this.linegraphSVG=i,this.props={},this.DOMelements={lines:{},labels:{}},this.dom={},this.range={start:0,end:0},this.options=o.extend({},this.defaultOptions),this.conversionFactor=1,this.setOptions(e),this.width=Number((""+this.options.width).replace("px","")),this.minWidth=this.width,this.height=this.linegraphSVG.offsetHeight,this.stepPixels=25,this.stepPixelsForced=25,this.lineOffset=0,this.master=!0,this.svgElements={},this.groups={},this.amountOfGroups=0,this._create() +var i=this;this.frame.slide.onmousedown=function(t){i._onMouseDown(t)},this.frame.prev.onclick=function(t){i.prev(t)},this.frame.play.onclick=function(t){i.togglePlay(t)},this.frame.next.onclick=function(t){i.next(t)}}this.onChangeCallback=void 0,this.values=[],this.index=void 0,this.playTimeout=void 0,this.playInterval=1e3,this.playLoop=!0}var o=i(1);s.prototype.prev=function(){var t=this.getIndex();t>0&&(t--,this.setIndex(t))},s.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},s.prototype.setIndex=function(t){if(!(ts&&(s=0),s>this.values.length-1&&(s=this.values.length-1),s},s.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10,i=t/(this.values.length-1)*e,s=i+3;return s},s.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,s=this.leftToIndex(i);this.setIndex(s),o.preventDefault()},s.prototype._onMouseUp=function(){this.frame.style.cursor="auto",o.removeEventListener(document,"mousemove",this.onmousemove),o.removeEventListener(document,"mouseup",this.onmouseup),o.preventDefault()},t.exports=s},function(t){function e(t,e,i,s){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,s)}e.prototype.setRange=function(t,e,i,s){this._start=t?t:0,this._end=e?e:0,this.setStep(i,s)},e.prototype.setStep=function(t,i){void 0===t||0>=t||(void 0!==i&&(this.prettyStep=i),this._step=this.prettyStep===!0?e.calculatePrettyStep(t):t)},e.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),s=2*Math.pow(10,Math.round(e(t/2))),o=5*Math.pow(10,Math.round(e(t/5))),n=i;return Math.abs(s-t)<=Math.abs(n-t)&&(n=s),Math.abs(o-t)<=Math.abs(n-t)&&(n=o),0>=n&&(n=1),n},e.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},e.prototype.getStep=function(){return this._step},e.prototype.start=function(){this._current=this._start-this._start%this._step},e.prototype.next=function(){this._current+=this._step},e.prototype.end=function(){return this._current>this._end},t.exports=e},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");var n=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},util:{snap:null,toScreen:n._toScreen.bind(n),toGlobalScreen:n._toGlobalScreen.bind(n),toTime:n._toTime.bind(n),toGlobalTime:n._toGlobalTime.bind(n)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.itemSet=new p(this.body),this.components.push(this.itemSet),this.itemsData=null,this.groupsData=null,i&&this.setOptions(i),e?this.setItems(e):this.redraw()}var o=(i(49),i(41),i(1)),n=i(3),r=i(4),a=i(15),h=i(42),d=i(27),l=i(19),c=i(20),p=i(24);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e),i&&("start"in this.options||"end"in this.options)){this.fit();var s="start"in this.options?o.convert(this.options.start,"Date"):null,a="end"in this.options?o.convert(this.options.end,"Date"):null;this.setWindow(s,a)}},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.itemSet.setGroups(e)},s.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t)},s.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},s.prototype.focus=function(t){if(this.itemsData&&void 0!=t){var e=Array.isArray(t)?t:[t],i=this.itemsData.getDataSet().get(e,{type:{start:"Date",end:"Date"}}),s=null,o=null;i.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===s||s>e)&&(s=e),(null===o||i>o)&&(o=i)});var n=(s+o)/2,r=Math.max(this.range.end-this.range.start,1.1*(o-s));this.range.setRange(n-r/2,n+r/2)}},s.prototype.getItemRange=function(){var t=this.itemsData.getDataSet(),e=null,i=null;if(t){var s=t.min("start");e=s?o.convert(s.start,"Date").valueOf():null;var n=t.max("start");n&&(i=o.convert(n.start,"Date").valueOf());var r=t.max("end");r&&(i=null==i?o.convert(r.end,"Date").valueOf():Math.max(i,o.convert(r.end,"Date").valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},t.exports=s},function(t,e,i){function s(t,e,i,s){var n=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},util:{snap:null,toScreen:n._toScreen.bind(n),toGlobalScreen:n._toGlobalScreen.bind(n),toTime:n._toTime.bind(n),toGlobalTime:n._toGlobalTime.bind(n)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.linegraph=new p(this.body),this.components.push(this.linegraph),this.itemsData=null,this.groupsData=null,i&&this.setOptions(i),s&&this.setGroups(s),e?this.setItems(e):this.redraw()}var o=(i(49),i(41),i(1)),n=i(3),r=i(4),a=i(15),h=i(42),d=i(27),l=i(19),c=i(20),p=i(26);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.linegraph&&this.linegraph.setItems(e),i&&("start"in this.options||"end"in this.options)){this.fit();var s="start"in this.options?o.convert(this.options.start,"Date"):null,a="end"in this.options?o.convert(this.options.end,"Date"):null;this.setWindow(s,a)}},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.linegraph.setGroups(e)},s.prototype.getLegend=function(t,e,i){return void 0===e&&(e=15),void 0===i&&(i=15),void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].getLegend(e,i):"cannot find group:"+t},s.prototype.isGroupVisible=function(t){return void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].visible&&(void 0===this.options.groups.visibility[t]||1==this.options.groups.visibility[t]):!1},s.prototype.getItemRange=function(){var t=null,e=null;for(var i in this.linegraph.groups)if(this.linegraph.groups.hasOwnProperty(i)&&1==this.linegraph.groups[i].visible)for(var s=0;sr?r:t,e=null==e?r:r>e?r:e}return{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},t.exports=s},function(t){function e(t,e,i,s,o){this.current=0,this.autoScale=!0,this.stepIndex=0,this.step=1,this.scale=1,this.marginStart,this.marginEnd,this.deadSpace=0,this.majorSteps=[1,2,5,10],this.minorSteps=[.25,.5,1,2],this.setRange(t,e,i,s,o)}e.prototype.setRange=function(t,e,i,s,o){this._start=void 0===o.min?t:o.min,this._end=void 0===o.max?e:o.max,t==e&&(this._start=t-.75,this._end=e+1),this.autoScale&&this.setMinimumStep(i,s),this.setFirst(o)},e.prototype.setMinimumStep=function(t,e){var i=this._end-this._start,s=1.2*i,o=t*(s/e),n=Math.round(Math.log(s)/Math.LN10),r=-1,a=Math.pow(10,n),h=0;0>n&&(h=n);for(var d=!1,l=h;Math.abs(l)<=Math.abs(n);l++){a=Math.pow(10,l);for(var c=0;c=o){d=!0,r=c;break}}if(1==d)break}this.stepIndex=r,this.scale=a,this.step=a*this.minorSteps[r]},e.prototype.setFirst=function(t){void 0===t&&(t={});var e=void 0===t.min?this._start-2*this.scale*this.minorSteps[this.stepIndex]:t.min,i=void 0===t.max?this._end+this.scale*this.minorSteps[this.stepIndex]:t.max;this.marginEnd=void 0===t.max?this.roundToMinor(i):t.max,this.marginStart=void 0===t.min?this.roundToMinor(e):t.min,this.deadSpace=this.roundToMinor(i)-i+this.roundToMinor(e)-e,this.marginRange=this.marginEnd-this.marginStart,this.current=this.marginEnd},e.prototype.roundToMinor=function(t){var e=t-t%(this.scale*this.minorSteps[this.stepIndex]);return t%(this.scale*this.minorSteps[this.stepIndex])>.5*this.scale*this.minorSteps[this.stepIndex]?e+this.scale*this.minorSteps[this.stepIndex]:e},e.prototype.hasNext=function(){return this.current>=this.marginStart},e.prototype.next=function(){var t=this.current;this.current-=this.step,this.current==t&&(this.current=this._end)},e.prototype.previous=function(){this.current+=this.step,this.marginEnd+=this.step,this.marginRange=this.marginEnd-this.marginStart},e.prototype.getCurrent=function(){for(var t=""+Number(this.current).toPrecision(5),e=t.length-1;e>0;e--){if("0"!=t[e]){if("."==t[e]||","==t[e]){t=t.slice(0,e);break}break}t=t.slice(0,e)}return t},e.prototype.snap=function(){},e.prototype.isMajor=function(){return this.current%(this.scale*this.majorSteps[this.stepIndex])==0},t.exports=e},function(t,e,i){function s(t,e){var i=h().hours(0).minutes(0).seconds(0).milliseconds(0);this.start=i.clone().add("days",-3).valueOf(),this.end=i.clone().add("days",4).valueOf(),this.body=t,this.defaultOptions={start:null,end:null,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10},this.options=r.extend({},this.defaultOptions),this.props={touch:{}},this.body.emitter.on("dragstart",this._onDragStart.bind(this)),this.body.emitter.on("drag",this._onDrag.bind(this)),this.body.emitter.on("dragend",this._onDragEnd.bind(this)),this.body.emitter.on("hold",this._onHold.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("DOMMouseScroll",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.setOptions(e)}function o(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}function n(t,e){return{x:t.pageX-r.getAbsoluteLeft(e),y:t.pageY-r.getAbsoluteTop(e)}}var r=i(1),a=i(43),h=i(40),d=i(18);s.prototype=new d,s.prototype.setOptions=function(t){if(t){var e=["direction","min","max","zoomMin","zoomMax","moveable","zoomable"];r.selectiveExtend(e,this.options,t),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},s.prototype.setRange=function(t,e){var i=this._applyRange(t,e);if(i){var s={start:new Date(this.start),end:new Date(this.end)};this.body.emitter.emit("rangechange",s),this.body.emitter.emit("rangechanged",s)}},s.prototype._applyRange=function(t,e){var i,s=null!=t?r.convert(t,"Date").valueOf():this.start,o=null!=e?r.convert(e,"Date").valueOf():this.end,n=null!=this.options.max?r.convert(this.options.max,"Date").valueOf():null,a=null!=this.options.min?r.convert(this.options.min,"Date").valueOf():null;if(isNaN(s)||null===s)throw new Error('Invalid start "'+t+'"');if(isNaN(o)||null===o)throw new Error('Invalid end "'+e+'"');if(s>o&&(o=s),null!==a&&a>s&&(i=a-s,s+=i,o+=i,null!=n&&o>n&&(o=n)),null!==n&&o>n&&(i=o-n,s-=i,o-=i,null!=a&&a>s&&(s=a)),null!==this.options.zoomMin){var h=parseFloat(this.options.zoomMin);0>h&&(h=0),h>o-s&&(this.end-this.start===h?(s=this.start,o=this.end):(i=h-(o-s),s-=i/2,o+=i/2))}if(null!==this.options.zoomMax){var d=parseFloat(this.options.zoomMax);0>d&&(d=0),o-s>d&&(this.end-this.start===d?(s=this.start,o=this.end):(i=o-s-d,s+=i/2,o-=i/2))}var l=this.start!=s||this.end!=o;return this.start=s,this.end=o,l},s.prototype.getRange=function(){return{start:this.start,end:this.end}},s.prototype.conversion=function(t){return s.conversion(this.start,this.end,t)},s.conversion=function(t,e,i){return 0!=i&&e-t!=0?{offset:t,scale:i/(e-t)}:{offset:0,scale:1}},s.prototype._onDragStart=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.start=this.start,this.props.touch.end=this.end,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},s.prototype._onDrag=function(t){if(this.options.moveable){var e=this.options.direction;if(o(e),this.props.touch.allowDragging){var i="horizontal"==e?t.gesture.deltaX:t.gesture.deltaY,s=this.props.touch.end-this.props.touch.start,n="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height,r=-i/n*s;this._applyRange(this.props.touch.start+r,this.props.touch.end+r),this.body.emitter.emit("rangechange",{start:new Date(this.start),end:new Date(this.end)})}}},s.prototype._onDragEnd=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end)}))},s.prototype._onMouseWheel=function(t){if(this.options.zoomable&&this.options.moveable){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i;i=0>e?1-e/5:1/(1+e/5);var s=a.fakeGesture(this,t),o=n(s.center,this.body.dom.center),r=this._pointerToDate(o);this.zoom(i,r)}t.preventDefault()}},s.prototype._onTouch=function(){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null},s.prototype._onHold=function(){this.props.touch.allowDragging=!1},s.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable&&(this.props.touch.allowDragging=!1,t.gesture.touches.length>1)){this.props.touch.center||(this.props.touch.center=n(t.gesture.center,this.body.dom.center));var e=1/t.gesture.scale,i=this._pointerToDate(this.props.touch.center),s=parseInt(i+(this.props.touch.start-i)*e),o=parseInt(i+(this.props.touch.end-i)*e);this.setRange(s,o)}},s.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(o(i),"horizontal"==i){var s=this.body.domProps.center.width;return e=this.conversion(s),t.x/e.scale+e.offset}var n=this.body.domProps.center.height;return e=this.conversion(n),t.y/e.scale+e.offset},s.prototype.zoom=function(t,e){null==e&&(e=(this.start+this.end)/2);var i=e+(this.start-e)*t,s=e+(this.end-e)*t;this.setRange(i,s)},s.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,s=this.end+e*t;this.start=i,this.end=s},s.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,s=this.start-i,o=this.end-i;this.setRange(s,o)},t.exports=s},function(t,e){var i=.001;e.orderByStart=function(t){t.sort(function(t,e){return t.data.start-e.data.start})},e.orderByEnd=function(t){t.sort(function(t,e){var i="end"in t.data?t.data.end:t.data.start,s="end"in e.data?e.data.end:e.data.start;return i-s})},e.stack=function(t,i,s){var o,n;if(s)for(o=0,n=t.length;n>o;o++)t[o].top=null;for(o=0,n=t.length;n>o;o++){var r=t[o];if(null===r.top){r.top=i.axis;do{for(var a=null,h=0,d=t.length;d>h;h++){var l=t[h];if(null!==l.top&&l!==r&&e.collision(r,l,i.item)){a=l;break}}null!=a&&(r.top=a.top+a.height+i.item.vertical)}while(a)}}},e.nostack=function(t,e){var i,s;for(i=0,s=t.length;s>i;i++)t[i].top=e.axis},e.collision=function(t,e,s){return t.left-s.horizontal+ie.left&&t.top-s.vertical+ie.top}},function(t,e,i){function s(t,e,i){this.current=new Date,this._start=new Date,this._end=new Date,this.autoScale=!0,this.scale=s.SCALE.DAY,this.step=1,this.setRange(t,e,i)}var o=i(40);s.SCALE={MILLISECOND:1,SECOND:2,MINUTE:3,HOUR:4,DAY:5,WEEKDAY:6,MONTH:7,YEAR:8},s.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?new Date(t.valueOf()):new Date,this._end=void 0!=e?new Date(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},s.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},s.prototype.roundToMinor=function(){switch(this.scale){case s.SCALE.YEAR:this.current.setFullYear(this.step*Math.floor(this.current.getFullYear()/this.step)),this.current.setMonth(0);case s.SCALE.MONTH:this.current.setDate(1);case s.SCALE.DAY:case s.SCALE.WEEKDAY:this.current.setHours(0);case s.SCALE.HOUR:this.current.setMinutes(0);case s.SCALE.MINUTE:this.current.setSeconds(0);case s.SCALE.SECOND:this.current.setMilliseconds(0)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.setMilliseconds(this.current.getMilliseconds()-this.current.getMilliseconds()%this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()-this.current.getSeconds()%this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()-this.current.getMinutes()%this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()-this.current.getHours()%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()-1-(this.current.getDate()-1)%this.step+1);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()-this.current.getMonth()%this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()-this.current.getFullYear()%this.step)}},s.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},s.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current=new Date(this.current.valueOf()+1e3*this.step);break;case s.SCALE.MINUTE:this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case s.SCALE.HOUR:this.current=new Date(this.current.valueOf()+1e3*this.step*60*60);var e=this.current.getHours();this.current.setHours(e-e%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}else switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()+this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()+this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()+this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.getMilliseconds()0&&(this.step=e),this.autoScale=!1},s.prototype.setAutoScale=function(t){this.autoScale=t},s.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,o=864e5,n=36e5,r=6e4,a=1e3,h=1;1e3*e>t&&(this.scale=s.SCALE.YEAR,this.step=1e3),500*e>t&&(this.scale=s.SCALE.YEAR,this.step=500),100*e>t&&(this.scale=s.SCALE.YEAR,this.step=100),50*e>t&&(this.scale=s.SCALE.YEAR,this.step=50),10*e>t&&(this.scale=s.SCALE.YEAR,this.step=10),5*e>t&&(this.scale=s.SCALE.YEAR,this.step=5),e>t&&(this.scale=s.SCALE.YEAR,this.step=1),3*i>t&&(this.scale=s.SCALE.MONTH,this.step=3),i>t&&(this.scale=s.SCALE.MONTH,this.step=1),5*o>t&&(this.scale=s.SCALE.DAY,this.step=5),2*o>t&&(this.scale=s.SCALE.DAY,this.step=2),o>t&&(this.scale=s.SCALE.DAY,this.step=1),o/2>t&&(this.scale=s.SCALE.WEEKDAY,this.step=1),4*n>t&&(this.scale=s.SCALE.HOUR,this.step=4),n>t&&(this.scale=s.SCALE.HOUR,this.step=1),15*r>t&&(this.scale=s.SCALE.MINUTE,this.step=15),10*r>t&&(this.scale=s.SCALE.MINUTE,this.step=10),5*r>t&&(this.scale=s.SCALE.MINUTE,this.step=5),r>t&&(this.scale=s.SCALE.MINUTE,this.step=1),15*a>t&&(this.scale=s.SCALE.SECOND,this.step=15),10*a>t&&(this.scale=s.SCALE.SECOND,this.step=10),5*a>t&&(this.scale=s.SCALE.SECOND,this.step=5),a>t&&(this.scale=s.SCALE.SECOND,this.step=1),200*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=200),100*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=100),50*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=50),10*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=10),5*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=5),h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=1)}},s.prototype.snap=function(t){var e=new Date(t.valueOf());if(this.scale==s.SCALE.YEAR){var i=e.getFullYear()+Math.round(e.getMonth()/12);e.setFullYear(Math.round(i/this.step)*this.step),e.setMonth(0),e.setDate(0),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MONTH)e.getDate()>15?(e.setDate(1),e.setMonth(e.getMonth()+1)):e.setDate(1),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0);else if(this.scale==s.SCALE.DAY){switch(this.step){case 5:case 2:e.setHours(24*Math.round(e.getHours()/24));break;default:e.setHours(12*Math.round(e.getHours()/12))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.WEEKDAY){switch(this.step){case 5:case 2:e.setHours(12*Math.round(e.getHours()/12));break;default:e.setHours(6*Math.round(e.getHours()/6))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.HOUR){switch(this.step){case 4:e.setMinutes(60*Math.round(e.getMinutes()/60));break;default:e.setMinutes(30*Math.round(e.getMinutes()/30))}e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MINUTE){switch(this.step){case 15:case 10:e.setMinutes(5*Math.round(e.getMinutes()/5)),e.setSeconds(0);break;case 5:e.setSeconds(60*Math.round(e.getSeconds()/60));break;default:e.setSeconds(30*Math.round(e.getSeconds()/30))}e.setMilliseconds(0)}else if(this.scale==s.SCALE.SECOND)switch(this.step){case 15:case 10:e.setSeconds(5*Math.round(e.getSeconds()/5)),e.setMilliseconds(0);break;case 5:e.setMilliseconds(1e3*Math.round(e.getMilliseconds()/1e3));break;default:e.setMilliseconds(500*Math.round(e.getMilliseconds()/500))}else if(this.scale==s.SCALE.MILLISECOND){var o=this.step>5?this.step/2:1;e.setMilliseconds(Math.round(e.getMilliseconds()/o)*o)}return e},s.prototype.isMajor=function(){switch(this.scale){case s.SCALE.MILLISECOND:return 0==this.current.getMilliseconds();case s.SCALE.SECOND:return 0==this.current.getSeconds();case s.SCALE.MINUTE:return 0==this.current.getHours()&&0==this.current.getMinutes();case s.SCALE.HOUR:return 0==this.current.getHours();case s.SCALE.WEEKDAY:case s.SCALE.DAY:return 1==this.current.getDate();case s.SCALE.MONTH:return 0==this.current.getMonth();case s.SCALE.YEAR:return!1;default:return!1}},s.prototype.getLabelMinor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("SSS");case s.SCALE.SECOND:return o(t).format("s");case s.SCALE.MINUTE:return o(t).format("HH:mm");case s.SCALE.HOUR:return o(t).format("HH:mm");case s.SCALE.WEEKDAY:return o(t).format("ddd D");case s.SCALE.DAY:return o(t).format("D");case s.SCALE.MONTH:return o(t).format("MMM");case s.SCALE.YEAR:return o(t).format("YYYY");default:return""}},s.prototype.getLabelMajor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("HH:mm:ss");case s.SCALE.SECOND:return o(t).format("D MMMM HH:mm");case s.SCALE.MINUTE:case s.SCALE.HOUR:return o(t).format("ddd D MMMM");case s.SCALE.WEEKDAY:case s.SCALE.DAY:return o(t).format("MMMM YYYY");case s.SCALE.MONTH:return o(t).format("YYYY");case s.SCALE.YEAR:return"";default:return""}},t.exports=s},function(t){function e(){this.options=null,this.props=null}e.prototype.setOptions=function(t){t&&util.extend(this.options,t)},e.prototype.redraw=function(){return!1},e.prototype.destroy=function(){},e.prototype._isResized=function(){var t=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;return this.props._previousWidth=this.props.width,this.props._previousHeight=this.props.height,t},t.exports=e},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCurrentTime:!0,locales:a,locale:"en"},this.options=o.extend({},this.defaultOptions),this._create(),this.setOptions(e)}var o=i(1),n=i(18),r=i(40),a=i(44);s.prototype=new n,s.prototype._create=function(){var t=document.createElement("div");t.className="currenttime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},s.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},s.prototype.setOptions=function(t){t&&o.selectiveExtend(["showCurrentTime","locale","locales"],this.options,t)},s.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=new Date,i=this.body.util.toScreen(e),s=this.options.locales[this.options.locale],o=s.current+" "+s.time+": "+r(e).format("dddd, MMMM Do YYYY, H:mm:ss");o=o.charAt(0).toUpperCase()+o.substring(1),this.bar.style.left=i+"px",this.bar.title=o}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},s.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,s=1/i/10;30>s&&(s=30),s>1e3&&(s=1e3),e.redraw(),e.currentTimeTimer=setTimeout(t,s)}var e=this;t()},s.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCustomTime:!1,locales:h,locale:"en"},this.options=n.extend({},this.defaultOptions),this.customTime=new Date,this.eventParams={},this._create(),this.setOptions(e)}var o=i(41),n=i(1),r=i(18),a=i(40),h=i(44);s.prototype=new r,s.prototype.setOptions=function(t){t&&n.selectiveExtend(["showCustomTime","locale","locales"],this.options,t)},s.prototype._create=function(){var t=document.createElement("div");t.className="customtime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t;var e=document.createElement("div");e.style.position="relative",e.style.top="0px",e.style.left="-10px",e.style.height="100%",e.style.width="20px",t.appendChild(e),this.hammer=o(t,{prevent_default:!0}),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this))},s.prototype.destroy=function(){this.options.showCustomTime=!1,this.redraw(),this.hammer.enable(!1),this.hammer=null,this.body=null},s.prototype.redraw=function(){if(this.options.showCustomTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar));var e=this.body.util.toScreen(this.customTime),i=this.options.locales[this.options.locale],s=i.time+": "+a(this.customTime).format("dddd, MMMM Do YYYY, H:mm:ss");s=s.charAt(0).toUpperCase()+s.substring(1),this.bar.style.left=e+"px",this.bar.title=s}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar);return!1},s.prototype.setCustomTime=function(t){this.customTime=new Date(t.valueOf()),this.redraw()},s.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())},s.prototype._onDragStart=function(t){this.eventParams.dragging=!0,this.eventParams.customTime=this.customTime,t.stopPropagation(),t.preventDefault()},s.prototype._onDrag=function(t){if(this.eventParams.dragging){var e=t.gesture.deltaX,i=this.body.util.toScreen(this.eventParams.customTime)+e,s=this.body.util.toTime(i);this.setCustomTime(s),this.body.emitter.emit("timechange",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault()}},s.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.body.emitter.emit("timechanged",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault())},t.exports=s},function(t,e,i){function s(t,e,i){this.id=o.randomUUID(),this.body=t,this.defaultOptions={orientation:"left",showMinorLabels:!0,showMajorLabels:!0,icons:!0,majorLinesOffset:7,minorLinesOffset:4,labelOffsetX:10,labelOffsetY:2,iconWidth:20,width:"40px",visible:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}}},this.linegraphSVG=i,this.props={},this.DOMelements={lines:{},labels:{}},this.dom={},this.range={start:0,end:0},this.options=o.extend({},this.defaultOptions),this.conversionFactor=1,this.setOptions(e),this.width=Number((""+this.options.width).replace("px","")),this.minWidth=this.width,this.height=this.linegraphSVG.offsetHeight,this.stepPixels=25,this.stepPixelsForced=25,this.lineOffset=0,this.master=!0,this.svgElements={},this.groups={},this.amountOfGroups=0,this._create() }var o=i(1),n=i(2),r=i(18),a=i(14);s.prototype=new r,s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype.setOptions=function(t){if(t){var e=!1;this.options.orientation!=t.orientation&&void 0!==t.orientation&&(e=!0);var i=["orientation","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","width","visible","customRange"];o.selectiveExtend(i,this.options,t),this.minWidth=Number((""+this.options.width).replace("px","")),1==e&&this.dom.frame&&(this.hide(),this.show())}},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.style.width=this.options.width,this.dom.frame.style.height=this.height,this.dom.lineContainer=document.createElement("div"),this.dom.lineContainer.style.width="100%",this.dom.lineContainer.style.height=this.height,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.height="100%",this.svg.style.width="100%",this.svg.style.display="block",this.dom.frame.appendChild(this.svg)},s.prototype._redrawGroupIcons=function(){n.prepareElements(this.svgElements);var t,e=this.options.iconWidth,i=15,s=4,o=s+.5*i;t="left"==this.options.orientation?s:this.width-e-s;for(var r in this.groups)this.groups.hasOwnProperty(r)&&1==this.groups[r].visible&&(this.groups[r].drawIcon(t,o,this.svgElements,this.svg,e,i),o+=i+s);n.cleanupElements(this.svgElements)},s.prototype.show=function(){this.dom.frame.parentNode||("left"==this.options.orientation?this.body.dom.left.appendChild(this.dom.frame):this.body.dom.right.appendChild(this.dom.frame)),this.dom.lineContainer.parentNode||this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.lineContainer.parentNode&&this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer)},s.prototype.setRange=function(t,e){this.range.start=t,this.range.end=e},s.prototype.redraw=function(){var t=!1,e=0;for(var i in this.groups)this.groups.hasOwnProperty(i)&&1==this.groups[i].visible&&e++;if(0==this.amountOfGroups||0==e)this.hide();else{this.show(),this.height=Number(this.linegraphSVG.style.height.replace("px","")),this.dom.lineContainer.style.height=this.height+"px",this.width=1==this.options.visible?Number((""+this.options.width).replace("px","")):0;var s=this.props,o=this.dom.frame;o.className="dataaxis",this._calculateCharSize();var n=this.options.orientation,r=this.options.showMinorLabels,a=this.options.showMajorLabels;s.minorLabelHeight=r?s.minorCharHeight:0,s.majorLabelHeight=a?s.majorCharHeight:0,s.minorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.minorLinesOffset,s.minorLineHeight=1,s.majorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.majorLinesOffset,s.majorLineHeight=1,"left"==n?(o.style.top="0",o.style.left="0",o.style.bottom="",o.style.width=this.width+"px",o.style.height=this.height+"px"):(o.style.top="",o.style.bottom="0",o.style.left="0",o.style.width=this.width+"px",o.style.height=this.height+"px"),t=this._redrawLabels(),1==this.options.icons&&this._redrawGroupIcons()}return t},s.prototype._redrawLabels=function(){n.prepareElements(this.DOMelements.lines),n.prepareElements(this.DOMelements.labels);var t=this.options.orientation,e=this.master?this.props.majorCharHeight||10:this.stepPixelsForced,i=new a(this.range.start,this.range.end,e,this.dom.frame.offsetHeight,this.options.customRange[this.options.orientation]);this.step=i;var s=(this.dom.frame.offsetHeight-i.deadSpace*(this.dom.frame.offsetHeight/i.marginRange))/((i.marginRange-i.deadSpace)/i.step);this.stepPixels=s;var o=this.height/s,r=0;if(0==this.master){s=this.stepPixelsForced,r=Math.round(this.dom.frame.offsetHeight/s-o);for(var h=0;.5*r>h;h++)i.previous();o=this.height/s}else o+=.25;this.valueAtZero=i.marginEnd;var d=0,l=1;this.maxLabelSize=0;for(var c=0;l=0&&this._redrawLabel(c-2,i.getCurrent(),t,"yAxis major",this.props.majorCharHeight),this._redrawLine(c,t,"grid horizontal major",this.options.majorLinesOffset,this.props.majorLineWidth)):this._redrawLine(c,t,"grid horizontal minor",this.options.minorLinesOffset,this.props.minorLineWidth),l++}this.conversionFactor=0==this.master?c/(this.valueAtZero-i.current):this.dom.frame.offsetHeight/i.marginRange;var u=1==this.options.icons?this.options.iconWidth+this.options.labelOffsetX+15:this.options.labelOffsetX+15;return this.maxLabelSize>this.width-u&&1==this.options.visible?(this.width=this.maxLabelSize+u,this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+u),this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):(n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),!1)},s.prototype.convertValue=function(t){var e=this.valueAtZero-t,i=e*this.conversionFactor;return i},s.prototype._redrawLabel=function(t,e,i,s,o){var r=n.getDOMElement("div",this.DOMelements.labels,this.dom.frame);r.className=s,r.innerHTML=e,"left"==i?(r.style.left="-"+this.options.labelOffsetX+"px",r.style.textAlign="right"):(r.style.right="-"+this.options.labelOffsetX+"px",r.style.textAlign="left"),r.style.top=t-.5*o+this.options.labelOffsetY+"px",e+="";var a=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSizee.axis){var c=d-e.axis;l-=c,o.forEach(h,function(t){t.top-=c})}a=l+e.item.vertical/2}else a=e.axis+e.item.vertical;a=Math.max(a,this.props.label.height);var p=this.dom.foreground;this.top=p.offsetTop,this.left=p.offsetLeft,this.width=p.offsetWidth,s=o.updateProperty(this,"height",a)||s,s=o.updateProperty(this.props.label,"width",this.dom.inner.clientWidth)||s,s=o.updateProperty(this.props.label,"height",this.dom.inner.clientHeight)||s,this.dom.background.style.height=a+"px",this.dom.foreground.style.height=a+"px",this.dom.label.style.height=a+"px";for(var u=0,f=this.visibleItems.length;f>u;u++){var m=this.visibleItems[u];m.repositionY()}return s},s.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},s.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var s=this.dom.axis;s.parentNode&&s.parentNode.removeChild(s)},s.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},s.prototype.remove=function(t){delete this.items[t.id],t.setParent(this.itemSet);var e=this.visibleItems.indexOf(t);-1!=e&&this.visibleItems.splice(e,1)},s.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},s.prototype.order=function(){var t=o.toArray(this.items);this.orderedItems.byStart=t,this.orderedItems.byEnd=this._constructByEndArray(t),n.orderByStart(this.orderedItems.byStart),n.orderByEnd(this.orderedItems.byEnd)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0)for(n=0;n=0&&!this._checkIfInvisible(t.byStart[n],r,i);n--);for(n=s+1;n=0&&!this._checkIfInvisible(t.byEnd[n],r,i);n--);for(n=a+1;ne;e++)s=this.selection[e],o=this.items[s],o&&o.unselect();for(this.selection=[],e=0,i=t.length;i>e;e++)s=t[e],o=this.items[s],o&&(this.selection.push(s),o.select())},s.prototype.getSelection=function(){return this.selection.concat([])},s.prototype.getVisibleItems=function(){var t=this.body.range.getRange(),e=this.body.util.toScreen(t.start),i=this.body.util.toScreen(t.end),s=[];for(var o in this.groups)if(this.groups.hasOwnProperty(o))for(var n=this.groups[o],r=n.visibleItems,a=0;ae&&s.push(h.id)}return s},s.prototype._deselect=function(t){for(var e=this.selection,i=0,s=e.length;s>i;i++)if(e[i]==t){e.splice(i,1);break}},s.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=r.option.asSize,s=this.options,o=s.orientation,n=!1,a=this.dom.frame,h=s.editable.updateTime||s.editable.updateGroup;a.className="itemset"+(h?" editable":""),n=this._orderGroups()||n;var d=e.end-e.start,l=d!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;l&&(this.stackDirty=!0),this.lastVisibleInterval=d,this.props.lastWidth=this.props.width;var c=this.stackDirty,p=this._firstGroup(),u={item:t.item,axis:t.axis},f={item:t.item,axis:t.item.vertical/2},m=0,g=t.axis+t.item.vertical;return r.forEach(this.groups,function(t){var i=t==p?u:f,s=t.redraw(e,i,c);n=s||n,m+=t.height}),m=Math.max(m,g),this.stackDirty=!1,a.style.height=i(m),this.props.top=a.offsetTop,this.props.left=a.offsetLeft,this.props.width=a.offsetWidth,this.props.height=m,this.dom.axis.style.top=i("top"==o?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.dom.axis.style.left="0",n=this._isResized()||n},s.prototype._firstGroup=function(){var t="top"==this.options.orientation?0:this.groupIds.length-1,e=this.groupIds[t],i=this.groups[e]||this.groups[f];return i||null},s.prototype._updateUngrouped=function(){var t=this.groups[f];if(this.groupsData)t&&(t.hide(),delete this.groups[f]);else if(!t){var e=null,i=null;t=new l(e,i,this),this.groups[f]=t;for(var s in this.items)this.items.hasOwnProperty(s)&&t.add(this.items[s]);t.show()}},s.prototype.getLabelSet=function(){return this.dom.labelSet},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof a||t instanceof h))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(r.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var o=this.id;r.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,o)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}},s.prototype.getItems=function(){return this.itemsData},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(r.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof a||t instanceof h))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;r.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("change")},s.prototype.getGroups=function(){return this.groupsData},s.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},s.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i=e.itemsData.get(t,e.itemOptions),o=e.items[t],n=i.type||e.options.type||(i.end?"range":"box"),r=s.types[n];if(o&&(r&&o instanceof r?e._updateItem(o,i):(e._removeItem(o),o=null)),!o){if(!r)throw new TypeError("rangeoverflow"==n?'Item type "rangeoverflow" is deprecated. Use css styling instead: .vis.timeline .item.range .content {overflow: visible;}':'Unknown item type "'+n+'"');o=new r(i,e.conversion,e.options),o.id=t,e._addItem(o)}}),this._order(),this.stackDirty=!0,this.body.emitter.emit("change")},s.prototype._onAdd=s.prototype._onUpdate,s.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var s=i.items[t];s&&(e++,i._removeItem(s))}),e&&(this._order(),this.stackDirty=!0,this.body.emitter.emit("change"))},s.prototype._order=function(){r.forEach(this.groups,function(t){t.order()})},s.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},s.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),s=e.groups[t];if(s)s.setData(i);else{if(t==f)throw new Error("Illegal group id. "+t+" is a reserved id.");var o=Object.create(e.options);r.extend(o,{height:null}),s=new l(t,i,e),e.groups[t]=s;for(var n in e.items)if(e.items.hasOwnProperty(n)){var a=e.items[n];a.data.group==t&&s.add(a)}s.order(),s.show()}}),this.body.emitter.emit("change")},s.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("change")},s.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder}),e=!r.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},s.prototype._addItem=function(t){this.items[t.id]=t;var e=this.groupsData?t.data.group:f,i=this.groups[e];i&&i.add(t)},s.prototype._updateItem=function(t,e){var i=t.data.group;if(t.data=e,t.displayed&&t.redraw(),i!=t.data.group){var s=this.groups[i];s&&s.remove(t);var o=this.groupsData?t.data.group:f,n=this.groups[o];n&&n.add(t)}},s.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1);var i=this.groupsData?t.data.group:f,s=this.groups[i];s&&s.remove(t)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0||o.length>0)&&this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}},s.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=this.body.util.snap||null,o=s.itemFromTarget(t);if(o){var n=e.itemsData.get(o.id);this.options.onUpdate(n,function(t){t&&e.itemsData.update(t)})}else{var a=r.getAbsoluteLeft(this.dom.frame),h=t.gesture.center.pageX-a,d=this.body.util.toTime(h),l={start:i?i(d):d,content:"new item"};if("range"===this.options.type){var c=this.body.util.toTime(h+this.props.width/5);l.end=i?i(c):c}l[this.itemsData.fieldId]=r.randomUUID();var p=s.groupFromTarget(t);p&&(l.group=p.groupId),this.options.onAdd(l,function(t){t&&e.itemsData.add(l)})}}},s.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e,i=s.itemFromTarget(t);if(i){e=this.getSelection();var o=e.indexOf(i.id);-1==o?e.push(i.id):e.splice(o,1),this.setSelection(e),this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}}},s.itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},s.groupFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-group"))return e["timeline-group"];e=e.parentNode}return null},s.itemSetFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-itemset"))return e["timeline-itemset"];e=e.parentNode}return null},t.exports=s},function(t,e,i){function s(t,e,i){this.body=t,this.defaultOptions={enabled:!0,icons:!0,iconSize:20,iconSpacing:6,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-left"}},this.side=i,this.options=o.extend({},this.defaultOptions),this.svgElements={},this.dom={},this.groups={},this.amountOfGroups=0,this._create(),this.setOptions(e)}var o=i(1),n=i(2),r=i(18);s.prototype=new r,s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.className="legend",this.dom.frame.style.position="absolute",this.dom.frame.style.top="10px",this.dom.frame.style.display="block",this.dom.textArea=document.createElement("div"),this.dom.textArea.className="legendText",this.dom.textArea.style.position="relative",this.dom.textArea.style.top="0px",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.width=this.options.iconSize+5+"px",this.dom.frame.appendChild(this.svg),this.dom.frame.appendChild(this.dom.textArea)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setOptions=function(t){var e=["enabled","orientation","icons","left","right"];o.selectiveDeepExtend(e,this.options,t)},s.prototype.redraw=function(){var t=0;for(var e in this.groups)this.groups.hasOwnProperty(e)&&1==this.groups[e].visible&&t++;if(0==this.options[this.side].visible||0==this.amountOfGroups||0==this.options.enabled||0==t)this.hide();else{this.show(),"top-left"==this.options[this.side].position||"bottom-left"==this.options[this.side].position?(this.dom.frame.style.left="4px",this.dom.frame.style.textAlign="left",this.dom.textArea.style.textAlign="left",this.dom.textArea.style.left=this.options.iconSize+15+"px",this.dom.textArea.style.right="",this.svg.style.left="0px",this.svg.style.right=""):(this.dom.frame.style.right="4px",this.dom.frame.style.textAlign="right",this.dom.textArea.style.textAlign="right",this.dom.textArea.style.right=this.options.iconSize+15+"px",this.dom.textArea.style.left="",this.svg.style.right="0px",this.svg.style.left=""),"top-left"==this.options[this.side].position||"top-right"==this.options[this.side].position?(this.dom.frame.style.top=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.bottom=""):(this.dom.frame.style.bottom=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.top=""),0==this.options.icons?(this.dom.frame.style.width=this.dom.textArea.offsetWidth+10+"px",this.dom.textArea.style.right="",this.dom.textArea.style.left="",this.svg.style.width="0px"):(this.dom.frame.style.width=this.options.iconSize+15+this.dom.textArea.offsetWidth+10+"px",this.drawLegendIcons()); -var i="";for(var e in this.groups)this.groups.hasOwnProperty(e)&&1==this.groups[e].visible&&(i+=this.groups[e].content+"
");this.dom.textArea.innerHTML=i,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},s.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){n.prepareElements(this.svgElements);var t=window.getComputedStyle(this.dom.frame).paddingTop,e=Number(t.replace("px","")),i=e,s=this.options.iconSize,o=.75*this.options.iconSize,r=e+.5*o+3;this.svg.style.width=s+5+e+"px";for(var a in this.groups)this.groups.hasOwnProperty(a)&&1==this.groups[a].visible&&(this.groups[a].drawIcon(i,r,this.svgElements,this.svg,s,o),r+=o+this.options.iconSpacing);n.cleanupElements(this.svgElements)}},t.exports=s},function(t,e,i){function s(t,e){this.id=o.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,handleOverlap:"overlap",align:"center"},catmullRom:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:"40px",visible:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}}},legend:{enabled:!1,icons:!0,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}}},this.options=o.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={},this.abortedGraphUpdate=!1;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechange",function(){if(0!=i.lastStart){var t=i.body.range.start-i.lastStart,e=i.body.range.end-i.body.range.start;if(0!=i.width){var s=i.width/e,o=t*s;i.svg.style.left=-i.width-o+"px"}}}),this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=o.option.asSize(-i.width),i._updateGraph.apply(i)}),this._create(),this.body.emitter.emit("change")}var o=i(1),n=i(2),r=i(3),a=i(4),h=i(18),d=i(21),l=i(22),c=i(25),p="__ungrouped__";s.prototype=new h,s.prototype._create=function(){var t=document.createElement("div");t.className="LineGraph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new d(this.body,this.options.dataAxis,this.svg),this.options.dataAxis.orientation="right",this.yAxisRight=new d(this.body,this.options.dataAxis,this.svg),delete this.options.dataAxis.orientation,this.legendLeft=new c(this.body,this.options.legend,"left"),this.legendRight=new c(this.body,this.options.legend,"right"),this.show()},s.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort"];o.selectiveDeepExtend(e,this.options,t),o.mergeOptions(this.options,t,"catmullRom"),o.mergeOptions(this.options,t,"drawPoints"),o.mergeOptions(this.options,t,"shaded"),o.mergeOptions(this.options,t,"legend"),t.catmullRom&&"object"==typeof t.catmullRom&&t.catmullRom.parametrization&&("uniform"==t.catmullRom.parametrization?this.options.catmullRom.alpha=0:"chordal"==t.catmullRom.parametrization?this.options.catmullRom.alpha=1:(this.options.catmullRom.parametrization="centripetal",this.options.catmullRom.alpha=.5)),this.yAxisLeft&&void 0!==t.dataAxis&&(this.yAxisLeft.setOptions(this.options.dataAxis),this.yAxisRight.setOptions(this.options.dataAxis)),this.legendLeft&&void 0!==t.legend&&(this.legendLeft.setOptions(this.options.legend),this.legendRight.setOptions(this.options.legend)),this.groups.hasOwnProperty(p)&&this.groups[p].setOptions(t)}this.dom.frame&&this._updateGraph()},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(o.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;o.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e)}this._updateUngrouped(),this._updateGraph(),this.redraw()},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(o.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;o.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._onUpdate()},s.prototype._onUpdate=function(){this._updateUngrouped(),this._updateAllGroupData(),this._updateGraph(),this.redraw()},s.prototype._onAdd=function(t){this._onUpdate(t)},s.prototype._onRemove=function(t){this._onUpdate(t)},s.prototype._onUpdateGroups=function(t){for(var e=0;e0){var d=this.body.util.toGlobalTime(-this.body.domProps.root.width),l=this.body.util.toGlobalTime(2*this.body.domProps.root.width),c={};for(this._getRelevantData(a,c,d,l),e=0;e0)for(r=0;rs){d.push(h);break}d.push(h)}}else for(a=0;ai&&h.x0)for(var s=0;s0){var n=1,r=o.length,a=this.body.util.toGlobalScreen(o[o.length-1].x)-this.body.util.toGlobalScreen(o[0].x),h=r/a;n=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=[],l=0;r>l;l+=n)d.push(o[l]);e[t[s]]=d}}},s.prototype._getYRanges=function(t,e,i){var s,o,n,r,a,h=[],d=[];if(t.length>0){for(n=0;n0)if(o=this.groups[t[n]],"line"==o.options.style||"stack"!=o.options.barChart.handleOverlap){var l=s[0].y,c=s[0].y;for(r=0;rs[r].y?s[r].y:l,c=c0&&(h.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x}),p={},this._getDataIntersections(p,h),i.__barchartLeft=this._getStackedBarYRange(p,h),i.__barchartLeft.yAxisOrientation="left",t.push("__barchartLeft")),d.length>0&&(d.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x}),p={},this._getDataIntersections(p,d),i.__barchartRight=this._getStackedBarYRange(p,d),i.__barchartRight.yAxisOrientation="right",t.push("__barchartRight"))}},s.prototype._getStackedBarYRange=function(t,e){for(var i,s=e[0].y,o=e[0].y,n=0;ne[n].y?e[n].y:s,o=ot[r].accumulated?t[r].accumulated:s,o=o0){for(var c=0;ci?i:a,d=s>d?s:d):(r=!0,h=h>i?i:h,l=s>l?s:l));1==n&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}return o=this._toggleAxisVisiblity(n,this.yAxisLeft)||o,o=this._toggleAxisVisiblity(r,this.yAxisRight)||o,1==r&&1==n?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!n,0==this.yAxisRight.master?(this.yAxisLeft.lineOffset=1==r?this.yAxisRight.width:0,o=this.yAxisLeft.redraw()||o,this.yAxisRight.stepPixelsForced=this.yAxisLeft.stepPixels,o=this.yAxisRight.redraw()||o):o=this.yAxisRight.redraw()||o,-1!=t.indexOf("__barchartLeft")&&t.splice(t.indexOf("__barchartLeft"),1),-1!=t.indexOf("__barchartRight")&&t.splice(t.indexOf("__barchartRight"),1),o},s.prototype._toggleAxisVisiblity=function(t,e){var i=!1;return 0==t?e.dom.frame.parentNode&&(e.hide(),i=!0):e.dom.frame.parentNode||(e.show(),i=!0),i},s.prototype._drawBarGraphs=function(t,e){var i,s,o,r,a,h,d=[],l={},c=0;for(a=0;a0&&(i=Math.min(i,Math.abs(d[a-1].x-s))),o=this._getSafeDrawData(i,r,p);else{var f=a+(l[s].amount-l[s].resolved),m=a-(l[s].resolved+1);f0&&(i=Math.min(i,Math.abs(d[m].x-s))),o=this._getSafeDrawData(i,r,p),l[s].resolved+=1,"stack"==r.options.barChart.handleOverlap?(u=l[s].accumulated,l[s].accumulated+=r.zeroPosition-d[a].y):"sideBySide"==r.options.barChart.handleOverlap&&(o.width=o.width/l[s].amount,o.offset+=l[s].resolved*o.width-.5*o.width*(l[s].amount+1),"left"==r.options.barChart.align?o.offset-=.5*o.width:"right"==r.options.barChart.align&&(o.offset+=.5*o.width))}n.drawBar(d[a].x+o.offset,d[a].y-u,o.width,r.zeroPosition-d[a].y,r.className+" bar",this.svgElements,this.svg),1==r.options.drawPoints.enabled&&n.drawPoint(d[a].x+o.offset,d[a].y-u,r,this.svgElements,this.svg)}},s.prototype._getDataIntersections=function(t,e){for(var i,s=0;s0&&(i=Math.min(i,Math.abs(e[s-1].x-e[s].x))),0==i&&(void 0===t[e[s].x]&&(t[e[s].x]={amount:0,resolved:0,accumulated:0}),t[e[s].x].amount+=1)},s.prototype._getSafeDrawData=function(t,e,i){var s,o;return t0?(s=i>t?i:t,o=0,"left"==e.options.barChart.align?o-=.5*t:"right"==e.options.barChart.align&&(o+=.5*t)):(s=e.options.barChart.width,o=0,"left"==e.options.barChart.align?o-=.5*e.options.barChart.width:"right"==e.options.barChart.align&&(o+=.5*e.options.barChart.width)),{width:s,offset:o}},s.prototype._drawLineGraph=function(t,e){if(null!=t&&t.length>0){var i,s,o=Number(this.svg.style.height.replace("px",""));if(i=n.getSVGElement("path",this.svgElements,this.svg),i.setAttributeNS(null,"class",e.className),s=1==e.options.catmullRom.enabled?this._catmullRom(t,e):this._linear(t),1==e.options.shaded.enabled){var r,a=n.getSVGElement("path",this.svgElements,this.svg);r="top"==e.options.shaded.orientation?"M"+t[0].x+",0 "+s+"L"+t[t.length-1].x+",0":"M"+t[0].x+","+o+" "+s+"L"+t[t.length-1].x+","+o,a.setAttributeNS(null,"class",e.className+" fill"),a.setAttributeNS(null,"d",r)}i.setAttributeNS(null,"d","M"+s),1==e.options.drawPoints.enabled&&this._drawPoints(t,e,this.svgElements,this.svg)}},s.prototype._drawPoints=function(t,e,i,s,o){void 0===o&&(o=0);for(var r=0;rl;l++)e=0==l?t[0]:t[l-1],i=t[l],s=t[l+1],o=d>l+2?t[l+2]:s,n={x:(-e.x+6*i.x+s.x)*h,y:(-e.y+6*i.y+s.y)*h},r={x:(i.x+6*s.x-o.x)*h,y:(i.y+6*s.y-o.y)*h},a+="C"+n.x+","+n.y+" "+r.x+","+r.y+" "+s.x+","+s.y+" ";return a},s.prototype._catmullRom=function(t,e){var i=e.options.catmullRom.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);for(var s,o,n,r,a,h,d,l,c,p,u,f,m,g,v,y,b,_,x,w=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",S=t.length,M=0;S-1>M;M++)s=0==M?t[0]:t[M-1],o=t[M],n=t[M+1],r=S>M+2?t[M+2]:n,d=Math.sqrt(Math.pow(s.x-o.x,2)+Math.pow(s.y-o.y,2)),l=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),c=Math.sqrt(Math.pow(n.x-r.x,2)+Math.pow(n.y-r.y,2)),g=Math.pow(c,i),y=Math.pow(c,2*i),v=Math.pow(l,i),b=Math.pow(l,2*i),x=Math.pow(d,i),_=Math.pow(d,2*i),p=2*_+3*x*v+b,u=2*y+3*g*v+b,f=3*x*(x+v),f>0&&(f=1/f),m=3*g*(g+v),m>0&&(m=1/m),a={x:(-b*s.x+p*o.x+_*n.x)*f,y:(-b*s.y+p*o.y+_*n.y)*f},h={x:(y*o.x+u*n.x-b*r.x)*m,y:(y*o.y+u*n.y-b*r.y)*m},0==a.x&&0==a.y&&(a=o),0==h.x&&0==h.y&&(h=n),w+="C"+a.x+","+a.y+" "+h.x+","+h.y+" "+n.x+","+n.y+" ";return w},s.prototype._linear=function(t){for(var e="",i=0;id;){d++;var l=n.getCurrent(),c=this.body.util.toScreen(l),p=n.isMajor();this.options.showMinorLabels&&this._repaintMinorText(c,n.getLabelMinor(),t),p&&this.options.showMajorLabels?(c>0&&(void 0==h&&(h=c),this._repaintMajorText(c,n.getLabelMajor(),t)),this._repaintMajorLine(c,t)):this._repaintMinorLine(c,t),n.next()}if(this.options.showMajorLabels){var u=this.body.util.toTime(0),f=n.getLabelMajor(u),m=f.length*(this.props.majorCharWidth||10)+10;(void 0==h||h>m)&&this._repaintMajorText(0,f,t)}o.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},s.prototype._repaintMinorText=function(t,e,i){var s=this.dom.redundant.minorTexts.shift();if(!s){var o=document.createTextNode("");s=document.createElement("div"),s.appendChild(o),s.className="text minor",this.dom.foreground.appendChild(s)}this.dom.minorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?this.props.majorLabelHeight+"px":"0",s.style.left=t+"px"},s.prototype._repaintMajorText=function(t,e,i){var s=this.dom.redundant.majorTexts.shift();if(!s){var o=document.createTextNode(e);s=document.createElement("div"),s.className="text major",s.appendChild(o),this.dom.foreground.appendChild(s)}this.dom.majorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?"0":this.props.minorLabelHeight+"px",s.style.left=t+"px"},s.prototype._repaintMinorLine=function(t,e){var i=this.dom.redundant.minorLines.shift();i||(i=document.createElement("div"),i.className="grid vertical minor",this.dom.background.appendChild(i)),this.dom.minorLines.push(i);var s=this.props;i.style.top="top"==e?s.majorLabelHeight+"px":this.body.domProps.top.height+"px",i.style.height=s.minorLineHeight+"px",i.style.left=t-s.minorLineWidth/2+"px"},s.prototype._repaintMajorLine=function(t,e){var i=this.dom.redundant.majorLines.shift();i||(i=document.createElement("DIV"),i.className="grid vertical major",this.dom.background.appendChild(i)),this.dom.majorLines.push(i);var s=this.props;i.style.top="top"==e?"0":this.body.domProps.top.height+"px",i.style.left=t-s.majorLineWidth/2+"px",i.style.height=s.majorLineHeight+"px"},s.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="text minor measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="text minor measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth},s.prototype.snap=function(t){return this.step.snap(t)},t.exports=s},function(t,e,i){function s(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.dirty=!0,this.top=null,this.left=null,this.width=null,this.height=null}var o=i(41);s.prototype.select=function(){this.selected=!0,this.displayed&&this.redraw()},s.prototype.unselect=function(){this.selected=!1,this.displayed&&this.redraw()},s.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},s.prototype.isVisible=function(){return!1},s.prototype.show=function(){return!1},s.prototype.hide=function(){return!1},s.prototype.redraw=function(){},s.prototype.repositionX=function(){},s.prototype.repositionY=function(){},s.prototype._repaintDeleteButton=function(t){if(this.selected&&this.options.editable.remove&&!this.dom.deleteButton){var e=this,i=document.createElement("div");i.className="delete",i.title="Delete this item",o(i,{preventDefault:!0}).on("tap",function(t){e.parent.removeFromDataSet(e),t.stopPropagation()}),t.appendChild(i),this.dom.deleteButton=i}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);o.call(this,t,e,i)}var o=i(28);s.prototype=new o(null,null,null),s.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.startt.start-e&&this.data.startt.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),t.box["timeline-item"]=this),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.foreground;if(!e)throw new Error("Cannot redraw time axis: parent has no foreground container element");e.appendChild(t.box)}if(this.displayed=!0,this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)t.content.innerHTML="",t.content.appendChild(this.content); -else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);t.content.innerHTML=this.content}this.dirty=!0}this.data.title!=this.title&&(t.box.title=this.data.title,this.title=this.data.title);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");this.className!=i&&(this.className=i,t.box.className=this.baseClassName+i,this.dirty=!0),this.dirty&&(this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dirty=!1),this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},s.prototype.show=function(){this.displayed||this.redraw()},s.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.top=null,this.left=null,this.displayed=!1}},s.prototype.repositionX=function(){var t,e=this.props,i=this.parent.width,s=this.conversion.toScreen(this.data.start),o=this.conversion.toScreen(this.data.end),n=this.options.padding;-i>s&&(s=-i),o>2*i&&(o=2*i);var r=Math.max(o-s,1);this.overflow?(t=Math.max(-s,0),this.left=s,this.width=r+this.props.content.width):(t=0>s?Math.min(-s,o-s-e.content.width-2*n):0,this.left=s,this.width=r),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=r+"px",this.dom.content.style.left=t+"px"},s.prototype.repositionY=function(){var t=this.options.orientation,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},s.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="drag-left",t.dragLeftItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragLeft=t}else!this.selected&&this.dom.dragLeft&&(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},s.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="drag-right",t.dragRightItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragRight=t}else!this.selected&&this.dom.dragRight&&(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this._initializeMixinLoaders(),this.containerElement=t,this.renderRefreshRate=60,this.renderTimestep=1e3/this.renderRefreshRate,this.renderTime=.5*this.renderTimestep,this.maxPhysicsTicksPerRender=3,this.physicsDiscreteStepsize=.5,this.initializing=!0,this.triggerFunctions={add:null,edit:null,editEdge:null,connect:null,del:null},this.defaultOptions={nodes:{mass:1,radiusMin:10,radiusMax:30,radius:10,shape:"ellipse",image:void 0,widthMin:16,widthMax:64,fixed:!1,fontColor:"black",fontSize:14,fontFace:"verdana",level:-1,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},borderColor:"#2B7CE9",backgroundColor:"#97C2FC",highlightColor:"#D2E5FF",group:void 0,borderWidth:1},edges:{widthMin:1,widthMax:15,width:1,widthSelectionMultiplier:2,hoverWidth:1.5,style:"line",color:{color:"#848484",highlight:"#848484",hover:"#848484"},fontColor:"#343434",fontSize:14,fontFace:"arial",fontFill:"white",arrowScaleFactor:1,dash:{length:10,gap:5,altLength:void 0},inheritColor:"from"},configurePhysics:!1,physics:{barnesHut:{enabled:!0,theta:1/.6,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09},repulsion:{centralGravity:0,springLength:200,springConstant:.05,nodeDistance:100,damping:.09},hierarchicalRepulsion:{enabled:!1,centralGravity:0,springLength:100,springConstant:.01,nodeDistance:150,damping:.09},damping:null,centralGravity:null,springLength:null,springConstant:null},clustering:{enabled:!1,initialMaxNodes:100,clusterThreshold:500,reduceToNodes:300,chainThreshold:.4,clusterEdgeThreshold:20,sectorThreshold:100,screenSizeThreshold:.2,fontSizeMultiplier:4,maxFontSize:1e3,forceAmplification:.1,distanceAmplification:.1,edgeGrowth:20,nodeScaling:{width:1,height:1,radius:1},maxNodeSizeIncrements:600,activeAreaBoxSize:80,clusterLevelDifference:2},navigation:{enabled:!1},keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02}},dataManipulation:{enabled:!1,initiallyVisible:!1},hierarchicalLayout:{enabled:!1,levelSeparation:150,nodeSpacing:100,direction:"UD"},freezeForStabilization:!1,smoothCurves:{enabled:!0,dynamic:!0,type:"continuous",roundness:.5},dynamicSmoothCurves:!0,maxVelocity:30,minVelocity:.1,stabilize:!0,stabilizationIterations:1e3,locale:"en",locales:_,tooltip:{delay:300,fontColor:"black",fontSize:14,fontFace:"verdana",color:{border:"#666",background:"#FFFFC6"}},dragNetwork:!0,dragNodes:!0,zoomable:!0,hover:!1,hideEdgesOnDrag:!1,hideNodesOnDrag:!1,width:"100%",height:"100%",selectable:!0},this.constants=a.extend({},this.defaultOptions),this.hoverObj={nodes:{},edges:{}},this.controlNodesActive=!1;var o=this;this.groups=new u,this.images=new f,this.images.setOnloadCallback(function(){o._redraw()}),this.xIncrement=0,this.yIncrement=0,this.zoomIncrement=0,this._loadPhysicsSystem(),this._create(),this._loadSectorSystem(),this._loadClusterSystem(),this._loadSelectionSystem(),this._loadHierarchySystem(),this._setTranslation(this.frame.clientWidth/2,this.frame.clientHeight/2),this._setScale(1),this.setOptions(i),this.freezeSimulation=!1,this.cachedFunctions={},this.calculationNodes={},this.calculationNodeIndices=[],this.nodeIndices=[],this.nodes={},this.edges={},this.canvasTopLeft={x:0,y:0},this.canvasBottomRight={x:0,y:0},this.pointerPosition={x:0,y:0},this.areaCenter={},this.scale=1,this.previousScale=this.scale,this.nodesData=null,this.edgesData=null,this.nodesListeners={add:function(t,e){o._addNodes(e.items),o.start()},update:function(t,e){o._updateNodes(e.items),o.start()},remove:function(t,e){o._removeNodes(e.items),o.start()}},this.edgesListeners={add:function(t,e){o._addEdges(e.items),o.start()},update:function(t,e){o._updateEdges(e.items),o.start()},remove:function(t,e){o._removeEdges(e.items),o.start()}},this.moving=!0,this.timer=void 0,this.setData(e,this.constants.clustering.enabled||this.constants.hierarchicalLayout.enabled),this.initializing=!1,1==this.constants.hierarchicalLayout.enabled?this._setupHierarchicalLayout():0==this.constants.stabilize&&this.zoomExtent(!0,this.constants.clustering.enabled),this.constants.clustering.enabled&&this.startWithClustering()}var o=i(49),n=i(41),r=i(50),a=i(1),h=i(43),d=i(3),l=i(4),c=i(38),p=i(39),u=i(34),f=i(35),m=i(36),g=i(33),v=i(37),y=i(47),b=i(48),_=i(45);i(46),o(s.prototype),s.prototype._getScriptPath=function(){for(var t=document.getElementsByTagName("script"),e=0;et.x&&(s=t.x),ot.y&&(e=t.y),i=this.constants.clustering.initialMaxNodes?49.07548/(o+142.05338)+91444e-8:12.662/(o+7.4147)+.0964822:1==this.constants.clustering.enabled&&o>=this.constants.clustering.initialMaxNodes?77.5271985/(o+187.266146)+476710517e-13:30.5062972/(o+19.93597763)+.08413486;var n=Math.min(this.frame.canvas.clientWidth/600,this.frame.canvas.clientHeight/600);i*=n}else{var r=1.1*(Math.abs(s.minX)+Math.abs(s.maxX)),a=1.1*(Math.abs(s.minY)+Math.abs(s.maxY)),h=this.frame.canvas.clientWidth/r,d=this.frame.canvas.clientHeight/a;i=d>=h?h:d}i>1&&(i=1),this._setScale(i),this._centerNetwork(s),0==e&&(this.moving=!0,this.start())},s.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},s.prototype.setData=function(t,e){if(void 0===e&&(e=!1),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){if(t&&t.dot){var i=c.DOTToGraph(t.dot);return void this.setData(i)}}else if(t&&t.gephi){if(t&&t.gephi){var s=p.parseGephi(t.gephi);return void this.setData(s)}}else this._setNodes(t&&t.nodes),this._setEdges(t&&t.edges);if(this._putDataInSector(),!e)if(this.constants.stabilize){var o=this;setTimeout(function(){o._stabilize(),o.start()},0)}else this.start()},s.prototype.setOptions=function(t){if(t){var e,i=["nodes","edges","smoothCurves","hierarchicalLayout","clustering","navigation","keyboard","dataManipulation","onAdd","onEdit","onEditEdge","onConnect","onDelete","clickToUse"];if(a.selectiveNotDeepExtend(i,this.constants,t),a.selectiveNotDeepExtend(["color"],this.constants.nodes,t.nodes),a.selectiveNotDeepExtend(["color","length"],this.constants.edges,t.edges),t.physics&&(a.mergeOptions(this.constants.physics,t.physics,"barnesHut"),a.mergeOptions(this.constants.physics,t.physics,"repulsion"),t.physics.hierarchicalRepulsion)){this.constants.hierarchicalLayout.enabled=!0,this.constants.physics.hierarchicalRepulsion.enabled=!0,this.constants.physics.barnesHut.enabled=!1;for(e in t.physics.hierarchicalRepulsion)t.physics.hierarchicalRepulsion.hasOwnProperty(e)&&(this.constants.physics.hierarchicalRepulsion[e]=t.physics.hierarchicalRepulsion[e])}if(t.onAdd&&(this.triggerFunctions.add=t.onAdd),t.onEdit&&(this.triggerFunctions.edit=t.onEdit),t.onEditEdge&&(this.triggerFunctions.editEdge=t.onEditEdge),t.onConnect&&(this.triggerFunctions.connect=t.onConnect),t.onDelete&&(this.triggerFunctions.del=t.onDelete),a.mergeOptions(this.constants,t,"smoothCurves"),a.mergeOptions(this.constants,t,"hierarchicalLayout"),a.mergeOptions(this.constants,t,"clustering"),a.mergeOptions(this.constants,t,"navigation"),a.mergeOptions(this.constants,t,"keyboard"),a.mergeOptions(this.constants,t,"dataManipulation"),t.dataManipulation&&(this.editMode=this.constants.dataManipulation.initiallyVisible),t.edges&&(void 0!==t.edges.color&&(a.isString(t.edges.color)?(this.constants.edges.color={},this.constants.edges.color.color=t.edges.color,this.constants.edges.color.highlight=t.edges.color,this.constants.edges.color.hover=t.edges.color):(void 0!==t.edges.color.color&&(this.constants.edges.color.color=t.edges.color.color),void 0!==t.edges.color.highlight&&(this.constants.edges.color.highlight=t.edges.color.highlight),void 0!==t.edges.color.hover&&(this.constants.edges.color.hover=t.edges.color.hover))),t.edges.fontColor||void 0!==t.edges.color&&(a.isString(t.edges.color)?this.constants.edges.fontColor=t.edges.color:void 0!==t.edges.color.color&&(this.constants.edges.fontColor=t.edges.color.color))),t.nodes&&t.nodes.color){var s=a.parseColor(t.nodes.color);this.constants.nodes.color.background=s.background,this.constants.nodes.color.border=s.border,this.constants.nodes.color.highlight.background=s.highlight.background,this.constants.nodes.color.highlight.border=s.highlight.border,this.constants.nodes.color.hover.background=s.hover.background,this.constants.nodes.color.hover.border=s.hover.border}if(t.groups)for(var o in t.groups)if(t.groups.hasOwnProperty(o)){var n=t.groups[o];this.groups.add(o,n)}if(t.tooltip){for(e in t.tooltip)t.tooltip.hasOwnProperty(e)&&(this.constants.tooltip[e]=t.tooltip[e]);t.tooltip.color&&(this.constants.tooltip.color=a.parseColor(t.tooltip.color))}if("clickToUse"in t&&(t.clickToUse?(this.activator=new b(this.frame),this.activator.on("change",this._createKeyBinds.bind(this))):this.activator&&(this.activator.destroy(),delete this.activator)),t.labels)throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.')}this._loadPhysicsSystem(),this._loadNavigationControls(),this._loadManipulationSystem(),this._configureSmoothCurves(),this._createKeyBinds(),this.setSize(this.constants.width,this.constants.height),this.moving=!0,this.start()},s.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis network-frame",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),!this.frame.canvas.getContext){var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}var e=this;this.drag={},this.pinch={},this.hammer=n(this.frame.canvas,{prevent_default:!0}),this.hammer.on("tap",e._onTap.bind(e)),this.hammer.on("doubletap",e._onDoubleTap.bind(e)),this.hammer.on("hold",e._onHold.bind(e)),this.hammer.on("pinch",e._onPinch.bind(e)),this.hammer.on("touch",e._onTouch.bind(e)),this.hammer.on("dragstart",e._onDragStart.bind(e)),this.hammer.on("drag",e._onDrag.bind(e)),this.hammer.on("dragend",e._onDragEnd.bind(e)),this.hammer.on("release",e._onRelease.bind(e)),this.hammer.on("mousewheel",e._onMouseWheel.bind(e)),this.hammer.on("DOMMouseScroll",e._onMouseWheel.bind(e)),this.hammer.on("mousemove",e._onMouseMoveTitle.bind(e)),this.containerElement.appendChild(this.frame)},s.prototype._createKeyBinds=function(){var t=this;this.mousetrap=r,this.mousetrap.reset(),this.constants.keyboard.enabled&&this.isActive()&&(this.mousetrap.bind("up",this._moveUp.bind(t),"keydown"),this.mousetrap.bind("up",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("down",this._moveDown.bind(t),"keydown"),this.mousetrap.bind("down",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("left",this._moveLeft.bind(t),"keydown"),this.mousetrap.bind("left",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("right",this._moveRight.bind(t),"keydown"),this.mousetrap.bind("right",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("=",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("=",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("-",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("-",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("[",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("[",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("]",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("]",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pageup",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("pageup",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pagedown",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("pagedown",this._stopZoom.bind(t),"keyup")),1==this.constants.dataManipulation.enabled&&(this.mousetrap.bind("escape",this._createManipulatorBar.bind(t)),this.mousetrap.bind("del",this._deleteSelected.bind(t)))},s.prototype._getPointer=function(t){return{x:t.pageX-a.getAbsoluteLeft(this.frame.canvas),y:t.pageY-a.getAbsoluteTop(this.frame.canvas)}},s.prototype._onTouch=function(t){this.drag.pointer=this._getPointer(t.gesture.center),this.drag.pinched=!1,this.pinch.scale=this._getScale(),this._handleTouch(this.drag.pointer)},s.prototype._onDragStart=function(){this._handleDragStart()},s.prototype._handleDragStart=function(){var t=this.drag,e=this._getNodeAt(t.pointer);if(t.dragging=!0,t.selection=[],t.translation=this._getTranslation(),t.nodeId=null,null!=e){t.nodeId=e.id,e.isSelected()||this._selectObject(e,!1);for(var i in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(i)){var s=this.selectionObj.nodes[i],o={id:s.id,node:s,x:s.x,y:s.y,xFixed:s.xFixed,yFixed:s.yFixed};s.xFixed=!0,s.yFixed=!0,t.selection.push(o)}}},s.prototype._onDrag=function(t){this._handleOnDrag(t)},s.prototype._handleOnDrag=function(t){if(!this.drag.pinched){var e=this._getPointer(t.gesture.center),i=this,s=this.drag,o=s.selection;if(o&&o.length&&1==this.constants.dragNodes){var n=e.x-s.pointer.x,r=e.y-s.pointer.y;o.forEach(function(t){var e=t.node;t.xFixed||(e.x=i._XconvertDOMtoCanvas(i._XconvertCanvasToDOM(t.x)+n)),t.yFixed||(e.y=i._YconvertDOMtoCanvas(i._YconvertCanvasToDOM(t.y)+r))}),this.moving||(this.moving=!0,this.start())}else if(1==this.constants.dragNetwork){var a=e.x-this.drag.pointer.x,h=e.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+a,this.drag.translation.y+h),this._redraw()}}},s.prototype._onDragEnd=function(){this.drag.dragging=!1;var t=this.drag.selection;t&&t.length?(t.forEach(function(t){t.node.xFixed=t.xFixed,t.node.yFixed=t.yFixed}),this.moving=!0,this.start()):this._redraw()},s.prototype._onTap=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleTap(e)},s.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.center);this._handleDoubleTap(e)},s.prototype._onHold=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleOnHold(e)},s.prototype._onRelease=function(t){var e=this._getPointer(t.gesture.center);this._handleOnRelease(e)},s.prototype._onPinch=function(t){var e=this._getPointer(t.gesture.center);this.drag.pinched=!0,"scale"in this.pinch||(this.pinch.scale=1);var i=this.pinch.scale*t.gesture.scale;this._zoom(i,e)},s.prototype._zoom=function(t,e){if(1==this.constants.zoomable){var i=this._getScale();1e-5>t&&(t=1e-5),t>10&&(t=10);var s=null;void 0!==this.drag&&1==this.drag.dragging&&(s=this.DOMtoCanvas(this.drag.pointer));var o=this._getTranslation(),n=t/i,r=(1-n)*e.x+o.x*n,a=(1-n)*e.y+o.y*n;if(this.areaCenter={x:this._XconvertDOMtoCanvas(e.x),y:this._YconvertDOMtoCanvas(e.y)},this._setScale(t),this._setTranslation(r,a),this.updateClustersDefault(),null!=s){var h=this.canvasToDOM(s);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}return this._redraw(),t>i?this.emit("zoom",{direction:"+"}):this.emit("zoom",{direction:"-"}),t}},s.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i=this._getScale(),s=e/10;0>e&&(s/=1-s),i*=1+s;var o=h.fakeGesture(this,t),n=this._getPointer(o.center);this._zoom(i,n)}t.preventDefault()},s.prototype._onMouseMoveTitle=function(t){var e=h.fakeGesture(this,t),i=this._getPointer(e.center);this.popupObj&&this._checkHidePopup(i);var s=this,o=function(){s._checkShowPopup(i)};if(this.popupTimer&&clearInterval(this.popupTimer),this.drag.dragging||(this.popupTimer=setTimeout(o,this.constants.tooltip.delay)),1==this.constants.hover){for(var n in this.hoverObj.edges)this.hoverObj.edges.hasOwnProperty(n)&&(this.hoverObj.edges[n].hover=!1,delete this.hoverObj.edges[n]);var r=this._getNodeAt(i);null==r&&(r=this._getEdgeAt(i)),null!=r&&this._hoverObject(r);for(var a in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(a)&&(r instanceof m&&r.id!=a||r instanceof g||null==r)&&(this._blurObject(this.hoverObj.nodes[a]),delete this.hoverObj.nodes[a]);this.redraw()}},s.prototype._checkShowPopup=function(t){var e,i={left:this._XconvertDOMtoCanvas(t.x),top:this._YconvertDOMtoCanvas(t.y),right:this._XconvertDOMtoCanvas(t.x),bottom:this._YconvertDOMtoCanvas(t.y)},s=this.popupObj;if(void 0==this.popupObj){var o=this.nodes;for(e in o)if(o.hasOwnProperty(e)){var n=o[e];if(void 0!==n.getTitle()&&n.isOverlappingWith(i)){this.popupObj=n;break}}}if(void 0===this.popupObj){var r=this.edges;for(e in r)if(r.hasOwnProperty(e)){var a=r[e];if(a.connected&&void 0!==a.getTitle()&&a.isOverlappingWith(i)){this.popupObj=a;break}}}if(this.popupObj){if(this.popupObj!=s){var h=this;h.popup||(h.popup=new v(h.frame,h.constants.tooltip)),h.popup.setPosition(t.x-3,t.y-3),h.popup.setText(h.popupObj.getTitle()),h.popup.show()}}else this.popup&&this.popup.hide()},s.prototype._checkHidePopup=function(t){this.popupObj&&this._getNodeAt(t)||(this.popupObj=void 0,this.popup&&this.popup.hide())},s.prototype.setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,this.emit("resize",{width:this.frame.canvas.width,height:this.frame.canvas.height})},s.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof d||t instanceof l)this.nodesData=t;else if(t instanceof Array)this.nodesData=new d,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new d}if(e&&a.forEach(this.nodesListeners,function(t,i){e.off(i,t)}),this.nodes={},this.nodesData){var i=this;a.forEach(this.nodesListeners,function(t,e){i.nodesData.on(e,t)});var s=this.nodesData.getIds();this._addNodes(s)}this._updateSelection()},s.prototype._addNodes=function(t){for(var e,i=0,s=t.length;s>i;i++){e=t[i];var o=this.nodesData.get(e),n=new m(o,this.images,this.groups,this.constants);if(this.nodes[e]=n,!(0!=n.xFixed&&0!=n.yFixed||null!==n.x&&null!==n.y)){var r=1*t.length+10,a=2*Math.PI*Math.random();0==n.xFixed&&(n.x=r*Math.cos(a)),0==n.yFixed&&(n.y=r*Math.sin(a))}this.moving=!0}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateValueRange(this.nodes),this.updateLabels()},s.prototype._updateNodes=function(t){for(var e=this.nodes,i=this.nodesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n],a=i.get(n);r?r.setProperties(a,this.constants):(r=new m(properties,this.images,this.groups,this.constants),e[n]=r)}this.moving=!0,1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateNodeIndexList(),this._reconnectEdges(),this._updateValueRange(e)},s.prototype._removeNodes=function(t){for(var e=this.nodes,i=0,s=t.length;s>i;i++){var o=t[i];delete e[o]}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateSelection(),this._updateValueRange(e)},s.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof d||t instanceof l)this.edgesData=t;else if(t instanceof Array)this.edgesData=new d,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new d}if(e&&a.forEach(this.edgesListeners,function(t,i){e.off(i,t)}),this.edges={},this.edgesData){var i=this;a.forEach(this.edgesListeners,function(t,e){i.edgesData.on(e,t)});var s=this.edgesData.getIds();this._addEdges(s)}this._reconnectEdges()},s.prototype._addEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n];r&&r.disconnect();var a=i.get(n,{showInternalIds:!0});e[n]=new g(a,this,this.constants)}this.moving=!0,this._updateValueRange(e),this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._updateEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=i.get(n),a=e[n];a?(a.disconnect(),a.setProperties(r,this.constants),a.connect()):(a=new g(r,this,this.constants),this.edges[n]=a)}this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this.moving=!0,this._updateValueRange(e)},s.prototype._removeEdges=function(t){for(var e=this.edges,i=0,s=t.length;s>i;i++){var o=t[i],n=e[o];n&&(null!=n.via&&delete this.sectors.support.nodes[n.via.id],n.disconnect(),delete e[o])}this.moving=!0,this._updateValueRange(e),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._reconnectEdges=function(){var t,e=this.nodes,i=this.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var s=i[t];s.from=null,s.to=null,s.connect()}},s.prototype._updateValueRange=function(t){var e,i=void 0,s=void 0;for(e in t)if(t.hasOwnProperty(e)){var o=t[e].getValue();void 0!==o&&(i=void 0===i?o:Math.min(o,i),s=void 0===s?o:Math.max(o,s))}if(void 0!==i&&void 0!==s)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,s)},s.prototype.redraw=function(){this.setSize(this.constants.width,this.constants.height),this._redraw()},s.prototype._redraw=function(){var t=this.frame.canvas.getContext("2d"),e=this.frame.canvas.width,i=this.frame.canvas.height;t.clearRect(0,0,e,i),t.save(),t.translate(this.translation.x,this.translation.y),t.scale(this.scale,this.scale),this.canvasTopLeft={x:this._XconvertDOMtoCanvas(0),y:this._YconvertDOMtoCanvas(0)},this.canvasBottomRight={x:this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth),y:this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight)},this._doInAllSectors("_drawAllSectorNodes",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideEdgesOnDrag)&&this._doInAllSectors("_drawEdges",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideNodesOnDrag)&&this._doInAllSectors("_drawNodes",t,!1),1==this.controlNodesActive&&this._doInAllSectors("_drawControlNodes",t),t.restore()},s.prototype._setTranslation=function(t,e){void 0===this.translation&&(this.translation={x:0,y:0}),void 0!==t&&(this.translation.x=t),void 0!==e&&(this.translation.y=e),this.emit("viewChanged")},s.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},s.prototype._setScale=function(t){this.scale=t},s.prototype._getScale=function(){return this.scale},s.prototype._XconvertDOMtoCanvas=function(t){return(t-this.translation.x)/this.scale},s.prototype._XconvertCanvasToDOM=function(t){return t*this.scale+this.translation.x},s.prototype._YconvertDOMtoCanvas=function(t){return(t-this.translation.y)/this.scale},s.prototype._YconvertCanvasToDOM=function(t){return t*this.scale+this.translation.y},s.prototype.canvasToDOM=function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}},s.prototype.DOMtoCanvas=function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}},s.prototype._drawNodes=function(t,e){void 0===e&&(e=!1);var i=this.nodes,s=[];for(var o in i)i.hasOwnProperty(o)&&(i[o].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight),i[o].isSelected()?s.push(o):(i[o].inArea()||e)&&i[o].draw(t));for(var n=0,r=s.length;r>n;n++)(i[s[n]].inArea()||e)&&i[s[n]].draw(t)},s.prototype._drawEdges=function(t){var e=this.edges;for(var i in e)if(e.hasOwnProperty(i)){var s=e[i];s.setScale(this.scale),s.connected&&e[i].draw(t)}},s.prototype._drawControlNodes=function(t){var e=this.edges;for(var i in e)e.hasOwnProperty(i)&&e[i]._drawControlNodes(t)},s.prototype._stabilize=function(){1==this.constants.freezeForStabilization&&this._freezeDefinedNodes();for(var t=0;this.moving&&t0)for(e in s)s.hasOwnProperty(e)&&(s[e].discreteStepLimited(i,this.constants.maxVelocity),o=!0);else for(e in s)s.hasOwnProperty(e)&&(s[e].discreteStep(i),o=!0);if(1==o&&(void 0===t||1==t)){var n=this.constants.minVelocity/Math.max(this.scale,.05);n>.5*this.constants.maxVelocity?this.moving=!0:(this.moving=this._isMoving(n),0==this.moving&&this.emit("stabilized",{iterations:null}),this.moving=this.moving||this.configurePhysics)}},s.prototype._physicsTick=function(){this.freezeSimulation||1==this.moving&&(this._doInAllActiveSectors("_initializeForceCalculation"),this._doInAllActiveSectors("_discreteStepNodes"),1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic&&this._doInSupportSector("_discreteStepNodes",!1),this._findCenter(this._getRange()))},s.prototype._animationStep=function(){this.timer=void 0,this._handleNavigation(),this.start();var t=Date.now(),e=1;this._physicsTick();for(var i=Date.now()-t;i<.9*(this.renderTimestep-this.renderTime)&&eh}return!1},s.prototype._getColor=function(){var t=this.options.color;return"to"==this.options.inheritColor?t={highlight:this.to.options.color.highlight.border,hover:this.to.options.color.hover.border,color:this.to.options.color.border}:("from"==this.options.inheritColor||1==this.options.inheritColor)&&(t={highlight:this.from.options.color.highlight.border,hover:this.from.options.color.hover.border,color:this.from.options.color.border}),1==this.selected?t.highlight:1==this.hover?t.hover:t.color},s.prototype._drawLine=function(t){if(t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth(),this.from!=this.to){var e,i=this._line(t);if(this.label){if(1==this.options.smoothCurves.enabled&&null!=i){var s=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),o=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y));e={x:s,y:o}}else e=this._pointOnLine(.5);this._label(t,this.label,e.x,e.y)}}else{var n,r,a=this.physics.springLength/4,h=this.from;h.width||h.resize(t),h.width>h.height?(n=h.x+h.width/2,r=h.y-a):(n=h.x+a,r=h.y-h.height/2),this._circle(t,n,r,a),e=this._pointOnCircle(n,r,a,.5),this._label(t,this.label,e.x,e.y)}},s.prototype._getLineWidth=function(){return 1==this.selected?Math.min(this.widthSelected,this.options.widthMax)*this.networkScaleInv:1==this.hover?Math.min(this.options.hoverWidth,this.options.widthMax)*this.networkScaleInv:this.options.width*this.networkScaleInv},s.prototype._getViaCoordinates=function(){var t=null,e=null,i=this.options.smoothCurves.roundness,s=this.options.smoothCurves.type,o=Math.abs(this.from.x-this.to.x),n=Math.abs(this.from.y-this.to.y);return"discrete"==s||"diagonalCross"==s?Math.abs(this.from.x-this.to.x)this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n)),"discrete"==s&&(t=i*n>o?this.from.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o)),"discrete"==s&&(e=i*o>n?this.from.y:e)):"straightCross"==s?Math.abs(this.from.x-this.to.x)Math.abs(this.from.y-this.to.y)&&(t=this.from.xthis.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n,t=this.to.x>t?this.to.x:t):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n,t=this.to.x>t?this.to.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xe?this.to.y:e):this.from.x>this.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o,e=this.to.y>e?this.to.y:e):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o,e=this.to.yl.height?(a=l.x+.5*l.width,h=l.y-d):(a=l.x+d,h=l.y-.5*l.height),this._circle(t,a,h,d);var s=.2*Math.PI,o=(10+5*this.options.width)*this.options.arrowScaleFactor;e=this._pointOnCircle(a,h,d,.5),t.arrow(e.x,e.y,s,o),t.fill(),t.stroke(),this.label&&(e=this._pointOnCircle(a,h,d,.5),this._label(t,this.label,e.x,e.y))}},s.prototype._drawArrow=function(t){1==this.selected?(t.strokeStyle=this.options.color.highlight,t.fillStyle=this.options.color.highlight):1==this.hover?(t.strokeStyle=this.options.color.hover,t.fillStyle=this.options.color.hover):(t.strokeStyle=this.options.color.color,t.fillStyle=this.options.color.color),t.lineWidth=this._getLineWidth();var e,i;if(this.from!=this.to){e=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var s,o=this.to.x-this.from.x,n=this.to.y-this.from.y,r=Math.sqrt(o*o+n*n),a=this.from.distanceToBorder(t,e+Math.PI),h=(r-a)/r,d=h*this.from.x+(1-h)*this.to.x,l=h*this.from.y+(1-h)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?s=this.via:1==this.options.smoothCurves.enabled&&(s=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=s.x&&(e=Math.atan2(this.to.y-s.y,this.to.x-s.x),o=this.to.x-s.x,n=this.to.y-s.y,r=Math.sqrt(o*o+n*n));var c,p,u=this.to.distanceToBorder(t,e),f=(r-u)/r;if(1==this.options.smoothCurves.enabled&&null!=s.x?(c=(1-f)*s.x+f*this.to.x,p=(1-f)*s.y+f*this.to.y):(c=(1-f)*this.from.x+f*this.to.x,p=(1-f)*this.from.y+f*this.to.y),t.beginPath(),t.moveTo(d,l),1==this.options.smoothCurves.enabled&&null!=s.x?t.quadraticCurveTo(s.x,s.y,c,p):t.lineTo(c,p),t.stroke(),i=(10+5*this.options.width)*this.options.arrowScaleFactor,t.arrow(c,p,e,i),t.fill(),t.stroke(),this.label){var m;if(1==this.options.smoothCurves.enabled&&null!=s){var g=.5*(.5*(this.from.x+s.x)+.5*(this.to.x+s.x)),v=.5*(.5*(this.from.y+s.y)+.5*(this.to.y+s.y));m={x:g,y:v}}else m=this._pointOnLine(.5);this._label(t,this.label,m.x,m.y)}}else{var y,b,_,x=this.from,w=.25*Math.max(100,this.physics.springLength);x.width||x.resize(t),x.width>x.height?(y=x.x+.5*x.width,b=x.y-w,_={x:y,y:x.y,angle:.9*Math.PI}):(y=x.x+w,b=x.y-.5*x.height,_={x:x.x,y:b,angle:.6*Math.PI}),t.beginPath(),t.arc(y,b,w,0,2*Math.PI,!1),t.stroke();var i=(10+5*this.options.width)*this.options.arrowScaleFactor;t.arrow(_.x,_.y,_.angle,i),t.fill(),t.stroke(),this.label&&(m=this._pointOnCircle(y,b,w,.5),this._label(t,this.label,m.x,m.y))}},s.prototype._getDistanceToEdge=function(t,e,i,s,o,n){if(this.from!=this.to){if(1==this.options.smoothCurves.enabled){var r,a;if(1==this.options.smoothCurves.enabled&&1==this.options.smoothCurves.dynamic)r=this.via.x,a=this.via.y;else{var h=this._getViaCoordinates();r=h.x,a=h.y}var d,l,c,p,u,f,m,g=1e9;for(l=0;10>l;l++)c=.1*l,p=Math.pow(1-c,2)*t+2*c*(1-c)*r+Math.pow(c,2)*i,u=Math.pow(1-c,2)*e+2*c*(1-c)*a+Math.pow(c,2)*s,l>0&&(d=this._getDistanceToLine(f,m,p,u,o,n),g=g>d?d:g),f=p,m=u;return g}return this._getDistanceToLine(t,e,i,s,o,n)}var p,u,v,y,b=.25*this.physics.springLength,_=this.from;return _.width>_.height?(p=_.x+.5*_.width,u=_.y-b):(p=_.x+b,u=_.y-.5*_.height),v=p-o,y=u-n,Math.abs(Math.sqrt(v*v+y*y)-b)},s.prototype._getDistanceToLine=function(t,e,i,s,o,n){var r=i-t,a=s-e,h=r*r+a*a,d=((o-t)*r+(n-e)*a)/h;d>1?d=1:0>d&&(d=0);var l=t+d*r,c=e+d*a,p=l-o,u=c-n;return Math.sqrt(p*p+u*u)},s.prototype.setScale=function(t){this.networkScaleInv=1/t},s.prototype.select=function(){this.selected=!0},s.prototype.unselect=function(){this.selected=!1},s.prototype.positionBezierNode=function(){null!==this.via&&null!==this.from&&null!==this.to&&(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y))},s.prototype._drawControlNodes=function(t){if(1==this.controlNodesEnabled){if(null===this.controlNodes.from&&null===this.controlNodes.to){var e="edgeIdFrom:".concat(this.id),i="edgeIdTo:".concat(this.id),s={nodes:{group:"",radius:8},physics:{damping:0},clustering:{maxNodeSizeIncrements:0,nodeScaling:{width:0,height:0,radius:0}}};this.controlNodes.from=new n({id:e,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s),this.controlNodes.to=new n({id:i,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s)}0==this.controlNodes.from.selected&&0==this.controlNodes.to.selected&&(this.controlNodes.positions=this.getControlNodePositions(t),this.controlNodes.from.x=this.controlNodes.positions.from.x,this.controlNodes.from.y=this.controlNodes.positions.from.y,this.controlNodes.to.x=this.controlNodes.positions.to.x,this.controlNodes.to.y=this.controlNodes.positions.to.y),this.controlNodes.from.draw(t),this.controlNodes.to.draw(t)}else this.controlNodes={from:null,to:null,positions:{}}},s.prototype._enableControlNodes=function(){this.controlNodesEnabled=!0},s.prototype._disableControlNodes=function(){this.controlNodesEnabled=!1},s.prototype._getSelectedControlNode=function(t,e){var i=this.controlNodes.positions,s=Math.sqrt(Math.pow(t-i.from.x,2)+Math.pow(e-i.from.y,2)),o=Math.sqrt(Math.pow(t-i.to.x,2)+Math.pow(e-i.to.y,2));return 15>s?(this.connectedNode=this.from,this.from=this.controlNodes.from,this.controlNodes.from):15>o?(this.connectedNode=this.to,this.to=this.controlNodes.to,this.controlNodes.to):null},s.prototype._restoreControlNodes=function(){1==this.controlNodes.from.selected&&(this.from=this.connectedNode,this.connectedNode=null,this.controlNodes.from.unselect()),1==this.controlNodes.to.selected&&(this.to=this.connectedNode,this.connectedNode=null,this.controlNodes.to.unselect())},s.prototype.getControlNodePositions=function(t){var e,i=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),s=this.to.x-this.from.x,o=this.to.y-this.from.y,n=Math.sqrt(s*s+o*o),r=this.from.distanceToBorder(t,i+Math.PI),a=(n-r)/n,h=a*this.from.x+(1-a)*this.to.x,d=a*this.from.y+(1-a)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?e=this.via:1==this.options.smoothCurves.enabled&&(e=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=e.x&&(i=Math.atan2(this.to.y-e.y,this.to.x-e.x),s=this.to.x-e.x,o=this.to.y-e.y,n=Math.sqrt(s*s+o*o));var l,c,p=this.to.distanceToBorder(t,i),u=(n-p)/n;return 1==this.options.smoothCurves.enabled&&null!=e.x?(l=(1-u)*e.x+u*this.to.x,c=(1-u)*e.y+u*this.to.y):(l=(1-u)*this.from.x+u*this.to.x,c=(1-u)*this.from.y+u*this.to.y),{from:{x:h,y:d},to:{x:l,y:c}}},t.exports=s},function(t,e,i){function s(){this.clear(),this.defaultIndex=0}var o=i(1);s.DEFAULT=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}}],s.prototype.clear=function(){this.groups={},this.groups.length=function(){var t=0;for(var e in this)this.hasOwnProperty(e)&&t++;return t}},s.prototype.get=function(t){var e=this.groups[t];if(void 0==e){var i=this.defaultIndex%s.DEFAULT.length;this.defaultIndex++,e={},e.color=s.DEFAULT[i],this.groups[t]=e}return e},s.prototype.add=function(t,e){return this.groups[t]=e,e.color&&(e.color=o.parseColor(e.color)),e},t.exports=s},function(t){function e(){this.images={},this.callback=void 0}e.prototype.setOnloadCallback=function(t){this.callback=t},e.prototype.load=function(t){var e=this.images[t];if(void 0==e){var i=this;e=new Image,this.images[t]=e,e.onload=function(){i.callback&&i.callback(this)},e.src=t}return e},t.exports=e},function(t,e,i){function s(t,e,i,s){var n=o.selectiveBridgeObject(["nodes"],s);this.options=n.nodes,this.selected=!1,this.hover=!1,this.edges=[],this.dynamicEdges=[],this.reroutedEdges={},this.fontDrawThreshold=3,this.id=void 0,this.x=null,this.y=null,this.xFixed=!1,this.yFixed=!1,this.horizontalAlignLeft=!0,this.verticalAlignTop=!0,this.baseRadiusValue=s.nodes.radius,this.radiusFixed=!1,this.level=-1,this.preassignedLevel=!1,this.imagelist=e,this.grouplist=i,this.fx=0,this.fy=0,this.vx=0,this.vy=0,this.damping=s.physics.damping,this.fixedData={x:null,y:null},this.setProperties(t,n),this.resetCluster(),this.dynamicEdgesLength=0,this.clusterSession=0,this.clusterSizeWidthFactor=s.clustering.nodeScaling.width,this.clusterSizeHeightFactor=s.clustering.nodeScaling.height,this.clusterSizeRadiusFactor=s.clustering.nodeScaling.radius,this.maxNodeSizeIncrements=s.clustering.maxNodeSizeIncrements,this.growthIndicator=0,this.networkScaleInv=1,this.networkScale=1,this.canvasTopLeft={x:-300,y:-300},this.canvasBottomRight={x:300,y:300},this.parentEdgeId=null}var o=i(1);s.prototype.resetCluster=function(){this.formationScale=void 0,this.clusterSize=1,this.containedNodes={},this.containedEdges={},this.clusterSessions=[]},s.prototype.attachEdge=function(t){-1==this.edges.indexOf(t)&&this.edges.push(t),-1==this.dynamicEdges.indexOf(t)&&this.dynamicEdges.push(t),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.detachEdge=function(t){var e=this.edges.indexOf(t);-1!=e&&(this.edges.splice(e,1),this.dynamicEdges.splice(e,1)),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.setProperties=function(t,e){if(t){var i=["borderWidth","borderWidthSelected","shape","image","radius","fontColor","fontSize","fontFace","group","mass"];if(o.selectiveDeepExtend(i,this.options,t),this.originalLabel=void 0,void 0!==t.id&&(this.id=t.id),void 0!==t.label&&(this.label=t.label,this.originalLabel=t.label),void 0!==t.title&&(this.title=t.title),void 0!==t.x&&(this.x=t.x),void 0!==t.y&&(this.y=t.y),void 0!==t.value&&(this.value=t.value),void 0!==t.level&&(this.level=t.level,this.preassignedLevel=!0),void 0!==t.horizontalAlignLeft&&(this.horizontalAlignLeft=t.horizontalAlignLeft),void 0!==t.verticalAlignTop&&(this.verticalAlignTop=t.verticalAlignTop),void 0!==t.triggerFunction&&(this.triggerFunction=t.triggerFunction),void 0===this.id)throw"Node must have an id";if("number"==typeof this.options.group||"string"==typeof this.options.group&&""!=this.options.group){var s=this.grouplist.get(this.options.group);for(var n in s)s.hasOwnProperty(n)&&(this.options[n]=s[n])}if(void 0!==t.radius&&(this.baseRadiusValue=this.options.radius),void 0!==t.color&&(this.options.color=o.parseColor(t.color)),void 0!==this.options.image&&""!=this.options.image){if(!this.imagelist)throw"No imagelist provided";this.imageObj=this.imagelist.load(this.options.image)}switch(this.xFixed=this.xFixed||void 0!==t.x&&!t.allowedToMoveX,this.yFixed=this.yFixed||void 0!==t.y&&!t.allowedToMoveY,this.radiusFixed=this.radiusFixed||void 0!==t.radius,"image"==this.options.shape&&(this.options.radiusMin=e.nodes.widthMin,this.options.radiusMax=e.nodes.widthMax),this.options.shape){case"database":this.draw=this._drawDatabase,this.resize=this._resizeDatabase;break;case"box":this.draw=this._drawBox,this.resize=this._resizeBox;break;case"circle":this.draw=this._drawCircle,this.resize=this._resizeCircle;break;case"ellipse":this.draw=this._drawEllipse,this.resize=this._resizeEllipse;break;case"image":this.draw=this._drawImage,this.resize=this._resizeImage;break;case"text":this.draw=this._drawText,this.resize=this._resizeText;break;case"dot":this.draw=this._drawDot,this.resize=this._resizeShape;break;case"square":this.draw=this._drawSquare,this.resize=this._resizeShape;break;case"triangle":this.draw=this._drawTriangle,this.resize=this._resizeShape;break;case"triangleDown":this.draw=this._drawTriangleDown,this.resize=this._resizeShape;break;case"star":this.draw=this._drawStar,this.resize=this._resizeShape;break;default:this.draw=this._drawEllipse,this.resize=this._resizeEllipse}this._reset()}},s.prototype.select=function(){this.selected=!0,this._reset()},s.prototype.unselect=function(){this.selected=!1,this._reset()},s.prototype.clearSizeCache=function(){this._reset()},s.prototype._reset=function(){this.width=void 0,this.height=void 0},s.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},s.prototype.distanceToBorder=function(t,e){var i=1;switch(this.width||this.resize(t),this.options.shape){case"circle":case"dot":return this.options.radius+i;case"ellipse":var s=this.width/2,o=this.height/2,n=Math.sin(e)*s,r=Math.cos(e)*o;return s*o/Math.sqrt(n*n+r*r);case"box":case"image":case"text":default:return this.width?Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i:0}},s.prototype._setForce=function(t,e){this.fx=t,this.fy=e},s.prototype._addForce=function(t,e){this.fx+=t,this.fy+=e},s.prototype.discreteStep=function(t){if(!this.xFixed){var e=this.damping*this.vx,i=(this.fx-e)/this.options.mass;this.vx+=i*t,this.x+=this.vx*t}if(!this.yFixed){var s=this.damping*this.vy,o=(this.fy-s)/this.options.mass;this.vy+=o*t,this.y+=this.vy*t}},s.prototype.discreteStepLimited=function(t,e){if(this.xFixed)this.fx=0;else{var i=this.damping*this.vx,s=(this.fx-i)/this.options.mass;this.vx+=s*t,this.vx=Math.abs(this.vx)>e?this.vx>0?e:-e:this.vx,this.x+=this.vx*t}if(this.yFixed)this.fy=0;else{var o=this.damping*this.vy,n=(this.fy-o)/this.options.mass;this.vy+=n*t,this.vy=Math.abs(this.vy)>e?this.vy>0?e:-e:this.vy,this.y+=this.vy*t}},s.prototype.isFixed=function(){return this.xFixed&&this.yFixed},s.prototype.isMoving=function(t){var e=Math.sqrt(Math.pow(this.vx,2)+Math.pow(this.vy,2));return e>t},s.prototype.isSelected=function(){return this.selected},s.prototype.getValue=function(){return this.value},s.prototype.getDistance=function(t,e){var i=this.x-t,s=this.y-e;return Math.sqrt(i*i+s*s)},s.prototype.setValueRange=function(t,e){if(!this.radiusFixed&&void 0!==this.value)if(e==t)this.options.radius=(this.options.radiusMin+this.options.radiusMax)/2;else{var i=(this.options.radiusMax-this.options.radiusMin)/(e-t);this.options.radius=(this.value-t)*i+this.options.radiusMin}this.baseRadiusValue=this.options.radius},s.prototype.draw=function(){throw"Draw method not initialized for node"},s.prototype.resize=function(){throw"Resize method not initialized for node"},s.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},s.prototype._resizeImage=function(){if(!this.width||!this.height){var t,e;if(this.value){this.options.radius=this.baseRadiusValue;var i=this.imageObj.height/this.imageObj.width;void 0!==i?(t=this.options.radius||this.imageObj.width,e=this.options.radius*i||this.imageObj.height):(t=0,e=0)}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.growthIndicator=0,this.width>0&&this.height>0&&(this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t)}},s.prototype._drawImage=function(t){this._resizeImage(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e;if(0!=this.imageObj.width){if(this.clusterSize>1){var i=this.clusterSize>1?10:0;i*=this.networkScaleInv,i=Math.min(.2*this.width,i),t.globalAlpha=.5,t.drawImage(this.imageObj,this.left-i,this.top-i,this.width+2*i,this.height+2*i)}t.globalAlpha=1,t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),e=this.y+this.height/2}else e=this.y;this._label(t,this.label,this.x,e,void 0,"top")},s.prototype._resizeBox=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawBox=function(t){this._resizeBox(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.roundRect(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth,this.options.radius),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.options.color.background,t.roundRect(this.left,this.top,this.width,this.height,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeDatabase=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=i.width+2*e;this.width=s,this.height=s,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-s}},s.prototype._drawDatabase=function(t){this._resizeDatabase(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.database(this.x-this.width/2-2*t.lineWidth,this.y-.5*this.height-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.database(this.x-this.width/2,this.y-.5*this.height,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeCircle=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=Math.max(i.width,i.height)+2*e;this.options.radius=s/2,this.width=s,this.height=s,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.options.radius-.5*s}},s.prototype._drawCircle=function(t){this._resizeCircle(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.circle(this.x,this.y,this.options.radius+2*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.circle(this.x,this.y,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeEllipse=function(t){if(!this.width){var e=this.getTextSize(t);this.width=1.5*e.width,this.height=2*e.height,this.width1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.ellipse(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.ellipse(this.left,this.top,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._drawDot=function(t){this._drawShape(t,"circle")},s.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},s.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},s.prototype._drawSquare=function(t){this._drawShape(t,"square")},s.prototype._drawStar=function(t){this._drawShape(t,"star")},s.prototype._resizeShape=function(){if(!this.width){this.options.radius=this.baseRadiusValue;var t=2*this.options.radius;this.width=t,this.height=t,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t}},s.prototype._drawShape=function(t,e){this._resizeShape(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var i=2.5,s=this.options.borderWidth,o=this.options.borderWidthSelected||2*this.options.borderWidth,n=2;switch(e){case"dot":n=2;break;case"square":n=2;break;case"triangle":n=3;break;case"triangleDown":n=3;break;case"star":n=4}t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t[e](this.x,this.y,this.options.radius+n*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t[e](this.x,this.y,this.options.radius),t.fill(),t.stroke(),this.label&&this._label(t,this.label,this.x,this.y+this.height/2,void 0,"top",!0)},s.prototype._resizeText=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawText=function(t){this._resizeText(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,this._label(t,this.label,this.x,this.y)},s.prototype._label=function(t,e,i,s,o,n,r){if(e&&Number(this.options.fontSize)*this.networkScale>this.fontDrawThreshold){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace,t.fillStyle=this.options.fontColor||"black",t.textAlign=o||"center",t.textBaseline=n||"middle";var a=e.split("\n"),h=a.length,d=Number(this.options.fontSize)+4,l=s+(1-h)/2*d;1==r&&(l=s+(1-h)/(2*d));for(var c=0;h>c;c++)t.fillText(a[c],i,l),l+=d}},s.prototype.getTextSize=function(t){if(void 0!==this.label){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace;for(var e=this.label.split("\n"),i=(Number(this.options.fontSize)+4)*e.length,s=0,o=0,n=e.length;n>o;o++)s=Math.max(s,t.measureText(e[o]).width);return{width:s,height:i}}return{width:0,height:0}},s.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.networkScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.networkScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.networkScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.ys&&(n=s-e-this.padding),no&&(r=o-i-this.padding),ri;i++)if(e.id===r.nodes[i].id){o=r.nodes[i];break}for(o||(o={id:e.id},t.node&&(o.attr=a(o.attr,t.node))),i=n.length-1;i>=0;i--){var h=n[i];h.nodes||(h.nodes=[]),-1==h.nodes.indexOf(o)&&h.nodes.push(o)}e.attr&&(o.attr=a(o.attr,e.attr))}function l(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=a({},t.edge);e.attr=a(i,e.attr)}}function c(t,e,i,s,o){var n={from:e,to:i,type:s};return t.edge&&(n.attr=a({},t.edge)),n.attr=a(n.attr||{},o),n}function p(){for(k=C.NULL,L="";" "==O||" "==O||"\n"==O||"\r"==O;)o();do{var t=!1;if("#"==O){for(var e=T-1;" "==E.charAt(e)||" "==E.charAt(e);)e--;if("\n"==E.charAt(e)||""==E.charAt(e)){for(;""!=O&&"\n"!=O;)o();t=!0}}if("/"==O&&"/"==n()){for(;""!=O&&"\n"!=O;)o();t=!0}if("/"==O&&"*"==n()){for(;""!=O;){if("*"==O&&"/"==n()){o(),o();break}o()}t=!0}for(;" "==O||" "==O||"\n"==O||"\r"==O;)o()}while(t);if(""==O)return void(k=C.DELIMITER);var i=O+n();if(D[i])return k=C.DELIMITER,L=i,o(),void o();if(D[O])return k=C.DELIMITER,L=O,void o();if(r(O)||"-"==O){for(L+=O,o();r(O);)L+=O,o();return"false"==L?L=!1:"true"==L?L=!0:isNaN(Number(L))||(L=Number(L)),void(k=C.IDENTIFIER)}if('"'==O){for(o();""!=O&&('"'!=O||'"'==O&&'"'==n());)L+=O,'"'==O&&o(),o();if('"'!=O)throw x('End of string " expected');return o(),void(k=C.IDENTIFIER)}for(k=C.UNKNOWN;""!=O;)L+=O,o();throw new SyntaxError('Syntax error in part "'+w(L,30)+'"')}function u(){var t={};if(s(),p(),"strict"==L&&(t.strict=!0,p()),("graph"==L||"digraph"==L)&&(t.type=L,p()),k==C.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),f(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function f(t){for(;""!==L&&"}"!=L;)m(t),";"==L&&p()}function m(t){var e=g(t);if(e)return void b(t,e);var i=v(t);if(!i){if(k!=C.IDENTIFIER)throw x("Identifier expected");var s=L;if(p(),"="==L){if(p(),k!=C.IDENTIFIER)throw x("Identifier expected");t[s]=L,p()}else y(t,s)}}function g(t){var e=null;if("subgraph"==L&&(e={},e.type="subgraph",p(),k==C.IDENTIFIER&&(e.id=L,p())),"{"==L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,f(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function v(t){return"node"==L?(p(),t.node=_(),"node"):"edge"==L?(p(),t.edge=_(),"edge"):"graph"==L?(p(),t.graph=_(),"graph"):null}function y(t,e){var i={id:e},s=_();s&&(i.attr=s),d(t,i),b(t,e)}function b(t,e){for(;"->"==L||"--"==L;){var i,s=L;p();var o=g(t);if(o)i=o;else{if(k!=C.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,d(t,{id:i}),p()}var n=_(),r=c(t,e,i,s,n);l(t,r),e=i}}function _(){for(var t=null;"["==L;){for(p(),t={};""!==L&&"]"!=L;){if(k!=C.IDENTIFIER)throw x("Attribute name expected");var e=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),k!=C.IDENTIFIER)throw x("Attribute value expected");var i=L;h(t,e,i),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+w(L,30)+'" (char '+T+")")}function w(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){t instanceof Array?t.forEach(function(t){e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}):e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}function M(t){function e(t){var e={from:t.from,to:t.to};return a(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var s=i(t),o={nodes:[],edges:[],options:{}};return s.nodes&&s.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};a(e,t.attr),e.image&&(e.shape="image"),o.nodes.push(e)}),s.edges&&s.edges.forEach(function(t){var i,s;i=t.from instanceof Object?t.from.nodes:{id:t.from},s=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var i=e(t);o.edges.push(i)}),S(i,s,function(i,s){var n=c(o,i.id,s.id,t.type,t.attr),r=e(n);o.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var i=e(t);o.edges.push(i)})}),s.attr&&(o.options=s.attr),o}var C={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},D={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},E="",T=0,O="",L="",k=C.NULL,N=/[a-zA-Z_0-9.:#]/;e.parseDOT=i,e.DOTToGraph=M},function(t,e){function i(t,e){var i=[],s=[];this.options={edges:{inheritColor:!0},nodes:{allowedToMove:!1,parseColor:!1}},void 0!==e&&(this.options.nodes.allowedToMove=e.allowedToMove|!1,this.options.nodes.parseColor=e.parseColor|!1,this.options.edges.inheritColor=e.inheritColor|!0);for(var o=t.edges,n=t.nodes,r=0;r=s&&(s=864e5),e=new Date(e.valueOf()-.05*s),i=new Date(i.valueOf()+.05*s)}(null!==e||null!==i)&&this.range.setRange(e,i)},s.prototype.setWindow=function(t,e){if(1==arguments.length){var i=arguments[0];this.range.setRange(i.start,i.end)}else this.range.setRange(t,e)},s.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},s.prototype.redraw=function(){var t=!1,e=this.options,i=this.props,s=this.dom;if(s){"top"==e.orientation?(r.addClassName(s.root,"top"),r.removeClassName(s.root,"bottom")):(r.removeClassName(s.root,"top"),r.addClassName(s.root,"bottom")),s.root.style.maxHeight=r.option.asSize(e.maxHeight,""),s.root.style.minHeight=r.option.asSize(e.minHeight,""),s.root.style.width=r.option.asSize(e.width,""),i.border.left=(s.centerContainer.offsetWidth-s.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(s.centerContainer.offsetHeight-s.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var o=s.root.offsetHeight-s.root.clientHeight,n=s.root.offsetWidth-s.root.clientWidth;i.center.height=s.center.offsetHeight,i.left.height=s.left.offsetHeight,i.right.height=s.right.offsetHeight,i.top.height=s.top.clientHeight||-i.border.top,i.bottom.height=s.bottom.clientHeight||-i.border.bottom;var a=Math.max(i.left.height,i.center.height,i.right.height),h=i.top.height+a+i.bottom.height+o+i.border.top+i.border.bottom;s.root.style.height=r.option.asSize(e.height,h+"px"),i.root.height=s.root.offsetHeight,i.background.height=i.root.height-o;var d=i.root.height-i.top.height-i.bottom.height-o;i.centerContainer.height=d,i.leftContainer.height=d,i.rightContainer.height=i.leftContainer.height,i.root.width=s.root.offsetWidth,i.background.width=i.root.width-n,i.left.width=s.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=s.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var l=i.root.width-i.left.width-i.right.width-n;i.center.width=l,i.centerContainer.width=l,i.top.width=l,i.bottom.width=l,s.background.style.height=i.background.height+"px",s.backgroundVertical.style.height=i.background.height+"px",s.backgroundHorizontal.style.height=i.centerContainer.height+"px",s.centerContainer.style.height=i.centerContainer.height+"px",s.leftContainer.style.height=i.leftContainer.height+"px",s.rightContainer.style.height=i.rightContainer.height+"px",s.background.style.width=i.background.width+"px",s.backgroundVertical.style.width=i.centerContainer.width+"px",s.backgroundHorizontal.style.width=i.background.width+"px",s.centerContainer.style.width=i.center.width+"px",s.top.style.width=i.top.width+"px",s.bottom.style.width=i.bottom.width+"px",s.background.style.left="0",s.background.style.top="0",s.backgroundVertical.style.left=i.left.width+"px",s.backgroundVertical.style.top="0",s.backgroundHorizontal.style.left="0",s.backgroundHorizontal.style.top=i.top.height+"px",s.centerContainer.style.left=i.left.width+"px",s.centerContainer.style.top=i.top.height+"px",s.leftContainer.style.left="0",s.leftContainer.style.top=i.top.height+"px",s.rightContainer.style.left=i.left.width+i.center.width+"px",s.rightContainer.style.top=i.top.height+"px",s.top.style.left=i.left.width+"px",s.top.style.top="0",s.bottom.style.left=i.left.width+"px",s.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var c=this.props.scrollTop;"bottom"==e.orientation&&(c+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),s.center.style.left="0",s.center.style.top=c+"px",s.left.style.left="0",s.left.style.top=c+"px",s.right.style.left="0",s.right.style.top=c+"px";var p=0==this.props.scrollTop?"hidden":"",u=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";s.shadowTop.style.visibility=p,s.shadowBottom.style.visibility=u,s.shadowTopLeft.style.visibility=p,s.shadowBottomLeft.style.visibility=u,s.shadowTopRight.style.visibility=p,s.shadowBottomRight.style.visibility=u,this.components.forEach(function(e){t=e.redraw()||t}),t&&this.redraw()}},s.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},s.prototype._toTime=function(t){var e=this.range.conversion(this.props.center.width);return new Date(t/e.scale+e.offset)},s.prototype._toGlobalTime=function(t){var e=this.range.conversion(this.props.root.width);return new Date(t/e.scale+e.offset)},s.prototype._toScreen=function(t){var e=this.range.conversion(this.props.center.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._toGlobalScreen=function(t){var e=this.range.conversion(this.props.root.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},s.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){return 1!=t.options.autoResize?void t._stopAutoResize():void(t.dom.root&&(t.dom.root.clientWidth!=t.props.lastWidth||t.dom.root.clientHeight!=t.props.lastHeight)&&(t.props.lastWidth=t.dom.root.clientWidth,t.props.lastHeight=t.dom.root.clientHeight,t.emit("change")))},r.addEventListener(window,"resize",this._onResize),this.watchTimer=setInterval(this._onResize,1e3)},s.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),r.removeEventListener(window,"resize",this._onResize),this._onResize=null},s.prototype._onTouch=function(){this.touch.allowDragging=!0},s.prototype._onPinch=function(){this.touch.allowDragging=!1},s.prototype._onDragStart=function(){this.touch.initialScrollTop=this.props.scrollTop},s.prototype._onDrag=function(t){if(this.touch.allowDragging){var e=t.gesture.deltaY,i=this._getScrollTop(),s=this._setScrollTop(this.touch.initialScrollTop+e);s!=i&&this.redraw()}},s.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},s.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("bottom"==this.options.orientation&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTops;s++){var o=s%2===0?1.3*i:.5*i;this.lineTo(t+o*Math.sin(2*s*Math.PI/10),e-o*Math.cos(2*s*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,s,o){var n=Math.PI/180;0>i-2*o&&(o=i/2),0>s-2*o&&(o=s/2),this.beginPath(),this.moveTo(t+o,e),this.lineTo(t+i-o,e),this.arc(t+i-o,e+o,o,270*n,360*n,!1),this.lineTo(t+i,e+s-o),this.arc(t+i-o,e+s-o,o,0,90*n,!1),this.lineTo(t+o,e+s),this.arc(t+o,e+s-o,o,90*n,180*n,!1),this.lineTo(t,e+o),this.arc(t+o,e+o,o,180*n,270*n,!1)},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,s){var o=.5522848,n=i/2*o,r=s/2*o,a=t+i,h=e+s,d=t+i/2,l=e+s/2;this.beginPath(),this.moveTo(t,l),this.bezierCurveTo(t,l-r,d-n,e,d,e),this.bezierCurveTo(d+n,e,a,l-r,a,l),this.bezierCurveTo(a,l+r,d+n,h,d,h),this.bezierCurveTo(d-n,h,t,l+r,t,l)},CanvasRenderingContext2D.prototype.database=function(t,e,i,s){var o=1/3,n=i,r=s*o,a=.5522848,h=n/2*a,d=r/2*a,l=t+n,c=e+r,p=t+n/2,u=e+r/2,f=e+(s-r/2),m=e+s;this.beginPath(),this.moveTo(l,u),this.bezierCurveTo(l,u+d,p+h,c,p,c),this.bezierCurveTo(p-h,c,t,u+d,t,u),this.bezierCurveTo(t,u-d,p-h,e,p,e),this.bezierCurveTo(p+h,e,l,u-d,l,u),this.lineTo(l,f),this.bezierCurveTo(l,f+d,p+h,m,p,m),this.bezierCurveTo(p-h,m,t,f+d,t,f),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,s){var o=t-s*Math.cos(i),n=e-s*Math.sin(i),r=t-.9*s*Math.cos(i),a=e-.9*s*Math.sin(i),h=o+s/3*Math.cos(i+.5*Math.PI),d=n+s/3*Math.sin(i+.5*Math.PI),l=o+s/3*Math.cos(i-.5*Math.PI),c=n+s/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(r,a),this.lineTo(l,c),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,s,o){o||(o=[10,5]),0==p&&(p=.001);var n=o.length;this.moveTo(t,e);for(var r=i-t,a=s-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,c=!0;d>=.1;){var p=o[l++%n];p>d&&(p=d);var u=Math.sqrt(p*p/(1+h*h));0>r&&(u=-u),t+=u,e+=h*u,this[c?"lineTo":"moveTo"](t,e),d-=p,c=!c}})},function(t,e,i){var s=i(59),o=i(53),n=i(54),r=i(55),a=i(56),h=i(57),d=i(58);e._loadMixin=function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},e._clearMixin=function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=void 0)},e._loadPhysicsSystem=function(){this._loadMixin(s),this._loadSelectedForceSolver(),1==this.constants.configurePhysics&&this._loadPhysicsConfiguration()},e._loadClusterSystem=function(){this.clusterSession=0,this.hubThreshold=5,this._loadMixin(o)},e._loadSectorSystem=function(){this.sectors={},this.activeSector=["default"],this.sectors.active={},this.sectors.active["default"]={nodes:{},edges:{},nodeIndices:[],formationScale:1,drawingNode:void 0},this.sectors.frozen={},this.sectors.support={nodes:{},edges:{},nodeIndices:[],formationScale:1,drawingNode:void 0},this.nodeIndices=this.sectors.active["default"].nodeIndices,this._loadMixin(n)},e._loadSelectionSystem=function(){this.selectionObj={nodes:{},edges:{}},this._loadMixin(r)},e._loadManipulationSystem=function(){this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,1==this.constants.dataManipulation.enabled?(void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="network-manipulationDiv",this.manipulationDiv.id="network-manipulationDiv",this.manipulationDiv.style.display=1==this.editMode?"block":"none",this.frame.appendChild(this.manipulationDiv)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="network-manipulation-editMode",this.editModeDiv.id="network-manipulation-editMode",this.editModeDiv.style.display=1==this.editMode?"none":"block",this.frame.appendChild(this.editModeDiv)),void 0===this.closeDiv&&(this.closeDiv=document.createElement("div"),this.closeDiv.className="network-manipulation-closeDiv",this.closeDiv.id="network-manipulation-closeDiv",this.closeDiv.style.display=this.manipulationDiv.style.display,this.frame.appendChild(this.closeDiv)),this._loadMixin(a),this._createManipulatorBar()):void 0!==this.manipulationDiv&&(this._createManipulatorBar(),this.containerElement.removeChild(this.manipulationDiv),this.containerElement.removeChild(this.editModeDiv),this.containerElement.removeChild(this.closeDiv),this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0,this._clearMixin(a))},e._loadNavigationControls=function(){this._loadMixin(h),this._cleanNavigation(),1==this.constants.navigation.enabled&&this._loadNavigationElements()},e._loadHierarchySystem=function(){this._loadMixin(d)}},function(t,e,i){function s(t){this.active=!1,this.dom={container:t},this.dom.overlay=document.createElement("div"),this.dom.overlay.className="overlay",this.dom.container.appendChild(this.dom.overlay),this.hammer=a(this.dom.overlay,{prevent_default:!1}),this.hammer.on("tap",this._onTapOverlay.bind(this));var e=this,i=["touch","pinch","doubletap","hold","dragstart","drag","dragend","mousewheel","DOMMouseScroll"];i.forEach(function(t){e.hammer.on(t,function(t){t.stopPropagation()})}),this.windowHammer=a(window,{prevent_default:!1}),this.windowHammer.on("tap",function(i){o(i.target,t)||e.deactivate() -}),this.escListener=this.deactivate.bind(this)}function o(t,e){for(;t;){if(t===e)return!0;t=t.parentNode}return!1}var n=i(50),r=i(49),a=i(41),h=i(1);r(s.prototype),s.current=null,s.prototype.destroy=function(){this.deactivate(),this.dom.overlay.parentNode.removeChild(this.dom.overlay),this.hammer=null,this.windowHammer=null},s.prototype.activate=function(){s.current&&s.current.deactivate(),s.current=this,this.active=!0,this.dom.overlay.style.display="none",h.addClassName(this.dom.container,"vis-active"),this.emit("change"),this.emit("activate"),n.bind("esc",this.escListener)},s.prototype.deactivate=function(){this.active=!1,this.dom.overlay.style.display="",h.removeClassName(this.dom.container,"vis-active"),n.unbind("esc",this.escListener),this.emit("change"),this.emit("deactivate")},s.prototype._onTapOverlay=function(t){this.activate(),t.stopPropagation()},t.exports=s},function(t){function e(t){return t?i(t):void 0}function i(t){for(var i in e.prototype)t[i]=e.prototype[i];return t}t.exports=e,e.prototype.on=e.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},e.prototype.once=function(t,e){function i(){s.off(t,i),e.apply(this,arguments)}var s=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},e.prototype.off=e.prototype.removeListener=e.prototype.removeAllListeners=e.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var s,o=0;os;++s)i[s].apply(this,e)}return this},e.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},e.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t){function e(t,e,i){return t.addEventListener?t.addEventListener(e,i,!1):void t.attachEvent("on"+e,i)}function i(t){return"keypress"==t.type?String.fromCharCode(t.which):_[t.which]?_[t.which]:x[t.which]?x[t.which]:String.fromCharCode(t.which).toLowerCase()}function s(t){var e=t.target||t.srcElement,i=e.tagName;return(" "+e.className+" ").indexOf(" mousetrap ")>-1?!1:"INPUT"==i||"SELECT"==i||"TEXTAREA"==i||e.contentEditable&&"true"==e.contentEditable}function o(t,e){return t.sort().join(",")===e.sort().join(",")}function n(t){t=t||{};var e,i=!1;for(e in D)t[e]?i=!0:D[e]=0;i||(T=!1)}function r(t,e,i,s,n){var r,a,h=[];if(!M[t])return[];for("keyup"==i&&c(t)&&(e=[t]),r=0;r95&&112>t||_.hasOwnProperty(t)&&(y[_[t]]=t)}return y}function f(t,e,i){return i||(i=u()[t]?"keydown":"keypress"),"keypress"==i&&e.length&&(i="keydown"),i}function m(t,e,s,o){D[t]=0,o||(o=f(e[0],[]));var r,a=function(){T=o,++D[t],p()},d=function(t){h(s,t),"keyup"!==o&&(E=i(t)),setTimeout(n,10)};for(r=0;r1)return m(t,d,e,i);for(h="+"===t?["+"]:t.split("+"),n=0;n":".","?":"/","|":"\\"},S={option:"alt",command:"meta","return":"enter",escape:"esc"},M={},C={},D={},E=!1,T=!1,O=1;20>O;++O)_[111+O]="f"+O;for(O=0;9>=O;++O)_[O+96]=O;e(document,"keypress",l),e(document,"keydown",l),e(document,"keyup",l);var L={bind:function(t,e,i){return v(t instanceof Array?t:[t],e,i),C[t+":"+i]=e,this},unbind:function(t,e){return C[t+":"+e]&&(delete C[t+":"+e],this.bind(t,function(){},e)),this},trigger:function(t,e){return C[t+":"+e](),this},reset:function(){return M={},C={},this}};t.exports=L},function(t,e,i){var s;(function(t,o){(function(n){function r(t,e,i){switch(arguments.length){case 2:return null!=t?t:e;case 3:return null!=t?t:null!=e?e:i;default:throw new Error("Implement me")}}function a(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function h(t){we.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function d(t,e){var i=!0;return g(function(){return i&&(h(t),i=!1),e.apply(this,arguments)},e)}function l(t,e){yi[t]||(h(e),yi[t]=!0)}function c(t,e){return function(i){return b(t.call(this,i),e)}}function p(t,e){return function(i){return this.localeData().ordinal(t.call(this,i),e)}}function u(){}function f(t,e){e!==!1&&z(t),v(this,t),this._d=new Date(+t._d)}function m(t){var e=T(t),i=e.year||0,s=e.quarter||0,o=e.month||0,n=e.week||0,r=e.day||0,a=e.hour||0,h=e.minute||0,d=e.second||0,l=e.millisecond||0;this._milliseconds=+l+1e3*d+6e4*h+36e5*a,this._days=+r+7*n,this._months=+o+3*s+12*i,this._data={},this._locale=we.localeData(),this._bubble()}function g(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return e.hasOwnProperty("toString")&&(t.toString=e.toString),e.hasOwnProperty("valueOf")&&(t.valueOf=e.valueOf),t}function v(t,e){var i,s,o;if("undefined"!=typeof e._isAMomentObject&&(t._isAMomentObject=e._isAMomentObject),"undefined"!=typeof e._i&&(t._i=e._i),"undefined"!=typeof e._f&&(t._f=e._f),"undefined"!=typeof e._l&&(t._l=e._l),"undefined"!=typeof e._strict&&(t._strict=e._strict),"undefined"!=typeof e._tzm&&(t._tzm=e._tzm),"undefined"!=typeof e._isUTC&&(t._isUTC=e._isUTC),"undefined"!=typeof e._offset&&(t._offset=e._offset),"undefined"!=typeof e._pf&&(t._pf=e._pf),"undefined"!=typeof e._locale&&(t._locale=e._locale),Pe.length>0)for(i in Pe)s=Pe[i],o=e[s],"undefined"!=typeof o&&(t[s]=o);return t}function y(t){return 0>t?Math.ceil(t):Math.floor(t)}function b(t,e,i){for(var s=""+Math.abs(t),o=t>=0;s.lengths;s++)(i&&t[s]!==e[s]||!i&&L(t[s])!==L(e[s]))&&r++;return r+n}function E(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=ci[t]||pi[e]||e}return t}function T(t){var e,i,s={};for(i in t)t.hasOwnProperty(i)&&(e=E(i),e&&(s[e]=t[i]));return s}function O(t){var e,i;if(0===t.indexOf("week"))e=7,i="day";else{if(0!==t.indexOf("month"))return;e=12,i="month"}we[t]=function(s,o){var r,a,h=we._locale[t],d=[];if("number"==typeof s&&(o=s,s=n),a=function(t){var e=we().utc().set(i,t);return h.call(we._locale,e,s||"")},null!=o)return a(o);for(r=0;e>r;r++)d.push(a(r));return d}}function L(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function k(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function N(t,e,i){return le(we([t,11,31+e-i]),e,i).week}function I(t){return A(t)?366:365}function A(t){return t%4===0&&t%100!==0||t%400===0}function z(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[Oe]<0||t._a[Oe]>11?Oe:t._a[Le]<1||t._a[Le]>k(t._a[Te],t._a[Oe])?Le:t._a[ke]<0||t._a[ke]>23?ke:t._a[Ne]<0||t._a[Ne]>59?Ne:t._a[Ie]<0||t._a[Ie]>59?Ie:t._a[Ae]<0||t._a[Ae]>999?Ae:-1,t._pf._overflowDayOfYear&&(Te>e||e>Le)&&(e=Le),t._pf.overflow=e)}function P(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length)),t._isValid}function R(t){return t?t.toLowerCase().replace("_","-"):t}function F(t){for(var e,i,s,o,n=0;n0;){if(s=H(o.slice(0,e).join("-")))return s;if(i&&i.length>=e&&D(o,i,!0)>=e-1)break;e--}n++}return null}function H(t){var e=null;if(!ze[t]&&Re)try{e=we.locale(),!function(){var t=new Error('Cannot find module "./locale"');throw t.code="MODULE_NOT_FOUND",t}(),we.locale(e)}catch(i){}return ze[t]}function Y(t,e){return e._isUTC?we(t).zone(e._offset||0):we(t).local()}function B(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function W(t){var e,i,s=t.match(Be);for(e=0,i=s.length;i>e;e++)s[e]=vi[s[e]]?vi[s[e]]:B(s[e]);return function(o){var n="";for(e=0;i>e;e++)n+=s[e]instanceof Function?s[e].call(o,t):s[e];return n}}function G(t,e){return t.isValid()?(e=j(e,t.localeData()),ui[e]||(ui[e]=W(e)),ui[e](t)):t.localeData().invalidDate()}function j(t,e){function i(t){return e.longDateFormat(t)||t}var s=5;for(We.lastIndex=0;s>=0&&We.test(t);)t=t.replace(We,i),We.lastIndex=0,s-=1;return t}function U(t,e){var i,s=e._strict;switch(t){case"Q":return Qe;case"DDDD":return ei;case"YYYY":case"GGGG":case"gggg":return s?ii:Ue;case"Y":case"G":case"g":return oi;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return s?si:Ve;case"S":if(s)return Qe;case"SS":if(s)return ti;case"SSS":if(s)return ei;case"DDD":return je;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Ze;case"a":case"A":return e._locale._meridiemParse;case"X":return $e;case"Z":case"ZZ":return qe;case"T":return Ke;case"SSSS":return Xe;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return s?ti:Ge;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Ge;case"Do":return Je;default:return i=new RegExp(te(Q(t.replace("\\","")),"i"))}}function V(t){t=t||"";var e=t.match(qe)||[],i=e[e.length-1]||[],s=(i+"").match(di)||["-",0,0],o=+(60*s[1])+L(s[2]);return"+"===s[0]?-o:o}function X(t,e,i){var s,o=i._a;switch(t){case"Q":null!=e&&(o[Oe]=3*(L(e)-1));break;case"M":case"MM":null!=e&&(o[Oe]=L(e)-1);break;case"MMM":case"MMMM":s=i._locale.monthsParse(e),null!=s?o[Oe]=s:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(o[Le]=L(e));break;case"Do":null!=e&&(o[Le]=L(parseInt(e,10)));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=L(e));break;case"YY":o[Te]=we.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":o[Te]=L(e);break;case"a":case"A":i._isPm=i._locale.isPM(e);break;case"H":case"HH":case"h":case"hh":o[ke]=L(e);break;case"m":case"mm":o[Ne]=L(e);break;case"s":case"ss":o[Ie]=L(e);break;case"S":case"SS":case"SSS":case"SSSS":o[Ae]=L(1e3*("0."+e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=V(e);break;case"dd":case"ddd":case"dddd":s=i._locale.weekdaysParse(e),null!=s?(i._w=i._w||{},i._w.d=s):i._pf.invalidWeekday=e;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":t=t.substr(0,1);case"gggg":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=L(e));break;case"gg":case"GG":i._w=i._w||{},i._w[t]=we.parseTwoDigitYear(e)}}function Z(t){var e,i,s,o,n,a,h;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(n=1,a=4,i=r(e.GG,t._a[Te],le(we(),1,4).year),s=r(e.W,1),o=r(e.E,1)):(n=t._locale._week.dow,a=t._locale._week.doy,i=r(e.gg,t._a[Te],le(we(),n,a).year),s=r(e.w,1),null!=e.d?(o=e.d,n>o&&++s):o=null!=e.e?e.e+n:n),h=ce(i,s,o,a,n),t._a[Te]=h.year,t._dayOfYear=h.dayOfYear}function q(t){var e,i,s,o,n=[];if(!t._d){for(s=$(t),t._w&&null==t._a[Le]&&null==t._a[Oe]&&Z(t),t._dayOfYear&&(o=r(t._a[Te],s[Te]),t._dayOfYear>I(o)&&(t._pf._overflowDayOfYear=!0),i=re(o,0,t._dayOfYear),t._a[Oe]=i.getUTCMonth(),t._a[Le]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=n[e]=s[e];for(;7>e;e++)t._a[e]=n[e]=null==t._a[e]?2===e?1:0:t._a[e];t._d=(t._useUTC?re:ne).apply(null,n),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()+t._tzm)}}function K(t){var e;t._d||(e=T(t._i),t._a=[e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond],q(t))}function $(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function J(t){if(t._f===we.ISO_8601)return void ie(t);t._a=[],t._pf.empty=!0;var e,i,s,o,n,r=""+t._i,a=r.length,h=0;for(s=j(t._f,t._locale).match(Be)||[],e=0;e0&&t._pf.unusedInput.push(n),r=r.slice(r.indexOf(i)+i.length),h+=i.length),vi[o]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(o),X(o,i,t)):t._strict&&!i&&t._pf.unusedTokens.push(o);t._pf.charsLeftOver=a-h,r.length>0&&t._pf.unusedInput.push(r),t._isPm&&t._a[ke]<12&&(t._a[ke]+=12),t._isPm===!1&&12===t._a[ke]&&(t._a[ke]=0),q(t),z(t)}function Q(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,s,o){return e||i||s||o})}function te(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function ee(t){var e,i,s,o,n;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(o=0;on)&&(s=n,i=e));g(t,i||e)}function ie(t){var e,i,s=t._i,o=ni.exec(s);if(o){for(t._pf.iso=!0,e=0,i=ai.length;i>e;e++)if(ai[e][1].exec(s)){t._f=ai[e][0]+(o[6]||" ");break}for(e=0,i=hi.length;i>e;e++)if(hi[e][1].exec(s)){t._f+=hi[e][0];break}s.match(qe)&&(t._f+="Z"),J(t)}else t._isValid=!1}function se(t){ie(t),t._isValid===!1&&(delete t._isValid,we.createFromInputFallback(t))}function oe(t){var e,i=t._i;i===n?t._d=new Date:C(i)?t._d=new Date(+i):null!==(e=Fe.exec(i))?t._d=new Date(+e[1]):"string"==typeof i?se(t):M(i)?(t._a=i.slice(0),q(t)):"object"==typeof i?K(t):"number"==typeof i?t._d=new Date(i):we.createFromInputFallback(t)}function ne(t,e,i,s,o,n,r){var a=new Date(t,e,i,s,o,n,r);return 1970>t&&a.setFullYear(t),a}function re(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function ae(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function he(t,e,i,s,o){return o.relativeTime(e||1,!!i,t,s)}function de(t,e,i){var s=we.duration(t).abs(),o=Ee(s.as("s")),n=Ee(s.as("m")),r=Ee(s.as("h")),a=Ee(s.as("d")),h=Ee(s.as("M")),d=Ee(s.as("y")),l=o0,l[4]=i,he.apply({},l)}function le(t,e,i){var s,o=i-e,n=i-t.day();return n>o&&(n-=7),o-7>n&&(n+=7),s=we(t).add(n,"d"),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function ce(t,e,i,s,o){var n,r,a=re(t,0,1).getUTCDay();return a=0===a?7:a,i=null!=i?i:o,n=o-a+(a>s?7:0)-(o>a?7:0),r=7*(e-1)+(i-o)+n+1,{year:r>0?t:t-1,dayOfYear:r>0?r:I(t-1)+r}}function pe(t){var e=t._i,i=t._f;return t._locale=t._locale||we.localeData(t._l),null===e||i===n&&""===e?we.invalid({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),we.isMoment(e)?new f(e,!0):(i?M(i)?ee(t):J(t):oe(t),new f(t)))}function ue(t,e){var i,s;if(1===e.length&&M(e[0])&&(e=e[0]),!e.length)return we();for(i=e[0],s=1;s=0?"+":"-";return e+b(Math.abs(t),6)},gg:function(){return b(this.weekYear()%100,2)},gggg:function(){return b(this.weekYear(),4)},ggggg:function(){return b(this.weekYear(),5)},GG:function(){return b(this.isoWeekYear()%100,2)},GGGG:function(){return b(this.isoWeekYear(),4)},GGGGG:function(){return b(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return L(this.milliseconds()/100)},SS:function(){return b(L(this.milliseconds()/10),2)},SSS:function(){return b(this.milliseconds(),3)},SSSS:function(){return b(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+b(L(t/60),2)+":"+b(L(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+b(L(t/60),2)+b(L(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},yi={},bi=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];mi.length;)Me=mi.pop(),vi[Me+"o"]=p(vi[Me],Me);for(;gi.length;)Me=gi.pop(),vi[Me+Me]=c(vi[Me],2);vi.DDDD=c(vi.DDD,3),g(u.prototype,{set:function(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t){var e,i,s;for(this._monthsParse||(this._monthsParse=[]),e=0;12>e;e++)if(this._monthsParse[e]||(i=we.utc([2e3,e]),s="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[e]=new RegExp(s.replace(".",""),"i")),this._monthsParse[e].test(t))return e},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,i,s;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(i=we([2e3,1]).day(e),s="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(s.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM D, YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e){var i=this._calendar[t];return"function"==typeof i?i.apply(e):i},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,i,s){var o=this._relativeTime[i];return"function"==typeof o?o(t,e,i,s):o.replace(/%d/i,t)},pastFuture:function(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",preparse:function(t){return t},postformat:function(t){return t},week:function(t){return le(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),we=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._i=t,o._f=e,o._l=i,o._strict=s,o._isUTC=!1,o._pf=a(),pe(o)},we.suppressDeprecationWarnings=!1,we.createFromInputFallback=d("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i)}),we.min=function(){var t=[].slice.call(arguments,0);return ue("isBefore",t)},we.max=function(){var t=[].slice.call(arguments,0);return ue("isAfter",t)},we.utc=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._useUTC=!0,o._isUTC=!0,o._l=i,o._i=t,o._f=e,o._strict=s,o._pf=a(),pe(o).utc()},we.unix=function(t){return we(1e3*t)},we.duration=function(t,e){var i,s,o,n,r=t,a=null;return we.isDuration(t)?r={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(r={},e?r[e]=t:r.milliseconds=t):(a=He.exec(t))?(i="-"===a[1]?-1:1,r={y:0,d:L(a[Le])*i,h:L(a[ke])*i,m:L(a[Ne])*i,s:L(a[Ie])*i,ms:L(a[Ae])*i}):(a=Ye.exec(t))?(i="-"===a[1]?-1:1,o=function(t){var e=t&&parseFloat(t.replace(",","."));return(isNaN(e)?0:e)*i},r={y:o(a[2]),M:o(a[3]),d:o(a[4]),h:o(a[5]),m:o(a[6]),s:o(a[7]),w:o(a[8])}):"object"==typeof r&&("from"in r||"to"in r)&&(n=x(we(r.from),we(r.to)),r={},r.ms=n.milliseconds,r.M=n.months),s=new m(r),we.isDuration(t)&&t.hasOwnProperty("_locale")&&(s._locale=t._locale),s},we.version=Ce,we.defaultFormat=ri,we.ISO_8601=function(){},we.momentProperties=Pe,we.updateOffset=function(){},we.relativeTimeThreshold=function(t,e){return fi[t]===n?!1:e===n?fi[t]:(fi[t]=e,!0)},we.lang=d("moment.lang is deprecated. Use moment.locale instead.",function(t,e){return we.locale(t,e)}),we.locale=function(t,e){var i;return t&&(i="undefined"!=typeof e?we.defineLocale(t,e):we.localeData(t),i&&(we.duration._locale=we._locale=i)),we._locale._abbr},we.defineLocale=function(t,e){return null!==e?(e.abbr=t,ze[t]||(ze[t]=new u),ze[t].set(e),we.locale(t),ze[t]):(delete ze[t],null)},we.langData=d("moment.langData is deprecated. Use moment.localeData instead.",function(t){return we.localeData(t)}),we.localeData=function(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return we._locale;if(!M(t)){if(e=H(t))return e;t=[t]}return F(t)},we.isMoment=function(t){return t instanceof f||null!=t&&t.hasOwnProperty("_isAMomentObject")},we.isDuration=function(t){return t instanceof m};for(Me=bi.length-1;Me>=0;--Me)O(bi[Me]);we.normalizeUnits=function(t){return E(t)},we.invalid=function(t){var e=we.utc(0/0);return null!=t?g(e._pf,t):e._pf.userInvalidated=!0,e},we.parseZone=function(){return we.apply(null,arguments).parseZone()},we.parseTwoDigitYear=function(t){return L(t)+(L(t)>68?1900:2e3)},g(we.fn=f.prototype,{clone:function(){return we(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var t=we(this).utc();return 00:!1},parsingFlags:function(){return g({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(t){return this.zone(0,t)},local:function(t){return this._isUTC&&(this.zone(0,t),this._isUTC=!1,t&&this.add(this._d.getTimezoneOffset(),"m")),this},format:function(t){var e=G(this,t||we.defaultFormat);return this.localeData().postformat(e)},add:w(1,"add"),subtract:w(-1,"subtract"),diff:function(t,e,i){var s,o,n=Y(t,this),r=6e4*(this.zone()-n.zone());return e=E(e),"year"===e||"month"===e?(s=432e5*(this.daysInMonth()+n.daysInMonth()),o=12*(this.year()-n.year())+(this.month()-n.month()),o+=(this-we(this).startOf("month")-(n-we(n).startOf("month")))/s,o-=6e4*(this.zone()-we(this).startOf("month").zone()-(n.zone()-we(n).startOf("month").zone()))/s,"year"===e&&(o/=12)):(s=this-n,o="second"===e?s/1e3:"minute"===e?s/6e4:"hour"===e?s/36e5:"day"===e?(s-r)/864e5:"week"===e?(s-r)/6048e5:s),i?o:y(o)},from:function(t,e){return we.duration({to:this,from:t}).locale(this.locale()).humanize(!e)},fromNow:function(t){return this.from(we(),t)},calendar:function(t){var e=t||we(),i=Y(e,this).startOf("day"),s=this.diff(i,"days",!0),o=-6>s?"sameElse":-1>s?"lastWeek":0>s?"lastDay":1>s?"sameDay":2>s?"nextDay":7>s?"nextWeek":"sameElse";return this.format(this.localeData().calendar(o,this))},isLeapYear:function(){return A(this.year())},isDST:function(){return this.zone()+we(t).startOf(e)},isBefore:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)<+we(t).startOf(e)},isSame:function(t,e){return e=e||"ms",+this.clone().startOf(e)===+Y(t,this).startOf(e)},min:d("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(t){return t=we.apply(null,arguments),this>t?this:t}),max:d("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(t){return t=we.apply(null,arguments),t>this?this:t}),zone:function(t,e){var i,s=this._offset||0;return null==t?this._isUTC?s:this._d.getTimezoneOffset():("string"==typeof t&&(t=V(t)),Math.abs(t)<16&&(t=60*t),!this._isUTC&&e&&(i=this._d.getTimezoneOffset()),this._offset=t,this._isUTC=!0,null!=i&&this.subtract(i,"m"),s!==t&&(!e||this._changeInProgress?S(this,we.duration(s-t,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,we.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(t){return t=t?we(t).zone():0,(this.zone()-t)%60===0 -},daysInMonth:function(){return k(this.year(),this.month())},dayOfYear:function(t){var e=Ee((we(this).startOf("day")-we(this).startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},quarter:function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},weekYear:function(t){var e=le(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==t?e:this.add(t-e,"y")},isoWeekYear:function(t){var e=le(this,1,4).year;return null==t?e:this.add(t-e,"y")},week:function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},isoWeek:function(t){var e=le(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},weekday:function(t){var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},isoWeeksInYear:function(){return N(this.year(),1,4)},weeksInYear:function(){var t=this.localeData()._week;return N(this.year(),t.dow,t.doy)},get:function(t){return t=E(t),this[t]()},set:function(t,e){return t=E(t),"function"==typeof this[t]&&this[t](e),this},locale:function(t){return t===n?this._locale._abbr:(this._locale=we.localeData(t),this)},lang:d("moment().lang() is deprecated. Use moment().localeData() instead.",function(t){return t===n?this.localeData():(this._locale=we.localeData(t),this)}),localeData:function(){return this._locale}}),we.fn.millisecond=we.fn.milliseconds=ve("Milliseconds",!1),we.fn.second=we.fn.seconds=ve("Seconds",!1),we.fn.minute=we.fn.minutes=ve("Minutes",!1),we.fn.hour=we.fn.hours=ve("Hours",!0),we.fn.date=ve("Date",!0),we.fn.dates=d("dates accessor is deprecated. Use date instead.",ve("Date",!0)),we.fn.year=ve("FullYear",!0),we.fn.years=d("years accessor is deprecated. Use year instead.",ve("FullYear",!0)),we.fn.days=we.fn.day,we.fn.months=we.fn.month,we.fn.weeks=we.fn.week,we.fn.isoWeeks=we.fn.isoWeek,we.fn.quarters=we.fn.quarter,we.fn.toJSON=we.fn.toISOString,g(we.duration.fn=m.prototype,{_bubble:function(){var t,e,i,s=this._milliseconds,o=this._days,n=this._months,r=this._data,a=0;r.milliseconds=s%1e3,t=y(s/1e3),r.seconds=t%60,e=y(t/60),r.minutes=e%60,i=y(e/60),r.hours=i%24,o+=y(i/24),a=y(ye(o)),o-=y(be(a)),n+=y(o/30),o%=30,a+=y(n/12),n%=12,r.days=o,r.months=n,r.years=a},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return y(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*L(this._months/12)},humanize:function(t){var e=de(this,!t,this.localeData());return t&&(e=this.localeData().pastFuture(+this,e)),this.localeData().postformat(e)},add:function(t,e){var i=we.duration(t,e);return this._milliseconds+=i._milliseconds,this._days+=i._days,this._months+=i._months,this._bubble(),this},subtract:function(t,e){var i=we.duration(t,e);return this._milliseconds-=i._milliseconds,this._days-=i._days,this._months-=i._months,this._bubble(),this},get:function(t){return t=E(t),this[t.toLowerCase()+"s"]()},as:function(t){var e,i;if(t=E(t),e=this._days+this._milliseconds/864e5,"month"===t||"year"===t)return i=this._months+12*ye(e),"month"===t?i:i/12;switch(e+=be(this._months/12),t){case"week":return e/7;case"day":return e;case"hour":return 24*e;case"minute":return 24*e*60;case"second":return 24*e*60*60;case"millisecond":return 24*e*60*60*1e3;default:throw new Error("Unknown unit "+t)}},lang:we.fn.lang,locale:we.fn.locale,toIsoString:d("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var t=Math.abs(this.years()),e=Math.abs(this.months()),i=Math.abs(this.days()),s=Math.abs(this.hours()),o=Math.abs(this.minutes()),n=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(t?t+"Y":"")+(e?e+"M":"")+(i?i+"D":"")+(s||o||n?"T":"")+(s?s+"H":"")+(o?o+"M":"")+(n?n+"S":""):"P0D"},localeData:function(){return this._locale}});for(Me in li)li.hasOwnProperty(Me)&&_e(Me.toLowerCase());we.duration.fn.asMilliseconds=function(){return this.as("ms")},we.duration.fn.asSeconds=function(){return this.as("s")},we.duration.fn.asMinutes=function(){return this.as("m")},we.duration.fn.asHours=function(){return this.as("h")},we.duration.fn.asDays=function(){return this.as("d")},we.duration.fn.asWeeks=function(){return this.as("weeks")},we.duration.fn.asMonths=function(){return this.as("M")},we.duration.fn.asYears=function(){return this.as("y")},we.locale("en",{ordinal:function(t){var e=t%10,i=1===L(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),Re?o.exports=we:(s=function(t,e,i){return i.config&&i.config()&&i.config().noGlobal===!0&&(De.moment=Se),we}.call(e,i,e,o),!(s!==n&&(o.exports=s)),xe(!0))}).call(this)}).call(e,function(){return this}(),i(64)(t))},function(t,e,i){var s;!function(o,n){"use strict";function r(){a.READY||(w.determineEventTypes(),x.each(a.gestures,function(t){M.register(t)}),w.onTouch(a.DOCUMENT,v,M.detect),w.onTouch(a.DOCUMENT,y,M.detect),a.READY=!0)}var a=function C(t,e){return new C.Instance(t,e||{})};a.VERSION="1.1.3",a.defaults={behavior:{userSelect:"none",touchAction:"pan-y",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},a.DOCUMENT=document,a.HAS_POINTEREVENTS=navigator.pointerEnabled||navigator.msPointerEnabled,a.HAS_TOUCHEVENTS="ontouchstart"in o,a.IS_MOBILE=/mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent),a.NO_MOUSEEVENTS=a.HAS_TOUCHEVENTS&&a.IS_MOBILE||a.HAS_POINTEREVENTS,a.CALCULATE_INTERVAL=25;var h={},d=a.DIRECTION_DOWN="down",l=a.DIRECTION_LEFT="left",c=a.DIRECTION_UP="up",p=a.DIRECTION_RIGHT="right",u=a.POINTER_MOUSE="mouse",f=a.POINTER_TOUCH="touch",m=a.POINTER_PEN="pen",g=a.EVENT_START="start",v=a.EVENT_MOVE="move",y=a.EVENT_END="end",b=a.EVENT_RELEASE="release",_=a.EVENT_TOUCH="touch";a.READY=!1,a.plugins=a.plugins||{},a.gestures=a.gestures||{};var x=a.utils={extend:function(t,e,i){for(var s in e)!e.hasOwnProperty(s)||t[s]!==n&&i||(t[s]=e[s]);return t},on:function(t,e,i){t.addEventListener(e,i,!1)},off:function(t,e,i){t.removeEventListener(e,i,!1)},each:function(t,e,i){var s,o;if("forEach"in t)t.forEach(e,i);else if(t.length!==n){for(s=0,o=t.length;o>s;s++)if(e.call(i,t[s],s,t)===!1)return}else for(s in t)if(t.hasOwnProperty(s)&&e.call(i,t[s],s,t)===!1)return},inStr:function(t,e){return t.indexOf(e)>-1},inArray:function(t,e){if(t.indexOf){var i=t.indexOf(e);return-1===i?!1:i}for(var s=0,o=t.length;o>s;s++)if(t[s]===e)return s;return!1},toArray:function(t){return Array.prototype.slice.call(t,0)},hasParent:function(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1},getCenter:function(t){var e=[],i=[],s=[],o=[],n=Math.min,r=Math.max;return 1===t.length?{pageX:t[0].pageX,pageY:t[0].pageY,clientX:t[0].clientX,clientY:t[0].clientY}:(x.each(t,function(t){e.push(t.pageX),i.push(t.pageY),s.push(t.clientX),o.push(t.clientY)}),{pageX:(n.apply(Math,e)+r.apply(Math,e))/2,pageY:(n.apply(Math,i)+r.apply(Math,i))/2,clientX:(n.apply(Math,s)+r.apply(Math,s))/2,clientY:(n.apply(Math,o)+r.apply(Math,o))/2})},getVelocity:function(t,e,i){return{x:Math.abs(e/t)||0,y:Math.abs(i/t)||0}},getAngle:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return 180*Math.atan2(s,i)/Math.PI},getDirection:function(t,e){var i=Math.abs(t.clientX-e.clientX),s=Math.abs(t.clientY-e.clientY);return i>=s?t.clientX-e.clientX>0?l:p:t.clientY-e.clientY>0?c:d},getDistance:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return Math.sqrt(i*i+s*s)},getScale:function(t,e){return t.length>=2&&e.length>=2?this.getDistance(e[0],e[1])/this.getDistance(t[0],t[1]):1},getRotation:function(t,e){return t.length>=2&&e.length>=2?this.getAngle(e[1],e[0])-this.getAngle(t[1],t[0]):0},isVertical:function(t){return t==c||t==d},setPrefixedCss:function(t,e,i,s){var o=["","Webkit","Moz","O","ms"];e=x.toCamelCase(e);for(var n=0;n0&&this.started&&(r=v),this.started=!0;var d=this.collectEventData(i,r,o,t);return e!=y&&s.call(M,d),a&&(d.changedLength=h,d.eventType=a,s.call(M,d),d.eventType=r,delete d.changedLength),r==y&&(s.call(M,d),this.started=!1),r},determineEventTypes:function(){var t;return t=a.HAS_POINTEREVENTS?o.PointerEvent?["pointerdown","pointermove","pointerup pointercancel lostpointercapture"]:["MSPointerDown","MSPointerMove","MSPointerUp MSPointerCancel MSLostPointerCapture"]:a.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],h[g]=t[0],h[v]=t[1],h[y]=t[2],h},getTouchList:function(t,e){if(a.HAS_POINTEREVENTS)return S.getTouchList();if(t.touches){if(e==v)return t.touches;var i=[],s=[].concat(x.toArray(t.touches),x.toArray(t.changedTouches)),o=[];return x.each(s,function(t){x.inArray(i,t.identifier)===!1&&o.push(t),i.push(t.identifier)}),o}return t.identifier=1,[t]},collectEventData:function(t,e,i,s){var o=f;return x.inStr(s.type,"mouse")||S.matchType(u,s)?o=u:S.matchType(m,s)&&(o=m),{center:x.getCenter(i),timeStamp:Date.now(),target:s.target,touches:i,eventType:e,pointerType:o,srcEvent:s,preventDefault:function(){var t=this.srcEvent;t.preventManipulation&&t.preventManipulation(),t.preventDefault&&t.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return M.stopDetect()}}}},S=a.PointerEvent={pointers:{},getTouchList:function(){var t=[];return x.each(this.pointers,function(e){t.push(e)}),t},updatePointer:function(t,e){t==y||t!=y&&1!==e.buttons?delete this.pointers[e.pointerId]:(e.identifier=e.pointerId,this.pointers[e.pointerId]=e)},matchType:function(t,e){if(!e.pointerType)return!1;var i=e.pointerType,s={};return s[u]=i===(e.MSPOINTER_TYPE_MOUSE||u),s[f]=i===(e.MSPOINTER_TYPE_TOUCH||f),s[m]=i===(e.MSPOINTER_TYPE_PEN||m),s[t]},reset:function(){this.pointers={}}},M=a.detection={gestures:[],current:null,previous:null,stopped:!1,startDetect:function(t,e){this.current||(this.stopped=!1,this.current={inst:t,startEvent:x.extend({},e),lastEvent:!1,lastCalcEvent:!1,futureCalcEvent:!1,lastCalcData:{},name:""},this.detect(e))},detect:function(t){if(this.current&&!this.stopped){t=this.extendEventData(t);var e=this.current.inst,i=e.options;return x.each(this.gestures,function(s){!this.stopped&&e.enabled&&i[s.name]&&s.handler.call(s,t,e)},this),this.current&&(this.current.lastEvent=t),t.eventType==y&&this.stopDetect(),t}},stopDetect:function(){this.previous=x.extend({},this.current),this.current=null,this.stopped=!0},getCalculatedData:function(t,e,i,s,o){var n=this.current,r=!1,h=n.lastCalcEvent,d=n.lastCalcData;h&&t.timeStamp-h.timeStamp>a.CALCULATE_INTERVAL&&(e=h.center,i=t.timeStamp-h.timeStamp,s=t.center.clientX-h.center.clientX,o=t.center.clientY-h.center.clientY,r=!0),(t.eventType==_||t.eventType==b)&&(n.futureCalcEvent=t),(!n.lastCalcEvent||r)&&(d.velocity=x.getVelocity(i,s,o),d.angle=x.getAngle(e,t.center),d.direction=x.getDirection(e,t.center),n.lastCalcEvent=n.futureCalcEvent||t,n.futureCalcEvent=t),t.velocityX=d.velocity.x,t.velocityY=d.velocity.y,t.interimAngle=d.angle,t.interimDirection=d.direction},extendEventData:function(t){var e=this.current,i=e.startEvent,s=e.lastEvent||i;(t.eventType==_||t.eventType==b)&&(i.touches=[],x.each(t.touches,function(t){i.touches.push({clientX:t.clientX,clientY:t.clientY})}));var o=t.timeStamp-i.timeStamp,n=t.center.clientX-i.center.clientX,r=t.center.clientY-i.center.clientY;return this.getCalculatedData(t,s.center,o,n,r),x.extend(t,{startEvent:i,deltaTime:o,deltaX:n,deltaY:r,distance:x.getDistance(i.center,t.center),angle:x.getAngle(i.center,t.center),direction:x.getDirection(i.center,t.center),scale:x.getScale(i.touches,t.touches),rotation:x.getRotation(i.touches,t.touches)}),t},register:function(t){var e=t.defaults||{};return e[t.name]===n&&(e[t.name]=!0),x.extend(a.defaults,e,!0),t.index=t.index||1e3,this.gestures.push(t),this.gestures.sort(function(t,e){return t.indexe.index?1:0}),this.gestures}};a.Instance=function(t,e){var i=this;r(),this.element=t,this.enabled=!0,x.each(e,function(t,i){delete e[i],e[x.toCamelCase(i)]=t}),this.options=x.extend(x.extend({},a.defaults),e||{}),this.options.behavior&&x.toggleBehavior(this.element,this.options.behavior,!0),this.eventStartHandler=w.onTouch(t,g,function(t){i.enabled&&t.eventType==g?M.startDetect(i,t):t.eventType==_&&M.detect(t)}),this.eventHandlers=[]},a.Instance.prototype={on:function(t,e){var i=this;return w.on(i.element,t,e,function(t){i.eventHandlers.push({gesture:t,handler:e})}),i},off:function(t,e){var i=this;return w.off(i.element,t,e,function(t){var s=x.inArray({gesture:t,handler:e});s!==!1&&i.eventHandlers.splice(s,1)}),i},trigger:function(t,e){e||(e={});var i=a.DOCUMENT.createEvent("Event");i.initEvent(t,!0,!0),i.gesture=e;var s=this.element;return x.hasParent(e.target,s)&&(s=e.target),s.dispatchEvent(i),this},enable:function(t){return this.enabled=t,this},dispose:function(){var t,e;for(x.toggleBehavior(this.element,this.options.behavior,!1),t=-1;e=this.eventHandlers[++t];)x.off(this.element,e.gesture,e.handler);return this.eventHandlers=[],w.off(this.element,h[g],this.eventStartHandler),null}},function(t){function e(e,s){var o=M.current;if(!(s.options.dragMaxTouches>0&&e.touches.length>s.options.dragMaxTouches))switch(e.eventType){case g:i=!1;break;case v:if(e.distance0)){var r=Math.abs(s.options.dragMinDistance/e.distance);n.pageX+=e.deltaX*r,n.pageY+=e.deltaY*r,n.clientX+=e.deltaX*r,n.clientY+=e.deltaY*r,e=M.extendEventData(e)}(o.lastEvent.dragLockToAxis||s.options.dragLockToAxis&&s.options.dragLockMinDistance<=e.distance)&&(e.dragLockToAxis=!0);var a=o.lastEvent.direction;e.dragLockToAxis&&a!==e.direction&&(e.direction=x.isVertical(a)?e.deltaY<0?c:d:e.deltaX<0?l:p),i||(s.trigger(t+"start",e),i=!0),s.trigger(t,e),s.trigger(t+e.direction,e);var h=x.isVertical(e.direction);(s.options.dragBlockVertical&&h||s.options.dragBlockHorizontal&&!h)&&e.preventDefault();break;case b:i&&e.changedLength<=s.options.dragMaxTouches&&(s.trigger(t+"end",e),i=!1);break;case y:i=!1}}var i=!1;a.gestures.Drag={name:t,index:50,handler:e,defaults:{dragMinDistance:10,dragDistanceCorrection:!0,dragMaxTouches:1,dragBlockHorizontal:!1,dragBlockVertical:!1,dragLockToAxis:!1,dragLockMinDistance:25}}}("drag"),a.gestures.Gesture={name:"gesture",index:1337,handler:function(t,e){e.trigger(this.name,t)}},function(t){function e(e,s){var o=s.options,n=M.current;switch(e.eventType){case g:clearTimeout(i),n.name=t,i=setTimeout(function(){n&&n.name==t&&s.trigger(t,e)},o.holdTimeout);break;case v:e.distance>o.holdThreshold&&clearTimeout(i);break;case b:clearTimeout(i)}}var i;a.gestures.Hold={name:t,index:10,defaults:{holdTimeout:500,holdThreshold:2},handler:e}}("hold"),a.gestures.Release={name:"release",index:1/0,handler:function(t,e){t.eventType==b&&e.trigger(this.name,t)}},a.gestures.Swipe={name:"swipe",index:40,defaults:{swipeMinTouches:1,swipeMaxTouches:1,swipeVelocityX:.6,swipeVelocityY:.6},handler:function(t,e){if(t.eventType==b){var i=t.touches.length,s=e.options;if(is.swipeMaxTouches)return;(t.velocityX>s.swipeVelocityX||t.velocityY>s.swipeVelocityY)&&(e.trigger(this.name,t),e.trigger(this.name+t.direction,t))}}},function(t){function e(e,s){var o,n,r=s.options,a=M.current,h=M.previous;switch(e.eventType){case g:i=!1;break;case v:i=i||e.distance>r.tapMaxDistance;break;case y:!x.inStr(e.srcEvent.type,"cancel")&&e.deltaTimes.options.transformMinRotation&&s.trigger("rotate",e),o>s.options.transformMinScale&&(s.trigger("pinch",e),s.trigger("pinch"+(e.scale<1?"in":"out"),e));break;case b:i&&e.changedLength<2&&(s.trigger(t+"end",e),i=!1)}}var i=!1;a.gestures.Transform={name:t,index:45,defaults:{transformMinScale:.01,transformMinRotation:1},handler:e}}("transform"),s=function(){return a}.call(e,i,e,t),!(s!==n&&(t.exports=s))}(window)},function(t,e){e.startWithClustering=function(){this.clusterToFit(this.constants.clustering.initialMaxNodes,!0),this.updateLabels(),this.stabilize&&this._stabilize(),this.start()},e.clusterToFit=function(t,e){for(var i=this.nodeIndices.length,s=50,o=0;i>t&&s>o;)o%3==0?(this.forceAggregateHubs(!0),this.normalizeClusterLevels()):this.increaseClusterLevel(),i=this.nodeIndices.length,o+=1;o>0&&1==e&&this.repositionNodes(),this._updateCalculationNodes()},e.openCluster=function(t){var e=this.moving;if(t.clusterSize>this.constants.clustering.sectorThreshold&&this._nodeInActiveArea(t)&&("default"!=this._sector()||1!=this.nodeIndices.length)){this._addSector(t);for(var i=0;this.nodeIndices.lengthi;)this.decreaseClusterLevel(),i+=1}else this._expandClusterNode(t,!1,!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this._updateCalculationNodes(),this.updateLabels();this.moving!=e&&this.start()},e.updateClustersDefault=function(){1==this.constants.clustering.enabled&&this.updateClusters(0,!1,!1)},e.increaseClusterLevel=function(){this.updateClusters(-1,!1,!0)},e.decreaseClusterLevel=function(){this.updateClusters(1,!1,!0)},e.updateClusters=function(t,e,i,s){var o=this.moving,n=this.nodeIndices.length;this.previousScale>this.scale&&0==t&&this._collapseSector(),this.previousScale>this.scale||-1==t?this._formClusters(i):(this.previousScalethis.scale||-1==t)&&(this._aggregateHubs(i),this._updateNodeIndexList()),(this.previousScale>this.scale||-1==t)&&(this.handleChains(),this._updateNodeIndexList()),this.previousScale=this.scale,this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.lengththis.constants.clustering.chainThreshold&&this._reduceAmountOfChains(1-this.constants.clustering.chainThreshold/t)},e._aggregateHubs=function(t){this._getHubSize(),this._formClustersByHub(t,!1)},e.forceAggregateHubs=function(t){var e=this.moving,i=this.nodeIndices.length;this._aggregateHubs(!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.length!=i&&(this.clusterSession+=1),(0==t||void 0===t)&&this.moving!=e&&this.start()},e._openClustersBySize=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];1==e.inView()&&(e.width*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientWidth||e.height*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientHeight)&&this.openCluster(e)}},e._openClusters=function(t,e){for(var i=0;i1&&(t.clusterSizei)){var r=n.from,a=n.to;n.to.options.mass>n.from.options.mass&&(r=n.to,a=n.from),1==a.dynamicEdgesLength?this._addToCluster(r,a,!1):1==r.dynamicEdgesLength&&this._addToCluster(a,r,!1)}}},e._forceClustersByZoom=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];if(1==e.dynamicEdgesLength&&0!=e.dynamicEdges.length){var i=e.dynamicEdges[0],s=i.toId==e.id?this.nodes[i.fromId]:this.nodes[i.toId];e.id!=s.id&&(s.options.mass>e.options.mass?this._addToCluster(s,e,!0):this._addToCluster(e,s,!0))}}},e._clusterToSmallestNeighbour=function(t){for(var e=-1,i=null,s=0;so.clusterSessions.length&&(e=o.clusterSessions.length,i=o)}null!=o&&void 0!==this.nodes[o.id]&&this._addToCluster(o,t,!0)},e._formClustersByHub=function(t,e){for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&this._formClusterFromHub(this.nodes[i],t,e)},e._formClusterFromHub=function(t,e,i,s){if(void 0===s&&(s=0),t.dynamicEdgesLength>=this.hubThreshold&&0==i||t.dynamicEdgesLength==this.hubThreshold&&1==i){for(var o,n,r,a=this.constants.clustering.clusterEdgeThreshold/this.scale,h=!1,d=[],l=t.dynamicEdges.length,c=0;l>c;c++)d.push(t.dynamicEdges[c].id);if(0==e)for(h=!1,c=0;l>c;c++){var p=this.edges[d[c]];if(void 0!==p&&p.connected&&p.toId!=p.fromId&&(o=p.to.x-p.from.x,n=p.to.y-p.from.y,r=Math.sqrt(o*o+n*n),a>r)){h=!0;break}}if(!e&&h||e)for(c=0;l>c;c++)if(p=this.edges[d[c]],void 0!==p){var u=this.nodes[p.fromId==t.id?p.toId:p.fromId];u.dynamicEdges.length<=this.hubThreshold+s&&u.id!=t.id&&this._addToCluster(t,u,e)}}},e._addToCluster=function(t,e,i){t.containedNodes[e.id]=e;for(var s=0;s1)for(var s=0;s1&&(e.label="[".concat(String(e.clusterSize),"]"))}for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(e=this.nodes[t],1==e.clusterSize&&(e.label=void 0!==e.originalLabel?e.originalLabel:String(e.id)))},e.normalizeClusterLevels=function(){var t,e=0,i=1e9,s=0;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(s=this.nodes[t].clusterSessions.length,s>e&&(e=s),i>s&&(i=s));if(e-i>this.constants.clustering.clusterLevelDifference){var o=this.nodeIndices.length,n=e-this.constants.clustering.clusterLevelDifference;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodes[t].clusterSessions.lengths&&(s=n.dynamicEdgesLength),t+=n.dynamicEdgesLength,e+=Math.pow(n.dynamicEdgesLength,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r);this.hubThreshold=Math.floor(t+2*a),this.hubThreshold>s&&(this.hubThreshold=s)},e._reduceAmountOfChains=function(t){this.hubThreshold=2;var e=Math.floor(this.nodeIndices.length*t);for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&e>0&&(this._formClusterFromHub(this.nodes[i],!0,!0,1),e-=1)},e._getChainFraction=function(){var t=0,e=0;for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&(2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&(t+=1),e+=1);return t/e}},function(t,e,i){var s=i(1);e._putDataInSector=function(){this.sectors.active[this._sector()].nodes=this.nodes,this.sectors.active[this._sector()].edges=this.edges,this.sectors.active[this._sector()].nodeIndices=this.nodeIndices},e._switchToSector=function(t,e){void 0===e||"active"==e?this._switchToActiveSector(t):this._switchToFrozenSector(t)},e._switchToActiveSector=function(t){this.nodeIndices=this.sectors.active[t].nodeIndices,this.nodes=this.sectors.active[t].nodes,this.edges=this.sectors.active[t].edges},e._switchToSupportSector=function(){this.nodeIndices=this.sectors.support.nodeIndices,this.nodes=this.sectors.support.nodes,this.edges=this.sectors.support.edges},e._switchToFrozenSector=function(t){this.nodeIndices=this.sectors.frozen[t].nodeIndices,this.nodes=this.sectors.frozen[t].nodes,this.edges=this.sectors.frozen[t].edges},e._loadLatestSector=function(){this._switchToSector(this._sector())},e._sector=function(){return this.activeSector[this.activeSector.length-1]},e._previousSector=function(){if(this.activeSector.length>1)return this.activeSector[this.activeSector.length-2];throw new TypeError("there are not enough sectors in the this.activeSector array.")},e._setActiveSector=function(t){this.activeSector.push(t)},e._forgetLastSector=function(){this.activeSector.pop()},e._createNewSector=function(t){this.sectors.active[t]={nodes:{},edges:{},nodeIndices:[],formationScale:this.scale,drawingNode:void 0},this.sectors.active[t].drawingNode=new Node({id:t,color:{background:"#eaefef",border:"495c5e"}},{},{},this.constants),this.sectors.active[t].drawingNode.clusterSize=2 -},e._deleteActiveSector=function(t){delete this.sectors.active[t]},e._deleteFrozenSector=function(t){delete this.sectors.frozen[t]},e._freezeSector=function(t){this.sectors.frozen[t]=this.sectors.active[t],this._deleteActiveSector(t)},e._activateSector=function(t){this.sectors.active[t]=this.sectors.frozen[t],this._deleteFrozenSector(t)},e._mergeThisWithFrozen=function(t){for(var e in this.nodes)this.nodes.hasOwnProperty(e)&&(this.sectors.frozen[t].nodes[e]=this.nodes[e]);for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.sectors.frozen[t].edges[i]=this.edges[i]);for(var s=0;s1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInSupportSector=function(t,e){if(void 0===e)this._switchToSupportSector(),this[t]();else{this._switchToSupportSector();var i=Array.prototype.splice.call(arguments,1);i.length>1?this[t](i[0],i[1]):this[t](e)}this._loadLatestSector()},e._doInAllFrozenSectors=function(t,e){if(void 0===e)for(var i in this.sectors.frozen)this.sectors.frozen.hasOwnProperty(i)&&(this._switchToFrozenSector(i),this[t]());else for(var i in this.sectors.frozen)if(this.sectors.frozen.hasOwnProperty(i)){this._switchToFrozenSector(i);var s=Array.prototype.splice.call(arguments,1);s.length>1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInAllSectors=function(t,e){var i=Array.prototype.splice.call(arguments,1);void 0===e?(this._doInAllActiveSectors(t),this._doInAllFrozenSectors(t)):i.length>1?(this._doInAllActiveSectors(t,i[0],i[1]),this._doInAllFrozenSectors(t,i[0],i[1])):(this._doInAllActiveSectors(t,e),this._doInAllFrozenSectors(t,e))},e._clearNodeIndexList=function(){var t=this._sector();this.sectors.active[t].nodeIndices=[],this.nodeIndices=this.sectors.active[t].nodeIndices},e._drawSectorNodes=function(t,e){var i,s=1e9,o=-1e9,n=1e9,r=-1e9;for(var a in this.sectors[e])if(this.sectors[e].hasOwnProperty(a)&&void 0!==this.sectors[e][a].drawingNode){this._switchToSector(a,e),s=1e9,o=-1e9,n=1e9,r=-1e9;for(var h in this.nodes)this.nodes.hasOwnProperty(h)&&(i=this.nodes[h],i.resize(t),n>i.x-.5*i.width&&(n=i.x-.5*i.width),ri.y-.5*i.height&&(s=i.y-.5*i.height),o0?this.nodes[i[i.length-1]]:null},e._getEdgesOverlappingWith=function(t,e){var i=this.edges;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},e._getAllEdgesOverlappingWith=function(t){var e=[];return this._doInAllActiveSectors("_getEdgesOverlappingWith",t,e),e},e._getEdgeAt=function(t){var e=this._pointerToPositionObject(t),i=this._getAllEdgesOverlappingWith(e);return i.length>0?this.edges[i[i.length-1]]:null},e._addToSelection=function(t){t instanceof s?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t},e._addToHover=function(t){t instanceof s?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t},e._removeFromSelection=function(t){t instanceof s?delete this.selectionObj.nodes[t.id]:delete this.selectionObj.edges[t.id]},e._unselectAll=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].unselect();for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&this.selectionObj.edges[i].unselect();this.selectionObj={nodes:{},edges:{}},0==t&&this.emit("select",this.getSelection())},e._unselectClusters=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].clusterSize>1&&(this.selectionObj.nodes[e].unselect(),this._removeFromSelection(this.selectionObj.nodes[e]));0==t&&this.emit("select",this.getSelection())},e._getSelectedNodeCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedNode=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t];return null},e._getSelectedEdge=function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t];return null},e._getSelectedEdgeCount=function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedObjectCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t},e._selectionIsEmpty=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0},e._clusterInSelection=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1},e._selectConnectedEdges=function(t){for(var e=0;ee;e++){s=t[e];var o=this.nodes[s];if(!o)throw new RangeError('Node with id "'+s+'" not found');this._selectObject(o,!0,!0)}console.log("setSelection is deprecated. Please use selectNodes instead."),this.redraw()},e.selectNodes=function(t,e){var i,s,o;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),i=0,s=t.length;s>i;i++){o=t[i];var n=this.nodes[o];if(!n)throw new RangeError('Node with id "'+o+'" not found');this._selectObject(n,!0,!0,e)}this.redraw()},e.selectEdges=function(t){var e,i,s;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),e=0,i=t.length;i>e;e++){s=t[e];var o=this.edges[s];if(!o)throw new RangeError('Edge with id "'+s+'" not found');this._selectObject(o,!0,!0,highlightEdges)}this.redraw()},e._updateSelection=function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},function(t,e,i){var s=i(1),o=i(36),n=i(33);e._clearManipulatorBar=function(){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild)},e._restoreOverloadedFunctions=function(){for(var t in this.cachedFunctions)this.cachedFunctions.hasOwnProperty(t)&&(this[t]=this.cachedFunctions[t])},e._toggleEditMode=function(){this.editMode=!this.editMode;var t=document.getElementById("network-manipulationDiv"),e=document.getElementById("network-manipulation-closeDiv"),i=document.getElementById("network-manipulation-editMode");1==this.editMode?(t.style.display="block",e.style.display="block",i.style.display="none",e.onclick=this._toggleEditMode.bind(this)):(t.style.display="none",e.style.display="none",i.style.display="block",e.onclick=null),this._createManipulatorBar()},e._createManipulatorBar=function(){this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];if(void 0!==this.edgeBeingEdited&&(this.edgeBeingEdited._disableControlNodes(),this.edgeBeingEdited=void 0,this.selectedControlNode=null,this.controlNodesActive=!1),this._restoreOverloadedFunctions(),this.freezeSimulation=!1,this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,1==this.editMode){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDiv.innerHTML=""+t.addNode+"
"+t.addEdge+"",1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?this.manipulationDiv.innerHTML+="
"+t.editNode+"":1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDiv.innerHTML+="
"+t.editEdge+""),0==this._selectionIsEmpty()&&(this.manipulationDiv.innerHTML+="
"+t.del+"");var e=document.getElementById("network-manipulate-addNode");e.onclick=this._createAddNodeToolbar.bind(this);var i=document.getElementById("network-manipulate-connectNode");if(i.onclick=this._createAddEdgeToolbar.bind(this),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit){var s=document.getElementById("network-manipulate-editNode");s.onclick=this._editNode.bind(this)}else if(1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()){var s=document.getElementById("network-manipulate-editEdge");s.onclick=this._createEditEdgeToolbar.bind(this)}if(0==this._selectionIsEmpty()){var o=document.getElementById("network-manipulate-delete");o.onclick=this._deleteSelected.bind(this)}var n=document.getElementById("network-manipulation-closeDiv");n.onclick=this._toggleEditMode.bind(this),this.boundFunction=this._createManipulatorBar.bind(this),this.on("select",this.boundFunction)}else{this.editModeDiv.innerHTML=""+t.edit+"";var r=document.getElementById("network-manipulate-editModeButton");r.onclick=this._toggleEditMode.bind(this)}},e._createAddNodeToolbar=function(){this._clearManipulatorBar(),this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];this.manipulationDiv.innerHTML=""+t.back+"
"+t.addDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._addNode.bind(this),this.on("select",this.boundFunction)},e._createAddEdgeToolbar=function(){this._clearManipulatorBar(),this._unselectAll(!0),this.freezeSimulation=!0;var t=this.constants.locales[this.constants.locale];this.boundFunction&&this.off("select",this.boundFunction),this._unselectAll(),this.forceAppendSelection=!1,this.blockConnectingEdgeSelection=!0,this.manipulationDiv.innerHTML=""+t.back+"
"+t.edgeDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._handleConnect.bind(this),this.on("select",this.boundFunction),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._handleOnRelease=this._handleOnRelease,this._handleTouch=this._handleConnect,this._handleOnRelease=this._finishConnect,this._redraw()},e._createEditEdgeToolbar=function(){this._clearManipulatorBar(),this.controlNodesActive=!0,this.boundFunction&&this.off("select",this.boundFunction),this.edgeBeingEdited=this._getSelectedEdge(),this.edgeBeingEdited._enableControlNodes();var t=this.constants.locales[this.constants.locale];this.manipulationDiv.innerHTML=""+t.back+"
"+t.editEdgeDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._handleOnRelease=this._handleOnRelease,this.cachedFunctions._handleTap=this._handleTap,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleTouch=this._selectControlNode,this._handleTap=function(){},this._handleOnDrag=this._controlNodeDrag,this._handleDragStart=function(){},this._handleOnRelease=this._releaseControlNode,this._redraw()},e._selectControlNode=function(t){this.edgeBeingEdited.controlNodes.from.unselect(),this.edgeBeingEdited.controlNodes.to.unselect(),this.selectedControlNode=this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(t.x),this._YconvertDOMtoCanvas(t.y)),null!==this.selectedControlNode&&(this.selectedControlNode.select(),this.freezeSimulation=!0),this._redraw()},e._controlNodeDrag=function(t){var e=this._getPointer(t.gesture.center);null!==this.selectedControlNode&&void 0!==this.selectedControlNode&&(this.selectedControlNode.x=this._XconvertDOMtoCanvas(e.x),this.selectedControlNode.y=this._YconvertDOMtoCanvas(e.y)),this._redraw()},e._releaseControlNode=function(t){var e=this._getNodeAt(t);null!=e?(1==this.edgeBeingEdited.controlNodes.from.selected&&(this._editEdge(e.id,this.edgeBeingEdited.to.id),this.edgeBeingEdited.controlNodes.from.unselect()),1==this.edgeBeingEdited.controlNodes.to.selected&&(this._editEdge(this.edgeBeingEdited.from.id,e.id),this.edgeBeingEdited.controlNodes.to.unselect())):this.edgeBeingEdited._restoreControlNodes(),this.freezeSimulation=!1,this._redraw()},e._handleConnect=function(t){if(0==this._getSelectedNodeCount()){var e=this._getNodeAt(t);null!=e&&(e.clusterSize>1?alert(this.constants.locales[this.constants.locale].createEdgeError):(this._selectObject(e,!1),this.sectors.support.nodes.targetNode=new o({id:"targetNode"},{},{},this.constants),this.sectors.support.nodes.targetNode.x=e.x,this.sectors.support.nodes.targetNode.y=e.y,this.sectors.support.nodes.targetViaNode=new o({id:"targetViaNode"},{},{},this.constants),this.sectors.support.nodes.targetViaNode.x=e.x,this.sectors.support.nodes.targetViaNode.y=e.y,this.sectors.support.nodes.targetViaNode.parentEdgeId="connectionEdge",this.edges.connectionEdge=new n({id:"connectionEdge",from:e.id,to:this.sectors.support.nodes.targetNode.id},this,this.constants),this.edges.connectionEdge.from=e,this.edges.connectionEdge.connected=!0,this.edges.connectionEdge.smooth=!0,this.edges.connectionEdge.selected=!0,this.edges.connectionEdge.to=this.sectors.support.nodes.targetNode,this.edges.connectionEdge.via=this.sectors.support.nodes.targetViaNode,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleOnDrag=function(t){var e=this._getPointer(t.gesture.center);this.sectors.support.nodes.targetNode.x=this._XconvertDOMtoCanvas(e.x),this.sectors.support.nodes.targetNode.y=this._YconvertDOMtoCanvas(e.y),this.sectors.support.nodes.targetViaNode.x=.5*(this._XconvertDOMtoCanvas(e.x)+this.edges.connectionEdge.from.x),this.sectors.support.nodes.targetViaNode.y=this._YconvertDOMtoCanvas(e.y)},this.moving=!0,this.start()))}},e._finishConnect=function(t){if(1==this._getSelectedNodeCount()){this._handleOnDrag=this.cachedFunctions._handleOnDrag,delete this.cachedFunctions._handleOnDrag;var e=this.edges.connectionEdge.fromId;delete this.edges.connectionEdge,delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode;var i=this._getNodeAt(t);null!=i&&(i.clusterSize>1?alert(this.constants.locales[this.constants.locale].createEdgeError):(this._createEdge(e,i.id),this._createManipulatorBar())),this._unselectAll()}},e._addNode=function(){if(this._selectionIsEmpty()&&1==this.editMode){var t=this._pointerToPositionObject(this.pointerPosition),e={id:s.randomUUID(),x:t.left,y:t.top,label:"new",allowedToMoveX:!0,allowedToMoveY:!0};if(this.triggerFunctions.add){if(2!=this.triggerFunctions.add.length)throw new Error("The function for add does not support two arguments (data,callback)");var i=this;this.triggerFunctions.add(e,function(t){i.nodesData.add(t),i._createManipulatorBar(),i.moving=!0,i.start()})}else this.nodesData.add(e),this._createManipulatorBar(),this.moving=!0,this.start()}},e._createEdge=function(t,e){if(1==this.editMode){var i={from:t,to:e};if(this.triggerFunctions.connect){if(2!=this.triggerFunctions.connect.length)throw new Error("The function for connect does not support two arguments (data,callback)");var s=this;this.triggerFunctions.connect(i,function(t){s.edgesData.add(t),s.moving=!0,s.start()})}else this.edgesData.add(i),this.moving=!0,this.start()}},e._editEdge=function(t,e){if(1==this.editMode){var i={id:this.edgeBeingEdited.id,from:t,to:e};if(this.triggerFunctions.editEdge){if(2!=this.triggerFunctions.editEdge.length)throw new Error("The function for edit does not support two arguments (data, callback)");var s=this;this.triggerFunctions.editEdge(i,function(t){s.edgesData.update(t),s.moving=!0,s.start()})}else this.edgesData.update(i),this.moving=!0,this.start()}},e._editNode=function(){if(!this.triggerFunctions.edit||1!=this.editMode)throw new Error("No edit function has been bound to this button");var t=this._getSelectedNode(),e={id:t.id,label:t.label,group:t.options.group,shape:t.options.shape,color:{background:t.options.color.background,border:t.options.color.border,highlight:{background:t.options.color.highlight.background,border:t.options.color.highlight.border}}};if(2!=this.triggerFunctions.edit.length)throw new Error("The function for edit does not support two arguments (data, callback)");var i=this;this.triggerFunctions.edit(e,function(t){i.nodesData.update(t),i._createManipulatorBar(),i.moving=!0,i.start()})},e._deleteSelected=function(){if(!this._selectionIsEmpty()&&1==this.editMode)if(this._clusterInSelection())alert(this.constants.locales[this.constants.locale].deleteClusterError);else{var t=this.getSelectedNodes(),e=this.getSelectedEdges();if(this.triggerFunctions.del){var i=this,s={nodes:t,edges:e};if(!(this.triggerFunctions.del.length=2))throw new Error("The function for delete does not support two arguments (data, callback)");this.triggerFunctions.del(s,function(t){i.edgesData.remove(t.edges),i.nodesData.remove(t.nodes),i._unselectAll(),i.moving=!0,i.start()})}else this.edgesData.remove(e),this.nodesData.remove(t),this._unselectAll(),this.moving=!0,this.start()}}},function(t,e,i){var s=(i(1),i(41));e._cleanNavigation=function(){var t=document.getElementById("network-navigation_wrapper");t&&t.parentNode&&t.parentNode.removeChild(t),document.onmouseup=null},e._loadNavigationElements=function(){this._cleanNavigation(),this.navigationDivs={};var t=["up","down","left","right","zoomIn","zoomOut","zoomExtends"],e=["_moveUp","_moveDown","_moveLeft","_moveRight","_zoomIn","_zoomOut","zoomExtent"];this.navigationDivs.wrapper=document.createElement("div"),this.navigationDivs.wrapper.id="network-navigation_wrapper",this.frame.appendChild(this.navigationDivs.wrapper);for(var i=this,o=0;o0){"RL"==this.constants.hierarchicalLayout.direction||"DU"==this.constants.hierarchicalLayout.direction?this.constants.hierarchicalLayout.levelSeparation*=-1:this.constants.hierarchicalLayout.levelSeparation=Math.abs(this.constants.hierarchicalLayout.levelSeparation),"RL"==this.constants.hierarchicalLayout.direction||"LR"==this.constants.hierarchicalLayout.direction?1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="vertical"):1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="horizontal");var t,e,i=0,s=!1,o=!1;for(e in this.nodes)this.nodes.hasOwnProperty(e)&&(t=this.nodes[e],-1!=t.level?s=!0:o=!0,is&&(n.xFixed=!1,n.x=i[n.level].minPos,r=!0):n.yFixed&&n.level>s&&(n.yFixed=!1,n.y=i[n.level].minPos,r=!0),1==r&&(i[n.level].minPos+=i[n.level].nodeSpacing,n.edges.length>1&&this._placeBranchNodes(n.edges,n.id,i,n.level))}},e._setLevel=function(t,e,i){for(var s=0;st)&&(o.level=t,e.length>1&&this._setLevel(t+1,o.edges,o.id))}},e._restoreNodes=function(){for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.nodes[t].xFixed=!1,this.nodes[t].yFixed=!1)}},function(t,e,i){function s(){this.constants.smoothCurves.enabled=!this.constants.smoothCurves.enabled;var t=document.getElementById("graph_toggleSmooth");t.style.background=1==this.constants.smoothCurves.enabled?"#A4FF56":"#FF8532",this._configureSmoothCurves(!1)}function o(){for(var t in this.calculationNodes)this.calculationNodes.hasOwnProperty(t)&&(this.calculationNodes[t].vx=0,this.calculationNodes[t].vy=0,this.calculationNodes[t].fx=0,this.calculationNodes[t].fy=0);1==this.constants.hierarchicalLayout.enabled?(this._setupHierarchicalLayout(),a.call(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),a.call(this,"graph_H_cg",1,"physics_centralGravity"),a.call(this,"graph_H_sc",1,"physics_springConstant"),a.call(this,"graph_H_sl",1,"physics_springLength"),a.call(this,"graph_H_damp",1,"physics_damping")):this.repositionNodes(),this.moving=!0,this.start()}function n(){var t="No options are required, default values used.",e=[],i=document.getElementById("graph_physicsMethod1"),s=document.getElementById("graph_physicsMethod2");if(1==i.checked){if(this.constants.physics.barnesHut.gravitationalConstant!=this.backupConstants.physics.barnesHut.gravitationalConstant&&e.push("gravitationalConstant: "+this.constants.physics.barnesHut.gravitationalConstant),this.constants.physics.centralGravity!=this.backupConstants.physics.barnesHut.centralGravity&&e.push("centralGravity: "+this.constants.physics.centralGravity),this.constants.physics.springLength!=this.backupConstants.physics.barnesHut.springLength&&e.push("springLength: "+this.constants.physics.springLength),this.constants.physics.springConstant!=this.backupConstants.physics.barnesHut.springConstant&&e.push("springConstant: "+this.constants.physics.springConstant),this.constants.physics.damping!=this.backupConstants.physics.barnesHut.damping&&e.push("damping: "+this.constants.physics.damping),0!=e.length){t="var options = {",t+="physics: {barnesHut: {";for(var o=0;othis.constants.clustering.clusterThreshold&&1==this.constants.clustering.enabled&&this.clusterToFit(this.constants.clustering.reduceToNodes,!1),this._calculateForces())},e._calculateForces=function(){this._calculateGravitationalForces(),this._calculateNodeForces(),this.constants.physics.springConstant>0&&(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic?this._calculateSpringForcesWithSupport():1==this.constants.physics.hierarchicalRepulsion.enabled?this._calculateHierarchicalSpringForces():this._calculateSpringForces())},e._updateCalculationNodes=function(){if(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic){this.calculationNodes={},this.calculationNodeIndices=[];for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.calculationNodes[t]=this.nodes[t]);var e=this.sectors.support.nodes;for(var i in e)e.hasOwnProperty(i)&&(this.edges.hasOwnProperty(e[i].parentEdgeId)?this.calculationNodes[i]=e[i]:e[i]._setForce(0,0));for(var s in this.calculationNodes)this.calculationNodes.hasOwnProperty(s)&&this.calculationNodeIndices.push(s)}else this.calculationNodes=this.nodes,this.calculationNodeIndices=this.nodeIndices},e._calculateGravitationalForces=function(){var t,e,i,s,o,n=this.calculationNodes,r=this.constants.physics.centralGravity,a=0;for(o=0;oSimulation Mode:Barnes HutRepulsionHierarchical
Options:
',this.containerElement.parentElement.insertBefore(this.physicsConfiguration,this.containerElement),this.optionsDiv=document.createElement("div"),this.optionsDiv.style.fontSize="14px",this.optionsDiv.style.fontFamily="verdana",this.containerElement.parentElement.insertBefore(this.optionsDiv,this.containerElement);var e;e=document.getElementById("graph_BH_gc"),e.onchange=a.bind(this,"graph_BH_gc",-1,"physics_barnesHut_gravitationalConstant"),e=document.getElementById("graph_BH_cg"),e.onchange=a.bind(this,"graph_BH_cg",1,"physics_centralGravity"),e=document.getElementById("graph_BH_sc"),e.onchange=a.bind(this,"graph_BH_sc",1,"physics_springConstant"),e=document.getElementById("graph_BH_sl"),e.onchange=a.bind(this,"graph_BH_sl",1,"physics_springLength"),e=document.getElementById("graph_BH_damp"),e.onchange=a.bind(this,"graph_BH_damp",1,"physics_damping"),e=document.getElementById("graph_R_nd"),e.onchange=a.bind(this,"graph_R_nd",1,"physics_repulsion_nodeDistance"),e=document.getElementById("graph_R_cg"),e.onchange=a.bind(this,"graph_R_cg",1,"physics_centralGravity"),e=document.getElementById("graph_R_sc"),e.onchange=a.bind(this,"graph_R_sc",1,"physics_springConstant"),e=document.getElementById("graph_R_sl"),e.onchange=a.bind(this,"graph_R_sl",1,"physics_springLength"),e=document.getElementById("graph_R_damp"),e.onchange=a.bind(this,"graph_R_damp",1,"physics_damping"),e=document.getElementById("graph_H_nd"),e.onchange=a.bind(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),e=document.getElementById("graph_H_cg"),e.onchange=a.bind(this,"graph_H_cg",1,"physics_centralGravity"),e=document.getElementById("graph_H_sc"),e.onchange=a.bind(this,"graph_H_sc",1,"physics_springConstant"),e=document.getElementById("graph_H_sl"),e.onchange=a.bind(this,"graph_H_sl",1,"physics_springLength"),e=document.getElementById("graph_H_damp"),e.onchange=a.bind(this,"graph_H_damp",1,"physics_damping"),e=document.getElementById("graph_H_direction"),e.onchange=a.bind(this,"graph_H_direction",t,"hierarchicalLayout_direction"),e=document.getElementById("graph_H_levsep"),e.onchange=a.bind(this,"graph_H_levsep",1,"hierarchicalLayout_levelSeparation"),e=document.getElementById("graph_H_nspac"),e.onchange=a.bind(this,"graph_H_nspac",1,"hierarchicalLayout_nodeSpacing");var i=document.getElementById("graph_physicsMethod1"),d=document.getElementById("graph_physicsMethod2"),l=document.getElementById("graph_physicsMethod3");d.checked=!0,this.constants.physics.barnesHut.enabled&&(i.checked=!0),this.constants.hierarchicalLayout.enabled&&(l.checked=!0);var c=document.getElementById("graph_toggleSmooth"),p=document.getElementById("graph_repositionNodes"),u=document.getElementById("graph_generateOptions");c.onclick=s.bind(this),p.onclick=o.bind(this),u.onclick=n.bind(this),c.style.background=1==this.constants.smoothCurves&&0==this.constants.dynamicSmoothCurves?"#A4FF56":"#FF8532",r.apply(this),i.onchange=r.bind(this),d.onchange=r.bind(this),l.onchange=r.bind(this)}},e._overWriteGraphConstants=function(t,e){var i=t.split("_");1==i.length?this.constants[i[0]]=e:2==i.length?this.constants[i[0]][i[1]]=e:3==i.length&&(this.constants[i[0]][i[1]][i[2]]=e)}},function(t){function e(t){throw new Error("Cannot find module '"+t+"'.")}e.resolve=e,e.keys=function(){return[]},t.exports=e},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l,c=this.calculationNodes,p=this.calculationNodeIndices,u=-2/3,f=4/3,m=this.constants.physics.repulsion.nodeDistance,g=m;for(d=0;di&&(r=.5*g>i?1:v*i+f,r*=0==n?1:1+n*this.constants.clustering.forceAmplification,r/=i,s=t*r,o=e*r,a.fx-=s,a.fy-=o,h.fx+=s,h.fy+=o)}}},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l=this.calculationNodes,c=this.calculationNodeIndices,p=this.constants.physics.hierarchicalRepulsion.nodeDistance;for(h=0;hi?-Math.pow(u*i,2)+Math.pow(u*p,2):0,0==i?i=.01:n/=i,s=t*n,o=e*n,r.fx-=s,r.fy-=o,a.fx+=s,a.fy+=o}},e._calculateHierarchicalSpringForces=function(){for(var t,e,i,s,o,n,r,a,h,d=this.edges,l=this.calculationNodes,c=this.calculationNodeIndices,p=0;pn;n++)t=e[i[n]],t.options.mass>0&&(this._getForceContribution(o.root.children.NW,t),this._getForceContribution(o.root.children.NE,t),this._getForceContribution(o.root.children.SW,t),this._getForceContribution(o.root.children.SE,t))}},e._getForceContribution=function(t,e){if(t.childrenCount>0){var i,s,o;if(i=t.centerOfMass.x-e.x,s=t.centerOfMass.y-e.y,o=Math.sqrt(i*i+s*s),o*t.calcSize>this.constants.physics.barnesHut.theta){0==o&&(o=.1*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}else if(4==t.childrenCount)this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e);else if(t.children.data.id!=e.id){0==o&&(o=.5*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}}},e._formBarnesHutTree=function(t,e){for(var i,s=e.length,o=Number.MAX_VALUE,n=Number.MAX_VALUE,r=-Number.MAX_VALUE,a=-Number.MAX_VALUE,h=0;s>h;h++){var d=t[e[h]].x,l=t[e[h]].y;t[e[h]].options.mass>0&&(o>d&&(o=d),d>r&&(r=d),n>l&&(n=l),l>a&&(a=l))}var c=Math.abs(r-o)-Math.abs(a-n);c>0?(n-=.5*c,a+=.5*c):(o+=.5*c,r-=.5*c);var p=1e-5,u=Math.max(p,Math.abs(r-o)),f=.5*u,m=.5*(o+r),g=.5*(n+a),v={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:m-f,maxX:m+f,minY:g-f,maxY:g+f},size:u,calcSize:1/u,children:{data:null},maxWidth:0,level:0,childrenCount:4}};for(this._splitBranch(v.root),h=0;s>h;h++)i=t[e[h]],i.options.mass>0&&this._placeInTree(v.root,i);this.barnesHutTree=v},e._updateBranchMass=function(t,e){var i=t.mass+e.options.mass,s=1/i;t.centerOfMass.x=t.centerOfMass.x*t.mass+e.x*e.options.mass,t.centerOfMass.x*=s,t.centerOfMass.y=t.centerOfMass.y*t.mass+e.y*e.options.mass,t.centerOfMass.y*=s,t.mass=i;var o=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NW"):this._placeInRegion(t,e,"SW"):t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NE"):this._placeInRegion(t,e,"SE")},e._placeInRegion=function(t,e,i){switch(t.children[i].childrenCount){case 0:t.children[i].children.data=e,t.children[i].childrenCount=1,this._updateBranchMass(t.children[i],e);break;case 1:t.children[i].children.data.x==e.x&&t.children[i].children.data.y==e.y?(e.x+=Math.random(),e.y+=Math.random()):(this._splitBranch(t.children[i]),this._placeInTree(t.children[i],e));break;case 4:this._placeInTree(t.children[i],e)}},e._splitBranch=function(t){var e=null;1==t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)},e._insertRegion=function(t,e){var i,s,o,n,r=.5*t.size;switch(e){case"NW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY,n=t.range.minY+r;break;case"NE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY,n=t.range.minY+r;break;case"SW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY+r,n=t.range.maxY;break;case"SE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY+r,n=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:s,minY:o,maxY:n},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}},e._drawTree=function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))},e._drawBranch=function(t,e,i){void 0===i&&(i="#FF0000"),4==t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}},function(t){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}}])}); +var i="";for(var e in this.groups)this.groups.hasOwnProperty(e)&&1==this.groups[e].visible&&(i+=this.groups[e].content+"
");this.dom.textArea.innerHTML=i,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},s.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){n.prepareElements(this.svgElements);var t=window.getComputedStyle(this.dom.frame).paddingTop,e=Number(t.replace("px","")),i=e,s=this.options.iconSize,o=.75*this.options.iconSize,r=e+.5*o+3;this.svg.style.width=s+5+e+"px";for(var a in this.groups)this.groups.hasOwnProperty(a)&&1==this.groups[a].visible&&(this.groups[a].drawIcon(i,r,this.svgElements,this.svg,s,o),r+=o+this.options.iconSpacing);n.cleanupElements(this.svgElements)}},t.exports=s},function(t,e,i){function s(t,e){this.id=o.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,handleOverlap:"overlap",align:"center"},catmullRom:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:"40px",visible:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}}},legend:{enabled:!1,icons:!0,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}},groups:{visibility:{}}},this.options=o.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={},this.abortedGraphUpdate=!1;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechange",function(){if(0!=i.lastStart){var t=i.body.range.start-i.lastStart,e=i.body.range.end-i.body.range.start;if(0!=i.width){var s=i.width/e,o=t*s;i.svg.style.left=-i.width-o+"px"}}}),this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=o.option.asSize(-i.width),i._updateGraph.apply(i)}),this._create(),this.body.emitter.emit("change")}var o=i(1),n=i(2),r=i(3),a=i(4),h=i(18),d=i(21),l=i(22),c=i(25),p="__ungrouped__";s.prototype=new h,s.prototype._create=function(){var t=document.createElement("div");t.className="LineGraph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new d(this.body,this.options.dataAxis,this.svg),this.options.dataAxis.orientation="right",this.yAxisRight=new d(this.body,this.options.dataAxis,this.svg),delete this.options.dataAxis.orientation,this.legendLeft=new c(this.body,this.options.legend,"left"),this.legendRight=new c(this.body,this.options.legend,"right"),this.show()},s.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort","groups"];o.selectiveDeepExtend(e,this.options,t),o.mergeOptions(this.options,t,"catmullRom"),o.mergeOptions(this.options,t,"drawPoints"),o.mergeOptions(this.options,t,"shaded"),o.mergeOptions(this.options,t,"legend"),t.catmullRom&&"object"==typeof t.catmullRom&&t.catmullRom.parametrization&&("uniform"==t.catmullRom.parametrization?this.options.catmullRom.alpha=0:"chordal"==t.catmullRom.parametrization?this.options.catmullRom.alpha=1:(this.options.catmullRom.parametrization="centripetal",this.options.catmullRom.alpha=.5)),this.yAxisLeft&&void 0!==t.dataAxis&&(this.yAxisLeft.setOptions(this.options.dataAxis),this.yAxisRight.setOptions(this.options.dataAxis)),this.legendLeft&&void 0!==t.legend&&(this.legendLeft.setOptions(this.options.legend),this.legendRight.setOptions(this.options.legend)),this.groups.hasOwnProperty(p)&&this.groups[p].setOptions(t)}this.dom.frame&&this._updateGraph()},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(o.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;o.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e)}this._updateUngrouped(),this._updateGraph(),this.redraw()},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(o.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;o.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._onUpdate()},s.prototype._onUpdate=function(){this._updateUngrouped(),this._updateAllGroupData(),this._updateGraph(),this.redraw()},s.prototype._onAdd=function(t){this._onUpdate(t)},s.prototype._onRemove=function(t){this._onUpdate(t)},s.prototype._onUpdateGroups=function(t){for(var e=0;e0){var d=this.body.util.toGlobalTime(-this.body.domProps.root.width),l=this.body.util.toGlobalTime(2*this.body.domProps.root.width),c={};for(this._getRelevantData(a,c,d,l),e=0;e0)for(r=0;rs){d.push(h);break}d.push(h)}}else for(a=0;ai&&h.x0)for(var s=0;s0){var n=1,r=o.length,a=this.body.util.toGlobalScreen(o[o.length-1].x)-this.body.util.toGlobalScreen(o[0].x),h=r/a;n=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=[],l=0;r>l;l+=n)d.push(o[l]);e[t[s]]=d}}},s.prototype._getYRanges=function(t,e,i){var s,o,n,r,a,h=[],d=[];if(t.length>0){for(n=0;n0)if(o=this.groups[t[n]],"line"==o.options.style||"stack"!=o.options.barChart.handleOverlap){var l=s[0].y,c=s[0].y;for(r=0;rs[r].y?s[r].y:l,c=c0&&(h.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x}),p={},this._getDataIntersections(p,h),i.__barchartLeft=this._getStackedBarYRange(p,h),i.__barchartLeft.yAxisOrientation="left",t.push("__barchartLeft")),d.length>0&&(d.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x}),p={},this._getDataIntersections(p,d),i.__barchartRight=this._getStackedBarYRange(p,d),i.__barchartRight.yAxisOrientation="right",t.push("__barchartRight"))}},s.prototype._getStackedBarYRange=function(t,e){for(var i,s=e[0].y,o=e[0].y,n=0;ne[n].y?e[n].y:s,o=ot[r].accumulated?t[r].accumulated:s,o=o0){for(var c=0;ci?i:a,d=s>d?s:d):(r=!0,h=h>i?i:h,l=s>l?s:l));1==n&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}return o=this._toggleAxisVisiblity(n,this.yAxisLeft)||o,o=this._toggleAxisVisiblity(r,this.yAxisRight)||o,1==r&&1==n?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!n,0==this.yAxisRight.master?(this.yAxisLeft.lineOffset=1==r?this.yAxisRight.width:0,o=this.yAxisLeft.redraw()||o,this.yAxisRight.stepPixelsForced=this.yAxisLeft.stepPixels,o=this.yAxisRight.redraw()||o):o=this.yAxisRight.redraw()||o,-1!=t.indexOf("__barchartLeft")&&t.splice(t.indexOf("__barchartLeft"),1),-1!=t.indexOf("__barchartRight")&&t.splice(t.indexOf("__barchartRight"),1),o},s.prototype._toggleAxisVisiblity=function(t,e){var i=!1;return 0==t?e.dom.frame.parentNode&&(e.hide(),i=!0):e.dom.frame.parentNode||(e.show(),i=!0),i},s.prototype._drawBarGraphs=function(t,e){var i,s,o,r,a,h,d=[],l={},c=0;for(a=0;a0&&(i=Math.min(i,Math.abs(d[a-1].x-s))),o=this._getSafeDrawData(i,r,p);else{var f=a+(l[s].amount-l[s].resolved),m=a-(l[s].resolved+1);f0&&(i=Math.min(i,Math.abs(d[m].x-s))),o=this._getSafeDrawData(i,r,p),l[s].resolved+=1,"stack"==r.options.barChart.handleOverlap?(u=l[s].accumulated,l[s].accumulated+=r.zeroPosition-d[a].y):"sideBySide"==r.options.barChart.handleOverlap&&(o.width=o.width/l[s].amount,o.offset+=l[s].resolved*o.width-.5*o.width*(l[s].amount+1),"left"==r.options.barChart.align?o.offset-=.5*o.width:"right"==r.options.barChart.align&&(o.offset+=.5*o.width))}n.drawBar(d[a].x+o.offset,d[a].y-u,o.width,r.zeroPosition-d[a].y,r.className+" bar",this.svgElements,this.svg),1==r.options.drawPoints.enabled&&n.drawPoint(d[a].x+o.offset,d[a].y-u,r,this.svgElements,this.svg)}},s.prototype._getDataIntersections=function(t,e){for(var i,s=0;s0&&(i=Math.min(i,Math.abs(e[s-1].x-e[s].x))),0==i&&(void 0===t[e[s].x]&&(t[e[s].x]={amount:0,resolved:0,accumulated:0}),t[e[s].x].amount+=1)},s.prototype._getSafeDrawData=function(t,e,i){var s,o;return t0?(s=i>t?i:t,o=0,"left"==e.options.barChart.align?o-=.5*t:"right"==e.options.barChart.align&&(o+=.5*t)):(s=e.options.barChart.width,o=0,"left"==e.options.barChart.align?o-=.5*e.options.barChart.width:"right"==e.options.barChart.align&&(o+=.5*e.options.barChart.width)),{width:s,offset:o}},s.prototype._drawLineGraph=function(t,e){if(null!=t&&t.length>0){var i,s,o=Number(this.svg.style.height.replace("px",""));if(i=n.getSVGElement("path",this.svgElements,this.svg),i.setAttributeNS(null,"class",e.className),s=1==e.options.catmullRom.enabled?this._catmullRom(t,e):this._linear(t),1==e.options.shaded.enabled){var r,a=n.getSVGElement("path",this.svgElements,this.svg);r="top"==e.options.shaded.orientation?"M"+t[0].x+",0 "+s+"L"+t[t.length-1].x+",0":"M"+t[0].x+","+o+" "+s+"L"+t[t.length-1].x+","+o,a.setAttributeNS(null,"class",e.className+" fill"),a.setAttributeNS(null,"d",r)}i.setAttributeNS(null,"d","M"+s),1==e.options.drawPoints.enabled&&this._drawPoints(t,e,this.svgElements,this.svg)}},s.prototype._drawPoints=function(t,e,i,s,o){void 0===o&&(o=0);for(var r=0;rl;l++)e=0==l?t[0]:t[l-1],i=t[l],s=t[l+1],o=d>l+2?t[l+2]:s,n={x:(-e.x+6*i.x+s.x)*h,y:(-e.y+6*i.y+s.y)*h},r={x:(i.x+6*s.x-o.x)*h,y:(i.y+6*s.y-o.y)*h},a+="C"+n.x+","+n.y+" "+r.x+","+r.y+" "+s.x+","+s.y+" ";return a},s.prototype._catmullRom=function(t,e){var i=e.options.catmullRom.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);for(var s,o,n,r,a,h,d,l,c,p,u,f,m,g,v,y,b,_,x,w=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",S=t.length,M=0;S-1>M;M++)s=0==M?t[0]:t[M-1],o=t[M],n=t[M+1],r=S>M+2?t[M+2]:n,d=Math.sqrt(Math.pow(s.x-o.x,2)+Math.pow(s.y-o.y,2)),l=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),c=Math.sqrt(Math.pow(n.x-r.x,2)+Math.pow(n.y-r.y,2)),g=Math.pow(c,i),y=Math.pow(c,2*i),v=Math.pow(l,i),b=Math.pow(l,2*i),x=Math.pow(d,i),_=Math.pow(d,2*i),p=2*_+3*x*v+b,u=2*y+3*g*v+b,f=3*x*(x+v),f>0&&(f=1/f),m=3*g*(g+v),m>0&&(m=1/m),a={x:(-b*s.x+p*o.x+_*n.x)*f,y:(-b*s.y+p*o.y+_*n.y)*f},h={x:(y*o.x+u*n.x-b*r.x)*m,y:(y*o.y+u*n.y-b*r.y)*m},0==a.x&&0==a.y&&(a=o),0==h.x&&0==h.y&&(h=n),w+="C"+a.x+","+a.y+" "+h.x+","+h.y+" "+n.x+","+n.y+" ";return w},s.prototype._linear=function(t){for(var e="",i=0;id;){d++;var l=n.getCurrent(),c=this.body.util.toScreen(l),p=n.isMajor();this.options.showMinorLabels&&this._repaintMinorText(c,n.getLabelMinor(),t),p&&this.options.showMajorLabels?(c>0&&(void 0==h&&(h=c),this._repaintMajorText(c,n.getLabelMajor(),t)),this._repaintMajorLine(c,t)):this._repaintMinorLine(c,t),n.next()}if(this.options.showMajorLabels){var u=this.body.util.toTime(0),f=n.getLabelMajor(u),m=f.length*(this.props.majorCharWidth||10)+10;(void 0==h||h>m)&&this._repaintMajorText(0,f,t)}o.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},s.prototype._repaintMinorText=function(t,e,i){var s=this.dom.redundant.minorTexts.shift();if(!s){var o=document.createTextNode("");s=document.createElement("div"),s.appendChild(o),s.className="text minor",this.dom.foreground.appendChild(s)}this.dom.minorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?this.props.majorLabelHeight+"px":"0",s.style.left=t+"px"},s.prototype._repaintMajorText=function(t,e,i){var s=this.dom.redundant.majorTexts.shift();if(!s){var o=document.createTextNode(e);s=document.createElement("div"),s.className="text major",s.appendChild(o),this.dom.foreground.appendChild(s)}this.dom.majorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?"0":this.props.minorLabelHeight+"px",s.style.left=t+"px"},s.prototype._repaintMinorLine=function(t,e){var i=this.dom.redundant.minorLines.shift();i||(i=document.createElement("div"),i.className="grid vertical minor",this.dom.background.appendChild(i)),this.dom.minorLines.push(i);var s=this.props;i.style.top="top"==e?s.majorLabelHeight+"px":this.body.domProps.top.height+"px",i.style.height=s.minorLineHeight+"px",i.style.left=t-s.minorLineWidth/2+"px"},s.prototype._repaintMajorLine=function(t,e){var i=this.dom.redundant.majorLines.shift();i||(i=document.createElement("DIV"),i.className="grid vertical major",this.dom.background.appendChild(i)),this.dom.majorLines.push(i);var s=this.props;i.style.top="top"==e?"0":this.body.domProps.top.height+"px",i.style.left=t-s.majorLineWidth/2+"px",i.style.height=s.majorLineHeight+"px"},s.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="text minor measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="text minor measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth},s.prototype.snap=function(t){return this.step.snap(t)},t.exports=s},function(t,e,i){function s(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.dirty=!0,this.top=null,this.left=null,this.width=null,this.height=null}var o=i(41);s.prototype.select=function(){this.selected=!0,this.displayed&&this.redraw()},s.prototype.unselect=function(){this.selected=!1,this.displayed&&this.redraw()},s.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},s.prototype.isVisible=function(){return!1},s.prototype.show=function(){return!1},s.prototype.hide=function(){return!1},s.prototype.redraw=function(){},s.prototype.repositionX=function(){},s.prototype.repositionY=function(){},s.prototype._repaintDeleteButton=function(t){if(this.selected&&this.options.editable.remove&&!this.dom.deleteButton){var e=this,i=document.createElement("div");i.className="delete",i.title="Delete this item",o(i,{preventDefault:!0}).on("tap",function(t){e.parent.removeFromDataSet(e),t.stopPropagation()}),t.appendChild(i),this.dom.deleteButton=i}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);o.call(this,t,e,i)}var o=i(28);s.prototype=new o(null,null,null),s.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.startt.start-e&&this.data.startt.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),t.box["timeline-item"]=this),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.foreground;if(!e)throw new Error("Cannot redraw time axis: parent has no foreground container element"); +e.appendChild(t.box)}if(this.displayed=!0,this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)t.content.innerHTML="",t.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);t.content.innerHTML=this.content}this.dirty=!0}this.data.title!=this.title&&(t.box.title=this.data.title,this.title=this.data.title);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");this.className!=i&&(this.className=i,t.box.className=this.baseClassName+i,this.dirty=!0),this.dirty&&(this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dirty=!1),this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},s.prototype.show=function(){this.displayed||this.redraw()},s.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.top=null,this.left=null,this.displayed=!1}},s.prototype.repositionX=function(){var t,e=this.props,i=this.parent.width,s=this.conversion.toScreen(this.data.start),o=this.conversion.toScreen(this.data.end),n=this.options.padding;-i>s&&(s=-i),o>2*i&&(o=2*i);var r=Math.max(o-s,1);this.overflow?(t=Math.max(-s,0),this.left=s,this.width=r+this.props.content.width):(t=0>s?Math.min(-s,o-s-e.content.width-2*n):0,this.left=s,this.width=r),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=r+"px",this.dom.content.style.left=t+"px"},s.prototype.repositionY=function(){var t=this.options.orientation,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},s.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="drag-left",t.dragLeftItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragLeft=t}else!this.selected&&this.dom.dragLeft&&(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},s.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="drag-right",t.dragRightItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragRight=t}else!this.selected&&this.dom.dragRight&&(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this._initializeMixinLoaders(),this.containerElement=t,this.renderRefreshRate=60,this.renderTimestep=1e3/this.renderRefreshRate,this.renderTime=.5*this.renderTimestep,this.maxPhysicsTicksPerRender=3,this.physicsDiscreteStepsize=.5,this.initializing=!0,this.triggerFunctions={add:null,edit:null,editEdge:null,connect:null,del:null},this.defaultOptions={nodes:{mass:1,radiusMin:10,radiusMax:30,radius:10,shape:"ellipse",image:void 0,widthMin:16,widthMax:64,fixed:!1,fontColor:"black",fontSize:14,fontFace:"verdana",level:-1,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},borderColor:"#2B7CE9",backgroundColor:"#97C2FC",highlightColor:"#D2E5FF",group:void 0,borderWidth:1},edges:{widthMin:1,widthMax:15,width:1,widthSelectionMultiplier:2,hoverWidth:1.5,style:"line",color:{color:"#848484",highlight:"#848484",hover:"#848484"},fontColor:"#343434",fontSize:14,fontFace:"arial",fontFill:"white",arrowScaleFactor:1,dash:{length:10,gap:5,altLength:void 0},inheritColor:"from"},configurePhysics:!1,physics:{barnesHut:{enabled:!0,theta:1/.6,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09},repulsion:{centralGravity:0,springLength:200,springConstant:.05,nodeDistance:100,damping:.09},hierarchicalRepulsion:{enabled:!1,centralGravity:0,springLength:100,springConstant:.01,nodeDistance:150,damping:.09},damping:null,centralGravity:null,springLength:null,springConstant:null},clustering:{enabled:!1,initialMaxNodes:100,clusterThreshold:500,reduceToNodes:300,chainThreshold:.4,clusterEdgeThreshold:20,sectorThreshold:100,screenSizeThreshold:.2,fontSizeMultiplier:4,maxFontSize:1e3,forceAmplification:.1,distanceAmplification:.1,edgeGrowth:20,nodeScaling:{width:1,height:1,radius:1},maxNodeSizeIncrements:600,activeAreaBoxSize:80,clusterLevelDifference:2},navigation:{enabled:!1},keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02}},dataManipulation:{enabled:!1,initiallyVisible:!1},hierarchicalLayout:{enabled:!1,levelSeparation:150,nodeSpacing:100,direction:"UD"},freezeForStabilization:!1,smoothCurves:{enabled:!0,dynamic:!0,type:"continuous",roundness:.5},dynamicSmoothCurves:!0,maxVelocity:30,minVelocity:.1,stabilize:!0,stabilizationIterations:1e3,locale:"en",locales:_,tooltip:{delay:300,fontColor:"black",fontSize:14,fontFace:"verdana",color:{border:"#666",background:"#FFFFC6"}},dragNetwork:!0,dragNodes:!0,zoomable:!0,hover:!1,hideEdgesOnDrag:!1,hideNodesOnDrag:!1,width:"100%",height:"100%",selectable:!0},this.constants=a.extend({},this.defaultOptions),this.hoverObj={nodes:{},edges:{}},this.controlNodesActive=!1;var o=this;this.groups=new u,this.images=new f,this.images.setOnloadCallback(function(){o._redraw()}),this.xIncrement=0,this.yIncrement=0,this.zoomIncrement=0,this._loadPhysicsSystem(),this._create(),this._loadSectorSystem(),this._loadClusterSystem(),this._loadSelectionSystem(),this._loadHierarchySystem(),this._setTranslation(this.frame.clientWidth/2,this.frame.clientHeight/2),this._setScale(1),this.setOptions(i),this.freezeSimulation=!1,this.cachedFunctions={},this.calculationNodes={},this.calculationNodeIndices=[],this.nodeIndices=[],this.nodes={},this.edges={},this.canvasTopLeft={x:0,y:0},this.canvasBottomRight={x:0,y:0},this.pointerPosition={x:0,y:0},this.areaCenter={},this.scale=1,this.previousScale=this.scale,this.nodesData=null,this.edgesData=null,this.nodesListeners={add:function(t,e){o._addNodes(e.items),o.start()},update:function(t,e){o._updateNodes(e.items),o.start()},remove:function(t,e){o._removeNodes(e.items),o.start()}},this.edgesListeners={add:function(t,e){o._addEdges(e.items),o.start()},update:function(t,e){o._updateEdges(e.items),o.start()},remove:function(t,e){o._removeEdges(e.items),o.start()}},this.moving=!0,this.timer=void 0,this.setData(e,this.constants.clustering.enabled||this.constants.hierarchicalLayout.enabled),this.initializing=!1,1==this.constants.hierarchicalLayout.enabled?this._setupHierarchicalLayout():0==this.constants.stabilize&&this.zoomExtent(!0,this.constants.clustering.enabled),this.constants.clustering.enabled&&this.startWithClustering()}var o=i(49),n=i(41),r=i(50),a=i(1),h=i(43),d=i(3),l=i(4),c=i(38),p=i(39),u=i(34),f=i(35),m=i(36),g=i(33),v=i(37),y=i(47),b=i(48),_=i(45);i(46),o(s.prototype),s.prototype._getScriptPath=function(){for(var t=document.getElementsByTagName("script"),e=0;et.x&&(s=t.x),ot.y&&(e=t.y),i=this.constants.clustering.initialMaxNodes?49.07548/(o+142.05338)+91444e-8:12.662/(o+7.4147)+.0964822:1==this.constants.clustering.enabled&&o>=this.constants.clustering.initialMaxNodes?77.5271985/(o+187.266146)+476710517e-13:30.5062972/(o+19.93597763)+.08413486;var n=Math.min(this.frame.canvas.clientWidth/600,this.frame.canvas.clientHeight/600);i*=n}else{var r=1.1*(Math.abs(s.minX)+Math.abs(s.maxX)),a=1.1*(Math.abs(s.minY)+Math.abs(s.maxY)),h=this.frame.canvas.clientWidth/r,d=this.frame.canvas.clientHeight/a;i=d>=h?h:d}i>1&&(i=1),this._setScale(i),this._centerNetwork(s),0==e&&(this.moving=!0,this.start())},s.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},s.prototype.setData=function(t,e){if(void 0===e&&(e=!1),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){if(t&&t.dot){var i=c.DOTToGraph(t.dot);return void this.setData(i)}}else if(t&&t.gephi){if(t&&t.gephi){var s=p.parseGephi(t.gephi);return void this.setData(s)}}else this._setNodes(t&&t.nodes),this._setEdges(t&&t.edges);if(this._putDataInSector(),!e)if(this.constants.stabilize){var o=this;setTimeout(function(){o._stabilize(),o.start()},0)}else this.start()},s.prototype.setOptions=function(t){if(t){var e,i=["nodes","edges","smoothCurves","hierarchicalLayout","clustering","navigation","keyboard","dataManipulation","onAdd","onEdit","onEditEdge","onConnect","onDelete","clickToUse"];if(a.selectiveNotDeepExtend(i,this.constants,t),a.selectiveNotDeepExtend(["color"],this.constants.nodes,t.nodes),a.selectiveNotDeepExtend(["color","length"],this.constants.edges,t.edges),t.physics&&(a.mergeOptions(this.constants.physics,t.physics,"barnesHut"),a.mergeOptions(this.constants.physics,t.physics,"repulsion"),t.physics.hierarchicalRepulsion)){this.constants.hierarchicalLayout.enabled=!0,this.constants.physics.hierarchicalRepulsion.enabled=!0,this.constants.physics.barnesHut.enabled=!1;for(e in t.physics.hierarchicalRepulsion)t.physics.hierarchicalRepulsion.hasOwnProperty(e)&&(this.constants.physics.hierarchicalRepulsion[e]=t.physics.hierarchicalRepulsion[e])}if(t.onAdd&&(this.triggerFunctions.add=t.onAdd),t.onEdit&&(this.triggerFunctions.edit=t.onEdit),t.onEditEdge&&(this.triggerFunctions.editEdge=t.onEditEdge),t.onConnect&&(this.triggerFunctions.connect=t.onConnect),t.onDelete&&(this.triggerFunctions.del=t.onDelete),a.mergeOptions(this.constants,t,"smoothCurves"),a.mergeOptions(this.constants,t,"hierarchicalLayout"),a.mergeOptions(this.constants,t,"clustering"),a.mergeOptions(this.constants,t,"navigation"),a.mergeOptions(this.constants,t,"keyboard"),a.mergeOptions(this.constants,t,"dataManipulation"),t.dataManipulation&&(this.editMode=this.constants.dataManipulation.initiallyVisible),t.edges&&(void 0!==t.edges.color&&(a.isString(t.edges.color)?(this.constants.edges.color={},this.constants.edges.color.color=t.edges.color,this.constants.edges.color.highlight=t.edges.color,this.constants.edges.color.hover=t.edges.color):(void 0!==t.edges.color.color&&(this.constants.edges.color.color=t.edges.color.color),void 0!==t.edges.color.highlight&&(this.constants.edges.color.highlight=t.edges.color.highlight),void 0!==t.edges.color.hover&&(this.constants.edges.color.hover=t.edges.color.hover))),t.edges.fontColor||void 0!==t.edges.color&&(a.isString(t.edges.color)?this.constants.edges.fontColor=t.edges.color:void 0!==t.edges.color.color&&(this.constants.edges.fontColor=t.edges.color.color))),t.nodes&&t.nodes.color){var s=a.parseColor(t.nodes.color);this.constants.nodes.color.background=s.background,this.constants.nodes.color.border=s.border,this.constants.nodes.color.highlight.background=s.highlight.background,this.constants.nodes.color.highlight.border=s.highlight.border,this.constants.nodes.color.hover.background=s.hover.background,this.constants.nodes.color.hover.border=s.hover.border}if(t.groups)for(var o in t.groups)if(t.groups.hasOwnProperty(o)){var n=t.groups[o];this.groups.add(o,n)}if(t.tooltip){for(e in t.tooltip)t.tooltip.hasOwnProperty(e)&&(this.constants.tooltip[e]=t.tooltip[e]);t.tooltip.color&&(this.constants.tooltip.color=a.parseColor(t.tooltip.color))}if("clickToUse"in t&&(t.clickToUse?(this.activator=new b(this.frame),this.activator.on("change",this._createKeyBinds.bind(this))):this.activator&&(this.activator.destroy(),delete this.activator)),t.labels)throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.')}this._loadPhysicsSystem(),this._loadNavigationControls(),this._loadManipulationSystem(),this._configureSmoothCurves(),this._createKeyBinds(),this.setSize(this.constants.width,this.constants.height),this.moving=!0,this.start()},s.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis network-frame",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),!this.frame.canvas.getContext){var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}var e=this;this.drag={},this.pinch={},this.hammer=n(this.frame.canvas,{prevent_default:!0}),this.hammer.on("tap",e._onTap.bind(e)),this.hammer.on("doubletap",e._onDoubleTap.bind(e)),this.hammer.on("hold",e._onHold.bind(e)),this.hammer.on("pinch",e._onPinch.bind(e)),this.hammer.on("touch",e._onTouch.bind(e)),this.hammer.on("dragstart",e._onDragStart.bind(e)),this.hammer.on("drag",e._onDrag.bind(e)),this.hammer.on("dragend",e._onDragEnd.bind(e)),this.hammer.on("release",e._onRelease.bind(e)),this.hammer.on("mousewheel",e._onMouseWheel.bind(e)),this.hammer.on("DOMMouseScroll",e._onMouseWheel.bind(e)),this.hammer.on("mousemove",e._onMouseMoveTitle.bind(e)),this.containerElement.appendChild(this.frame)},s.prototype._createKeyBinds=function(){var t=this;this.mousetrap=r,this.mousetrap.reset(),this.constants.keyboard.enabled&&this.isActive()&&(this.mousetrap.bind("up",this._moveUp.bind(t),"keydown"),this.mousetrap.bind("up",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("down",this._moveDown.bind(t),"keydown"),this.mousetrap.bind("down",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("left",this._moveLeft.bind(t),"keydown"),this.mousetrap.bind("left",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("right",this._moveRight.bind(t),"keydown"),this.mousetrap.bind("right",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("=",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("=",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("-",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("-",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("[",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("[",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("]",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("]",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pageup",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("pageup",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pagedown",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("pagedown",this._stopZoom.bind(t),"keyup")),1==this.constants.dataManipulation.enabled&&(this.mousetrap.bind("escape",this._createManipulatorBar.bind(t)),this.mousetrap.bind("del",this._deleteSelected.bind(t)))},s.prototype._getPointer=function(t){return{x:t.pageX-a.getAbsoluteLeft(this.frame.canvas),y:t.pageY-a.getAbsoluteTop(this.frame.canvas)}},s.prototype._onTouch=function(t){this.drag.pointer=this._getPointer(t.gesture.center),this.drag.pinched=!1,this.pinch.scale=this._getScale(),this._handleTouch(this.drag.pointer)},s.prototype._onDragStart=function(){this._handleDragStart()},s.prototype._handleDragStart=function(){var t=this.drag,e=this._getNodeAt(t.pointer);if(t.dragging=!0,t.selection=[],t.translation=this._getTranslation(),t.nodeId=null,null!=e){t.nodeId=e.id,e.isSelected()||this._selectObject(e,!1);for(var i in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(i)){var s=this.selectionObj.nodes[i],o={id:s.id,node:s,x:s.x,y:s.y,xFixed:s.xFixed,yFixed:s.yFixed};s.xFixed=!0,s.yFixed=!0,t.selection.push(o)}}},s.prototype._onDrag=function(t){this._handleOnDrag(t)},s.prototype._handleOnDrag=function(t){if(!this.drag.pinched){var e=this._getPointer(t.gesture.center),i=this,s=this.drag,o=s.selection;if(o&&o.length&&1==this.constants.dragNodes){var n=e.x-s.pointer.x,r=e.y-s.pointer.y;o.forEach(function(t){var e=t.node;t.xFixed||(e.x=i._XconvertDOMtoCanvas(i._XconvertCanvasToDOM(t.x)+n)),t.yFixed||(e.y=i._YconvertDOMtoCanvas(i._YconvertCanvasToDOM(t.y)+r))}),this.moving||(this.moving=!0,this.start())}else if(1==this.constants.dragNetwork){var a=e.x-this.drag.pointer.x,h=e.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+a,this.drag.translation.y+h),this._redraw()}}},s.prototype._onDragEnd=function(){this.drag.dragging=!1;var t=this.drag.selection;t&&t.length?(t.forEach(function(t){t.node.xFixed=t.xFixed,t.node.yFixed=t.yFixed}),this.moving=!0,this.start()):this._redraw()},s.prototype._onTap=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleTap(e)},s.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.center);this._handleDoubleTap(e)},s.prototype._onHold=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleOnHold(e)},s.prototype._onRelease=function(t){var e=this._getPointer(t.gesture.center);this._handleOnRelease(e)},s.prototype._onPinch=function(t){var e=this._getPointer(t.gesture.center);this.drag.pinched=!0,"scale"in this.pinch||(this.pinch.scale=1);var i=this.pinch.scale*t.gesture.scale;this._zoom(i,e)},s.prototype._zoom=function(t,e){if(1==this.constants.zoomable){var i=this._getScale();1e-5>t&&(t=1e-5),t>10&&(t=10);var s=null;void 0!==this.drag&&1==this.drag.dragging&&(s=this.DOMtoCanvas(this.drag.pointer));var o=this._getTranslation(),n=t/i,r=(1-n)*e.x+o.x*n,a=(1-n)*e.y+o.y*n;if(this.areaCenter={x:this._XconvertDOMtoCanvas(e.x),y:this._YconvertDOMtoCanvas(e.y)},this._setScale(t),this._setTranslation(r,a),this.updateClustersDefault(),null!=s){var h=this.canvasToDOM(s);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}return this._redraw(),t>i?this.emit("zoom",{direction:"+"}):this.emit("zoom",{direction:"-"}),t}},s.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i=this._getScale(),s=e/10;0>e&&(s/=1-s),i*=1+s;var o=h.fakeGesture(this,t),n=this._getPointer(o.center);this._zoom(i,n)}t.preventDefault()},s.prototype._onMouseMoveTitle=function(t){var e=h.fakeGesture(this,t),i=this._getPointer(e.center);this.popupObj&&this._checkHidePopup(i);var s=this,o=function(){s._checkShowPopup(i)};if(this.popupTimer&&clearInterval(this.popupTimer),this.drag.dragging||(this.popupTimer=setTimeout(o,this.constants.tooltip.delay)),1==this.constants.hover){for(var n in this.hoverObj.edges)this.hoverObj.edges.hasOwnProperty(n)&&(this.hoverObj.edges[n].hover=!1,delete this.hoverObj.edges[n]);var r=this._getNodeAt(i);null==r&&(r=this._getEdgeAt(i)),null!=r&&this._hoverObject(r);for(var a in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(a)&&(r instanceof m&&r.id!=a||r instanceof g||null==r)&&(this._blurObject(this.hoverObj.nodes[a]),delete this.hoverObj.nodes[a]);this.redraw()}},s.prototype._checkShowPopup=function(t){var e,i={left:this._XconvertDOMtoCanvas(t.x),top:this._YconvertDOMtoCanvas(t.y),right:this._XconvertDOMtoCanvas(t.x),bottom:this._YconvertDOMtoCanvas(t.y)},s=this.popupObj;if(void 0==this.popupObj){var o=this.nodes;for(e in o)if(o.hasOwnProperty(e)){var n=o[e];if(void 0!==n.getTitle()&&n.isOverlappingWith(i)){this.popupObj=n;break}}}if(void 0===this.popupObj){var r=this.edges;for(e in r)if(r.hasOwnProperty(e)){var a=r[e];if(a.connected&&void 0!==a.getTitle()&&a.isOverlappingWith(i)){this.popupObj=a;break}}}if(this.popupObj){if(this.popupObj!=s){var h=this;h.popup||(h.popup=new v(h.frame,h.constants.tooltip)),h.popup.setPosition(t.x-3,t.y-3),h.popup.setText(h.popupObj.getTitle()),h.popup.show()}}else this.popup&&this.popup.hide()},s.prototype._checkHidePopup=function(t){this.popupObj&&this._getNodeAt(t)||(this.popupObj=void 0,this.popup&&this.popup.hide())},s.prototype.setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,this.emit("resize",{width:this.frame.canvas.width,height:this.frame.canvas.height})},s.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof d||t instanceof l)this.nodesData=t;else if(t instanceof Array)this.nodesData=new d,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new d}if(e&&a.forEach(this.nodesListeners,function(t,i){e.off(i,t)}),this.nodes={},this.nodesData){var i=this;a.forEach(this.nodesListeners,function(t,e){i.nodesData.on(e,t)});var s=this.nodesData.getIds();this._addNodes(s)}this._updateSelection()},s.prototype._addNodes=function(t){for(var e,i=0,s=t.length;s>i;i++){e=t[i];var o=this.nodesData.get(e),n=new m(o,this.images,this.groups,this.constants);if(this.nodes[e]=n,!(0!=n.xFixed&&0!=n.yFixed||null!==n.x&&null!==n.y)){var r=1*t.length+10,a=2*Math.PI*Math.random();0==n.xFixed&&(n.x=r*Math.cos(a)),0==n.yFixed&&(n.y=r*Math.sin(a))}this.moving=!0}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateValueRange(this.nodes),this.updateLabels()},s.prototype._updateNodes=function(t){for(var e=this.nodes,i=this.nodesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n],a=i.get(n);r?r.setProperties(a,this.constants):(r=new m(properties,this.images,this.groups,this.constants),e[n]=r)}this.moving=!0,1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateNodeIndexList(),this._reconnectEdges(),this._updateValueRange(e)},s.prototype._removeNodes=function(t){for(var e=this.nodes,i=0,s=t.length;s>i;i++){var o=t[i];delete e[o]}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateSelection(),this._updateValueRange(e)},s.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof d||t instanceof l)this.edgesData=t;else if(t instanceof Array)this.edgesData=new d,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new d}if(e&&a.forEach(this.edgesListeners,function(t,i){e.off(i,t)}),this.edges={},this.edgesData){var i=this;a.forEach(this.edgesListeners,function(t,e){i.edgesData.on(e,t)});var s=this.edgesData.getIds();this._addEdges(s)}this._reconnectEdges()},s.prototype._addEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n];r&&r.disconnect();var a=i.get(n,{showInternalIds:!0});e[n]=new g(a,this,this.constants)}this.moving=!0,this._updateValueRange(e),this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._updateEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=i.get(n),a=e[n];a?(a.disconnect(),a.setProperties(r,this.constants),a.connect()):(a=new g(r,this,this.constants),this.edges[n]=a)}this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this.moving=!0,this._updateValueRange(e)},s.prototype._removeEdges=function(t){for(var e=this.edges,i=0,s=t.length;s>i;i++){var o=t[i],n=e[o];n&&(null!=n.via&&delete this.sectors.support.nodes[n.via.id],n.disconnect(),delete e[o])}this.moving=!0,this._updateValueRange(e),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._reconnectEdges=function(){var t,e=this.nodes,i=this.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var s=i[t];s.from=null,s.to=null,s.connect()}},s.prototype._updateValueRange=function(t){var e,i=void 0,s=void 0;for(e in t)if(t.hasOwnProperty(e)){var o=t[e].getValue();void 0!==o&&(i=void 0===i?o:Math.min(o,i),s=void 0===s?o:Math.max(o,s))}if(void 0!==i&&void 0!==s)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,s)},s.prototype.redraw=function(){this.setSize(this.constants.width,this.constants.height),this._redraw()},s.prototype._redraw=function(){var t=this.frame.canvas.getContext("2d"),e=this.frame.canvas.width,i=this.frame.canvas.height;t.clearRect(0,0,e,i),t.save(),t.translate(this.translation.x,this.translation.y),t.scale(this.scale,this.scale),this.canvasTopLeft={x:this._XconvertDOMtoCanvas(0),y:this._YconvertDOMtoCanvas(0)},this.canvasBottomRight={x:this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth),y:this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight)},this._doInAllSectors("_drawAllSectorNodes",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideEdgesOnDrag)&&this._doInAllSectors("_drawEdges",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideNodesOnDrag)&&this._doInAllSectors("_drawNodes",t,!1),1==this.controlNodesActive&&this._doInAllSectors("_drawControlNodes",t),t.restore()},s.prototype._setTranslation=function(t,e){void 0===this.translation&&(this.translation={x:0,y:0}),void 0!==t&&(this.translation.x=t),void 0!==e&&(this.translation.y=e),this.emit("viewChanged")},s.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},s.prototype._setScale=function(t){this.scale=t},s.prototype._getScale=function(){return this.scale},s.prototype._XconvertDOMtoCanvas=function(t){return(t-this.translation.x)/this.scale},s.prototype._XconvertCanvasToDOM=function(t){return t*this.scale+this.translation.x},s.prototype._YconvertDOMtoCanvas=function(t){return(t-this.translation.y)/this.scale},s.prototype._YconvertCanvasToDOM=function(t){return t*this.scale+this.translation.y},s.prototype.canvasToDOM=function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}},s.prototype.DOMtoCanvas=function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}},s.prototype._drawNodes=function(t,e){void 0===e&&(e=!1);var i=this.nodes,s=[];for(var o in i)i.hasOwnProperty(o)&&(i[o].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight),i[o].isSelected()?s.push(o):(i[o].inArea()||e)&&i[o].draw(t));for(var n=0,r=s.length;r>n;n++)(i[s[n]].inArea()||e)&&i[s[n]].draw(t)},s.prototype._drawEdges=function(t){var e=this.edges;for(var i in e)if(e.hasOwnProperty(i)){var s=e[i];s.setScale(this.scale),s.connected&&e[i].draw(t)}},s.prototype._drawControlNodes=function(t){var e=this.edges;for(var i in e)e.hasOwnProperty(i)&&e[i]._drawControlNodes(t)},s.prototype._stabilize=function(){1==this.constants.freezeForStabilization&&this._freezeDefinedNodes();for(var t=0;this.moving&&t0)for(e in s)s.hasOwnProperty(e)&&(s[e].discreteStepLimited(i,this.constants.maxVelocity),o=!0);else for(e in s)s.hasOwnProperty(e)&&(s[e].discreteStep(i),o=!0);if(1==o&&(void 0===t||1==t)){var n=this.constants.minVelocity/Math.max(this.scale,.05);n>.5*this.constants.maxVelocity?this.moving=!0:(this.moving=this._isMoving(n),0==this.moving&&this.emit("stabilized",{iterations:null}),this.moving=this.moving||this.configurePhysics)}},s.prototype._physicsTick=function(){this.freezeSimulation||1==this.moving&&(this._doInAllActiveSectors("_initializeForceCalculation"),this._doInAllActiveSectors("_discreteStepNodes"),1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic&&this._doInSupportSector("_discreteStepNodes",!1),this._findCenter(this._getRange()))},s.prototype._animationStep=function(){this.timer=void 0,this._handleNavigation(),this.start();var t=Date.now(),e=1;this._physicsTick();for(var i=Date.now()-t;i<.9*(this.renderTimestep-this.renderTime)&&eh}return!1},s.prototype._getColor=function(){var t=this.options.color;return"to"==this.options.inheritColor?t={highlight:this.to.options.color.highlight.border,hover:this.to.options.color.hover.border,color:this.to.options.color.border}:("from"==this.options.inheritColor||1==this.options.inheritColor)&&(t={highlight:this.from.options.color.highlight.border,hover:this.from.options.color.hover.border,color:this.from.options.color.border}),1==this.selected?t.highlight:1==this.hover?t.hover:t.color},s.prototype._drawLine=function(t){if(t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth(),this.from!=this.to){var e,i=this._line(t);if(this.label){if(1==this.options.smoothCurves.enabled&&null!=i){var s=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),o=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y));e={x:s,y:o}}else e=this._pointOnLine(.5);this._label(t,this.label,e.x,e.y)}}else{var n,r,a=this.physics.springLength/4,h=this.from;h.width||h.resize(t),h.width>h.height?(n=h.x+h.width/2,r=h.y-a):(n=h.x+a,r=h.y-h.height/2),this._circle(t,n,r,a),e=this._pointOnCircle(n,r,a,.5),this._label(t,this.label,e.x,e.y)}},s.prototype._getLineWidth=function(){return 1==this.selected?Math.min(this.widthSelected,this.options.widthMax)*this.networkScaleInv:1==this.hover?Math.min(this.options.hoverWidth,this.options.widthMax)*this.networkScaleInv:this.options.width*this.networkScaleInv},s.prototype._getViaCoordinates=function(){var t=null,e=null,i=this.options.smoothCurves.roundness,s=this.options.smoothCurves.type,o=Math.abs(this.from.x-this.to.x),n=Math.abs(this.from.y-this.to.y);return"discrete"==s||"diagonalCross"==s?Math.abs(this.from.x-this.to.x)this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n)),"discrete"==s&&(t=i*n>o?this.from.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o)),"discrete"==s&&(e=i*o>n?this.from.y:e)):"straightCross"==s?Math.abs(this.from.x-this.to.x)Math.abs(this.from.y-this.to.y)&&(t=this.from.xthis.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n,t=this.to.x>t?this.to.x:t):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n,t=this.to.x>t?this.to.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xe?this.to.y:e):this.from.x>this.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o,e=this.to.y>e?this.to.y:e):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o,e=this.to.yl.height?(a=l.x+.5*l.width,h=l.y-d):(a=l.x+d,h=l.y-.5*l.height),this._circle(t,a,h,d);var s=.2*Math.PI,o=(10+5*this.options.width)*this.options.arrowScaleFactor;e=this._pointOnCircle(a,h,d,.5),t.arrow(e.x,e.y,s,o),t.fill(),t.stroke(),this.label&&(e=this._pointOnCircle(a,h,d,.5),this._label(t,this.label,e.x,e.y))}},s.prototype._drawArrow=function(t){1==this.selected?(t.strokeStyle=this.options.color.highlight,t.fillStyle=this.options.color.highlight):1==this.hover?(t.strokeStyle=this.options.color.hover,t.fillStyle=this.options.color.hover):(t.strokeStyle=this.options.color.color,t.fillStyle=this.options.color.color),t.lineWidth=this._getLineWidth();var e,i;if(this.from!=this.to){e=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var s,o=this.to.x-this.from.x,n=this.to.y-this.from.y,r=Math.sqrt(o*o+n*n),a=this.from.distanceToBorder(t,e+Math.PI),h=(r-a)/r,d=h*this.from.x+(1-h)*this.to.x,l=h*this.from.y+(1-h)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?s=this.via:1==this.options.smoothCurves.enabled&&(s=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=s.x&&(e=Math.atan2(this.to.y-s.y,this.to.x-s.x),o=this.to.x-s.x,n=this.to.y-s.y,r=Math.sqrt(o*o+n*n));var c,p,u=this.to.distanceToBorder(t,e),f=(r-u)/r;if(1==this.options.smoothCurves.enabled&&null!=s.x?(c=(1-f)*s.x+f*this.to.x,p=(1-f)*s.y+f*this.to.y):(c=(1-f)*this.from.x+f*this.to.x,p=(1-f)*this.from.y+f*this.to.y),t.beginPath(),t.moveTo(d,l),1==this.options.smoothCurves.enabled&&null!=s.x?t.quadraticCurveTo(s.x,s.y,c,p):t.lineTo(c,p),t.stroke(),i=(10+5*this.options.width)*this.options.arrowScaleFactor,t.arrow(c,p,e,i),t.fill(),t.stroke(),this.label){var m;if(1==this.options.smoothCurves.enabled&&null!=s){var g=.5*(.5*(this.from.x+s.x)+.5*(this.to.x+s.x)),v=.5*(.5*(this.from.y+s.y)+.5*(this.to.y+s.y));m={x:g,y:v}}else m=this._pointOnLine(.5);this._label(t,this.label,m.x,m.y)}}else{var y,b,_,x=this.from,w=.25*Math.max(100,this.physics.springLength);x.width||x.resize(t),x.width>x.height?(y=x.x+.5*x.width,b=x.y-w,_={x:y,y:x.y,angle:.9*Math.PI}):(y=x.x+w,b=x.y-.5*x.height,_={x:x.x,y:b,angle:.6*Math.PI}),t.beginPath(),t.arc(y,b,w,0,2*Math.PI,!1),t.stroke();var i=(10+5*this.options.width)*this.options.arrowScaleFactor;t.arrow(_.x,_.y,_.angle,i),t.fill(),t.stroke(),this.label&&(m=this._pointOnCircle(y,b,w,.5),this._label(t,this.label,m.x,m.y))}},s.prototype._getDistanceToEdge=function(t,e,i,s,o,n){if(this.from!=this.to){if(1==this.options.smoothCurves.enabled){var r,a;if(1==this.options.smoothCurves.enabled&&1==this.options.smoothCurves.dynamic)r=this.via.x,a=this.via.y;else{var h=this._getViaCoordinates();r=h.x,a=h.y}var d,l,c,p,u,f,m,g=1e9;for(l=0;10>l;l++)c=.1*l,p=Math.pow(1-c,2)*t+2*c*(1-c)*r+Math.pow(c,2)*i,u=Math.pow(1-c,2)*e+2*c*(1-c)*a+Math.pow(c,2)*s,l>0&&(d=this._getDistanceToLine(f,m,p,u,o,n),g=g>d?d:g),f=p,m=u;return g}return this._getDistanceToLine(t,e,i,s,o,n)}var p,u,v,y,b=.25*this.physics.springLength,_=this.from;return _.width>_.height?(p=_.x+.5*_.width,u=_.y-b):(p=_.x+b,u=_.y-.5*_.height),v=p-o,y=u-n,Math.abs(Math.sqrt(v*v+y*y)-b)},s.prototype._getDistanceToLine=function(t,e,i,s,o,n){var r=i-t,a=s-e,h=r*r+a*a,d=((o-t)*r+(n-e)*a)/h;d>1?d=1:0>d&&(d=0);var l=t+d*r,c=e+d*a,p=l-o,u=c-n;return Math.sqrt(p*p+u*u)},s.prototype.setScale=function(t){this.networkScaleInv=1/t},s.prototype.select=function(){this.selected=!0},s.prototype.unselect=function(){this.selected=!1},s.prototype.positionBezierNode=function(){null!==this.via&&null!==this.from&&null!==this.to&&(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y))},s.prototype._drawControlNodes=function(t){if(1==this.controlNodesEnabled){if(null===this.controlNodes.from&&null===this.controlNodes.to){var e="edgeIdFrom:".concat(this.id),i="edgeIdTo:".concat(this.id),s={nodes:{group:"",radius:8},physics:{damping:0},clustering:{maxNodeSizeIncrements:0,nodeScaling:{width:0,height:0,radius:0}}};this.controlNodes.from=new n({id:e,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s),this.controlNodes.to=new n({id:i,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s)}0==this.controlNodes.from.selected&&0==this.controlNodes.to.selected&&(this.controlNodes.positions=this.getControlNodePositions(t),this.controlNodes.from.x=this.controlNodes.positions.from.x,this.controlNodes.from.y=this.controlNodes.positions.from.y,this.controlNodes.to.x=this.controlNodes.positions.to.x,this.controlNodes.to.y=this.controlNodes.positions.to.y),this.controlNodes.from.draw(t),this.controlNodes.to.draw(t)}else this.controlNodes={from:null,to:null,positions:{}}},s.prototype._enableControlNodes=function(){this.controlNodesEnabled=!0},s.prototype._disableControlNodes=function(){this.controlNodesEnabled=!1},s.prototype._getSelectedControlNode=function(t,e){var i=this.controlNodes.positions,s=Math.sqrt(Math.pow(t-i.from.x,2)+Math.pow(e-i.from.y,2)),o=Math.sqrt(Math.pow(t-i.to.x,2)+Math.pow(e-i.to.y,2));return 15>s?(this.connectedNode=this.from,this.from=this.controlNodes.from,this.controlNodes.from):15>o?(this.connectedNode=this.to,this.to=this.controlNodes.to,this.controlNodes.to):null},s.prototype._restoreControlNodes=function(){1==this.controlNodes.from.selected&&(this.from=this.connectedNode,this.connectedNode=null,this.controlNodes.from.unselect()),1==this.controlNodes.to.selected&&(this.to=this.connectedNode,this.connectedNode=null,this.controlNodes.to.unselect())},s.prototype.getControlNodePositions=function(t){var e,i=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),s=this.to.x-this.from.x,o=this.to.y-this.from.y,n=Math.sqrt(s*s+o*o),r=this.from.distanceToBorder(t,i+Math.PI),a=(n-r)/n,h=a*this.from.x+(1-a)*this.to.x,d=a*this.from.y+(1-a)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?e=this.via:1==this.options.smoothCurves.enabled&&(e=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=e.x&&(i=Math.atan2(this.to.y-e.y,this.to.x-e.x),s=this.to.x-e.x,o=this.to.y-e.y,n=Math.sqrt(s*s+o*o));var l,c,p=this.to.distanceToBorder(t,i),u=(n-p)/n;return 1==this.options.smoothCurves.enabled&&null!=e.x?(l=(1-u)*e.x+u*this.to.x,c=(1-u)*e.y+u*this.to.y):(l=(1-u)*this.from.x+u*this.to.x,c=(1-u)*this.from.y+u*this.to.y),{from:{x:h,y:d},to:{x:l,y:c}}},t.exports=s},function(t,e,i){function s(){this.clear(),this.defaultIndex=0}var o=i(1);s.DEFAULT=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}}],s.prototype.clear=function(){this.groups={},this.groups.length=function(){var t=0;for(var e in this)this.hasOwnProperty(e)&&t++;return t}},s.prototype.get=function(t){var e=this.groups[t];if(void 0==e){var i=this.defaultIndex%s.DEFAULT.length;this.defaultIndex++,e={},e.color=s.DEFAULT[i],this.groups[t]=e}return e},s.prototype.add=function(t,e){return this.groups[t]=e,e.color&&(e.color=o.parseColor(e.color)),e},t.exports=s},function(t){function e(){this.images={},this.callback=void 0}e.prototype.setOnloadCallback=function(t){this.callback=t},e.prototype.load=function(t){var e=this.images[t];if(void 0==e){var i=this;e=new Image,this.images[t]=e,e.onload=function(){i.callback&&i.callback(this)},e.src=t}return e},t.exports=e},function(t,e,i){function s(t,e,i,s){var n=o.selectiveBridgeObject(["nodes"],s);this.options=n.nodes,this.selected=!1,this.hover=!1,this.edges=[],this.dynamicEdges=[],this.reroutedEdges={},this.fontDrawThreshold=3,this.id=void 0,this.x=null,this.y=null,this.xFixed=!1,this.yFixed=!1,this.horizontalAlignLeft=!0,this.verticalAlignTop=!0,this.baseRadiusValue=s.nodes.radius,this.radiusFixed=!1,this.level=-1,this.preassignedLevel=!1,this.imagelist=e,this.grouplist=i,this.fx=0,this.fy=0,this.vx=0,this.vy=0,this.damping=s.physics.damping,this.fixedData={x:null,y:null},this.setProperties(t,n),this.resetCluster(),this.dynamicEdgesLength=0,this.clusterSession=0,this.clusterSizeWidthFactor=s.clustering.nodeScaling.width,this.clusterSizeHeightFactor=s.clustering.nodeScaling.height,this.clusterSizeRadiusFactor=s.clustering.nodeScaling.radius,this.maxNodeSizeIncrements=s.clustering.maxNodeSizeIncrements,this.growthIndicator=0,this.networkScaleInv=1,this.networkScale=1,this.canvasTopLeft={x:-300,y:-300},this.canvasBottomRight={x:300,y:300},this.parentEdgeId=null}var o=i(1);s.prototype.resetCluster=function(){this.formationScale=void 0,this.clusterSize=1,this.containedNodes={},this.containedEdges={},this.clusterSessions=[]},s.prototype.attachEdge=function(t){-1==this.edges.indexOf(t)&&this.edges.push(t),-1==this.dynamicEdges.indexOf(t)&&this.dynamicEdges.push(t),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.detachEdge=function(t){var e=this.edges.indexOf(t);-1!=e&&(this.edges.splice(e,1),this.dynamicEdges.splice(e,1)),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.setProperties=function(t,e){if(t){var i=["borderWidth","borderWidthSelected","shape","image","radius","fontColor","fontSize","fontFace","group","mass"];if(o.selectiveDeepExtend(i,this.options,t),this.originalLabel=void 0,void 0!==t.id&&(this.id=t.id),void 0!==t.label&&(this.label=t.label,this.originalLabel=t.label),void 0!==t.title&&(this.title=t.title),void 0!==t.x&&(this.x=t.x),void 0!==t.y&&(this.y=t.y),void 0!==t.value&&(this.value=t.value),void 0!==t.level&&(this.level=t.level,this.preassignedLevel=!0),void 0!==t.horizontalAlignLeft&&(this.horizontalAlignLeft=t.horizontalAlignLeft),void 0!==t.verticalAlignTop&&(this.verticalAlignTop=t.verticalAlignTop),void 0!==t.triggerFunction&&(this.triggerFunction=t.triggerFunction),void 0===this.id)throw"Node must have an id";if("number"==typeof this.options.group||"string"==typeof this.options.group&&""!=this.options.group){var s=this.grouplist.get(this.options.group);for(var n in s)s.hasOwnProperty(n)&&(this.options[n]=s[n])}if(void 0!==t.radius&&(this.baseRadiusValue=this.options.radius),void 0!==t.color&&(this.options.color=o.parseColor(t.color)),void 0!==this.options.image&&""!=this.options.image){if(!this.imagelist)throw"No imagelist provided";this.imageObj=this.imagelist.load(this.options.image)}switch(this.xFixed=this.xFixed||void 0!==t.x&&!t.allowedToMoveX,this.yFixed=this.yFixed||void 0!==t.y&&!t.allowedToMoveY,this.radiusFixed=this.radiusFixed||void 0!==t.radius,"image"==this.options.shape&&(this.options.radiusMin=e.nodes.widthMin,this.options.radiusMax=e.nodes.widthMax),this.options.shape){case"database":this.draw=this._drawDatabase,this.resize=this._resizeDatabase;break;case"box":this.draw=this._drawBox,this.resize=this._resizeBox;break;case"circle":this.draw=this._drawCircle,this.resize=this._resizeCircle;break;case"ellipse":this.draw=this._drawEllipse,this.resize=this._resizeEllipse;break;case"image":this.draw=this._drawImage,this.resize=this._resizeImage;break;case"text":this.draw=this._drawText,this.resize=this._resizeText;break;case"dot":this.draw=this._drawDot,this.resize=this._resizeShape;break;case"square":this.draw=this._drawSquare,this.resize=this._resizeShape;break;case"triangle":this.draw=this._drawTriangle,this.resize=this._resizeShape;break;case"triangleDown":this.draw=this._drawTriangleDown,this.resize=this._resizeShape;break;case"star":this.draw=this._drawStar,this.resize=this._resizeShape;break;default:this.draw=this._drawEllipse,this.resize=this._resizeEllipse}this._reset()}},s.prototype.select=function(){this.selected=!0,this._reset()},s.prototype.unselect=function(){this.selected=!1,this._reset()},s.prototype.clearSizeCache=function(){this._reset()},s.prototype._reset=function(){this.width=void 0,this.height=void 0},s.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},s.prototype.distanceToBorder=function(t,e){var i=1;switch(this.width||this.resize(t),this.options.shape){case"circle":case"dot":return this.options.radius+i;case"ellipse":var s=this.width/2,o=this.height/2,n=Math.sin(e)*s,r=Math.cos(e)*o;return s*o/Math.sqrt(n*n+r*r);case"box":case"image":case"text":default:return this.width?Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i:0}},s.prototype._setForce=function(t,e){this.fx=t,this.fy=e},s.prototype._addForce=function(t,e){this.fx+=t,this.fy+=e},s.prototype.discreteStep=function(t){if(!this.xFixed){var e=this.damping*this.vx,i=(this.fx-e)/this.options.mass;this.vx+=i*t,this.x+=this.vx*t}if(!this.yFixed){var s=this.damping*this.vy,o=(this.fy-s)/this.options.mass;this.vy+=o*t,this.y+=this.vy*t}},s.prototype.discreteStepLimited=function(t,e){if(this.xFixed)this.fx=0;else{var i=this.damping*this.vx,s=(this.fx-i)/this.options.mass;this.vx+=s*t,this.vx=Math.abs(this.vx)>e?this.vx>0?e:-e:this.vx,this.x+=this.vx*t}if(this.yFixed)this.fy=0;else{var o=this.damping*this.vy,n=(this.fy-o)/this.options.mass;this.vy+=n*t,this.vy=Math.abs(this.vy)>e?this.vy>0?e:-e:this.vy,this.y+=this.vy*t}},s.prototype.isFixed=function(){return this.xFixed&&this.yFixed},s.prototype.isMoving=function(t){var e=Math.sqrt(Math.pow(this.vx,2)+Math.pow(this.vy,2));return e>t},s.prototype.isSelected=function(){return this.selected},s.prototype.getValue=function(){return this.value},s.prototype.getDistance=function(t,e){var i=this.x-t,s=this.y-e;return Math.sqrt(i*i+s*s)},s.prototype.setValueRange=function(t,e){if(!this.radiusFixed&&void 0!==this.value)if(e==t)this.options.radius=(this.options.radiusMin+this.options.radiusMax)/2;else{var i=(this.options.radiusMax-this.options.radiusMin)/(e-t);this.options.radius=(this.value-t)*i+this.options.radiusMin}this.baseRadiusValue=this.options.radius},s.prototype.draw=function(){throw"Draw method not initialized for node"},s.prototype.resize=function(){throw"Resize method not initialized for node"},s.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},s.prototype._resizeImage=function(){if(!this.width||!this.height){var t,e;if(this.value){this.options.radius=this.baseRadiusValue;var i=this.imageObj.height/this.imageObj.width;void 0!==i?(t=this.options.radius||this.imageObj.width,e=this.options.radius*i||this.imageObj.height):(t=0,e=0)}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.growthIndicator=0,this.width>0&&this.height>0&&(this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t)}},s.prototype._drawImage=function(t){this._resizeImage(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e;if(0!=this.imageObj.width){if(this.clusterSize>1){var i=this.clusterSize>1?10:0;i*=this.networkScaleInv,i=Math.min(.2*this.width,i),t.globalAlpha=.5,t.drawImage(this.imageObj,this.left-i,this.top-i,this.width+2*i,this.height+2*i)}t.globalAlpha=1,t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),e=this.y+this.height/2}else e=this.y;this._label(t,this.label,this.x,e,void 0,"top")},s.prototype._resizeBox=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawBox=function(t){this._resizeBox(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.roundRect(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth,this.options.radius),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.options.color.background,t.roundRect(this.left,this.top,this.width,this.height,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeDatabase=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=i.width+2*e;this.width=s,this.height=s,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-s}},s.prototype._drawDatabase=function(t){this._resizeDatabase(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.database(this.x-this.width/2-2*t.lineWidth,this.y-.5*this.height-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.database(this.x-this.width/2,this.y-.5*this.height,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeCircle=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=Math.max(i.width,i.height)+2*e;this.options.radius=s/2,this.width=s,this.height=s,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.options.radius-.5*s}},s.prototype._drawCircle=function(t){this._resizeCircle(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.circle(this.x,this.y,this.options.radius+2*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.circle(this.x,this.y,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y) +},s.prototype._resizeEllipse=function(t){if(!this.width){var e=this.getTextSize(t);this.width=1.5*e.width,this.height=2*e.height,this.width1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.ellipse(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.ellipse(this.left,this.top,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._drawDot=function(t){this._drawShape(t,"circle")},s.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},s.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},s.prototype._drawSquare=function(t){this._drawShape(t,"square")},s.prototype._drawStar=function(t){this._drawShape(t,"star")},s.prototype._resizeShape=function(){if(!this.width){this.options.radius=this.baseRadiusValue;var t=2*this.options.radius;this.width=t,this.height=t,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t}},s.prototype._drawShape=function(t,e){this._resizeShape(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var i=2.5,s=this.options.borderWidth,o=this.options.borderWidthSelected||2*this.options.borderWidth,n=2;switch(e){case"dot":n=2;break;case"square":n=2;break;case"triangle":n=3;break;case"triangleDown":n=3;break;case"star":n=4}t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t[e](this.x,this.y,this.options.radius+n*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t[e](this.x,this.y,this.options.radius),t.fill(),t.stroke(),this.label&&this._label(t,this.label,this.x,this.y+this.height/2,void 0,"top",!0)},s.prototype._resizeText=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawText=function(t){this._resizeText(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,this._label(t,this.label,this.x,this.y)},s.prototype._label=function(t,e,i,s,o,n,r){if(e&&Number(this.options.fontSize)*this.networkScale>this.fontDrawThreshold){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace,t.fillStyle=this.options.fontColor||"black",t.textAlign=o||"center",t.textBaseline=n||"middle";var a=e.split("\n"),h=a.length,d=Number(this.options.fontSize)+4,l=s+(1-h)/2*d;1==r&&(l=s+(1-h)/(2*d));for(var c=0;h>c;c++)t.fillText(a[c],i,l),l+=d}},s.prototype.getTextSize=function(t){if(void 0!==this.label){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace;for(var e=this.label.split("\n"),i=(Number(this.options.fontSize)+4)*e.length,s=0,o=0,n=e.length;n>o;o++)s=Math.max(s,t.measureText(e[o]).width);return{width:s,height:i}}return{width:0,height:0}},s.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.networkScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.networkScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.networkScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.ys&&(n=s-e-this.padding),no&&(r=o-i-this.padding),ri;i++)if(e.id===r.nodes[i].id){o=r.nodes[i];break}for(o||(o={id:e.id},t.node&&(o.attr=a(o.attr,t.node))),i=n.length-1;i>=0;i--){var h=n[i];h.nodes||(h.nodes=[]),-1==h.nodes.indexOf(o)&&h.nodes.push(o)}e.attr&&(o.attr=a(o.attr,e.attr))}function l(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=a({},t.edge);e.attr=a(i,e.attr)}}function c(t,e,i,s,o){var n={from:e,to:i,type:s};return t.edge&&(n.attr=a({},t.edge)),n.attr=a(n.attr||{},o),n}function p(){for(k=C.NULL,L="";" "==O||" "==O||"\n"==O||"\r"==O;)o();do{var t=!1;if("#"==O){for(var e=T-1;" "==D.charAt(e)||" "==D.charAt(e);)e--;if("\n"==D.charAt(e)||""==D.charAt(e)){for(;""!=O&&"\n"!=O;)o();t=!0}}if("/"==O&&"/"==n()){for(;""!=O&&"\n"!=O;)o();t=!0}if("/"==O&&"*"==n()){for(;""!=O;){if("*"==O&&"/"==n()){o(),o();break}o()}t=!0}for(;" "==O||" "==O||"\n"==O||"\r"==O;)o()}while(t);if(""==O)return void(k=C.DELIMITER);var i=O+n();if(E[i])return k=C.DELIMITER,L=i,o(),void o();if(E[O])return k=C.DELIMITER,L=O,void o();if(r(O)||"-"==O){for(L+=O,o();r(O);)L+=O,o();return"false"==L?L=!1:"true"==L?L=!0:isNaN(Number(L))||(L=Number(L)),void(k=C.IDENTIFIER)}if('"'==O){for(o();""!=O&&('"'!=O||'"'==O&&'"'==n());)L+=O,'"'==O&&o(),o();if('"'!=O)throw x('End of string " expected');return o(),void(k=C.IDENTIFIER)}for(k=C.UNKNOWN;""!=O;)L+=O,o();throw new SyntaxError('Syntax error in part "'+w(L,30)+'"')}function u(){var t={};if(s(),p(),"strict"==L&&(t.strict=!0,p()),("graph"==L||"digraph"==L)&&(t.type=L,p()),k==C.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),f(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function f(t){for(;""!==L&&"}"!=L;)m(t),";"==L&&p()}function m(t){var e=g(t);if(e)return void b(t,e);var i=v(t);if(!i){if(k!=C.IDENTIFIER)throw x("Identifier expected");var s=L;if(p(),"="==L){if(p(),k!=C.IDENTIFIER)throw x("Identifier expected");t[s]=L,p()}else y(t,s)}}function g(t){var e=null;if("subgraph"==L&&(e={},e.type="subgraph",p(),k==C.IDENTIFIER&&(e.id=L,p())),"{"==L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,f(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function v(t){return"node"==L?(p(),t.node=_(),"node"):"edge"==L?(p(),t.edge=_(),"edge"):"graph"==L?(p(),t.graph=_(),"graph"):null}function y(t,e){var i={id:e},s=_();s&&(i.attr=s),d(t,i),b(t,e)}function b(t,e){for(;"->"==L||"--"==L;){var i,s=L;p();var o=g(t);if(o)i=o;else{if(k!=C.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,d(t,{id:i}),p()}var n=_(),r=c(t,e,i,s,n);l(t,r),e=i}}function _(){for(var t=null;"["==L;){for(p(),t={};""!==L&&"]"!=L;){if(k!=C.IDENTIFIER)throw x("Attribute name expected");var e=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),k!=C.IDENTIFIER)throw x("Attribute value expected");var i=L;h(t,e,i),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+w(L,30)+'" (char '+T+")")}function w(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){t instanceof Array?t.forEach(function(t){e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}):e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}function M(t){function e(t){var e={from:t.from,to:t.to};return a(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var s=i(t),o={nodes:[],edges:[],options:{}};return s.nodes&&s.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};a(e,t.attr),e.image&&(e.shape="image"),o.nodes.push(e)}),s.edges&&s.edges.forEach(function(t){var i,s;i=t.from instanceof Object?t.from.nodes:{id:t.from},s=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var i=e(t);o.edges.push(i)}),S(i,s,function(i,s){var n=c(o,i.id,s.id,t.type,t.attr),r=e(n);o.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var i=e(t);o.edges.push(i)})}),s.attr&&(o.options=s.attr),o}var C={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},E={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},D="",T=0,O="",L="",k=C.NULL,N=/[a-zA-Z_0-9.:#]/;e.parseDOT=i,e.DOTToGraph=M},function(t,e){function i(t,e){var i=[],s=[];this.options={edges:{inheritColor:!0},nodes:{allowedToMove:!1,parseColor:!1}},void 0!==e&&(this.options.nodes.allowedToMove=e.allowedToMove|!1,this.options.nodes.parseColor=e.parseColor|!1,this.options.edges.inheritColor=e.inheritColor|!0);for(var o=t.edges,n=t.nodes,r=0;r=s&&(s=864e5),e=new Date(e.valueOf()-.05*s),i=new Date(i.valueOf()+.05*s)}(null!==e||null!==i)&&this.range.setRange(e,i)},s.prototype.setWindow=function(t,e){if(1==arguments.length){var i=arguments[0];this.range.setRange(i.start,i.end)}else this.range.setRange(t,e)},s.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},s.prototype.redraw=function(){var t=!1,e=this.options,i=this.props,s=this.dom;if(s){"top"==e.orientation?(r.addClassName(s.root,"top"),r.removeClassName(s.root,"bottom")):(r.removeClassName(s.root,"top"),r.addClassName(s.root,"bottom")),s.root.style.maxHeight=r.option.asSize(e.maxHeight,""),s.root.style.minHeight=r.option.asSize(e.minHeight,""),s.root.style.width=r.option.asSize(e.width,""),i.border.left=(s.centerContainer.offsetWidth-s.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(s.centerContainer.offsetHeight-s.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var o=s.root.offsetHeight-s.root.clientHeight,n=s.root.offsetWidth-s.root.clientWidth;i.center.height=s.center.offsetHeight,i.left.height=s.left.offsetHeight,i.right.height=s.right.offsetHeight,i.top.height=s.top.clientHeight||-i.border.top,i.bottom.height=s.bottom.clientHeight||-i.border.bottom;var a=Math.max(i.left.height,i.center.height,i.right.height),h=i.top.height+a+i.bottom.height+o+i.border.top+i.border.bottom;s.root.style.height=r.option.asSize(e.height,h+"px"),i.root.height=s.root.offsetHeight,i.background.height=i.root.height-o;var d=i.root.height-i.top.height-i.bottom.height-o;i.centerContainer.height=d,i.leftContainer.height=d,i.rightContainer.height=i.leftContainer.height,i.root.width=s.root.offsetWidth,i.background.width=i.root.width-n,i.left.width=s.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=s.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var l=i.root.width-i.left.width-i.right.width-n;i.center.width=l,i.centerContainer.width=l,i.top.width=l,i.bottom.width=l,s.background.style.height=i.background.height+"px",s.backgroundVertical.style.height=i.background.height+"px",s.backgroundHorizontal.style.height=i.centerContainer.height+"px",s.centerContainer.style.height=i.centerContainer.height+"px",s.leftContainer.style.height=i.leftContainer.height+"px",s.rightContainer.style.height=i.rightContainer.height+"px",s.background.style.width=i.background.width+"px",s.backgroundVertical.style.width=i.centerContainer.width+"px",s.backgroundHorizontal.style.width=i.background.width+"px",s.centerContainer.style.width=i.center.width+"px",s.top.style.width=i.top.width+"px",s.bottom.style.width=i.bottom.width+"px",s.background.style.left="0",s.background.style.top="0",s.backgroundVertical.style.left=i.left.width+"px",s.backgroundVertical.style.top="0",s.backgroundHorizontal.style.left="0",s.backgroundHorizontal.style.top=i.top.height+"px",s.centerContainer.style.left=i.left.width+"px",s.centerContainer.style.top=i.top.height+"px",s.leftContainer.style.left="0",s.leftContainer.style.top=i.top.height+"px",s.rightContainer.style.left=i.left.width+i.center.width+"px",s.rightContainer.style.top=i.top.height+"px",s.top.style.left=i.left.width+"px",s.top.style.top="0",s.bottom.style.left=i.left.width+"px",s.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var c=this.props.scrollTop;"bottom"==e.orientation&&(c+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),s.center.style.left="0",s.center.style.top=c+"px",s.left.style.left="0",s.left.style.top=c+"px",s.right.style.left="0",s.right.style.top=c+"px";var p=0==this.props.scrollTop?"hidden":"",u=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";s.shadowTop.style.visibility=p,s.shadowBottom.style.visibility=u,s.shadowTopLeft.style.visibility=p,s.shadowBottomLeft.style.visibility=u,s.shadowTopRight.style.visibility=p,s.shadowBottomRight.style.visibility=u,this.components.forEach(function(e){t=e.redraw()||t}),t&&this.redraw()}},s.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},s.prototype._toTime=function(t){var e=this.range.conversion(this.props.center.width);return new Date(t/e.scale+e.offset)},s.prototype._toGlobalTime=function(t){var e=this.range.conversion(this.props.root.width);return new Date(t/e.scale+e.offset)},s.prototype._toScreen=function(t){var e=this.range.conversion(this.props.center.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._toGlobalScreen=function(t){var e=this.range.conversion(this.props.root.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},s.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){return 1!=t.options.autoResize?void t._stopAutoResize():void(t.dom.root&&(t.dom.root.clientWidth!=t.props.lastWidth||t.dom.root.clientHeight!=t.props.lastHeight)&&(t.props.lastWidth=t.dom.root.clientWidth,t.props.lastHeight=t.dom.root.clientHeight,t.emit("change")))},r.addEventListener(window,"resize",this._onResize),this.watchTimer=setInterval(this._onResize,1e3)},s.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),r.removeEventListener(window,"resize",this._onResize),this._onResize=null},s.prototype._onTouch=function(){this.touch.allowDragging=!0},s.prototype._onPinch=function(){this.touch.allowDragging=!1},s.prototype._onDragStart=function(){this.touch.initialScrollTop=this.props.scrollTop},s.prototype._onDrag=function(t){if(this.touch.allowDragging){var e=t.gesture.deltaY,i=this._getScrollTop(),s=this._setScrollTop(this.touch.initialScrollTop+e);s!=i&&this.redraw()}},s.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},s.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("bottom"==this.options.orientation&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTops;s++){var o=s%2===0?1.3*i:.5*i;this.lineTo(t+o*Math.sin(2*s*Math.PI/10),e-o*Math.cos(2*s*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,s,o){var n=Math.PI/180;0>i-2*o&&(o=i/2),0>s-2*o&&(o=s/2),this.beginPath(),this.moveTo(t+o,e),this.lineTo(t+i-o,e),this.arc(t+i-o,e+o,o,270*n,360*n,!1),this.lineTo(t+i,e+s-o),this.arc(t+i-o,e+s-o,o,0,90*n,!1),this.lineTo(t+o,e+s),this.arc(t+o,e+s-o,o,90*n,180*n,!1),this.lineTo(t,e+o),this.arc(t+o,e+o,o,180*n,270*n,!1)},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,s){var o=.5522848,n=i/2*o,r=s/2*o,a=t+i,h=e+s,d=t+i/2,l=e+s/2;this.beginPath(),this.moveTo(t,l),this.bezierCurveTo(t,l-r,d-n,e,d,e),this.bezierCurveTo(d+n,e,a,l-r,a,l),this.bezierCurveTo(a,l+r,d+n,h,d,h),this.bezierCurveTo(d-n,h,t,l+r,t,l)},CanvasRenderingContext2D.prototype.database=function(t,e,i,s){var o=1/3,n=i,r=s*o,a=.5522848,h=n/2*a,d=r/2*a,l=t+n,c=e+r,p=t+n/2,u=e+r/2,f=e+(s-r/2),m=e+s;this.beginPath(),this.moveTo(l,u),this.bezierCurveTo(l,u+d,p+h,c,p,c),this.bezierCurveTo(p-h,c,t,u+d,t,u),this.bezierCurveTo(t,u-d,p-h,e,p,e),this.bezierCurveTo(p+h,e,l,u-d,l,u),this.lineTo(l,f),this.bezierCurveTo(l,f+d,p+h,m,p,m),this.bezierCurveTo(p-h,m,t,f+d,t,f),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,s){var o=t-s*Math.cos(i),n=e-s*Math.sin(i),r=t-.9*s*Math.cos(i),a=e-.9*s*Math.sin(i),h=o+s/3*Math.cos(i+.5*Math.PI),d=n+s/3*Math.sin(i+.5*Math.PI),l=o+s/3*Math.cos(i-.5*Math.PI),c=n+s/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(r,a),this.lineTo(l,c),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,s,o){o||(o=[10,5]),0==p&&(p=.001);var n=o.length;this.moveTo(t,e);for(var r=i-t,a=s-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,c=!0;d>=.1;){var p=o[l++%n];p>d&&(p=d);var u=Math.sqrt(p*p/(1+h*h));0>r&&(u=-u),t+=u,e+=h*u,this[c?"lineTo":"moveTo"](t,e),d-=p,c=!c}})},function(t,e,i){var s=i(59),o=i(53),n=i(54),r=i(55),a=i(56),h=i(57),d=i(58);e._loadMixin=function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},e._clearMixin=function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=void 0)},e._loadPhysicsSystem=function(){this._loadMixin(s),this._loadSelectedForceSolver(),1==this.constants.configurePhysics&&this._loadPhysicsConfiguration()},e._loadClusterSystem=function(){this.clusterSession=0,this.hubThreshold=5,this._loadMixin(o)},e._loadSectorSystem=function(){this.sectors={},this.activeSector=["default"],this.sectors.active={},this.sectors.active["default"]={nodes:{},edges:{},nodeIndices:[],formationScale:1,drawingNode:void 0},this.sectors.frozen={},this.sectors.support={nodes:{},edges:{},nodeIndices:[],formationScale:1,drawingNode:void 0},this.nodeIndices=this.sectors.active["default"].nodeIndices,this._loadMixin(n)},e._loadSelectionSystem=function(){this.selectionObj={nodes:{},edges:{}},this._loadMixin(r)},e._loadManipulationSystem=function(){this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,1==this.constants.dataManipulation.enabled?(void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="network-manipulationDiv",this.manipulationDiv.id="network-manipulationDiv",this.manipulationDiv.style.display=1==this.editMode?"block":"none",this.frame.appendChild(this.manipulationDiv)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="network-manipulation-editMode",this.editModeDiv.id="network-manipulation-editMode",this.editModeDiv.style.display=1==this.editMode?"none":"block",this.frame.appendChild(this.editModeDiv)),void 0===this.closeDiv&&(this.closeDiv=document.createElement("div"),this.closeDiv.className="network-manipulation-closeDiv",this.closeDiv.id="network-manipulation-closeDiv",this.closeDiv.style.display=this.manipulationDiv.style.display,this.frame.appendChild(this.closeDiv)),this._loadMixin(a),this._createManipulatorBar()):void 0!==this.manipulationDiv&&(this._createManipulatorBar(),this.containerElement.removeChild(this.manipulationDiv),this.containerElement.removeChild(this.editModeDiv),this.containerElement.removeChild(this.closeDiv),this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0,this._clearMixin(a))},e._loadNavigationControls=function(){this._loadMixin(h),this._cleanNavigation(),1==this.constants.navigation.enabled&&this._loadNavigationElements()},e._loadHierarchySystem=function(){this._loadMixin(d) +}},function(t,e,i){function s(t){this.active=!1,this.dom={container:t},this.dom.overlay=document.createElement("div"),this.dom.overlay.className="overlay",this.dom.container.appendChild(this.dom.overlay),this.hammer=a(this.dom.overlay,{prevent_default:!1}),this.hammer.on("tap",this._onTapOverlay.bind(this));var e=this,i=["touch","pinch","doubletap","hold","dragstart","drag","dragend","mousewheel","DOMMouseScroll"];i.forEach(function(t){e.hammer.on(t,function(t){t.stopPropagation()})}),this.windowHammer=a(window,{prevent_default:!1}),this.windowHammer.on("tap",function(i){o(i.target,t)||e.deactivate()}),this.escListener=this.deactivate.bind(this)}function o(t,e){for(;t;){if(t===e)return!0;t=t.parentNode}return!1}var n=i(50),r=i(49),a=i(41),h=i(1);r(s.prototype),s.current=null,s.prototype.destroy=function(){this.deactivate(),this.dom.overlay.parentNode.removeChild(this.dom.overlay),this.hammer=null,this.windowHammer=null},s.prototype.activate=function(){s.current&&s.current.deactivate(),s.current=this,this.active=!0,this.dom.overlay.style.display="none",h.addClassName(this.dom.container,"vis-active"),this.emit("change"),this.emit("activate"),n.bind("esc",this.escListener)},s.prototype.deactivate=function(){this.active=!1,this.dom.overlay.style.display="",h.removeClassName(this.dom.container,"vis-active"),n.unbind("esc",this.escListener),this.emit("change"),this.emit("deactivate")},s.prototype._onTapOverlay=function(t){this.activate(),t.stopPropagation()},t.exports=s},function(t){function e(t){return t?i(t):void 0}function i(t){for(var i in e.prototype)t[i]=e.prototype[i];return t}t.exports=e,e.prototype.on=e.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},e.prototype.once=function(t,e){function i(){s.off(t,i),e.apply(this,arguments)}var s=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},e.prototype.off=e.prototype.removeListener=e.prototype.removeAllListeners=e.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var s,o=0;os;++s)i[s].apply(this,e)}return this},e.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},e.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t){function e(t,e,i){return t.addEventListener?t.addEventListener(e,i,!1):void t.attachEvent("on"+e,i)}function i(t){return"keypress"==t.type?String.fromCharCode(t.which):_[t.which]?_[t.which]:x[t.which]?x[t.which]:String.fromCharCode(t.which).toLowerCase()}function s(t){var e=t.target||t.srcElement,i=e.tagName;return(" "+e.className+" ").indexOf(" mousetrap ")>-1?!1:"INPUT"==i||"SELECT"==i||"TEXTAREA"==i||e.contentEditable&&"true"==e.contentEditable}function o(t,e){return t.sort().join(",")===e.sort().join(",")}function n(t){t=t||{};var e,i=!1;for(e in E)t[e]?i=!0:E[e]=0;i||(T=!1)}function r(t,e,i,s,n){var r,a,h=[];if(!M[t])return[];for("keyup"==i&&c(t)&&(e=[t]),r=0;r95&&112>t||_.hasOwnProperty(t)&&(y[_[t]]=t)}return y}function f(t,e,i){return i||(i=u()[t]?"keydown":"keypress"),"keypress"==i&&e.length&&(i="keydown"),i}function m(t,e,s,o){E[t]=0,o||(o=f(e[0],[]));var r,a=function(){T=o,++E[t],p()},d=function(t){h(s,t),"keyup"!==o&&(D=i(t)),setTimeout(n,10)};for(r=0;r1)return m(t,d,e,i);for(h="+"===t?["+"]:t.split("+"),n=0;n":".","?":"/","|":"\\"},S={option:"alt",command:"meta","return":"enter",escape:"esc"},M={},C={},E={},D=!1,T=!1,O=1;20>O;++O)_[111+O]="f"+O;for(O=0;9>=O;++O)_[O+96]=O;e(document,"keypress",l),e(document,"keydown",l),e(document,"keyup",l);var L={bind:function(t,e,i){return v(t instanceof Array?t:[t],e,i),C[t+":"+i]=e,this},unbind:function(t,e){return C[t+":"+e]&&(delete C[t+":"+e],this.bind(t,function(){},e)),this},trigger:function(t,e){return C[t+":"+e](),this},reset:function(){return M={},C={},this}};t.exports=L},function(t,e,i){var s;(function(t,o){(function(n){function r(t,e,i){switch(arguments.length){case 2:return null!=t?t:e;case 3:return null!=t?t:null!=e?e:i;default:throw new Error("Implement me")}}function a(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function h(t,e){function i(){ve.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}var s=!0;return f(function(){return s&&(i(),s=!1),e.apply(this,arguments)},e)}function d(t,e){return function(i){return v(t.call(this,i),e)}}function l(t,e){return function(i){return this.lang().ordinal(t.call(this,i),e)}}function c(){}function p(t){L(t),f(this,t)}function u(t){var e=S(t),i=e.year||0,s=e.quarter||0,o=e.month||0,n=e.week||0,r=e.day||0,a=e.hour||0,h=e.minute||0,d=e.second||0,l=e.millisecond||0;this._milliseconds=+l+1e3*d+6e4*h+36e5*a,this._days=+r+7*n,this._months=+o+3*s+12*i,this._data={},this._bubble()}function f(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return e.hasOwnProperty("toString")&&(t.toString=e.toString),e.hasOwnProperty("valueOf")&&(t.valueOf=e.valueOf),t}function m(t){var e,i={};for(e in t)t.hasOwnProperty(e)&&ke.hasOwnProperty(e)&&(i[e]=t[e]);return i}function g(t){return 0>t?Math.ceil(t):Math.floor(t)}function v(t,e,i){for(var s=""+Math.abs(t),o=t>=0;s.lengths;s++)(i&&t[s]!==e[s]||!i&&C(t[s])!==C(e[s]))&&r++;return r+n}function w(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=ri[t]||ai[e]||e}return t}function S(t){var e,i,s={};for(i in t)t.hasOwnProperty(i)&&(e=w(i),e&&(s[e]=t[i]));return s}function M(t){var e,i;if(0===t.indexOf("week"))e=7,i="day";else{if(0!==t.indexOf("month"))return;e=12,i="month"}ve[t]=function(s,o){var r,a,h=ve.fn._lang[t],d=[];if("number"==typeof s&&(o=s,s=n),a=function(t){var e=ve().utc().set(i,t);return h.call(ve.fn._lang,e,s||"")},null!=o)return a(o);for(r=0;e>r;r++)d.push(a(r));return d}}function C(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function E(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function D(t,e,i){return re(ve([t,11,31+e-i]),e,i).week}function T(t){return O(t)?366:365}function O(t){return t%4===0&&t%100!==0||t%400===0}function L(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[Me]<0||t._a[Me]>11?Me:t._a[Ce]<1||t._a[Ce]>E(t._a[Se],t._a[Me])?Ce:t._a[Ee]<0||t._a[Ee]>23?Ee:t._a[De]<0||t._a[De]>59?De:t._a[Te]<0||t._a[Te]>59?Te:t._a[Oe]<0||t._a[Oe]>999?Oe:-1,t._pf._overflowDayOfYear&&(Se>e||e>Ce)&&(e=Ce),t._pf.overflow=e)}function k(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length)),t._isValid}function N(t){return t?t.toLowerCase().replace("_","-"):t}function I(t,e){return e._isUTC?ve(t).zone(e._offset||0):ve(t).local()}function A(t,e){return e.abbr=t,Le[t]||(Le[t]=new c),Le[t].set(e),Le[t]}function z(t){delete Le[t]}function P(t){var e,s,o,n,r=0,a=function(t){if(!Le[t]&&Ne)try{i(60)("./"+t)}catch(e){}return Le[t]};if(!t)return ve.fn._lang;if(!b(t)){if(s=a(t))return s;t=[t]}for(;r0;){if(s=a(n.slice(0,e).join("-")))return s;if(o&&o.length>=e&&x(n,o,!0)>=e-1)break;e--}r++}return ve.fn._lang}function R(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function F(t){var e,i,s=t.match(Pe);for(e=0,i=s.length;i>e;e++)s[e]=pi[s[e]]?pi[s[e]]:R(s[e]);return function(o){var n="";for(e=0;i>e;e++)n+=s[e]instanceof Function?s[e].call(o,t):s[e];return n}}function H(t,e){return t.isValid()?(e=Y(e,t.lang()),hi[e]||(hi[e]=F(e)),hi[e](t)):t.lang().invalidDate()}function Y(t,e){function i(t){return e.longDateFormat(t)||t}var s=5;for(Re.lastIndex=0;s>=0&&Re.test(t);)t=t.replace(Re,i),Re.lastIndex=0,s-=1;return t}function B(t,e){var i,s=e._strict;switch(t){case"Q":return Ze;case"DDDD":return Ke;case"YYYY":case"GGGG":case"gggg":return s?$e:Ye;case"Y":case"G":case"g":return Qe;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return s?Je:Be;case"S":if(s)return Ze;case"SS":if(s)return qe;case"SSS":if(s)return Ke;case"DDD":return He;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Ge;case"a":case"A":return P(e._l)._meridiemParse;case"X":return Ve;case"Z":case"ZZ":return je;case"T":return Ue;case"SSSS":return We;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return s?qe:Fe;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Fe;case"Do":return Xe;default:return i=new RegExp(K(q(t.replace("\\","")),"i"))}}function W(t){t=t||"";var e=t.match(je)||[],i=e[e.length-1]||[],s=(i+"").match(oi)||["-",0,0],o=+(60*s[1])+C(s[2]);return"+"===s[0]?-o:o}function G(t,e,i){var s,o=i._a;switch(t){case"Q":null!=e&&(o[Me]=3*(C(e)-1));break;case"M":case"MM":null!=e&&(o[Me]=C(e)-1);break;case"MMM":case"MMMM":s=P(i._l).monthsParse(e),null!=s?o[Me]=s:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(o[Ce]=C(e));break;case"Do":null!=e&&(o[Ce]=C(parseInt(e,10)));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=C(e));break;case"YY":o[Se]=ve.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":o[Se]=C(e);break;case"a":case"A":i._isPm=P(i._l).isPM(e);break;case"H":case"HH":case"h":case"hh":o[Ee]=C(e);break;case"m":case"mm":o[De]=C(e);break;case"s":case"ss":o[Te]=C(e);break;case"S":case"SS":case"SSS":case"SSSS":o[Oe]=C(1e3*("0."+e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=W(e);break;case"dd":case"ddd":case"dddd":s=P(i._l).weekdaysParse(e),null!=s?(i._w=i._w||{},i._w.d=s):i._pf.invalidWeekday=e;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":t=t.substr(0,1);case"gggg":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=C(e));break;case"gg":case"GG":i._w=i._w||{},i._w[t]=ve.parseTwoDigitYear(e)}}function j(t){var e,i,s,o,n,a,h,d;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(n=1,a=4,i=r(e.GG,t._a[Se],re(ve(),1,4).year),s=r(e.W,1),o=r(e.E,1)):(d=P(t._l),n=d._week.dow,a=d._week.doy,i=r(e.gg,t._a[Se],re(ve(),n,a).year),s=r(e.w,1),null!=e.d?(o=e.d,n>o&&++s):o=null!=e.e?e.e+n:n),h=ae(i,s,o,a,n),t._a[Se]=h.year,t._dayOfYear=h.dayOfYear}function U(t){var e,i,s,o,n=[];if(!t._d){for(s=X(t),t._w&&null==t._a[Ce]&&null==t._a[Me]&&j(t),t._dayOfYear&&(o=r(t._a[Se],s[Se]),t._dayOfYear>T(o)&&(t._pf._overflowDayOfYear=!0),i=ie(o,0,t._dayOfYear),t._a[Me]=i.getUTCMonth(),t._a[Ce]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=n[e]=s[e];for(;7>e;e++)t._a[e]=n[e]=null==t._a[e]?2===e?1:0:t._a[e];t._d=(t._useUTC?ie:ee).apply(null,n),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()+t._tzm)}}function V(t){var e;t._d||(e=S(t._i),t._a=[e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond],U(t))}function X(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function Z(t){if(t._f===ve.ISO_8601)return void J(t);t._a=[],t._pf.empty=!0;var e,i,s,o,n,r=P(t._l),a=""+t._i,h=a.length,d=0;for(s=Y(t._f,r).match(Pe)||[],e=0;e0&&t._pf.unusedInput.push(n),a=a.slice(a.indexOf(i)+i.length),d+=i.length),pi[o]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(o),G(o,i,t)):t._strict&&!i&&t._pf.unusedTokens.push(o);t._pf.charsLeftOver=h-d,a.length>0&&t._pf.unusedInput.push(a),t._isPm&&t._a[Ee]<12&&(t._a[Ee]+=12),t._isPm===!1&&12===t._a[Ee]&&(t._a[Ee]=0),U(t),L(t)}function q(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,s,o){return e||i||s||o})}function K(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function $(t){var e,i,s,o,n;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(o=0;on)&&(s=n,i=e));f(t,i||e)}function J(t){var e,i,s=t._i,o=ti.exec(s);if(o){for(t._pf.iso=!0,e=0,i=ii.length;i>e;e++)if(ii[e][1].exec(s)){t._f=ii[e][0]+(o[6]||" ");break}for(e=0,i=si.length;i>e;e++)if(si[e][1].exec(s)){t._f+=si[e][0];break}s.match(je)&&(t._f+="Z"),Z(t)}else t._isValid=!1}function Q(t){J(t),t._isValid===!1&&(delete t._isValid,ve.createFromInputFallback(t))}function te(t){var e=t._i,i=Ie.exec(e);e===n?t._d=new Date:i?t._d=new Date(+i[1]):"string"==typeof e?Q(t):b(e)?(t._a=e.slice(0),U(t)):_(e)?t._d=new Date(+e):"object"==typeof e?V(t):"number"==typeof e?t._d=new Date(e):ve.createFromInputFallback(t)}function ee(t,e,i,s,o,n,r){var a=new Date(t,e,i,s,o,n,r);return 1970>t&&a.setFullYear(t),a}function ie(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function se(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function oe(t,e,i,s,o){return o.relativeTime(e||1,!!i,t,s)}function ne(t,e,i){var s=we(Math.abs(t)/1e3),o=we(s/60),n=we(o/60),r=we(n/24),a=we(r/365),h=s0,h[4]=i,oe.apply({},h)}function re(t,e,i){var s,o=i-e,n=i-t.day();return n>o&&(n-=7),o-7>n&&(n+=7),s=ve(t).add("d",n),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function ae(t,e,i,s,o){var n,r,a=ie(t,0,1).getUTCDay();return a=0===a?7:a,i=null!=i?i:o,n=o-a+(a>s?7:0)-(o>a?7:0),r=7*(e-1)+(i-o)+n+1,{year:r>0?t:t-1,dayOfYear:r>0?r:T(t-1)+r}}function he(t){var e=t._i,i=t._f;return null===e||i===n&&""===e?ve.invalid({nullInput:!0}):("string"==typeof e&&(t._i=e=P().preparse(e)),ve.isMoment(e)?(t=m(e),t._d=new Date(+e._d)):i?b(i)?$(t):Z(t):te(t),new p(t))}function de(t,e){var i,s;if(1===e.length&&b(e[0])&&(e=e[0]),!e.length)return ve();for(i=e[0],s=1;s=0?"+":"-";return e+v(Math.abs(t),6)},gg:function(){return v(this.weekYear()%100,2)},gggg:function(){return v(this.weekYear(),4)},ggggg:function(){return v(this.weekYear(),5)},GG:function(){return v(this.isoWeekYear()%100,2)},GGGG:function(){return v(this.isoWeekYear(),4)},GGGGG:function(){return v(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return C(this.milliseconds()/100)},SS:function(){return v(C(this.milliseconds()/10),2)},SSS:function(){return v(this.milliseconds(),3)},SSSS:function(){return v(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+v(C(t/60),2)+":"+v(C(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+v(C(t/60),2)+v(C(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},ui=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];li.length;)be=li.pop(),pi[be+"o"]=l(pi[be],be);for(;ci.length;)be=ci.pop(),pi[be+be]=d(pi[be],2);for(pi.DDDD=d(pi.DDD,3),f(c.prototype,{set:function(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t){var e,i,s;for(this._monthsParse||(this._monthsParse=[]),e=0;12>e;e++)if(this._monthsParse[e]||(i=ve.utc([2e3,e]),s="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[e]=new RegExp(s.replace(".",""),"i")),this._monthsParse[e].test(t))return e},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,i,s;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(i=ve([2e3,1]).day(e),s="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(s.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e){var i=this._calendar[t];return"function"==typeof i?i.apply(e):i},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,i,s){var o=this._relativeTime[i];return"function"==typeof o?o(t,e,i,s):o.replace(/%d/i,t)},pastFuture:function(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",preparse:function(t){return t},postformat:function(t){return t},week:function(t){return re(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),ve=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._i=t,o._f=e,o._l=i,o._strict=s,o._isUTC=!1,o._pf=a(),he(o)},ve.suppressDeprecationWarnings=!1,ve.createFromInputFallback=h("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i)}),ve.min=function(){var t=[].slice.call(arguments,0);return de("isBefore",t)},ve.max=function(){var t=[].slice.call(arguments,0);return de("isAfter",t)},ve.utc=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._useUTC=!0,o._isUTC=!0,o._l=i,o._i=t,o._f=e,o._strict=s,o._pf=a(),he(o).utc()},ve.unix=function(t){return ve(1e3*t)},ve.duration=function(t,e){var i,s,o,n=t,r=null;return ve.isDuration(t)?n={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(n={},e?n[e]=t:n.milliseconds=t):(r=Ae.exec(t))?(i="-"===r[1]?-1:1,n={y:0,d:C(r[Ce])*i,h:C(r[Ee])*i,m:C(r[De])*i,s:C(r[Te])*i,ms:C(r[Oe])*i}):(r=ze.exec(t))&&(i="-"===r[1]?-1:1,o=function(t){var e=t&&parseFloat(t.replace(",","."));return(isNaN(e)?0:e)*i},n={y:o(r[2]),M:o(r[3]),d:o(r[4]),h:o(r[5]),m:o(r[6]),s:o(r[7]),w:o(r[8])}),s=new u(n),ve.isDuration(t)&&t.hasOwnProperty("_lang")&&(s._lang=t._lang),s},ve.version=_e,ve.defaultFormat=ei,ve.ISO_8601=function(){},ve.momentProperties=ke,ve.updateOffset=function(){},ve.relativeTimeThreshold=function(t,e){return di[t]===n?!1:(di[t]=e,!0)},ve.lang=function(t,e){var i;return t?(e?A(N(t),e):null===e?(z(t),t="en"):Le[t]||P(t),i=ve.duration.fn._lang=ve.fn._lang=P(t),i._abbr):ve.fn._lang._abbr},ve.langData=function(t){return t&&t._lang&&t._lang._abbr&&(t=t._lang._abbr),P(t)},ve.isMoment=function(t){return t instanceof p||null!=t&&t.hasOwnProperty("_isAMomentObject")},ve.isDuration=function(t){return t instanceof u},be=ui.length-1;be>=0;--be)M(ui[be]);ve.normalizeUnits=function(t){return w(t)},ve.invalid=function(t){var e=ve.utc(0/0);return null!=t?f(e._pf,t):e._pf.userInvalidated=!0,e},ve.parseZone=function(){return ve.apply(null,arguments).parseZone()},ve.parseTwoDigitYear=function(t){return C(t)+(C(t)>68?1900:2e3)},f(ve.fn=p.prototype,{clone:function(){return ve(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var t=ve(this).utc();return 00:!1},parsingFlags:function(){return f({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(t){var e=H(this,t||ve.defaultFormat);return this.lang().postformat(e)},add:function(t,e){var i;return i="string"==typeof t&&"string"==typeof e?ve.duration(isNaN(+e)?+t:+e,isNaN(+e)?e:t):"string"==typeof t?ve.duration(+e,t):ve.duration(t,e),y(this,i,1),this},subtract:function(t,e){var i;return i="string"==typeof t&&"string"==typeof e?ve.duration(isNaN(+e)?+t:+e,isNaN(+e)?e:t):"string"==typeof t?ve.duration(+e,t):ve.duration(t,e),y(this,i,-1),this},diff:function(t,e,i){var s,o,n=I(t,this),r=6e4*(this.zone()-n.zone());return e=w(e),"year"===e||"month"===e?(s=432e5*(this.daysInMonth()+n.daysInMonth()),o=12*(this.year()-n.year())+(this.month()-n.month()),o+=(this-ve(this).startOf("month")-(n-ve(n).startOf("month")))/s,o-=6e4*(this.zone()-ve(this).startOf("month").zone()-(n.zone()-ve(n).startOf("month").zone()))/s,"year"===e&&(o/=12)):(s=this-n,o="second"===e?s/1e3:"minute"===e?s/6e4:"hour"===e?s/36e5:"day"===e?(s-r)/864e5:"week"===e?(s-r)/6048e5:s),i?o:g(o)},from:function(t,e){return ve.duration(this.diff(t)).lang(this.lang()._abbr).humanize(!e)},fromNow:function(t){return this.from(ve(),t)},calendar:function(t){var e=t||ve(),i=I(e,this).startOf("day"),s=this.diff(i,"days",!0),o=-6>s?"sameElse":-1>s?"lastWeek":0>s?"lastDay":1>s?"sameDay":2>s?"nextDay":7>s?"nextWeek":"sameElse";return this.format(this.lang().calendar(o,this))},isLeapYear:function(){return O(this.year())},isDST:function(){return this.zone()+ve(t).startOf(e)},isBefore:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)<+ve(t).startOf(e)},isSame:function(t,e){return e=e||"ms",+this.clone().startOf(e)===+I(t,this).startOf(e)},min:h("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(t){return t=ve.apply(null,arguments),this>t?this:t}),max:h("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(t){return t=ve.apply(null,arguments),t>this?this:t}),zone:function(t,e){var i=this._offset||0;return null==t?this._isUTC?i:this._d.getTimezoneOffset():("string"==typeof t&&(t=W(t)),Math.abs(t)<16&&(t=60*t),this._offset=t,this._isUTC=!0,i!==t&&(!e||this._changeInProgress?y(this,ve.duration(i-t,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,ve.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(t){return t=t?ve(t).zone():0,(this.zone()-t)%60===0},daysInMonth:function(){return E(this.year(),this.month())},dayOfYear:function(t){var e=we((ve(this).startOf("day")-ve(this).startOf("year"))/864e5)+1;return null==t?e:this.add("d",t-e)},quarter:function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},weekYear:function(t){var e=re(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==t?e:this.add("y",t-e)},isoWeekYear:function(t){var e=re(this,1,4).year;return null==t?e:this.add("y",t-e)},week:function(t){var e=this.lang().week(this);return null==t?e:this.add("d",7*(t-e))},isoWeek:function(t){var e=re(this,1,4).week;return null==t?e:this.add("d",7*(t-e))},weekday:function(t){var e=(this.day()+7-this.lang()._week.dow)%7;return null==t?e:this.add("d",t-e)},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},isoWeeksInYear:function(){return D(this.year(),1,4)},weeksInYear:function(){var t=this._lang._week; +return D(this.year(),t.dow,t.doy)},get:function(t){return t=w(t),this[t]()},set:function(t,e){return t=w(t),"function"==typeof this[t]&&this[t](e),this},lang:function(t){return t===n?this._lang:(this._lang=P(t),this)}}),ve.fn.millisecond=ve.fn.milliseconds=ue("Milliseconds",!1),ve.fn.second=ve.fn.seconds=ue("Seconds",!1),ve.fn.minute=ve.fn.minutes=ue("Minutes",!1),ve.fn.hour=ve.fn.hours=ue("Hours",!0),ve.fn.date=ue("Date",!0),ve.fn.dates=h("dates accessor is deprecated. Use date instead.",ue("Date",!0)),ve.fn.year=ue("FullYear",!0),ve.fn.years=h("years accessor is deprecated. Use year instead.",ue("FullYear",!0)),ve.fn.days=ve.fn.day,ve.fn.months=ve.fn.month,ve.fn.weeks=ve.fn.week,ve.fn.isoWeeks=ve.fn.isoWeek,ve.fn.quarters=ve.fn.quarter,ve.fn.toJSON=ve.fn.toISOString,f(ve.duration.fn=u.prototype,{_bubble:function(){var t,e,i,s,o=this._milliseconds,n=this._days,r=this._months,a=this._data;a.milliseconds=o%1e3,t=g(o/1e3),a.seconds=t%60,e=g(t/60),a.minutes=e%60,i=g(e/60),a.hours=i%24,n+=g(i/24),a.days=n%30,r+=g(n/30),a.months=r%12,s=g(r/12),a.years=s},weeks:function(){return g(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*C(this._months/12)},humanize:function(t){var e=+this,i=ne(e,!t,this.lang());return t&&(i=this.lang().pastFuture(e,i)),this.lang().postformat(i)},add:function(t,e){var i=ve.duration(t,e);return this._milliseconds+=i._milliseconds,this._days+=i._days,this._months+=i._months,this._bubble(),this},subtract:function(t,e){var i=ve.duration(t,e);return this._milliseconds-=i._milliseconds,this._days-=i._days,this._months-=i._months,this._bubble(),this},get:function(t){return t=w(t),this[t.toLowerCase()+"s"]()},as:function(t){return t=w(t),this["as"+t.charAt(0).toUpperCase()+t.slice(1)+"s"]()},lang:ve.fn.lang,toIsoString:function(){var t=Math.abs(this.years()),e=Math.abs(this.months()),i=Math.abs(this.days()),s=Math.abs(this.hours()),o=Math.abs(this.minutes()),n=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(t?t+"Y":"")+(e?e+"M":"")+(i?i+"D":"")+(s||o||n?"T":"")+(s?s+"H":"")+(o?o+"M":"")+(n?n+"S":""):"P0D"}});for(be in ni)ni.hasOwnProperty(be)&&(me(be,ni[be]),fe(be.toLowerCase()));me("Weeks",6048e5),ve.duration.fn.asMonths=function(){return(+this-31536e6*this.years())/2592e6+12*this.years()},ve.lang("en",{ordinal:function(t){var e=t%10,i=1===C(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),Ne?o.exports=ve:(s=function(t,e,i){return i.config&&i.config()&&i.config().noGlobal===!0&&(xe.moment=ye),ve}.call(e,i,e,o),!(s!==n&&(o.exports=s)),ge(!0))}).call(this)}).call(e,function(){return this}(),i(64)(t))},function(t,e,i){var s;!function(o,n){"use strict";function r(){a.READY||(w.determineEventTypes(),x.each(a.gestures,function(t){M.register(t)}),w.onTouch(a.DOCUMENT,v,M.detect),w.onTouch(a.DOCUMENT,y,M.detect),a.READY=!0)}var a=function C(t,e){return new C.Instance(t,e||{})};a.VERSION="1.1.3",a.defaults={behavior:{userSelect:"none",touchAction:"pan-y",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},a.DOCUMENT=document,a.HAS_POINTEREVENTS=navigator.pointerEnabled||navigator.msPointerEnabled,a.HAS_TOUCHEVENTS="ontouchstart"in o,a.IS_MOBILE=/mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent),a.NO_MOUSEEVENTS=a.HAS_TOUCHEVENTS&&a.IS_MOBILE||a.HAS_POINTEREVENTS,a.CALCULATE_INTERVAL=25;var h={},d=a.DIRECTION_DOWN="down",l=a.DIRECTION_LEFT="left",c=a.DIRECTION_UP="up",p=a.DIRECTION_RIGHT="right",u=a.POINTER_MOUSE="mouse",f=a.POINTER_TOUCH="touch",m=a.POINTER_PEN="pen",g=a.EVENT_START="start",v=a.EVENT_MOVE="move",y=a.EVENT_END="end",b=a.EVENT_RELEASE="release",_=a.EVENT_TOUCH="touch";a.READY=!1,a.plugins=a.plugins||{},a.gestures=a.gestures||{};var x=a.utils={extend:function(t,e,i){for(var s in e)!e.hasOwnProperty(s)||t[s]!==n&&i||(t[s]=e[s]);return t},on:function(t,e,i){t.addEventListener(e,i,!1)},off:function(t,e,i){t.removeEventListener(e,i,!1)},each:function(t,e,i){var s,o;if("forEach"in t)t.forEach(e,i);else if(t.length!==n){for(s=0,o=t.length;o>s;s++)if(e.call(i,t[s],s,t)===!1)return}else for(s in t)if(t.hasOwnProperty(s)&&e.call(i,t[s],s,t)===!1)return},inStr:function(t,e){return t.indexOf(e)>-1},inArray:function(t,e){if(t.indexOf){var i=t.indexOf(e);return-1===i?!1:i}for(var s=0,o=t.length;o>s;s++)if(t[s]===e)return s;return!1},toArray:function(t){return Array.prototype.slice.call(t,0)},hasParent:function(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1},getCenter:function(t){var e=[],i=[],s=[],o=[],n=Math.min,r=Math.max;return 1===t.length?{pageX:t[0].pageX,pageY:t[0].pageY,clientX:t[0].clientX,clientY:t[0].clientY}:(x.each(t,function(t){e.push(t.pageX),i.push(t.pageY),s.push(t.clientX),o.push(t.clientY)}),{pageX:(n.apply(Math,e)+r.apply(Math,e))/2,pageY:(n.apply(Math,i)+r.apply(Math,i))/2,clientX:(n.apply(Math,s)+r.apply(Math,s))/2,clientY:(n.apply(Math,o)+r.apply(Math,o))/2})},getVelocity:function(t,e,i){return{x:Math.abs(e/t)||0,y:Math.abs(i/t)||0}},getAngle:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return 180*Math.atan2(s,i)/Math.PI},getDirection:function(t,e){var i=Math.abs(t.clientX-e.clientX),s=Math.abs(t.clientY-e.clientY);return i>=s?t.clientX-e.clientX>0?l:p:t.clientY-e.clientY>0?c:d},getDistance:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return Math.sqrt(i*i+s*s)},getScale:function(t,e){return t.length>=2&&e.length>=2?this.getDistance(e[0],e[1])/this.getDistance(t[0],t[1]):1},getRotation:function(t,e){return t.length>=2&&e.length>=2?this.getAngle(e[1],e[0])-this.getAngle(t[1],t[0]):0},isVertical:function(t){return t==c||t==d},setPrefixedCss:function(t,e,i,s){var o=["","Webkit","Moz","O","ms"];e=x.toCamelCase(e);for(var n=0;n0&&this.started&&(r=v),this.started=!0;var d=this.collectEventData(i,r,o,t);return e!=y&&s.call(M,d),a&&(d.changedLength=h,d.eventType=a,s.call(M,d),d.eventType=r,delete d.changedLength),r==y&&(s.call(M,d),this.started=!1),r},determineEventTypes:function(){var t;return t=a.HAS_POINTEREVENTS?o.PointerEvent?["pointerdown","pointermove","pointerup pointercancel lostpointercapture"]:["MSPointerDown","MSPointerMove","MSPointerUp MSPointerCancel MSLostPointerCapture"]:a.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],h[g]=t[0],h[v]=t[1],h[y]=t[2],h},getTouchList:function(t,e){if(a.HAS_POINTEREVENTS)return S.getTouchList();if(t.touches){if(e==v)return t.touches;var i=[],s=[].concat(x.toArray(t.touches),x.toArray(t.changedTouches)),o=[];return x.each(s,function(t){x.inArray(i,t.identifier)===!1&&o.push(t),i.push(t.identifier)}),o}return t.identifier=1,[t]},collectEventData:function(t,e,i,s){var o=f;return x.inStr(s.type,"mouse")||S.matchType(u,s)?o=u:S.matchType(m,s)&&(o=m),{center:x.getCenter(i),timeStamp:Date.now(),target:s.target,touches:i,eventType:e,pointerType:o,srcEvent:s,preventDefault:function(){var t=this.srcEvent;t.preventManipulation&&t.preventManipulation(),t.preventDefault&&t.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return M.stopDetect()}}}},S=a.PointerEvent={pointers:{},getTouchList:function(){var t=[];return x.each(this.pointers,function(e){t.push(e)}),t},updatePointer:function(t,e){t==y||t!=y&&1!==e.buttons?delete this.pointers[e.pointerId]:(e.identifier=e.pointerId,this.pointers[e.pointerId]=e)},matchType:function(t,e){if(!e.pointerType)return!1;var i=e.pointerType,s={};return s[u]=i===(e.MSPOINTER_TYPE_MOUSE||u),s[f]=i===(e.MSPOINTER_TYPE_TOUCH||f),s[m]=i===(e.MSPOINTER_TYPE_PEN||m),s[t]},reset:function(){this.pointers={}}},M=a.detection={gestures:[],current:null,previous:null,stopped:!1,startDetect:function(t,e){this.current||(this.stopped=!1,this.current={inst:t,startEvent:x.extend({},e),lastEvent:!1,lastCalcEvent:!1,futureCalcEvent:!1,lastCalcData:{},name:""},this.detect(e))},detect:function(t){if(this.current&&!this.stopped){t=this.extendEventData(t);var e=this.current.inst,i=e.options;return x.each(this.gestures,function(s){!this.stopped&&e.enabled&&i[s.name]&&s.handler.call(s,t,e)},this),this.current&&(this.current.lastEvent=t),t.eventType==y&&this.stopDetect(),t}},stopDetect:function(){this.previous=x.extend({},this.current),this.current=null,this.stopped=!0},getCalculatedData:function(t,e,i,s,o){var n=this.current,r=!1,h=n.lastCalcEvent,d=n.lastCalcData;h&&t.timeStamp-h.timeStamp>a.CALCULATE_INTERVAL&&(e=h.center,i=t.timeStamp-h.timeStamp,s=t.center.clientX-h.center.clientX,o=t.center.clientY-h.center.clientY,r=!0),(t.eventType==_||t.eventType==b)&&(n.futureCalcEvent=t),(!n.lastCalcEvent||r)&&(d.velocity=x.getVelocity(i,s,o),d.angle=x.getAngle(e,t.center),d.direction=x.getDirection(e,t.center),n.lastCalcEvent=n.futureCalcEvent||t,n.futureCalcEvent=t),t.velocityX=d.velocity.x,t.velocityY=d.velocity.y,t.interimAngle=d.angle,t.interimDirection=d.direction},extendEventData:function(t){var e=this.current,i=e.startEvent,s=e.lastEvent||i;(t.eventType==_||t.eventType==b)&&(i.touches=[],x.each(t.touches,function(t){i.touches.push({clientX:t.clientX,clientY:t.clientY})}));var o=t.timeStamp-i.timeStamp,n=t.center.clientX-i.center.clientX,r=t.center.clientY-i.center.clientY;return this.getCalculatedData(t,s.center,o,n,r),x.extend(t,{startEvent:i,deltaTime:o,deltaX:n,deltaY:r,distance:x.getDistance(i.center,t.center),angle:x.getAngle(i.center,t.center),direction:x.getDirection(i.center,t.center),scale:x.getScale(i.touches,t.touches),rotation:x.getRotation(i.touches,t.touches)}),t},register:function(t){var e=t.defaults||{};return e[t.name]===n&&(e[t.name]=!0),x.extend(a.defaults,e,!0),t.index=t.index||1e3,this.gestures.push(t),this.gestures.sort(function(t,e){return t.indexe.index?1:0}),this.gestures}};a.Instance=function(t,e){var i=this;r(),this.element=t,this.enabled=!0,x.each(e,function(t,i){delete e[i],e[x.toCamelCase(i)]=t}),this.options=x.extend(x.extend({},a.defaults),e||{}),this.options.behavior&&x.toggleBehavior(this.element,this.options.behavior,!0),this.eventStartHandler=w.onTouch(t,g,function(t){i.enabled&&t.eventType==g?M.startDetect(i,t):t.eventType==_&&M.detect(t)}),this.eventHandlers=[]},a.Instance.prototype={on:function(t,e){var i=this;return w.on(i.element,t,e,function(t){i.eventHandlers.push({gesture:t,handler:e})}),i},off:function(t,e){var i=this;return w.off(i.element,t,e,function(t){var s=x.inArray({gesture:t,handler:e});s!==!1&&i.eventHandlers.splice(s,1)}),i},trigger:function(t,e){e||(e={});var i=a.DOCUMENT.createEvent("Event");i.initEvent(t,!0,!0),i.gesture=e;var s=this.element;return x.hasParent(e.target,s)&&(s=e.target),s.dispatchEvent(i),this},enable:function(t){return this.enabled=t,this},dispose:function(){var t,e;for(x.toggleBehavior(this.element,this.options.behavior,!1),t=-1;e=this.eventHandlers[++t];)x.off(this.element,e.gesture,e.handler);return this.eventHandlers=[],w.off(this.element,h[g],this.eventStartHandler),null}},function(t){function e(e,s){var o=M.current;if(!(s.options.dragMaxTouches>0&&e.touches.length>s.options.dragMaxTouches))switch(e.eventType){case g:i=!1;break;case v:if(e.distance0)){var r=Math.abs(s.options.dragMinDistance/e.distance);n.pageX+=e.deltaX*r,n.pageY+=e.deltaY*r,n.clientX+=e.deltaX*r,n.clientY+=e.deltaY*r,e=M.extendEventData(e)}(o.lastEvent.dragLockToAxis||s.options.dragLockToAxis&&s.options.dragLockMinDistance<=e.distance)&&(e.dragLockToAxis=!0);var a=o.lastEvent.direction;e.dragLockToAxis&&a!==e.direction&&(e.direction=x.isVertical(a)?e.deltaY<0?c:d:e.deltaX<0?l:p),i||(s.trigger(t+"start",e),i=!0),s.trigger(t,e),s.trigger(t+e.direction,e);var h=x.isVertical(e.direction);(s.options.dragBlockVertical&&h||s.options.dragBlockHorizontal&&!h)&&e.preventDefault();break;case b:i&&e.changedLength<=s.options.dragMaxTouches&&(s.trigger(t+"end",e),i=!1);break;case y:i=!1}}var i=!1;a.gestures.Drag={name:t,index:50,handler:e,defaults:{dragMinDistance:10,dragDistanceCorrection:!0,dragMaxTouches:1,dragBlockHorizontal:!1,dragBlockVertical:!1,dragLockToAxis:!1,dragLockMinDistance:25}}}("drag"),a.gestures.Gesture={name:"gesture",index:1337,handler:function(t,e){e.trigger(this.name,t)}},function(t){function e(e,s){var o=s.options,n=M.current;switch(e.eventType){case g:clearTimeout(i),n.name=t,i=setTimeout(function(){n&&n.name==t&&s.trigger(t,e)},o.holdTimeout);break;case v:e.distance>o.holdThreshold&&clearTimeout(i);break;case b:clearTimeout(i)}}var i;a.gestures.Hold={name:t,index:10,defaults:{holdTimeout:500,holdThreshold:2},handler:e}}("hold"),a.gestures.Release={name:"release",index:1/0,handler:function(t,e){t.eventType==b&&e.trigger(this.name,t)}},a.gestures.Swipe={name:"swipe",index:40,defaults:{swipeMinTouches:1,swipeMaxTouches:1,swipeVelocityX:.6,swipeVelocityY:.6},handler:function(t,e){if(t.eventType==b){var i=t.touches.length,s=e.options;if(is.swipeMaxTouches)return;(t.velocityX>s.swipeVelocityX||t.velocityY>s.swipeVelocityY)&&(e.trigger(this.name,t),e.trigger(this.name+t.direction,t))}}},function(t){function e(e,s){var o,n,r=s.options,a=M.current,h=M.previous;switch(e.eventType){case g:i=!1;break;case v:i=i||e.distance>r.tapMaxDistance;break;case y:!x.inStr(e.srcEvent.type,"cancel")&&e.deltaTimes.options.transformMinRotation&&s.trigger("rotate",e),o>s.options.transformMinScale&&(s.trigger("pinch",e),s.trigger("pinch"+(e.scale<1?"in":"out"),e));break;case b:i&&e.changedLength<2&&(s.trigger(t+"end",e),i=!1)}}var i=!1;a.gestures.Transform={name:t,index:45,defaults:{transformMinScale:.01,transformMinRotation:1},handler:e}}("transform"),s=function(){return a}.call(e,i,e,t),!(s!==n&&(t.exports=s))}(window)},function(t,e){e.startWithClustering=function(){this.clusterToFit(this.constants.clustering.initialMaxNodes,!0),this.updateLabels(),this.stabilize&&this._stabilize(),this.start()},e.clusterToFit=function(t,e){for(var i=this.nodeIndices.length,s=50,o=0;i>t&&s>o;)o%3==0?(this.forceAggregateHubs(!0),this.normalizeClusterLevels()):this.increaseClusterLevel(),i=this.nodeIndices.length,o+=1;o>0&&1==e&&this.repositionNodes(),this._updateCalculationNodes()},e.openCluster=function(t){var e=this.moving;if(t.clusterSize>this.constants.clustering.sectorThreshold&&this._nodeInActiveArea(t)&&("default"!=this._sector()||1!=this.nodeIndices.length)){this._addSector(t);for(var i=0;this.nodeIndices.lengthi;)this.decreaseClusterLevel(),i+=1}else this._expandClusterNode(t,!1,!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this._updateCalculationNodes(),this.updateLabels();this.moving!=e&&this.start()},e.updateClustersDefault=function(){1==this.constants.clustering.enabled&&this.updateClusters(0,!1,!1)},e.increaseClusterLevel=function(){this.updateClusters(-1,!1,!0)},e.decreaseClusterLevel=function(){this.updateClusters(1,!1,!0)},e.updateClusters=function(t,e,i,s){var o=this.moving,n=this.nodeIndices.length;this.previousScale>this.scale&&0==t&&this._collapseSector(),this.previousScale>this.scale||-1==t?this._formClusters(i):(this.previousScalethis.scale||-1==t)&&(this._aggregateHubs(i),this._updateNodeIndexList()),(this.previousScale>this.scale||-1==t)&&(this.handleChains(),this._updateNodeIndexList()),this.previousScale=this.scale,this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.lengththis.constants.clustering.chainThreshold&&this._reduceAmountOfChains(1-this.constants.clustering.chainThreshold/t)},e._aggregateHubs=function(t){this._getHubSize(),this._formClustersByHub(t,!1)},e.forceAggregateHubs=function(t){var e=this.moving,i=this.nodeIndices.length;this._aggregateHubs(!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.length!=i&&(this.clusterSession+=1),(0==t||void 0===t)&&this.moving!=e&&this.start()},e._openClustersBySize=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];1==e.inView()&&(e.width*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientWidth||e.height*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientHeight)&&this.openCluster(e)}},e._openClusters=function(t,e){for(var i=0;i1&&(t.clusterSizei)){var r=n.from,a=n.to;n.to.options.mass>n.from.options.mass&&(r=n.to,a=n.from),1==a.dynamicEdgesLength?this._addToCluster(r,a,!1):1==r.dynamicEdgesLength&&this._addToCluster(a,r,!1)}}},e._forceClustersByZoom=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];if(1==e.dynamicEdgesLength&&0!=e.dynamicEdges.length){var i=e.dynamicEdges[0],s=i.toId==e.id?this.nodes[i.fromId]:this.nodes[i.toId];e.id!=s.id&&(s.options.mass>e.options.mass?this._addToCluster(s,e,!0):this._addToCluster(e,s,!0))}}},e._clusterToSmallestNeighbour=function(t){for(var e=-1,i=null,s=0;so.clusterSessions.length&&(e=o.clusterSessions.length,i=o)}null!=o&&void 0!==this.nodes[o.id]&&this._addToCluster(o,t,!0)},e._formClustersByHub=function(t,e){for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&this._formClusterFromHub(this.nodes[i],t,e)},e._formClusterFromHub=function(t,e,i,s){if(void 0===s&&(s=0),t.dynamicEdgesLength>=this.hubThreshold&&0==i||t.dynamicEdgesLength==this.hubThreshold&&1==i){for(var o,n,r,a=this.constants.clustering.clusterEdgeThreshold/this.scale,h=!1,d=[],l=t.dynamicEdges.length,c=0;l>c;c++)d.push(t.dynamicEdges[c].id);if(0==e)for(h=!1,c=0;l>c;c++){var p=this.edges[d[c]];if(void 0!==p&&p.connected&&p.toId!=p.fromId&&(o=p.to.x-p.from.x,n=p.to.y-p.from.y,r=Math.sqrt(o*o+n*n),a>r)){h=!0;break}}if(!e&&h||e)for(c=0;l>c;c++)if(p=this.edges[d[c]],void 0!==p){var u=this.nodes[p.fromId==t.id?p.toId:p.fromId];u.dynamicEdges.length<=this.hubThreshold+s&&u.id!=t.id&&this._addToCluster(t,u,e)}}},e._addToCluster=function(t,e,i){t.containedNodes[e.id]=e;for(var s=0;s1)for(var s=0;s1&&(e.label="[".concat(String(e.clusterSize),"]"))}for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(e=this.nodes[t],1==e.clusterSize&&(e.label=void 0!==e.originalLabel?e.originalLabel:String(e.id)))},e.normalizeClusterLevels=function(){var t,e=0,i=1e9,s=0;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(s=this.nodes[t].clusterSessions.length,s>e&&(e=s),i>s&&(i=s));if(e-i>this.constants.clustering.clusterLevelDifference){var o=this.nodeIndices.length,n=e-this.constants.clustering.clusterLevelDifference;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodes[t].clusterSessions.lengths&&(s=n.dynamicEdgesLength),t+=n.dynamicEdgesLength,e+=Math.pow(n.dynamicEdgesLength,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r);this.hubThreshold=Math.floor(t+2*a),this.hubThreshold>s&&(this.hubThreshold=s)},e._reduceAmountOfChains=function(t){this.hubThreshold=2;var e=Math.floor(this.nodeIndices.length*t);for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&e>0&&(this._formClusterFromHub(this.nodes[i],!0,!0,1),e-=1)},e._getChainFraction=function(){var t=0,e=0;for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&(2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&(t+=1),e+=1);return t/e}},function(t,e,i){var s=i(1);e._putDataInSector=function(){this.sectors.active[this._sector()].nodes=this.nodes,this.sectors.active[this._sector()].edges=this.edges,this.sectors.active[this._sector()].nodeIndices=this.nodeIndices},e._switchToSector=function(t,e){void 0===e||"active"==e?this._switchToActiveSector(t):this._switchToFrozenSector(t)},e._switchToActiveSector=function(t){this.nodeIndices=this.sectors.active[t].nodeIndices,this.nodes=this.sectors.active[t].nodes,this.edges=this.sectors.active[t].edges},e._switchToSupportSector=function(){this.nodeIndices=this.sectors.support.nodeIndices,this.nodes=this.sectors.support.nodes,this.edges=this.sectors.support.edges},e._switchToFrozenSector=function(t){this.nodeIndices=this.sectors.frozen[t].nodeIndices,this.nodes=this.sectors.frozen[t].nodes,this.edges=this.sectors.frozen[t].edges},e._loadLatestSector=function(){this._switchToSector(this._sector())},e._sector=function(){return this.activeSector[this.activeSector.length-1]},e._previousSector=function(){if(this.activeSector.length>1)return this.activeSector[this.activeSector.length-2];throw new TypeError("there are not enough sectors in the this.activeSector array.")},e._setActiveSector=function(t){this.activeSector.push(t)},e._forgetLastSector=function(){this.activeSector.pop()},e._createNewSector=function(t){this.sectors.active[t]={nodes:{},edges:{},nodeIndices:[],formationScale:this.scale,drawingNode:void 0},this.sectors.active[t].drawingNode=new Node({id:t,color:{background:"#eaefef",border:"495c5e"}},{},{},this.constants),this.sectors.active[t].drawingNode.clusterSize=2},e._deleteActiveSector=function(t){delete this.sectors.active[t]},e._deleteFrozenSector=function(t){delete this.sectors.frozen[t]},e._freezeSector=function(t){this.sectors.frozen[t]=this.sectors.active[t],this._deleteActiveSector(t)},e._activateSector=function(t){this.sectors.active[t]=this.sectors.frozen[t],this._deleteFrozenSector(t)},e._mergeThisWithFrozen=function(t){for(var e in this.nodes)this.nodes.hasOwnProperty(e)&&(this.sectors.frozen[t].nodes[e]=this.nodes[e]);for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.sectors.frozen[t].edges[i]=this.edges[i]);for(var s=0;s1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInSupportSector=function(t,e){if(void 0===e)this._switchToSupportSector(),this[t]();else{this._switchToSupportSector();var i=Array.prototype.splice.call(arguments,1);i.length>1?this[t](i[0],i[1]):this[t](e)}this._loadLatestSector()},e._doInAllFrozenSectors=function(t,e){if(void 0===e)for(var i in this.sectors.frozen)this.sectors.frozen.hasOwnProperty(i)&&(this._switchToFrozenSector(i),this[t]());else for(var i in this.sectors.frozen)if(this.sectors.frozen.hasOwnProperty(i)){this._switchToFrozenSector(i); +var s=Array.prototype.splice.call(arguments,1);s.length>1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInAllSectors=function(t,e){var i=Array.prototype.splice.call(arguments,1);void 0===e?(this._doInAllActiveSectors(t),this._doInAllFrozenSectors(t)):i.length>1?(this._doInAllActiveSectors(t,i[0],i[1]),this._doInAllFrozenSectors(t,i[0],i[1])):(this._doInAllActiveSectors(t,e),this._doInAllFrozenSectors(t,e))},e._clearNodeIndexList=function(){var t=this._sector();this.sectors.active[t].nodeIndices=[],this.nodeIndices=this.sectors.active[t].nodeIndices},e._drawSectorNodes=function(t,e){var i,s=1e9,o=-1e9,n=1e9,r=-1e9;for(var a in this.sectors[e])if(this.sectors[e].hasOwnProperty(a)&&void 0!==this.sectors[e][a].drawingNode){this._switchToSector(a,e),s=1e9,o=-1e9,n=1e9,r=-1e9;for(var h in this.nodes)this.nodes.hasOwnProperty(h)&&(i=this.nodes[h],i.resize(t),n>i.x-.5*i.width&&(n=i.x-.5*i.width),ri.y-.5*i.height&&(s=i.y-.5*i.height),o0?this.nodes[i[i.length-1]]:null},e._getEdgesOverlappingWith=function(t,e){var i=this.edges;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},e._getAllEdgesOverlappingWith=function(t){var e=[];return this._doInAllActiveSectors("_getEdgesOverlappingWith",t,e),e},e._getEdgeAt=function(t){var e=this._pointerToPositionObject(t),i=this._getAllEdgesOverlappingWith(e);return i.length>0?this.edges[i[i.length-1]]:null},e._addToSelection=function(t){t instanceof s?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t},e._addToHover=function(t){t instanceof s?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t},e._removeFromSelection=function(t){t instanceof s?delete this.selectionObj.nodes[t.id]:delete this.selectionObj.edges[t.id]},e._unselectAll=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].unselect();for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&this.selectionObj.edges[i].unselect();this.selectionObj={nodes:{},edges:{}},0==t&&this.emit("select",this.getSelection())},e._unselectClusters=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].clusterSize>1&&(this.selectionObj.nodes[e].unselect(),this._removeFromSelection(this.selectionObj.nodes[e]));0==t&&this.emit("select",this.getSelection())},e._getSelectedNodeCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedNode=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t];return null},e._getSelectedEdge=function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t];return null},e._getSelectedEdgeCount=function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedObjectCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t},e._selectionIsEmpty=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0},e._clusterInSelection=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1},e._selectConnectedEdges=function(t){for(var e=0;ee;e++){s=t[e];var o=this.nodes[s];if(!o)throw new RangeError('Node with id "'+s+'" not found');this._selectObject(o,!0,!0)}console.log("setSelection is deprecated. Please use selectNodes instead."),this.redraw()},e.selectNodes=function(t,e){var i,s,o;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),i=0,s=t.length;s>i;i++){o=t[i];var n=this.nodes[o];if(!n)throw new RangeError('Node with id "'+o+'" not found');this._selectObject(n,!0,!0,e)}this.redraw()},e.selectEdges=function(t){var e,i,s;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),e=0,i=t.length;i>e;e++){s=t[e];var o=this.edges[s];if(!o)throw new RangeError('Edge with id "'+s+'" not found');this._selectObject(o,!0,!0,highlightEdges)}this.redraw()},e._updateSelection=function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},function(t,e,i){var s=i(1),o=i(36),n=i(33);e._clearManipulatorBar=function(){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild)},e._restoreOverloadedFunctions=function(){for(var t in this.cachedFunctions)this.cachedFunctions.hasOwnProperty(t)&&(this[t]=this.cachedFunctions[t])},e._toggleEditMode=function(){this.editMode=!this.editMode;var t=document.getElementById("network-manipulationDiv"),e=document.getElementById("network-manipulation-closeDiv"),i=document.getElementById("network-manipulation-editMode");1==this.editMode?(t.style.display="block",e.style.display="block",i.style.display="none",e.onclick=this._toggleEditMode.bind(this)):(t.style.display="none",e.style.display="none",i.style.display="block",e.onclick=null),this._createManipulatorBar()},e._createManipulatorBar=function(){this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];if(void 0!==this.edgeBeingEdited&&(this.edgeBeingEdited._disableControlNodes(),this.edgeBeingEdited=void 0,this.selectedControlNode=null,this.controlNodesActive=!1),this._restoreOverloadedFunctions(),this.freezeSimulation=!1,this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,1==this.editMode){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDiv.innerHTML=""+t.addNode+"
"+t.addEdge+"",1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?this.manipulationDiv.innerHTML+="
"+t.editNode+"":1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDiv.innerHTML+="
"+t.editEdge+""),0==this._selectionIsEmpty()&&(this.manipulationDiv.innerHTML+="
"+t.del+"");var e=document.getElementById("network-manipulate-addNode");e.onclick=this._createAddNodeToolbar.bind(this);var i=document.getElementById("network-manipulate-connectNode");if(i.onclick=this._createAddEdgeToolbar.bind(this),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit){var s=document.getElementById("network-manipulate-editNode");s.onclick=this._editNode.bind(this)}else if(1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()){var s=document.getElementById("network-manipulate-editEdge");s.onclick=this._createEditEdgeToolbar.bind(this)}if(0==this._selectionIsEmpty()){var o=document.getElementById("network-manipulate-delete");o.onclick=this._deleteSelected.bind(this)}var n=document.getElementById("network-manipulation-closeDiv");n.onclick=this._toggleEditMode.bind(this),this.boundFunction=this._createManipulatorBar.bind(this),this.on("select",this.boundFunction)}else{this.editModeDiv.innerHTML=""+t.edit+"";var r=document.getElementById("network-manipulate-editModeButton");r.onclick=this._toggleEditMode.bind(this)}},e._createAddNodeToolbar=function(){this._clearManipulatorBar(),this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];this.manipulationDiv.innerHTML=""+t.back+"
"+t.addDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._addNode.bind(this),this.on("select",this.boundFunction)},e._createAddEdgeToolbar=function(){this._clearManipulatorBar(),this._unselectAll(!0),this.freezeSimulation=!0;var t=this.constants.locales[this.constants.locale];this.boundFunction&&this.off("select",this.boundFunction),this._unselectAll(),this.forceAppendSelection=!1,this.blockConnectingEdgeSelection=!0,this.manipulationDiv.innerHTML=""+t.back+"
"+t.edgeDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._handleConnect.bind(this),this.on("select",this.boundFunction),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._handleOnRelease=this._handleOnRelease,this._handleTouch=this._handleConnect,this._handleOnRelease=this._finishConnect,this._redraw()},e._createEditEdgeToolbar=function(){this._clearManipulatorBar(),this.controlNodesActive=!0,this.boundFunction&&this.off("select",this.boundFunction),this.edgeBeingEdited=this._getSelectedEdge(),this.edgeBeingEdited._enableControlNodes();var t=this.constants.locales[this.constants.locale];this.manipulationDiv.innerHTML=""+t.back+"
"+t.editEdgeDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._handleOnRelease=this._handleOnRelease,this.cachedFunctions._handleTap=this._handleTap,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleTouch=this._selectControlNode,this._handleTap=function(){},this._handleOnDrag=this._controlNodeDrag,this._handleDragStart=function(){},this._handleOnRelease=this._releaseControlNode,this._redraw()},e._selectControlNode=function(t){this.edgeBeingEdited.controlNodes.from.unselect(),this.edgeBeingEdited.controlNodes.to.unselect(),this.selectedControlNode=this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(t.x),this._YconvertDOMtoCanvas(t.y)),null!==this.selectedControlNode&&(this.selectedControlNode.select(),this.freezeSimulation=!0),this._redraw()},e._controlNodeDrag=function(t){var e=this._getPointer(t.gesture.center);null!==this.selectedControlNode&&void 0!==this.selectedControlNode&&(this.selectedControlNode.x=this._XconvertDOMtoCanvas(e.x),this.selectedControlNode.y=this._YconvertDOMtoCanvas(e.y)),this._redraw()},e._releaseControlNode=function(t){var e=this._getNodeAt(t);null!=e?(1==this.edgeBeingEdited.controlNodes.from.selected&&(this._editEdge(e.id,this.edgeBeingEdited.to.id),this.edgeBeingEdited.controlNodes.from.unselect()),1==this.edgeBeingEdited.controlNodes.to.selected&&(this._editEdge(this.edgeBeingEdited.from.id,e.id),this.edgeBeingEdited.controlNodes.to.unselect())):this.edgeBeingEdited._restoreControlNodes(),this.freezeSimulation=!1,this._redraw()},e._handleConnect=function(t){if(0==this._getSelectedNodeCount()){var e=this._getNodeAt(t);null!=e&&(e.clusterSize>1?alert(this.constants.locales[this.constants.locale].createEdgeError):(this._selectObject(e,!1),this.sectors.support.nodes.targetNode=new o({id:"targetNode"},{},{},this.constants),this.sectors.support.nodes.targetNode.x=e.x,this.sectors.support.nodes.targetNode.y=e.y,this.sectors.support.nodes.targetViaNode=new o({id:"targetViaNode"},{},{},this.constants),this.sectors.support.nodes.targetViaNode.x=e.x,this.sectors.support.nodes.targetViaNode.y=e.y,this.sectors.support.nodes.targetViaNode.parentEdgeId="connectionEdge",this.edges.connectionEdge=new n({id:"connectionEdge",from:e.id,to:this.sectors.support.nodes.targetNode.id},this,this.constants),this.edges.connectionEdge.from=e,this.edges.connectionEdge.connected=!0,this.edges.connectionEdge.smooth=!0,this.edges.connectionEdge.selected=!0,this.edges.connectionEdge.to=this.sectors.support.nodes.targetNode,this.edges.connectionEdge.via=this.sectors.support.nodes.targetViaNode,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleOnDrag=function(t){var e=this._getPointer(t.gesture.center);this.sectors.support.nodes.targetNode.x=this._XconvertDOMtoCanvas(e.x),this.sectors.support.nodes.targetNode.y=this._YconvertDOMtoCanvas(e.y),this.sectors.support.nodes.targetViaNode.x=.5*(this._XconvertDOMtoCanvas(e.x)+this.edges.connectionEdge.from.x),this.sectors.support.nodes.targetViaNode.y=this._YconvertDOMtoCanvas(e.y)},this.moving=!0,this.start()))}},e._finishConnect=function(t){if(1==this._getSelectedNodeCount()){this._handleOnDrag=this.cachedFunctions._handleOnDrag,delete this.cachedFunctions._handleOnDrag;var e=this.edges.connectionEdge.fromId;delete this.edges.connectionEdge,delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode;var i=this._getNodeAt(t);null!=i&&(i.clusterSize>1?alert(this.constants.locales[this.constants.locale].createEdgeError):(this._createEdge(e,i.id),this._createManipulatorBar())),this._unselectAll()}},e._addNode=function(){if(this._selectionIsEmpty()&&1==this.editMode){var t=this._pointerToPositionObject(this.pointerPosition),e={id:s.randomUUID(),x:t.left,y:t.top,label:"new",allowedToMoveX:!0,allowedToMoveY:!0};if(this.triggerFunctions.add){if(2!=this.triggerFunctions.add.length)throw new Error("The function for add does not support two arguments (data,callback)");var i=this;this.triggerFunctions.add(e,function(t){i.nodesData.add(t),i._createManipulatorBar(),i.moving=!0,i.start()})}else this.nodesData.add(e),this._createManipulatorBar(),this.moving=!0,this.start()}},e._createEdge=function(t,e){if(1==this.editMode){var i={from:t,to:e};if(this.triggerFunctions.connect){if(2!=this.triggerFunctions.connect.length)throw new Error("The function for connect does not support two arguments (data,callback)");var s=this;this.triggerFunctions.connect(i,function(t){s.edgesData.add(t),s.moving=!0,s.start()})}else this.edgesData.add(i),this.moving=!0,this.start()}},e._editEdge=function(t,e){if(1==this.editMode){var i={id:this.edgeBeingEdited.id,from:t,to:e};if(this.triggerFunctions.editEdge){if(2!=this.triggerFunctions.editEdge.length)throw new Error("The function for edit does not support two arguments (data, callback)");var s=this;this.triggerFunctions.editEdge(i,function(t){s.edgesData.update(t),s.moving=!0,s.start()})}else this.edgesData.update(i),this.moving=!0,this.start()}},e._editNode=function(){if(!this.triggerFunctions.edit||1!=this.editMode)throw new Error("No edit function has been bound to this button");var t=this._getSelectedNode(),e={id:t.id,label:t.label,group:t.options.group,shape:t.options.shape,color:{background:t.options.color.background,border:t.options.color.border,highlight:{background:t.options.color.highlight.background,border:t.options.color.highlight.border}}};if(2!=this.triggerFunctions.edit.length)throw new Error("The function for edit does not support two arguments (data, callback)");var i=this;this.triggerFunctions.edit(e,function(t){i.nodesData.update(t),i._createManipulatorBar(),i.moving=!0,i.start()})},e._deleteSelected=function(){if(!this._selectionIsEmpty()&&1==this.editMode)if(this._clusterInSelection())alert(this.constants.locales[this.constants.locale].deleteClusterError);else{var t=this.getSelectedNodes(),e=this.getSelectedEdges();if(this.triggerFunctions.del){var i=this,s={nodes:t,edges:e};if(!(this.triggerFunctions.del.length=2))throw new Error("The function for delete does not support two arguments (data, callback)");this.triggerFunctions.del(s,function(t){i.edgesData.remove(t.edges),i.nodesData.remove(t.nodes),i._unselectAll(),i.moving=!0,i.start()})}else this.edgesData.remove(e),this.nodesData.remove(t),this._unselectAll(),this.moving=!0,this.start()}}},function(t,e,i){var s=(i(1),i(41));e._cleanNavigation=function(){var t=document.getElementById("network-navigation_wrapper");t&&t.parentNode&&t.parentNode.removeChild(t),document.onmouseup=null},e._loadNavigationElements=function(){this._cleanNavigation(),this.navigationDivs={};var t=["up","down","left","right","zoomIn","zoomOut","zoomExtends"],e=["_moveUp","_moveDown","_moveLeft","_moveRight","_zoomIn","_zoomOut","zoomExtent"];this.navigationDivs.wrapper=document.createElement("div"),this.navigationDivs.wrapper.id="network-navigation_wrapper",this.frame.appendChild(this.navigationDivs.wrapper);for(var i=this,o=0;o0){"RL"==this.constants.hierarchicalLayout.direction||"DU"==this.constants.hierarchicalLayout.direction?this.constants.hierarchicalLayout.levelSeparation*=-1:this.constants.hierarchicalLayout.levelSeparation=Math.abs(this.constants.hierarchicalLayout.levelSeparation),"RL"==this.constants.hierarchicalLayout.direction||"LR"==this.constants.hierarchicalLayout.direction?1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="vertical"):1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="horizontal");var t,e,i=0,s=!1,o=!1;for(e in this.nodes)this.nodes.hasOwnProperty(e)&&(t=this.nodes[e],-1!=t.level?s=!0:o=!0,is&&(n.xFixed=!1,n.x=i[n.level].minPos,r=!0):n.yFixed&&n.level>s&&(n.yFixed=!1,n.y=i[n.level].minPos,r=!0),1==r&&(i[n.level].minPos+=i[n.level].nodeSpacing,n.edges.length>1&&this._placeBranchNodes(n.edges,n.id,i,n.level))}},e._setLevel=function(t,e,i){for(var s=0;st)&&(o.level=t,e.length>1&&this._setLevel(t+1,o.edges,o.id))}},e._restoreNodes=function(){for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.nodes[t].xFixed=!1,this.nodes[t].yFixed=!1)}},function(t,e,i){function s(){this.constants.smoothCurves.enabled=!this.constants.smoothCurves.enabled;var t=document.getElementById("graph_toggleSmooth");t.style.background=1==this.constants.smoothCurves.enabled?"#A4FF56":"#FF8532",this._configureSmoothCurves(!1)}function o(){for(var t in this.calculationNodes)this.calculationNodes.hasOwnProperty(t)&&(this.calculationNodes[t].vx=0,this.calculationNodes[t].vy=0,this.calculationNodes[t].fx=0,this.calculationNodes[t].fy=0);1==this.constants.hierarchicalLayout.enabled?(this._setupHierarchicalLayout(),a.call(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),a.call(this,"graph_H_cg",1,"physics_centralGravity"),a.call(this,"graph_H_sc",1,"physics_springConstant"),a.call(this,"graph_H_sl",1,"physics_springLength"),a.call(this,"graph_H_damp",1,"physics_damping")):this.repositionNodes(),this.moving=!0,this.start()}function n(){var t="No options are required, default values used.",e=[],i=document.getElementById("graph_physicsMethod1"),s=document.getElementById("graph_physicsMethod2");if(1==i.checked){if(this.constants.physics.barnesHut.gravitationalConstant!=this.backupConstants.physics.barnesHut.gravitationalConstant&&e.push("gravitationalConstant: "+this.constants.physics.barnesHut.gravitationalConstant),this.constants.physics.centralGravity!=this.backupConstants.physics.barnesHut.centralGravity&&e.push("centralGravity: "+this.constants.physics.centralGravity),this.constants.physics.springLength!=this.backupConstants.physics.barnesHut.springLength&&e.push("springLength: "+this.constants.physics.springLength),this.constants.physics.springConstant!=this.backupConstants.physics.barnesHut.springConstant&&e.push("springConstant: "+this.constants.physics.springConstant),this.constants.physics.damping!=this.backupConstants.physics.barnesHut.damping&&e.push("damping: "+this.constants.physics.damping),0!=e.length){t="var options = {",t+="physics: {barnesHut: {";for(var o=0;othis.constants.clustering.clusterThreshold&&1==this.constants.clustering.enabled&&this.clusterToFit(this.constants.clustering.reduceToNodes,!1),this._calculateForces())},e._calculateForces=function(){this._calculateGravitationalForces(),this._calculateNodeForces(),this.constants.physics.springConstant>0&&(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic?this._calculateSpringForcesWithSupport():1==this.constants.physics.hierarchicalRepulsion.enabled?this._calculateHierarchicalSpringForces():this._calculateSpringForces())},e._updateCalculationNodes=function(){if(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic){this.calculationNodes={},this.calculationNodeIndices=[];for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.calculationNodes[t]=this.nodes[t]);var e=this.sectors.support.nodes;for(var i in e)e.hasOwnProperty(i)&&(this.edges.hasOwnProperty(e[i].parentEdgeId)?this.calculationNodes[i]=e[i]:e[i]._setForce(0,0));for(var s in this.calculationNodes)this.calculationNodes.hasOwnProperty(s)&&this.calculationNodeIndices.push(s)}else this.calculationNodes=this.nodes,this.calculationNodeIndices=this.nodeIndices},e._calculateGravitationalForces=function(){var t,e,i,s,o,n=this.calculationNodes,r=this.constants.physics.centralGravity,a=0;for(o=0;oSimulation Mode:Barnes HutRepulsionHierarchical
Options:
',this.containerElement.parentElement.insertBefore(this.physicsConfiguration,this.containerElement),this.optionsDiv=document.createElement("div"),this.optionsDiv.style.fontSize="14px",this.optionsDiv.style.fontFamily="verdana",this.containerElement.parentElement.insertBefore(this.optionsDiv,this.containerElement);var e;e=document.getElementById("graph_BH_gc"),e.onchange=a.bind(this,"graph_BH_gc",-1,"physics_barnesHut_gravitationalConstant"),e=document.getElementById("graph_BH_cg"),e.onchange=a.bind(this,"graph_BH_cg",1,"physics_centralGravity"),e=document.getElementById("graph_BH_sc"),e.onchange=a.bind(this,"graph_BH_sc",1,"physics_springConstant"),e=document.getElementById("graph_BH_sl"),e.onchange=a.bind(this,"graph_BH_sl",1,"physics_springLength"),e=document.getElementById("graph_BH_damp"),e.onchange=a.bind(this,"graph_BH_damp",1,"physics_damping"),e=document.getElementById("graph_R_nd"),e.onchange=a.bind(this,"graph_R_nd",1,"physics_repulsion_nodeDistance"),e=document.getElementById("graph_R_cg"),e.onchange=a.bind(this,"graph_R_cg",1,"physics_centralGravity"),e=document.getElementById("graph_R_sc"),e.onchange=a.bind(this,"graph_R_sc",1,"physics_springConstant"),e=document.getElementById("graph_R_sl"),e.onchange=a.bind(this,"graph_R_sl",1,"physics_springLength"),e=document.getElementById("graph_R_damp"),e.onchange=a.bind(this,"graph_R_damp",1,"physics_damping"),e=document.getElementById("graph_H_nd"),e.onchange=a.bind(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),e=document.getElementById("graph_H_cg"),e.onchange=a.bind(this,"graph_H_cg",1,"physics_centralGravity"),e=document.getElementById("graph_H_sc"),e.onchange=a.bind(this,"graph_H_sc",1,"physics_springConstant"),e=document.getElementById("graph_H_sl"),e.onchange=a.bind(this,"graph_H_sl",1,"physics_springLength"),e=document.getElementById("graph_H_damp"),e.onchange=a.bind(this,"graph_H_damp",1,"physics_damping"),e=document.getElementById("graph_H_direction"),e.onchange=a.bind(this,"graph_H_direction",t,"hierarchicalLayout_direction"),e=document.getElementById("graph_H_levsep"),e.onchange=a.bind(this,"graph_H_levsep",1,"hierarchicalLayout_levelSeparation"),e=document.getElementById("graph_H_nspac"),e.onchange=a.bind(this,"graph_H_nspac",1,"hierarchicalLayout_nodeSpacing");var i=document.getElementById("graph_physicsMethod1"),d=document.getElementById("graph_physicsMethod2"),l=document.getElementById("graph_physicsMethod3");d.checked=!0,this.constants.physics.barnesHut.enabled&&(i.checked=!0),this.constants.hierarchicalLayout.enabled&&(l.checked=!0);var c=document.getElementById("graph_toggleSmooth"),p=document.getElementById("graph_repositionNodes"),u=document.getElementById("graph_generateOptions");c.onclick=s.bind(this),p.onclick=o.bind(this),u.onclick=n.bind(this),c.style.background=1==this.constants.smoothCurves&&0==this.constants.dynamicSmoothCurves?"#A4FF56":"#FF8532",r.apply(this),i.onchange=r.bind(this),d.onchange=r.bind(this),l.onchange=r.bind(this)}},e._overWriteGraphConstants=function(t,e){var i=t.split("_");1==i.length?this.constants[i[0]]=e:2==i.length?this.constants[i[0]][i[1]]=e:3==i.length&&(this.constants[i[0]][i[1]][i[2]]=e)}},function(t,e,i){function s(t){return i(o(t))}function o(t){return n[t]||function(){throw new Error("Cannot find module '"+t+"'.")}()}var n={};s.keys=function(){return Object.keys(n)},s.resolve=o,t.exports=s},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l,c=this.calculationNodes,p=this.calculationNodeIndices,u=-2/3,f=4/3,m=this.constants.physics.repulsion.nodeDistance,g=m;for(d=0;di&&(r=.5*g>i?1:v*i+f,r*=0==n?1:1+n*this.constants.clustering.forceAmplification,r/=i,s=t*r,o=e*r,a.fx-=s,a.fy-=o,h.fx+=s,h.fy+=o)}}},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l=this.calculationNodes,c=this.calculationNodeIndices,p=this.constants.physics.hierarchicalRepulsion.nodeDistance;for(h=0;hi?-Math.pow(u*i,2)+Math.pow(u*p,2):0,0==i?i=.01:n/=i,s=t*n,o=e*n,r.fx-=s,r.fy-=o,a.fx+=s,a.fy+=o}},e._calculateHierarchicalSpringForces=function(){for(var t,e,i,s,o,n,r,a,h,d=this.edges,l=this.calculationNodes,c=this.calculationNodeIndices,p=0;pn;n++)t=e[i[n]],t.options.mass>0&&(this._getForceContribution(o.root.children.NW,t),this._getForceContribution(o.root.children.NE,t),this._getForceContribution(o.root.children.SW,t),this._getForceContribution(o.root.children.SE,t))}},e._getForceContribution=function(t,e){if(t.childrenCount>0){var i,s,o;if(i=t.centerOfMass.x-e.x,s=t.centerOfMass.y-e.y,o=Math.sqrt(i*i+s*s),o*t.calcSize>this.constants.physics.barnesHut.theta){0==o&&(o=.1*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}else if(4==t.childrenCount)this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e);else if(t.children.data.id!=e.id){0==o&&(o=.5*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}}},e._formBarnesHutTree=function(t,e){for(var i,s=e.length,o=Number.MAX_VALUE,n=Number.MAX_VALUE,r=-Number.MAX_VALUE,a=-Number.MAX_VALUE,h=0;s>h;h++){var d=t[e[h]].x,l=t[e[h]].y;t[e[h]].options.mass>0&&(o>d&&(o=d),d>r&&(r=d),n>l&&(n=l),l>a&&(a=l))}var c=Math.abs(r-o)-Math.abs(a-n);c>0?(n-=.5*c,a+=.5*c):(o+=.5*c,r-=.5*c);var p=1e-5,u=Math.max(p,Math.abs(r-o)),f=.5*u,m=.5*(o+r),g=.5*(n+a),v={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:m-f,maxX:m+f,minY:g-f,maxY:g+f},size:u,calcSize:1/u,children:{data:null},maxWidth:0,level:0,childrenCount:4}};for(this._splitBranch(v.root),h=0;s>h;h++)i=t[e[h]],i.options.mass>0&&this._placeInTree(v.root,i);this.barnesHutTree=v},e._updateBranchMass=function(t,e){var i=t.mass+e.options.mass,s=1/i;t.centerOfMass.x=t.centerOfMass.x*t.mass+e.x*e.options.mass,t.centerOfMass.x*=s,t.centerOfMass.y=t.centerOfMass.y*t.mass+e.y*e.options.mass,t.centerOfMass.y*=s,t.mass=i;var o=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NW"):this._placeInRegion(t,e,"SW"):t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NE"):this._placeInRegion(t,e,"SE")},e._placeInRegion=function(t,e,i){switch(t.children[i].childrenCount){case 0:t.children[i].children.data=e,t.children[i].childrenCount=1,this._updateBranchMass(t.children[i],e);break;case 1:t.children[i].children.data.x==e.x&&t.children[i].children.data.y==e.y?(e.x+=Math.random(),e.y+=Math.random()):(this._splitBranch(t.children[i]),this._placeInTree(t.children[i],e));break;case 4:this._placeInTree(t.children[i],e)}},e._splitBranch=function(t){var e=null;1==t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)},e._insertRegion=function(t,e){var i,s,o,n,r=.5*t.size;switch(e){case"NW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY,n=t.range.minY+r;break;case"NE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY,n=t.range.minY+r;break;case"SW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY+r,n=t.range.maxY;break;case"SE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY+r,n=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:s,minY:o,maxY:n},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}},e._drawTree=function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))},e._drawBranch=function(t,e,i){void 0===i&&(i="#FF0000"),4==t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}},function(t){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}}])}); //# sourceMappingURL=vis.map \ No newline at end of file From e1a2fb224d343559137cac7d52dcef45c4396ae2 Mon Sep 17 00:00:00 2001 From: Alex de Mulder Date: Fri, 22 Aug 2014 18:29:20 +0200 Subject: [PATCH 3/4] updated dataAxis and legend to also make use of the instance based groups.visiblilty option --- dist/vis.js | 49074 +++++++++++++------------- dist/vis.map | 2 +- dist/vis.min.js | 24 +- lib/timeline/component/DataAxis.js | 7 +- lib/timeline/component/Legend.js | 9 +- lib/timeline/component/LineGraph.js | 8 +- 6 files changed, 24564 insertions(+), 24560 deletions(-) diff --git a/dist/vis.js b/dist/vis.js index 8149e3e4..17c51f2d 100644 --- a/dist/vis.js +++ b/dist/vis.js @@ -81,63 +81,63 @@ return /******/ (function(modules) { // webpackBootstrap // utils exports.util = __webpack_require__(1); - exports.DOMutil = __webpack_require__(2); + exports.DOMutil = __webpack_require__(6); // data - exports.DataSet = __webpack_require__(3); - exports.DataView = __webpack_require__(4); + exports.DataSet = __webpack_require__(7); + exports.DataView = __webpack_require__(8); // Graph3d - exports.Graph3d = __webpack_require__(5); + exports.Graph3d = __webpack_require__(9); exports.graph3d = { - Camera: __webpack_require__(6), - Filter: __webpack_require__(7), - Point2d: __webpack_require__(8), - Point3d: __webpack_require__(9), - Slider: __webpack_require__(10), - StepNumber: __webpack_require__(11) + Camera: __webpack_require__(13), + Filter: __webpack_require__(14), + Point2d: __webpack_require__(12), + Point3d: __webpack_require__(11), + Slider: __webpack_require__(15), + StepNumber: __webpack_require__(16) }; // Timeline - exports.Timeline = __webpack_require__(12); - exports.Graph2d = __webpack_require__(13); + exports.Timeline = __webpack_require__(17); + exports.Graph2d = __webpack_require__(38); exports.timeline = { - DataStep: __webpack_require__(14), - Range: __webpack_require__(15), - stack: __webpack_require__(16), - TimeStep: __webpack_require__(17), + DataStep: __webpack_require__(41), + Range: __webpack_require__(20), + stack: __webpack_require__(31), + TimeStep: __webpack_require__(25), components: { items: { - Item: __webpack_require__(28), - ItemBox: __webpack_require__(29), - ItemPoint: __webpack_require__(30), - ItemRange: __webpack_require__(31) + Item: __webpack_require__(33), + ItemBox: __webpack_require__(34), + ItemPoint: __webpack_require__(35), + ItemRange: __webpack_require__(32) }, - Component: __webpack_require__(18), - CurrentTime: __webpack_require__(19), - CustomTime: __webpack_require__(20), - DataAxis: __webpack_require__(21), - GraphGroup: __webpack_require__(22), - Group: __webpack_require__(23), - ItemSet: __webpack_require__(24), - Legend: __webpack_require__(25), - LineGraph: __webpack_require__(26), - TimeAxis: __webpack_require__(27) + Component: __webpack_require__(22), + CurrentTime: __webpack_require__(26), + CustomTime: __webpack_require__(28), + DataAxis: __webpack_require__(40), + GraphGroup: __webpack_require__(42), + Group: __webpack_require__(30), + ItemSet: __webpack_require__(29), + Legend: __webpack_require__(43), + LineGraph: __webpack_require__(39), + TimeAxis: __webpack_require__(24) } }; // Network - exports.Network = __webpack_require__(32); + exports.Network = __webpack_require__(44); exports.network = { - Edge: __webpack_require__(33), - Groups: __webpack_require__(34), - Images: __webpack_require__(35), - Node: __webpack_require__(36), - Popup: __webpack_require__(37), - dotparser: __webpack_require__(38), - gephiParser: __webpack_require__(39) + Edge: __webpack_require__(50), + Groups: __webpack_require__(47), + Images: __webpack_require__(48), + Node: __webpack_require__(49), + Popup: __webpack_require__(51), + dotparser: __webpack_require__(45), + gephiParser: __webpack_require__(46) }; // Deprecated since v3.0.0 @@ -146,8 +146,8 @@ return /******/ (function(modules) { // webpackBootstrap }; // bundled external libraries - exports.moment = __webpack_require__(40); - exports.hammer = __webpack_require__(41); + exports.moment = __webpack_require__(2); + exports.hammer = __webpack_require__(18); /***/ }, @@ -158,7 +158,7 @@ return /******/ (function(modules) { // webpackBootstrap // first check if moment.js is already loaded in the browser window, if so, // use this instance. Else, load via commonjs. - var moment = __webpack_require__(40); + var moment = __webpack_require__(2); /** * Test whether given object is a number @@ -1405,25367 +1405,25072 @@ return /******/ (function(modules) { // webpackBootstrap /* 2 */ /***/ function(module, exports, __webpack_require__) { - // DOM utility methods + // first check if moment.js is already loaded in the browser window, if so, + // use this instance. Else, load via commonjs. + module.exports = (typeof window !== 'undefined') && window['moment'] || __webpack_require__(3); - /** - * this prepares the JSON container for allocating SVG elements - * @param JSONcontainer - * @private - */ - exports.prepareElements = function(JSONcontainer) { - // cleanup the redundant svgElements; - for (var elementType in JSONcontainer) { - if (JSONcontainer.hasOwnProperty(elementType)) { - JSONcontainer[elementType].redundant = JSONcontainer[elementType].used; - JSONcontainer[elementType].used = []; - } - } - }; - /** - * this cleans up all the unused SVG elements. By asking for the parentNode, we only need to supply the JSON container from - * which to remove the redundant elements. - * - * @param JSONcontainer - * @private - */ - exports.cleanupElements = function(JSONcontainer) { - // cleanup the redundant svgElements; - for (var elementType in JSONcontainer) { - if (JSONcontainer.hasOwnProperty(elementType)) { - if (JSONcontainer[elementType].redundant) { - for (var i = 0; i < JSONcontainer[elementType].redundant.length; i++) { - JSONcontainer[elementType].redundant[i].parentNode.removeChild(JSONcontainer[elementType].redundant[i]); - } - JSONcontainer[elementType].redundant = []; - } - } - } - }; +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { - /** - * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer - * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this. - * - * @param elementType - * @param JSONcontainer - * @param svgContainer - * @returns {*} - * @private - */ - exports.getSVGElement = function (elementType, JSONcontainer, svgContainer) { - var element; - // allocate SVG element, if it doesnt yet exist, create one. - if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before - // check if there is an redundant element - if (JSONcontainer[elementType].redundant.length > 0) { - element = JSONcontainer[elementType].redundant[0]; - JSONcontainer[elementType].redundant.shift(); - } - else { - // create a new element and add it to the SVG - element = document.createElementNS('http://www.w3.org/2000/svg', elementType); - svgContainer.appendChild(element); - } - } - else { - // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it. - element = document.createElementNS('http://www.w3.org/2000/svg', elementType); - JSONcontainer[elementType] = {used: [], redundant: []}; - svgContainer.appendChild(element); - } - JSONcontainer[elementType].used.push(element); - return element; - }; + var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(global, module) {//! moment.js + //! version : 2.7.0 + //! authors : Tim Wood, Iskren Chernev, Moment.js contributors + //! license : MIT + //! momentjs.com + (function (undefined) { - /** - * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer - * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this. - * - * @param elementType - * @param JSONcontainer - * @param DOMContainer - * @returns {*} - * @private - */ - exports.getDOMElement = function (elementType, JSONcontainer, DOMContainer) { - var element; - // allocate DOM element, if it doesnt yet exist, create one. - if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before - // check if there is an redundant element - if (JSONcontainer[elementType].redundant.length > 0) { - element = JSONcontainer[elementType].redundant[0]; - JSONcontainer[elementType].redundant.shift(); - } - else { - // create a new element and add it to the SVG - element = document.createElement(elementType); - DOMContainer.appendChild(element); - } - } - else { - // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it. - element = document.createElement(elementType); - JSONcontainer[elementType] = {used: [], redundant: []}; - DOMContainer.appendChild(element); - } - JSONcontainer[elementType].used.push(element); - return element; - }; + /************************************ + Constants + ************************************/ + var moment, + VERSION = "2.7.0", + // the global-scope this is NOT the global object in Node.js + globalScope = typeof global !== 'undefined' ? global : this, + oldGlobalMoment, + round = Math.round, + i, + YEAR = 0, + MONTH = 1, + DATE = 2, + HOUR = 3, + MINUTE = 4, + SECOND = 5, + MILLISECOND = 6, + // internal storage for language config files + languages = {}, - /** - * draw a point object. this is a seperate function because it can also be called by the legend. - * The reason the JSONcontainer and the target SVG svgContainer have to be supplied is so the legend can use these functions - * as well. - * - * @param x - * @param y - * @param group - * @param JSONcontainer - * @param svgContainer - * @returns {*} - */ - exports.drawPoint = function(x, y, group, JSONcontainer, svgContainer) { - var point; - if (group.options.drawPoints.style == 'circle') { - point = exports.getSVGElement('circle',JSONcontainer,svgContainer); - point.setAttributeNS(null, "cx", x); - point.setAttributeNS(null, "cy", y); - point.setAttributeNS(null, "r", 0.5 * group.options.drawPoints.size); - point.setAttributeNS(null, "class", group.className + " point"); - } - else { - point = exports.getSVGElement('rect',JSONcontainer,svgContainer); - point.setAttributeNS(null, "x", x - 0.5*group.options.drawPoints.size); - point.setAttributeNS(null, "y", y - 0.5*group.options.drawPoints.size); - point.setAttributeNS(null, "width", group.options.drawPoints.size); - point.setAttributeNS(null, "height", group.options.drawPoints.size); - point.setAttributeNS(null, "class", group.className + " point"); - } - return point; - }; + // moment internal properties + momentProperties = { + _isAMomentObject: null, + _i : null, + _f : null, + _l : null, + _strict : null, + _tzm : null, + _isUTC : null, + _offset : null, // optional. Combine with _isUTC + _pf : null, + _lang : null // optional + }, - /** - * draw a bar SVG element centered on the X coordinate - * - * @param x - * @param y - * @param className - */ - exports.drawBar = function (x, y, width, height, className, JSONcontainer, svgContainer) { - // if (height != 0) { - var rect = exports.getSVGElement('rect',JSONcontainer, svgContainer); - rect.setAttributeNS(null, "x", x - 0.5 * width); - rect.setAttributeNS(null, "y", y); - rect.setAttributeNS(null, "width", width); - rect.setAttributeNS(null, "height", height); - rect.setAttributeNS(null, "class", className); - // } - }; + // check for nodeJS + hasModule = (typeof module !== 'undefined' && module.exports), -/***/ }, -/* 3 */ -/***/ function(module, exports, __webpack_require__) { + // ASP.NET json date format regex + aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, + aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, - var util = __webpack_require__(1); + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, - /** - * DataSet - * - * Usage: - * var dataSet = new DataSet({ - * fieldId: '_id', - * type: { - * // ... - * } - * }); - * - * dataSet.add(item); - * dataSet.add(data); - * dataSet.update(item); - * dataSet.update(data); - * dataSet.remove(id); - * dataSet.remove(ids); - * var data = dataSet.get(); - * var data = dataSet.get(id); - * var data = dataSet.get(ids); - * var data = dataSet.get(ids, options, data); - * dataSet.clear(); - * - * A data set can: - * - add/remove/update data - * - gives triggers upon changes in the data - * - can import/export data in various data formats - * - * @param {Array | DataTable} [data] Optional array with initial data - * @param {Object} [options] Available options: - * {String} fieldId Field name of the id in the - * items, 'id' by default. - * {Object. ["10", "00"] or "-1530" > ["-15", "30"] + parseTimezoneChunker = /([\+\-]|\d\d)/gi, - if (Array.isArray(data)) { - // Array - for (var i = 0, len = data.length; i < len; i++) { - id = me._addItem(data[i]); - addedIds.push(id); - } - } - else if (util.isDataTable(data)) { - // Google DataTable - var columns = this._getColumnNames(data); - for (var row = 0, rows = data.getNumberOfRows(); row < rows; row++) { - var item = {}; - for (var col = 0, cols = columns.length; col < cols; col++) { - var field = columns[col]; - item[field] = data.getValue(row, col); - } + // getter and setter names + proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), + unitMillisecondFactors = { + 'Milliseconds' : 1, + 'Seconds' : 1e3, + 'Minutes' : 6e4, + 'Hours' : 36e5, + 'Days' : 864e5, + 'Months' : 2592e6, + 'Years' : 31536e6 + }, - id = me._addItem(item); - addedIds.push(id); - } - } - else if (data instanceof Object) { - // Single item - id = me._addItem(data); - addedIds.push(id); - } - else { - throw new Error('Unknown dataType'); - } + unitAliases = { + ms : 'millisecond', + s : 'second', + m : 'minute', + h : 'hour', + d : 'day', + D : 'date', + w : 'week', + W : 'isoWeek', + M : 'month', + Q : 'quarter', + y : 'year', + DDD : 'dayOfYear', + e : 'weekday', + E : 'isoWeekday', + gg: 'weekYear', + GG: 'isoWeekYear' + }, - if (addedIds.length) { - this._trigger('add', {items: addedIds}, senderId); - } + camelFunctions = { + dayofyear : 'dayOfYear', + isoweekday : 'isoWeekday', + isoweek : 'isoWeek', + weekyear : 'weekYear', + isoweekyear : 'isoWeekYear' + }, - return addedIds; - }; + // format function strings + formatFunctions = {}, - /** - * Update existing items. When an item does not exist, it will be created - * @param {Object | Array | DataTable} data - * @param {String} [senderId] Optional sender id - * @return {Array} updatedIds The ids of the added or updated items - */ - DataSet.prototype.update = function (data, senderId) { - var addedIds = [], - updatedIds = [], - me = this, - fieldId = me._fieldId; + // default relative time thresholds + relativeTimeThresholds = { + s: 45, //seconds to minutes + m: 45, //minutes to hours + h: 22, //hours to days + dd: 25, //days to month (month == 1) + dm: 45, //days to months (months > 1) + dy: 345 //days to year + }, - var addOrUpdate = function (item) { - var id = item[fieldId]; - if (me._data[id]) { - // update item - id = me._updateItem(item); - updatedIds.push(id); - } - else { - // add new item - id = me._addItem(item); - addedIds.push(id); - } - }; + // tokens to ordinalize and pad + ordinalizeTokens = 'DDD w W M D d'.split(' '), + paddedTokens = 'M D H h m s w W'.split(' '), - if (Array.isArray(data)) { - // Array - for (var i = 0, len = data.length; i < len; i++) { - addOrUpdate(data[i]); - } - } - else if (util.isDataTable(data)) { - // Google DataTable - var columns = this._getColumnNames(data); - for (var row = 0, rows = data.getNumberOfRows(); row < rows; row++) { - var item = {}; - for (var col = 0, cols = columns.length; col < cols; col++) { - var field = columns[col]; - item[field] = data.getValue(row, col); - } - - addOrUpdate(item); - } - } - else if (data instanceof Object) { - // Single item - addOrUpdate(data); - } - else { - throw new Error('Unknown dataType'); - } - - if (addedIds.length) { - this._trigger('add', {items: addedIds}, senderId); - } - if (updatedIds.length) { - this._trigger('update', {items: updatedIds}, senderId); - } - - return addedIds.concat(updatedIds); - }; - - /** - * Get a data item or multiple items. - * - * Usage: - * - * get() - * get(options: Object) - * get(options: Object, data: Array | DataTable) - * - * get(id: Number | String) - * get(id: Number | String, options: Object) - * get(id: Number | String, options: Object, data: Array | DataTable) - * - * get(ids: Number[] | String[]) - * get(ids: Number[] | String[], options: Object) - * get(ids: Number[] | String[], options: Object, data: Array | DataTable) - * - * Where: - * - * {Number | String} id The id of an item - * {Number[] | String{}} ids An array with ids of items - * {Object} options An Object with options. Available options: - * {String} [returnType] Type of data to be - * returned. Can be 'DataTable' or 'Array' (default) - * {Object.} [type] - * {String[]} [fields] field names to be returned - * {function} [filter] filter items - * {String | function} [order] Order the items by - * a field name or custom sort function. - * {Array | DataTable} [data] If provided, items will be appended to this - * array or table. Required in case of Google - * DataTable. - * - * @throws Error - */ - DataSet.prototype.get = function (args) { - var me = this; - - // parse the arguments - var id, ids, options, data; - var firstType = util.getType(arguments[0]); - if (firstType == 'String' || firstType == 'Number') { - // get(id [, options] [, data]) - id = arguments[0]; - options = arguments[1]; - data = arguments[2]; - } - else if (firstType == 'Array') { - // get(ids [, options] [, data]) - ids = arguments[0]; - options = arguments[1]; - data = arguments[2]; - } - else { - // get([, options] [, data]) - options = arguments[0]; - data = arguments[1]; - } - - // determine the return type - var returnType; - if (options && options.returnType) { - var allowedValues = ["DataTable", "Array", "Object"]; - returnType = allowedValues.indexOf(options.returnType) == -1 ? "Array" : options.returnType; - - if (data && (returnType != util.getType(data))) { - throw new Error('Type of parameter "data" (' + util.getType(data) + ') ' + - 'does not correspond with specified options.type (' + options.type + ')'); - } - if (returnType == 'DataTable' && !util.isDataTable(data)) { - throw new Error('Parameter "data" must be a DataTable ' + - 'when options.type is "DataTable"'); - } - } - else if (data) { - returnType = (util.getType(data) == 'DataTable') ? 'DataTable' : 'Array'; - } - else { - returnType = 'Array'; - } - - // build options - var type = options && options.type || this._options.type; - var filter = options && options.filter; - var items = [], item, itemId, i, len; - - // convert items - if (id != undefined) { - // return a single item - item = me._getItem(id, type); - if (filter && !filter(item)) { - item = null; - } - } - else if (ids != undefined) { - // return a subset of items - for (i = 0, len = ids.length; i < len; i++) { - item = me._getItem(ids[i], type); - if (!filter || filter(item)) { - items.push(item); - } - } - } - else { - // return all items - for (itemId in this._data) { - if (this._data.hasOwnProperty(itemId)) { - item = me._getItem(itemId, type); - if (!filter || filter(item)) { - items.push(item); - } - } - } - } - - // order the results - if (options && options.order && id == undefined) { - this._sort(items, options.order); - } - - // filter fields of the items - if (options && options.fields) { - var fields = options.fields; - if (id != undefined) { - item = this._filterFields(item, fields); - } - else { - for (i = 0, len = items.length; i < len; i++) { - items[i] = this._filterFields(items[i], fields); - } - } - } - - // return the results - if (returnType == 'DataTable') { - var columns = this._getColumnNames(data); - if (id != undefined) { - // append a single item to the data table - me._appendRow(data, columns, item); - } - else { - // copy the items to the provided data table - for (i = 0; i < items.length; i++) { - me._appendRow(data, columns, items[i]); - } - } - return data; - } - else if (returnType == "Object") { - var result = {}; - for (i = 0; i < items.length; i++) { - result[items[i].id] = items[i]; - } - return result; - } - else { - // return an array - if (id != undefined) { - // a single item - return item; - } - else { - // multiple items - if (data) { - // copy the items to the provided array - for (i = 0, len = items.length; i < len; i++) { - data.push(items[i]); - } - return data; - } - else { - // just return our array - return items; - } - } - } - }; - - /** - * Get ids of all items or from a filtered set of items. - * @param {Object} [options] An Object with options. Available options: - * {function} [filter] filter items - * {String | function} [order] Order the items by - * a field name or custom sort function. - * @return {Array} ids - */ - DataSet.prototype.getIds = function (options) { - var data = this._data, - filter = options && options.filter, - order = options && options.order, - type = options && options.type || this._options.type, - i, - len, - id, - item, - items, - ids = []; - - if (filter) { - // get filtered items - if (order) { - // create ordered list - items = []; - for (id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (filter(item)) { - items.push(item); - } - } - } - - this._sort(items, order); - - for (i = 0, len = items.length; i < len; i++) { - ids[i] = items[i][this._fieldId]; - } - } - else { - // create unordered list - for (id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (filter(item)) { - ids.push(item[this._fieldId]); - } - } - } - } - } - else { - // get all items - if (order) { - // create an ordered list - items = []; - for (id in data) { - if (data.hasOwnProperty(id)) { - items.push(data[id]); - } - } - - this._sort(items, order); - - for (i = 0, len = items.length; i < len; i++) { - ids[i] = items[i][this._fieldId]; - } - } - else { - // create unordered list - for (id in data) { - if (data.hasOwnProperty(id)) { - item = data[id]; - ids.push(item[this._fieldId]); - } - } - } - } - - return ids; - }; - - /** - * Returns the DataSet itself. Is overwritten for example by the DataView, - * which returns the DataSet it is connected to instead. - */ - DataSet.prototype.getDataSet = function () { - return this; - }; - - /** - * Execute a callback function for every item in the dataset. - * @param {function} callback - * @param {Object} [options] Available options: - * {Object.} [type] - * {String[]} [fields] filter fields - * {function} [filter] filter items - * {String | function} [order] Order the items by - * a field name or custom sort function. - */ - DataSet.prototype.forEach = function (callback, options) { - var filter = options && options.filter, - type = options && options.type || this._options.type, - data = this._data, - item, - id; - - if (options && options.order) { - // execute forEach on ordered list - var items = this.get(options); - - for (var i = 0, len = items.length; i < len; i++) { - item = items[i]; - id = item[this._fieldId]; - callback(item, id); - } - } - else { - // unordered - for (id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (!filter || filter(item)) { - callback(item, id); - } - } - } - } - }; - - /** - * Map every item in the dataset. - * @param {function} callback - * @param {Object} [options] Available options: - * {Object.} [type] - * {String[]} [fields] filter fields - * {function} [filter] filter items - * {String | function} [order] Order the items by - * a field name or custom sort function. - * @return {Object[]} mappedItems - */ - DataSet.prototype.map = function (callback, options) { - var filter = options && options.filter, - type = options && options.type || this._options.type, - mappedItems = [], - data = this._data, - item; - - // convert and filter items - for (var id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (!filter || filter(item)) { - mappedItems.push(callback(item, id)); - } - } - } - - // order items - if (options && options.order) { - this._sort(mappedItems, options.order); - } - - return mappedItems; - }; - - /** - * Filter the fields of an item - * @param {Object} item - * @param {String[]} fields Field names - * @return {Object} filteredItem - * @private - */ - DataSet.prototype._filterFields = function (item, fields) { - var filteredItem = {}; - - for (var field in item) { - if (item.hasOwnProperty(field) && (fields.indexOf(field) != -1)) { - filteredItem[field] = item[field]; - } - } - - return filteredItem; - }; - - /** - * Sort the provided array with items - * @param {Object[]} items - * @param {String | function} order A field name or custom sort function. - * @private - */ - DataSet.prototype._sort = function (items, order) { - if (util.isString(order)) { - // order by provided field name - var name = order; // field name - items.sort(function (a, b) { - var av = a[name]; - var bv = b[name]; - return (av > bv) ? 1 : ((av < bv) ? -1 : 0); - }); - } - else if (typeof order === 'function') { - // order by sort function - items.sort(order); - } - // TODO: extend order by an Object {field:String, direction:String} - // where direction can be 'asc' or 'desc' - else { - throw new TypeError('Order must be a function or a string'); - } - }; - - /** - * Remove an object by pointer or by id - * @param {String | Number | Object | Array} id Object or id, or an array with - * objects or ids to be removed - * @param {String} [senderId] Optional sender id - * @return {Array} removedIds - */ - DataSet.prototype.remove = function (id, senderId) { - var removedIds = [], - i, len, removedId; - - if (Array.isArray(id)) { - for (i = 0, len = id.length; i < len; i++) { - removedId = this._remove(id[i]); - if (removedId != null) { - removedIds.push(removedId); - } - } - } - else { - removedId = this._remove(id); - if (removedId != null) { - removedIds.push(removedId); - } - } - - if (removedIds.length) { - this._trigger('remove', {items: removedIds}, senderId); - } - - return removedIds; - }; - - /** - * Remove an item by its id - * @param {Number | String | Object} id id or item - * @returns {Number | String | null} id - * @private - */ - DataSet.prototype._remove = function (id) { - if (util.isNumber(id) || util.isString(id)) { - if (this._data[id]) { - delete this._data[id]; - return id; - } - } - else if (id instanceof Object) { - var itemId = id[this._fieldId]; - if (itemId && this._data[itemId]) { - delete this._data[itemId]; - return itemId; - } - } - return null; - }; - - /** - * Clear the data - * @param {String} [senderId] Optional sender id - * @return {Array} removedIds The ids of all removed items - */ - DataSet.prototype.clear = function (senderId) { - var ids = Object.keys(this._data); - - this._data = {}; - - this._trigger('remove', {items: ids}, senderId); - - return ids; - }; - - /** - * Find the item with maximum value of a specified field - * @param {String} field - * @return {Object | null} item Item containing max value, or null if no items - */ - DataSet.prototype.max = function (field) { - var data = this._data, - max = null, - maxField = null; - - for (var id in data) { - if (data.hasOwnProperty(id)) { - var item = data[id]; - var itemField = item[field]; - if (itemField != null && (!max || itemField > maxField)) { - max = item; - maxField = itemField; - } - } - } - - return max; - }; - - /** - * Find the item with minimum value of a specified field - * @param {String} field - * @return {Object | null} item Item containing max value, or null if no items - */ - DataSet.prototype.min = function (field) { - var data = this._data, - min = null, - minField = null; - - for (var id in data) { - if (data.hasOwnProperty(id)) { - var item = data[id]; - var itemField = item[field]; - if (itemField != null && (!min || itemField < minField)) { - min = item; - minField = itemField; - } - } - } - - return min; - }; - - /** - * Find all distinct values of a specified field - * @param {String} field - * @return {Array} values Array containing all distinct values. If data items - * do not contain the specified field are ignored. - * The returned array is unordered. - */ - DataSet.prototype.distinct = function (field) { - var data = this._data; - var values = []; - var fieldType = this._options.type && this._options.type[field] || null; - var count = 0; - var i; - - for (var prop in data) { - if (data.hasOwnProperty(prop)) { - var item = data[prop]; - var value = item[field]; - var exists = false; - for (i = 0; i < count; i++) { - if (values[i] == value) { - exists = true; - break; - } - } - if (!exists && (value !== undefined)) { - values[count] = value; - count++; - } - } - } - - if (fieldType) { - for (i = 0; i < values.length; i++) { - values[i] = util.convert(values[i], fieldType); - } - } - - return values; - }; - - /** - * Add a single item. Will fail when an item with the same id already exists. - * @param {Object} item - * @return {String} id - * @private - */ - DataSet.prototype._addItem = function (item) { - var id = item[this._fieldId]; - - if (id != undefined) { - // check whether this id is already taken - if (this._data[id]) { - // item already exists - throw new Error('Cannot add item: item with id ' + id + ' already exists'); - } - } - else { - // generate an id - id = util.randomUUID(); - item[this._fieldId] = id; - } - - var d = {}; - for (var field in item) { - if (item.hasOwnProperty(field)) { - var fieldType = this._type[field]; // type may be undefined - d[field] = util.convert(item[field], fieldType); - } - } - this._data[id] = d; - - return id; - }; - - /** - * Get an item. Fields can be converted to a specific type - * @param {String} id - * @param {Object.} [types] field types to convert - * @return {Object | null} item - * @private - */ - DataSet.prototype._getItem = function (id, types) { - var field, value; - - // get the item from the dataset - var raw = this._data[id]; - if (!raw) { - return null; - } - - // convert the items field types - var converted = {}; - if (types) { - for (field in raw) { - if (raw.hasOwnProperty(field)) { - value = raw[field]; - converted[field] = util.convert(value, types[field]); - } - } - } - else { - // no field types specified, no converting needed - for (field in raw) { - if (raw.hasOwnProperty(field)) { - value = raw[field]; - converted[field] = value; - } - } - } - return converted; - }; - - /** - * Update a single item: merge with existing item. - * Will fail when the item has no id, or when there does not exist an item - * with the same id. - * @param {Object} item - * @return {String} id - * @private - */ - DataSet.prototype._updateItem = function (item) { - var id = item[this._fieldId]; - if (id == undefined) { - throw new Error('Cannot update item: item has no id (item: ' + JSON.stringify(item) + ')'); - } - var d = this._data[id]; - if (!d) { - // item doesn't exist - throw new Error('Cannot update item: no item with id ' + id + ' found'); - } - - // merge with current item - for (var field in item) { - if (item.hasOwnProperty(field)) { - var fieldType = this._type[field]; // type may be undefined - d[field] = util.convert(item[field], fieldType); - } - } - - return id; - }; - - /** - * Get an array with the column names of a Google DataTable - * @param {DataTable} dataTable - * @return {String[]} columnNames - * @private - */ - DataSet.prototype._getColumnNames = function (dataTable) { - var columns = []; - for (var col = 0, cols = dataTable.getNumberOfColumns(); col < cols; col++) { - columns[col] = dataTable.getColumnId(col) || dataTable.getColumnLabel(col); - } - return columns; - }; - - /** - * Append an item as a row to the dataTable - * @param dataTable - * @param columns - * @param item - * @private - */ - DataSet.prototype._appendRow = function (dataTable, columns, item) { - var row = dataTable.addRow(); - - for (var col = 0, cols = columns.length; col < cols; col++) { - var field = columns[col]; - dataTable.setValue(row, col, item[field]); - } - }; - - module.exports = DataSet; - - -/***/ }, -/* 4 */ -/***/ function(module, exports, __webpack_require__) { - - var util = __webpack_require__(1); - var DataSet = __webpack_require__(3); - - /** - * DataView - * - * a dataview offers a filtered view on a dataset or an other dataview. - * - * @param {DataSet | DataView} data - * @param {Object} [options] Available options: see method get - * - * @constructor DataView - */ - function DataView (data, options) { - this._data = null; - this._ids = {}; // ids of the items currently in memory (just contains a boolean true) - this._options = options || {}; - this._fieldId = 'id'; // name of the field containing id - this._subscribers = {}; // event subscribers - - var me = this; - this.listener = function () { - me._onEvent.apply(me, arguments); - }; - - this.setData(data); - } - - // TODO: implement a function .config() to dynamically update things like configured filter - // and trigger changes accordingly - - /** - * Set a data source for the view - * @param {DataSet | DataView} data - */ - DataView.prototype.setData = function (data) { - var ids, i, len; - - if (this._data) { - // unsubscribe from current dataset - if (this._data.unsubscribe) { - this._data.unsubscribe('*', this.listener); - } - - // trigger a remove of all items in memory - ids = []; - for (var id in this._ids) { - if (this._ids.hasOwnProperty(id)) { - ids.push(id); - } - } - this._ids = {}; - this._trigger('remove', {items: ids}); - } - - this._data = data; - - if (this._data) { - // update fieldId - this._fieldId = this._options.fieldId || - (this._data && this._data.options && this._data.options.fieldId) || - 'id'; - - // trigger an add of all added items - ids = this._data.getIds({filter: this._options && this._options.filter}); - for (i = 0, len = ids.length; i < len; i++) { - id = ids[i]; - this._ids[id] = true; - } - this._trigger('add', {items: ids}); - - // subscribe to new dataset - if (this._data.on) { - this._data.on('*', this.listener); - } - } - }; - - /** - * Get data from the data view - * - * Usage: - * - * get() - * get(options: Object) - * get(options: Object, data: Array | DataTable) - * - * get(id: Number) - * get(id: Number, options: Object) - * get(id: Number, options: Object, data: Array | DataTable) - * - * get(ids: Number[]) - * get(ids: Number[], options: Object) - * get(ids: Number[], options: Object, data: Array | DataTable) - * - * Where: - * - * {Number | String} id The id of an item - * {Number[] | String{}} ids An array with ids of items - * {Object} options An Object with options. Available options: - * {String} [type] Type of data to be returned. Can - * be 'DataTable' or 'Array' (default) - * {Object.} [convert] - * {String[]} [fields] field names to be returned - * {function} [filter] filter items - * {String | function} [order] Order the items by - * a field name or custom sort function. - * {Array | DataTable} [data] If provided, items will be appended to this - * array or table. Required in case of Google - * DataTable. - * @param args - */ - DataView.prototype.get = function (args) { - var me = this; - - // parse the arguments - var ids, options, data; - var firstType = util.getType(arguments[0]); - if (firstType == 'String' || firstType == 'Number' || firstType == 'Array') { - // get(id(s) [, options] [, data]) - ids = arguments[0]; // can be a single id or an array with ids - options = arguments[1]; - data = arguments[2]; - } - else { - // get([, options] [, data]) - options = arguments[0]; - data = arguments[1]; - } - - // extend the options with the default options and provided options - var viewOptions = util.extend({}, this._options, options); - - // create a combined filter method when needed - if (this._options.filter && options && options.filter) { - viewOptions.filter = function (item) { - return me._options.filter(item) && options.filter(item); - } - } - - // build up the call to the linked data set - var getArguments = []; - if (ids != undefined) { - getArguments.push(ids); - } - getArguments.push(viewOptions); - getArguments.push(data); - - return this._data && this._data.get.apply(this._data, getArguments); - }; - - /** - * Get ids of all items or from a filtered set of items. - * @param {Object} [options] An Object with options. Available options: - * {function} [filter] filter items - * {String | function} [order] Order the items by - * a field name or custom sort function. - * @return {Array} ids - */ - DataView.prototype.getIds = function (options) { - var ids; - - if (this._data) { - var defaultFilter = this._options.filter; - var filter; - - if (options && options.filter) { - if (defaultFilter) { - filter = function (item) { - return defaultFilter(item) && options.filter(item); - } - } - else { - filter = options.filter; - } - } - else { - filter = defaultFilter; - } - - ids = this._data.getIds({ - filter: filter, - order: options && options.order - }); - } - else { - ids = []; - } - - return ids; - }; - - /** - * Get the DataSet to which this DataView is connected. In case there is a chain - * of multiple DataViews, the root DataSet of this chain is returned. - * @return {DataSet} dataSet - */ - DataView.prototype.getDataSet = function () { - var dataSet = this; - while (dataSet instanceof DataView) { - dataSet = dataSet._data; - } - return dataSet || null; - }; - - /** - * Event listener. Will propagate all events from the connected data set to - * the subscribers of the DataView, but will filter the items and only trigger - * when there are changes in the filtered data set. - * @param {String} event - * @param {Object | null} params - * @param {String} senderId - * @private - */ - DataView.prototype._onEvent = function (event, params, senderId) { - var i, len, id, item, - ids = params && params.items, - data = this._data, - added = [], - updated = [], - removed = []; - - if (ids && data) { - switch (event) { - case 'add': - // filter the ids of the added items - for (i = 0, len = ids.length; i < len; i++) { - id = ids[i]; - item = this.get(id); - if (item) { - this._ids[id] = true; - added.push(id); - } - } - - break; - - case 'update': - // determine the event from the views viewpoint: an updated - // item can be added, updated, or removed from this view. - for (i = 0, len = ids.length; i < len; i++) { - id = ids[i]; - item = this.get(id); - - if (item) { - if (this._ids[id]) { - updated.push(id); - } - else { - this._ids[id] = true; - added.push(id); - } - } - else { - if (this._ids[id]) { - delete this._ids[id]; - removed.push(id); - } - else { - // nothing interesting for me :-( - } - } - } - - break; - - case 'remove': - // filter the ids of the removed items - for (i = 0, len = ids.length; i < len; i++) { - id = ids[i]; - if (this._ids[id]) { - delete this._ids[id]; - removed.push(id); - } - } - - break; - } - - if (added.length) { - this._trigger('add', {items: added}, senderId); - } - if (updated.length) { - this._trigger('update', {items: updated}, senderId); - } - if (removed.length) { - this._trigger('remove', {items: removed}, senderId); - } - } - }; - - // copy subscription functionality from DataSet - DataView.prototype.on = DataSet.prototype.on; - DataView.prototype.off = DataSet.prototype.off; - DataView.prototype._trigger = DataSet.prototype._trigger; - - // TODO: make these functions deprecated (replaced with `on` and `off` since version 0.5) - DataView.prototype.subscribe = DataView.prototype.on; - DataView.prototype.unsubscribe = DataView.prototype.off; - - module.exports = DataView; - -/***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { - - var Emitter = __webpack_require__(49); - var DataSet = __webpack_require__(3); - var DataView = __webpack_require__(4); - var util = __webpack_require__(1); - var Point3d = __webpack_require__(9); - var Point2d = __webpack_require__(8); - var Camera = __webpack_require__(6); - var Filter = __webpack_require__(7); - var Slider = __webpack_require__(10); - var StepNumber = __webpack_require__(11); - - /** - * @constructor Graph3d - * Graph3d displays data in 3d. - * - * Graph3d is developed in javascript as a Google Visualization Chart. - * - * @param {Element} container The DOM element in which the Graph3d will - * be created. Normally a div element. - * @param {DataSet | DataView | Array} [data] - * @param {Object} [options] - */ - function Graph3d(container, data, options) { - if (!(this instanceof Graph3d)) { - throw new SyntaxError('Constructor must be called with the new operator'); - } - - // create variables and set default values - this.containerElement = container; - this.width = '400px'; - this.height = '400px'; - this.margin = 10; // px - this.defaultXCenter = '55%'; - this.defaultYCenter = '50%'; - - this.xLabel = 'x'; - this.yLabel = 'y'; - this.zLabel = 'z'; - this.filterLabel = 'time'; - this.legendLabel = 'value'; - - this.style = Graph3d.STYLE.DOT; - this.showPerspective = true; - this.showGrid = true; - this.keepAspectRatio = true; - this.showShadow = false; - this.showGrayBottom = false; // TODO: this does not work correctly - this.showTooltip = false; - this.verticalRatio = 0.5; // 0.1 to 1.0, where 1.0 results in a 'cube' - - this.animationInterval = 1000; // milliseconds - this.animationPreload = false; - - this.camera = new Camera(); - this.eye = new Point3d(0, 0, -1); // TODO: set eye.z about 3/4 of the width of the window? - - this.dataTable = null; // The original data table - this.dataPoints = null; // The table with point objects - - // the column indexes - this.colX = undefined; - this.colY = undefined; - this.colZ = undefined; - this.colValue = undefined; - this.colFilter = undefined; - - this.xMin = 0; - this.xStep = undefined; // auto by default - this.xMax = 1; - this.yMin = 0; - this.yStep = undefined; // auto by default - this.yMax = 1; - this.zMin = 0; - this.zStep = undefined; // auto by default - this.zMax = 1; - this.valueMin = 0; - this.valueMax = 1; - this.xBarWidth = 1; - this.yBarWidth = 1; - // TODO: customize axis range - - // constants - this.colorAxis = '#4D4D4D'; - this.colorGrid = '#D3D3D3'; - this.colorDot = '#7DC1FF'; - this.colorDotBorder = '#3267D2'; - - // create a frame and canvas - this.create(); - - // apply options (also when undefined) - this.setOptions(options); - - // apply data - if (data) { - this.setData(data); - } - } - - // Extend Graph3d with an Emitter mixin - Emitter(Graph3d.prototype); - - /** - * Calculate the scaling values, dependent on the range in x, y, and z direction - */ - Graph3d.prototype._setScale = function() { - this.scale = new Point3d(1 / (this.xMax - this.xMin), - 1 / (this.yMax - this.yMin), - 1 / (this.zMax - this.zMin)); - - // keep aspect ration between x and y scale if desired - if (this.keepAspectRatio) { - if (this.scale.x < this.scale.y) { - //noinspection JSSuspiciousNameCombination - this.scale.y = this.scale.x; - } - else { - //noinspection JSSuspiciousNameCombination - this.scale.x = this.scale.y; - } - } - - // scale the vertical axis - this.scale.z *= this.verticalRatio; - // TODO: can this be automated? verticalRatio? - - // determine scale for (optional) value - this.scale.value = 1 / (this.valueMax - this.valueMin); - - // position the camera arm - var xCenter = (this.xMax + this.xMin) / 2 * this.scale.x; - var yCenter = (this.yMax + this.yMin) / 2 * this.scale.y; - var zCenter = (this.zMax + this.zMin) / 2 * this.scale.z; - this.camera.setArmLocation(xCenter, yCenter, zCenter); - }; - - - /** - * Convert a 3D location to a 2D location on screen - * http://en.wikipedia.org/wiki/3D_projection - * @param {Point3d} point3d A 3D point with parameters x, y, z - * @return {Point2d} point2d A 2D point with parameters x, y - */ - Graph3d.prototype._convert3Dto2D = function(point3d) { - var translation = this._convertPointToTranslation(point3d); - return this._convertTranslationToScreen(translation); - }; - - /** - * Convert a 3D location its translation seen from the camera - * http://en.wikipedia.org/wiki/3D_projection - * @param {Point3d} point3d A 3D point with parameters x, y, z - * @return {Point3d} translation A 3D point with parameters x, y, z This is - * the translation of the point, seen from the - * camera - */ - Graph3d.prototype._convertPointToTranslation = function(point3d) { - var ax = point3d.x * this.scale.x, - ay = point3d.y * this.scale.y, - az = point3d.z * this.scale.z, - - cx = this.camera.getCameraLocation().x, - cy = this.camera.getCameraLocation().y, - cz = this.camera.getCameraLocation().z, - - // calculate angles - sinTx = Math.sin(this.camera.getCameraRotation().x), - cosTx = Math.cos(this.camera.getCameraRotation().x), - sinTy = Math.sin(this.camera.getCameraRotation().y), - cosTy = Math.cos(this.camera.getCameraRotation().y), - sinTz = Math.sin(this.camera.getCameraRotation().z), - cosTz = Math.cos(this.camera.getCameraRotation().z), - - // calculate translation - dx = cosTy * (sinTz * (ay - cy) + cosTz * (ax - cx)) - sinTy * (az - cz), - dy = sinTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) + cosTx * (cosTz * (ay - cy) - sinTz * (ax-cx)), - dz = cosTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) - sinTx * (cosTz * (ay - cy) - sinTz * (ax-cx)); - - return new Point3d(dx, dy, dz); - }; - - /** - * Convert a translation point to a point on the screen - * @param {Point3d} translation A 3D point with parameters x, y, z This is - * the translation of the point, seen from the - * camera - * @return {Point2d} point2d A 2D point with parameters x, y - */ - Graph3d.prototype._convertTranslationToScreen = function(translation) { - var ex = this.eye.x, - ey = this.eye.y, - ez = this.eye.z, - dx = translation.x, - dy = translation.y, - dz = translation.z; - - // calculate position on screen from translation - var bx; - var by; - if (this.showPerspective) { - bx = (dx - ex) * (ez / dz); - by = (dy - ey) * (ez / dz); - } - else { - bx = dx * -(ez / this.camera.getArmLength()); - by = dy * -(ez / this.camera.getArmLength()); - } - - // shift and scale the point to the center of the screen - // use the width of the graph to scale both horizontally and vertically. - return new Point2d( - this.xcenter + bx * this.frame.canvas.clientWidth, - this.ycenter - by * this.frame.canvas.clientWidth); - }; - - /** - * Set the background styling for the graph - * @param {string | {fill: string, stroke: string, strokeWidth: string}} backgroundColor - */ - Graph3d.prototype._setBackgroundColor = function(backgroundColor) { - var fill = 'white'; - var stroke = 'gray'; - var strokeWidth = 1; - - if (typeof(backgroundColor) === 'string') { - fill = backgroundColor; - stroke = 'none'; - strokeWidth = 0; - } - else if (typeof(backgroundColor) === 'object') { - if (backgroundColor.fill !== undefined) fill = backgroundColor.fill; - if (backgroundColor.stroke !== undefined) stroke = backgroundColor.stroke; - if (backgroundColor.strokeWidth !== undefined) strokeWidth = backgroundColor.strokeWidth; - } - else if (backgroundColor === undefined) { - // use use defaults - } - else { - throw 'Unsupported type of backgroundColor'; - } - - this.frame.style.backgroundColor = fill; - this.frame.style.borderColor = stroke; - this.frame.style.borderWidth = strokeWidth + 'px'; - this.frame.style.borderStyle = 'solid'; - }; - - - /// enumerate the available styles - Graph3d.STYLE = { - BAR: 0, - BARCOLOR: 1, - BARSIZE: 2, - DOT : 3, - DOTLINE : 4, - DOTCOLOR: 5, - DOTSIZE: 6, - GRID : 7, - LINE: 8, - SURFACE : 9 - }; - - /** - * Retrieve the style index from given styleName - * @param {string} styleName Style name such as 'dot', 'grid', 'dot-line' - * @return {Number} styleNumber Enumeration value representing the style, or -1 - * when not found - */ - Graph3d.prototype._getStyleNumber = function(styleName) { - switch (styleName) { - case 'dot': return Graph3d.STYLE.DOT; - case 'dot-line': return Graph3d.STYLE.DOTLINE; - case 'dot-color': return Graph3d.STYLE.DOTCOLOR; - case 'dot-size': return Graph3d.STYLE.DOTSIZE; - case 'line': return Graph3d.STYLE.LINE; - case 'grid': return Graph3d.STYLE.GRID; - case 'surface': return Graph3d.STYLE.SURFACE; - case 'bar': return Graph3d.STYLE.BAR; - case 'bar-color': return Graph3d.STYLE.BARCOLOR; - case 'bar-size': return Graph3d.STYLE.BARSIZE; - } - - return -1; - }; - - /** - * Determine the indexes of the data columns, based on the given style and data - * @param {DataSet} data - * @param {Number} style - */ - Graph3d.prototype._determineColumnIndexes = function(data, style) { - if (this.style === Graph3d.STYLE.DOT || - this.style === Graph3d.STYLE.DOTLINE || - this.style === Graph3d.STYLE.LINE || - this.style === Graph3d.STYLE.GRID || - this.style === Graph3d.STYLE.SURFACE || - this.style === Graph3d.STYLE.BAR) { - // 3 columns expected, and optionally a 4th with filter values - this.colX = 0; - this.colY = 1; - this.colZ = 2; - this.colValue = undefined; - - if (data.getNumberOfColumns() > 3) { - this.colFilter = 3; - } - } - else if (this.style === Graph3d.STYLE.DOTCOLOR || - this.style === Graph3d.STYLE.DOTSIZE || - this.style === Graph3d.STYLE.BARCOLOR || - this.style === Graph3d.STYLE.BARSIZE) { - // 4 columns expected, and optionally a 5th with filter values - this.colX = 0; - this.colY = 1; - this.colZ = 2; - this.colValue = 3; - - if (data.getNumberOfColumns() > 4) { - this.colFilter = 4; - } - } - else { - throw 'Unknown style "' + this.style + '"'; - } - }; - - Graph3d.prototype.getNumberOfRows = function(data) { - return data.length; - } - - - Graph3d.prototype.getNumberOfColumns = function(data) { - var counter = 0; - for (var column in data[0]) { - if (data[0].hasOwnProperty(column)) { - counter++; - } - } - return counter; - } - - - Graph3d.prototype.getDistinctValues = function(data, column) { - var distinctValues = []; - for (var i = 0; i < data.length; i++) { - if (distinctValues.indexOf(data[i][column]) == -1) { - distinctValues.push(data[i][column]); - } - } - return distinctValues; - } - - - Graph3d.prototype.getColumnRange = function(data,column) { - var minMax = {min:data[0][column],max:data[0][column]}; - for (var i = 0; i < data.length; i++) { - if (minMax.min > data[i][column]) { minMax.min = data[i][column]; } - if (minMax.max < data[i][column]) { minMax.max = data[i][column]; } - } - return minMax; - }; - - /** - * Initialize the data from the data table. Calculate minimum and maximum values - * and column index values - * @param {Array | DataSet | DataView} rawData The data containing the items for the Graph. - * @param {Number} style Style Number - */ - Graph3d.prototype._dataInitialize = function (rawData, style) { - var me = this; - - // unsubscribe from the dataTable - if (this.dataSet) { - this.dataSet.off('*', this._onChange); - } - - if (rawData === undefined) - return; - - if (Array.isArray(rawData)) { - rawData = new DataSet(rawData); - } - - var data; - if (rawData instanceof DataSet || rawData instanceof DataView) { - data = rawData.get(); - } - else { - throw new Error('Array, DataSet, or DataView expected'); - } - - if (data.length == 0) - return; - - this.dataSet = rawData; - this.dataTable = data; - - // subscribe to changes in the dataset - this._onChange = function () { - me.setData(me.dataSet); - }; - this.dataSet.on('*', this._onChange); - - // _determineColumnIndexes - // getNumberOfRows (points) - // getNumberOfColumns (x,y,z,v,t,t1,t2...) - // getDistinctValues (unique values?) - // getColumnRange - - // determine the location of x,y,z,value,filter columns - this.colX = 'x'; - this.colY = 'y'; - this.colZ = 'z'; - this.colValue = 'style'; - this.colFilter = 'filter'; - - - - // check if a filter column is provided - if (data[0].hasOwnProperty('filter')) { - if (this.dataFilter === undefined) { - this.dataFilter = new Filter(rawData, this.colFilter, this); - this.dataFilter.setOnLoadCallback(function() {me.redraw();}); - } - } - - - var withBars = this.style == Graph3d.STYLE.BAR || - this.style == Graph3d.STYLE.BARCOLOR || - this.style == Graph3d.STYLE.BARSIZE; - - // determine barWidth from data - if (withBars) { - if (this.defaultXBarWidth !== undefined) { - this.xBarWidth = this.defaultXBarWidth; - } - else { - var dataX = this.getDistinctValues(data,this.colX); - this.xBarWidth = (dataX[1] - dataX[0]) || 1; - } - - if (this.defaultYBarWidth !== undefined) { - this.yBarWidth = this.defaultYBarWidth; - } - else { - var dataY = this.getDistinctValues(data,this.colY); - this.yBarWidth = (dataY[1] - dataY[0]) || 1; - } - } - - // calculate minimums and maximums - var xRange = this.getColumnRange(data,this.colX); - if (withBars) { - xRange.min -= this.xBarWidth / 2; - xRange.max += this.xBarWidth / 2; - } - this.xMin = (this.defaultXMin !== undefined) ? this.defaultXMin : xRange.min; - this.xMax = (this.defaultXMax !== undefined) ? this.defaultXMax : xRange.max; - if (this.xMax <= this.xMin) this.xMax = this.xMin + 1; - this.xStep = (this.defaultXStep !== undefined) ? this.defaultXStep : (this.xMax-this.xMin)/5; - - var yRange = this.getColumnRange(data,this.colY); - if (withBars) { - yRange.min -= this.yBarWidth / 2; - yRange.max += this.yBarWidth / 2; - } - this.yMin = (this.defaultYMin !== undefined) ? this.defaultYMin : yRange.min; - this.yMax = (this.defaultYMax !== undefined) ? this.defaultYMax : yRange.max; - if (this.yMax <= this.yMin) this.yMax = this.yMin + 1; - this.yStep = (this.defaultYStep !== undefined) ? this.defaultYStep : (this.yMax-this.yMin)/5; - - var zRange = this.getColumnRange(data,this.colZ); - this.zMin = (this.defaultZMin !== undefined) ? this.defaultZMin : zRange.min; - this.zMax = (this.defaultZMax !== undefined) ? this.defaultZMax : zRange.max; - if (this.zMax <= this.zMin) this.zMax = this.zMin + 1; - this.zStep = (this.defaultZStep !== undefined) ? this.defaultZStep : (this.zMax-this.zMin)/5; - - if (this.colValue !== undefined) { - var valueRange = this.getColumnRange(data,this.colValue); - this.valueMin = (this.defaultValueMin !== undefined) ? this.defaultValueMin : valueRange.min; - this.valueMax = (this.defaultValueMax !== undefined) ? this.defaultValueMax : valueRange.max; - if (this.valueMax <= this.valueMin) this.valueMax = this.valueMin + 1; - } - - // set the scale dependent on the ranges. - this._setScale(); - }; - - - - /** - * Filter the data based on the current filter - * @param {Array} data - * @return {Array} dataPoints Array with point objects which can be drawn on screen - */ - Graph3d.prototype._getDataPoints = function (data) { - // TODO: store the created matrix dataPoints in the filters instead of reloading each time - var x, y, i, z, obj, point; - - var dataPoints = []; - - if (this.style === Graph3d.STYLE.GRID || - this.style === Graph3d.STYLE.SURFACE) { - // copy all values from the google data table to a matrix - // the provided values are supposed to form a grid of (x,y) positions - - // create two lists with all present x and y values - var dataX = []; - var dataY = []; - for (i = 0; i < this.getNumberOfRows(data); i++) { - x = data[i][this.colX] || 0; - y = data[i][this.colY] || 0; - - if (dataX.indexOf(x) === -1) { - dataX.push(x); - } - if (dataY.indexOf(y) === -1) { - dataY.push(y); - } - } - - function sortNumber(a, b) { - return a - b; - } - dataX.sort(sortNumber); - dataY.sort(sortNumber); - - // create a grid, a 2d matrix, with all values. - var dataMatrix = []; // temporary data matrix - for (i = 0; i < data.length; i++) { - x = data[i][this.colX] || 0; - y = data[i][this.colY] || 0; - z = data[i][this.colZ] || 0; - - var xIndex = dataX.indexOf(x); // TODO: implement Array().indexOf() for Internet Explorer - var yIndex = dataY.indexOf(y); - - if (dataMatrix[xIndex] === undefined) { - dataMatrix[xIndex] = []; - } - - var point3d = new Point3d(); - point3d.x = x; - point3d.y = y; - point3d.z = z; - - obj = {}; - obj.point = point3d; - obj.trans = undefined; - obj.screen = undefined; - obj.bottom = new Point3d(x, y, this.zMin); - - dataMatrix[xIndex][yIndex] = obj; - - dataPoints.push(obj); - } - - // fill in the pointers to the neighbors. - for (x = 0; x < dataMatrix.length; x++) { - for (y = 0; y < dataMatrix[x].length; y++) { - if (dataMatrix[x][y]) { - dataMatrix[x][y].pointRight = (x < dataMatrix.length-1) ? dataMatrix[x+1][y] : undefined; - dataMatrix[x][y].pointTop = (y < dataMatrix[x].length-1) ? dataMatrix[x][y+1] : undefined; - dataMatrix[x][y].pointCross = - (x < dataMatrix.length-1 && y < dataMatrix[x].length-1) ? - dataMatrix[x+1][y+1] : - undefined; - } - } - } - } - else { // 'dot', 'dot-line', etc. - // copy all values from the google data table to a list with Point3d objects - for (i = 0; i < data.length; i++) { - point = new Point3d(); - point.x = data[i][this.colX] || 0; - point.y = data[i][this.colY] || 0; - point.z = data[i][this.colZ] || 0; - - if (this.colValue !== undefined) { - point.value = data[i][this.colValue] || 0; - } - - obj = {}; - obj.point = point; - obj.bottom = new Point3d(point.x, point.y, this.zMin); - obj.trans = undefined; - obj.screen = undefined; - - dataPoints.push(obj); - } - } - - return dataPoints; - }; - - /** - * Create the main frame for the Graph3d. - * This function is executed once when a Graph3d object is created. The frame - * contains a canvas, and this canvas contains all objects like the axis and - * nodes. - */ - Graph3d.prototype.create = function () { - // remove all elements from the container element. - while (this.containerElement.hasChildNodes()) { - this.containerElement.removeChild(this.containerElement.firstChild); - } - - this.frame = document.createElement('div'); - this.frame.style.position = 'relative'; - this.frame.style.overflow = 'hidden'; - - // create the graph canvas (HTML canvas element) - this.frame.canvas = document.createElement( 'canvas' ); - this.frame.canvas.style.position = 'relative'; - this.frame.appendChild(this.frame.canvas); - //if (!this.frame.canvas.getContext) { - { - var noCanvas = document.createElement( 'DIV' ); - noCanvas.style.color = 'red'; - noCanvas.style.fontWeight = 'bold' ; - noCanvas.style.padding = '10px'; - noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; - this.frame.canvas.appendChild(noCanvas); - } - - this.frame.filter = document.createElement( 'div' ); - this.frame.filter.style.position = 'absolute'; - this.frame.filter.style.bottom = '0px'; - this.frame.filter.style.left = '0px'; - this.frame.filter.style.width = '100%'; - this.frame.appendChild(this.frame.filter); - - // add event listeners to handle moving and zooming the contents - var me = this; - var onmousedown = function (event) {me._onMouseDown(event);}; - var ontouchstart = function (event) {me._onTouchStart(event);}; - var onmousewheel = function (event) {me._onWheel(event);}; - var ontooltip = function (event) {me._onTooltip(event);}; - // TODO: these events are never cleaned up... can give a 'memory leakage' - - util.addEventListener(this.frame.canvas, 'keydown', onkeydown); - util.addEventListener(this.frame.canvas, 'mousedown', onmousedown); - util.addEventListener(this.frame.canvas, 'touchstart', ontouchstart); - util.addEventListener(this.frame.canvas, 'mousewheel', onmousewheel); - util.addEventListener(this.frame.canvas, 'mousemove', ontooltip); - - // add the new graph to the container element - this.containerElement.appendChild(this.frame); - }; - - - /** - * Set a new size for the graph - * @param {string} width Width in pixels or percentage (for example '800px' - * or '50%') - * @param {string} height Height in pixels or percentage (for example '400px' - * or '30%') - */ - Graph3d.prototype.setSize = function(width, height) { - this.frame.style.width = width; - this.frame.style.height = height; - - this._resizeCanvas(); - }; - - /** - * Resize the canvas to the current size of the frame - */ - Graph3d.prototype._resizeCanvas = function() { - this.frame.canvas.style.width = '100%'; - this.frame.canvas.style.height = '100%'; - - this.frame.canvas.width = this.frame.canvas.clientWidth; - this.frame.canvas.height = this.frame.canvas.clientHeight; - - // adjust with for margin - this.frame.filter.style.width = (this.frame.canvas.clientWidth - 2 * 10) + 'px'; - }; - - /** - * Start animation - */ - Graph3d.prototype.animationStart = function() { - if (!this.frame.filter || !this.frame.filter.slider) - throw 'No animation available'; - - this.frame.filter.slider.play(); - }; - - - /** - * Stop animation - */ - Graph3d.prototype.animationStop = function() { - if (!this.frame.filter || !this.frame.filter.slider) return; - - this.frame.filter.slider.stop(); - }; - - - /** - * Resize the center position based on the current values in this.defaultXCenter - * and this.defaultYCenter (which are strings with a percentage or a value - * in pixels). The center positions are the variables this.xCenter - * and this.yCenter - */ - Graph3d.prototype._resizeCenter = function() { - // calculate the horizontal center position - if (this.defaultXCenter.charAt(this.defaultXCenter.length-1) === '%') { - this.xcenter = - parseFloat(this.defaultXCenter) / 100 * - this.frame.canvas.clientWidth; - } - else { - this.xcenter = parseFloat(this.defaultXCenter); // supposed to be in px - } - - // calculate the vertical center position - if (this.defaultYCenter.charAt(this.defaultYCenter.length-1) === '%') { - this.ycenter = - parseFloat(this.defaultYCenter) / 100 * - (this.frame.canvas.clientHeight - this.frame.filter.clientHeight); - } - else { - this.ycenter = parseFloat(this.defaultYCenter); // supposed to be in px - } - }; - - /** - * Set the rotation and distance of the camera - * @param {Object} pos An object with the camera position. The object - * contains three parameters: - * - horizontal {Number} - * The horizontal rotation, between 0 and 2*PI. - * Optional, can be left undefined. - * - vertical {Number} - * The vertical rotation, between 0 and 0.5*PI - * if vertical=0.5*PI, the graph is shown from the - * top. Optional, can be left undefined. - * - distance {Number} - * The (normalized) distance of the camera to the - * center of the graph, a value between 0.71 and 5.0. - * Optional, can be left undefined. - */ - Graph3d.prototype.setCameraPosition = function(pos) { - if (pos === undefined) { - return; - } - - if (pos.horizontal !== undefined && pos.vertical !== undefined) { - this.camera.setArmRotation(pos.horizontal, pos.vertical); - } - - if (pos.distance !== undefined) { - this.camera.setArmLength(pos.distance); - } - - this.redraw(); - }; - - - /** - * Retrieve the current camera rotation - * @return {object} An object with parameters horizontal, vertical, and - * distance - */ - Graph3d.prototype.getCameraPosition = function() { - var pos = this.camera.getArmRotation(); - pos.distance = this.camera.getArmLength(); - return pos; - }; - - /** - * Load data into the 3D Graph - */ - Graph3d.prototype._readData = function(data) { - // read the data - this._dataInitialize(data, this.style); - - - if (this.dataFilter) { - // apply filtering - this.dataPoints = this.dataFilter._getDataPoints(); - } - else { - // no filtering. load all data - this.dataPoints = this._getDataPoints(this.dataTable); - } - - // draw the filter - this._redrawFilter(); - }; - - /** - * Replace the dataset of the Graph3d - * @param {Array | DataSet | DataView} data - */ - Graph3d.prototype.setData = function (data) { - this._readData(data); - this.redraw(); - - // start animation when option is true - if (this.animationAutoStart && this.dataFilter) { - this.animationStart(); - } - }; - - /** - * Update the options. Options will be merged with current options - * @param {Object} options - */ - Graph3d.prototype.setOptions = function (options) { - var cameraPosition = undefined; - - this.animationStop(); - - if (options !== undefined) { - // retrieve parameter values - if (options.width !== undefined) this.width = options.width; - if (options.height !== undefined) this.height = options.height; - - if (options.xCenter !== undefined) this.defaultXCenter = options.xCenter; - if (options.yCenter !== undefined) this.defaultYCenter = options.yCenter; - - if (options.filterLabel !== undefined) this.filterLabel = options.filterLabel; - if (options.legendLabel !== undefined) this.legendLabel = options.legendLabel; - if (options.xLabel !== undefined) this.xLabel = options.xLabel; - if (options.yLabel !== undefined) this.yLabel = options.yLabel; - if (options.zLabel !== undefined) this.zLabel = options.zLabel; - - if (options.style !== undefined) { - var styleNumber = this._getStyleNumber(options.style); - if (styleNumber !== -1) { - this.style = styleNumber; - } - } - if (options.showGrid !== undefined) this.showGrid = options.showGrid; - if (options.showPerspective !== undefined) this.showPerspective = options.showPerspective; - if (options.showShadow !== undefined) this.showShadow = options.showShadow; - if (options.tooltip !== undefined) this.showTooltip = options.tooltip; - if (options.showAnimationControls !== undefined) this.showAnimationControls = options.showAnimationControls; - if (options.keepAspectRatio !== undefined) this.keepAspectRatio = options.keepAspectRatio; - if (options.verticalRatio !== undefined) this.verticalRatio = options.verticalRatio; - - if (options.animationInterval !== undefined) this.animationInterval = options.animationInterval; - if (options.animationPreload !== undefined) this.animationPreload = options.animationPreload; - if (options.animationAutoStart !== undefined)this.animationAutoStart = options.animationAutoStart; - - if (options.xBarWidth !== undefined) this.defaultXBarWidth = options.xBarWidth; - if (options.yBarWidth !== undefined) this.defaultYBarWidth = options.yBarWidth; - - if (options.xMin !== undefined) this.defaultXMin = options.xMin; - if (options.xStep !== undefined) this.defaultXStep = options.xStep; - if (options.xMax !== undefined) this.defaultXMax = options.xMax; - if (options.yMin !== undefined) this.defaultYMin = options.yMin; - if (options.yStep !== undefined) this.defaultYStep = options.yStep; - if (options.yMax !== undefined) this.defaultYMax = options.yMax; - if (options.zMin !== undefined) this.defaultZMin = options.zMin; - if (options.zStep !== undefined) this.defaultZStep = options.zStep; - if (options.zMax !== undefined) this.defaultZMax = options.zMax; - if (options.valueMin !== undefined) this.defaultValueMin = options.valueMin; - if (options.valueMax !== undefined) this.defaultValueMax = options.valueMax; - - if (options.cameraPosition !== undefined) cameraPosition = options.cameraPosition; - - if (cameraPosition !== undefined) { - this.camera.setArmRotation(cameraPosition.horizontal, cameraPosition.vertical); - this.camera.setArmLength(cameraPosition.distance); - } - else { - this.camera.setArmRotation(1.0, 0.5); - this.camera.setArmLength(1.7); - } - } - - this._setBackgroundColor(options && options.backgroundColor); - - this.setSize(this.width, this.height); - - // re-load the data - if (this.dataTable) { - this.setData(this.dataTable); - } - - // start animation when option is true - if (this.animationAutoStart && this.dataFilter) { - this.animationStart(); - } - }; - - /** - * Redraw the Graph. - */ - Graph3d.prototype.redraw = function() { - if (this.dataPoints === undefined) { - throw 'Error: graph data not initialized'; - } - - this._resizeCanvas(); - this._resizeCenter(); - this._redrawSlider(); - this._redrawClear(); - this._redrawAxis(); - - if (this.style === Graph3d.STYLE.GRID || - this.style === Graph3d.STYLE.SURFACE) { - this._redrawDataGrid(); - } - else if (this.style === Graph3d.STYLE.LINE) { - this._redrawDataLine(); - } - else if (this.style === Graph3d.STYLE.BAR || - this.style === Graph3d.STYLE.BARCOLOR || - this.style === Graph3d.STYLE.BARSIZE) { - this._redrawDataBar(); - } - else { - // style is DOT, DOTLINE, DOTCOLOR, DOTSIZE - this._redrawDataDot(); - } - - this._redrawInfo(); - this._redrawLegend(); - }; - - /** - * Clear the canvas before redrawing - */ - Graph3d.prototype._redrawClear = function() { - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); - - ctx.clearRect(0, 0, canvas.width, canvas.height); - }; - - - /** - * Redraw the legend showing the colors - */ - Graph3d.prototype._redrawLegend = function() { - var y; - - if (this.style === Graph3d.STYLE.DOTCOLOR || - this.style === Graph3d.STYLE.DOTSIZE) { - - var dotSize = this.frame.clientWidth * 0.02; - - var widthMin, widthMax; - if (this.style === Graph3d.STYLE.DOTSIZE) { - widthMin = dotSize / 2; // px - widthMax = dotSize / 2 + dotSize * 2; // Todo: put this in one function - } - else { - widthMin = 20; // px - widthMax = 20; // px - } - - var height = Math.max(this.frame.clientHeight * 0.25, 100); - var top = this.margin; - var right = this.frame.clientWidth - this.margin; - var left = right - widthMax; - var bottom = top + height; - } - - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); - ctx.lineWidth = 1; - ctx.font = '14px arial'; // TODO: put in options - - if (this.style === Graph3d.STYLE.DOTCOLOR) { - // draw the color bar - var ymin = 0; - var ymax = height; // Todo: make height customizable - for (y = ymin; y < ymax; y++) { - var f = (y - ymin) / (ymax - ymin); - - //var width = (dotSize / 2 + (1-f) * dotSize * 2); // Todo: put this in one function - var hue = f * 240; - var color = this._hsv2rgb(hue, 1, 1); - - ctx.strokeStyle = color; - ctx.beginPath(); - ctx.moveTo(left, top + y); - ctx.lineTo(right, top + y); - ctx.stroke(); - } - - ctx.strokeStyle = this.colorAxis; - ctx.strokeRect(left, top, widthMax, height); - } - - if (this.style === Graph3d.STYLE.DOTSIZE) { - // draw border around color bar - ctx.strokeStyle = this.colorAxis; - ctx.fillStyle = this.colorDot; - ctx.beginPath(); - ctx.moveTo(left, top); - ctx.lineTo(right, top); - ctx.lineTo(right - widthMax + widthMin, bottom); - ctx.lineTo(left, bottom); - ctx.closePath(); - ctx.fill(); - ctx.stroke(); - } - - if (this.style === Graph3d.STYLE.DOTCOLOR || - this.style === Graph3d.STYLE.DOTSIZE) { - // print values along the color bar - var gridLineLen = 5; // px - var step = new StepNumber(this.valueMin, this.valueMax, (this.valueMax-this.valueMin)/5, true); - step.start(); - if (step.getCurrent() < this.valueMin) { - step.next(); - } - while (!step.end()) { - y = bottom - (step.getCurrent() - this.valueMin) / (this.valueMax - this.valueMin) * height; - - ctx.beginPath(); - ctx.moveTo(left - gridLineLen, y); - ctx.lineTo(left, y); - ctx.stroke(); - - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = this.colorAxis; - ctx.fillText(step.getCurrent(), left - 2 * gridLineLen, y); - - step.next(); - } - - ctx.textAlign = 'right'; - ctx.textBaseline = 'top'; - var label = this.legendLabel; - ctx.fillText(label, right, bottom + this.margin); - } - }; - - /** - * Redraw the filter - */ - Graph3d.prototype._redrawFilter = function() { - this.frame.filter.innerHTML = ''; - - if (this.dataFilter) { - var options = { - 'visible': this.showAnimationControls - }; - var slider = new Slider(this.frame.filter, options); - this.frame.filter.slider = slider; - - // TODO: css here is not nice here... - this.frame.filter.style.padding = '10px'; - //this.frame.filter.style.backgroundColor = '#EFEFEF'; - - slider.setValues(this.dataFilter.values); - slider.setPlayInterval(this.animationInterval); - - // create an event handler - var me = this; - var onchange = function () { - var index = slider.getIndex(); - - me.dataFilter.selectValue(index); - me.dataPoints = me.dataFilter._getDataPoints(); - - me.redraw(); - }; - slider.setOnChangeCallback(onchange); - } - else { - this.frame.filter.slider = undefined; - } - }; - - /** - * Redraw the slider - */ - Graph3d.prototype._redrawSlider = function() { - if ( this.frame.filter.slider !== undefined) { - this.frame.filter.slider.redraw(); - } - }; - - - /** - * Redraw common information - */ - Graph3d.prototype._redrawInfo = function() { - if (this.dataFilter) { - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); - - ctx.font = '14px arial'; // TODO: put in options - ctx.lineStyle = 'gray'; - ctx.fillStyle = 'gray'; - ctx.textAlign = 'left'; - ctx.textBaseline = 'top'; - - var x = this.margin; - var y = this.margin; - ctx.fillText(this.dataFilter.getLabel() + ': ' + this.dataFilter.getSelectedValue(), x, y); - } - }; - - - /** - * Redraw the axis - */ - Graph3d.prototype._redrawAxis = function() { - var canvas = this.frame.canvas, - ctx = canvas.getContext('2d'), - from, to, step, prettyStep, - text, xText, yText, zText, - offset, xOffset, yOffset, - xMin2d, xMax2d; - - // TODO: get the actual rendered style of the containerElement - //ctx.font = this.containerElement.style.font; - ctx.font = 24 / this.camera.getArmLength() + 'px arial'; - - // calculate the length for the short grid lines - var gridLenX = 0.025 / this.scale.x; - var gridLenY = 0.025 / this.scale.y; - var textMargin = 5 / this.camera.getArmLength(); // px - var armAngle = this.camera.getArmRotation().horizontal; + formatTokenFunctions = { + M : function () { + return this.month() + 1; + }, + MMM : function (format) { + return this.lang().monthsShort(this, format); + }, + MMMM : function (format) { + return this.lang().months(this, format); + }, + D : function () { + return this.date(); + }, + DDD : function () { + return this.dayOfYear(); + }, + d : function () { + return this.day(); + }, + dd : function (format) { + return this.lang().weekdaysMin(this, format); + }, + ddd : function (format) { + return this.lang().weekdaysShort(this, format); + }, + dddd : function (format) { + return this.lang().weekdays(this, format); + }, + w : function () { + return this.week(); + }, + W : function () { + return this.isoWeek(); + }, + YY : function () { + return leftZeroFill(this.year() % 100, 2); + }, + YYYY : function () { + return leftZeroFill(this.year(), 4); + }, + YYYYY : function () { + return leftZeroFill(this.year(), 5); + }, + YYYYYY : function () { + var y = this.year(), sign = y >= 0 ? '+' : '-'; + return sign + leftZeroFill(Math.abs(y), 6); + }, + gg : function () { + return leftZeroFill(this.weekYear() % 100, 2); + }, + gggg : function () { + return leftZeroFill(this.weekYear(), 4); + }, + ggggg : function () { + return leftZeroFill(this.weekYear(), 5); + }, + GG : function () { + return leftZeroFill(this.isoWeekYear() % 100, 2); + }, + GGGG : function () { + return leftZeroFill(this.isoWeekYear(), 4); + }, + GGGGG : function () { + return leftZeroFill(this.isoWeekYear(), 5); + }, + e : function () { + return this.weekday(); + }, + E : function () { + return this.isoWeekday(); + }, + a : function () { + return this.lang().meridiem(this.hours(), this.minutes(), true); + }, + A : function () { + return this.lang().meridiem(this.hours(), this.minutes(), false); + }, + H : function () { + return this.hours(); + }, + h : function () { + return this.hours() % 12 || 12; + }, + m : function () { + return this.minutes(); + }, + s : function () { + return this.seconds(); + }, + S : function () { + return toInt(this.milliseconds() / 100); + }, + SS : function () { + return leftZeroFill(toInt(this.milliseconds() / 10), 2); + }, + SSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + SSSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + Z : function () { + var a = -this.zone(), + b = "+"; + if (a < 0) { + a = -a; + b = "-"; + } + return b + leftZeroFill(toInt(a / 60), 2) + ":" + leftZeroFill(toInt(a) % 60, 2); + }, + ZZ : function () { + var a = -this.zone(), + b = "+"; + if (a < 0) { + a = -a; + b = "-"; + } + return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); + }, + z : function () { + return this.zoneAbbr(); + }, + zz : function () { + return this.zoneName(); + }, + X : function () { + return this.unix(); + }, + Q : function () { + return this.quarter(); + } + }, - // draw x-grid lines - ctx.lineWidth = 1; - prettyStep = (this.defaultXStep === undefined); - step = new StepNumber(this.xMin, this.xMax, this.xStep, prettyStep); - step.start(); - if (step.getCurrent() < this.xMin) { - step.next(); - } - while (!step.end()) { - var x = step.getCurrent(); + lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin']; - if (this.showGrid) { - from = this._convert3Dto2D(new Point3d(x, this.yMin, this.zMin)); - to = this._convert3Dto2D(new Point3d(x, this.yMax, this.zMin)); - ctx.strokeStyle = this.colorGrid; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); + // Pick the first defined of two or three arguments. dfl comes from + // default. + function dfl(a, b, c) { + switch (arguments.length) { + case 2: return a != null ? a : b; + case 3: return a != null ? a : b != null ? b : c; + default: throw new Error("Implement me"); + } } - else { - from = this._convert3Dto2D(new Point3d(x, this.yMin, this.zMin)); - to = this._convert3Dto2D(new Point3d(x, this.yMin+gridLenX, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - from = this._convert3Dto2D(new Point3d(x, this.yMax, this.zMin)); - to = this._convert3Dto2D(new Point3d(x, this.yMax-gridLenX, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); + function defaultParsingFlags() { + // We need to deep clone this object, and es5 standard is not very + // helpful. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso: false + }; } - yText = (Math.cos(armAngle) > 0) ? this.yMin : this.yMax; - text = this._convert3Dto2D(new Point3d(x, yText, this.zMin)); - if (Math.cos(armAngle * 2) > 0) { - ctx.textAlign = 'center'; - ctx.textBaseline = 'top'; - text.y += textMargin; - } - else if (Math.sin(armAngle * 2) < 0){ - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - } - else { - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; + function deprecate(msg, fn) { + var firstTime = true; + function printMsg() { + if (moment.suppressDeprecationWarnings === false && + typeof console !== 'undefined' && console.warn) { + console.warn("Deprecation warning: " + msg); + } + } + return extend(function () { + if (firstTime) { + printMsg(); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); } - ctx.fillStyle = this.colorAxis; - ctx.fillText(' ' + step.getCurrent() + ' ', text.x, text.y); - - step.next(); - } - // draw y-grid lines - ctx.lineWidth = 1; - prettyStep = (this.defaultYStep === undefined); - step = new StepNumber(this.yMin, this.yMax, this.yStep, prettyStep); - step.start(); - if (step.getCurrent() < this.yMin) { - step.next(); - } - while (!step.end()) { - if (this.showGrid) { - from = this._convert3Dto2D(new Point3d(this.xMin, step.getCurrent(), this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMax, step.getCurrent(), this.zMin)); - ctx.strokeStyle = this.colorGrid; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); + function padToken(func, count) { + return function (a) { + return leftZeroFill(func.call(this, a), count); + }; + } + function ordinalizeToken(func, period) { + return function (a) { + return this.lang().ordinal(func.call(this, a), period); + }; } - else { - from = this._convert3Dto2D(new Point3d(this.xMin, step.getCurrent(), this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMin+gridLenY, step.getCurrent(), this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - from = this._convert3Dto2D(new Point3d(this.xMax, step.getCurrent(), this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMax-gridLenY, step.getCurrent(), this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); + while (ordinalizeTokens.length) { + i = ordinalizeTokens.pop(); + formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); + } + while (paddedTokens.length) { + i = paddedTokens.pop(); + formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); } + formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); + + + /************************************ + Constructors + ************************************/ + + function Language() { - xText = (Math.sin(armAngle ) > 0) ? this.xMin : this.xMax; - text = this._convert3Dto2D(new Point3d(xText, step.getCurrent(), this.zMin)); - if (Math.cos(armAngle * 2) < 0) { - ctx.textAlign = 'center'; - ctx.textBaseline = 'top'; - text.y += textMargin; } - else if (Math.sin(armAngle * 2) > 0){ - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; + + // Moment prototype object + function Moment(config) { + checkOverflow(config); + extend(this, config); } - else { - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; + + // Duration Constructor + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._bubble(); } - ctx.fillStyle = this.colorAxis; - ctx.fillText(' ' + step.getCurrent() + ' ', text.x, text.y); - step.next(); - } + /************************************ + Helpers + ************************************/ - // draw z-grid lines and axis - ctx.lineWidth = 1; - prettyStep = (this.defaultZStep === undefined); - step = new StepNumber(this.zMin, this.zMax, this.zStep, prettyStep); - step.start(); - if (step.getCurrent() < this.zMin) { - step.next(); - } - xText = (Math.cos(armAngle ) > 0) ? this.xMin : this.xMax; - yText = (Math.sin(armAngle ) < 0) ? this.yMin : this.yMax; - while (!step.end()) { - // TODO: make z-grid lines really 3d? - from = this._convert3Dto2D(new Point3d(xText, yText, step.getCurrent())); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(from.x - textMargin, from.y); - ctx.stroke(); - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = this.colorAxis; - ctx.fillText(step.getCurrent() + ' ', from.x - 5, from.y); + function extend(a, b) { + for (var i in b) { + if (b.hasOwnProperty(i)) { + a[i] = b[i]; + } + } - step.next(); - } - ctx.lineWidth = 1; - from = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); - to = this._convert3Dto2D(new Point3d(xText, yText, this.zMax)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); + if (b.hasOwnProperty("toString")) { + a.toString = b.toString; + } - // draw x-axis - ctx.lineWidth = 1; - // line at yMin - xMin2d = this._convert3Dto2D(new Point3d(this.xMin, this.yMin, this.zMin)); - xMax2d = this._convert3Dto2D(new Point3d(this.xMax, this.yMin, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(xMin2d.x, xMin2d.y); - ctx.lineTo(xMax2d.x, xMax2d.y); - ctx.stroke(); - // line at ymax - xMin2d = this._convert3Dto2D(new Point3d(this.xMin, this.yMax, this.zMin)); - xMax2d = this._convert3Dto2D(new Point3d(this.xMax, this.yMax, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(xMin2d.x, xMin2d.y); - ctx.lineTo(xMax2d.x, xMax2d.y); - ctx.stroke(); + if (b.hasOwnProperty("valueOf")) { + a.valueOf = b.valueOf; + } - // draw y-axis - ctx.lineWidth = 1; - // line at xMin - from = this._convert3Dto2D(new Point3d(this.xMin, this.yMin, this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMin, this.yMax, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - // line at xMax - from = this._convert3Dto2D(new Point3d(this.xMax, this.yMin, this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMax, this.yMax, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); + return a; + } - // draw x-label - var xLabel = this.xLabel; - if (xLabel.length > 0) { - yOffset = 0.1 / this.scale.y; - xText = (this.xMin + this.xMax) / 2; - yText = (Math.cos(armAngle) > 0) ? this.yMin - yOffset: this.yMax + yOffset; - text = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); - if (Math.cos(armAngle * 2) > 0) { - ctx.textAlign = 'center'; - ctx.textBaseline = 'top'; + function cloneMoment(m) { + var result = {}, i; + for (i in m) { + if (m.hasOwnProperty(i) && momentProperties.hasOwnProperty(i)) { + result[i] = m[i]; + } + } + + return result; } - else if (Math.sin(armAngle * 2) < 0){ - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; + + function absRound(number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } } - else { - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; + + // left zero fill a number + // see http://jsperf.com/left-zero-filling for performance comparison + function leftZeroFill(number, targetLength, forceSign) { + var output = '' + Math.abs(number), + sign = number >= 0; + + while (output.length < targetLength) { + output = '0' + output; + } + return (sign ? (forceSign ? '+' : '') : '-') + output; } - ctx.fillStyle = this.colorAxis; - ctx.fillText(xLabel, text.x, text.y); - } - // draw y-label - var yLabel = this.yLabel; - if (yLabel.length > 0) { - xOffset = 0.1 / this.scale.x; - xText = (Math.sin(armAngle ) > 0) ? this.xMin - xOffset : this.xMax + xOffset; - yText = (this.yMin + this.yMax) / 2; - text = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); - if (Math.cos(armAngle * 2) < 0) { - ctx.textAlign = 'center'; - ctx.textBaseline = 'top'; + // helper function for _.addTime and _.subtractTime + function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = duration._days, + months = duration._months; + updateOffset = updateOffset == null ? true : updateOffset; + + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + if (days) { + rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); + } + if (months) { + rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); + } + if (updateOffset) { + moment.updateOffset(mom, days || months); + } + } + + // check if is an array + function isArray(input) { + return Object.prototype.toString.call(input) === '[object Array]'; } - else if (Math.sin(armAngle * 2) > 0){ - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; + + function isDate(input) { + return Object.prototype.toString.call(input) === '[object Date]' || + input instanceof Date; } - else { - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; } - ctx.fillStyle = this.colorAxis; - ctx.fillText(yLabel, text.x, text.y); - } - // draw z-label - var zLabel = this.zLabel; - if (zLabel.length > 0) { - offset = 30; // pixels. // TODO: relate to the max width of the values on the z axis? - xText = (Math.cos(armAngle ) > 0) ? this.xMin : this.xMax; - yText = (Math.sin(armAngle ) < 0) ? this.yMin : this.yMax; - zText = (this.zMin + this.zMax) / 2; - text = this._convert3Dto2D(new Point3d(xText, yText, zText)); - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = this.colorAxis; - ctx.fillText(zLabel, text.x - offset, text.y); - } - }; + function normalizeUnits(units) { + if (units) { + var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); + units = unitAliases[units] || camelFunctions[lowered] || lowered; + } + return units; + } - /** - * Calculate the color based on the given value. - * @param {Number} H Hue, a value be between 0 and 360 - * @param {Number} S Saturation, a value between 0 and 1 - * @param {Number} V Value, a value between 0 and 1 - */ - Graph3d.prototype._hsv2rgb = function(H, S, V) { - var R, G, B, C, Hi, X; + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; - C = V * S; - Hi = Math.floor(H/60); // hi = 0,1,2,3,4,5 - X = C * (1 - Math.abs(((H/60) % 2) - 1)); + for (prop in inputObject) { + if (inputObject.hasOwnProperty(prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } - switch (Hi) { - case 0: R = C; G = X; B = 0; break; - case 1: R = X; G = C; B = 0; break; - case 2: R = 0; G = C; B = X; break; - case 3: R = 0; G = X; B = C; break; - case 4: R = X; G = 0; B = C; break; - case 5: R = C; G = 0; B = X; break; + return normalizedInput; + } - default: R = 0; G = 0; B = 0; break; - } + function makeList(field) { + var count, setter; - return 'RGB(' + parseInt(R*255) + ',' + parseInt(G*255) + ',' + parseInt(B*255) + ')'; - }; + if (field.indexOf('week') === 0) { + count = 7; + setter = 'day'; + } + else if (field.indexOf('month') === 0) { + count = 12; + setter = 'month'; + } + else { + return; + } + moment[field] = function (format, index) { + var i, getter, + method = moment.fn._lang[field], + results = []; - /** - * Draw all datapoints as a grid - * This function can be used when the style is 'grid' - */ - Graph3d.prototype._redrawDataGrid = function() { - var canvas = this.frame.canvas, - ctx = canvas.getContext('2d'), - point, right, top, cross, - i, - topSideVisible, fillStyle, strokeStyle, lineWidth, - h, s, v, zAvg; + if (typeof format === 'number') { + index = format; + format = undefined; + } + getter = function (i) { + var m = moment().utc().set(setter, i); + return method.call(moment.fn._lang, m, format || ''); + }; - if (this.dataPoints === undefined || this.dataPoints.length <= 0) - return; // TODO: throw exception? + if (index != null) { + return getter(index); + } + else { + for (i = 0; i < count; i++) { + results.push(getter(i)); + } + return results; + } + }; + } - // calculate the translations and screen position of all points - for (i = 0; i < this.dataPoints.length; i++) { - var trans = this._convertPointToTranslation(this.dataPoints[i].point); - var screen = this._convertTranslationToScreen(trans); + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; - this.dataPoints[i].trans = trans; - this.dataPoints[i].screen = screen; + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + if (coercedNumber >= 0) { + value = Math.floor(coercedNumber); + } else { + value = Math.ceil(coercedNumber); + } + } - // calculate the translation of the point at the bottom (needed for sorting) - var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); - this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; - } + return value; + } - // sort the points on depth of their (x,y) position (not on z) - var sortDepth = function (a, b) { - return b.dist - a.dist; - }; - this.dataPoints.sort(sortDepth); + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } - if (this.style === Graph3d.STYLE.SURFACE) { - for (i = 0; i < this.dataPoints.length; i++) { - point = this.dataPoints[i]; - right = this.dataPoints[i].pointRight; - top = this.dataPoints[i].pointTop; - cross = this.dataPoints[i].pointCross; + function weeksInYear(year, dow, doy) { + return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; + } - if (point !== undefined && right !== undefined && top !== undefined && cross !== undefined) { + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } - if (this.showGrayBottom || this.showShadow) { - // calculate the cross product of the two vectors from center - // to left and right, in order to know whether we are looking at the - // bottom or at the top side. We can also use the cross product - // for calculating light intensity - var aDiff = Point3d.subtract(cross.trans, point.trans); - var bDiff = Point3d.subtract(top.trans, right.trans); - var crossproduct = Point3d.crossProduct(aDiff, bDiff); - var len = crossproduct.length(); - // FIXME: there is a bug with determining the surface side (shadow or colored) + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } - topSideVisible = (crossproduct.z > 0); - } - else { - topSideVisible = true; - } + function checkOverflow(m) { + var overflow; + if (m._a && m._pf.overflow === -2) { + overflow = + m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : + m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : + m._a[HOUR] < 0 || m._a[HOUR] > 23 ? HOUR : + m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : + m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : + m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : + -1; - if (topSideVisible) { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - zAvg = (point.point.z + right.point.z + top.point.z + cross.point.z) / 4; - h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; - s = 1; // saturation + if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } - if (this.showShadow) { - v = Math.min(1 + (crossproduct.x / len) / 2, 1); // value. TODO: scale - fillStyle = this._hsv2rgb(h, s, v); - strokeStyle = fillStyle; - } - else { - v = 1; - fillStyle = this._hsv2rgb(h, s, v); - strokeStyle = this.colorAxis; - } - } - else { - fillStyle = 'gray'; - strokeStyle = this.colorAxis; + m._pf.overflow = overflow; } - lineWidth = 0.5; - - ctx.lineWidth = lineWidth; - ctx.fillStyle = fillStyle; - ctx.strokeStyle = strokeStyle; - ctx.beginPath(); - ctx.moveTo(point.screen.x, point.screen.y); - ctx.lineTo(right.screen.x, right.screen.y); - ctx.lineTo(cross.screen.x, cross.screen.y); - ctx.lineTo(top.screen.x, top.screen.y); - ctx.closePath(); - ctx.fill(); - ctx.stroke(); - } } - } - else { // grid style - for (i = 0; i < this.dataPoints.length; i++) { - point = this.dataPoints[i]; - right = this.dataPoints[i].pointRight; - top = this.dataPoints[i].pointTop; - if (point !== undefined) { - if (this.showPerspective) { - lineWidth = 2 / -point.trans.z; - } - else { - lineWidth = 2 * -(this.eye.z / this.camera.getArmLength()); + function isValid(m) { + if (m._isValid == null) { + m._isValid = !isNaN(m._d.getTime()) && + m._pf.overflow < 0 && + !m._pf.empty && + !m._pf.invalidMonth && + !m._pf.nullInput && + !m._pf.invalidFormat && + !m._pf.userInvalidated; + + if (m._strict) { + m._isValid = m._isValid && + m._pf.charsLeftOver === 0 && + m._pf.unusedTokens.length === 0; + } } - } + return m._isValid; + } - if (point !== undefined && right !== undefined) { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - zAvg = (point.point.z + right.point.z) / 2; - h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + function normalizeLanguage(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } - ctx.lineWidth = lineWidth; - ctx.strokeStyle = this._hsv2rgb(h, 1, 1); - ctx.beginPath(); - ctx.moveTo(point.screen.x, point.screen.y); - ctx.lineTo(right.screen.x, right.screen.y); - ctx.stroke(); - } + // Return a moment from input, that is local/utc/zone equivalent to model. + function makeAs(input, model) { + return model._isUTC ? moment(input).zone(model._offset || 0) : + moment(input).local(); + } - if (point !== undefined && top !== undefined) { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - zAvg = (point.point.z + top.point.z) / 2; - h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + /************************************ + Languages + ************************************/ - ctx.lineWidth = lineWidth; - ctx.strokeStyle = this._hsv2rgb(h, 1, 1); - ctx.beginPath(); - ctx.moveTo(point.screen.x, point.screen.y); - ctx.lineTo(top.screen.x, top.screen.y); - ctx.stroke(); - } - } - } - }; + extend(Language.prototype, { - /** - * Draw all datapoints as dots. - * This function can be used when the style is 'dot' or 'dot-line' - */ - Graph3d.prototype._redrawDataDot = function() { - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); - var i; + set : function (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (typeof prop === 'function') { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + }, - if (this.dataPoints === undefined || this.dataPoints.length <= 0) - return; // TODO: throw exception? + _months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), + months : function (m) { + return this._months[m.month()]; + }, - // calculate the translations of all points - for (i = 0; i < this.dataPoints.length; i++) { - var trans = this._convertPointToTranslation(this.dataPoints[i].point); - var screen = this._convertTranslationToScreen(trans); - this.dataPoints[i].trans = trans; - this.dataPoints[i].screen = screen; + _monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), + monthsShort : function (m) { + return this._monthsShort[m.month()]; + }, - // calculate the distance from the point at the bottom to the camera - var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); - this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; - } + monthsParse : function (monthName) { + var i, mom, regex; - // order the translated points by depth - var sortDepth = function (a, b) { - return b.dist - a.dist; - }; - this.dataPoints.sort(sortDepth); + if (!this._monthsParse) { + this._monthsParse = []; + } - // draw the datapoints as colored circles - var dotSize = this.frame.clientWidth * 0.02; // px - for (i = 0; i < this.dataPoints.length; i++) { - var point = this.dataPoints[i]; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + if (!this._monthsParse[i]) { + mom = moment.utc([2000, i]); + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._monthsParse[i].test(monthName)) { + return i; + } + } + }, - if (this.style === Graph3d.STYLE.DOTLINE) { - // draw a vertical line from the bottom to the graph value - //var from = this._convert3Dto2D(new Point3d(point.point.x, point.point.y, this.zMin)); - var from = this._convert3Dto2D(point.bottom); - ctx.lineWidth = 1; - ctx.strokeStyle = this.colorGrid; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(point.screen.x, point.screen.y); - ctx.stroke(); - } + _weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + weekdays : function (m) { + return this._weekdays[m.day()]; + }, - // calculate radius for the circle - var size; - if (this.style === Graph3d.STYLE.DOTSIZE) { - size = dotSize/2 + 2*dotSize * (point.point.value - this.valueMin) / (this.valueMax - this.valueMin); - } - else { - size = dotSize; - } + _weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), + weekdaysShort : function (m) { + return this._weekdaysShort[m.day()]; + }, - var radius; - if (this.showPerspective) { - radius = size / -point.trans.z; - } - else { - radius = size * -(this.eye.z / this.camera.getArmLength()); - } - if (radius < 0) { - radius = 0; - } + _weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), + weekdaysMin : function (m) { + return this._weekdaysMin[m.day()]; + }, - var hue, color, borderColor; - if (this.style === Graph3d.STYLE.DOTCOLOR ) { - // calculate the color based on the value - hue = (1 - (point.point.value - this.valueMin) * this.scale.value) * 240; - color = this._hsv2rgb(hue, 1, 1); - borderColor = this._hsv2rgb(hue, 1, 0.8); - } - else if (this.style === Graph3d.STYLE.DOTSIZE) { - color = this.colorDot; - borderColor = this.colorDotBorder; - } - else { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - hue = (1 - (point.point.z - this.zMin) * this.scale.z / this.verticalRatio) * 240; - color = this._hsv2rgb(hue, 1, 1); - borderColor = this._hsv2rgb(hue, 1, 0.8); - } + weekdaysParse : function (weekdayName) { + var i, mom, regex; - // draw the circle - ctx.lineWidth = 1.0; - ctx.strokeStyle = borderColor; - ctx.fillStyle = color; - ctx.beginPath(); - ctx.arc(point.screen.x, point.screen.y, radius, 0, Math.PI*2, true); - ctx.fill(); - ctx.stroke(); - } - }; + if (!this._weekdaysParse) { + this._weekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + if (!this._weekdaysParse[i]) { + mom = moment([2000, 1]).day(i); + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + }, + + _longDateFormat : { + LT : "h:mm A", + L : "MM/DD/YYYY", + LL : "MMMM D YYYY", + LLL : "MMMM D YYYY LT", + LLLL : "dddd, MMMM D YYYY LT" + }, + longDateFormat : function (key) { + var output = this._longDateFormat[key]; + if (!output && this._longDateFormat[key.toUpperCase()]) { + output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + this._longDateFormat[key] = output; + } + return output; + }, + + isPM : function (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + }, + + _meridiemParse : /[ap]\.?m?\.?/i, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + }, + + _calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendar[key]; + return typeof output === 'function' ? output.apply(mom) : output; + }, + + _relativeTime : { + future : "in %s", + past : "%s ago", + s : "a few seconds", + m : "a minute", + mm : "%d minutes", + h : "an hour", + hh : "%d hours", + d : "a day", + dd : "%d days", + M : "a month", + MM : "%d months", + y : "a year", + yy : "%d years" + }, + relativeTime : function (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (typeof output === 'function') ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + }, + pastFuture : function (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + }, - /** - * Draw all datapoints as bars. - * This function can be used when the style is 'bar', 'bar-color', or 'bar-size' - */ - Graph3d.prototype._redrawDataBar = function() { - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); - var i, j, surface, corners; + ordinal : function (number) { + return this._ordinal.replace("%d", number); + }, + _ordinal : "%d", - if (this.dataPoints === undefined || this.dataPoints.length <= 0) - return; // TODO: throw exception? + preparse : function (string) { + return string; + }, - // calculate the translations of all points - for (i = 0; i < this.dataPoints.length; i++) { - var trans = this._convertPointToTranslation(this.dataPoints[i].point); - var screen = this._convertTranslationToScreen(trans); - this.dataPoints[i].trans = trans; - this.dataPoints[i].screen = screen; + postformat : function (string) { + return string; + }, - // calculate the distance from the point at the bottom to the camera - var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); - this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; - } + week : function (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + }, - // order the translated points by depth - var sortDepth = function (a, b) { - return b.dist - a.dist; - }; - this.dataPoints.sort(sortDepth); + _week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }, - // draw the datapoints as bars - var xWidth = this.xBarWidth / 2; - var yWidth = this.yBarWidth / 2; - for (i = 0; i < this.dataPoints.length; i++) { - var point = this.dataPoints[i]; + _invalidDate: 'Invalid date', + invalidDate: function () { + return this._invalidDate; + } + }); - // determine color - var hue, color, borderColor; - if (this.style === Graph3d.STYLE.BARCOLOR ) { - // calculate the color based on the value - hue = (1 - (point.point.value - this.valueMin) * this.scale.value) * 240; - color = this._hsv2rgb(hue, 1, 1); - borderColor = this._hsv2rgb(hue, 1, 0.8); - } - else if (this.style === Graph3d.STYLE.BARSIZE) { - color = this.colorDot; - borderColor = this.colorDotBorder; - } - else { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - hue = (1 - (point.point.z - this.zMin) * this.scale.z / this.verticalRatio) * 240; - color = this._hsv2rgb(hue, 1, 1); - borderColor = this._hsv2rgb(hue, 1, 0.8); + // Loads a language definition into the `languages` cache. The function + // takes a key and optionally values. If not in the browser and no values + // are provided, it will load the language file module. As a convenience, + // this function also returns the language values. + function loadLang(key, values) { + values.abbr = key; + if (!languages[key]) { + languages[key] = new Language(); + } + languages[key].set(values); + return languages[key]; } - // calculate size for the bar - if (this.style === Graph3d.STYLE.BARSIZE) { - xWidth = (this.xBarWidth / 2) * ((point.point.value - this.valueMin) / (this.valueMax - this.valueMin) * 0.8 + 0.2); - yWidth = (this.yBarWidth / 2) * ((point.point.value - this.valueMin) / (this.valueMax - this.valueMin) * 0.8 + 0.2); + // Remove a language from the `languages` cache. Mostly useful in tests. + function unloadLang(key) { + delete languages[key]; } - // calculate all corner points - var me = this; - var point3d = point.point; - var top = [ - {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, point3d.z)}, - {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, point3d.z)}, - {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, point3d.z)}, - {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, point3d.z)} - ]; - var bottom = [ - {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, this.zMin)}, - {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, this.zMin)}, - {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, this.zMin)}, - {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, this.zMin)} - ]; + // Determines which language definition to use and returns it. + // + // With no parameters, it will return the global language. If you + // pass in a language key, such as 'en', it will return the + // definition for 'en', so long as 'en' has already been loaded using + // moment.lang. + function getLangDefinition(key) { + var i = 0, j, lang, next, split, + get = function (k) { + if (!languages[k] && hasModule) { + try { + __webpack_require__(4)("./" + k); + } catch (e) { } + } + return languages[k]; + }; - // calculate screen location of the points - top.forEach(function (obj) { - obj.screen = me._convert3Dto2D(obj.point); - }); - bottom.forEach(function (obj) { - obj.screen = me._convert3Dto2D(obj.point); - }); + if (!key) { + return moment.fn._lang; + } - // create five sides, calculate both corner points and center points - var surfaces = [ - {corners: top, center: Point3d.avg(bottom[0].point, bottom[2].point)}, - {corners: [top[0], top[1], bottom[1], bottom[0]], center: Point3d.avg(bottom[1].point, bottom[0].point)}, - {corners: [top[1], top[2], bottom[2], bottom[1]], center: Point3d.avg(bottom[2].point, bottom[1].point)}, - {corners: [top[2], top[3], bottom[3], bottom[2]], center: Point3d.avg(bottom[3].point, bottom[2].point)}, - {corners: [top[3], top[0], bottom[0], bottom[3]], center: Point3d.avg(bottom[0].point, bottom[3].point)} - ]; - point.surfaces = surfaces; + if (!isArray(key)) { + //short-circuit everything else + lang = get(key); + if (lang) { + return lang; + } + key = [key]; + } - // calculate the distance of each of the surface centers to the camera - for (j = 0; j < surfaces.length; j++) { - surface = surfaces[j]; - var transCenter = this._convertPointToTranslation(surface.center); - surface.dist = this.showPerspective ? transCenter.length() : -transCenter.z; - // TODO: this dept calculation doesn't work 100% of the cases due to perspective, - // but the current solution is fast/simple and works in 99.9% of all cases - // the issue is visible in example 14, with graph.setCameraPosition({horizontal: 2.97, vertical: 0.5, distance: 0.9}) + //pick the language from the array + //try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + //substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + while (i < key.length) { + split = normalizeLanguage(key[i]).split('-'); + j = split.length; + next = normalizeLanguage(key[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + lang = get(split.slice(0, j).join('-')); + if (lang) { + return lang; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return moment.fn._lang; } - // order the surfaces by their (translated) depth - surfaces.sort(function (a, b) { - var diff = b.dist - a.dist; - if (diff) return diff; + /************************************ + Formatting + ************************************/ - // if equal depth, sort the top surface last - if (a.corners === top) return 1; - if (b.corners === top) return -1; - // both are equal - return 0; - }); + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ""); + } + return input.replace(/\\/g, ""); + } - // draw the ordered surfaces - ctx.lineWidth = 1; - ctx.strokeStyle = borderColor; - ctx.fillStyle = color; - // NOTE: we start at j=2 instead of j=0 as we don't need to draw the two surfaces at the backside - for (j = 2; j < surfaces.length; j++) { - surface = surfaces[j]; - corners = surface.corners; - ctx.beginPath(); - ctx.moveTo(corners[3].screen.x, corners[3].screen.y); - ctx.lineTo(corners[0].screen.x, corners[0].screen.y); - ctx.lineTo(corners[1].screen.x, corners[1].screen.y); - ctx.lineTo(corners[2].screen.x, corners[2].screen.y); - ctx.lineTo(corners[3].screen.x, corners[3].screen.y); - ctx.fill(); - ctx.stroke(); + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = ""; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; } - } - }; + // format date using native date object + function formatMoment(m, format) { + + if (!m.isValid()) { + return m.lang().invalidDate(); + } + + format = expandFormat(format, m.lang()); - /** - * Draw a line through all datapoints. - * This function can be used when the style is 'line' - */ - Graph3d.prototype._redrawDataLine = function() { - var canvas = this.frame.canvas, - ctx = canvas.getContext('2d'), - point, i; + if (!formatFunctions[format]) { + formatFunctions[format] = makeFormatFunction(format); + } - if (this.dataPoints === undefined || this.dataPoints.length <= 0) - return; // TODO: throw exception? + return formatFunctions[format](m); + } - // calculate the translations of all points - for (i = 0; i < this.dataPoints.length; i++) { - var trans = this._convertPointToTranslation(this.dataPoints[i].point); - var screen = this._convertTranslationToScreen(trans); + function expandFormat(format, lang) { + var i = 5; - this.dataPoints[i].trans = trans; - this.dataPoints[i].screen = screen; - } + function replaceLongDateFormatTokens(input) { + return lang.longDateFormat(input) || input; + } - // start the line - if (this.dataPoints.length > 0) { - point = this.dataPoints[0]; + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } - ctx.lineWidth = 1; // TODO: make customizable - ctx.strokeStyle = 'blue'; // TODO: make customizable - ctx.beginPath(); - ctx.moveTo(point.screen.x, point.screen.y); - } + return format; + } - // draw the datapoints as colored circles - for (i = 1; i < this.dataPoints.length; i++) { - point = this.dataPoints[i]; - ctx.lineTo(point.screen.x, point.screen.y); - } - // finish the line - if (this.dataPoints.length > 0) { - ctx.stroke(); - } - }; + /************************************ + Parsing + ************************************/ - /** - * Start a moving operation inside the provided parent element - * @param {Event} event The event that occurred (required for - * retrieving the mouse position) - */ - Graph3d.prototype._onMouseDown = function(event) { - event = event || window.event; - // check if mouse is still down (may be up when focus is lost for example - // in an iframe) - if (this.leftButtonDown) { - this._onMouseUp(event); - } + // get the regex to find the next token + function getParseRegexForToken(token, config) { + var a, strict = config._strict; + switch (token) { + case 'Q': + return parseTokenOneDigit; + case 'DDDD': + return parseTokenThreeDigits; + case 'YYYY': + case 'GGGG': + case 'gggg': + return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; + case 'Y': + case 'G': + case 'g': + return parseTokenSignedNumber; + case 'YYYYYY': + case 'YYYYY': + case 'GGGGG': + case 'ggggg': + return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; + case 'S': + if (strict) { return parseTokenOneDigit; } + /* falls through */ + case 'SS': + if (strict) { return parseTokenTwoDigits; } + /* falls through */ + case 'SSS': + if (strict) { return parseTokenThreeDigits; } + /* falls through */ + case 'DDD': + return parseTokenOneToThreeDigits; + case 'MMM': + case 'MMMM': + case 'dd': + case 'ddd': + case 'dddd': + return parseTokenWord; + case 'a': + case 'A': + return getLangDefinition(config._l)._meridiemParse; + case 'X': + return parseTokenTimestampMs; + case 'Z': + case 'ZZ': + return parseTokenTimezone; + case 'T': + return parseTokenT; + case 'SSSS': + return parseTokenDigits; + case 'MM': + case 'DD': + case 'YY': + case 'GG': + case 'gg': + case 'HH': + case 'hh': + case 'mm': + case 'ss': + case 'ww': + case 'WW': + return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; + case 'M': + case 'D': + case 'd': + case 'H': + case 'h': + case 'm': + case 's': + case 'w': + case 'W': + case 'e': + case 'E': + return parseTokenOneOrTwoDigits; + case 'Do': + return parseTokenOrdinal; + default : + a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), "i")); + return a; + } + } - // only react on left mouse button down - this.leftButtonDown = event.which ? (event.which === 1) : (event.button === 1); - if (!this.leftButtonDown && !this.touchDown) return; + function timezoneMinutesFromString(string) { + string = string || ""; + var possibleTzMatches = (string.match(parseTokenTimezone) || []), + tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], + parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], + minutes = +(parts[1] * 60) + toInt(parts[2]); - // get mouse position (different code for IE and all other browsers) - this.startMouseX = getMouseX(event); - this.startMouseY = getMouseY(event); + return parts[0] === '+' ? -minutes : minutes; + } - this.startStart = new Date(this.start); - this.startEnd = new Date(this.end); - this.startArmRotation = this.camera.getArmRotation(); + // function to convert string input to date + function addTimeToArrayFromToken(token, input, config) { + var a, datePartArray = config._a; + + switch (token) { + // QUARTER + case 'Q': + if (input != null) { + datePartArray[MONTH] = (toInt(input) - 1) * 3; + } + break; + // MONTH + case 'M' : // fall through to MM + case 'MM' : + if (input != null) { + datePartArray[MONTH] = toInt(input) - 1; + } + break; + case 'MMM' : // fall through to MMMM + case 'MMMM' : + a = getLangDefinition(config._l).monthsParse(input); + // if we didn't find a month name, mark the date as invalid. + if (a != null) { + datePartArray[MONTH] = a; + } else { + config._pf.invalidMonth = input; + } + break; + // DAY OF MONTH + case 'D' : // fall through to DD + case 'DD' : + if (input != null) { + datePartArray[DATE] = toInt(input); + } + break; + case 'Do' : + if (input != null) { + datePartArray[DATE] = toInt(parseInt(input, 10)); + } + break; + // DAY OF YEAR + case 'DDD' : // fall through to DDDD + case 'DDDD' : + if (input != null) { + config._dayOfYear = toInt(input); + } + + break; + // YEAR + case 'YY' : + datePartArray[YEAR] = moment.parseTwoDigitYear(input); + break; + case 'YYYY' : + case 'YYYYY' : + case 'YYYYYY' : + datePartArray[YEAR] = toInt(input); + break; + // AM / PM + case 'a' : // fall through to A + case 'A' : + config._isPm = getLangDefinition(config._l).isPM(input); + break; + // 24 HOUR + case 'H' : // fall through to hh + case 'HH' : // fall through to hh + case 'h' : // fall through to hh + case 'hh' : + datePartArray[HOUR] = toInt(input); + break; + // MINUTE + case 'm' : // fall through to mm + case 'mm' : + datePartArray[MINUTE] = toInt(input); + break; + // SECOND + case 's' : // fall through to ss + case 'ss' : + datePartArray[SECOND] = toInt(input); + break; + // MILLISECOND + case 'S' : + case 'SS' : + case 'SSS' : + case 'SSSS' : + datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); + break; + // UNIX TIMESTAMP WITH MS + case 'X': + config._d = new Date(parseFloat(input) * 1000); + break; + // TIMEZONE + case 'Z' : // fall through to ZZ + case 'ZZ' : + config._useUTC = true; + config._tzm = timezoneMinutesFromString(input); + break; + // WEEKDAY - human + case 'dd': + case 'ddd': + case 'dddd': + a = getLangDefinition(config._l).weekdaysParse(input); + // if we didn't get a weekday name, mark the date as invalid + if (a != null) { + config._w = config._w || {}; + config._w['d'] = a; + } else { + config._pf.invalidWeekday = input; + } + break; + // WEEK, WEEK DAY - numeric + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'd': + case 'e': + case 'E': + token = token.substr(0, 1); + /* falls through */ + case 'gggg': + case 'GGGG': + case 'GGGGG': + token = token.substr(0, 2); + if (input) { + config._w = config._w || {}; + config._w[token] = toInt(input); + } + break; + case 'gg': + case 'GG': + config._w = config._w || {}; + config._w[token] = moment.parseTwoDigitYear(input); + } + } - this.frame.style.cursor = 'move'; + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, lang; - // add event listeners to handle moving the contents - // we store the function onmousemove and onmouseup in the graph, so we can - // remove the eventlisteners lateron in the function mouseUp() - var me = this; - this.onmousemove = function (event) {me._onMouseMove(event);}; - this.onmouseup = function (event) {me._onMouseUp(event);}; - util.addEventListener(document, 'mousemove', me.onmousemove); - util.addEventListener(document, 'mouseup', me.onmouseup); - util.preventDefault(event); - }; + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); + week = dfl(w.W, 1); + weekday = dfl(w.E, 1); + } else { + lang = getLangDefinition(config._l); + dow = lang._week.dow; + doy = lang._week.doy; - /** - * Perform moving operating. - * This function activated from within the funcion Graph.mouseDown(). - * @param {Event} event Well, eehh, the event - */ - Graph3d.prototype._onMouseMove = function (event) { - event = event || window.event; + weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); + week = dfl(w.w, 1); - // calculate change in mouse position - var diffX = parseFloat(getMouseX(event)) - this.startMouseX; - var diffY = parseFloat(getMouseY(event)) - this.startMouseY; + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < dow) { + ++week; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + } else { + // default to begining of week + weekday = dow; + } + } + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); - var horizontalNew = this.startArmRotation.horizontal + diffX / 200; - var verticalNew = this.startArmRotation.vertical + diffY / 200; + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } - var snapAngle = 4; // degrees - var snapValue = Math.sin(snapAngle / 360 * 2 * Math.PI); + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function dateFromConfig(config) { + var i, date, input = [], currentDate, yearToUse; - // snap horizontally to nice angles at 0pi, 0.5pi, 1pi, 1.5pi, etc... - // the -0.001 is to take care that the vertical axis is always drawn at the left front corner - if (Math.abs(Math.sin(horizontalNew)) < snapValue) { - horizontalNew = Math.round((horizontalNew / Math.PI)) * Math.PI - 0.001; - } - if (Math.abs(Math.cos(horizontalNew)) < snapValue) { - horizontalNew = (Math.round((horizontalNew/ Math.PI - 0.5)) + 0.5) * Math.PI - 0.001; - } + if (config._d) { + return; + } - // snap vertically to nice angles - if (Math.abs(Math.sin(verticalNew)) < snapValue) { - verticalNew = Math.round((verticalNew / Math.PI)) * Math.PI; - } - if (Math.abs(Math.cos(verticalNew)) < snapValue) { - verticalNew = (Math.round((verticalNew/ Math.PI - 0.5)) + 0.5) * Math.PI; - } + currentDate = currentDateArray(config); - this.camera.setArmRotation(horizontalNew, verticalNew); - this.redraw(); + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } - // fire a cameraPositionChange event - var parameters = this.getCameraPosition(); - this.emit('cameraPositionChange', parameters); + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); - util.preventDefault(event); - }; + if (config._dayOfYear > daysInYear(yearToUse)) { + config._pf._overflowDayOfYear = true; + } + date = makeUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } - /** - * Stop moving operating. - * This function activated from within the funcion Graph.mouseDown(). - * @param {event} event The event - */ - Graph3d.prototype._onMouseUp = function (event) { - this.frame.style.cursor = 'auto'; - this.leftButtonDown = false; + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } - // remove event listeners here - util.removeEventListener(document, 'mousemove', this.onmousemove); - util.removeEventListener(document, 'mouseup', this.onmouseup); - util.preventDefault(event); - }; + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } - /** - * After having moved the mouse, a tooltip should pop up when the mouse is resting on a data point - * @param {Event} event A mouse move event - */ - Graph3d.prototype._onTooltip = function (event) { - var delay = 300; // ms - var mouseX = getMouseX(event) - util.getAbsoluteLeft(this.frame); - var mouseY = getMouseY(event) - util.getAbsoluteTop(this.frame); + config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + // Apply timezone offset from input. The actual zone can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() + config._tzm); + } + } - if (!this.showTooltip) { - return; - } + function dateFromObject(config) { + var normalizedInput; - if (this.tooltipTimeout) { - clearTimeout(this.tooltipTimeout); - } + if (config._d) { + return; + } - // (delayed) display of a tooltip only if no mouse button is down - if (this.leftButtonDown) { - this._hideTooltip(); - return; - } + normalizedInput = normalizeObjectUnits(config._i); + config._a = [ + normalizedInput.year, + normalizedInput.month, + normalizedInput.day, + normalizedInput.hour, + normalizedInput.minute, + normalizedInput.second, + normalizedInput.millisecond + ]; - if (this.tooltip && this.tooltip.dataPoint) { - // tooltip is currently visible - var dataPoint = this._dataPointFromXY(mouseX, mouseY); - if (dataPoint !== this.tooltip.dataPoint) { - // datapoint changed - if (dataPoint) { - this._showTooltip(dataPoint); - } - else { - this._hideTooltip(); - } + dateFromConfig(config); } - } - else { - // tooltip is currently not visible - var me = this; - this.tooltipTimeout = setTimeout(function () { - me.tooltipTimeout = null; - // show a tooltip if we have a data point - var dataPoint = me._dataPointFromXY(mouseX, mouseY); - if (dataPoint) { - me._showTooltip(dataPoint); - } - }, delay); - } - }; - - /** - * Event handler for touchstart event on mobile devices - */ - Graph3d.prototype._onTouchStart = function(event) { - this.touchDown = true; + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [ + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate() + ]; + } else { + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } + } - var me = this; - this.ontouchmove = function (event) {me._onTouchMove(event);}; - this.ontouchend = function (event) {me._onTouchEnd(event);}; - util.addEventListener(document, 'touchmove', me.ontouchmove); - util.addEventListener(document, 'touchend', me.ontouchend); + // date from string and format string + function makeDateFromStringAndFormat(config) { - this._onMouseDown(event); - }; + if (config._f === moment.ISO_8601) { + parseISO(config); + return; + } - /** - * Event handler for touchmove event on mobile devices - */ - Graph3d.prototype._onTouchMove = function(event) { - this._onMouseMove(event); - }; + config._a = []; + config._pf.empty = true; - /** - * Event handler for touchend event on mobile devices - */ - Graph3d.prototype._onTouchEnd = function(event) { - this.touchDown = false; + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var lang = getLangDefinition(config._l), + string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; - util.removeEventListener(document, 'touchmove', this.ontouchmove); - util.removeEventListener(document, 'touchend', this.ontouchend); + tokens = expandFormat(config._f, lang).match(formattingTokens) || []; - this._onMouseUp(event); - }; + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + config._pf.unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + config._pf.empty = false; + } + else { + config._pf.unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + config._pf.unusedTokens.push(token); + } + } + // add remaining unparsed input length to the string + config._pf.charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + config._pf.unusedInput.push(string); + } - /** - * Event handler for mouse wheel event, used to zoom the graph - * Code from http://adomas.org/javascript-mouse-wheel/ - * @param {event} event The event - */ - Graph3d.prototype._onWheel = function(event) { - if (!event) /* For IE. */ - event = window.event; + // handle am pm + if (config._isPm && config._a[HOUR] < 12) { + config._a[HOUR] += 12; + } + // if is 12 am, change hours to 0 + if (config._isPm === false && config._a[HOUR] === 12) { + config._a[HOUR] = 0; + } - // retrieve delta - var delta = 0; - if (event.wheelDelta) { /* IE/Opera. */ - delta = event.wheelDelta/120; - } else if (event.detail) { /* Mozilla case. */ - // In Mozilla, sign of delta is different than in IE. - // Also, delta is multiple of 3. - delta = -event.detail/3; - } + dateFromConfig(config); + checkOverflow(config); + } - // If delta is nonzero, handle it. - // Basically, delta is now positive if wheel was scrolled up, - // and negative, if wheel was scrolled down. - if (delta) { - var oldLength = this.camera.getArmLength(); - var newLength = oldLength * (1 - delta / 10); + function unescapeFormat(s) { + return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }); + } - this.camera.setArmLength(newLength); - this.redraw(); + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function regexpEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } - this._hideTooltip(); - } + // date from string and array of format strings + function makeDateFromStringAndArray(config) { + var tempConfig, + bestMoment, - // fire a cameraPositionChange event - var parameters = this.getCameraPosition(); - this.emit('cameraPositionChange', parameters); + scoreToBeat, + i, + currentScore; - // Prevent default actions caused by mouse wheel. - // That might be ugly, but we handle scrolls somehow - // anyway, so don't bother here.. - util.preventDefault(event); - }; + if (config._f.length === 0) { + config._pf.invalidFormat = true; + config._d = new Date(NaN); + return; + } - /** - * Test whether a point lies inside given 2D triangle - * @param {Point2d} point - * @param {Point2d[]} triangle - * @return {boolean} Returns true if given point lies inside or on the edge of the triangle - * @private - */ - Graph3d.prototype._insideTriangle = function (point, triangle) { - var a = triangle[0], - b = triangle[1], - c = triangle[2]; + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = extend({}, config); + tempConfig._pf = defaultParsingFlags(); + tempConfig._f = config._f[i]; + makeDateFromStringAndFormat(tempConfig); - function sign (x) { - return x > 0 ? 1 : x < 0 ? -1 : 0; - } + if (!isValid(tempConfig)) { + continue; + } - var as = sign((b.x - a.x) * (point.y - a.y) - (b.y - a.y) * (point.x - a.x)); - var bs = sign((c.x - b.x) * (point.y - b.y) - (c.y - b.y) * (point.x - b.x)); - var cs = sign((a.x - c.x) * (point.y - c.y) - (a.y - c.y) * (point.x - c.x)); + // if there is any input that was not parsed add a penalty for that format + currentScore += tempConfig._pf.charsLeftOver; - // each of the three signs must be either equal to each other or zero - return (as == 0 || bs == 0 || as == bs) && - (bs == 0 || cs == 0 || bs == cs) && - (as == 0 || cs == 0 || as == cs); - }; + //or tokens + currentScore += tempConfig._pf.unusedTokens.length * 10; - /** - * Find a data point close to given screen position (x, y) - * @param {Number} x - * @param {Number} y - * @return {Object | null} The closest data point or null if not close to any data point - * @private - */ - Graph3d.prototype._dataPointFromXY = function (x, y) { - var i, - distMax = 100, // px - dataPoint = null, - closestDataPoint = null, - closestDist = null, - center = new Point2d(x, y); + tempConfig._pf.score = currentScore; - if (this.style === Graph3d.STYLE.BAR || - this.style === Graph3d.STYLE.BARCOLOR || - this.style === Graph3d.STYLE.BARSIZE) { - // the data points are ordered from far away to closest - for (i = this.dataPoints.length - 1; i >= 0; i--) { - dataPoint = this.dataPoints[i]; - var surfaces = dataPoint.surfaces; - if (surfaces) { - for (var s = surfaces.length - 1; s >= 0; s--) { - // split each surface in two triangles, and see if the center point is inside one of these - var surface = surfaces[s]; - var corners = surface.corners; - var triangle1 = [corners[0].screen, corners[1].screen, corners[2].screen]; - var triangle2 = [corners[2].screen, corners[3].screen, corners[0].screen]; - if (this._insideTriangle(center, triangle1) || - this._insideTriangle(center, triangle2)) { - // return immediately at the first hit - return dataPoint; - } + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } } - } + + extend(config, bestMoment || tempConfig); } - } - else { - // find the closest data point, using distance to the center of the point on 2d screen - for (i = 0; i < this.dataPoints.length; i++) { - dataPoint = this.dataPoints[i]; - var point = dataPoint.screen; - if (point) { - var distX = Math.abs(x - point.x); - var distY = Math.abs(y - point.y); - var dist = Math.sqrt(distX * distX + distY * distY); - if ((closestDist === null || dist < closestDist) && dist < distMax) { - closestDist = dist; - closestDataPoint = dataPoint; + // date from iso format + function parseISO(config) { + var i, l, + string = config._i, + match = isoRegex.exec(string); + + if (match) { + config._pf.iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(string)) { + // match[5] should be "T" or undefined + config._f = isoDates[i][0] + (match[6] || " "); + break; + } + } + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (string.match(parseTokenTimezone)) { + config._f += "Z"; + } + makeDateFromStringAndFormat(config); + } else { + config._isValid = false; } - } } - } - - - return closestDataPoint; - }; - - /** - * Display a tooltip for given data point - * @param {Object} dataPoint - * @private - */ - Graph3d.prototype._showTooltip = function (dataPoint) { - var content, line, dot; - - if (!this.tooltip) { - content = document.createElement('div'); - content.style.position = 'absolute'; - content.style.padding = '10px'; - content.style.border = '1px solid #4d4d4d'; - content.style.color = '#1a1a1a'; - content.style.background = 'rgba(255,255,255,0.7)'; - content.style.borderRadius = '2px'; - content.style.boxShadow = '5px 5px 10px rgba(128,128,128,0.5)'; - line = document.createElement('div'); - line.style.position = 'absolute'; - line.style.height = '40px'; - line.style.width = '0'; - line.style.borderLeft = '1px solid #4d4d4d'; + // date from iso format or fallback + function makeDateFromString(config) { + parseISO(config); + if (config._isValid === false) { + delete config._isValid; + moment.createFromInputFallback(config); + } + } - dot = document.createElement('div'); - dot.style.position = 'absolute'; - dot.style.height = '0'; - dot.style.width = '0'; - dot.style.border = '5px solid #4d4d4d'; - dot.style.borderRadius = '5px'; + function makeDateFromInput(config) { + var input = config._i, + matched = aspNetJsonRegex.exec(input); - this.tooltip = { - dataPoint: null, - dom: { - content: content, - line: line, - dot: dot - } - }; - } - else { - content = this.tooltip.dom.content; - line = this.tooltip.dom.line; - dot = this.tooltip.dom.dot; - } + if (input === undefined) { + config._d = new Date(); + } else if (matched) { + config._d = new Date(+matched[1]); + } else if (typeof input === 'string') { + makeDateFromString(config); + } else if (isArray(input)) { + config._a = input.slice(0); + dateFromConfig(config); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if (typeof(input) === 'object') { + dateFromObject(config); + } else if (typeof(input) === 'number') { + // from milliseconds + config._d = new Date(input); + } else { + moment.createFromInputFallback(config); + } + } - this._hideTooltip(); + function makeDate(y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); - this.tooltip.dataPoint = dataPoint; - if (typeof this.showTooltip === 'function') { - content.innerHTML = this.showTooltip(dataPoint.point); - } - else { - content.innerHTML = '' + - '' + - '' + - '' + - '
x:' + dataPoint.point.x + '
y:' + dataPoint.point.y + '
z:' + dataPoint.point.z + '
'; - } + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); + } + return date; + } - content.style.left = '0'; - content.style.top = '0'; - this.frame.appendChild(content); - this.frame.appendChild(line); - this.frame.appendChild(dot); + function makeUTCDate(y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); + } + return date; + } - // calculate sizes - var contentWidth = content.offsetWidth; - var contentHeight = content.offsetHeight; - var lineHeight = line.offsetHeight; - var dotWidth = dot.offsetWidth; - var dotHeight = dot.offsetHeight; + function parseWeekday(input, language) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = language.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } + } + return input; + } - var left = dataPoint.screen.x - contentWidth / 2; - left = Math.min(Math.max(left, 10), this.frame.clientWidth - 10 - contentWidth); + /************************************ + Relative Time + ************************************/ - line.style.left = dataPoint.screen.x + 'px'; - line.style.top = (dataPoint.screen.y - lineHeight) + 'px'; - content.style.left = left + 'px'; - content.style.top = (dataPoint.screen.y - lineHeight - contentHeight) + 'px'; - dot.style.left = (dataPoint.screen.x - dotWidth / 2) + 'px'; - dot.style.top = (dataPoint.screen.y - dotHeight / 2) + 'px'; - }; - /** - * Hide the tooltip when displayed - * @private - */ - Graph3d.prototype._hideTooltip = function () { - if (this.tooltip) { - this.tooltip.dataPoint = null; + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, lang) { + return lang.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } - for (var prop in this.tooltip.dom) { - if (this.tooltip.dom.hasOwnProperty(prop)) { - var elem = this.tooltip.dom[prop]; - if (elem && elem.parentNode) { - elem.parentNode.removeChild(elem); - } - } + function relativeTime(milliseconds, withoutSuffix, lang) { + var seconds = round(Math.abs(milliseconds) / 1000), + minutes = round(seconds / 60), + hours = round(minutes / 60), + days = round(hours / 24), + years = round(days / 365), + args = seconds < relativeTimeThresholds.s && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < relativeTimeThresholds.m && ['mm', minutes] || + hours === 1 && ['h'] || + hours < relativeTimeThresholds.h && ['hh', hours] || + days === 1 && ['d'] || + days <= relativeTimeThresholds.dd && ['dd', days] || + days <= relativeTimeThresholds.dm && ['M'] || + days < relativeTimeThresholds.dy && ['MM', round(days / 30)] || + years === 1 && ['y'] || ['yy', years]; + args[2] = withoutSuffix; + args[3] = milliseconds > 0; + args[4] = lang; + return substituteTimeAgo.apply({}, args); } - } - }; - /**--------------------------------------------------------------------------**/ + /************************************ + Week of Year + ************************************/ - /** - * Get the horizontal mouse position from a mouse event - * @param {Event} event - * @return {Number} mouse x - */ - getMouseX = function(event) { - if ('clientX' in event) return event.clientX; - return event.targetTouches[0] && event.targetTouches[0].clientX || 0; - }; - /** - * Get the vertical mouse position from a mouse event - * @param {Event} event - * @return {Number} mouse y - */ - getMouseY = function(event) { - if ('clientY' in event) return event.clientY; - return event.targetTouches[0] && event.targetTouches[0].clientY || 0; - }; + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; - module.exports = Graph3d; + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; + } -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } - var Point3d = __webpack_require__(9); + adjustedMoment = moment(mom).add('d', daysToDayOfWeek); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; + } - /** - * @class Camera - * The camera is mounted on a (virtual) camera arm. The camera arm can rotate - * The camera is always looking in the direction of the origin of the arm. - * This way, the camera always rotates around one fixed point, the location - * of the camera arm. - * - * Documentation: - * http://en.wikipedia.org/wiki/3D_projection - */ - Camera = function () { - this.armLocation = new Point3d(); - this.armRotation = {}; - this.armRotation.horizontal = 0; - this.armRotation.vertical = 0; - this.armLength = 1.7; + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; - this.cameraLocation = new Point3d(); - this.cameraRotation = new Point3d(0.5*Math.PI, 0, 0); + d = d === 0 ? 7 : d; + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; - this.calculateCameraOrientation(); - }; + return { + year: dayOfYear > 0 ? year : year - 1, + dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; + } - /** - * Set the location (origin) of the arm - * @param {Number} x Normalized value of x - * @param {Number} y Normalized value of y - * @param {Number} z Normalized value of z - */ - Camera.prototype.setArmLocation = function(x, y, z) { - this.armLocation.x = x; - this.armLocation.y = y; - this.armLocation.z = z; + /************************************ + Top Level Functions + ************************************/ - this.calculateCameraOrientation(); - }; + function makeMoment(config) { + var input = config._i, + format = config._f; - /** - * Set the rotation of the camera arm - * @param {Number} horizontal The horizontal rotation, between 0 and 2*PI. - * Optional, can be left undefined. - * @param {Number} vertical The vertical rotation, between 0 and 0.5*PI - * if vertical=0.5*PI, the graph is shown from the - * top. Optional, can be left undefined. - */ - Camera.prototype.setArmRotation = function(horizontal, vertical) { - if (horizontal !== undefined) { - this.armRotation.horizontal = horizontal; - } + if (input === null || (format === undefined && input === '')) { + return moment.invalid({nullInput: true}); + } - if (vertical !== undefined) { - this.armRotation.vertical = vertical; - if (this.armRotation.vertical < 0) this.armRotation.vertical = 0; - if (this.armRotation.vertical > 0.5*Math.PI) this.armRotation.vertical = 0.5*Math.PI; - } + if (typeof input === 'string') { + config._i = input = getLangDefinition().preparse(input); + } - if (horizontal !== undefined || vertical !== undefined) { - this.calculateCameraOrientation(); - } - }; + if (moment.isMoment(input)) { + config = cloneMoment(input); - /** - * Retrieve the current arm rotation - * @return {object} An object with parameters horizontal and vertical - */ - Camera.prototype.getArmRotation = function() { - var rot = {}; - rot.horizontal = this.armRotation.horizontal; - rot.vertical = this.armRotation.vertical; + config._d = new Date(+input._d); + } else if (format) { + if (isArray(format)) { + makeDateFromStringAndArray(config); + } else { + makeDateFromStringAndFormat(config); + } + } else { + makeDateFromInput(config); + } - return rot; - }; + return new Moment(config); + } - /** - * Set the (normalized) length of the camera arm. - * @param {Number} length A length between 0.71 and 5.0 - */ - Camera.prototype.setArmLength = function(length) { - if (length === undefined) - return; + moment = function (input, format, lang, strict) { + var c; - this.armLength = length; + if (typeof(lang) === "boolean") { + strict = lang; + lang = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._i = input; + c._f = format; + c._l = lang; + c._strict = strict; + c._isUTC = false; + c._pf = defaultParsingFlags(); - // Radius must be larger than the corner of the graph, - // which has a distance of sqrt(0.5^2+0.5^2) = 0.71 from the center of the - // graph - if (this.armLength < 0.71) this.armLength = 0.71; - if (this.armLength > 5.0) this.armLength = 5.0; + return makeMoment(c); + }; - this.calculateCameraOrientation(); - }; + moment.suppressDeprecationWarnings = false; - /** - * Retrieve the arm length - * @return {Number} length - */ - Camera.prototype.getArmLength = function() { - return this.armLength; - }; + moment.createFromInputFallback = deprecate( + "moment construction falls back to js Date. This is " + + "discouraged and will be removed in upcoming major " + + "release. Please refer to " + + "https://github.com/moment/moment/issues/1407 for more info.", + function (config) { + config._d = new Date(config._i); + }); - /** - * Retrieve the camera location - * @return {Point3d} cameraLocation - */ - Camera.prototype.getCameraLocation = function() { - return this.cameraLocation; - }; + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return moment(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } - /** - * Retrieve the camera rotation - * @return {Point3d} cameraRotation - */ - Camera.prototype.getCameraRotation = function() { - return this.cameraRotation; - }; + moment.min = function () { + var args = [].slice.call(arguments, 0); - /** - * Calculate the location and rotation of the camera based on the - * position and orientation of the camera arm - */ - Camera.prototype.calculateCameraOrientation = function() { - // calculate location of the camera - this.cameraLocation.x = this.armLocation.x - this.armLength * Math.sin(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical); - this.cameraLocation.y = this.armLocation.y - this.armLength * Math.cos(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical); - this.cameraLocation.z = this.armLocation.z + this.armLength * Math.sin(this.armRotation.vertical); + return pickBy('isBefore', args); + }; - // calculate rotation of the camera - this.cameraRotation.x = Math.PI/2 - this.armRotation.vertical; - this.cameraRotation.y = 0; - this.cameraRotation.z = -this.armRotation.horizontal; - }; + moment.max = function () { + var args = [].slice.call(arguments, 0); - module.exports = Camera; + return pickBy('isAfter', args); + }; -/***/ }, -/* 7 */ -/***/ function(module, exports, __webpack_require__) { + // creating with utc + moment.utc = function (input, format, lang, strict) { + var c; - var DataView = __webpack_require__(4); + if (typeof(lang) === "boolean") { + strict = lang; + lang = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._useUTC = true; + c._isUTC = true; + c._l = lang; + c._i = input; + c._f = format; + c._strict = strict; + c._pf = defaultParsingFlags(); - /** - * @class Filter - * - * @param {DataSet} data The google data table - * @param {Number} column The index of the column to be filtered - * @param {Graph} graph The graph - */ - function Filter (data, column, graph) { - this.data = data; - this.column = column; - this.graph = graph; // the parent graph + return makeMoment(c).utc(); + }; - this.index = undefined; - this.value = undefined; + // creating with unix timestamp (in seconds) + moment.unix = function (input) { + return moment(input * 1000); + }; - // read all distinct values and select the first one - this.values = graph.getDistinctValues(data.get(), this.column); + // duration + moment.duration = function (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + parseIso; - // sort both numeric and string values correctly - this.values.sort(function (a, b) { - return a > b ? 1 : a < b ? -1 : 0; - }); + if (moment.isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { + sign = (match[1] === "-") ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoDurationRegex.exec(input))) { + sign = (match[1] === "-") ? -1 : 1; + parseIso = function (inp) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + }; + duration = { + y: parseIso(match[2]), + M: parseIso(match[3]), + d: parseIso(match[4]), + h: parseIso(match[5]), + m: parseIso(match[6]), + s: parseIso(match[7]), + w: parseIso(match[8]) + }; + } - if (this.values.length > 0) { - this.selectValue(0); - } + ret = new Duration(duration); - // create an array with the filtered datapoints. this will be loaded afterwards - this.dataPoints = []; + if (moment.isDuration(input) && input.hasOwnProperty('_lang')) { + ret._lang = input._lang; + } - this.loaded = false; - this.onLoadCallback = undefined; + return ret; + }; - if (graph.animationPreload) { - this.loaded = false; - this.loadInBackground(); - } - else { - this.loaded = true; - } - }; + // version number + moment.version = VERSION; + // default format + moment.defaultFormat = isoFormat; - /** - * Return the label - * @return {string} label - */ - Filter.prototype.isLoaded = function() { - return this.loaded; - }; + // constant that refers to the ISO standard + moment.ISO_8601 = function () {}; + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + moment.momentProperties = momentProperties; - /** - * Return the loaded progress - * @return {Number} percentage between 0 and 100 - */ - Filter.prototype.getLoadedProgress = function() { - var len = this.values.length; + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + moment.updateOffset = function () {}; - var i = 0; - while (this.dataPoints[i]) { - i++; - } + // This function allows you to set a threshold for relative time strings + moment.relativeTimeThreshold = function(threshold, limit) { + if (relativeTimeThresholds[threshold] === undefined) { + return false; + } + relativeTimeThresholds[threshold] = limit; + return true; + }; - return Math.round(i / len * 100); - }; + // This function will load languages and then set the global language. If + // no arguments are passed in, it will simply return the current global + // language key. + moment.lang = function (key, values) { + var r; + if (!key) { + return moment.fn._lang._abbr; + } + if (values) { + loadLang(normalizeLanguage(key), values); + } else if (values === null) { + unloadLang(key); + key = 'en'; + } else if (!languages[key]) { + getLangDefinition(key); + } + r = moment.duration.fn._lang = moment.fn._lang = getLangDefinition(key); + return r._abbr; + }; + // returns language data + moment.langData = function (key) { + if (key && key._lang && key._lang._abbr) { + key = key._lang._abbr; + } + return getLangDefinition(key); + }; - /** - * Return the label - * @return {string} label - */ - Filter.prototype.getLabel = function() { - return this.graph.filterLabel; - }; + // compare moment object + moment.isMoment = function (obj) { + return obj instanceof Moment || + (obj != null && obj.hasOwnProperty('_isAMomentObject')); + }; + // for typechecking Duration objects + moment.isDuration = function (obj) { + return obj instanceof Duration; + }; - /** - * Return the columnIndex of the filter - * @return {Number} columnIndex - */ - Filter.prototype.getColumn = function() { - return this.column; - }; + for (i = lists.length - 1; i >= 0; --i) { + makeList(lists[i]); + } - /** - * Return the currently selected value. Returns undefined if there is no selection - * @return {*} value - */ - Filter.prototype.getSelectedValue = function() { - if (this.index === undefined) - return undefined; + moment.normalizeUnits = function (units) { + return normalizeUnits(units); + }; - return this.values[this.index]; - }; + moment.invalid = function (flags) { + var m = moment.utc(NaN); + if (flags != null) { + extend(m._pf, flags); + } + else { + m._pf.userInvalidated = true; + } - /** - * Retrieve all values of the filter - * @return {Array} values - */ - Filter.prototype.getValues = function() { - return this.values; - }; + return m; + }; - /** - * Retrieve one value of the filter - * @param {Number} index - * @return {*} value - */ - Filter.prototype.getValue = function(index) { - if (index >= this.values.length) - throw 'Error: index out of range'; + moment.parseZone = function () { + return moment.apply(null, arguments).parseZone(); + }; - return this.values[index]; - }; + moment.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + /************************************ + Moment Prototype + ************************************/ - /** - * Retrieve the (filtered) dataPoints for the currently selected filter index - * @param {Number} [index] (optional) - * @return {Array} dataPoints - */ - Filter.prototype._getDataPoints = function(index) { - if (index === undefined) - index = this.index; - if (index === undefined) - return []; + extend(moment.fn = Moment.prototype, { - var dataPoints; - if (this.dataPoints[index]) { - dataPoints = this.dataPoints[index]; - } - else { - var f = {}; - f.column = this.column; - f.value = this.values[index]; + clone : function () { + return moment(this); + }, - var dataView = new DataView(this.data,{filter: function (item) {return (item[f.column] == f.value);}}).get(); - dataPoints = this.graph._getDataPoints(dataView); + valueOf : function () { + return +this._d + ((this._offset || 0) * 60000); + }, - this.dataPoints[index] = dataPoints; - } + unix : function () { + return Math.floor(+this / 1000); + }, - return dataPoints; - }; + toString : function () { + return this.clone().lang('en').format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ"); + }, + toDate : function () { + return this._offset ? new Date(+this) : this._d; + }, + toISOString : function () { + var m = moment(this).utc(); + if (0 < m.year() && m.year() <= 9999) { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + }, - /** - * Set a callback function when the filter is fully loaded. - */ - Filter.prototype.setOnLoadCallback = function(callback) { - this.onLoadCallback = callback; - }; + toArray : function () { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hours(), + m.minutes(), + m.seconds(), + m.milliseconds() + ]; + }, + isValid : function () { + return isValid(this); + }, - /** - * Add a value to the list with available values for this filter - * No double entries will be created. - * @param {Number} index - */ - Filter.prototype.selectValue = function(index) { - if (index >= this.values.length) - throw 'Error: index out of range'; + isDSTShifted : function () { - this.index = index; - this.value = this.values[index]; - }; + if (this._a) { + return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + } - /** - * Load all filtered rows in the background one by one - * Start this method without providing an index! - */ - Filter.prototype.loadInBackground = function(index) { - if (index === undefined) - index = 0; + return false; + }, - var frame = this.graph.frame; + parsingFlags : function () { + return extend({}, this._pf); + }, - if (index < this.values.length) { - var dataPointsTemp = this._getDataPoints(index); - //this.graph.redrawInfo(); // TODO: not neat + invalidAt: function () { + return this._pf.overflow; + }, - // create a progress box - if (frame.progress === undefined) { - frame.progress = document.createElement('DIV'); - frame.progress.style.position = 'absolute'; - frame.progress.style.color = 'gray'; - frame.appendChild(frame.progress); - } - var progress = this.getLoadedProgress(); - frame.progress.innerHTML = 'Loading animation... ' + progress + '%'; - // TODO: this is no nice solution... - frame.progress.style.bottom = 60 + 'px'; // TODO: use height of slider - frame.progress.style.left = 10 + 'px'; + utc : function () { + return this.zone(0); + }, - var me = this; - setTimeout(function() {me.loadInBackground(index+1);}, 10); - this.loaded = false; - } - else { - this.loaded = true; + local : function () { + this.zone(0); + this._isUTC = false; + return this; + }, - // remove the progress box - if (frame.progress !== undefined) { - frame.removeChild(frame.progress); - frame.progress = undefined; - } + format : function (inputString) { + var output = formatMoment(this, inputString || moment.defaultFormat); + return this.lang().postformat(output); + }, - if (this.onLoadCallback) - this.onLoadCallback(); - } - }; + add : function (input, val) { + var dur; + // switch args to support add('s', 1) and add(1, 's') + if (typeof input === 'string' && typeof val === 'string') { + dur = moment.duration(isNaN(+val) ? +input : +val, isNaN(+val) ? val : input); + } else if (typeof input === 'string') { + dur = moment.duration(+val, input); + } else { + dur = moment.duration(input, val); + } + addOrSubtractDurationFromMoment(this, dur, 1); + return this; + }, - module.exports = Filter; + subtract : function (input, val) { + var dur; + // switch args to support subtract('s', 1) and subtract(1, 's') + if (typeof input === 'string' && typeof val === 'string') { + dur = moment.duration(isNaN(+val) ? +input : +val, isNaN(+val) ? val : input); + } else if (typeof input === 'string') { + dur = moment.duration(+val, input); + } else { + dur = moment.duration(input, val); + } + addOrSubtractDurationFromMoment(this, dur, -1); + return this; + }, + diff : function (input, units, asFloat) { + var that = makeAs(input, this), + zoneDiff = (this.zone() - that.zone()) * 6e4, + diff, output; -/***/ }, -/* 8 */ -/***/ function(module, exports, __webpack_require__) { + units = normalizeUnits(units); - /** - * @prototype Point2d - * @param {Number} [x] - * @param {Number} [y] - */ - Point2d = function (x, y) { - this.x = x !== undefined ? x : 0; - this.y = y !== undefined ? y : 0; - }; + if (units === 'year' || units === 'month') { + // average number of days in the months in the given dates + diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2 + // difference in months + output = ((this.year() - that.year()) * 12) + (this.month() - that.month()); + // adjust by taking difference in days, average number of days + // and dst in the given months. + output += ((this - moment(this).startOf('month')) - + (that - moment(that).startOf('month'))) / diff; + // same as above but with zones, to negate all dst + output -= ((this.zone() - moment(this).startOf('month').zone()) - + (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff; + if (units === 'year') { + output = output / 12; + } + } else { + diff = (this - that); + output = units === 'second' ? diff / 1e3 : // 1000 + units === 'minute' ? diff / 6e4 : // 1000 * 60 + units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + diff; + } + return asFloat ? output : absRound(output); + }, - module.exports = Point2d; + from : function (time, withoutSuffix) { + return moment.duration(this.diff(time)).lang(this.lang()._abbr).humanize(!withoutSuffix); + }, + fromNow : function (withoutSuffix) { + return this.from(moment(), withoutSuffix); + }, -/***/ }, -/* 9 */ -/***/ function(module, exports, __webpack_require__) { + calendar : function (time) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're zone'd or not. + var now = time || moment(), + sod = makeAs(now, this).startOf('day'), + diff = this.diff(sod, 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.lang().calendar(format, this)); + }, - /** - * @prototype Point3d - * @param {Number} [x] - * @param {Number} [y] - * @param {Number} [z] - */ - function Point3d(x, y, z) { - this.x = x !== undefined ? x : 0; - this.y = y !== undefined ? y : 0; - this.z = z !== undefined ? z : 0; - }; + isLeapYear : function () { + return isLeapYear(this.year()); + }, - /** - * Subtract the two provided points, returns a-b - * @param {Point3d} a - * @param {Point3d} b - * @return {Point3d} a-b - */ - Point3d.subtract = function(a, b) { - var sub = new Point3d(); - sub.x = a.x - b.x; - sub.y = a.y - b.y; - sub.z = a.z - b.z; - return sub; - }; + isDST : function () { + return (this.zone() < this.clone().month(0).zone() || + this.zone() < this.clone().month(5).zone()); + }, - /** - * Add the two provided points, returns a+b - * @param {Point3d} a - * @param {Point3d} b - * @return {Point3d} a+b - */ - Point3d.add = function(a, b) { - var sum = new Point3d(); - sum.x = a.x + b.x; - sum.y = a.y + b.y; - sum.z = a.z + b.z; - return sum; - }; + day : function (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.lang()); + return this.add({ d : input - day }); + } else { + return day; + } + }, - /** - * Calculate the average of two 3d points - * @param {Point3d} a - * @param {Point3d} b - * @return {Point3d} The average, (a+b)/2 - */ - Point3d.avg = function(a, b) { - return new Point3d( - (a.x + b.x) / 2, - (a.y + b.y) / 2, - (a.z + b.z) / 2 - ); - }; + month : makeAccessor('Month', true), - /** - * Calculate the cross product of the two provided points, returns axb - * Documentation: http://en.wikipedia.org/wiki/Cross_product - * @param {Point3d} a - * @param {Point3d} b - * @return {Point3d} cross product axb - */ - Point3d.crossProduct = function(a, b) { - var crossproduct = new Point3d(); + startOf: function (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + /* falls through */ + } - crossproduct.x = a.y * b.z - a.z * b.y; - crossproduct.y = a.z * b.x - a.x * b.z; - crossproduct.z = a.x * b.y - a.y * b.x; + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } else if (units === 'isoWeek') { + this.isoWeekday(1); + } - return crossproduct; - }; + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + return this; + }, - /** - * Rtrieve the length of the vector (or the distance from this point to the origin - * @return {Number} length - */ - Point3d.prototype.length = function() { - return Math.sqrt( - this.x * this.x + - this.y * this.y + - this.z * this.z - ); - }; + endOf: function (units) { + units = normalizeUnits(units); + return this.startOf(units).add((units === 'isoWeek' ? 'week' : units), 1).subtract('ms', 1); + }, - module.exports = Point3d; + isAfter: function (input, units) { + units = typeof units !== 'undefined' ? units : 'millisecond'; + return +this.clone().startOf(units) > +moment(input).startOf(units); + }, + isBefore: function (input, units) { + units = typeof units !== 'undefined' ? units : 'millisecond'; + return +this.clone().startOf(units) < +moment(input).startOf(units); + }, -/***/ }, -/* 10 */ -/***/ function(module, exports, __webpack_require__) { + isSame: function (input, units) { + units = units || 'ms'; + return +this.clone().startOf(units) === +makeAs(input, this).startOf(units); + }, - var util = __webpack_require__(1); + min: deprecate( + "moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548", + function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + } + ), - /** - * @constructor Slider - * - * An html slider control with start/stop/prev/next buttons - * @param {Element} container The element where the slider will be created - * @param {Object} options Available options: - * {boolean} visible If true (default) the - * slider is visible. - */ - function Slider(container, options) { - if (container === undefined) { - throw 'Error: No container element defined'; - } - this.container = container; - this.visible = (options && options.visible != undefined) ? options.visible : true; + max: deprecate( + "moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548", + function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + } + ), - if (this.visible) { - this.frame = document.createElement('DIV'); - //this.frame.style.backgroundColor = '#E5E5E5'; - this.frame.style.width = '100%'; - this.frame.style.position = 'relative'; - this.container.appendChild(this.frame); + // keepTime = true means only change the timezone, without affecting + // the local hour. So 5:31:26 +0300 --[zone(2, true)]--> 5:31:26 +0200 + // It is possible that 5:31:26 doesn't exist int zone +0200, so we + // adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + zone : function (input, keepTime) { + var offset = this._offset || 0; + if (input != null) { + if (typeof input === "string") { + input = timezoneMinutesFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + this._offset = input; + this._isUTC = true; + if (offset !== input) { + if (!keepTime || this._changeInProgress) { + addOrSubtractDurationFromMoment(this, + moment.duration(offset - input, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + moment.updateOffset(this, true); + this._changeInProgress = null; + } + } + } else { + return this._isUTC ? offset : this._d.getTimezoneOffset(); + } + return this; + }, - this.frame.prev = document.createElement('INPUT'); - this.frame.prev.type = 'BUTTON'; - this.frame.prev.value = 'Prev'; - this.frame.appendChild(this.frame.prev); + zoneAbbr : function () { + return this._isUTC ? "UTC" : ""; + }, - this.frame.play = document.createElement('INPUT'); - this.frame.play.type = 'BUTTON'; - this.frame.play.value = 'Play'; - this.frame.appendChild(this.frame.play); + zoneName : function () { + return this._isUTC ? "Coordinated Universal Time" : ""; + }, - this.frame.next = document.createElement('INPUT'); - this.frame.next.type = 'BUTTON'; - this.frame.next.value = 'Next'; - this.frame.appendChild(this.frame.next); + parseZone : function () { + if (this._tzm) { + this.zone(this._tzm); + } else if (typeof this._i === 'string') { + this.zone(this._i); + } + return this; + }, - this.frame.bar = document.createElement('INPUT'); - this.frame.bar.type = 'BUTTON'; - this.frame.bar.style.position = 'absolute'; - this.frame.bar.style.border = '1px solid red'; - this.frame.bar.style.width = '100px'; - this.frame.bar.style.height = '6px'; - this.frame.bar.style.borderRadius = '2px'; - this.frame.bar.style.MozBorderRadius = '2px'; - this.frame.bar.style.border = '1px solid #7F7F7F'; - this.frame.bar.style.backgroundColor = '#E5E5E5'; - this.frame.appendChild(this.frame.bar); + hasAlignedHourOffset : function (input) { + if (!input) { + input = 0; + } + else { + input = moment(input).zone(); + } - this.frame.slide = document.createElement('INPUT'); - this.frame.slide.type = 'BUTTON'; - this.frame.slide.style.margin = '0px'; - this.frame.slide.value = ' '; - this.frame.slide.style.position = 'relative'; - this.frame.slide.style.left = '-100px'; - this.frame.appendChild(this.frame.slide); + return (this.zone() - input) % 60 === 0; + }, - // create events - var me = this; - this.frame.slide.onmousedown = function (event) {me._onMouseDown(event);}; - this.frame.prev.onclick = function (event) {me.prev(event);}; - this.frame.play.onclick = function (event) {me.togglePlay(event);}; - this.frame.next.onclick = function (event) {me.next(event);}; - } + daysInMonth : function () { + return daysInMonth(this.year(), this.month()); + }, - this.onChangeCallback = undefined; + dayOfYear : function (input) { + var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add("d", (input - dayOfYear)); + }, - this.values = []; - this.index = undefined; + quarter : function (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + }, - this.playTimeout = undefined; - this.playInterval = 1000; // milliseconds - this.playLoop = true; - } + weekYear : function (input) { + var year = weekOfYear(this, this.lang()._week.dow, this.lang()._week.doy).year; + return input == null ? year : this.add("y", (input - year)); + }, - /** - * Select the previous index - */ - Slider.prototype.prev = function() { - var index = this.getIndex(); - if (index > 0) { - index--; - this.setIndex(index); - } - }; + isoWeekYear : function (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add("y", (input - year)); + }, - /** - * Select the next index - */ - Slider.prototype.next = function() { - var index = this.getIndex(); - if (index < this.values.length - 1) { - index++; - this.setIndex(index); - } - }; + week : function (input) { + var week = this.lang().week(this); + return input == null ? week : this.add("d", (input - week) * 7); + }, - /** - * Select the next index - */ - Slider.prototype.playNext = function() { - var start = new Date(); + isoWeek : function (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add("d", (input - week) * 7); + }, - var index = this.getIndex(); - if (index < this.values.length - 1) { - index++; - this.setIndex(index); - } - else if (this.playLoop) { - // jump to the start - index = 0; - this.setIndex(index); - } + weekday : function (input) { + var weekday = (this.day() + 7 - this.lang()._week.dow) % 7; + return input == null ? weekday : this.add("d", input - weekday); + }, - var end = new Date(); - var diff = (end - start); + isoWeekday : function (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + }, - // calculate how much time it to to set the index and to execute the callback - // function. - var interval = Math.max(this.playInterval - diff, 0); - // document.title = diff // TODO: cleanup + isoWeeksInYear : function () { + return weeksInYear(this.year(), 1, 4); + }, - var me = this; - this.playTimeout = setTimeout(function() {me.playNext();}, interval); - }; + weeksInYear : function () { + var weekInfo = this._lang._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + }, - /** - * Toggle start or stop playing - */ - Slider.prototype.togglePlay = function() { - if (this.playTimeout === undefined) { - this.play(); - } else { - this.stop(); - } - }; + get : function (units) { + units = normalizeUnits(units); + return this[units](); + }, - /** - * Start playing - */ - Slider.prototype.play = function() { - // Test whether already playing - if (this.playTimeout) return; + set : function (units, value) { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + this[units](value); + } + return this; + }, - this.playNext(); + // If passed a language key, it will set the language for this + // instance. Otherwise, it will return the language configuration + // variables for this instance. + lang : function (key) { + if (key === undefined) { + return this._lang; + } else { + this._lang = getLangDefinition(key); + return this; + } + } + }); - if (this.frame) { - this.frame.play.value = 'Stop'; - } - }; + function rawMonthSetter(mom, value) { + var dayOfMonth; - /** - * Stop playing - */ - Slider.prototype.stop = function() { - clearInterval(this.playTimeout); - this.playTimeout = undefined; + // TODO: Move this out of here! + if (typeof value === 'string') { + value = mom.lang().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } + } - if (this.frame) { - this.frame.play.value = 'Play'; - } - }; + dayOfMonth = Math.min(mom.date(), + daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } - /** - * Set a callback function which will be triggered when the value of the - * slider bar has changed. - */ - Slider.prototype.setOnChangeCallback = function(callback) { - this.onChangeCallback = callback; - }; + function rawGetter(mom, unit) { + return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + } - /** - * Set the interval for playing the list - * @param {Number} interval The interval in milliseconds - */ - Slider.prototype.setPlayInterval = function(interval) { - this.playInterval = interval; - }; + function rawSetter(mom, unit, value) { + if (unit === 'Month') { + return rawMonthSetter(mom, value); + } else { + return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } - /** - * Retrieve the current play interval - * @return {Number} interval The interval in milliseconds - */ - Slider.prototype.getPlayInterval = function(interval) { - return this.playInterval; - }; + function makeAccessor(unit, keepTime) { + return function (value) { + if (value != null) { + rawSetter(this, unit, value); + moment.updateOffset(this, keepTime); + return this; + } else { + return rawGetter(this, unit); + } + }; + } - /** - * Set looping on or off - * @pararm {boolean} doLoop If true, the slider will jump to the start when - * the end is passed, and will jump to the end - * when the start is passed. - */ - Slider.prototype.setPlayLoop = function(doLoop) { - this.playLoop = doLoop; - }; + moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); + moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); + moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); + // Setting the hour should keep the time, because the user explicitly + // specified which hour he wants. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); + // moment.fn.month is defined separately + moment.fn.date = makeAccessor('Date', true); + moment.fn.dates = deprecate("dates accessor is deprecated. Use date instead.", makeAccessor('Date', true)); + moment.fn.year = makeAccessor('FullYear', true); + moment.fn.years = deprecate("years accessor is deprecated. Use year instead.", makeAccessor('FullYear', true)); + // add plural methods + moment.fn.days = moment.fn.day; + moment.fn.months = moment.fn.month; + moment.fn.weeks = moment.fn.week; + moment.fn.isoWeeks = moment.fn.isoWeek; + moment.fn.quarters = moment.fn.quarter; - /** - * Execute the onchange callback function - */ - Slider.prototype.onChange = function() { - if (this.onChangeCallback !== undefined) { - this.onChangeCallback(); - } - }; + // add aliased format methods + moment.fn.toJSON = moment.fn.toISOString; - /** - * redraw the slider on the correct place - */ - Slider.prototype.redraw = function() { - if (this.frame) { - // resize the bar - this.frame.bar.style.top = (this.frame.clientHeight/2 - - this.frame.bar.offsetHeight/2) + 'px'; - this.frame.bar.style.width = (this.frame.clientWidth - - this.frame.prev.clientWidth - - this.frame.play.clientWidth - - this.frame.next.clientWidth - 30) + 'px'; + /************************************ + Duration Prototype + ************************************/ - // position the slider button - var left = this.indexToLeft(this.index); - this.frame.slide.style.left = (left) + 'px'; - } - }; + extend(moment.duration.fn = Duration.prototype, { - /** - * Set the list with values for the slider - * @param {Array} values A javascript array with values (any type) - */ - Slider.prototype.setValues = function(values) { - this.values = values; + _bubble : function () { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, minutes, hours, years; - if (this.values.length > 0) - this.setIndex(0); - else - this.index = undefined; - }; + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; - /** - * Select a value by its index - * @param {Number} index - */ - Slider.prototype.setIndex = function(index) { - if (index < this.values.length) { - this.index = index; + seconds = absRound(milliseconds / 1000); + data.seconds = seconds % 60; - this.redraw(); - this.onChange(); - } - else { - throw 'Error: index out of range'; - } - }; + minutes = absRound(seconds / 60); + data.minutes = minutes % 60; - /** - * retrieve the index of the currently selected vaue - * @return {Number} index - */ - Slider.prototype.getIndex = function() { - return this.index; - }; + hours = absRound(minutes / 60); + data.hours = hours % 24; + + days += absRound(hours / 24); + data.days = days % 30; + months += absRound(days / 30); + data.months = months % 12; - /** - * retrieve the currently selected value - * @return {*} value - */ - Slider.prototype.get = function() { - return this.values[this.index]; - }; + years = absRound(months / 12); + data.years = years; + }, + weeks : function () { + return absRound(this.days() / 7); + }, - Slider.prototype._onMouseDown = function(event) { - // only react on left mouse button down - var leftButtonDown = event.which ? (event.which === 1) : (event.button === 1); - if (!leftButtonDown) return; + valueOf : function () { + return this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6; + }, - this.startClientX = event.clientX; - this.startSlideX = parseFloat(this.frame.slide.style.left); + humanize : function (withSuffix) { + var difference = +this, + output = relativeTime(difference, !withSuffix, this.lang()); - this.frame.style.cursor = 'move'; + if (withSuffix) { + output = this.lang().pastFuture(difference, output); + } - // add event listeners to handle moving the contents - // we store the function onmousemove and onmouseup in the graph, so we can - // remove the eventlisteners lateron in the function mouseUp() - var me = this; - this.onmousemove = function (event) {me._onMouseMove(event);}; - this.onmouseup = function (event) {me._onMouseUp(event);}; - util.addEventListener(document, 'mousemove', this.onmousemove); - util.addEventListener(document, 'mouseup', this.onmouseup); - util.preventDefault(event); - }; + return this.lang().postformat(output); + }, + add : function (input, val) { + // supports only 2.0-style add(1, 's') or add(moment) + var dur = moment.duration(input, val); - Slider.prototype.leftToIndex = function (left) { - var width = parseFloat(this.frame.bar.style.width) - - this.frame.slide.clientWidth - 10; - var x = left - 3; + this._milliseconds += dur._milliseconds; + this._days += dur._days; + this._months += dur._months; - var index = Math.round(x / width * (this.values.length-1)); - if (index < 0) index = 0; - if (index > this.values.length-1) index = this.values.length-1; + this._bubble(); - return index; - }; + return this; + }, - Slider.prototype.indexToLeft = function (index) { - var width = parseFloat(this.frame.bar.style.width) - - this.frame.slide.clientWidth - 10; + subtract : function (input, val) { + var dur = moment.duration(input, val); - var x = index / (this.values.length-1) * width; - var left = x + 3; + this._milliseconds -= dur._milliseconds; + this._days -= dur._days; + this._months -= dur._months; - return left; - }; + this._bubble(); + return this; + }, + get : function (units) { + units = normalizeUnits(units); + return this[units.toLowerCase() + 's'](); + }, - Slider.prototype._onMouseMove = function (event) { - var diff = event.clientX - this.startClientX; - var x = this.startSlideX + diff; + as : function (units) { + units = normalizeUnits(units); + return this['as' + units.charAt(0).toUpperCase() + units.slice(1) + 's'](); + }, - var index = this.leftToIndex(x); + lang : moment.fn.lang, - this.setIndex(index); + toIsoString : function () { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var years = Math.abs(this.years()), + months = Math.abs(this.months()), + days = Math.abs(this.days()), + hours = Math.abs(this.hours()), + minutes = Math.abs(this.minutes()), + seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); - util.preventDefault(); - }; + if (!this.asSeconds()) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + return (this.asSeconds() < 0 ? '-' : '') + + 'P' + + (years ? years + 'Y' : '') + + (months ? months + 'M' : '') + + (days ? days + 'D' : '') + + ((hours || minutes || seconds) ? 'T' : '') + + (hours ? hours + 'H' : '') + + (minutes ? minutes + 'M' : '') + + (seconds ? seconds + 'S' : ''); + } + }); - Slider.prototype._onMouseUp = function (event) { - this.frame.style.cursor = 'auto'; + function makeDurationGetter(name) { + moment.duration.fn[name] = function () { + return this._data[name]; + }; + } - // remove event listeners - util.removeEventListener(document, 'mousemove', this.onmousemove); - util.removeEventListener(document, 'mouseup', this.onmouseup); + function makeDurationAsGetter(name, factor) { + moment.duration.fn['as' + name] = function () { + return +this / factor; + }; + } - util.preventDefault(); - }; + for (i in unitMillisecondFactors) { + if (unitMillisecondFactors.hasOwnProperty(i)) { + makeDurationAsGetter(i, unitMillisecondFactors[i]); + makeDurationGetter(i.toLowerCase()); + } + } - module.exports = Slider; + makeDurationAsGetter('Weeks', 6048e5); + moment.duration.fn.asMonths = function () { + return (+this - this.years() * 31536e6) / 2592e6 + this.years() * 12; + }; -/***/ }, -/* 11 */ -/***/ function(module, exports, __webpack_require__) { + /************************************ + Default Lang + ************************************/ - /** - * @prototype StepNumber - * The class StepNumber is an iterator for Numbers. You provide a start and end - * value, and a best step size. StepNumber itself rounds to fixed values and - * a finds the step that best fits the provided step. - * - * If prettyStep is true, the step size is chosen as close as possible to the - * provided step, but being a round value like 1, 2, 5, 10, 20, 50, .... - * - * Example usage: - * var step = new StepNumber(0, 10, 2.5, true); - * step.start(); - * while (!step.end()) { - * alert(step.getCurrent()); - * step.next(); - * } - * - * Version: 1.0 - * - * @param {Number} start The start value - * @param {Number} end The end value - * @param {Number} step Optional. Step size. Must be a positive value. - * @param {boolean} prettyStep Optional. If true, the step size is rounded - * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...) - */ - function StepNumber(start, end, step, prettyStep) { - // set default values - this._start = 0; - this._end = 0; - this._step = 1; - this.prettyStep = true; - this.precision = 5; - this._current = 0; - this.setRange(start, end, step, prettyStep); - }; + // Set default language, other languages will inherit from English. + moment.lang('en', { + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); - /** - * Set a new range: start, end and step. - * - * @param {Number} start The start value - * @param {Number} end The end value - * @param {Number} step Optional. Step size. Must be a positive value. - * @param {boolean} prettyStep Optional. If true, the step size is rounded - * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...) - */ - StepNumber.prototype.setRange = function(start, end, step, prettyStep) { - this._start = start ? start : 0; - this._end = end ? end : 0; + /* EMBED_LANGUAGES */ - this.setStep(step, prettyStep); - }; + /************************************ + Exposing Moment + ************************************/ - /** - * Set a new step size - * @param {Number} step New step size. Must be a positive value - * @param {boolean} prettyStep Optional. If true, the provided step is rounded - * to a pretty step size (like 1, 2, 5, 10, 20, 50, ...) - */ - StepNumber.prototype.setStep = function(step, prettyStep) { - if (step === undefined || step <= 0) - return; + function makeGlobal(shouldDeprecate) { + /*global ender:false */ + if (typeof ender !== 'undefined') { + return; + } + oldGlobalMoment = globalScope.moment; + if (shouldDeprecate) { + globalScope.moment = deprecate( + "Accessing Moment through the global scope is " + + "deprecated, and will be removed in an upcoming " + + "release.", + moment); + } else { + globalScope.moment = moment; + } + } + + // CommonJS module is defined + if (hasModule) { + module.exports = moment; + } else if (true) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, module) { + if (module.config && module.config() && module.config().noGlobal === true) { + // release the global variable + globalScope.moment = oldGlobalMoment; + } + + return moment; + }.call(exports, __webpack_require__, exports, module)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + makeGlobal(true); + } else { + makeGlobal(); + } + }).call(this); + + /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(5)(module))) - if (prettyStep !== undefined) - this.prettyStep = prettyStep; +/***/ }, +/* 4 */ +/***/ function(module, exports, __webpack_require__) { - if (this.prettyStep === true) - this._step = StepNumber.calculatePrettyStep(step); - else - this._step = step; + var map = {}; + function webpackContext(req) { + return __webpack_require__(webpackContextResolve(req)); }; + function webpackContextResolve(req) { + return map[req] || (function() { throw new Error("Cannot find module '" + req + "'.") }()); + }; + webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); + }; + webpackContext.resolve = webpackContextResolve; + module.exports = webpackContext; - /** - * Calculate a nice step size, closest to the desired step size. - * Returns a value in one of the ranges 1*10^n, 2*10^n, or 5*10^n, where n is an - * integer Number. For example 1, 2, 5, 10, 20, 50, etc... - * @param {Number} step Desired step size - * @return {Number} Nice step size - */ - StepNumber.calculatePrettyStep = function (step) { - var log10 = function (x) {return Math.log(x) / Math.LN10;}; - - // try three steps (multiple of 1, 2, or 5 - var step1 = Math.pow(10, Math.round(log10(step))), - step2 = 2 * Math.pow(10, Math.round(log10(step / 2))), - step5 = 5 * Math.pow(10, Math.round(log10(step / 5))); - // choose the best step (closest to minimum step) - var prettyStep = step1; - if (Math.abs(step2 - step) <= Math.abs(prettyStep - step)) prettyStep = step2; - if (Math.abs(step5 - step) <= Math.abs(prettyStep - step)) prettyStep = step5; +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { - // for safety - if (prettyStep <= 0) { - prettyStep = 1; - } + module.exports = function(module) { + if(!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + module.children = []; + module.webpackPolyfill = 1; + } + return module; + } - return prettyStep; - }; - /** - * returns the current value of the step - * @return {Number} current value - */ - StepNumber.prototype.getCurrent = function () { - return parseFloat(this._current.toPrecision(this.precision)); - }; +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { - /** - * returns the current step size - * @return {Number} current step size - */ - StepNumber.prototype.getStep = function () { - return this._step; - }; + // DOM utility methods /** - * Set the current value to the largest value smaller than start, which - * is a multiple of the step size + * this prepares the JSON container for allocating SVG elements + * @param JSONcontainer + * @private */ - StepNumber.prototype.start = function() { - this._current = this._start - this._start % this._step; + exports.prepareElements = function(JSONcontainer) { + // cleanup the redundant svgElements; + for (var elementType in JSONcontainer) { + if (JSONcontainer.hasOwnProperty(elementType)) { + JSONcontainer[elementType].redundant = JSONcontainer[elementType].used; + JSONcontainer[elementType].used = []; + } + } }; /** - * Do a step, add the step size to the current value + * this cleans up all the unused SVG elements. By asking for the parentNode, we only need to supply the JSON container from + * which to remove the redundant elements. + * + * @param JSONcontainer + * @private */ - StepNumber.prototype.next = function () { - this._current += this._step; + exports.cleanupElements = function(JSONcontainer) { + // cleanup the redundant svgElements; + for (var elementType in JSONcontainer) { + if (JSONcontainer.hasOwnProperty(elementType)) { + if (JSONcontainer[elementType].redundant) { + for (var i = 0; i < JSONcontainer[elementType].redundant.length; i++) { + JSONcontainer[elementType].redundant[i].parentNode.removeChild(JSONcontainer[elementType].redundant[i]); + } + JSONcontainer[elementType].redundant = []; + } + } + } }; /** - * Returns true whether the end is reached - * @return {boolean} True if the current value has passed the end value. + * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer + * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this. + * + * @param elementType + * @param JSONcontainer + * @param svgContainer + * @returns {*} + * @private */ - StepNumber.prototype.end = function () { - return (this._current > this._end); + exports.getSVGElement = function (elementType, JSONcontainer, svgContainer) { + var element; + // allocate SVG element, if it doesnt yet exist, create one. + if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before + // check if there is an redundant element + if (JSONcontainer[elementType].redundant.length > 0) { + element = JSONcontainer[elementType].redundant[0]; + JSONcontainer[elementType].redundant.shift(); + } + else { + // create a new element and add it to the SVG + element = document.createElementNS('http://www.w3.org/2000/svg', elementType); + svgContainer.appendChild(element); + } + } + else { + // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it. + element = document.createElementNS('http://www.w3.org/2000/svg', elementType); + JSONcontainer[elementType] = {used: [], redundant: []}; + svgContainer.appendChild(element); + } + JSONcontainer[elementType].used.push(element); + return element; }; - module.exports = StepNumber; - - -/***/ }, -/* 12 */ -/***/ function(module, exports, __webpack_require__) { - - var Emitter = __webpack_require__(49); - var Hammer = __webpack_require__(41); - var util = __webpack_require__(1); - var DataSet = __webpack_require__(3); - var DataView = __webpack_require__(4); - var Range = __webpack_require__(15); - var Core = __webpack_require__(42); - var TimeAxis = __webpack_require__(27); - var CurrentTime = __webpack_require__(19); - var CustomTime = __webpack_require__(20); - var ItemSet = __webpack_require__(24); /** - * Create a timeline visualization - * @param {HTMLElement} container - * @param {vis.DataSet | Array | google.visualization.DataTable} [items] - * @param {Object} [options] See Timeline.setOptions for the available options. - * @constructor - * @extends Core + * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer + * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this. + * + * @param elementType + * @param JSONcontainer + * @param DOMContainer + * @returns {*} + * @private */ - function Timeline (container, items, options) { - if (!(this instanceof Timeline)) { - throw new SyntaxError('Constructor must be called with the new operator'); - } - - var me = this; - this.defaultOptions = { - start: null, - end: null, - - autoResize: true, - - orientation: 'bottom', - width: null, - height: null, - maxHeight: null, - minHeight: null - }; - this.options = util.deepExtend({}, this.defaultOptions); - - // Create the DOM, props, and emitter - this._create(container); - - // all components listed here will be repainted automatically - this.components = []; - - this.body = { - dom: this.dom, - domProps: this.props, - emitter: { - on: this.on.bind(this), - off: this.off.bind(this), - emit: this.emit.bind(this) - }, - util: { - snap: null, // will be specified after TimeAxis is created - toScreen: me._toScreen.bind(me), - toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width - toTime: me._toTime.bind(me), - toGlobalTime : me._toGlobalTime.bind(me) - } - }; - - // range - this.range = new Range(this.body); - this.components.push(this.range); - this.body.range = this.range; - - // time axis - this.timeAxis = new TimeAxis(this.body); - this.components.push(this.timeAxis); - this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); - - // current time bar - this.currentTime = new CurrentTime(this.body); - this.components.push(this.currentTime); - - // custom time bar - // Note: time bar will be attached in this.setOptions when selected - this.customTime = new CustomTime(this.body); - this.components.push(this.customTime); - - // item set - this.itemSet = new ItemSet(this.body); - this.components.push(this.itemSet); - - this.itemsData = null; // DataSet - this.groupsData = null; // DataSet - - // apply options - if (options) { - this.setOptions(options); - } - - // create itemset - if (items) { - this.setItems(items); + exports.getDOMElement = function (elementType, JSONcontainer, DOMContainer) { + var element; + // allocate DOM element, if it doesnt yet exist, create one. + if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before + // check if there is an redundant element + if (JSONcontainer[elementType].redundant.length > 0) { + element = JSONcontainer[elementType].redundant[0]; + JSONcontainer[elementType].redundant.shift(); + } + else { + // create a new element and add it to the SVG + element = document.createElement(elementType); + DOMContainer.appendChild(element); + } } else { - this.redraw(); + // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it. + element = document.createElement(elementType); + JSONcontainer[elementType] = {used: [], redundant: []}; + DOMContainer.appendChild(element); } - } + JSONcontainer[elementType].used.push(element); + return element; + }; + + - // Extend the functionality from Core - Timeline.prototype = new Core(); /** - * Set items - * @param {vis.DataSet | Array | google.visualization.DataTable | null} items + * draw a point object. this is a seperate function because it can also be called by the legend. + * The reason the JSONcontainer and the target SVG svgContainer have to be supplied is so the legend can use these functions + * as well. + * + * @param x + * @param y + * @param group + * @param JSONcontainer + * @param svgContainer + * @returns {*} */ - Timeline.prototype.setItems = function(items) { - var initialLoad = (this.itemsData == null); - - // convert to type DataSet when needed - var newDataSet; - if (!items) { - newDataSet = null; - } - else if (items instanceof DataSet || items instanceof DataView) { - newDataSet = items; + exports.drawPoint = function(x, y, group, JSONcontainer, svgContainer) { + var point; + if (group.options.drawPoints.style == 'circle') { + point = exports.getSVGElement('circle',JSONcontainer,svgContainer); + point.setAttributeNS(null, "cx", x); + point.setAttributeNS(null, "cy", y); + point.setAttributeNS(null, "r", 0.5 * group.options.drawPoints.size); + point.setAttributeNS(null, "class", group.className + " point"); } else { - // turn an array into a dataset - newDataSet = new DataSet(items, { - type: { - start: 'Date', - end: 'Date' - } - }); + point = exports.getSVGElement('rect',JSONcontainer,svgContainer); + point.setAttributeNS(null, "x", x - 0.5*group.options.drawPoints.size); + point.setAttributeNS(null, "y", y - 0.5*group.options.drawPoints.size); + point.setAttributeNS(null, "width", group.options.drawPoints.size); + point.setAttributeNS(null, "height", group.options.drawPoints.size); + point.setAttributeNS(null, "class", group.className + " point"); } + return point; + }; - // set items - this.itemsData = newDataSet; - this.itemSet && this.itemSet.setItems(newDataSet); - - if (initialLoad && ('start' in this.options || 'end' in this.options)) { - this.fit(); + /** + * draw a bar SVG element centered on the X coordinate + * + * @param x + * @param y + * @param className + */ + exports.drawBar = function (x, y, width, height, className, JSONcontainer, svgContainer) { + // if (height != 0) { + var rect = exports.getSVGElement('rect',JSONcontainer, svgContainer); + rect.setAttributeNS(null, "x", x - 0.5 * width); + rect.setAttributeNS(null, "y", y); + rect.setAttributeNS(null, "width", width); + rect.setAttributeNS(null, "height", height); + rect.setAttributeNS(null, "class", className); + // } + }; - var start = ('start' in this.options) ? util.convert(this.options.start, 'Date') : null; - var end = ('end' in this.options) ? util.convert(this.options.end, 'Date') : null; +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { - this.setWindow(start, end); - } - }; + var util = __webpack_require__(1); /** - * Set groups - * @param {vis.DataSet | Array | google.visualization.DataTable} groups + * DataSet + * + * Usage: + * var dataSet = new DataSet({ + * fieldId: '_id', + * type: { + * // ... + * } + * }); + * + * dataSet.add(item); + * dataSet.add(data); + * dataSet.update(item); + * dataSet.update(data); + * dataSet.remove(id); + * dataSet.remove(ids); + * var data = dataSet.get(); + * var data = dataSet.get(id); + * var data = dataSet.get(ids); + * var data = dataSet.get(ids, options, data); + * dataSet.clear(); + * + * A data set can: + * - add/remove/update data + * - gives triggers upon changes in the data + * - can import/export data in various data formats + * + * @param {Array | DataTable} [data] Optional array with initial data + * @param {Object} [options] Available options: + * {String} fieldId Field name of the id in the + * items, 'id' by default. + * {Object. end) { - end = e; - } - }); + /** + * Trigger an event + * @param {String} event + * @param {Object | null} params + * @param {String} [senderId] Optional id of the sender. + * @private + */ + DataSet.prototype._trigger = function (event, params, senderId) { + if (event == '*') { + throw new Error('Cannot trigger event *'); + } - // calculate the new middle and interval for the window - var middle = (start + end) / 2; - var interval = Math.max((this.range.end - this.range.start), (end - start) * 1.1); + var subscribers = []; + if (event in this._subscribers) { + subscribers = subscribers.concat(this._subscribers[event]); + } + if ('*' in this._subscribers) { + subscribers = subscribers.concat(this._subscribers['*']); + } - this.range.setRange(middle - interval / 2, middle + interval / 2); + for (var i = 0; i < subscribers.length; i++) { + var subscriber = subscribers[i]; + if (subscriber.callback) { + subscriber.callback(event, params, senderId || null); + } + } }; /** - * Get the data range of the item set. - * @returns {{min: Date, max: Date}} range A range with a start and end Date. - * When no minimum is found, min==null - * When no maximum is found, max==null + * Add data. + * Adding an item will fail when there already is an item with the same id. + * @param {Object | Array | DataTable} data + * @param {String} [senderId] Optional sender id + * @return {Array} addedIds Array with the ids of the added items */ - Timeline.prototype.getItemRange = function() { - // calculate min from start filed - var dataset = this.itemsData.getDataSet(), - min = null, - max = null; - - if (dataset) { - // calculate the minimum value of the field 'start' - var minItem = dataset.min('start'); - min = minItem ? util.convert(minItem.start, 'Date').valueOf() : null; - // Note: we convert first to Date and then to number because else - // a conversion from ISODate to Number will fail + DataSet.prototype.add = function (data, senderId) { + var addedIds = [], + id, + me = this; - // calculate maximum value of fields 'start' and 'end' - var maxStartItem = dataset.max('start'); - if (maxStartItem) { - max = util.convert(maxStartItem.start, 'Date').valueOf(); + if (Array.isArray(data)) { + // Array + for (var i = 0, len = data.length; i < len; i++) { + id = me._addItem(data[i]); + addedIds.push(id); } - var maxEndItem = dataset.max('end'); - if (maxEndItem) { - if (max == null) { - max = util.convert(maxEndItem.end, 'Date').valueOf(); - } - else { - max = Math.max(max, util.convert(maxEndItem.end, 'Date').valueOf()); + } + else if (util.isDataTable(data)) { + // Google DataTable + var columns = this._getColumnNames(data); + for (var row = 0, rows = data.getNumberOfRows(); row < rows; row++) { + var item = {}; + for (var col = 0, cols = columns.length; col < cols; col++) { + var field = columns[col]; + item[field] = data.getValue(row, col); } + + id = me._addItem(item); + addedIds.push(id); } } + else if (data instanceof Object) { + // Single item + id = me._addItem(data); + addedIds.push(id); + } + else { + throw new Error('Unknown dataType'); + } - return { - min: (min != null) ? new Date(min) : null, - max: (max != null) ? new Date(max) : null - }; - }; - - - module.exports = Timeline; - - -/***/ }, -/* 13 */ -/***/ function(module, exports, __webpack_require__) { + if (addedIds.length) { + this._trigger('add', {items: addedIds}, senderId); + } - var Emitter = __webpack_require__(49); - var Hammer = __webpack_require__(41); - var util = __webpack_require__(1); - var DataSet = __webpack_require__(3); - var DataView = __webpack_require__(4); - var Range = __webpack_require__(15); - var Core = __webpack_require__(42); - var TimeAxis = __webpack_require__(27); - var CurrentTime = __webpack_require__(19); - var CustomTime = __webpack_require__(20); - var LineGraph = __webpack_require__(26); + return addedIds; + }; /** - * Create a timeline visualization - * @param {HTMLElement} container - * @param {vis.DataSet | Array | google.visualization.DataTable} [items] - * @param {Object} [options] See Graph2d.setOptions for the available options. - * @constructor - * @extends Core + * Update existing items. When an item does not exist, it will be created + * @param {Object | Array | DataTable} data + * @param {String} [senderId] Optional sender id + * @return {Array} updatedIds The ids of the added or updated items */ - function Graph2d (container, items, options, groups) { - var me = this; - this.defaultOptions = { - start: null, - end: null, - - autoResize: true, - - orientation: 'bottom', - width: null, - height: null, - maxHeight: null, - minHeight: null - }; - this.options = util.deepExtend({}, this.defaultOptions); - - // Create the DOM, props, and emitter - this._create(container); - - // all components listed here will be repainted automatically - this.components = []; + DataSet.prototype.update = function (data, senderId) { + var addedIds = [], + updatedIds = [], + me = this, + fieldId = me._fieldId; - this.body = { - dom: this.dom, - domProps: this.props, - emitter: { - on: this.on.bind(this), - off: this.off.bind(this), - emit: this.emit.bind(this) - }, - util: { - snap: null, // will be specified after TimeAxis is created - toScreen: me._toScreen.bind(me), - toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width - toTime: me._toTime.bind(me), - toGlobalTime : me._toGlobalTime.bind(me) + var addOrUpdate = function (item) { + var id = item[fieldId]; + if (me._data[id]) { + // update item + id = me._updateItem(item); + updatedIds.push(id); + } + else { + // add new item + id = me._addItem(item); + addedIds.push(id); } }; - // range - this.range = new Range(this.body); - this.components.push(this.range); - this.body.range = this.range; - - // time axis - this.timeAxis = new TimeAxis(this.body); - this.components.push(this.timeAxis); - this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); + if (Array.isArray(data)) { + // Array + for (var i = 0, len = data.length; i < len; i++) { + addOrUpdate(data[i]); + } + } + else if (util.isDataTable(data)) { + // Google DataTable + var columns = this._getColumnNames(data); + for (var row = 0, rows = data.getNumberOfRows(); row < rows; row++) { + var item = {}; + for (var col = 0, cols = columns.length; col < cols; col++) { + var field = columns[col]; + item[field] = data.getValue(row, col); + } - // current time bar - this.currentTime = new CurrentTime(this.body); - this.components.push(this.currentTime); + addOrUpdate(item); + } + } + else if (data instanceof Object) { + // Single item + addOrUpdate(data); + } + else { + throw new Error('Unknown dataType'); + } - // custom time bar - // Note: time bar will be attached in this.setOptions when selected - this.customTime = new CustomTime(this.body); - this.components.push(this.customTime); + if (addedIds.length) { + this._trigger('add', {items: addedIds}, senderId); + } + if (updatedIds.length) { + this._trigger('update', {items: updatedIds}, senderId); + } - // item set - this.linegraph = new LineGraph(this.body); - this.components.push(this.linegraph); + return addedIds.concat(updatedIds); + }; - this.itemsData = null; // DataSet - this.groupsData = null; // DataSet + /** + * Get a data item or multiple items. + * + * Usage: + * + * get() + * get(options: Object) + * get(options: Object, data: Array | DataTable) + * + * get(id: Number | String) + * get(id: Number | String, options: Object) + * get(id: Number | String, options: Object, data: Array | DataTable) + * + * get(ids: Number[] | String[]) + * get(ids: Number[] | String[], options: Object) + * get(ids: Number[] | String[], options: Object, data: Array | DataTable) + * + * Where: + * + * {Number | String} id The id of an item + * {Number[] | String{}} ids An array with ids of items + * {Object} options An Object with options. Available options: + * {String} [returnType] Type of data to be + * returned. Can be 'DataTable' or 'Array' (default) + * {Object.} [type] + * {String[]} [fields] field names to be returned + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * {Array | DataTable} [data] If provided, items will be appended to this + * array or table. Required in case of Google + * DataTable. + * + * @throws Error + */ + DataSet.prototype.get = function (args) { + var me = this; - // apply options - if (options) { - this.setOptions(options); + // parse the arguments + var id, ids, options, data; + var firstType = util.getType(arguments[0]); + if (firstType == 'String' || firstType == 'Number') { + // get(id [, options] [, data]) + id = arguments[0]; + options = arguments[1]; + data = arguments[2]; } - - // IMPORTANT: THIS HAPPENS BEFORE SET ITEMS! - if (groups) { - this.setGroups(groups); + else if (firstType == 'Array') { + // get(ids [, options] [, data]) + ids = arguments[0]; + options = arguments[1]; + data = arguments[2]; + } + else { + // get([, options] [, data]) + options = arguments[0]; + data = arguments[1]; } - // create itemset - if (items) { - this.setItems(items); + // determine the return type + var returnType; + if (options && options.returnType) { + var allowedValues = ["DataTable", "Array", "Object"]; + returnType = allowedValues.indexOf(options.returnType) == -1 ? "Array" : options.returnType; + + if (data && (returnType != util.getType(data))) { + throw new Error('Type of parameter "data" (' + util.getType(data) + ') ' + + 'does not correspond with specified options.type (' + options.type + ')'); + } + if (returnType == 'DataTable' && !util.isDataTable(data)) { + throw new Error('Parameter "data" must be a DataTable ' + + 'when options.type is "DataTable"'); + } + } + else if (data) { + returnType = (util.getType(data) == 'DataTable') ? 'DataTable' : 'Array'; } else { - this.redraw(); + returnType = 'Array'; } - } - - // Extend the functionality from Core - Graph2d.prototype = new Core(); - /** - * Set items - * @param {vis.DataSet | Array | google.visualization.DataTable | null} items - */ - Graph2d.prototype.setItems = function(items) { - var initialLoad = (this.itemsData == null); + // build options + var type = options && options.type || this._options.type; + var filter = options && options.filter; + var items = [], item, itemId, i, len; - // convert to type DataSet when needed - var newDataSet; - if (!items) { - newDataSet = null; + // convert items + if (id != undefined) { + // return a single item + item = me._getItem(id, type); + if (filter && !filter(item)) { + item = null; + } } - else if (items instanceof DataSet || items instanceof DataView) { - newDataSet = items; + else if (ids != undefined) { + // return a subset of items + for (i = 0, len = ids.length; i < len; i++) { + item = me._getItem(ids[i], type); + if (!filter || filter(item)) { + items.push(item); + } + } } else { - // turn an array into a dataset - newDataSet = new DataSet(items, { - type: { - start: 'Date', - end: 'Date' + // return all items + for (itemId in this._data) { + if (this._data.hasOwnProperty(itemId)) { + item = me._getItem(itemId, type); + if (!filter || filter(item)) { + items.push(item); + } } - }); + } } - // set items - this.itemsData = newDataSet; - this.linegraph && this.linegraph.setItems(newDataSet); - - if (initialLoad && ('start' in this.options || 'end' in this.options)) { - this.fit(); - - var start = ('start' in this.options) ? util.convert(this.options.start, 'Date') : null; - var end = ('end' in this.options) ? util.convert(this.options.end, 'Date') : null; + // order the results + if (options && options.order && id == undefined) { + this._sort(items, options.order); + } - this.setWindow(start, end); + // filter fields of the items + if (options && options.fields) { + var fields = options.fields; + if (id != undefined) { + item = this._filterFields(item, fields); + } + else { + for (i = 0, len = items.length; i < len; i++) { + items[i] = this._filterFields(items[i], fields); + } + } } - }; - /** - * Set groups - * @param {vis.DataSet | Array | google.visualization.DataTable} groups - */ - Graph2d.prototype.setGroups = function(groups) { - // convert to type DataSet when needed - var newDataSet; - if (!groups) { - newDataSet = null; + // return the results + if (returnType == 'DataTable') { + var columns = this._getColumnNames(data); + if (id != undefined) { + // append a single item to the data table + me._appendRow(data, columns, item); + } + else { + // copy the items to the provided data table + for (i = 0; i < items.length; i++) { + me._appendRow(data, columns, items[i]); + } + } + return data; } - else if (groups instanceof DataSet || groups instanceof DataView) { - newDataSet = groups; + else if (returnType == "Object") { + var result = {}; + for (i = 0; i < items.length; i++) { + result[items[i].id] = items[i]; + } + return result; } else { - // turn an array into a dataset - newDataSet = new DataSet(groups); + // return an array + if (id != undefined) { + // a single item + return item; + } + else { + // multiple items + if (data) { + // copy the items to the provided array + for (i = 0, len = items.length; i < len; i++) { + data.push(items[i]); + } + return data; + } + else { + // just return our array + return items; + } + } } - - this.groupsData = newDataSet; - this.linegraph.setGroups(newDataSet); }; /** - * Returns an object containing an SVG element with the icon of the group (size determined by iconWidth and iconHeight), the label of the group (content) and the yAxisOrientation of the group (left or right). - * @param groupId - * @param width - * @param height + * Get ids of all items or from a filtered set of items. + * @param {Object} [options] An Object with options. Available options: + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * @return {Array} ids */ - Graph2d.prototype.getLegend = function(groupId, width, height) { - if (width === undefined) {width = 15;} - if (height === undefined) {height = 15;} - if (this.linegraph.groups[groupId] !== undefined) { - return this.linegraph.groups[groupId].getLegend(width,height); - } - else { - return "cannot find group:" + groupId; - } - } + DataSet.prototype.getIds = function (options) { + var data = this._data, + filter = options && options.filter, + order = options && options.order, + type = options && options.type || this._options.type, + i, + len, + id, + item, + items, + ids = []; - /** - * This checks if the visible option of the supplied group (by ID) is true or false. - * @param groupId - * @returns {*} - */ - Graph2d.prototype.isGroupVisible = function(groupId) { - if (this.linegraph.groups[groupId] !== undefined) { - return (this.linegraph.groups[groupId].visible && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)); + if (filter) { + // get filtered items + if (order) { + // create ordered list + items = []; + for (id in data) { + if (data.hasOwnProperty(id)) { + item = this._getItem(id, type); + if (filter(item)) { + items.push(item); + } + } + } + + this._sort(items, order); + + for (i = 0, len = items.length; i < len; i++) { + ids[i] = items[i][this._fieldId]; + } + } + else { + // create unordered list + for (id in data) { + if (data.hasOwnProperty(id)) { + item = this._getItem(id, type); + if (filter(item)) { + ids.push(item[this._fieldId]); + } + } + } + } } else { - return false; - } - } - + // get all items + if (order) { + // create an ordered list + items = []; + for (id in data) { + if (data.hasOwnProperty(id)) { + items.push(data[id]); + } + } - /** - * Get the data range of the item set. - * @returns {{min: Date, max: Date}} range A range with a start and end Date. - * When no minimum is found, min==null - * When no maximum is found, max==null - */ - Graph2d.prototype.getItemRange = function() { - var min = null; - var max = null; + this._sort(items, order); - // calculate min from start filed - for (var groupId in this.linegraph.groups) { - if (this.linegraph.groups.hasOwnProperty(groupId)) { - if (this.linegraph.groups[groupId].visible == true) { - for (var i = 0; i < this.linegraph.groups[groupId].itemsData.length; i++) { - var item = this.linegraph.groups[groupId].itemsData[i]; - var value = util.convert(item.x, 'Date').valueOf(); - min = min == null ? value : min > value ? value : min; - max = max == null ? value : max < value ? value : max; + for (i = 0, len = items.length; i < len; i++) { + ids[i] = items[i][this._fieldId]; + } + } + else { + // create unordered list + for (id in data) { + if (data.hasOwnProperty(id)) { + item = data[id]; + ids.push(item[this._fieldId]); } } } } - return { - min: (min != null) ? new Date(min) : null, - max: (max != null) ? new Date(max) : null - }; + return ids; }; - - - module.exports = Graph2d; - - -/***/ }, -/* 14 */ -/***/ function(module, exports, __webpack_require__) { - - /** - * @constructor DataStep - * The class DataStep is an iterator for data for the lineGraph. You provide a start data point and an - * end data point. The class itself determines the best scale (step size) based on the - * provided start Date, end Date, and minimumStep. - * - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * - * Alternatively, you can set a scale by hand. - * After creation, you can initialize the class by executing first(). Then you - * can iterate from the start date to the end date via next(). You can check if - * the end date is reached with the function hasNext(). After each step, you can - * retrieve the current date via getCurrent(). - * The DataStep has scales ranging from milliseconds, seconds, minutes, hours, - * days, to years. - * - * Version: 1.2 - * - * @param {Date} [start] The start date, for example new Date(2010, 9, 21) - * or new Date(2010, 9, 21, 23, 45, 00) - * @param {Date} [end] The end date - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds - */ - function DataStep(start, end, minimumStep, containerHeight, customRange) { - // variables - this.current = 0; - - this.autoScale = true; - this.stepIndex = 0; - this.step = 1; - this.scale = 1; - - this.marginStart; - this.marginEnd; - this.deadSpace = 0; - - this.majorSteps = [1, 2, 5, 10]; - this.minorSteps = [0.25, 0.5, 1, 2]; - - this.setRange(start, end, minimumStep, containerHeight, customRange); - } - - - /** - * Set a new range - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * @param {Number} [start] The start date and time. - * @param {Number} [end] The end date and time. - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds + * Returns the DataSet itself. Is overwritten for example by the DataView, + * which returns the DataSet it is connected to instead. */ - DataStep.prototype.setRange = function(start, end, minimumStep, containerHeight, customRange) { - this._start = customRange.min === undefined ? start : customRange.min; - this._end = customRange.max === undefined ? end : customRange.max; - - if (start == end) { - this._start = start - 0.75; - this._end = end + 1; - } - - if (this.autoScale) { - this.setMinimumStep(minimumStep, containerHeight); - } - this.setFirst(customRange); + DataSet.prototype.getDataSet = function () { + return this; }; /** - * Automatically determine the scale that bests fits the provided minimum step - * @param {Number} [minimumStep] The minimum step size in milliseconds + * Execute a callback function for every item in the dataset. + * @param {function} callback + * @param {Object} [options] Available options: + * {Object.} [type] + * {String[]} [fields] filter fields + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. */ - DataStep.prototype.setMinimumStep = function(minimumStep, containerHeight) { - // round to floor - var size = this._end - this._start; - var safeSize = size * 1.2; - var minimumStepValue = minimumStep * (safeSize / containerHeight); - var orderOfMagnitude = Math.round(Math.log(safeSize)/Math.LN10); + DataSet.prototype.forEach = function (callback, options) { + var filter = options && options.filter, + type = options && options.type || this._options.type, + data = this._data, + item, + id; - var minorStepIdx = -1; - var magnitudefactor = Math.pow(10,orderOfMagnitude); + if (options && options.order) { + // execute forEach on ordered list + var items = this.get(options); - var start = 0; - if (orderOfMagnitude < 0) { - start = orderOfMagnitude; + for (var i = 0, len = items.length; i < len; i++) { + item = items[i]; + id = item[this._fieldId]; + callback(item, id); + } } - - var solutionFound = false; - for (var i = start; Math.abs(i) <= Math.abs(orderOfMagnitude); i++) { - magnitudefactor = Math.pow(10,i); - for (var j = 0; j < this.minorSteps.length; j++) { - var stepSize = magnitudefactor * this.minorSteps[j]; - if (stepSize >= minimumStepValue) { - solutionFound = true; - minorStepIdx = j; - break; + else { + // unordered + for (id in data) { + if (data.hasOwnProperty(id)) { + item = this._getItem(id, type); + if (!filter || filter(item)) { + callback(item, id); + } } } - if (solutionFound == true) { - break; - } } - this.stepIndex = minorStepIdx; - this.scale = magnitudefactor; - this.step = magnitudefactor * this.minorSteps[minorStepIdx]; }; - - /** - * Round the current date to the first minor date value - * This must be executed once when the current date is set to start Date + * Map every item in the dataset. + * @param {function} callback + * @param {Object} [options] Available options: + * {Object.} [type] + * {String[]} [fields] filter fields + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * @return {Object[]} mappedItems */ - DataStep.prototype.setFirst = function(customRange) { - if (customRange === undefined) { - customRange = {}; - } - var niceStart = customRange.min === undefined ? this._start - (this.scale * 2 * this.minorSteps[this.stepIndex]) : customRange.min; - var niceEnd = customRange.max === undefined ? this._end + (this.scale * this.minorSteps[this.stepIndex]) : customRange.max; - - this.marginEnd = customRange.max === undefined ? this.roundToMinor(niceEnd) : customRange.max; - this.marginStart = customRange.min === undefined ? this.roundToMinor(niceStart) : customRange.min; - this.deadSpace = this.roundToMinor(niceEnd) - niceEnd + this.roundToMinor(niceStart) - niceStart; - this.marginRange = this.marginEnd - this.marginStart; - - this.current = this.marginEnd; - - }; + DataSet.prototype.map = function (callback, options) { + var filter = options && options.filter, + type = options && options.type || this._options.type, + mappedItems = [], + data = this._data, + item; - DataStep.prototype.roundToMinor = function(value) { - var rounded = value - (value % (this.scale * this.minorSteps[this.stepIndex])); - if (value % (this.scale * this.minorSteps[this.stepIndex]) > 0.5 * (this.scale * this.minorSteps[this.stepIndex])) { - return rounded + (this.scale * this.minorSteps[this.stepIndex]); - } - else { - return rounded; + // convert and filter items + for (var id in data) { + if (data.hasOwnProperty(id)) { + item = this._getItem(id, type); + if (!filter || filter(item)) { + mappedItems.push(callback(item, id)); + } + } } - } + // order items + if (options && options.order) { + this._sort(mappedItems, options.order); + } - /** - * Check if the there is a next step - * @return {boolean} true if the current date has not passed the end date - */ - DataStep.prototype.hasNext = function () { - return (this.current >= this.marginStart); + return mappedItems; }; /** - * Do the next step + * Filter the fields of an item + * @param {Object} item + * @param {String[]} fields Field names + * @return {Object} filteredItem + * @private */ - DataStep.prototype.next = function() { - var prev = this.current; - this.current -= this.step; + DataSet.prototype._filterFields = function (item, fields) { + var filteredItem = {}; - // safety mechanism: if current time is still unchanged, move to the end - if (this.current == prev) { - this.current = this._end; + for (var field in item) { + if (item.hasOwnProperty(field) && (fields.indexOf(field) != -1)) { + filteredItem[field] = item[field]; + } } + + return filteredItem; }; /** - * Do the next step + * Sort the provided array with items + * @param {Object[]} items + * @param {String | function} order A field name or custom sort function. + * @private */ - DataStep.prototype.previous = function() { - this.current += this.step; - this.marginEnd += this.step; - this.marginRange = this.marginEnd - this.marginStart; + DataSet.prototype._sort = function (items, order) { + if (util.isString(order)) { + // order by provided field name + var name = order; // field name + items.sort(function (a, b) { + var av = a[name]; + var bv = b[name]; + return (av > bv) ? 1 : ((av < bv) ? -1 : 0); + }); + } + else if (typeof order === 'function') { + // order by sort function + items.sort(order); + } + // TODO: extend order by an Object {field:String, direction:String} + // where direction can be 'asc' or 'desc' + else { + throw new TypeError('Order must be a function or a string'); + } }; - - /** - * Get the current datetime - * @return {String} current The current date + * Remove an object by pointer or by id + * @param {String | Number | Object | Array} id Object or id, or an array with + * objects or ids to be removed + * @param {String} [senderId] Optional sender id + * @return {Array} removedIds */ - DataStep.prototype.getCurrent = function() { - var toPrecision = '' + Number(this.current).toPrecision(5); - for (var i = toPrecision.length-1; i > 0; i--) { - if (toPrecision[i] == "0") { - toPrecision = toPrecision.slice(0,i); - } - else if (toPrecision[i] == "." || toPrecision[i] == ",") { - toPrecision = toPrecision.slice(0,i); - break; + DataSet.prototype.remove = function (id, senderId) { + var removedIds = [], + i, len, removedId; + + if (Array.isArray(id)) { + for (i = 0, len = id.length; i < len; i++) { + removedId = this._remove(id[i]); + if (removedId != null) { + removedIds.push(removedId); + } } - else{ - break; + } + else { + removedId = this._remove(id); + if (removedId != null) { + removedIds.push(removedId); } } - return toPrecision; - }; - + if (removedIds.length) { + this._trigger('remove', {items: removedIds}, senderId); + } + return removedIds; + }; /** - * Snap a date to a rounded value. - * The snap intervals are dependent on the current scale and step. - * @param {Date} date the date to be snapped. - * @return {Date} snappedDate + * Remove an item by its id + * @param {Number | String | Object} id id or item + * @returns {Number | String | null} id + * @private */ - DataStep.prototype.snap = function(date) { - + DataSet.prototype._remove = function (id) { + if (util.isNumber(id) || util.isString(id)) { + if (this._data[id]) { + delete this._data[id]; + return id; + } + } + else if (id instanceof Object) { + var itemId = id[this._fieldId]; + if (itemId && this._data[itemId]) { + delete this._data[itemId]; + return itemId; + } + } + return null; }; /** - * Check if the current value is a major value (for example when the step - * is DAY, a major value is each first day of the MONTH) - * @return {boolean} true if current date is major, else false. + * Clear the data + * @param {String} [senderId] Optional sender id + * @return {Array} removedIds The ids of all removed items */ - DataStep.prototype.isMajor = function() { - return (this.current % (this.scale * this.majorSteps[this.stepIndex]) == 0); - }; - - module.exports = DataStep; + DataSet.prototype.clear = function (senderId) { + var ids = Object.keys(this._data); + this._data = {}; -/***/ }, -/* 15 */ -/***/ function(module, exports, __webpack_require__) { + this._trigger('remove', {items: ids}, senderId); - var util = __webpack_require__(1); - var hammerUtil = __webpack_require__(43); - var moment = __webpack_require__(40); - var Component = __webpack_require__(18); + return ids; + }; /** - * @constructor Range - * A Range controls a numeric range with a start and end value. - * The Range adjusts the range based on mouse events or programmatic changes, - * and triggers events when the range is changing or has been changed. - * @param {{dom: Object, domProps: Object, emitter: Emitter}} body - * @param {Object} [options] See description at Range.setOptions + * Find the item with maximum value of a specified field + * @param {String} field + * @return {Object | null} item Item containing max value, or null if no items */ - function Range(body, options) { - var now = moment().hours(0).minutes(0).seconds(0).milliseconds(0); - this.start = now.clone().add('days', -3).valueOf(); // Number - this.end = now.clone().add('days', 4).valueOf(); // Number - - this.body = body; - - // default options - this.defaultOptions = { - start: null, - end: null, - direction: 'horizontal', // 'horizontal' or 'vertical' - moveable: true, - zoomable: true, - min: null, - max: null, - zoomMin: 10, // milliseconds - zoomMax: 1000 * 60 * 60 * 24 * 365 * 10000 // milliseconds - }; - this.options = util.extend({}, this.defaultOptions); - - this.props = { - touch: {} - }; - - // drag listeners for dragging - this.body.emitter.on('dragstart', this._onDragStart.bind(this)); - this.body.emitter.on('drag', this._onDrag.bind(this)); - this.body.emitter.on('dragend', this._onDragEnd.bind(this)); + DataSet.prototype.max = function (field) { + var data = this._data, + max = null, + maxField = null; - // ignore dragging when holding - this.body.emitter.on('hold', this._onHold.bind(this)); + for (var id in data) { + if (data.hasOwnProperty(id)) { + var item = data[id]; + var itemField = item[field]; + if (itemField != null && (!max || itemField > maxField)) { + max = item; + maxField = itemField; + } + } + } - // mouse wheel for zooming - this.body.emitter.on('mousewheel', this._onMouseWheel.bind(this)); - this.body.emitter.on('DOMMouseScroll', this._onMouseWheel.bind(this)); // For FF + return max; + }; - // pinch to zoom - this.body.emitter.on('touch', this._onTouch.bind(this)); - this.body.emitter.on('pinch', this._onPinch.bind(this)); + /** + * Find the item with minimum value of a specified field + * @param {String} field + * @return {Object | null} item Item containing max value, or null if no items + */ + DataSet.prototype.min = function (field) { + var data = this._data, + min = null, + minField = null; - this.setOptions(options); - } + for (var id in data) { + if (data.hasOwnProperty(id)) { + var item = data[id]; + var itemField = item[field]; + if (itemField != null && (!min || itemField < minField)) { + min = item; + minField = itemField; + } + } + } - Range.prototype = new Component(); + return min; + }; /** - * Set options for the range controller - * @param {Object} options Available options: - * {Number | Date | String} start Start date for the range - * {Number | Date | String} end End date for the range - * {Number} min Minimum value for start - * {Number} max Maximum value for end - * {Number} zoomMin Set a minimum value for - * (end - start). - * {Number} zoomMax Set a maximum value for - * (end - start). - * {Boolean} moveable Enable moving of the range - * by dragging. True by default - * {Boolean} zoomable Enable zooming of the range - * by pinching/scrolling. True by default + * Find all distinct values of a specified field + * @param {String} field + * @return {Array} values Array containing all distinct values. If data items + * do not contain the specified field are ignored. + * The returned array is unordered. */ - Range.prototype.setOptions = function (options) { - if (options) { - // copy the options that we know - var fields = ['direction', 'min', 'max', 'zoomMin', 'zoomMax', 'moveable', 'zoomable']; - util.selectiveExtend(fields, this.options, options); + DataSet.prototype.distinct = function (field) { + var data = this._data; + var values = []; + var fieldType = this._options.type && this._options.type[field] || null; + var count = 0; + var i; + + for (var prop in data) { + if (data.hasOwnProperty(prop)) { + var item = data[prop]; + var value = item[field]; + var exists = false; + for (i = 0; i < count; i++) { + if (values[i] == value) { + exists = true; + break; + } + } + if (!exists && (value !== undefined)) { + values[count] = value; + count++; + } + } + } - if ('start' in options || 'end' in options) { - // apply a new range. both start and end are optional - this.setRange(options.start, options.end); + if (fieldType) { + for (i = 0; i < values.length; i++) { + values[i] = util.convert(values[i], fieldType); } } + + return values; }; /** - * Test whether direction has a valid value - * @param {String} direction 'horizontal' or 'vertical' + * Add a single item. Will fail when an item with the same id already exists. + * @param {Object} item + * @return {String} id + * @private */ - function validateDirection (direction) { - if (direction != 'horizontal' && direction != 'vertical') { - throw new TypeError('Unknown direction "' + direction + '". ' + - 'Choose "horizontal" or "vertical".'); + DataSet.prototype._addItem = function (item) { + var id = item[this._fieldId]; + + if (id != undefined) { + // check whether this id is already taken + if (this._data[id]) { + // item already exists + throw new Error('Cannot add item: item with id ' + id + ' already exists'); + } + } + else { + // generate an id + id = util.randomUUID(); + item[this._fieldId] = id; } - } - /** - * Set a new start and end range - * @param {Number} [start] - * @param {Number} [end] - */ - Range.prototype.setRange = function(start, end) { - var changed = this._applyRange(start, end); - if (changed) { - var params = { - start: new Date(this.start), - end: new Date(this.end) - }; - this.body.emitter.emit('rangechange', params); - this.body.emitter.emit('rangechanged', params); + var d = {}; + for (var field in item) { + if (item.hasOwnProperty(field)) { + var fieldType = this._type[field]; // type may be undefined + d[field] = util.convert(item[field], fieldType); + } } + this._data[id] = d; + + return id; }; /** - * Set a new start and end range. This method is the same as setRange, but - * does not trigger a range change and range changed event, and it returns - * true when the range is changed - * @param {Number} [start] - * @param {Number} [end] - * @return {Boolean} changed + * Get an item. Fields can be converted to a specific type + * @param {String} id + * @param {Object.} [types] field types to convert + * @return {Object | null} item * @private */ - Range.prototype._applyRange = function(start, end) { - var newStart = (start != null) ? util.convert(start, 'Date').valueOf() : this.start, - newEnd = (end != null) ? util.convert(end, 'Date').valueOf() : this.end, - max = (this.options.max != null) ? util.convert(this.options.max, 'Date').valueOf() : null, - min = (this.options.min != null) ? util.convert(this.options.min, 'Date').valueOf() : null, - diff; + DataSet.prototype._getItem = function (id, types) { + var field, value; - // check for valid number - if (isNaN(newStart) || newStart === null) { - throw new Error('Invalid start "' + start + '"'); - } - if (isNaN(newEnd) || newEnd === null) { - throw new Error('Invalid end "' + end + '"'); + // get the item from the dataset + var raw = this._data[id]; + if (!raw) { + return null; } - // prevent start < end - if (newEnd < newStart) { - newEnd = newStart; + // convert the items field types + var converted = {}; + if (types) { + for (field in raw) { + if (raw.hasOwnProperty(field)) { + value = raw[field]; + converted[field] = util.convert(value, types[field]); + } + } } - - // prevent start < min - if (min !== null) { - if (newStart < min) { - diff = (min - newStart); - newStart += diff; - newEnd += diff; - - // prevent end > max - if (max != null) { - if (newEnd > max) { - newEnd = max; - } + else { + // no field types specified, no converting needed + for (field in raw) { + if (raw.hasOwnProperty(field)) { + value = raw[field]; + converted[field] = value; } } } + return converted; + }; - // prevent end > max - if (max !== null) { - if (newEnd > max) { - diff = (newEnd - max); - newStart -= diff; - newEnd -= diff; + /** + * Update a single item: merge with existing item. + * Will fail when the item has no id, or when there does not exist an item + * with the same id. + * @param {Object} item + * @return {String} id + * @private + */ + DataSet.prototype._updateItem = function (item) { + var id = item[this._fieldId]; + if (id == undefined) { + throw new Error('Cannot update item: item has no id (item: ' + JSON.stringify(item) + ')'); + } + var d = this._data[id]; + if (!d) { + // item doesn't exist + throw new Error('Cannot update item: no item with id ' + id + ' found'); + } - // prevent start < min - if (min != null) { - if (newStart < min) { - newStart = min; - } - } + // merge with current item + for (var field in item) { + if (item.hasOwnProperty(field)) { + var fieldType = this._type[field]; // type may be undefined + d[field] = util.convert(item[field], fieldType); } } - // prevent (end-start) < zoomMin - if (this.options.zoomMin !== null) { - var zoomMin = parseFloat(this.options.zoomMin); - if (zoomMin < 0) { - zoomMin = 0; - } - if ((newEnd - newStart) < zoomMin) { - if ((this.end - this.start) === zoomMin) { - // ignore this action, we are already zoomed to the minimum - newStart = this.start; - newEnd = this.end; - } - else { - // zoom to the minimum - diff = (zoomMin - (newEnd - newStart)); - newStart -= diff / 2; - newEnd += diff / 2; - } - } + return id; + }; + + /** + * Get an array with the column names of a Google DataTable + * @param {DataTable} dataTable + * @return {String[]} columnNames + * @private + */ + DataSet.prototype._getColumnNames = function (dataTable) { + var columns = []; + for (var col = 0, cols = dataTable.getNumberOfColumns(); col < cols; col++) { + columns[col] = dataTable.getColumnId(col) || dataTable.getColumnLabel(col); } + return columns; + }; - // prevent (end-start) > zoomMax - if (this.options.zoomMax !== null) { - var zoomMax = parseFloat(this.options.zoomMax); - if (zoomMax < 0) { - zoomMax = 0; - } - if ((newEnd - newStart) > zoomMax) { - if ((this.end - this.start) === zoomMax) { - // ignore this action, we are already zoomed to the maximum - newStart = this.start; - newEnd = this.end; - } - else { - // zoom to the maximum - diff = ((newEnd - newStart) - zoomMax); - newStart += diff / 2; - newEnd -= diff / 2; - } - } + /** + * Append an item as a row to the dataTable + * @param dataTable + * @param columns + * @param item + * @private + */ + DataSet.prototype._appendRow = function (dataTable, columns, item) { + var row = dataTable.addRow(); + + for (var col = 0, cols = columns.length; col < cols; col++) { + var field = columns[col]; + dataTable.setValue(row, col, item[field]); } + }; + + module.exports = DataSet; + + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var DataSet = __webpack_require__(7); + + /** + * DataView + * + * a dataview offers a filtered view on a dataset or an other dataview. + * + * @param {DataSet | DataView} data + * @param {Object} [options] Available options: see method get + * + * @constructor DataView + */ + function DataView (data, options) { + this._data = null; + this._ids = {}; // ids of the items currently in memory (just contains a boolean true) + this._options = options || {}; + this._fieldId = 'id'; // name of the field containing id + this._subscribers = {}; // event subscribers - var changed = (this.start != newStart || this.end != newEnd); + var me = this; + this.listener = function () { + me._onEvent.apply(me, arguments); + }; - this.start = newStart; - this.end = newEnd; + this.setData(data); + } - return changed; - }; + // TODO: implement a function .config() to dynamically update things like configured filter + // and trigger changes accordingly /** - * Retrieve the current range. - * @return {Object} An object with start and end properties + * Set a data source for the view + * @param {DataSet | DataView} data */ - Range.prototype.getRange = function() { - return { - start: this.start, - end: this.end - }; - }; + DataView.prototype.setData = function (data) { + var ids, i, len; - /** - * Calculate the conversion offset and scale for current range, based on - * the provided width - * @param {Number} width - * @returns {{offset: number, scale: number}} conversion - */ - Range.prototype.conversion = function (width) { - return Range.conversion(this.start, this.end, width); - }; + if (this._data) { + // unsubscribe from current dataset + if (this._data.unsubscribe) { + this._data.unsubscribe('*', this.listener); + } - /** - * Static method to calculate the conversion offset and scale for a range, - * based on the provided start, end, and width - * @param {Number} start - * @param {Number} end - * @param {Number} width - * @returns {{offset: number, scale: number}} conversion - */ - Range.conversion = function (start, end, width) { - if (width != 0 && (end - start != 0)) { - return { - offset: start, - scale: width / (end - start) + // trigger a remove of all items in memory + ids = []; + for (var id in this._ids) { + if (this._ids.hasOwnProperty(id)) { + ids.push(id); + } } + this._ids = {}; + this._trigger('remove', {items: ids}); } - else { - return { - offset: 0, - scale: 1 - }; - } - }; - /** - * Start dragging horizontally or vertically - * @param {Event} event - * @private - */ - Range.prototype._onDragStart = function(event) { - // only allow dragging when configured as movable - if (!this.options.moveable) return; + this._data = data; - // refuse to drag when we where pinching to prevent the timeline make a jump - // when releasing the fingers in opposite order from the touch screen - if (!this.props.touch.allowDragging) return; + if (this._data) { + // update fieldId + this._fieldId = this._options.fieldId || + (this._data && this._data.options && this._data.options.fieldId) || + 'id'; - this.props.touch.start = this.start; - this.props.touch.end = this.end; + // trigger an add of all added items + ids = this._data.getIds({filter: this._options && this._options.filter}); + for (i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + this._ids[id] = true; + } + this._trigger('add', {items: ids}); - if (this.body.dom.root) { - this.body.dom.root.style.cursor = 'move'; + // subscribe to new dataset + if (this._data.on) { + this._data.on('*', this.listener); + } } }; /** - * Perform dragging operation - * @param {Event} event - * @private + * Get data from the data view + * + * Usage: + * + * get() + * get(options: Object) + * get(options: Object, data: Array | DataTable) + * + * get(id: Number) + * get(id: Number, options: Object) + * get(id: Number, options: Object, data: Array | DataTable) + * + * get(ids: Number[]) + * get(ids: Number[], options: Object) + * get(ids: Number[], options: Object, data: Array | DataTable) + * + * Where: + * + * {Number | String} id The id of an item + * {Number[] | String{}} ids An array with ids of items + * {Object} options An Object with options. Available options: + * {String} [type] Type of data to be returned. Can + * be 'DataTable' or 'Array' (default) + * {Object.} [convert] + * {String[]} [fields] field names to be returned + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * {Array | DataTable} [data] If provided, items will be appended to this + * array or table. Required in case of Google + * DataTable. + * @param args */ - Range.prototype._onDrag = function (event) { - // only allow dragging when configured as movable - if (!this.options.moveable) return; - var direction = this.options.direction; - validateDirection(direction); - // refuse to drag when we where pinching to prevent the timeline make a jump - // when releasing the fingers in opposite order from the touch screen - if (!this.props.touch.allowDragging) return; - var delta = (direction == 'horizontal') ? event.gesture.deltaX : event.gesture.deltaY, - interval = (this.props.touch.end - this.props.touch.start), - width = (direction == 'horizontal') ? this.body.domProps.center.width : this.body.domProps.center.height, - diffRange = -delta / width * interval; - this._applyRange(this.props.touch.start + diffRange, this.props.touch.end + diffRange); - this.body.emitter.emit('rangechange', { - start: new Date(this.start), - end: new Date(this.end) - }); - }; + DataView.prototype.get = function (args) { + var me = this; - /** - * Stop dragging operation - * @param {event} event - * @private - */ - Range.prototype._onDragEnd = function (event) { - // only allow dragging when configured as movable - if (!this.options.moveable) return; + // parse the arguments + var ids, options, data; + var firstType = util.getType(arguments[0]); + if (firstType == 'String' || firstType == 'Number' || firstType == 'Array') { + // get(id(s) [, options] [, data]) + ids = arguments[0]; // can be a single id or an array with ids + options = arguments[1]; + data = arguments[2]; + } + else { + // get([, options] [, data]) + options = arguments[0]; + data = arguments[1]; + } - // refuse to drag when we where pinching to prevent the timeline make a jump - // when releasing the fingers in opposite order from the touch screen - if (!this.props.touch.allowDragging) return; + // extend the options with the default options and provided options + var viewOptions = util.extend({}, this._options, options); - if (this.body.dom.root) { - this.body.dom.root.style.cursor = 'auto'; + // create a combined filter method when needed + if (this._options.filter && options && options.filter) { + viewOptions.filter = function (item) { + return me._options.filter(item) && options.filter(item); + } } - // fire a rangechanged event - this.body.emitter.emit('rangechanged', { - start: new Date(this.start), - end: new Date(this.end) - }); + // build up the call to the linked data set + var getArguments = []; + if (ids != undefined) { + getArguments.push(ids); + } + getArguments.push(viewOptions); + getArguments.push(data); + + return this._data && this._data.get.apply(this._data, getArguments); }; /** - * Event handler for mouse wheel event, used to zoom - * Code from http://adomas.org/javascript-mouse-wheel/ - * @param {Event} event - * @private + * Get ids of all items or from a filtered set of items. + * @param {Object} [options] An Object with options. Available options: + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * @return {Array} ids */ - Range.prototype._onMouseWheel = function(event) { - // only allow zooming when configured as zoomable and moveable - if (!(this.options.zoomable && this.options.moveable)) return; - - // retrieve delta - var delta = 0; - if (event.wheelDelta) { /* IE/Opera. */ - delta = event.wheelDelta / 120; - } else if (event.detail) { /* Mozilla case. */ - // In Mozilla, sign of delta is different than in IE. - // Also, delta is multiple of 3. - delta = -event.detail / 3; - } + DataView.prototype.getIds = function (options) { + var ids; - // If delta is nonzero, handle it. - // Basically, delta is now positive if wheel was scrolled up, - // and negative, if wheel was scrolled down. - if (delta) { - // perform the zoom action. Delta is normally 1 or -1 + if (this._data) { + var defaultFilter = this._options.filter; + var filter; - // adjust a negative delta such that zooming in with delta 0.1 - // equals zooming out with a delta -0.1 - var scale; - if (delta < 0) { - scale = 1 - (delta / 5); + if (options && options.filter) { + if (defaultFilter) { + filter = function (item) { + return defaultFilter(item) && options.filter(item); + } + } + else { + filter = options.filter; + } } else { - scale = 1 / (1 + (delta / 5)) ; + filter = defaultFilter; } - // calculate center, the date to zoom around - var gesture = hammerUtil.fakeGesture(this, event), - pointer = getPointer(gesture.center, this.body.dom.center), - pointerDate = this._pointerToDate(pointer); - - this.zoom(scale, pointerDate); + ids = this._data.getIds({ + filter: filter, + order: options && options.order + }); + } + else { + ids = []; } - // Prevent default actions caused by mouse wheel - // (else the page and timeline both zoom and scroll) - event.preventDefault(); - }; - - /** - * Start of a touch gesture - * @private - */ - Range.prototype._onTouch = function (event) { - this.props.touch.start = this.start; - this.props.touch.end = this.end; - this.props.touch.allowDragging = true; - this.props.touch.center = null; + return ids; }; /** - * On start of a hold gesture - * @private + * Get the DataSet to which this DataView is connected. In case there is a chain + * of multiple DataViews, the root DataSet of this chain is returned. + * @return {DataSet} dataSet */ - Range.prototype._onHold = function () { - this.props.touch.allowDragging = false; + DataView.prototype.getDataSet = function () { + var dataSet = this; + while (dataSet instanceof DataView) { + dataSet = dataSet._data; + } + return dataSet || null; }; /** - * Handle pinch event - * @param {Event} event + * Event listener. Will propagate all events from the connected data set to + * the subscribers of the DataView, but will filter the items and only trigger + * when there are changes in the filtered data set. + * @param {String} event + * @param {Object | null} params + * @param {String} senderId * @private */ - Range.prototype._onPinch = function (event) { - // only allow zooming when configured as zoomable and moveable - if (!(this.options.zoomable && this.options.moveable)) return; + DataView.prototype._onEvent = function (event, params, senderId) { + var i, len, id, item, + ids = params && params.items, + data = this._data, + added = [], + updated = [], + removed = []; - this.props.touch.allowDragging = false; + if (ids && data) { + switch (event) { + case 'add': + // filter the ids of the added items + for (i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + item = this.get(id); + if (item) { + this._ids[id] = true; + added.push(id); + } + } - if (event.gesture.touches.length > 1) { - if (!this.props.touch.center) { - this.props.touch.center = getPointer(event.gesture.center, this.body.dom.center); - } + break; - var scale = 1 / event.gesture.scale, - initDate = this._pointerToDate(this.props.touch.center); + case 'update': + // determine the event from the views viewpoint: an updated + // item can be added, updated, or removed from this view. + for (i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + item = this.get(id); - // calculate new start and end - var newStart = parseInt(initDate + (this.props.touch.start - initDate) * scale); - var newEnd = parseInt(initDate + (this.props.touch.end - initDate) * scale); + if (item) { + if (this._ids[id]) { + updated.push(id); + } + else { + this._ids[id] = true; + added.push(id); + } + } + else { + if (this._ids[id]) { + delete this._ids[id]; + removed.push(id); + } + else { + // nothing interesting for me :-( + } + } + } - // apply new range - this.setRange(newStart, newEnd); - } - }; + break; - /** - * Helper function to calculate the center date for zooming - * @param {{x: Number, y: Number}} pointer - * @return {number} date - * @private - */ - Range.prototype._pointerToDate = function (pointer) { - var conversion; - var direction = this.options.direction; + case 'remove': + // filter the ids of the removed items + for (i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + if (this._ids[id]) { + delete this._ids[id]; + removed.push(id); + } + } - validateDirection(direction); + break; + } - if (direction == 'horizontal') { - var width = this.body.domProps.center.width; - conversion = this.conversion(width); - return pointer.x / conversion.scale + conversion.offset; - } - else { - var height = this.body.domProps.center.height; - conversion = this.conversion(height); - return pointer.y / conversion.scale + conversion.offset; + if (added.length) { + this._trigger('add', {items: added}, senderId); + } + if (updated.length) { + this._trigger('update', {items: updated}, senderId); + } + if (removed.length) { + this._trigger('remove', {items: removed}, senderId); + } } }; - /** - * Get the pointer location relative to the location of the dom element - * @param {{pageX: Number, pageY: Number}} touch - * @param {Element} element HTML DOM element - * @return {{x: Number, y: Number}} pointer - * @private - */ - function getPointer (touch, element) { - return { - x: touch.pageX - util.getAbsoluteLeft(element), - y: touch.pageY - util.getAbsoluteTop(element) - }; - } + // copy subscription functionality from DataSet + DataView.prototype.on = DataSet.prototype.on; + DataView.prototype.off = DataSet.prototype.off; + DataView.prototype._trigger = DataSet.prototype._trigger; - /** - * Zoom the range the given scale in or out. Start and end date will - * be adjusted, and the timeline will be redrawn. You can optionally give a - * date around which to zoom. - * For example, try scale = 0.9 or 1.1 - * @param {Number} scale Scaling factor. Values above 1 will zoom out, - * values below 1 will zoom in. - * @param {Number} [center] Value representing a date around which will - * be zoomed. - */ - Range.prototype.zoom = function(scale, center) { - // if centerDate is not provided, take it half between start Date and end Date - if (center == null) { - center = (this.start + this.end) / 2; - } + // TODO: make these functions deprecated (replaced with `on` and `off` since version 0.5) + DataView.prototype.subscribe = DataView.prototype.on; + DataView.prototype.unsubscribe = DataView.prototype.off; - // calculate new start and end - var newStart = center + (this.start - center) * scale; - var newEnd = center + (this.end - center) * scale; + module.exports = DataView; - this.setRange(newStart, newEnd); - }; +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + var Emitter = __webpack_require__(10); + var DataSet = __webpack_require__(7); + var DataView = __webpack_require__(8); + var util = __webpack_require__(1); + var Point3d = __webpack_require__(11); + var Point2d = __webpack_require__(12); + var Camera = __webpack_require__(13); + var Filter = __webpack_require__(14); + var Slider = __webpack_require__(15); + var StepNumber = __webpack_require__(16); /** - * Move the range with a given delta to the left or right. Start and end - * value will be adjusted. For example, try delta = 0.1 or -0.1 - * @param {Number} delta Moving amount. Positive value will move right, - * negative value will move left + * @constructor Graph3d + * Graph3d displays data in 3d. + * + * Graph3d is developed in javascript as a Google Visualization Chart. + * + * @param {Element} container The DOM element in which the Graph3d will + * be created. Normally a div element. + * @param {DataSet | DataView | Array} [data] + * @param {Object} [options] */ - Range.prototype.move = function(delta) { - // zoom start Date and end Date relative to the centerDate - var diff = (this.end - this.start); - - // apply new values - var newStart = this.start + diff * delta; - var newEnd = this.end + diff * delta; + function Graph3d(container, data, options) { + if (!(this instanceof Graph3d)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } - // TODO: reckon with min and max range + // create variables and set default values + this.containerElement = container; + this.width = '400px'; + this.height = '400px'; + this.margin = 10; // px + this.defaultXCenter = '55%'; + this.defaultYCenter = '50%'; - this.start = newStart; - this.end = newEnd; - }; + this.xLabel = 'x'; + this.yLabel = 'y'; + this.zLabel = 'z'; + this.filterLabel = 'time'; + this.legendLabel = 'value'; - /** - * Move the range to a new center point - * @param {Number} moveTo New center point of the range - */ - Range.prototype.moveTo = function(moveTo) { - var center = (this.start + this.end) / 2; + this.style = Graph3d.STYLE.DOT; + this.showPerspective = true; + this.showGrid = true; + this.keepAspectRatio = true; + this.showShadow = false; + this.showGrayBottom = false; // TODO: this does not work correctly + this.showTooltip = false; + this.verticalRatio = 0.5; // 0.1 to 1.0, where 1.0 results in a 'cube' - var diff = center - moveTo; + this.animationInterval = 1000; // milliseconds + this.animationPreload = false; - // calculate new start and end - var newStart = this.start - diff; - var newEnd = this.end - diff; + this.camera = new Camera(); + this.eye = new Point3d(0, 0, -1); // TODO: set eye.z about 3/4 of the width of the window? - this.setRange(newStart, newEnd); - }; + this.dataTable = null; // The original data table + this.dataPoints = null; // The table with point objects - module.exports = Range; + // the column indexes + this.colX = undefined; + this.colY = undefined; + this.colZ = undefined; + this.colValue = undefined; + this.colFilter = undefined; + this.xMin = 0; + this.xStep = undefined; // auto by default + this.xMax = 1; + this.yMin = 0; + this.yStep = undefined; // auto by default + this.yMax = 1; + this.zMin = 0; + this.zStep = undefined; // auto by default + this.zMax = 1; + this.valueMin = 0; + this.valueMax = 1; + this.xBarWidth = 1; + this.yBarWidth = 1; + // TODO: customize axis range -/***/ }, -/* 16 */ -/***/ function(module, exports, __webpack_require__) { + // constants + this.colorAxis = '#4D4D4D'; + this.colorGrid = '#D3D3D3'; + this.colorDot = '#7DC1FF'; + this.colorDotBorder = '#3267D2'; - // Utility functions for ordering and stacking of items - var EPSILON = 0.001; // used when checking collisions, to prevent round-off errors + // create a frame and canvas + this.create(); - /** - * Order items by their start data - * @param {Item[]} items - */ - exports.orderByStart = function(items) { - items.sort(function (a, b) { - return a.data.start - b.data.start; - }); - }; + // apply options (also when undefined) + this.setOptions(options); - /** - * Order items by their end date. If they have no end date, their start date - * is used. - * @param {Item[]} items - */ - exports.orderByEnd = function(items) { - items.sort(function (a, b) { - var aTime = ('end' in a.data) ? a.data.end : a.data.start, - bTime = ('end' in b.data) ? b.data.end : b.data.start; + // apply data + if (data) { + this.setData(data); + } + } - return aTime - bTime; - }); - }; + // Extend Graph3d with an Emitter mixin + Emitter(Graph3d.prototype); /** - * Adjust vertical positions of the items such that they don't overlap each - * other. - * @param {Item[]} items - * All visible items - * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin - * Margins between items and between items and the axis. - * @param {boolean} [force=false] - * If true, all items will be repositioned. If false (default), only - * items having a top===null will be re-stacked + * Calculate the scaling values, dependent on the range in x, y, and z direction */ - exports.stack = function(items, margin, force) { - var i, iMax; + Graph3d.prototype._setScale = function() { + this.scale = new Point3d(1 / (this.xMax - this.xMin), + 1 / (this.yMax - this.yMin), + 1 / (this.zMax - this.zMin)); - if (force) { - // reset top position of all items - for (i = 0, iMax = items.length; i < iMax; i++) { - items[i].top = null; + // keep aspect ration between x and y scale if desired + if (this.keepAspectRatio) { + if (this.scale.x < this.scale.y) { + //noinspection JSSuspiciousNameCombination + this.scale.y = this.scale.x; + } + else { + //noinspection JSSuspiciousNameCombination + this.scale.x = this.scale.y; } } - // calculate new, non-overlapping positions - for (i = 0, iMax = items.length; i < iMax; i++) { - var item = items[i]; - if (item.top === null) { - // initialize top position - item.top = margin.axis; + // scale the vertical axis + this.scale.z *= this.verticalRatio; + // TODO: can this be automated? verticalRatio? - do { - // TODO: optimize checking for overlap. when there is a gap without items, - // you only need to check for items from the next item on, not from zero - var collidingItem = null; - for (var j = 0, jj = items.length; j < jj; j++) { - var other = items[j]; - if (other.top !== null && other !== item && exports.collision(item, other, margin.item)) { - collidingItem = other; - break; - } - } + // determine scale for (optional) value + this.scale.value = 1 / (this.valueMax - this.valueMin); - if (collidingItem != null) { - // There is a collision. Reposition the items above the colliding element - item.top = collidingItem.top + collidingItem.height + margin.item.vertical; - } - } while (collidingItem); - } - } + // position the camera arm + var xCenter = (this.xMax + this.xMin) / 2 * this.scale.x; + var yCenter = (this.yMax + this.yMin) / 2 * this.scale.y; + var zCenter = (this.zMax + this.zMin) / 2 * this.scale.z; + this.camera.setArmLocation(xCenter, yCenter, zCenter); }; - /** - * Adjust vertical positions of the items without stacking them - * @param {Item[]} items - * All visible items - * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin - * Margins between items and between items and the axis. - */ - exports.nostack = function(items, margin) { - var i, iMax; - - // reset top position of all items - for (i = 0, iMax = items.length; i < iMax; i++) { - items[i].top = margin.axis; - } - }; /** - * Test if the two provided items collide - * The items must have parameters left, width, top, and height. - * @param {Item} a The first item - * @param {Item} b The second item - * @param {{horizontal: number, vertical: number}} margin - * An object containing a horizontal and vertical - * minimum required margin. - * @return {boolean} true if a and b collide, else false + * Convert a 3D location to a 2D location on screen + * http://en.wikipedia.org/wiki/3D_projection + * @param {Point3d} point3d A 3D point with parameters x, y, z + * @return {Point2d} point2d A 2D point with parameters x, y */ - exports.collision = function(a, b, margin) { - return ((a.left - margin.horizontal + EPSILON) < (b.left + b.width) && - (a.left + a.width + margin.horizontal - EPSILON) > b.left && - (a.top - margin.vertical + EPSILON) < (b.top + b.height) && - (a.top + a.height + margin.vertical - EPSILON) > b.top); + Graph3d.prototype._convert3Dto2D = function(point3d) { + var translation = this._convertPointToTranslation(point3d); + return this._convertTranslationToScreen(translation); }; - -/***/ }, -/* 17 */ -/***/ function(module, exports, __webpack_require__) { - - var moment = __webpack_require__(40); - /** - * @constructor TimeStep - * The class TimeStep is an iterator for dates. You provide a start date and an - * end date. The class itself determines the best scale (step size) based on the - * provided start Date, end Date, and minimumStep. - * - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * - * Alternatively, you can set a scale by hand. - * After creation, you can initialize the class by executing first(). Then you - * can iterate from the start date to the end date via next(). You can check if - * the end date is reached with the function hasNext(). After each step, you can - * retrieve the current date via getCurrent(). - * The TimeStep has scales ranging from milliseconds, seconds, minutes, hours, - * days, to years. - * - * Version: 1.2 - * - * @param {Date} [start] The start date, for example new Date(2010, 9, 21) - * or new Date(2010, 9, 21, 23, 45, 00) - * @param {Date} [end] The end date - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds + * Convert a 3D location its translation seen from the camera + * http://en.wikipedia.org/wiki/3D_projection + * @param {Point3d} point3d A 3D point with parameters x, y, z + * @return {Point3d} translation A 3D point with parameters x, y, z This is + * the translation of the point, seen from the + * camera */ - function TimeStep(start, end, minimumStep) { - // variables - this.current = new Date(); - this._start = new Date(); - this._end = new Date(); - - this.autoScale = true; - this.scale = TimeStep.SCALE.DAY; - this.step = 1; - - // initialize the range - this.setRange(start, end, minimumStep); - } - - /// enum scale - TimeStep.SCALE = { - MILLISECOND: 1, - SECOND: 2, - MINUTE: 3, - HOUR: 4, - DAY: 5, - WEEKDAY: 6, - MONTH: 7, - YEAR: 8 - }; + Graph3d.prototype._convertPointToTranslation = function(point3d) { + var ax = point3d.x * this.scale.x, + ay = point3d.y * this.scale.y, + az = point3d.z * this.scale.z, + cx = this.camera.getCameraLocation().x, + cy = this.camera.getCameraLocation().y, + cz = this.camera.getCameraLocation().z, - /** - * Set a new range - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * @param {Date} [start] The start date and time. - * @param {Date} [end] The end date and time. - * @param {int} [minimumStep] Optional. Minimum step size in milliseconds - */ - TimeStep.prototype.setRange = function(start, end, minimumStep) { - if (!(start instanceof Date) || !(end instanceof Date)) { - throw "No legal start or end date in method setRange"; - } + // calculate angles + sinTx = Math.sin(this.camera.getCameraRotation().x), + cosTx = Math.cos(this.camera.getCameraRotation().x), + sinTy = Math.sin(this.camera.getCameraRotation().y), + cosTy = Math.cos(this.camera.getCameraRotation().y), + sinTz = Math.sin(this.camera.getCameraRotation().z), + cosTz = Math.cos(this.camera.getCameraRotation().z), - this._start = (start != undefined) ? new Date(start.valueOf()) : new Date(); - this._end = (end != undefined) ? new Date(end.valueOf()) : new Date(); + // calculate translation + dx = cosTy * (sinTz * (ay - cy) + cosTz * (ax - cx)) - sinTy * (az - cz), + dy = sinTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) + cosTx * (cosTz * (ay - cy) - sinTz * (ax-cx)), + dz = cosTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) - sinTx * (cosTz * (ay - cy) - sinTz * (ax-cx)); - if (this.autoScale) { - this.setMinimumStep(minimumStep); - } + return new Point3d(dx, dy, dz); }; /** - * Set the range iterator to the start date. + * Convert a translation point to a point on the screen + * @param {Point3d} translation A 3D point with parameters x, y, z This is + * the translation of the point, seen from the + * camera + * @return {Point2d} point2d A 2D point with parameters x, y */ - TimeStep.prototype.first = function() { - this.current = new Date(this._start.valueOf()); - this.roundToMinor(); + Graph3d.prototype._convertTranslationToScreen = function(translation) { + var ex = this.eye.x, + ey = this.eye.y, + ez = this.eye.z, + dx = translation.x, + dy = translation.y, + dz = translation.z; + + // calculate position on screen from translation + var bx; + var by; + if (this.showPerspective) { + bx = (dx - ex) * (ez / dz); + by = (dy - ey) * (ez / dz); + } + else { + bx = dx * -(ez / this.camera.getArmLength()); + by = dy * -(ez / this.camera.getArmLength()); + } + + // shift and scale the point to the center of the screen + // use the width of the graph to scale both horizontally and vertically. + return new Point2d( + this.xcenter + bx * this.frame.canvas.clientWidth, + this.ycenter - by * this.frame.canvas.clientWidth); }; /** - * Round the current date to the first minor date value - * This must be executed once when the current date is set to start Date + * Set the background styling for the graph + * @param {string | {fill: string, stroke: string, strokeWidth: string}} backgroundColor */ - TimeStep.prototype.roundToMinor = function() { - // round to floor - // IMPORTANT: we have no breaks in this switch! (this is no bug) - //noinspection FallthroughInSwitchStatementJS - switch (this.scale) { - case TimeStep.SCALE.YEAR: - this.current.setFullYear(this.step * Math.floor(this.current.getFullYear() / this.step)); - this.current.setMonth(0); - case TimeStep.SCALE.MONTH: this.current.setDate(1); - case TimeStep.SCALE.DAY: // intentional fall through - case TimeStep.SCALE.WEEKDAY: this.current.setHours(0); - case TimeStep.SCALE.HOUR: this.current.setMinutes(0); - case TimeStep.SCALE.MINUTE: this.current.setSeconds(0); - case TimeStep.SCALE.SECOND: this.current.setMilliseconds(0); - //case TimeStep.SCALE.MILLISECOND: // nothing to do for milliseconds - } + Graph3d.prototype._setBackgroundColor = function(backgroundColor) { + var fill = 'white'; + var stroke = 'gray'; + var strokeWidth = 1; - if (this.step != 1) { - // round down to the first minor value that is a multiple of the current step size - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: this.current.setMilliseconds(this.current.getMilliseconds() - this.current.getMilliseconds() % this.step); break; - case TimeStep.SCALE.SECOND: this.current.setSeconds(this.current.getSeconds() - this.current.getSeconds() % this.step); break; - case TimeStep.SCALE.MINUTE: this.current.setMinutes(this.current.getMinutes() - this.current.getMinutes() % this.step); break; - case TimeStep.SCALE.HOUR: this.current.setHours(this.current.getHours() - this.current.getHours() % this.step); break; - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: this.current.setDate((this.current.getDate()-1) - (this.current.getDate()-1) % this.step + 1); break; - case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() - this.current.getMonth() % this.step); break; - case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() - this.current.getFullYear() % this.step); break; - default: break; - } + if (typeof(backgroundColor) === 'string') { + fill = backgroundColor; + stroke = 'none'; + strokeWidth = 0; + } + else if (typeof(backgroundColor) === 'object') { + if (backgroundColor.fill !== undefined) fill = backgroundColor.fill; + if (backgroundColor.stroke !== undefined) stroke = backgroundColor.stroke; + if (backgroundColor.strokeWidth !== undefined) strokeWidth = backgroundColor.strokeWidth; + } + else if (backgroundColor === undefined) { + // use use defaults + } + else { + throw 'Unsupported type of backgroundColor'; } + + this.frame.style.backgroundColor = fill; + this.frame.style.borderColor = stroke; + this.frame.style.borderWidth = strokeWidth + 'px'; + this.frame.style.borderStyle = 'solid'; + }; + + + /// enumerate the available styles + Graph3d.STYLE = { + BAR: 0, + BARCOLOR: 1, + BARSIZE: 2, + DOT : 3, + DOTLINE : 4, + DOTCOLOR: 5, + DOTSIZE: 6, + GRID : 7, + LINE: 8, + SURFACE : 9 }; /** - * Check if the there is a next step - * @return {boolean} true if the current date has not passed the end date + * Retrieve the style index from given styleName + * @param {string} styleName Style name such as 'dot', 'grid', 'dot-line' + * @return {Number} styleNumber Enumeration value representing the style, or -1 + * when not found */ - TimeStep.prototype.hasNext = function () { - return (this.current.valueOf() <= this._end.valueOf()); + Graph3d.prototype._getStyleNumber = function(styleName) { + switch (styleName) { + case 'dot': return Graph3d.STYLE.DOT; + case 'dot-line': return Graph3d.STYLE.DOTLINE; + case 'dot-color': return Graph3d.STYLE.DOTCOLOR; + case 'dot-size': return Graph3d.STYLE.DOTSIZE; + case 'line': return Graph3d.STYLE.LINE; + case 'grid': return Graph3d.STYLE.GRID; + case 'surface': return Graph3d.STYLE.SURFACE; + case 'bar': return Graph3d.STYLE.BAR; + case 'bar-color': return Graph3d.STYLE.BARCOLOR; + case 'bar-size': return Graph3d.STYLE.BARSIZE; + } + + return -1; }; /** - * Do the next step + * Determine the indexes of the data columns, based on the given style and data + * @param {DataSet} data + * @param {Number} style */ - TimeStep.prototype.next = function() { - var prev = this.current.valueOf(); - - // Two cases, needed to prevent issues with switching daylight savings - // (end of March and end of October) - if (this.current.getMonth() < 6) { - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: + Graph3d.prototype._determineColumnIndexes = function(data, style) { + if (this.style === Graph3d.STYLE.DOT || + this.style === Graph3d.STYLE.DOTLINE || + this.style === Graph3d.STYLE.LINE || + this.style === Graph3d.STYLE.GRID || + this.style === Graph3d.STYLE.SURFACE || + this.style === Graph3d.STYLE.BAR) { + // 3 columns expected, and optionally a 4th with filter values + this.colX = 0; + this.colY = 1; + this.colZ = 2; + this.colValue = undefined; - this.current = new Date(this.current.valueOf() + this.step); break; - case TimeStep.SCALE.SECOND: this.current = new Date(this.current.valueOf() + this.step * 1000); break; - case TimeStep.SCALE.MINUTE: this.current = new Date(this.current.valueOf() + this.step * 1000 * 60); break; - case TimeStep.SCALE.HOUR: - this.current = new Date(this.current.valueOf() + this.step * 1000 * 60 * 60); - // in case of skipping an hour for daylight savings, adjust the hour again (else you get: 0h 5h 9h ... instead of 0h 4h 8h ...) - var h = this.current.getHours(); - this.current.setHours(h - (h % this.step)); - break; - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: this.current.setDate(this.current.getDate() + this.step); break; - case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() + this.step); break; - case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() + this.step); break; - default: break; - } - } - else { - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: this.current = new Date(this.current.valueOf() + this.step); break; - case TimeStep.SCALE.SECOND: this.current.setSeconds(this.current.getSeconds() + this.step); break; - case TimeStep.SCALE.MINUTE: this.current.setMinutes(this.current.getMinutes() + this.step); break; - case TimeStep.SCALE.HOUR: this.current.setHours(this.current.getHours() + this.step); break; - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: this.current.setDate(this.current.getDate() + this.step); break; - case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() + this.step); break; - case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() + this.step); break; - default: break; + if (data.getNumberOfColumns() > 3) { + this.colFilter = 3; } } + else if (this.style === Graph3d.STYLE.DOTCOLOR || + this.style === Graph3d.STYLE.DOTSIZE || + this.style === Graph3d.STYLE.BARCOLOR || + this.style === Graph3d.STYLE.BARSIZE) { + // 4 columns expected, and optionally a 5th with filter values + this.colX = 0; + this.colY = 1; + this.colZ = 2; + this.colValue = 3; - if (this.step != 1) { - // round down to the correct major value - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: if(this.current.getMilliseconds() < this.step) this.current.setMilliseconds(0); break; - case TimeStep.SCALE.SECOND: if(this.current.getSeconds() < this.step) this.current.setSeconds(0); break; - case TimeStep.SCALE.MINUTE: if(this.current.getMinutes() < this.step) this.current.setMinutes(0); break; - case TimeStep.SCALE.HOUR: if(this.current.getHours() < this.step) this.current.setHours(0); break; - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: if(this.current.getDate() < this.step+1) this.current.setDate(1); break; - case TimeStep.SCALE.MONTH: if(this.current.getMonth() < this.step) this.current.setMonth(0); break; - case TimeStep.SCALE.YEAR: break; // nothing to do for year - default: break; + if (data.getNumberOfColumns() > 4) { + this.colFilter = 4; } } - - // safety mechanism: if current time is still unchanged, move to the end - if (this.current.valueOf() == prev) { - this.current = new Date(this._end.valueOf()); + else { + throw 'Unknown style "' + this.style + '"'; } }; + Graph3d.prototype.getNumberOfRows = function(data) { + return data.length; + } - /** - * Get the current datetime - * @return {Date} current The current date - */ - TimeStep.prototype.getCurrent = function() { - return this.current; - }; - /** - * Set a custom scale. Autoscaling will be disabled. - * For example setScale(SCALE.MINUTES, 5) will result - * in minor steps of 5 minutes, and major steps of an hour. - * - * @param {TimeStep.SCALE} newScale - * A scale. Choose from SCALE.MILLISECOND, - * SCALE.SECOND, SCALE.MINUTE, SCALE.HOUR, - * SCALE.WEEKDAY, SCALE.DAY, SCALE.MONTH, - * SCALE.YEAR. - * @param {Number} newStep A step size, by default 1. Choose for - * example 1, 2, 5, or 10. - */ - TimeStep.prototype.setScale = function(newScale, newStep) { - this.scale = newScale; + Graph3d.prototype.getNumberOfColumns = function(data) { + var counter = 0; + for (var column in data[0]) { + if (data[0].hasOwnProperty(column)) { + counter++; + } + } + return counter; + } - if (newStep > 0) { - this.step = newStep; + + Graph3d.prototype.getDistinctValues = function(data, column) { + var distinctValues = []; + for (var i = 0; i < data.length; i++) { + if (distinctValues.indexOf(data[i][column]) == -1) { + distinctValues.push(data[i][column]); + } } + return distinctValues; + } - this.autoScale = false; + + Graph3d.prototype.getColumnRange = function(data,column) { + var minMax = {min:data[0][column],max:data[0][column]}; + for (var i = 0; i < data.length; i++) { + if (minMax.min > data[i][column]) { minMax.min = data[i][column]; } + if (minMax.max < data[i][column]) { minMax.max = data[i][column]; } + } + return minMax; }; /** - * Enable or disable autoscaling - * @param {boolean} enable If true, autoascaling is set true + * Initialize the data from the data table. Calculate minimum and maximum values + * and column index values + * @param {Array | DataSet | DataView} rawData The data containing the items for the Graph. + * @param {Number} style Style Number */ - TimeStep.prototype.setAutoScale = function (enable) { - this.autoScale = enable; - }; + Graph3d.prototype._dataInitialize = function (rawData, style) { + var me = this; + // unsubscribe from the dataTable + if (this.dataSet) { + this.dataSet.off('*', this._onChange); + } - /** - * Automatically determine the scale that bests fits the provided minimum step - * @param {Number} [minimumStep] The minimum step size in milliseconds - */ - TimeStep.prototype.setMinimumStep = function(minimumStep) { - if (minimumStep == undefined) { + if (rawData === undefined) return; + + if (Array.isArray(rawData)) { + rawData = new DataSet(rawData); } - var stepYear = (1000 * 60 * 60 * 24 * 30 * 12); - var stepMonth = (1000 * 60 * 60 * 24 * 30); - var stepDay = (1000 * 60 * 60 * 24); - var stepHour = (1000 * 60 * 60); - var stepMinute = (1000 * 60); - var stepSecond = (1000); - var stepMillisecond= (1); + var data; + if (rawData instanceof DataSet || rawData instanceof DataView) { + data = rawData.get(); + } + else { + throw new Error('Array, DataSet, or DataView expected'); + } - // find the smallest step that is larger than the provided minimumStep - if (stepYear*1000 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 1000;} - if (stepYear*500 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 500;} - if (stepYear*100 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 100;} - if (stepYear*50 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 50;} - if (stepYear*10 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 10;} - if (stepYear*5 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 5;} - if (stepYear > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 1;} - if (stepMonth*3 > minimumStep) {this.scale = TimeStep.SCALE.MONTH; this.step = 3;} - if (stepMonth > minimumStep) {this.scale = TimeStep.SCALE.MONTH; this.step = 1;} - if (stepDay*5 > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 5;} - if (stepDay*2 > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 2;} - if (stepDay > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 1;} - if (stepDay/2 > minimumStep) {this.scale = TimeStep.SCALE.WEEKDAY; this.step = 1;} - if (stepHour*4 > minimumStep) {this.scale = TimeStep.SCALE.HOUR; this.step = 4;} - if (stepHour > minimumStep) {this.scale = TimeStep.SCALE.HOUR; this.step = 1;} - if (stepMinute*15 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 15;} - if (stepMinute*10 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 10;} - if (stepMinute*5 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 5;} - if (stepMinute > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 1;} - if (stepSecond*15 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 15;} - if (stepSecond*10 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 10;} - if (stepSecond*5 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 5;} - if (stepSecond > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 1;} - if (stepMillisecond*200 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 200;} - if (stepMillisecond*100 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 100;} - if (stepMillisecond*50 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 50;} - if (stepMillisecond*10 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 10;} - if (stepMillisecond*5 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 5;} - if (stepMillisecond > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 1;} - }; + if (data.length == 0) + return; - /** - * Snap a date to a rounded value. - * The snap intervals are dependent on the current scale and step. - * @param {Date} date the date to be snapped. - * @return {Date} snappedDate - */ - TimeStep.prototype.snap = function(date) { - var clone = new Date(date.valueOf()); + this.dataSet = rawData; + this.dataTable = data; - if (this.scale == TimeStep.SCALE.YEAR) { - var year = clone.getFullYear() + Math.round(clone.getMonth() / 12); - clone.setFullYear(Math.round(year / this.step) * this.step); - clone.setMonth(0); - clone.setDate(0); - clone.setHours(0); - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); - } - else if (this.scale == TimeStep.SCALE.MONTH) { - if (clone.getDate() > 15) { - clone.setDate(1); - clone.setMonth(clone.getMonth() + 1); - // important: first set Date to 1, after that change the month. - } - else { - clone.setDate(1); - } + // subscribe to changes in the dataset + this._onChange = function () { + me.setData(me.dataSet); + }; + this.dataSet.on('*', this._onChange); - clone.setHours(0); - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); - } - else if (this.scale == TimeStep.SCALE.DAY) { - //noinspection FallthroughInSwitchStatementJS - switch (this.step) { - case 5: - case 2: - clone.setHours(Math.round(clone.getHours() / 24) * 24); break; - default: - clone.setHours(Math.round(clone.getHours() / 12) * 12); break; + // _determineColumnIndexes + // getNumberOfRows (points) + // getNumberOfColumns (x,y,z,v,t,t1,t2...) + // getDistinctValues (unique values?) + // getColumnRange + + // determine the location of x,y,z,value,filter columns + this.colX = 'x'; + this.colY = 'y'; + this.colZ = 'z'; + this.colValue = 'style'; + this.colFilter = 'filter'; + + + + // check if a filter column is provided + if (data[0].hasOwnProperty('filter')) { + if (this.dataFilter === undefined) { + this.dataFilter = new Filter(rawData, this.colFilter, this); + this.dataFilter.setOnLoadCallback(function() {me.redraw();}); } - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); } - else if (this.scale == TimeStep.SCALE.WEEKDAY) { - //noinspection FallthroughInSwitchStatementJS - switch (this.step) { - case 5: - case 2: - clone.setHours(Math.round(clone.getHours() / 12) * 12); break; - default: - clone.setHours(Math.round(clone.getHours() / 6) * 6); break; + + + var withBars = this.style == Graph3d.STYLE.BAR || + this.style == Graph3d.STYLE.BARCOLOR || + this.style == Graph3d.STYLE.BARSIZE; + + // determine barWidth from data + if (withBars) { + if (this.defaultXBarWidth !== undefined) { + this.xBarWidth = this.defaultXBarWidth; } - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); - } - else if (this.scale == TimeStep.SCALE.HOUR) { - switch (this.step) { - case 4: - clone.setMinutes(Math.round(clone.getMinutes() / 60) * 60); break; - default: - clone.setMinutes(Math.round(clone.getMinutes() / 30) * 30); break; + else { + var dataX = this.getDistinctValues(data,this.colX); + this.xBarWidth = (dataX[1] - dataX[0]) || 1; } - clone.setSeconds(0); - clone.setMilliseconds(0); - } else if (this.scale == TimeStep.SCALE.MINUTE) { - //noinspection FallthroughInSwitchStatementJS - switch (this.step) { - case 15: - case 10: - clone.setMinutes(Math.round(clone.getMinutes() / 5) * 5); - clone.setSeconds(0); - break; - case 5: - clone.setSeconds(Math.round(clone.getSeconds() / 60) * 60); break; - default: - clone.setSeconds(Math.round(clone.getSeconds() / 30) * 30); break; + + if (this.defaultYBarWidth !== undefined) { + this.yBarWidth = this.defaultYBarWidth; } - clone.setMilliseconds(0); - } - else if (this.scale == TimeStep.SCALE.SECOND) { - //noinspection FallthroughInSwitchStatementJS - switch (this.step) { - case 15: - case 10: - clone.setSeconds(Math.round(clone.getSeconds() / 5) * 5); - clone.setMilliseconds(0); - break; - case 5: - clone.setMilliseconds(Math.round(clone.getMilliseconds() / 1000) * 1000); break; - default: - clone.setMilliseconds(Math.round(clone.getMilliseconds() / 500) * 500); break; + else { + var dataY = this.getDistinctValues(data,this.colY); + this.yBarWidth = (dataY[1] - dataY[0]) || 1; } } - else if (this.scale == TimeStep.SCALE.MILLISECOND) { - var step = this.step > 5 ? this.step / 2 : 1; - clone.setMilliseconds(Math.round(clone.getMilliseconds() / step) * step); - } - - return clone; - }; - /** - * Check if the current value is a major value (for example when the step - * is DAY, a major value is each first day of the MONTH) - * @return {boolean} true if current date is major, else false. - */ - TimeStep.prototype.isMajor = function() { - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: - return (this.current.getMilliseconds() == 0); - case TimeStep.SCALE.SECOND: - return (this.current.getSeconds() == 0); - case TimeStep.SCALE.MINUTE: - return (this.current.getHours() == 0) && (this.current.getMinutes() == 0); - // Note: this is no bug. Major label is equal for both minute and hour scale - case TimeStep.SCALE.HOUR: - return (this.current.getHours() == 0); - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: - return (this.current.getDate() == 1); - case TimeStep.SCALE.MONTH: - return (this.current.getMonth() == 0); - case TimeStep.SCALE.YEAR: - return false; - default: - return false; + // calculate minimums and maximums + var xRange = this.getColumnRange(data,this.colX); + if (withBars) { + xRange.min -= this.xBarWidth / 2; + xRange.max += this.xBarWidth / 2; } - }; - + this.xMin = (this.defaultXMin !== undefined) ? this.defaultXMin : xRange.min; + this.xMax = (this.defaultXMax !== undefined) ? this.defaultXMax : xRange.max; + if (this.xMax <= this.xMin) this.xMax = this.xMin + 1; + this.xStep = (this.defaultXStep !== undefined) ? this.defaultXStep : (this.xMax-this.xMin)/5; - /** - * Returns formatted text for the minor axislabel, depending on the current - * date and the scale. For example when scale is MINUTE, the current time is - * formatted as "hh:mm". - * @param {Date} [date] custom date. if not provided, current date is taken - */ - TimeStep.prototype.getLabelMinor = function(date) { - if (date == undefined) { - date = this.current; + var yRange = this.getColumnRange(data,this.colY); + if (withBars) { + yRange.min -= this.yBarWidth / 2; + yRange.max += this.yBarWidth / 2; } + this.yMin = (this.defaultYMin !== undefined) ? this.defaultYMin : yRange.min; + this.yMax = (this.defaultYMax !== undefined) ? this.defaultYMax : yRange.max; + if (this.yMax <= this.yMin) this.yMax = this.yMin + 1; + this.yStep = (this.defaultYStep !== undefined) ? this.defaultYStep : (this.yMax-this.yMin)/5; - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: return moment(date).format('SSS'); - case TimeStep.SCALE.SECOND: return moment(date).format('s'); - case TimeStep.SCALE.MINUTE: return moment(date).format('HH:mm'); - case TimeStep.SCALE.HOUR: return moment(date).format('HH:mm'); - case TimeStep.SCALE.WEEKDAY: return moment(date).format('ddd D'); - case TimeStep.SCALE.DAY: return moment(date).format('D'); - case TimeStep.SCALE.MONTH: return moment(date).format('MMM'); - case TimeStep.SCALE.YEAR: return moment(date).format('YYYY'); - default: return ''; + var zRange = this.getColumnRange(data,this.colZ); + this.zMin = (this.defaultZMin !== undefined) ? this.defaultZMin : zRange.min; + this.zMax = (this.defaultZMax !== undefined) ? this.defaultZMax : zRange.max; + if (this.zMax <= this.zMin) this.zMax = this.zMin + 1; + this.zStep = (this.defaultZStep !== undefined) ? this.defaultZStep : (this.zMax-this.zMin)/5; + + if (this.colValue !== undefined) { + var valueRange = this.getColumnRange(data,this.colValue); + this.valueMin = (this.defaultValueMin !== undefined) ? this.defaultValueMin : valueRange.min; + this.valueMax = (this.defaultValueMax !== undefined) ? this.defaultValueMax : valueRange.max; + if (this.valueMax <= this.valueMin) this.valueMax = this.valueMin + 1; } + + // set the scale dependent on the ranges. + this._setScale(); }; + /** - * Returns formatted text for the major axis label, depending on the current - * date and the scale. For example when scale is MINUTE, the major scale is - * hours, and the hour will be formatted as "hh". - * @param {Date} [date] custom date. if not provided, current date is taken + * Filter the data based on the current filter + * @param {Array} data + * @return {Array} dataPoints Array with point objects which can be drawn on screen */ - TimeStep.prototype.getLabelMajor = function(date) { - if (date == undefined) { - date = this.current; - } + Graph3d.prototype._getDataPoints = function (data) { + // TODO: store the created matrix dataPoints in the filters instead of reloading each time + var x, y, i, z, obj, point; - //noinspection FallthroughInSwitchStatementJS - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND:return moment(date).format('HH:mm:ss'); - case TimeStep.SCALE.SECOND: return moment(date).format('D MMMM HH:mm'); - case TimeStep.SCALE.MINUTE: - case TimeStep.SCALE.HOUR: return moment(date).format('ddd D MMMM'); - case TimeStep.SCALE.WEEKDAY: - case TimeStep.SCALE.DAY: return moment(date).format('MMMM YYYY'); - case TimeStep.SCALE.MONTH: return moment(date).format('YYYY'); - case TimeStep.SCALE.YEAR: return ''; - default: return ''; - } - }; + var dataPoints = []; - module.exports = TimeStep; + if (this.style === Graph3d.STYLE.GRID || + this.style === Graph3d.STYLE.SURFACE) { + // copy all values from the google data table to a matrix + // the provided values are supposed to form a grid of (x,y) positions + // create two lists with all present x and y values + var dataX = []; + var dataY = []; + for (i = 0; i < this.getNumberOfRows(data); i++) { + x = data[i][this.colX] || 0; + y = data[i][this.colY] || 0; -/***/ }, -/* 18 */ -/***/ function(module, exports, __webpack_require__) { + if (dataX.indexOf(x) === -1) { + dataX.push(x); + } + if (dataY.indexOf(y) === -1) { + dataY.push(y); + } + } - /** - * Prototype for visual components - * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} [body] - * @param {Object} [options] - */ - function Component (body, options) { - this.options = null; - this.props = null; - } + function sortNumber(a, b) { + return a - b; + } + dataX.sort(sortNumber); + dataY.sort(sortNumber); - /** - * Set options for the component. The new options will be merged into the - * current options. - * @param {Object} options - */ - Component.prototype.setOptions = function(options) { - if (options) { - util.extend(this.options, options); - } - }; + // create a grid, a 2d matrix, with all values. + var dataMatrix = []; // temporary data matrix + for (i = 0; i < data.length; i++) { + x = data[i][this.colX] || 0; + y = data[i][this.colY] || 0; + z = data[i][this.colZ] || 0; - /** - * Repaint the component - * @return {boolean} Returns true if the component is resized - */ - Component.prototype.redraw = function() { - // should be implemented by the component - return false; - }; + var xIndex = dataX.indexOf(x); // TODO: implement Array().indexOf() for Internet Explorer + var yIndex = dataY.indexOf(y); - /** - * Destroy the component. Cleanup DOM and event listeners - */ - Component.prototype.destroy = function() { - // should be implemented by the component - }; + if (dataMatrix[xIndex] === undefined) { + dataMatrix[xIndex] = []; + } - /** - * Test whether the component is resized since the last time _isResized() was - * called. - * @return {Boolean} Returns true if the component is resized - * @protected - */ - Component.prototype._isResized = function() { - var resized = (this.props._previousWidth !== this.props.width || - this.props._previousHeight !== this.props.height); + var point3d = new Point3d(); + point3d.x = x; + point3d.y = y; + point3d.z = z; - this.props._previousWidth = this.props.width; - this.props._previousHeight = this.props.height; + obj = {}; + obj.point = point3d; + obj.trans = undefined; + obj.screen = undefined; + obj.bottom = new Point3d(x, y, this.zMin); - return resized; - }; + dataMatrix[xIndex][yIndex] = obj; - module.exports = Component; + dataPoints.push(obj); + } + + // fill in the pointers to the neighbors. + for (x = 0; x < dataMatrix.length; x++) { + for (y = 0; y < dataMatrix[x].length; y++) { + if (dataMatrix[x][y]) { + dataMatrix[x][y].pointRight = (x < dataMatrix.length-1) ? dataMatrix[x+1][y] : undefined; + dataMatrix[x][y].pointTop = (y < dataMatrix[x].length-1) ? dataMatrix[x][y+1] : undefined; + dataMatrix[x][y].pointCross = + (x < dataMatrix.length-1 && y < dataMatrix[x].length-1) ? + dataMatrix[x+1][y+1] : + undefined; + } + } + } + } + else { // 'dot', 'dot-line', etc. + // copy all values from the google data table to a list with Point3d objects + for (i = 0; i < data.length; i++) { + point = new Point3d(); + point.x = data[i][this.colX] || 0; + point.y = data[i][this.colY] || 0; + point.z = data[i][this.colZ] || 0; + if (this.colValue !== undefined) { + point.value = data[i][this.colValue] || 0; + } -/***/ }, -/* 19 */ -/***/ function(module, exports, __webpack_require__) { + obj = {}; + obj.point = point; + obj.bottom = new Point3d(point.x, point.y, this.zMin); + obj.trans = undefined; + obj.screen = undefined; - var util = __webpack_require__(1); - var Component = __webpack_require__(18); - var moment = __webpack_require__(40); - var locales = __webpack_require__(44); + dataPoints.push(obj); + } + } + + return dataPoints; + }; /** - * A current time bar - * @param {{range: Range, dom: Object, domProps: Object}} body - * @param {Object} [options] Available parameters: - * {Boolean} [showCurrentTime] - * @constructor CurrentTime - * @extends Component + * Create the main frame for the Graph3d. + * This function is executed once when a Graph3d object is created. The frame + * contains a canvas, and this canvas contains all objects like the axis and + * nodes. */ - function CurrentTime (body, options) { - this.body = body; + Graph3d.prototype.create = function () { + // remove all elements from the container element. + while (this.containerElement.hasChildNodes()) { + this.containerElement.removeChild(this.containerElement.firstChild); + } - // default options - this.defaultOptions = { - showCurrentTime: true, + this.frame = document.createElement('div'); + this.frame.style.position = 'relative'; + this.frame.style.overflow = 'hidden'; + + // create the graph canvas (HTML canvas element) + this.frame.canvas = document.createElement( 'canvas' ); + this.frame.canvas.style.position = 'relative'; + this.frame.appendChild(this.frame.canvas); + //if (!this.frame.canvas.getContext) { + { + var noCanvas = document.createElement( 'DIV' ); + noCanvas.style.color = 'red'; + noCanvas.style.fontWeight = 'bold' ; + noCanvas.style.padding = '10px'; + noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; + this.frame.canvas.appendChild(noCanvas); + } + + this.frame.filter = document.createElement( 'div' ); + this.frame.filter.style.position = 'absolute'; + this.frame.filter.style.bottom = '0px'; + this.frame.filter.style.left = '0px'; + this.frame.filter.style.width = '100%'; + this.frame.appendChild(this.frame.filter); - locales: locales, - locale: 'en' - }; - this.options = util.extend({}, this.defaultOptions); + // add event listeners to handle moving and zooming the contents + var me = this; + var onmousedown = function (event) {me._onMouseDown(event);}; + var ontouchstart = function (event) {me._onTouchStart(event);}; + var onmousewheel = function (event) {me._onWheel(event);}; + var ontooltip = function (event) {me._onTooltip(event);}; + // TODO: these events are never cleaned up... can give a 'memory leakage' - this._create(); + util.addEventListener(this.frame.canvas, 'keydown', onkeydown); + util.addEventListener(this.frame.canvas, 'mousedown', onmousedown); + util.addEventListener(this.frame.canvas, 'touchstart', ontouchstart); + util.addEventListener(this.frame.canvas, 'mousewheel', onmousewheel); + util.addEventListener(this.frame.canvas, 'mousemove', ontooltip); - this.setOptions(options); - } + // add the new graph to the container element + this.containerElement.appendChild(this.frame); + }; - CurrentTime.prototype = new Component(); /** - * Create the HTML DOM for the current time bar - * @private + * Set a new size for the graph + * @param {string} width Width in pixels or percentage (for example '800px' + * or '50%') + * @param {string} height Height in pixels or percentage (for example '400px' + * or '30%') */ - CurrentTime.prototype._create = function() { - var bar = document.createElement('div'); - bar.className = 'currenttime'; - bar.style.position = 'absolute'; - bar.style.top = '0px'; - bar.style.height = '100%'; + Graph3d.prototype.setSize = function(width, height) { + this.frame.style.width = width; + this.frame.style.height = height; - this.bar = bar; + this._resizeCanvas(); }; /** - * Destroy the CurrentTime bar + * Resize the canvas to the current size of the frame */ - CurrentTime.prototype.destroy = function () { - this.options.showCurrentTime = false; - this.redraw(); // will remove the bar from the DOM and stop refreshing + Graph3d.prototype._resizeCanvas = function() { + this.frame.canvas.style.width = '100%'; + this.frame.canvas.style.height = '100%'; - this.body = null; + this.frame.canvas.width = this.frame.canvas.clientWidth; + this.frame.canvas.height = this.frame.canvas.clientHeight; + + // adjust with for margin + this.frame.filter.style.width = (this.frame.canvas.clientWidth - 2 * 10) + 'px'; }; /** - * Set options for the component. Options will be merged in current options. - * @param {Object} options Available parameters: - * {boolean} [showCurrentTime] + * Start animation */ - CurrentTime.prototype.setOptions = function(options) { - if (options) { - // copy all options that we know - util.selectiveExtend(['showCurrentTime', 'locale', 'locales'], this.options, options); - } + Graph3d.prototype.animationStart = function() { + if (!this.frame.filter || !this.frame.filter.slider) + throw 'No animation available'; + + this.frame.filter.slider.play(); }; + /** - * Repaint the component - * @return {boolean} Returns true if the component is resized + * Stop animation */ - CurrentTime.prototype.redraw = function() { - if (this.options.showCurrentTime) { - var parent = this.body.dom.backgroundVertical; - if (this.bar.parentNode != parent) { - // attach to the dom - if (this.bar.parentNode) { - this.bar.parentNode.removeChild(this.bar); - } - parent.appendChild(this.bar); - - this.start(); - } + Graph3d.prototype.animationStop = function() { + if (!this.frame.filter || !this.frame.filter.slider) return; - var now = new Date(); - var x = this.body.util.toScreen(now); + this.frame.filter.slider.stop(); + }; - var locale = this.options.locales[this.options.locale]; - var title = locale.current + ' ' + locale.time + ': ' + moment(now).format('dddd, MMMM Do YYYY, H:mm:ss'); - title = title.charAt(0).toUpperCase() + title.substring(1); - this.bar.style.left = x + 'px'; - this.bar.title = title; + /** + * Resize the center position based on the current values in this.defaultXCenter + * and this.defaultYCenter (which are strings with a percentage or a value + * in pixels). The center positions are the variables this.xCenter + * and this.yCenter + */ + Graph3d.prototype._resizeCenter = function() { + // calculate the horizontal center position + if (this.defaultXCenter.charAt(this.defaultXCenter.length-1) === '%') { + this.xcenter = + parseFloat(this.defaultXCenter) / 100 * + this.frame.canvas.clientWidth; } else { - // remove the line from the DOM - if (this.bar.parentNode) { - this.bar.parentNode.removeChild(this.bar); - } - this.stop(); + this.xcenter = parseFloat(this.defaultXCenter); // supposed to be in px } - return false; + // calculate the vertical center position + if (this.defaultYCenter.charAt(this.defaultYCenter.length-1) === '%') { + this.ycenter = + parseFloat(this.defaultYCenter) / 100 * + (this.frame.canvas.clientHeight - this.frame.filter.clientHeight); + } + else { + this.ycenter = parseFloat(this.defaultYCenter); // supposed to be in px + } }; /** - * Start auto refreshing the current time bar + * Set the rotation and distance of the camera + * @param {Object} pos An object with the camera position. The object + * contains three parameters: + * - horizontal {Number} + * The horizontal rotation, between 0 and 2*PI. + * Optional, can be left undefined. + * - vertical {Number} + * The vertical rotation, between 0 and 0.5*PI + * if vertical=0.5*PI, the graph is shown from the + * top. Optional, can be left undefined. + * - distance {Number} + * The (normalized) distance of the camera to the + * center of the graph, a value between 0.71 and 5.0. + * Optional, can be left undefined. */ - CurrentTime.prototype.start = function() { - var me = this; - - function update () { - me.stop(); - - // determine interval to refresh - var scale = me.body.range.conversion(me.body.domProps.center.width).scale; - var interval = 1 / scale / 10; - if (interval < 30) interval = 30; - if (interval > 1000) interval = 1000; + Graph3d.prototype.setCameraPosition = function(pos) { + if (pos === undefined) { + return; + } - me.redraw(); + if (pos.horizontal !== undefined && pos.vertical !== undefined) { + this.camera.setArmRotation(pos.horizontal, pos.vertical); + } - // start a timer to adjust for the new time - me.currentTimeTimer = setTimeout(update, interval); + if (pos.distance !== undefined) { + this.camera.setArmLength(pos.distance); } - update(); + this.redraw(); }; + /** - * Stop auto refreshing the current time bar + * Retrieve the current camera rotation + * @return {object} An object with parameters horizontal, vertical, and + * distance */ - CurrentTime.prototype.stop = function() { - if (this.currentTimeTimer !== undefined) { - clearTimeout(this.currentTimeTimer); - delete this.currentTimeTimer; - } + Graph3d.prototype.getCameraPosition = function() { + var pos = this.camera.getArmRotation(); + pos.distance = this.camera.getArmLength(); + return pos; }; - module.exports = CurrentTime; - - -/***/ }, -/* 20 */ -/***/ function(module, exports, __webpack_require__) { - - var Hammer = __webpack_require__(41); - var util = __webpack_require__(1); - var Component = __webpack_require__(18); - var moment = __webpack_require__(40); - var locales = __webpack_require__(44); - /** - * A custom time bar - * @param {{range: Range, dom: Object}} body - * @param {Object} [options] Available parameters: - * {Boolean} [showCustomTime] - * @constructor CustomTime - * @extends Component + * Load data into the 3D Graph */ + Graph3d.prototype._readData = function(data) { + // read the data + this._dataInitialize(data, this.style); - function CustomTime (body, options) { - this.body = body; - - // default options - this.defaultOptions = { - showCustomTime: false, - locales: locales, - locale: 'en' - }; - this.options = util.extend({}, this.defaultOptions); - - this.customTime = new Date(); - this.eventParams = {}; // stores state parameters while dragging the bar - - // create the DOM - this._create(); - - this.setOptions(options); - } - - CustomTime.prototype = new Component(); - /** - * Set options for the component. Options will be merged in current options. - * @param {Object} options Available parameters: - * {boolean} [showCustomTime] - */ - CustomTime.prototype.setOptions = function(options) { - if (options) { - // copy all options that we know - util.selectiveExtend(['showCustomTime', 'locale', 'locales'], this.options, options); + if (this.dataFilter) { + // apply filtering + this.dataPoints = this.dataFilter._getDataPoints(); + } + else { + // no filtering. load all data + this.dataPoints = this._getDataPoints(this.dataTable); } - }; - - /** - * Create the DOM for the custom time - * @private - */ - CustomTime.prototype._create = function() { - var bar = document.createElement('div'); - bar.className = 'customtime'; - bar.style.position = 'absolute'; - bar.style.top = '0px'; - bar.style.height = '100%'; - this.bar = bar; - - var drag = document.createElement('div'); - drag.style.position = 'relative'; - drag.style.top = '0px'; - drag.style.left = '-10px'; - drag.style.height = '100%'; - drag.style.width = '20px'; - bar.appendChild(drag); - // attach event listeners - this.hammer = Hammer(bar, { - prevent_default: true - }); - this.hammer.on('dragstart', this._onDragStart.bind(this)); - this.hammer.on('drag', this._onDrag.bind(this)); - this.hammer.on('dragend', this._onDragEnd.bind(this)); + // draw the filter + this._redrawFilter(); }; /** - * Destroy the CustomTime bar + * Replace the dataset of the Graph3d + * @param {Array | DataSet | DataView} data */ - CustomTime.prototype.destroy = function () { - this.options.showCustomTime = false; - this.redraw(); // will remove the bar from the DOM - - this.hammer.enable(false); - this.hammer = null; + Graph3d.prototype.setData = function (data) { + this._readData(data); + this.redraw(); - this.body = null; + // start animation when option is true + if (this.animationAutoStart && this.dataFilter) { + this.animationStart(); + } }; /** - * Repaint the component - * @return {boolean} Returns true if the component is resized + * Update the options. Options will be merged with current options + * @param {Object} options */ - CustomTime.prototype.redraw = function () { - if (this.options.showCustomTime) { - var parent = this.body.dom.backgroundVertical; - if (this.bar.parentNode != parent) { - // attach to the dom - if (this.bar.parentNode) { - this.bar.parentNode.removeChild(this.bar); + Graph3d.prototype.setOptions = function (options) { + var cameraPosition = undefined; + + this.animationStop(); + + if (options !== undefined) { + // retrieve parameter values + if (options.width !== undefined) this.width = options.width; + if (options.height !== undefined) this.height = options.height; + + if (options.xCenter !== undefined) this.defaultXCenter = options.xCenter; + if (options.yCenter !== undefined) this.defaultYCenter = options.yCenter; + + if (options.filterLabel !== undefined) this.filterLabel = options.filterLabel; + if (options.legendLabel !== undefined) this.legendLabel = options.legendLabel; + if (options.xLabel !== undefined) this.xLabel = options.xLabel; + if (options.yLabel !== undefined) this.yLabel = options.yLabel; + if (options.zLabel !== undefined) this.zLabel = options.zLabel; + + if (options.style !== undefined) { + var styleNumber = this._getStyleNumber(options.style); + if (styleNumber !== -1) { + this.style = styleNumber; } - parent.appendChild(this.bar); } + if (options.showGrid !== undefined) this.showGrid = options.showGrid; + if (options.showPerspective !== undefined) this.showPerspective = options.showPerspective; + if (options.showShadow !== undefined) this.showShadow = options.showShadow; + if (options.tooltip !== undefined) this.showTooltip = options.tooltip; + if (options.showAnimationControls !== undefined) this.showAnimationControls = options.showAnimationControls; + if (options.keepAspectRatio !== undefined) this.keepAspectRatio = options.keepAspectRatio; + if (options.verticalRatio !== undefined) this.verticalRatio = options.verticalRatio; - var x = this.body.util.toScreen(this.customTime); + if (options.animationInterval !== undefined) this.animationInterval = options.animationInterval; + if (options.animationPreload !== undefined) this.animationPreload = options.animationPreload; + if (options.animationAutoStart !== undefined)this.animationAutoStart = options.animationAutoStart; - var locale = this.options.locales[this.options.locale]; - var title = locale.time + ': ' + moment(this.customTime).format('dddd, MMMM Do YYYY, H:mm:ss'); - title = title.charAt(0).toUpperCase() + title.substring(1); + if (options.xBarWidth !== undefined) this.defaultXBarWidth = options.xBarWidth; + if (options.yBarWidth !== undefined) this.defaultYBarWidth = options.yBarWidth; - this.bar.style.left = x + 'px'; - this.bar.title = title; - } - else { - // remove the line from the DOM - if (this.bar.parentNode) { - this.bar.parentNode.removeChild(this.bar); + if (options.xMin !== undefined) this.defaultXMin = options.xMin; + if (options.xStep !== undefined) this.defaultXStep = options.xStep; + if (options.xMax !== undefined) this.defaultXMax = options.xMax; + if (options.yMin !== undefined) this.defaultYMin = options.yMin; + if (options.yStep !== undefined) this.defaultYStep = options.yStep; + if (options.yMax !== undefined) this.defaultYMax = options.yMax; + if (options.zMin !== undefined) this.defaultZMin = options.zMin; + if (options.zStep !== undefined) this.defaultZStep = options.zStep; + if (options.zMax !== undefined) this.defaultZMax = options.zMax; + if (options.valueMin !== undefined) this.defaultValueMin = options.valueMin; + if (options.valueMax !== undefined) this.defaultValueMax = options.valueMax; + + if (options.cameraPosition !== undefined) cameraPosition = options.cameraPosition; + + if (cameraPosition !== undefined) { + this.camera.setArmRotation(cameraPosition.horizontal, cameraPosition.vertical); + this.camera.setArmLength(cameraPosition.distance); + } + else { + this.camera.setArmRotation(1.0, 0.5); + this.camera.setArmLength(1.7); } } - return false; - }; + this._setBackgroundColor(options && options.backgroundColor); - /** - * Set custom time. - * @param {Date} time - */ - CustomTime.prototype.setCustomTime = function(time) { - this.customTime = new Date(time.valueOf()); - this.redraw(); - }; + this.setSize(this.width, this.height); - /** - * Retrieve the current custom time. - * @return {Date} customTime - */ - CustomTime.prototype.getCustomTime = function() { - return new Date(this.customTime.valueOf()); + // re-load the data + if (this.dataTable) { + this.setData(this.dataTable); + } + + // start animation when option is true + if (this.animationAutoStart && this.dataFilter) { + this.animationStart(); + } }; /** - * Start moving horizontally - * @param {Event} event - * @private + * Redraw the Graph. */ - CustomTime.prototype._onDragStart = function(event) { - this.eventParams.dragging = true; - this.eventParams.customTime = this.customTime; + Graph3d.prototype.redraw = function() { + if (this.dataPoints === undefined) { + throw 'Error: graph data not initialized'; + } - event.stopPropagation(); - event.preventDefault(); + this._resizeCanvas(); + this._resizeCenter(); + this._redrawSlider(); + this._redrawClear(); + this._redrawAxis(); + + if (this.style === Graph3d.STYLE.GRID || + this.style === Graph3d.STYLE.SURFACE) { + this._redrawDataGrid(); + } + else if (this.style === Graph3d.STYLE.LINE) { + this._redrawDataLine(); + } + else if (this.style === Graph3d.STYLE.BAR || + this.style === Graph3d.STYLE.BARCOLOR || + this.style === Graph3d.STYLE.BARSIZE) { + this._redrawDataBar(); + } + else { + // style is DOT, DOTLINE, DOTCOLOR, DOTSIZE + this._redrawDataDot(); + } + + this._redrawInfo(); + this._redrawLegend(); }; /** - * Perform moving operating. - * @param {Event} event - * @private + * Clear the canvas before redrawing */ - CustomTime.prototype._onDrag = function (event) { - if (!this.eventParams.dragging) return; - - var deltaX = event.gesture.deltaX, - x = this.body.util.toScreen(this.eventParams.customTime) + deltaX, - time = this.body.util.toTime(x); - - this.setCustomTime(time); - - // fire a timechange event - this.body.emitter.emit('timechange', { - time: new Date(this.customTime.valueOf()) - }); + Graph3d.prototype._redrawClear = function() { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); - event.stopPropagation(); - event.preventDefault(); + ctx.clearRect(0, 0, canvas.width, canvas.height); }; + /** - * Stop moving operating. - * @param {event} event - * @private + * Redraw the legend showing the colors */ - CustomTime.prototype._onDragEnd = function (event) { - if (!this.eventParams.dragging) return; + Graph3d.prototype._redrawLegend = function() { + var y; - // fire a timechanged event - this.body.emitter.emit('timechanged', { - time: new Date(this.customTime.valueOf()) - }); + if (this.style === Graph3d.STYLE.DOTCOLOR || + this.style === Graph3d.STYLE.DOTSIZE) { - event.stopPropagation(); - event.preventDefault(); - }; + var dotSize = this.frame.clientWidth * 0.02; - module.exports = CustomTime; + var widthMin, widthMax; + if (this.style === Graph3d.STYLE.DOTSIZE) { + widthMin = dotSize / 2; // px + widthMax = dotSize / 2 + dotSize * 2; // Todo: put this in one function + } + else { + widthMin = 20; // px + widthMax = 20; // px + } + var height = Math.max(this.frame.clientHeight * 0.25, 100); + var top = this.margin; + var right = this.frame.clientWidth - this.margin; + var left = right - widthMax; + var bottom = top + height; + } -/***/ }, -/* 21 */ -/***/ function(module, exports, __webpack_require__) { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + ctx.lineWidth = 1; + ctx.font = '14px arial'; // TODO: put in options - var util = __webpack_require__(1); - var DOMutil = __webpack_require__(2); - var Component = __webpack_require__(18); - var DataStep = __webpack_require__(14); + if (this.style === Graph3d.STYLE.DOTCOLOR) { + // draw the color bar + var ymin = 0; + var ymax = height; // Todo: make height customizable + for (y = ymin; y < ymax; y++) { + var f = (y - ymin) / (ymax - ymin); - /** - * A horizontal time axis - * @param {Object} [options] See DataAxis.setOptions for the available - * options. - * @constructor DataAxis - * @extends Component - * @param body - */ - function DataAxis (body, options, svg) { - this.id = util.randomUUID(); - this.body = body; + //var width = (dotSize / 2 + (1-f) * dotSize * 2); // Todo: put this in one function + var hue = f * 240; + var color = this._hsv2rgb(hue, 1, 1); - this.defaultOptions = { - orientation: 'left', // supported: 'left', 'right' - showMinorLabels: true, - showMajorLabels: true, - icons: true, - majorLinesOffset: 7, - minorLinesOffset: 4, - labelOffsetX: 10, - labelOffsetY: 2, - iconWidth: 20, - width: '40px', - visible: true, - customRange: { - left: {min:undefined, max:undefined}, - right: {min:undefined, max:undefined} + ctx.strokeStyle = color; + ctx.beginPath(); + ctx.moveTo(left, top + y); + ctx.lineTo(right, top + y); + ctx.stroke(); } - }; - this.linegraphSVG = svg; - this.props = {}; - this.DOMelements = { // dynamic elements - lines: {}, - labels: {} - }; + ctx.strokeStyle = this.colorAxis; + ctx.strokeRect(left, top, widthMax, height); + } - this.dom = {}; + if (this.style === Graph3d.STYLE.DOTSIZE) { + // draw border around color bar + ctx.strokeStyle = this.colorAxis; + ctx.fillStyle = this.colorDot; + ctx.beginPath(); + ctx.moveTo(left, top); + ctx.lineTo(right, top); + ctx.lineTo(right - widthMax + widthMin, bottom); + ctx.lineTo(left, bottom); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } - this.range = {start:0, end:0}; + if (this.style === Graph3d.STYLE.DOTCOLOR || + this.style === Graph3d.STYLE.DOTSIZE) { + // print values along the color bar + var gridLineLen = 5; // px + var step = new StepNumber(this.valueMin, this.valueMax, (this.valueMax-this.valueMin)/5, true); + step.start(); + if (step.getCurrent() < this.valueMin) { + step.next(); + } + while (!step.end()) { + y = bottom - (step.getCurrent() - this.valueMin) / (this.valueMax - this.valueMin) * height; - this.options = util.extend({}, this.defaultOptions); - this.conversionFactor = 1; + ctx.beginPath(); + ctx.moveTo(left - gridLineLen, y); + ctx.lineTo(left, y); + ctx.stroke(); - this.setOptions(options); - this.width = Number(('' + this.options.width).replace("px","")); - this.minWidth = this.width; - this.height = this.linegraphSVG.offsetHeight; + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = this.colorAxis; + ctx.fillText(step.getCurrent(), left - 2 * gridLineLen, y); - this.stepPixels = 25; - this.stepPixelsForced = 25; - this.lineOffset = 0; - this.master = true; - this.svgElements = {}; + step.next(); + } + ctx.textAlign = 'right'; + ctx.textBaseline = 'top'; + var label = this.legendLabel; + ctx.fillText(label, right, bottom + this.margin); + } + }; - this.groups = {}; - this.amountOfGroups = 0; + /** + * Redraw the filter + */ + Graph3d.prototype._redrawFilter = function() { + this.frame.filter.innerHTML = ''; - // create the HTML DOM - this._create(); - } + if (this.dataFilter) { + var options = { + 'visible': this.showAnimationControls + }; + var slider = new Slider(this.frame.filter, options); + this.frame.filter.slider = slider; - DataAxis.prototype = new Component(); + // TODO: css here is not nice here... + this.frame.filter.style.padding = '10px'; + //this.frame.filter.style.backgroundColor = '#EFEFEF'; + slider.setValues(this.dataFilter.values); + slider.setPlayInterval(this.animationInterval); + // create an event handler + var me = this; + var onchange = function () { + var index = slider.getIndex(); - DataAxis.prototype.addGroup = function(label, graphOptions) { - if (!this.groups.hasOwnProperty(label)) { - this.groups[label] = graphOptions; - } - this.amountOfGroups += 1; - }; + me.dataFilter.selectValue(index); + me.dataPoints = me.dataFilter._getDataPoints(); - DataAxis.prototype.updateGroup = function(label, graphOptions) { - this.groups[label] = graphOptions; + me.redraw(); + }; + slider.setOnChangeCallback(onchange); + } + else { + this.frame.filter.slider = undefined; + } }; - DataAxis.prototype.removeGroup = function(label) { - if (this.groups.hasOwnProperty(label)) { - delete this.groups[label]; - this.amountOfGroups -= 1; + /** + * Redraw the slider + */ + Graph3d.prototype._redrawSlider = function() { + if ( this.frame.filter.slider !== undefined) { + this.frame.filter.slider.redraw(); } }; - DataAxis.prototype.setOptions = function (options) { - if (options) { - var redraw = false; - if (this.options.orientation != options.orientation && options.orientation !== undefined) { - redraw = true; - } - var fields = [ - 'orientation', - 'showMinorLabels', - 'showMajorLabels', - 'icons', - 'majorLinesOffset', - 'minorLinesOffset', - 'labelOffsetX', - 'labelOffsetY', - 'iconWidth', - 'width', - 'visible', - 'customRange' - ]; - util.selectiveExtend(fields, this.options, options); + /** + * Redraw common information + */ + Graph3d.prototype._redrawInfo = function() { + if (this.dataFilter) { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); - this.minWidth = Number(('' + this.options.width).replace("px","")); + ctx.font = '14px arial'; // TODO: put in options + ctx.lineStyle = 'gray'; + ctx.fillStyle = 'gray'; + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; - if (redraw == true && this.dom.frame) { - this.hide(); - this.show(); - } + var x = this.margin; + var y = this.margin; + ctx.fillText(this.dataFilter.getLabel() + ': ' + this.dataFilter.getSelectedValue(), x, y); } }; /** - * Create the HTML DOM for the DataAxis + * Redraw the axis */ - DataAxis.prototype._create = function() { - this.dom.frame = document.createElement('div'); - this.dom.frame.style.width = this.options.width; - this.dom.frame.style.height = this.height; - - this.dom.lineContainer = document.createElement('div'); - this.dom.lineContainer.style.width = '100%'; - this.dom.lineContainer.style.height = this.height; - - // create svg element for graph drawing. - this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); - this.svg.style.position = "absolute"; - this.svg.style.top = '0px'; - this.svg.style.height = '100%'; - this.svg.style.width = '100%'; - this.svg.style.display = "block"; - this.dom.frame.appendChild(this.svg); - }; + Graph3d.prototype._redrawAxis = function() { + var canvas = this.frame.canvas, + ctx = canvas.getContext('2d'), + from, to, step, prettyStep, + text, xText, yText, zText, + offset, xOffset, yOffset, + xMin2d, xMax2d; - DataAxis.prototype._redrawGroupIcons = function () { - DOMutil.prepareElements(this.svgElements); + // TODO: get the actual rendered style of the containerElement + //ctx.font = this.containerElement.style.font; + ctx.font = 24 / this.camera.getArmLength() + 'px arial'; - var x; - var iconWidth = this.options.iconWidth; - var iconHeight = 15; - var iconOffset = 4; - var y = iconOffset + 0.5 * iconHeight; + // calculate the length for the short grid lines + var gridLenX = 0.025 / this.scale.x; + var gridLenY = 0.025 / this.scale.y; + var textMargin = 5 / this.camera.getArmLength(); // px + var armAngle = this.camera.getArmRotation().horizontal; - if (this.options.orientation == 'left') { - x = iconOffset; - } - else { - x = this.width - iconWidth - iconOffset; + // draw x-grid lines + ctx.lineWidth = 1; + prettyStep = (this.defaultXStep === undefined); + step = new StepNumber(this.xMin, this.xMax, this.xStep, prettyStep); + step.start(); + if (step.getCurrent() < this.xMin) { + step.next(); } + while (!step.end()) { + var x = step.getCurrent(); - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true) { - this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); - y += iconHeight + iconOffset; - } + if (this.showGrid) { + from = this._convert3Dto2D(new Point3d(x, this.yMin, this.zMin)); + to = this._convert3Dto2D(new Point3d(x, this.yMax, this.zMin)); + ctx.strokeStyle = this.colorGrid; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); } - } + else { + from = this._convert3Dto2D(new Point3d(x, this.yMin, this.zMin)); + to = this._convert3Dto2D(new Point3d(x, this.yMin+gridLenX, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); - DOMutil.cleanupElements(this.svgElements); - }; + from = this._convert3Dto2D(new Point3d(x, this.yMax, this.zMin)); + to = this._convert3Dto2D(new Point3d(x, this.yMax-gridLenX, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + } - /** - * Create the HTML DOM for the DataAxis - */ - DataAxis.prototype.show = function() { - if (!this.dom.frame.parentNode) { - if (this.options.orientation == 'left') { - this.body.dom.left.appendChild(this.dom.frame); + yText = (Math.cos(armAngle) > 0) ? this.yMin : this.yMax; + text = this._convert3Dto2D(new Point3d(x, yText, this.zMin)); + if (Math.cos(armAngle * 2) > 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + text.y += textMargin; + } + else if (Math.sin(armAngle * 2) < 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; } else { - this.body.dom.right.appendChild(this.dom.frame); + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; } - } - - if (!this.dom.lineContainer.parentNode) { - this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer); - } - }; + ctx.fillStyle = this.colorAxis; + ctx.fillText(' ' + step.getCurrent() + ' ', text.x, text.y); - /** - * Create the HTML DOM for the DataAxis - */ - DataAxis.prototype.hide = function() { - if (this.dom.frame.parentNode) { - this.dom.frame.parentNode.removeChild(this.dom.frame); + step.next(); } - if (this.dom.lineContainer.parentNode) { - this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer); + // draw y-grid lines + ctx.lineWidth = 1; + prettyStep = (this.defaultYStep === undefined); + step = new StepNumber(this.yMin, this.yMax, this.yStep, prettyStep); + step.start(); + if (step.getCurrent() < this.yMin) { + step.next(); } - }; - - /** - * Set a range (start and end) - * @param end - * @param start - * @param end - */ - DataAxis.prototype.setRange = function (start, end) { - this.range.start = start; - this.range.end = end; - }; + while (!step.end()) { + if (this.showGrid) { + from = this._convert3Dto2D(new Point3d(this.xMin, step.getCurrent(), this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMax, step.getCurrent(), this.zMin)); + ctx.strokeStyle = this.colorGrid; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + } + else { + from = this._convert3Dto2D(new Point3d(this.xMin, step.getCurrent(), this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMin+gridLenY, step.getCurrent(), this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); - /** - * Repaint the component - * @return {boolean} Returns true if the component is resized - */ - DataAxis.prototype.redraw = function () { - var changeCalled = false; - var activeGroups = 0; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true) { - activeGroups++; - } + from = this._convert3Dto2D(new Point3d(this.xMax, step.getCurrent(), this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMax-gridLenY, step.getCurrent(), this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); } - } - if (this.amountOfGroups == 0 || activeGroups == 0) { - this.hide(); - } - else { - this.show(); - this.height = Number(this.linegraphSVG.style.height.replace("px","")); - // svg offsetheight did not work in firefox and explorer... - this.dom.lineContainer.style.height = this.height + 'px'; - this.width = this.options.visible == true ? Number(('' + this.options.width).replace("px","")) : 0; + xText = (Math.sin(armAngle ) > 0) ? this.xMin : this.xMax; + text = this._convert3Dto2D(new Point3d(xText, step.getCurrent(), this.zMin)); + if (Math.cos(armAngle * 2) < 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + text.y += textMargin; + } + else if (Math.sin(armAngle * 2) > 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + } + else { + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + } + ctx.fillStyle = this.colorAxis; + ctx.fillText(' ' + step.getCurrent() + ' ', text.x, text.y); - var props = this.props; - var frame = this.dom.frame; + step.next(); + } - // update classname - frame.className = 'dataaxis'; + // draw z-grid lines and axis + ctx.lineWidth = 1; + prettyStep = (this.defaultZStep === undefined); + step = new StepNumber(this.zMin, this.zMax, this.zStep, prettyStep); + step.start(); + if (step.getCurrent() < this.zMin) { + step.next(); + } + xText = (Math.cos(armAngle ) > 0) ? this.xMin : this.xMax; + yText = (Math.sin(armAngle ) < 0) ? this.yMin : this.yMax; + while (!step.end()) { + // TODO: make z-grid lines really 3d? + from = this._convert3Dto2D(new Point3d(xText, yText, step.getCurrent())); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(from.x - textMargin, from.y); + ctx.stroke(); - // calculate character width and height - this._calculateCharSize(); + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = this.colorAxis; + ctx.fillText(step.getCurrent() + ' ', from.x - 5, from.y); - var orientation = this.options.orientation; - var showMinorLabels = this.options.showMinorLabels; - var showMajorLabels = this.options.showMajorLabels; + step.next(); + } + ctx.lineWidth = 1; + from = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); + to = this._convert3Dto2D(new Point3d(xText, yText, this.zMax)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); - // determine the width and height of the elemens for the axis - props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; - props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; + // draw x-axis + ctx.lineWidth = 1; + // line at yMin + xMin2d = this._convert3Dto2D(new Point3d(this.xMin, this.yMin, this.zMin)); + xMax2d = this._convert3Dto2D(new Point3d(this.xMax, this.yMin, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(xMin2d.x, xMin2d.y); + ctx.lineTo(xMax2d.x, xMax2d.y); + ctx.stroke(); + // line at ymax + xMin2d = this._convert3Dto2D(new Point3d(this.xMin, this.yMax, this.zMin)); + xMax2d = this._convert3Dto2D(new Point3d(this.xMax, this.yMax, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(xMin2d.x, xMin2d.y); + ctx.lineTo(xMax2d.x, xMax2d.y); + ctx.stroke(); - props.minorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.minorLinesOffset; - props.minorLineHeight = 1; - props.majorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.majorLinesOffset; - props.majorLineHeight = 1; + // draw y-axis + ctx.lineWidth = 1; + // line at xMin + from = this._convert3Dto2D(new Point3d(this.xMin, this.yMin, this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMin, this.yMax, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + // line at xMax + from = this._convert3Dto2D(new Point3d(this.xMax, this.yMin, this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMax, this.yMax, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); - // take frame offline while updating (is almost twice as fast) - if (orientation == 'left') { - frame.style.top = '0'; - frame.style.left = '0'; - frame.style.bottom = ''; - frame.style.width = this.width + 'px'; - frame.style.height = this.height + "px"; + // draw x-label + var xLabel = this.xLabel; + if (xLabel.length > 0) { + yOffset = 0.1 / this.scale.y; + xText = (this.xMin + this.xMax) / 2; + yText = (Math.cos(armAngle) > 0) ? this.yMin - yOffset: this.yMax + yOffset; + text = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); + if (Math.cos(armAngle * 2) > 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; } - else { // right - frame.style.top = ''; - frame.style.bottom = '0'; - frame.style.left = '0'; - frame.style.width = this.width + 'px'; - frame.style.height = this.height + "px"; + else if (Math.sin(armAngle * 2) < 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + } + else { + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + } + ctx.fillStyle = this.colorAxis; + ctx.fillText(xLabel, text.x, text.y); + } + + // draw y-label + var yLabel = this.yLabel; + if (yLabel.length > 0) { + xOffset = 0.1 / this.scale.x; + xText = (Math.sin(armAngle ) > 0) ? this.xMin - xOffset : this.xMax + xOffset; + yText = (this.yMin + this.yMax) / 2; + text = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); + if (Math.cos(armAngle * 2) < 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; } - changeCalled = this._redrawLabels(); - if (this.options.icons == true) { - this._redrawGroupIcons(); + else if (Math.sin(armAngle * 2) > 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + } + else { + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; } + ctx.fillStyle = this.colorAxis; + ctx.fillText(yLabel, text.x, text.y); + } + + // draw z-label + var zLabel = this.zLabel; + if (zLabel.length > 0) { + offset = 30; // pixels. // TODO: relate to the max width of the values on the z axis? + xText = (Math.cos(armAngle ) > 0) ? this.xMin : this.xMax; + yText = (Math.sin(armAngle ) < 0) ? this.yMin : this.yMax; + zText = (this.zMin + this.zMax) / 2; + text = this._convert3Dto2D(new Point3d(xText, yText, zText)); + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = this.colorAxis; + ctx.fillText(zLabel, text.x - offset, text.y); } - return changeCalled; }; /** - * Repaint major and minor text labels and vertical grid lines - * @private + * Calculate the color based on the given value. + * @param {Number} H Hue, a value be between 0 and 360 + * @param {Number} S Saturation, a value between 0 and 1 + * @param {Number} V Value, a value between 0 and 1 */ - DataAxis.prototype._redrawLabels = function () { - DOMutil.prepareElements(this.DOMelements.lines); - DOMutil.prepareElements(this.DOMelements.labels); - - var orientation = this.options['orientation']; + Graph3d.prototype._hsv2rgb = function(H, S, V) { + var R, G, B, C, Hi, X; - // calculate range and step (step such that we have space for 7 characters per label) - var minimumStep = this.master ? this.props.majorCharHeight || 10 : this.stepPixelsForced; - var step = new DataStep(this.range.start, this.range.end, minimumStep, this.dom.frame.offsetHeight, this.options.customRange[this.options.orientation]); - this.step = step; - // get the distance in pixels for a step - // dead space is space that is "left over" after a step - var stepPixels = (this.dom.frame.offsetHeight - (step.deadSpace * (this.dom.frame.offsetHeight / step.marginRange))) / (((step.marginRange - step.deadSpace) / step.step)); - this.stepPixels = stepPixels; + C = V * S; + Hi = Math.floor(H/60); // hi = 0,1,2,3,4,5 + X = C * (1 - Math.abs(((H/60) % 2) - 1)); - var amountOfSteps = this.height / stepPixels; - var stepDifference = 0; + switch (Hi) { + case 0: R = C; G = X; B = 0; break; + case 1: R = X; G = C; B = 0; break; + case 2: R = 0; G = C; B = X; break; + case 3: R = 0; G = X; B = C; break; + case 4: R = X; G = 0; B = C; break; + case 5: R = C; G = 0; B = X; break; - if (this.master == false) { - stepPixels = this.stepPixelsForced; - stepDifference = Math.round((this.dom.frame.offsetHeight / stepPixels) - amountOfSteps); - for (var i = 0; i < 0.5 * stepDifference; i++) { - step.previous(); - } - amountOfSteps = this.height / stepPixels; - } - else { - amountOfSteps += 0.25; + default: R = 0; G = 0; B = 0; break; } + return 'RGB(' + parseInt(R*255) + ',' + parseInt(G*255) + ',' + parseInt(B*255) + ')'; + }; - this.valueAtZero = step.marginEnd; - var marginStartPos = 0; - - // do not draw the first label - var max = 1; - this.maxLabelSize = 0; - var y = 0; - while (max < Math.round(amountOfSteps)) { - step.next(); - y = Math.round(max * stepPixels); - marginStartPos = max * stepPixels; - var isMajor = step.isMajor(); + /** + * Draw all datapoints as a grid + * This function can be used when the style is 'grid' + */ + Graph3d.prototype._redrawDataGrid = function() { + var canvas = this.frame.canvas, + ctx = canvas.getContext('2d'), + point, right, top, cross, + i, + topSideVisible, fillStyle, strokeStyle, lineWidth, + h, s, v, zAvg; - if (this.options['showMinorLabels'] && isMajor == false || this.master == false && this.options['showMinorLabels'] == true) { - this._redrawLabel(y - 2, step.getCurrent(), orientation, 'yAxis minor', this.props.minorCharHeight); - } - if (isMajor && this.options['showMajorLabels'] && this.master == true || - this.options['showMinorLabels'] == false && this.master == false && isMajor == true) { - if (y >= 0) { - this._redrawLabel(y - 2, step.getCurrent(), orientation, 'yAxis major', this.props.majorCharHeight); - } - this._redrawLine(y, orientation, 'grid horizontal major', this.options.majorLinesOffset, this.props.majorLineWidth); - } - else { - this._redrawLine(y, orientation, 'grid horizontal minor', this.options.minorLinesOffset, this.props.minorLineWidth); - } + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? - max++; - } + // calculate the translations and screen position of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); - if (this.master == false) { - this.conversionFactor = y / (this.valueAtZero - step.current); - } - else { - this.conversionFactor = this.dom.frame.offsetHeight / step.marginRange; - } + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; - var offset = this.options.icons == true ? this.options.iconWidth + this.options.labelOffsetX + 15 : this.options.labelOffsetX + 15; - // this will resize the yAxis to accomodate the labels. - if (this.maxLabelSize > (this.width - offset) && this.options.visible == true) { - this.width = this.maxLabelSize + offset; - this.options.width = this.width + "px"; - DOMutil.cleanupElements(this.DOMelements.lines); - DOMutil.cleanupElements(this.DOMelements.labels); - this.redraw(); - return true; - } - // this will resize the yAxis if it is too big for the labels. - else if (this.maxLabelSize < (this.width - offset) && this.options.visible == true && this.width > this.minWidth) { - this.width = Math.max(this.minWidth,this.maxLabelSize + offset); - this.options.width = this.width + "px"; - DOMutil.cleanupElements(this.DOMelements.lines); - DOMutil.cleanupElements(this.DOMelements.labels); - this.redraw(); - return true; - } - else { - DOMutil.cleanupElements(this.DOMelements.lines); - DOMutil.cleanupElements(this.DOMelements.labels); - return false; + // calculate the translation of the point at the bottom (needed for sorting) + var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); + this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; } - }; - DataAxis.prototype.convertValue = function (value) { - var invertedValue = this.valueAtZero - value; - var convertedValue = invertedValue * this.conversionFactor; - return convertedValue; - }; + // sort the points on depth of their (x,y) position (not on z) + var sortDepth = function (a, b) { + return b.dist - a.dist; + }; + this.dataPoints.sort(sortDepth); - /** - * Create a label for the axis at position x - * @private - * @param y - * @param text - * @param orientation - * @param className - * @param characterHeight - */ - DataAxis.prototype._redrawLabel = function (y, text, orientation, className, characterHeight) { - // reuse redundant label - var label = DOMutil.getDOMElement('div',this.DOMelements.labels, this.dom.frame); //this.dom.redundant.labels.shift(); - label.className = className; - label.innerHTML = text; - if (orientation == 'left') { - label.style.left = '-' + this.options.labelOffsetX + 'px'; - label.style.textAlign = "right"; - } - else { - label.style.right = '-' + this.options.labelOffsetX + 'px'; - label.style.textAlign = "left"; - } + if (this.style === Graph3d.STYLE.SURFACE) { + for (i = 0; i < this.dataPoints.length; i++) { + point = this.dataPoints[i]; + right = this.dataPoints[i].pointRight; + top = this.dataPoints[i].pointTop; + cross = this.dataPoints[i].pointCross; - label.style.top = y - 0.5 * characterHeight + this.options.labelOffsetY + 'px'; + if (point !== undefined && right !== undefined && top !== undefined && cross !== undefined) { - text += ''; + if (this.showGrayBottom || this.showShadow) { + // calculate the cross product of the two vectors from center + // to left and right, in order to know whether we are looking at the + // bottom or at the top side. We can also use the cross product + // for calculating light intensity + var aDiff = Point3d.subtract(cross.trans, point.trans); + var bDiff = Point3d.subtract(top.trans, right.trans); + var crossproduct = Point3d.crossProduct(aDiff, bDiff); + var len = crossproduct.length(); + // FIXME: there is a bug with determining the surface side (shadow or colored) - var largestWidth = Math.max(this.props.majorCharWidth,this.props.minorCharWidth); - if (this.maxLabelSize < text.length * largestWidth) { - this.maxLabelSize = text.length * largestWidth; - } - }; + topSideVisible = (crossproduct.z > 0); + } + else { + topSideVisible = true; + } - /** - * Create a minor line for the axis at position y - * @param y - * @param orientation - * @param className - * @param offset - * @param width - */ - DataAxis.prototype._redrawLine = function (y, orientation, className, offset, width) { - if (this.master == true) { - var line = DOMutil.getDOMElement('div',this.DOMelements.lines, this.dom.lineContainer);//this.dom.redundant.lines.shift(); - line.className = className; - line.innerHTML = ''; + if (topSideVisible) { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + zAvg = (point.point.z + right.point.z + top.point.z + cross.point.z) / 4; + h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + s = 1; // saturation - if (orientation == 'left') { - line.style.left = (this.width - offset) + 'px'; - } - else { - line.style.right = (this.width - offset) + 'px'; - } + if (this.showShadow) { + v = Math.min(1 + (crossproduct.x / len) / 2, 1); // value. TODO: scale + fillStyle = this._hsv2rgb(h, s, v); + strokeStyle = fillStyle; + } + else { + v = 1; + fillStyle = this._hsv2rgb(h, s, v); + strokeStyle = this.colorAxis; + } + } + else { + fillStyle = 'gray'; + strokeStyle = this.colorAxis; + } + lineWidth = 0.5; - line.style.width = width + 'px'; - line.style.top = y + 'px'; + ctx.lineWidth = lineWidth; + ctx.fillStyle = fillStyle; + ctx.strokeStyle = strokeStyle; + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + ctx.lineTo(right.screen.x, right.screen.y); + ctx.lineTo(cross.screen.x, cross.screen.y); + ctx.lineTo(top.screen.x, top.screen.y); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } + } } - }; - - - - - - /** - * Determine the size of text on the axis (both major and minor axis). - * The size is calculated only once and then cached in this.props. - * @private - */ - DataAxis.prototype._calculateCharSize = function () { - // determine the char width and height on the minor axis - if (!('minorCharHeight' in this.props)) { - var textMinor = document.createTextNode('0'); - var measureCharMinor = document.createElement('DIV'); - measureCharMinor.className = 'yAxis minor measure'; - measureCharMinor.appendChild(textMinor); - this.dom.frame.appendChild(measureCharMinor); + else { // grid style + for (i = 0; i < this.dataPoints.length; i++) { + point = this.dataPoints[i]; + right = this.dataPoints[i].pointRight; + top = this.dataPoints[i].pointTop; - this.props.minorCharHeight = measureCharMinor.clientHeight; - this.props.minorCharWidth = measureCharMinor.clientWidth; + if (point !== undefined) { + if (this.showPerspective) { + lineWidth = 2 / -point.trans.z; + } + else { + lineWidth = 2 * -(this.eye.z / this.camera.getArmLength()); + } + } - this.dom.frame.removeChild(measureCharMinor); - } + if (point !== undefined && right !== undefined) { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + zAvg = (point.point.z + right.point.z) / 2; + h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; - if (!('majorCharHeight' in this.props)) { - var textMajor = document.createTextNode('0'); - var measureCharMajor = document.createElement('DIV'); - measureCharMajor.className = 'yAxis major measure'; - measureCharMajor.appendChild(textMajor); - this.dom.frame.appendChild(measureCharMajor); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = this._hsv2rgb(h, 1, 1); + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + ctx.lineTo(right.screen.x, right.screen.y); + ctx.stroke(); + } - this.props.majorCharHeight = measureCharMajor.clientHeight; - this.props.majorCharWidth = measureCharMajor.clientWidth; + if (point !== undefined && top !== undefined) { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + zAvg = (point.point.z + top.point.z) / 2; + h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; - this.dom.frame.removeChild(measureCharMajor); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = this._hsv2rgb(h, 1, 1); + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + ctx.lineTo(top.screen.x, top.screen.y); + ctx.stroke(); + } + } } }; + /** - * Snap a date to a rounded value. - * The snap intervals are dependent on the current scale and step. - * @param {Date} date the date to be snapped. - * @return {Date} snappedDate + * Draw all datapoints as dots. + * This function can be used when the style is 'dot' or 'dot-line' */ - DataAxis.prototype.snap = function(date) { - return this.step.snap(date); - }; - - module.exports = DataAxis; - - -/***/ }, -/* 22 */ -/***/ function(module, exports, __webpack_require__) { + Graph3d.prototype._redrawDataDot = function() { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + var i; - var util = __webpack_require__(1); - var DOMutil = __webpack_require__(2); + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? - /** - * @constructor Group - * @param {Number | String} groupId - * @param {Object} data - * @param {ItemSet} itemSet - */ - function GraphGroup (group, groupId, options, groupsUsingDefaultStyles) { - this.id = groupId; - var fields = ['sampling','style','sort','yAxisOrientation','barChart','drawPoints','shaded','catmullRom'] - this.options = util.selectiveBridgeObject(fields,options); - this.usingDefaultStyle = group.className === undefined; - this.groupsUsingDefaultStyles = groupsUsingDefaultStyles; - this.zeroPosition = 0; - this.update(group); - if (this.usingDefaultStyle == true) { - this.groupsUsingDefaultStyles[0] += 1; - } - this.itemsData = []; - this.visible = group.visible === undefined ? true : group.visible; - } + // calculate the translations of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; - GraphGroup.prototype.setItems = function(items) { - if (items != null) { - this.itemsData = items; - if (this.options.sort == true) { - this.itemsData.sort(function (a,b) {return a.x - b.x;}) - } - } - else { - this.itemsData = []; + // calculate the distance from the point at the bottom to the camera + var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); + this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; } - }; - - GraphGroup.prototype.setZeroPosition = function(pos) { - this.zeroPosition = pos; - }; - GraphGroup.prototype.setOptions = function(options) { - if (options !== undefined) { - var fields = ['sampling','style','sort','yAxisOrientation','barChart']; - util.selectiveDeepExtend(fields, this.options, options); + // order the translated points by depth + var sortDepth = function (a, b) { + return b.dist - a.dist; + }; + this.dataPoints.sort(sortDepth); - util.mergeOptions(this.options, options,'catmullRom'); - util.mergeOptions(this.options, options,'drawPoints'); - util.mergeOptions(this.options, options,'shaded'); + // draw the datapoints as colored circles + var dotSize = this.frame.clientWidth * 0.02; // px + for (i = 0; i < this.dataPoints.length; i++) { + var point = this.dataPoints[i]; - if (options.catmullRom) { - if (typeof options.catmullRom == 'object') { - if (options.catmullRom.parametrization) { - if (options.catmullRom.parametrization == 'uniform') { - this.options.catmullRom.alpha = 0; - } - else if (options.catmullRom.parametrization == 'chordal') { - this.options.catmullRom.alpha = 1.0; - } - else { - this.options.catmullRom.parametrization = 'centripetal'; - this.options.catmullRom.alpha = 0.5; - } - } - } + if (this.style === Graph3d.STYLE.DOTLINE) { + // draw a vertical line from the bottom to the graph value + //var from = this._convert3Dto2D(new Point3d(point.point.x, point.point.y, this.zMin)); + var from = this._convert3Dto2D(point.bottom); + ctx.lineWidth = 1; + ctx.strokeStyle = this.colorGrid; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(point.screen.x, point.screen.y); + ctx.stroke(); } - } - }; - - GraphGroup.prototype.update = function(group) { - this.group = group; - this.content = group.content || 'graph'; - this.className = group.className || this.className || "graphGroup" + this.groupsUsingDefaultStyles[0] % 10; - this.visible = group.visible === undefined ? true : group.visible; - this.setOptions(group.options); - }; - GraphGroup.prototype.drawIcon = function(x, y, JSONcontainer, SVGcontainer, iconWidth, iconHeight) { - var fillHeight = iconHeight * 0.5; - var path, fillPath; + // calculate radius for the circle + var size; + if (this.style === Graph3d.STYLE.DOTSIZE) { + size = dotSize/2 + 2*dotSize * (point.point.value - this.valueMin) / (this.valueMax - this.valueMin); + } + else { + size = dotSize; + } - var outline = DOMutil.getSVGElement("rect", JSONcontainer, SVGcontainer); - outline.setAttributeNS(null, "x", x); - outline.setAttributeNS(null, "y", y - fillHeight); - outline.setAttributeNS(null, "width", iconWidth); - outline.setAttributeNS(null, "height", 2*fillHeight); - outline.setAttributeNS(null, "class", "outline"); + var radius; + if (this.showPerspective) { + radius = size / -point.trans.z; + } + else { + radius = size * -(this.eye.z / this.camera.getArmLength()); + } + if (radius < 0) { + radius = 0; + } - if (this.options.style == 'line') { - path = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); - path.setAttributeNS(null, "class", this.className); - path.setAttributeNS(null, "d", "M" + x + ","+y+" L" + (x + iconWidth) + ","+y+""); - if (this.options.shaded.enabled == true) { - fillPath = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); - if (this.options.shaded.orientation == 'top') { - fillPath.setAttributeNS(null, "d", "M"+x+", " + (y - fillHeight) + - "L"+x+","+y+" L"+ (x + iconWidth) + ","+y+" L"+ (x + iconWidth) + "," + (y - fillHeight)); - } - else { - fillPath.setAttributeNS(null, "d", "M"+x+","+y+" " + - "L"+x+"," + (y + fillHeight) + " " + - "L"+ (x + iconWidth) + "," + (y + fillHeight) + - "L"+ (x + iconWidth) + ","+y); - } - fillPath.setAttributeNS(null, "class", this.className + " iconFill"); + var hue, color, borderColor; + if (this.style === Graph3d.STYLE.DOTCOLOR ) { + // calculate the color based on the value + hue = (1 - (point.point.value - this.valueMin) * this.scale.value) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); + } + else if (this.style === Graph3d.STYLE.DOTSIZE) { + color = this.colorDot; + borderColor = this.colorDotBorder; } - - if (this.options.drawPoints.enabled == true) { - DOMutil.drawPoint(x + 0.5 * iconWidth,y, this, JSONcontainer, SVGcontainer); + else { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + hue = (1 - (point.point.z - this.zMin) * this.scale.z / this.verticalRatio) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); } - } - else { - var barWidth = Math.round(0.3 * iconWidth); - var bar1Height = Math.round(0.4 * iconHeight); - var bar2Height = Math.round(0.75 * iconHeight); - - var offset = Math.round((iconWidth - (2 * barWidth))/3); - DOMutil.drawBar(x + 0.5*barWidth + offset , y + fillHeight - bar1Height - 1, barWidth, bar1Height, this.className + ' bar', JSONcontainer, SVGcontainer); - DOMutil.drawBar(x + 1.5*barWidth + offset + 2, y + fillHeight - bar2Height - 1, barWidth, bar2Height, this.className + ' bar', JSONcontainer, SVGcontainer); + // draw the circle + ctx.lineWidth = 1.0; + ctx.strokeStyle = borderColor; + ctx.fillStyle = color; + ctx.beginPath(); + ctx.arc(point.screen.x, point.screen.y, radius, 0, Math.PI*2, true); + ctx.fill(); + ctx.stroke(); } }; /** - * - * @param iconWidth - * @param iconHeight - * @returns {{icon: HTMLElement, label: (group.content|*|string), orientation: (.options.yAxisOrientation|*)}} + * Draw all datapoints as bars. + * This function can be used when the style is 'bar', 'bar-color', or 'bar-size' */ - GraphGroup.prototype.getLegend = function(iconWidth, iconHeight) { - var svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); - this.drawIcon(0,0.5*iconHeight,[],svg,iconWidth,iconHeight); - return {icon: svg, label: this.content, orientation:this.options.yAxisOrientation}; - } - - module.exports = GraphGroup; + Graph3d.prototype._redrawDataBar = function() { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + var i, j, surface, corners; + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? -/***/ }, -/* 23 */ -/***/ function(module, exports, __webpack_require__) { + // calculate the translations of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; - var util = __webpack_require__(1); - var stack = __webpack_require__(16); - var ItemRange = __webpack_require__(31); + // calculate the distance from the point at the bottom to the camera + var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); + this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; + } - /** - * @constructor Group - * @param {Number | String} groupId - * @param {Object} data - * @param {ItemSet} itemSet - */ - function Group (groupId, data, itemSet) { - this.groupId = groupId; + // order the translated points by depth + var sortDepth = function (a, b) { + return b.dist - a.dist; + }; + this.dataPoints.sort(sortDepth); - this.itemSet = itemSet; + // draw the datapoints as bars + var xWidth = this.xBarWidth / 2; + var yWidth = this.yBarWidth / 2; + for (i = 0; i < this.dataPoints.length; i++) { + var point = this.dataPoints[i]; - this.dom = {}; - this.props = { - label: { - width: 0, - height: 0 + // determine color + var hue, color, borderColor; + if (this.style === Graph3d.STYLE.BARCOLOR ) { + // calculate the color based on the value + hue = (1 - (point.point.value - this.valueMin) * this.scale.value) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); + } + else if (this.style === Graph3d.STYLE.BARSIZE) { + color = this.colorDot; + borderColor = this.colorDotBorder; + } + else { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + hue = (1 - (point.point.z - this.zMin) * this.scale.z / this.verticalRatio) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); } - }; - this.className = null; - this.items = {}; // items filtered by groupId of this group - this.visibleItems = []; // items currently visible in window - this.orderedItems = { // items sorted by start and by end - byStart: [], - byEnd: [] - }; + // calculate size for the bar + if (this.style === Graph3d.STYLE.BARSIZE) { + xWidth = (this.xBarWidth / 2) * ((point.point.value - this.valueMin) / (this.valueMax - this.valueMin) * 0.8 + 0.2); + yWidth = (this.yBarWidth / 2) * ((point.point.value - this.valueMin) / (this.valueMax - this.valueMin) * 0.8 + 0.2); + } - this._create(); + // calculate all corner points + var me = this; + var point3d = point.point; + var top = [ + {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, point3d.z)}, + {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, point3d.z)}, + {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, point3d.z)}, + {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, point3d.z)} + ]; + var bottom = [ + {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, this.zMin)}, + {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, this.zMin)}, + {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, this.zMin)}, + {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, this.zMin)} + ]; - this.setData(data); - } + // calculate screen location of the points + top.forEach(function (obj) { + obj.screen = me._convert3Dto2D(obj.point); + }); + bottom.forEach(function (obj) { + obj.screen = me._convert3Dto2D(obj.point); + }); - /** - * Create DOM elements for the group - * @private - */ - Group.prototype._create = function() { - var label = document.createElement('div'); - label.className = 'vlabel'; - this.dom.label = label; + // create five sides, calculate both corner points and center points + var surfaces = [ + {corners: top, center: Point3d.avg(bottom[0].point, bottom[2].point)}, + {corners: [top[0], top[1], bottom[1], bottom[0]], center: Point3d.avg(bottom[1].point, bottom[0].point)}, + {corners: [top[1], top[2], bottom[2], bottom[1]], center: Point3d.avg(bottom[2].point, bottom[1].point)}, + {corners: [top[2], top[3], bottom[3], bottom[2]], center: Point3d.avg(bottom[3].point, bottom[2].point)}, + {corners: [top[3], top[0], bottom[0], bottom[3]], center: Point3d.avg(bottom[0].point, bottom[3].point)} + ]; + point.surfaces = surfaces; - var inner = document.createElement('div'); - inner.className = 'inner'; - label.appendChild(inner); - this.dom.inner = inner; + // calculate the distance of each of the surface centers to the camera + for (j = 0; j < surfaces.length; j++) { + surface = surfaces[j]; + var transCenter = this._convertPointToTranslation(surface.center); + surface.dist = this.showPerspective ? transCenter.length() : -transCenter.z; + // TODO: this dept calculation doesn't work 100% of the cases due to perspective, + // but the current solution is fast/simple and works in 99.9% of all cases + // the issue is visible in example 14, with graph.setCameraPosition({horizontal: 2.97, vertical: 0.5, distance: 0.9}) + } - var foreground = document.createElement('div'); - foreground.className = 'group'; - foreground['timeline-group'] = this; - this.dom.foreground = foreground; + // order the surfaces by their (translated) depth + surfaces.sort(function (a, b) { + var diff = b.dist - a.dist; + if (diff) return diff; - this.dom.background = document.createElement('div'); - this.dom.background.className = 'group'; + // if equal depth, sort the top surface last + if (a.corners === top) return 1; + if (b.corners === top) return -1; - this.dom.axis = document.createElement('div'); - this.dom.axis.className = 'group'; + // both are equal + return 0; + }); - // create a hidden marker to detect when the Timelines container is attached - // to the DOM, or the style of a parent of the Timeline is changed from - // display:none is changed to visible. - this.dom.marker = document.createElement('div'); - this.dom.marker.style.visibility = 'hidden'; - this.dom.marker.innerHTML = '?'; - this.dom.background.appendChild(this.dom.marker); + // draw the ordered surfaces + ctx.lineWidth = 1; + ctx.strokeStyle = borderColor; + ctx.fillStyle = color; + // NOTE: we start at j=2 instead of j=0 as we don't need to draw the two surfaces at the backside + for (j = 2; j < surfaces.length; j++) { + surface = surfaces[j]; + corners = surface.corners; + ctx.beginPath(); + ctx.moveTo(corners[3].screen.x, corners[3].screen.y); + ctx.lineTo(corners[0].screen.x, corners[0].screen.y); + ctx.lineTo(corners[1].screen.x, corners[1].screen.y); + ctx.lineTo(corners[2].screen.x, corners[2].screen.y); + ctx.lineTo(corners[3].screen.x, corners[3].screen.y); + ctx.fill(); + ctx.stroke(); + } + } }; + /** - * Set the group data for this group - * @param {Object} data Group data, can contain properties content and className + * Draw a line through all datapoints. + * This function can be used when the style is 'line' */ - Group.prototype.setData = function(data) { - // update contents - var content = data && data.content; - if (content instanceof Element) { - this.dom.inner.appendChild(content); - } - else if (content !== undefined && content !== null) { - this.dom.inner.innerHTML = content; - } - else { - this.dom.inner.innerHTML = this.groupId || ''; // groupId can be null + Graph3d.prototype._redrawDataLine = function() { + var canvas = this.frame.canvas, + ctx = canvas.getContext('2d'), + point, i; + + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? + + // calculate the translations of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); + + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; } - // update title - this.dom.label.title = data && data.title || ''; + // start the line + if (this.dataPoints.length > 0) { + point = this.dataPoints[0]; - if (!this.dom.inner.firstChild) { - util.addClassName(this.dom.inner, 'hidden'); + ctx.lineWidth = 1; // TODO: make customizable + ctx.strokeStyle = 'blue'; // TODO: make customizable + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); } - else { - util.removeClassName(this.dom.inner, 'hidden'); + + // draw the datapoints as colored circles + for (i = 1; i < this.dataPoints.length; i++) { + point = this.dataPoints[i]; + ctx.lineTo(point.screen.x, point.screen.y); } - // update className - var className = data && data.className || null; - if (className != this.className) { - if (this.className) { - util.removeClassName(this.dom.label, className); - util.removeClassName(this.dom.foreground, className); - util.removeClassName(this.dom.background, className); - util.removeClassName(this.dom.axis, className); - } - util.addClassName(this.dom.label, className); - util.addClassName(this.dom.foreground, className); - util.addClassName(this.dom.background, className); - util.addClassName(this.dom.axis, className); + // finish the line + if (this.dataPoints.length > 0) { + ctx.stroke(); } }; /** - * Get the width of the group label - * @return {number} width + * Start a moving operation inside the provided parent element + * @param {Event} event The event that occurred (required for + * retrieving the mouse position) */ - Group.prototype.getLabelWidth = function() { - return this.props.label.width; + Graph3d.prototype._onMouseDown = function(event) { + event = event || window.event; + + // check if mouse is still down (may be up when focus is lost for example + // in an iframe) + if (this.leftButtonDown) { + this._onMouseUp(event); + } + + // only react on left mouse button down + this.leftButtonDown = event.which ? (event.which === 1) : (event.button === 1); + if (!this.leftButtonDown && !this.touchDown) return; + + // get mouse position (different code for IE and all other browsers) + this.startMouseX = getMouseX(event); + this.startMouseY = getMouseY(event); + + this.startStart = new Date(this.start); + this.startEnd = new Date(this.end); + this.startArmRotation = this.camera.getArmRotation(); + + this.frame.style.cursor = 'move'; + + // add event listeners to handle moving the contents + // we store the function onmousemove and onmouseup in the graph, so we can + // remove the eventlisteners lateron in the function mouseUp() + var me = this; + this.onmousemove = function (event) {me._onMouseMove(event);}; + this.onmouseup = function (event) {me._onMouseUp(event);}; + util.addEventListener(document, 'mousemove', me.onmousemove); + util.addEventListener(document, 'mouseup', me.onmouseup); + util.preventDefault(event); }; /** - * Repaint this group - * @param {{start: number, end: number}} range - * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin - * @param {boolean} [restack=false] Force restacking of all items - * @return {boolean} Returns true if the group is resized + * Perform moving operating. + * This function activated from within the funcion Graph.mouseDown(). + * @param {Event} event Well, eehh, the event */ - Group.prototype.redraw = function(range, margin, restack) { - var resized = false; - - this.visibleItems = this._updateVisibleItems(this.orderedItems, this.visibleItems, range); + Graph3d.prototype._onMouseMove = function (event) { + event = event || window.event; - // force recalculation of the height of the items when the marker height changed - // (due to the Timeline being attached to the DOM or changed from display:none to visible) - var markerHeight = this.dom.marker.clientHeight; - if (markerHeight != this.lastMarkerHeight) { - this.lastMarkerHeight = markerHeight; + // calculate change in mouse position + var diffX = parseFloat(getMouseX(event)) - this.startMouseX; + var diffY = parseFloat(getMouseY(event)) - this.startMouseY; - util.forEach(this.items, function (item) { - item.dirty = true; - if (item.displayed) item.redraw(); - }); + var horizontalNew = this.startArmRotation.horizontal + diffX / 200; + var verticalNew = this.startArmRotation.vertical + diffY / 200; - restack = true; - } + var snapAngle = 4; // degrees + var snapValue = Math.sin(snapAngle / 360 * 2 * Math.PI); - // reposition visible items vertically - if (this.itemSet.options.stack) { // TODO: ugly way to access options... - stack.stack(this.visibleItems, margin, restack); + // snap horizontally to nice angles at 0pi, 0.5pi, 1pi, 1.5pi, etc... + // the -0.001 is to take care that the vertical axis is always drawn at the left front corner + if (Math.abs(Math.sin(horizontalNew)) < snapValue) { + horizontalNew = Math.round((horizontalNew / Math.PI)) * Math.PI - 0.001; } - else { // no stacking - stack.nostack(this.visibleItems, margin); + if (Math.abs(Math.cos(horizontalNew)) < snapValue) { + horizontalNew = (Math.round((horizontalNew/ Math.PI - 0.5)) + 0.5) * Math.PI - 0.001; } - // recalculate the height of the group - var height; - var visibleItems = this.visibleItems; - if (visibleItems.length) { - var min = visibleItems[0].top; - var max = visibleItems[0].top + visibleItems[0].height; - util.forEach(visibleItems, function (item) { - min = Math.min(min, item.top); - max = Math.max(max, (item.top + item.height)); - }); - if (min > margin.axis) { - // there is an empty gap between the lowest item and the axis - var offset = min - margin.axis; - max -= offset; - util.forEach(visibleItems, function (item) { - item.top -= offset; - }); - } - height = max + margin.item.vertical / 2; + // snap vertically to nice angles + if (Math.abs(Math.sin(verticalNew)) < snapValue) { + verticalNew = Math.round((verticalNew / Math.PI)) * Math.PI; } - else { - height = margin.axis + margin.item.vertical; + if (Math.abs(Math.cos(verticalNew)) < snapValue) { + verticalNew = (Math.round((verticalNew/ Math.PI - 0.5)) + 0.5) * Math.PI; } - height = Math.max(height, this.props.label.height); - // calculate actual size and position - var foreground = this.dom.foreground; - this.top = foreground.offsetTop; - this.left = foreground.offsetLeft; - this.width = foreground.offsetWidth; - resized = util.updateProperty(this, 'height', height) || resized; + this.camera.setArmRotation(horizontalNew, verticalNew); + this.redraw(); - // recalculate size of label - resized = util.updateProperty(this.props.label, 'width', this.dom.inner.clientWidth) || resized; - resized = util.updateProperty(this.props.label, 'height', this.dom.inner.clientHeight) || resized; + // fire a cameraPositionChange event + var parameters = this.getCameraPosition(); + this.emit('cameraPositionChange', parameters); - // apply new height - this.dom.background.style.height = height + 'px'; - this.dom.foreground.style.height = height + 'px'; - this.dom.label.style.height = height + 'px'; + util.preventDefault(event); + }; - // update vertical position of items after they are re-stacked and the height of the group is calculated - for (var i = 0, ii = this.visibleItems.length; i < ii; i++) { - var item = this.visibleItems[i]; - item.repositionY(); - } - return resized; + /** + * Stop moving operating. + * This function activated from within the funcion Graph.mouseDown(). + * @param {event} event The event + */ + Graph3d.prototype._onMouseUp = function (event) { + this.frame.style.cursor = 'auto'; + this.leftButtonDown = false; + + // remove event listeners here + util.removeEventListener(document, 'mousemove', this.onmousemove); + util.removeEventListener(document, 'mouseup', this.onmouseup); + util.preventDefault(event); }; /** - * Show this group: attach to the DOM + * After having moved the mouse, a tooltip should pop up when the mouse is resting on a data point + * @param {Event} event A mouse move event */ - Group.prototype.show = function() { - if (!this.dom.label.parentNode) { - this.itemSet.dom.labelSet.appendChild(this.dom.label); + Graph3d.prototype._onTooltip = function (event) { + var delay = 300; // ms + var mouseX = getMouseX(event) - util.getAbsoluteLeft(this.frame); + var mouseY = getMouseY(event) - util.getAbsoluteTop(this.frame); + + if (!this.showTooltip) { + return; } - if (!this.dom.foreground.parentNode) { - this.itemSet.dom.foreground.appendChild(this.dom.foreground); + if (this.tooltipTimeout) { + clearTimeout(this.tooltipTimeout); } - if (!this.dom.background.parentNode) { - this.itemSet.dom.background.appendChild(this.dom.background); + // (delayed) display of a tooltip only if no mouse button is down + if (this.leftButtonDown) { + this._hideTooltip(); + return; } - if (!this.dom.axis.parentNode) { - this.itemSet.dom.axis.appendChild(this.dom.axis); + if (this.tooltip && this.tooltip.dataPoint) { + // tooltip is currently visible + var dataPoint = this._dataPointFromXY(mouseX, mouseY); + if (dataPoint !== this.tooltip.dataPoint) { + // datapoint changed + if (dataPoint) { + this._showTooltip(dataPoint); + } + else { + this._hideTooltip(); + } + } + } + else { + // tooltip is currently not visible + var me = this; + this.tooltipTimeout = setTimeout(function () { + me.tooltipTimeout = null; + + // show a tooltip if we have a data point + var dataPoint = me._dataPointFromXY(mouseX, mouseY); + if (dataPoint) { + me._showTooltip(dataPoint); + } + }, delay); } }; /** - * Hide this group: remove from the DOM + * Event handler for touchstart event on mobile devices */ - Group.prototype.hide = function() { - var label = this.dom.label; - if (label.parentNode) { - label.parentNode.removeChild(label); - } - - var foreground = this.dom.foreground; - if (foreground.parentNode) { - foreground.parentNode.removeChild(foreground); - } + Graph3d.prototype._onTouchStart = function(event) { + this.touchDown = true; - var background = this.dom.background; - if (background.parentNode) { - background.parentNode.removeChild(background); - } + var me = this; + this.ontouchmove = function (event) {me._onTouchMove(event);}; + this.ontouchend = function (event) {me._onTouchEnd(event);}; + util.addEventListener(document, 'touchmove', me.ontouchmove); + util.addEventListener(document, 'touchend', me.ontouchend); - var axis = this.dom.axis; - if (axis.parentNode) { - axis.parentNode.removeChild(axis); - } + this._onMouseDown(event); }; /** - * Add an item to the group - * @param {Item} item + * Event handler for touchmove event on mobile devices */ - Group.prototype.add = function(item) { - this.items[item.id] = item; - item.setParent(this); - - if (this.visibleItems.indexOf(item) == -1) { - var range = this.itemSet.body.range; // TODO: not nice accessing the range like this - this._checkIfVisible(item, this.visibleItems, range); - } + Graph3d.prototype._onTouchMove = function(event) { + this._onMouseMove(event); }; /** - * Remove an item from the group - * @param {Item} item + * Event handler for touchend event on mobile devices */ - Group.prototype.remove = function(item) { - delete this.items[item.id]; - item.setParent(this.itemSet); + Graph3d.prototype._onTouchEnd = function(event) { + this.touchDown = false; - // remove from visible items - var index = this.visibleItems.indexOf(item); - if (index != -1) this.visibleItems.splice(index, 1); + util.removeEventListener(document, 'touchmove', this.ontouchmove); + util.removeEventListener(document, 'touchend', this.ontouchend); - // TODO: also remove from ordered items? + this._onMouseUp(event); }; + /** - * Remove an item from the corresponding DataSet - * @param {Item} item + * Event handler for mouse wheel event, used to zoom the graph + * Code from http://adomas.org/javascript-mouse-wheel/ + * @param {event} event The event */ - Group.prototype.removeFromDataSet = function(item) { - this.itemSet.removeItem(item.id); + Graph3d.prototype._onWheel = function(event) { + if (!event) /* For IE. */ + event = window.event; + + // retrieve delta + var delta = 0; + if (event.wheelDelta) { /* IE/Opera. */ + delta = event.wheelDelta/120; + } else if (event.detail) { /* Mozilla case. */ + // In Mozilla, sign of delta is different than in IE. + // Also, delta is multiple of 3. + delta = -event.detail/3; + } + + // If delta is nonzero, handle it. + // Basically, delta is now positive if wheel was scrolled up, + // and negative, if wheel was scrolled down. + if (delta) { + var oldLength = this.camera.getArmLength(); + var newLength = oldLength * (1 - delta / 10); + + this.camera.setArmLength(newLength); + this.redraw(); + + this._hideTooltip(); + } + + // fire a cameraPositionChange event + var parameters = this.getCameraPosition(); + this.emit('cameraPositionChange', parameters); + + // Prevent default actions caused by mouse wheel. + // That might be ugly, but we handle scrolls somehow + // anyway, so don't bother here.. + util.preventDefault(event); }; /** - * Reorder the items + * Test whether a point lies inside given 2D triangle + * @param {Point2d} point + * @param {Point2d[]} triangle + * @return {boolean} Returns true if given point lies inside or on the edge of the triangle + * @private */ - Group.prototype.order = function() { - var array = util.toArray(this.items); - this.orderedItems.byStart = array; - this.orderedItems.byEnd = this._constructByEndArray(array); + Graph3d.prototype._insideTriangle = function (point, triangle) { + var a = triangle[0], + b = triangle[1], + c = triangle[2]; - stack.orderByStart(this.orderedItems.byStart); - stack.orderByEnd(this.orderedItems.byEnd); + function sign (x) { + return x > 0 ? 1 : x < 0 ? -1 : 0; + } + + var as = sign((b.x - a.x) * (point.y - a.y) - (b.y - a.y) * (point.x - a.x)); + var bs = sign((c.x - b.x) * (point.y - b.y) - (c.y - b.y) * (point.x - b.x)); + var cs = sign((a.x - c.x) * (point.y - c.y) - (a.y - c.y) * (point.x - c.x)); + + // each of the three signs must be either equal to each other or zero + return (as == 0 || bs == 0 || as == bs) && + (bs == 0 || cs == 0 || bs == cs) && + (as == 0 || cs == 0 || as == cs); }; /** - * Create an array containing all items being a range (having an end date) - * @param {Item[]} array - * @returns {ItemRange[]} + * Find a data point close to given screen position (x, y) + * @param {Number} x + * @param {Number} y + * @return {Object | null} The closest data point or null if not close to any data point * @private */ - Group.prototype._constructByEndArray = function(array) { - var endArray = []; + Graph3d.prototype._dataPointFromXY = function (x, y) { + var i, + distMax = 100, // px + dataPoint = null, + closestDataPoint = null, + closestDist = null, + center = new Point2d(x, y); - for (var i = 0; i < array.length; i++) { - if (array[i] instanceof ItemRange) { - endArray.push(array[i]); + if (this.style === Graph3d.STYLE.BAR || + this.style === Graph3d.STYLE.BARCOLOR || + this.style === Graph3d.STYLE.BARSIZE) { + // the data points are ordered from far away to closest + for (i = this.dataPoints.length - 1; i >= 0; i--) { + dataPoint = this.dataPoints[i]; + var surfaces = dataPoint.surfaces; + if (surfaces) { + for (var s = surfaces.length - 1; s >= 0; s--) { + // split each surface in two triangles, and see if the center point is inside one of these + var surface = surfaces[s]; + var corners = surface.corners; + var triangle1 = [corners[0].screen, corners[1].screen, corners[2].screen]; + var triangle2 = [corners[2].screen, corners[3].screen, corners[0].screen]; + if (this._insideTriangle(center, triangle1) || + this._insideTriangle(center, triangle2)) { + // return immediately at the first hit + return dataPoint; + } + } + } } } - return endArray; + else { + // find the closest data point, using distance to the center of the point on 2d screen + for (i = 0; i < this.dataPoints.length; i++) { + dataPoint = this.dataPoints[i]; + var point = dataPoint.screen; + if (point) { + var distX = Math.abs(x - point.x); + var distY = Math.abs(y - point.y); + var dist = Math.sqrt(distX * distX + distY * distY); + + if ((closestDist === null || dist < closestDist) && dist < distMax) { + closestDist = dist; + closestDataPoint = dataPoint; + } + } + } + } + + + return closestDataPoint; }; /** - * Update the visible items - * @param {{byStart: Item[], byEnd: Item[]}} orderedItems All items ordered by start date and by end date - * @param {Item[]} visibleItems The previously visible items. - * @param {{start: number, end: number}} range Visible range - * @return {Item[]} visibleItems The new visible items. + * Display a tooltip for given data point + * @param {Object} dataPoint * @private */ - Group.prototype._updateVisibleItems = function(orderedItems, visibleItems, range) { - var initialPosByStart, - newVisibleItems = [], - i; + Graph3d.prototype._showTooltip = function (dataPoint) { + var content, line, dot; - // first check if the items that were in view previously are still in view. - // this handles the case for the ItemRange that is both before and after the current one. - if (visibleItems.length > 0) { - for (i = 0; i < visibleItems.length; i++) { - this._checkIfVisible(visibleItems[i], newVisibleItems, range); - } - } + if (!this.tooltip) { + content = document.createElement('div'); + content.style.position = 'absolute'; + content.style.padding = '10px'; + content.style.border = '1px solid #4d4d4d'; + content.style.color = '#1a1a1a'; + content.style.background = 'rgba(255,255,255,0.7)'; + content.style.borderRadius = '2px'; + content.style.boxShadow = '5px 5px 10px rgba(128,128,128,0.5)'; - // If there were no visible items previously, use binarySearch to find a visible ItemPoint or ItemRange (based on startTime) - if (newVisibleItems.length == 0) { - initialPosByStart = util.binarySearch(orderedItems.byStart, range, 'data','start'); + line = document.createElement('div'); + line.style.position = 'absolute'; + line.style.height = '40px'; + line.style.width = '0'; + line.style.borderLeft = '1px solid #4d4d4d'; + + dot = document.createElement('div'); + dot.style.position = 'absolute'; + dot.style.height = '0'; + dot.style.width = '0'; + dot.style.border = '5px solid #4d4d4d'; + dot.style.borderRadius = '5px'; + + this.tooltip = { + dataPoint: null, + dom: { + content: content, + line: line, + dot: dot + } + }; } else { - initialPosByStart = orderedItems.byStart.indexOf(newVisibleItems[0]); + content = this.tooltip.dom.content; + line = this.tooltip.dom.line; + dot = this.tooltip.dom.dot; } - // use visible search to find a visible ItemRange (only based on endTime) - var initialPosByEnd = util.binarySearch(orderedItems.byEnd, range, 'data','end'); + this._hideTooltip(); - // if we found a initial ID to use, trace it up and down until we meet an invisible item. - if (initialPosByStart != -1) { - for (i = initialPosByStart; i >= 0; i--) { - if (this._checkIfInvisible(orderedItems.byStart[i], newVisibleItems, range)) {break;} - } - for (i = initialPosByStart + 1; i < orderedItems.byStart.length; i++) { - if (this._checkIfInvisible(orderedItems.byStart[i], newVisibleItems, range)) {break;} - } + this.tooltip.dataPoint = dataPoint; + if (typeof this.showTooltip === 'function') { + content.innerHTML = this.showTooltip(dataPoint.point); + } + else { + content.innerHTML = '' + + '' + + '' + + '' + + '
x:' + dataPoint.point.x + '
y:' + dataPoint.point.y + '
z:' + dataPoint.point.z + '
'; } - // if we found a initial ID to use, trace it up and down until we meet an invisible item. - if (initialPosByEnd != -1) { - for (i = initialPosByEnd; i >= 0; i--) { - if (this._checkIfInvisible(orderedItems.byEnd[i], newVisibleItems, range)) {break;} - } - for (i = initialPosByEnd + 1; i < orderedItems.byEnd.length; i++) { - if (this._checkIfInvisible(orderedItems.byEnd[i], newVisibleItems, range)) {break;} + content.style.left = '0'; + content.style.top = '0'; + this.frame.appendChild(content); + this.frame.appendChild(line); + this.frame.appendChild(dot); + + // calculate sizes + var contentWidth = content.offsetWidth; + var contentHeight = content.offsetHeight; + var lineHeight = line.offsetHeight; + var dotWidth = dot.offsetWidth; + var dotHeight = dot.offsetHeight; + + var left = dataPoint.screen.x - contentWidth / 2; + left = Math.min(Math.max(left, 10), this.frame.clientWidth - 10 - contentWidth); + + line.style.left = dataPoint.screen.x + 'px'; + line.style.top = (dataPoint.screen.y - lineHeight) + 'px'; + content.style.left = left + 'px'; + content.style.top = (dataPoint.screen.y - lineHeight - contentHeight) + 'px'; + dot.style.left = (dataPoint.screen.x - dotWidth / 2) + 'px'; + dot.style.top = (dataPoint.screen.y - dotHeight / 2) + 'px'; + }; + + /** + * Hide the tooltip when displayed + * @private + */ + Graph3d.prototype._hideTooltip = function () { + if (this.tooltip) { + this.tooltip.dataPoint = null; + + for (var prop in this.tooltip.dom) { + if (this.tooltip.dom.hasOwnProperty(prop)) { + var elem = this.tooltip.dom[prop]; + if (elem && elem.parentNode) { + elem.parentNode.removeChild(elem); + } + } } } - - return newVisibleItems; }; + /**--------------------------------------------------------------------------**/ /** - * this function checks if an item is invisible. If it is NOT we make it visible - * and add it to the global visible items. If it is, return true. - * - * @param {Item} item - * @param {Item[]} visibleItems - * @param {{start:number, end:number}} range - * @returns {boolean} - * @private + * Get the horizontal mouse position from a mouse event + * @param {Event} event + * @return {Number} mouse x */ - Group.prototype._checkIfInvisible = function(item, visibleItems, range) { - if (item.isVisible(range)) { - if (!item.displayed) item.show(); - item.repositionX(); - if (visibleItems.indexOf(item) == -1) { - visibleItems.push(item); - } - return false; - } - else { - if (item.displayed) item.hide(); - return true; - } + getMouseX = function(event) { + if ('clientX' in event) return event.clientX; + return event.targetTouches[0] && event.targetTouches[0].clientX || 0; }; /** - * this function is very similar to the _checkIfInvisible() but it does not - * return booleans, hides the item if it should not be seen and always adds to - * the visibleItems. - * this one is for brute forcing and hiding. - * - * @param {Item} item - * @param {Array} visibleItems - * @param {{start:number, end:number}} range - * @private + * Get the vertical mouse position from a mouse event + * @param {Event} event + * @return {Number} mouse y */ - Group.prototype._checkIfVisible = function(item, visibleItems, range) { - if (item.isVisible(range)) { - if (!item.displayed) item.show(); - // reposition item horizontally - item.repositionX(); - visibleItems.push(item); - } - else { - if (item.displayed) item.hide(); - } + getMouseY = function(event) { + if ('clientY' in event) return event.clientY; + return event.targetTouches[0] && event.targetTouches[0].clientY || 0; }; - module.exports = Group; + module.exports = Graph3d; /***/ }, -/* 24 */ +/* 10 */ /***/ function(module, exports, __webpack_require__) { - var Hammer = __webpack_require__(41); - var util = __webpack_require__(1); - var DataSet = __webpack_require__(3); - var DataView = __webpack_require__(4); - var Component = __webpack_require__(18); - var Group = __webpack_require__(23); - var ItemBox = __webpack_require__(29); - var ItemPoint = __webpack_require__(30); - var ItemRange = __webpack_require__(31); - - - var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items - + /** - * An ItemSet holds a set of items and ranges which can be displayed in a - * range. The width is determined by the parent of the ItemSet, and the height - * is determined by the size of the items. - * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body - * @param {Object} [options] See ItemSet.setOptions for the available options. - * @constructor ItemSet - * @extends Component + * Expose `Emitter`. */ - function ItemSet(body, options) { - this.body = body; - this.defaultOptions = { - type: null, // 'box', 'point', 'range' - orientation: 'bottom', // 'top' or 'bottom' - align: 'center', // alignment of box items - stack: true, - groupOrder: null, + module.exports = Emitter; - selectable: true, - editable: { - updateTime: false, - updateGroup: false, - add: false, - remove: false - }, + /** + * Initialize a new `Emitter`. + * + * @api public + */ - onAdd: function (item, callback) { - callback(item); - }, - onUpdate: function (item, callback) { - callback(item); - }, - onMove: function (item, callback) { - callback(item); - }, - onRemove: function (item, callback) { - callback(item); - }, + function Emitter(obj) { + if (obj) return mixin(obj); + }; - margin: { - item: { - horizontal: 10, - vertical: 10 - }, - axis: 20 - }, - padding: 5 - }; + /** + * Mixin the emitter properties. + * + * @param {Object} obj + * @return {Object} + * @api private + */ - // options is shared by this ItemSet and all its items - this.options = util.extend({}, this.defaultOptions); + function mixin(obj) { + for (var key in Emitter.prototype) { + obj[key] = Emitter.prototype[key]; + } + return obj; + } - // options for getting items from the DataSet with the correct type - this.itemOptions = { - type: {start: 'Date', end: 'Date'} - }; + /** + * Listen on the given `event` with `fn`. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ - this.conversion = { - toScreen: body.util.toScreen, - toTime: body.util.toTime - }; - this.dom = {}; - this.props = {}; - this.hammer = null; + Emitter.prototype.on = + Emitter.prototype.addEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + (this._callbacks[event] = this._callbacks[event] || []) + .push(fn); + return this; + }; - var me = this; - this.itemsData = null; // DataSet - this.groupsData = null; // DataSet + /** + * Adds an `event` listener that will be invoked a single + * time then automatically removed. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ - // listeners for the DataSet of the items - this.itemListeners = { - 'add': function (event, params, senderId) { - me._onAdd(params.items); - }, - 'update': function (event, params, senderId) { - me._onUpdate(params.items); - }, - 'remove': function (event, params, senderId) { - me._onRemove(params.items); - } - }; + Emitter.prototype.once = function(event, fn){ + var self = this; + this._callbacks = this._callbacks || {}; - // listeners for the DataSet of the groups - this.groupListeners = { - 'add': function (event, params, senderId) { - me._onAddGroups(params.items); - }, - 'update': function (event, params, senderId) { - me._onUpdateGroups(params.items); - }, - 'remove': function (event, params, senderId) { - me._onRemoveGroups(params.items); - } - }; + function on() { + self.off(event, on); + fn.apply(this, arguments); + } - this.items = {}; // object with an Item for every data item - this.groups = {}; // Group object for every group - this.groupIds = []; + on.fn = fn; + this.on(event, on); + return this; + }; - this.selection = []; // list with the ids of all selected nodes - this.stackDirty = true; // if true, all items will be restacked on next redraw + /** + * Remove the given callback for `event` or all + * registered callbacks. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ - this.touchParams = {}; // stores properties while dragging - // create the HTML DOM + Emitter.prototype.off = + Emitter.prototype.removeListener = + Emitter.prototype.removeAllListeners = + Emitter.prototype.removeEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; - this._create(); + // all + if (0 == arguments.length) { + this._callbacks = {}; + return this; + } - this.setOptions(options); - } + // specific event + var callbacks = this._callbacks[event]; + if (!callbacks) return this; - ItemSet.prototype = new Component(); + // remove all handlers + if (1 == arguments.length) { + delete this._callbacks[event]; + return this; + } - // available item types will be registered here - ItemSet.types = { - box: ItemBox, - range: ItemRange, - point: ItemPoint + // remove specific handler + var cb; + for (var i = 0; i < callbacks.length; i++) { + cb = callbacks[i]; + if (cb === fn || cb.fn === fn) { + callbacks.splice(i, 1); + break; + } + } + return this; }; /** - * Create the HTML DOM for the ItemSet + * Emit `event` with the given args. + * + * @param {String} event + * @param {Mixed} ... + * @return {Emitter} */ - ItemSet.prototype._create = function(){ - var frame = document.createElement('div'); - frame.className = 'itemset'; - frame['timeline-itemset'] = this; - this.dom.frame = frame; - // create background panel - var background = document.createElement('div'); - background.className = 'background'; - frame.appendChild(background); - this.dom.background = background; + Emitter.prototype.emit = function(event){ + this._callbacks = this._callbacks || {}; + var args = [].slice.call(arguments, 1) + , callbacks = this._callbacks[event]; - // create foreground panel - var foreground = document.createElement('div'); - foreground.className = 'foreground'; - frame.appendChild(foreground); - this.dom.foreground = foreground; + if (callbacks) { + callbacks = callbacks.slice(0); + for (var i = 0, len = callbacks.length; i < len; ++i) { + callbacks[i].apply(this, args); + } + } - // create axis panel - var axis = document.createElement('div'); - axis.className = 'axis'; - this.dom.axis = axis; + return this; + }; - // create labelset - var labelSet = document.createElement('div'); - labelSet.className = 'labelset'; - this.dom.labelSet = labelSet; + /** + * Return array of callbacks for `event`. + * + * @param {String} event + * @return {Array} + * @api public + */ - // create ungrouped Group - this._updateUngrouped(); + Emitter.prototype.listeners = function(event){ + this._callbacks = this._callbacks || {}; + return this._callbacks[event] || []; + }; - // attach event listeners - // Note: we bind to the centerContainer for the case where the height - // of the center container is larger than of the ItemSet, so we - // can click in the empty area to create a new item or deselect an item. - this.hammer = Hammer(this.body.dom.centerContainer, { - prevent_default: true - }); + /** + * Check if this emitter has `event` handlers. + * + * @param {String} event + * @return {Boolean} + * @api public + */ - // drag items when selected - this.hammer.on('touch', this._onTouch.bind(this)); - this.hammer.on('dragstart', this._onDragStart.bind(this)); - this.hammer.on('drag', this._onDrag.bind(this)); - this.hammer.on('dragend', this._onDragEnd.bind(this)); + Emitter.prototype.hasListeners = function(event){ + return !! this.listeners(event).length; + }; - // single select (or unselect) when tapping an item - this.hammer.on('tap', this._onSelectItem.bind(this)); - // multi select when holding mouse/touch, or on ctrl+click - this.hammer.on('hold', this._onMultiSelectItem.bind(this)); +/***/ }, +/* 11 */ +/***/ function(module, exports, __webpack_require__) { - // add item on doubletap - this.hammer.on('doubletap', this._onAddItem.bind(this)); + /** + * @prototype Point3d + * @param {Number} [x] + * @param {Number} [y] + * @param {Number} [z] + */ + function Point3d(x, y, z) { + this.x = x !== undefined ? x : 0; + this.y = y !== undefined ? y : 0; + this.z = z !== undefined ? z : 0; + }; - // attach to the DOM - this.show(); + /** + * Subtract the two provided points, returns a-b + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} a-b + */ + Point3d.subtract = function(a, b) { + var sub = new Point3d(); + sub.x = a.x - b.x; + sub.y = a.y - b.y; + sub.z = a.z - b.z; + return sub; }; /** - * Set options for the ItemSet. Existing options will be extended/overwritten. - * @param {Object} [options] The following options are available: - * {String} type - * Default type for the items. Choose from 'box' - * (default), 'point', or 'range'. The default - * Style can be overwritten by individual items. - * {String} align - * Alignment for the items, only applicable for - * ItemBox. Choose 'center' (default), 'left', or - * 'right'. - * {String} orientation - * Orientation of the item set. Choose 'top' or - * 'bottom' (default). - * {Function} groupOrder - * A sorting function for ordering groups - * {Boolean} stack - * If true (deafult), items will be stacked on - * top of each other. - * {Number} margin.axis - * Margin between the axis and the items in pixels. - * Default is 20. - * {Number} margin.item.horizontal - * Horizontal margin between items in pixels. - * Default is 10. - * {Number} margin.item.vertical - * Vertical Margin between items in pixels. - * Default is 10. - * {Number} margin.item - * Margin between items in pixels in both horizontal - * and vertical direction. Default is 10. - * {Number} margin - * Set margin for both axis and items in pixels. - * {Number} padding - * Padding of the contents of an item in pixels. - * Must correspond with the items css. Default is 5. - * {Boolean} selectable - * If true (default), items can be selected. - * {Boolean} editable - * Set all editable options to true or false - * {Boolean} editable.updateTime - * Allow dragging an item to an other moment in time - * {Boolean} editable.updateGroup - * Allow dragging an item to an other group - * {Boolean} editable.add - * Allow creating new items on double tap - * {Boolean} editable.remove - * Allow removing items by clicking the delete button - * top right of a selected item. - * {Function(item: Item, callback: Function)} onAdd - * Callback function triggered when an item is about to be added: - * when the user double taps an empty space in the Timeline. - * {Function(item: Item, callback: Function)} onUpdate - * Callback function fired when an item is about to be updated. - * This function typically has to show a dialog where the user - * change the item. If not implemented, nothing happens. - * {Function(item: Item, callback: Function)} onMove - * Fired when an item has been moved. If not implemented, - * the move action will be accepted. - * {Function(item: Item, callback: Function)} onRemove - * Fired when an item is about to be deleted. - * If not implemented, the item will be always removed. + * Add the two provided points, returns a+b + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} a+b */ - ItemSet.prototype.setOptions = function(options) { - if (options) { - // copy all options that we know - var fields = ['type', 'align', 'orientation', 'padding', 'stack', 'selectable', 'groupOrder']; - util.selectiveExtend(fields, this.options, options); + Point3d.add = function(a, b) { + var sum = new Point3d(); + sum.x = a.x + b.x; + sum.y = a.y + b.y; + sum.z = a.z + b.z; + return sum; + }; - if ('margin' in options) { - if (typeof options.margin === 'number') { - this.options.margin.axis = options.margin; - this.options.margin.item.horizontal = options.margin; - this.options.margin.item.vertical = options.margin; - } - else if (typeof options.margin === 'object') { - util.selectiveExtend(['axis'], this.options.margin, options.margin); - if ('item' in options.margin) { - if (typeof options.margin.item === 'number') { - this.options.margin.item.horizontal = options.margin.item; - this.options.margin.item.vertical = options.margin.item; - } - else if (typeof options.margin.item === 'object') { - util.selectiveExtend(['horizontal', 'vertical'], this.options.margin.item, options.margin.item); - } - } - } - } + /** + * Calculate the average of two 3d points + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} The average, (a+b)/2 + */ + Point3d.avg = function(a, b) { + return new Point3d( + (a.x + b.x) / 2, + (a.y + b.y) / 2, + (a.z + b.z) / 2 + ); + }; - if ('editable' in options) { - if (typeof options.editable === 'boolean') { - this.options.editable.updateTime = options.editable; - this.options.editable.updateGroup = options.editable; - this.options.editable.add = options.editable; - this.options.editable.remove = options.editable; - } - else if (typeof options.editable === 'object') { - util.selectiveExtend(['updateTime', 'updateGroup', 'add', 'remove'], this.options.editable, options.editable); - } - } + /** + * Calculate the cross product of the two provided points, returns axb + * Documentation: http://en.wikipedia.org/wiki/Cross_product + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} cross product axb + */ + Point3d.crossProduct = function(a, b) { + var crossproduct = new Point3d(); - // callback functions - var addCallback = (function (name) { - if (name in options) { - var fn = options[name]; - if (!(fn instanceof Function)) { - throw new Error('option ' + name + ' must be a function ' + name + '(item, callback)'); - } - this.options[name] = fn; - } - }).bind(this); - ['onAdd', 'onUpdate', 'onRemove', 'onMove'].forEach(addCallback); + crossproduct.x = a.y * b.z - a.z * b.y; + crossproduct.y = a.z * b.x - a.x * b.z; + crossproduct.z = a.x * b.y - a.y * b.x; - // force the itemSet to refresh: options like orientation and margins may be changed - this.markDirty(); - } + return crossproduct; }; + /** - * Mark the ItemSet dirty so it will refresh everything with next redraw + * Rtrieve the length of the vector (or the distance from this point to the origin + * @return {Number} length */ - ItemSet.prototype.markDirty = function() { - this.groupIds = []; - this.stackDirty = true; + Point3d.prototype.length = function() { + return Math.sqrt( + this.x * this.x + + this.y * this.y + + this.z * this.z + ); }; + module.exports = Point3d; + + +/***/ }, +/* 12 */ +/***/ function(module, exports, __webpack_require__) { + /** - * Destroy the ItemSet + * @prototype Point2d + * @param {Number} [x] + * @param {Number} [y] */ - ItemSet.prototype.destroy = function() { - this.hide(); - this.setItems(null); - this.setGroups(null); + Point2d = function (x, y) { + this.x = x !== undefined ? x : 0; + this.y = y !== undefined ? y : 0; + }; - this.hammer = null; + module.exports = Point2d; - this.body = null; - this.conversion = null; + +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { + + var Point3d = __webpack_require__(11); + + /** + * @class Camera + * The camera is mounted on a (virtual) camera arm. The camera arm can rotate + * The camera is always looking in the direction of the origin of the arm. + * This way, the camera always rotates around one fixed point, the location + * of the camera arm. + * + * Documentation: + * http://en.wikipedia.org/wiki/3D_projection + */ + Camera = function () { + this.armLocation = new Point3d(); + this.armRotation = {}; + this.armRotation.horizontal = 0; + this.armRotation.vertical = 0; + this.armLength = 1.7; + + this.cameraLocation = new Point3d(); + this.cameraRotation = new Point3d(0.5*Math.PI, 0, 0); + + this.calculateCameraOrientation(); }; /** - * Hide the component from the DOM + * Set the location (origin) of the arm + * @param {Number} x Normalized value of x + * @param {Number} y Normalized value of y + * @param {Number} z Normalized value of z */ - ItemSet.prototype.hide = function() { - // remove the frame containing the items - if (this.dom.frame.parentNode) { - this.dom.frame.parentNode.removeChild(this.dom.frame); + Camera.prototype.setArmLocation = function(x, y, z) { + this.armLocation.x = x; + this.armLocation.y = y; + this.armLocation.z = z; + + this.calculateCameraOrientation(); + }; + + /** + * Set the rotation of the camera arm + * @param {Number} horizontal The horizontal rotation, between 0 and 2*PI. + * Optional, can be left undefined. + * @param {Number} vertical The vertical rotation, between 0 and 0.5*PI + * if vertical=0.5*PI, the graph is shown from the + * top. Optional, can be left undefined. + */ + Camera.prototype.setArmRotation = function(horizontal, vertical) { + if (horizontal !== undefined) { + this.armRotation.horizontal = horizontal; } - // remove the axis with dots - if (this.dom.axis.parentNode) { - this.dom.axis.parentNode.removeChild(this.dom.axis); + if (vertical !== undefined) { + this.armRotation.vertical = vertical; + if (this.armRotation.vertical < 0) this.armRotation.vertical = 0; + if (this.armRotation.vertical > 0.5*Math.PI) this.armRotation.vertical = 0.5*Math.PI; } - // remove the labelset containing all group labels - if (this.dom.labelSet.parentNode) { - this.dom.labelSet.parentNode.removeChild(this.dom.labelSet); + if (horizontal !== undefined || vertical !== undefined) { + this.calculateCameraOrientation(); } }; /** - * Show the component in the DOM (when not already visible). - * @return {Boolean} changed + * Retrieve the current arm rotation + * @return {object} An object with parameters horizontal and vertical */ - ItemSet.prototype.show = function() { - // show frame containing the items - if (!this.dom.frame.parentNode) { - this.body.dom.center.appendChild(this.dom.frame); - } + Camera.prototype.getArmRotation = function() { + var rot = {}; + rot.horizontal = this.armRotation.horizontal; + rot.vertical = this.armRotation.vertical; - // show axis with dots - if (!this.dom.axis.parentNode) { - this.body.dom.top.appendChild(this.dom.axis); - } + return rot; + }; - // show labelset containing labels - if (!this.dom.labelSet.parentNode) { - this.body.dom.left.appendChild(this.dom.labelSet); - } + /** + * Set the (normalized) length of the camera arm. + * @param {Number} length A length between 0.71 and 5.0 + */ + Camera.prototype.setArmLength = function(length) { + if (length === undefined) + return; + + this.armLength = length; + + // Radius must be larger than the corner of the graph, + // which has a distance of sqrt(0.5^2+0.5^2) = 0.71 from the center of the + // graph + if (this.armLength < 0.71) this.armLength = 0.71; + if (this.armLength > 5.0) this.armLength = 5.0; + + this.calculateCameraOrientation(); }; /** - * Set selected items by their id. Replaces the current selection - * Unknown id's are silently ignored. - * @param {string[] | string} [ids] An array with zero or more id's of the items to be - * selected, or a single item id. If ids is undefined - * or an empty array, all items will be unselected. + * Retrieve the arm length + * @return {Number} length */ - ItemSet.prototype.setSelection = function(ids) { - var i, ii, id, item; + Camera.prototype.getArmLength = function() { + return this.armLength; + }; - if (ids == undefined) ids = []; - if (!Array.isArray(ids)) ids = [ids]; + /** + * Retrieve the camera location + * @return {Point3d} cameraLocation + */ + Camera.prototype.getCameraLocation = function() { + return this.cameraLocation; + }; - // unselect currently selected items - for (i = 0, ii = this.selection.length; i < ii; i++) { - id = this.selection[i]; - item = this.items[id]; - if (item) item.unselect(); + /** + * Retrieve the camera rotation + * @return {Point3d} cameraRotation + */ + Camera.prototype.getCameraRotation = function() { + return this.cameraRotation; + }; + + /** + * Calculate the location and rotation of the camera based on the + * position and orientation of the camera arm + */ + Camera.prototype.calculateCameraOrientation = function() { + // calculate location of the camera + this.cameraLocation.x = this.armLocation.x - this.armLength * Math.sin(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical); + this.cameraLocation.y = this.armLocation.y - this.armLength * Math.cos(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical); + this.cameraLocation.z = this.armLocation.z + this.armLength * Math.sin(this.armRotation.vertical); + + // calculate rotation of the camera + this.cameraRotation.x = Math.PI/2 - this.armRotation.vertical; + this.cameraRotation.y = 0; + this.cameraRotation.z = -this.armRotation.horizontal; + }; + + module.exports = Camera; + +/***/ }, +/* 14 */ +/***/ function(module, exports, __webpack_require__) { + + var DataView = __webpack_require__(8); + + /** + * @class Filter + * + * @param {DataSet} data The google data table + * @param {Number} column The index of the column to be filtered + * @param {Graph} graph The graph + */ + function Filter (data, column, graph) { + this.data = data; + this.column = column; + this.graph = graph; // the parent graph + + this.index = undefined; + this.value = undefined; + + // read all distinct values and select the first one + this.values = graph.getDistinctValues(data.get(), this.column); + + // sort both numeric and string values correctly + this.values.sort(function (a, b) { + return a > b ? 1 : a < b ? -1 : 0; + }); + + if (this.values.length > 0) { + this.selectValue(0); + } + + // create an array with the filtered datapoints. this will be loaded afterwards + this.dataPoints = []; + + this.loaded = false; + this.onLoadCallback = undefined; + + if (graph.animationPreload) { + this.loaded = false; + this.loadInBackground(); } - - // select items - this.selection = []; - for (i = 0, ii = ids.length; i < ii; i++) { - id = ids[i]; - item = this.items[id]; - if (item) { - this.selection.push(id); - item.select(); - } + else { + this.loaded = true; } }; + /** - * Get the selected items by their id - * @return {Array} ids The ids of the selected items + * Return the label + * @return {string} label */ - ItemSet.prototype.getSelection = function() { - return this.selection.concat([]); + Filter.prototype.isLoaded = function() { + return this.loaded; }; + /** - * Get the id's of the currently visible items. - * @returns {Array} The ids of the visible items + * Return the loaded progress + * @return {Number} percentage between 0 and 100 */ - ItemSet.prototype.getVisibleItems = function() { - var range = this.body.range.getRange(); - var left = this.body.util.toScreen(range.start); - var right = this.body.util.toScreen(range.end); - - var ids = []; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - var group = this.groups[groupId]; - var rawVisibleItems = group.visibleItems; + Filter.prototype.getLoadedProgress = function() { + var len = this.values.length; - // filter the "raw" set with visibleItems into a set which is really - // visible by pixels - for (var i = 0; i < rawVisibleItems.length; i++) { - var item = rawVisibleItems[i]; - // TODO: also check whether visible vertically - if ((item.left < right) && (item.left + item.width > left)) { - ids.push(item.id); - } - } - } + var i = 0; + while (this.dataPoints[i]) { + i++; } - return ids; + return Math.round(i / len * 100); }; + /** - * Deselect a selected item - * @param {String | Number} id - * @private + * Return the label + * @return {string} label */ - ItemSet.prototype._deselect = function(id) { - var selection = this.selection; - for (var i = 0, ii = selection.length; i < ii; i++) { - if (selection[i] == id) { // non-strict comparison! - selection.splice(i, 1); - break; - } - } + Filter.prototype.getLabel = function() { + return this.graph.filterLabel; }; + /** - * Repaint the component - * @return {boolean} Returns true if the component is resized + * Return the columnIndex of the filter + * @return {Number} columnIndex */ - ItemSet.prototype.redraw = function() { - var margin = this.options.margin, - range = this.body.range, - asSize = util.option.asSize, - options = this.options, - orientation = options.orientation, - resized = false, - frame = this.dom.frame, - editable = options.editable.updateTime || options.editable.updateGroup; - - // update class name - frame.className = 'itemset' + (editable ? ' editable' : ''); - - // reorder the groups (if needed) - resized = this._orderGroups() || resized; - - // check whether zoomed (in that case we need to re-stack everything) - // TODO: would be nicer to get this as a trigger from Range - var visibleInterval = range.end - range.start; - var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.props.width != this.props.lastWidth); - if (zoomed) this.stackDirty = true; - this.lastVisibleInterval = visibleInterval; - this.props.lastWidth = this.props.width; - - // redraw all groups - var restack = this.stackDirty, - firstGroup = this._firstGroup(), - firstMargin = { - item: margin.item, - axis: margin.axis - }, - nonFirstMargin = { - item: margin.item, - axis: margin.item.vertical / 2 - }, - height = 0, - minHeight = margin.axis + margin.item.vertical; - util.forEach(this.groups, function (group) { - var groupMargin = (group == firstGroup) ? firstMargin : nonFirstMargin; - var groupResized = group.redraw(range, groupMargin, restack); - resized = groupResized || resized; - height += group.height; - }); - height = Math.max(height, minHeight); - this.stackDirty = false; - - // update frame height - frame.style.height = asSize(height); - - // calculate actual size and position - this.props.top = frame.offsetTop; - this.props.left = frame.offsetLeft; - this.props.width = frame.offsetWidth; - this.props.height = height; + Filter.prototype.getColumn = function() { + return this.column; + }; - // reposition axis - this.dom.axis.style.top = asSize((orientation == 'top') ? - (this.body.domProps.top.height + this.body.domProps.border.top) : - (this.body.domProps.top.height + this.body.domProps.centerContainer.height)); - this.dom.axis.style.left = '0'; + /** + * Return the currently selected value. Returns undefined if there is no selection + * @return {*} value + */ + Filter.prototype.getSelectedValue = function() { + if (this.index === undefined) + return undefined; - // check if this component is resized - resized = this._isResized() || resized; + return this.values[this.index]; + }; - return resized; + /** + * Retrieve all values of the filter + * @return {Array} values + */ + Filter.prototype.getValues = function() { + return this.values; }; /** - * Get the first group, aligned with the axis - * @return {Group | null} firstGroup - * @private + * Retrieve one value of the filter + * @param {Number} index + * @return {*} value */ - ItemSet.prototype._firstGroup = function() { - var firstGroupIndex = (this.options.orientation == 'top') ? 0 : (this.groupIds.length - 1); - var firstGroupId = this.groupIds[firstGroupIndex]; - var firstGroup = this.groups[firstGroupId] || this.groups[UNGROUPED]; + Filter.prototype.getValue = function(index) { + if (index >= this.values.length) + throw 'Error: index out of range'; - return firstGroup || null; + return this.values[index]; }; + /** - * Create or delete the group holding all ungrouped items. This group is used when - * there are no groups specified. - * @protected + * Retrieve the (filtered) dataPoints for the currently selected filter index + * @param {Number} [index] (optional) + * @return {Array} dataPoints */ - ItemSet.prototype._updateUngrouped = function() { - var ungrouped = this.groups[UNGROUPED]; + Filter.prototype._getDataPoints = function(index) { + if (index === undefined) + index = this.index; - if (this.groupsData) { - // remove the group holding all ungrouped items - if (ungrouped) { - ungrouped.hide(); - delete this.groups[UNGROUPED]; - } + if (index === undefined) + return []; + + var dataPoints; + if (this.dataPoints[index]) { + dataPoints = this.dataPoints[index]; } else { - // create a group holding all (unfiltered) items - if (!ungrouped) { - var id = null; - var data = null; - ungrouped = new Group(id, data, this); - this.groups[UNGROUPED] = ungrouped; + var f = {}; + f.column = this.column; + f.value = this.values[index]; - for (var itemId in this.items) { - if (this.items.hasOwnProperty(itemId)) { - ungrouped.add(this.items[itemId]); - } - } + var dataView = new DataView(this.data,{filter: function (item) {return (item[f.column] == f.value);}}).get(); + dataPoints = this.graph._getDataPoints(dataView); - ungrouped.show(); - } + this.dataPoints[index] = dataPoints; } + + return dataPoints; }; + + /** - * Get the element for the labelset - * @return {HTMLElement} labelSet + * Set a callback function when the filter is fully loaded. */ - ItemSet.prototype.getLabelSet = function() { - return this.dom.labelSet; + Filter.prototype.setOnLoadCallback = function(callback) { + this.onLoadCallback = callback; }; + /** - * Set items - * @param {vis.DataSet | null} items + * Add a value to the list with available values for this filter + * No double entries will be created. + * @param {Number} index */ - ItemSet.prototype.setItems = function(items) { - var me = this, - ids, - oldItemsData = this.itemsData; + Filter.prototype.selectValue = function(index) { + if (index >= this.values.length) + throw 'Error: index out of range'; + + this.index = index; + this.value = this.values[index]; + }; + + /** + * Load all filtered rows in the background one by one + * Start this method without providing an index! + */ + Filter.prototype.loadInBackground = function(index) { + if (index === undefined) + index = 0; + + var frame = this.graph.frame; + + if (index < this.values.length) { + var dataPointsTemp = this._getDataPoints(index); + //this.graph.redrawInfo(); // TODO: not neat + + // create a progress box + if (frame.progress === undefined) { + frame.progress = document.createElement('DIV'); + frame.progress.style.position = 'absolute'; + frame.progress.style.color = 'gray'; + frame.appendChild(frame.progress); + } + var progress = this.getLoadedProgress(); + frame.progress.innerHTML = 'Loading animation... ' + progress + '%'; + // TODO: this is no nice solution... + frame.progress.style.bottom = 60 + 'px'; // TODO: use height of slider + frame.progress.style.left = 10 + 'px'; - // replace the dataset - if (!items) { - this.itemsData = null; - } - else if (items instanceof DataSet || items instanceof DataView) { - this.itemsData = items; + var me = this; + setTimeout(function() {me.loadInBackground(index+1);}, 10); + this.loaded = false; } else { - throw new TypeError('Data must be an instance of DataSet or DataView'); - } + this.loaded = true; - if (oldItemsData) { - // unsubscribe from old dataset - util.forEach(this.itemListeners, function (callback, event) { - oldItemsData.off(event, callback); - }); + // remove the progress box + if (frame.progress !== undefined) { + frame.removeChild(frame.progress); + frame.progress = undefined; + } - // remove all drawn items - ids = oldItemsData.getIds(); - this._onRemove(ids); + if (this.onLoadCallback) + this.onLoadCallback(); } + }; - if (this.itemsData) { - // subscribe to new dataset - var id = this.id; - util.forEach(this.itemListeners, function (callback, event) { - me.itemsData.on(event, callback, id); - }); + module.exports = Filter; - // add all new items - ids = this.itemsData.getIds(); - this._onAdd(ids); - // update the group holding all ungrouped items - this._updateUngrouped(); - } - }; +/***/ }, +/* 15 */ +/***/ function(module, exports, __webpack_require__) { - /** - * Get the current items - * @returns {vis.DataSet | null} - */ - ItemSet.prototype.getItems = function() { - return this.itemsData; - }; + var util = __webpack_require__(1); /** - * Set groups - * @param {vis.DataSet} groups + * @constructor Slider + * + * An html slider control with start/stop/prev/next buttons + * @param {Element} container The element where the slider will be created + * @param {Object} options Available options: + * {boolean} visible If true (default) the + * slider is visible. */ - ItemSet.prototype.setGroups = function(groups) { - var me = this, - ids; + function Slider(container, options) { + if (container === undefined) { + throw 'Error: No container element defined'; + } + this.container = container; + this.visible = (options && options.visible != undefined) ? options.visible : true; - // unsubscribe from current dataset - if (this.groupsData) { - util.forEach(this.groupListeners, function (callback, event) { - me.groupsData.unsubscribe(event, callback); - }); + if (this.visible) { + this.frame = document.createElement('DIV'); + //this.frame.style.backgroundColor = '#E5E5E5'; + this.frame.style.width = '100%'; + this.frame.style.position = 'relative'; + this.container.appendChild(this.frame); - // remove all drawn groups - ids = this.groupsData.getIds(); - this.groupsData = null; - this._onRemoveGroups(ids); // note: this will cause a redraw - } + this.frame.prev = document.createElement('INPUT'); + this.frame.prev.type = 'BUTTON'; + this.frame.prev.value = 'Prev'; + this.frame.appendChild(this.frame.prev); - // replace the dataset - if (!groups) { - this.groupsData = null; - } - else if (groups instanceof DataSet || groups instanceof DataView) { - this.groupsData = groups; - } - else { - throw new TypeError('Data must be an instance of DataSet or DataView'); - } + this.frame.play = document.createElement('INPUT'); + this.frame.play.type = 'BUTTON'; + this.frame.play.value = 'Play'; + this.frame.appendChild(this.frame.play); - if (this.groupsData) { - // subscribe to new dataset - var id = this.id; - util.forEach(this.groupListeners, function (callback, event) { - me.groupsData.on(event, callback, id); - }); + this.frame.next = document.createElement('INPUT'); + this.frame.next.type = 'BUTTON'; + this.frame.next.value = 'Next'; + this.frame.appendChild(this.frame.next); - // draw all ms - ids = this.groupsData.getIds(); - this._onAddGroups(ids); + this.frame.bar = document.createElement('INPUT'); + this.frame.bar.type = 'BUTTON'; + this.frame.bar.style.position = 'absolute'; + this.frame.bar.style.border = '1px solid red'; + this.frame.bar.style.width = '100px'; + this.frame.bar.style.height = '6px'; + this.frame.bar.style.borderRadius = '2px'; + this.frame.bar.style.MozBorderRadius = '2px'; + this.frame.bar.style.border = '1px solid #7F7F7F'; + this.frame.bar.style.backgroundColor = '#E5E5E5'; + this.frame.appendChild(this.frame.bar); + + this.frame.slide = document.createElement('INPUT'); + this.frame.slide.type = 'BUTTON'; + this.frame.slide.style.margin = '0px'; + this.frame.slide.value = ' '; + this.frame.slide.style.position = 'relative'; + this.frame.slide.style.left = '-100px'; + this.frame.appendChild(this.frame.slide); + + // create events + var me = this; + this.frame.slide.onmousedown = function (event) {me._onMouseDown(event);}; + this.frame.prev.onclick = function (event) {me.prev(event);}; + this.frame.play.onclick = function (event) {me.togglePlay(event);}; + this.frame.next.onclick = function (event) {me.next(event);}; } - // update the group holding all ungrouped items - this._updateUngrouped(); + this.onChangeCallback = undefined; - // update the order of all items in each group - this._order(); + this.values = []; + this.index = undefined; - this.body.emitter.emit('change'); - }; + this.playTimeout = undefined; + this.playInterval = 1000; // milliseconds + this.playLoop = true; + } /** - * Get the current groups - * @returns {vis.DataSet | null} groups + * Select the previous index */ - ItemSet.prototype.getGroups = function() { - return this.groupsData; + Slider.prototype.prev = function() { + var index = this.getIndex(); + if (index > 0) { + index--; + this.setIndex(index); + } }; /** - * Remove an item by its id - * @param {String | Number} id + * Select the next index */ - ItemSet.prototype.removeItem = function(id) { - var item = this.itemsData.get(id), - dataset = this.itemsData.getDataSet(); - - if (item) { - // confirm deletion - this.options.onRemove(item, function (item) { - if (item) { - // remove by id here, it is possible that an item has no id defined - // itself, so better not delete by the item itself - dataset.remove(id); - } - }); + Slider.prototype.next = function() { + var index = this.getIndex(); + if (index < this.values.length - 1) { + index++; + this.setIndex(index); } }; /** - * Handle updated items - * @param {Number[]} ids - * @protected + * Select the next index */ - ItemSet.prototype._onUpdate = function(ids) { - var me = this; - - ids.forEach(function (id) { - var itemData = me.itemsData.get(id, me.itemOptions), - item = me.items[id], - type = itemData.type || me.options.type || (itemData.end ? 'range' : 'box'); + Slider.prototype.playNext = function() { + var start = new Date(); - var constructor = ItemSet.types[type]; + var index = this.getIndex(); + if (index < this.values.length - 1) { + index++; + this.setIndex(index); + } + else if (this.playLoop) { + // jump to the start + index = 0; + this.setIndex(index); + } - if (item) { - // update item - if (!constructor || !(item instanceof constructor)) { - // item type has changed, delete the item and recreate it - me._removeItem(item); - item = null; - } - else { - me._updateItem(item, itemData); - } - } + var end = new Date(); + var diff = (end - start); - if (!item) { - // create item - if (constructor) { - item = new constructor(itemData, me.conversion, me.options); - item.id = id; // TODO: not so nice setting id afterwards - me._addItem(item); - } - else if (type == 'rangeoverflow') { - // TODO: deprecated since version 2.1.0 (or 3.0.0?). cleanup some day - throw new TypeError('Item type "rangeoverflow" is deprecated. Use css styling instead: ' + - '.vis.timeline .item.range .content {overflow: visible;}'); - } - else { - throw new TypeError('Unknown item type "' + type + '"'); - } - } - }); + // calculate how much time it to to set the index and to execute the callback + // function. + var interval = Math.max(this.playInterval - diff, 0); + // document.title = diff // TODO: cleanup - this._order(); - this.stackDirty = true; // force re-stacking of all items next redraw - this.body.emitter.emit('change'); + var me = this; + this.playTimeout = setTimeout(function() {me.playNext();}, interval); }; /** - * Handle added items - * @param {Number[]} ids - * @protected + * Toggle start or stop playing */ - ItemSet.prototype._onAdd = ItemSet.prototype._onUpdate; + Slider.prototype.togglePlay = function() { + if (this.playTimeout === undefined) { + this.play(); + } else { + this.stop(); + } + }; /** - * Handle removed items - * @param {Number[]} ids - * @protected + * Start playing */ - ItemSet.prototype._onRemove = function(ids) { - var count = 0; - var me = this; - ids.forEach(function (id) { - var item = me.items[id]; - if (item) { - count++; - me._removeItem(item); - } - }); + Slider.prototype.play = function() { + // Test whether already playing + if (this.playTimeout) return; - if (count) { - // update order - this._order(); - this.stackDirty = true; // force re-stacking of all items next redraw - this.body.emitter.emit('change'); + this.playNext(); + + if (this.frame) { + this.frame.play.value = 'Stop'; } }; /** - * Update the order of item in all groups - * @private + * Stop playing */ - ItemSet.prototype._order = function() { - // reorder the items in all groups - // TODO: optimization: only reorder groups affected by the changed items - util.forEach(this.groups, function (group) { - group.order(); - }); + Slider.prototype.stop = function() { + clearInterval(this.playTimeout); + this.playTimeout = undefined; + + if (this.frame) { + this.frame.play.value = 'Play'; + } }; /** - * Handle updated groups - * @param {Number[]} ids - * @private + * Set a callback function which will be triggered when the value of the + * slider bar has changed. */ - ItemSet.prototype._onUpdateGroups = function(ids) { - this._onAddGroups(ids); + Slider.prototype.setOnChangeCallback = function(callback) { + this.onChangeCallback = callback; }; /** - * Handle changed groups - * @param {Number[]} ids - * @private + * Set the interval for playing the list + * @param {Number} interval The interval in milliseconds */ - ItemSet.prototype._onAddGroups = function(ids) { - var me = this; - - ids.forEach(function (id) { - var groupData = me.groupsData.get(id); - var group = me.groups[id]; + Slider.prototype.setPlayInterval = function(interval) { + this.playInterval = interval; + }; - if (!group) { - // check for reserved ids - if (id == UNGROUPED) { - throw new Error('Illegal group id. ' + id + ' is a reserved id.'); - } + /** + * Retrieve the current play interval + * @return {Number} interval The interval in milliseconds + */ + Slider.prototype.getPlayInterval = function(interval) { + return this.playInterval; + }; - var groupOptions = Object.create(me.options); - util.extend(groupOptions, { - height: null - }); + /** + * Set looping on or off + * @pararm {boolean} doLoop If true, the slider will jump to the start when + * the end is passed, and will jump to the end + * when the start is passed. + */ + Slider.prototype.setPlayLoop = function(doLoop) { + this.playLoop = doLoop; + }; - group = new Group(id, groupData, me); - me.groups[id] = group; - // add items with this groupId to the new group - for (var itemId in me.items) { - if (me.items.hasOwnProperty(itemId)) { - var item = me.items[itemId]; - if (item.data.group == id) { - group.add(item); - } - } - } + /** + * Execute the onchange callback function + */ + Slider.prototype.onChange = function() { + if (this.onChangeCallback !== undefined) { + this.onChangeCallback(); + } + }; - group.order(); - group.show(); - } - else { - // update group - group.setData(groupData); - } - }); + /** + * redraw the slider on the correct place + */ + Slider.prototype.redraw = function() { + if (this.frame) { + // resize the bar + this.frame.bar.style.top = (this.frame.clientHeight/2 - + this.frame.bar.offsetHeight/2) + 'px'; + this.frame.bar.style.width = (this.frame.clientWidth - + this.frame.prev.clientWidth - + this.frame.play.clientWidth - + this.frame.next.clientWidth - 30) + 'px'; - this.body.emitter.emit('change'); + // position the slider button + var left = this.indexToLeft(this.index); + this.frame.slide.style.left = (left) + 'px'; + } }; + /** - * Handle removed groups - * @param {Number[]} ids - * @private + * Set the list with values for the slider + * @param {Array} values A javascript array with values (any type) */ - ItemSet.prototype._onRemoveGroups = function(ids) { - var groups = this.groups; - ids.forEach(function (id) { - var group = groups[id]; + Slider.prototype.setValues = function(values) { + this.values = values; - if (group) { - group.hide(); - delete groups[id]; - } - }); + if (this.values.length > 0) + this.setIndex(0); + else + this.index = undefined; + }; - this.markDirty(); + /** + * Select a value by its index + * @param {Number} index + */ + Slider.prototype.setIndex = function(index) { + if (index < this.values.length) { + this.index = index; - this.body.emitter.emit('change'); + this.redraw(); + this.onChange(); + } + else { + throw 'Error: index out of range'; + } }; /** - * Reorder the groups if needed - * @return {boolean} changed - * @private + * retrieve the index of the currently selected vaue + * @return {Number} index */ - ItemSet.prototype._orderGroups = function () { - if (this.groupsData) { - // reorder the groups - var groupIds = this.groupsData.getIds({ - order: this.options.groupOrder - }); + Slider.prototype.getIndex = function() { + return this.index; + }; - var changed = !util.equalArray(groupIds, this.groupIds); - if (changed) { - // hide all groups, removes them from the DOM - var groups = this.groups; - groupIds.forEach(function (groupId) { - groups[groupId].hide(); - }); - // show the groups again, attach them to the DOM in correct order - groupIds.forEach(function (groupId) { - groups[groupId].show(); - }); + /** + * retrieve the currently selected value + * @return {*} value + */ + Slider.prototype.get = function() { + return this.values[this.index]; + }; - this.groupIds = groupIds; - } - return changed; - } - else { - return false; - } + Slider.prototype._onMouseDown = function(event) { + // only react on left mouse button down + var leftButtonDown = event.which ? (event.which === 1) : (event.button === 1); + if (!leftButtonDown) return; + + this.startClientX = event.clientX; + this.startSlideX = parseFloat(this.frame.slide.style.left); + + this.frame.style.cursor = 'move'; + + // add event listeners to handle moving the contents + // we store the function onmousemove and onmouseup in the graph, so we can + // remove the eventlisteners lateron in the function mouseUp() + var me = this; + this.onmousemove = function (event) {me._onMouseMove(event);}; + this.onmouseup = function (event) {me._onMouseUp(event);}; + util.addEventListener(document, 'mousemove', this.onmousemove); + util.addEventListener(document, 'mouseup', this.onmouseup); + util.preventDefault(event); + }; + + + Slider.prototype.leftToIndex = function (left) { + var width = parseFloat(this.frame.bar.style.width) - + this.frame.slide.clientWidth - 10; + var x = left - 3; + + var index = Math.round(x / width * (this.values.length-1)); + if (index < 0) index = 0; + if (index > this.values.length-1) index = this.values.length-1; + + return index; }; - /** - * Add a new item - * @param {Item} item - * @private - */ - ItemSet.prototype._addItem = function(item) { - this.items[item.id] = item; + Slider.prototype.indexToLeft = function (index) { + var width = parseFloat(this.frame.bar.style.width) - + this.frame.slide.clientWidth - 10; - // add to group - var groupId = this.groupsData ? item.data.group : UNGROUPED; - var group = this.groups[groupId]; - if (group) group.add(item); + var x = index / (this.values.length-1) * width; + var left = x + 3; + + return left; }; - /** - * Update an existing item - * @param {Item} item - * @param {Object} itemData - * @private - */ - ItemSet.prototype._updateItem = function(item, itemData) { - var oldGroupId = item.data.group; - item.data = itemData; - if (item.displayed) { - item.redraw(); - } - // update group - if (oldGroupId != item.data.group) { - var oldGroup = this.groups[oldGroupId]; - if (oldGroup) oldGroup.remove(item); + Slider.prototype._onMouseMove = function (event) { + var diff = event.clientX - this.startClientX; + var x = this.startSlideX + diff; - var groupId = this.groupsData ? item.data.group : UNGROUPED; - var group = this.groups[groupId]; - if (group) group.add(item); - } + var index = this.leftToIndex(x); + + this.setIndex(index); + + util.preventDefault(); }; - /** - * Delete an item from the ItemSet: remove it from the DOM, from the map - * with items, and from the map with visible items, and from the selection - * @param {Item} item - * @private - */ - ItemSet.prototype._removeItem = function(item) { - // remove from DOM - item.hide(); - // remove from items - delete this.items[item.id]; + Slider.prototype._onMouseUp = function (event) { + this.frame.style.cursor = 'auto'; - // remove from selection - var index = this.selection.indexOf(item.id); - if (index != -1) this.selection.splice(index, 1); + // remove event listeners + util.removeEventListener(document, 'mousemove', this.onmousemove); + util.removeEventListener(document, 'mouseup', this.onmouseup); - // remove from group - var groupId = this.groupsData ? item.data.group : UNGROUPED; - var group = this.groups[groupId]; - if (group) group.remove(item); + util.preventDefault(); }; - /** - * Create an array containing all items being a range (having an end date) - * @param array - * @returns {Array} - * @private - */ - ItemSet.prototype._constructByEndArray = function(array) { - var endArray = []; + module.exports = Slider; - for (var i = 0; i < array.length; i++) { - if (array[i] instanceof ItemRange) { - endArray.push(array[i]); - } - } - return endArray; - }; + +/***/ }, +/* 16 */ +/***/ function(module, exports, __webpack_require__) { /** - * Register the clicked item on touch, before dragStart is initiated. + * @prototype StepNumber + * The class StepNumber is an iterator for Numbers. You provide a start and end + * value, and a best step size. StepNumber itself rounds to fixed values and + * a finds the step that best fits the provided step. * - * dragStart is initiated from a mousemove event, which can have left the item - * already resulting in an item == null + * If prettyStep is true, the step size is chosen as close as possible to the + * provided step, but being a round value like 1, 2, 5, 10, 20, 50, .... * - * @param {Event} event - * @private + * Example usage: + * var step = new StepNumber(0, 10, 2.5, true); + * step.start(); + * while (!step.end()) { + * alert(step.getCurrent()); + * step.next(); + * } + * + * Version: 1.0 + * + * @param {Number} start The start value + * @param {Number} end The end value + * @param {Number} step Optional. Step size. Must be a positive value. + * @param {boolean} prettyStep Optional. If true, the step size is rounded + * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...) */ - ItemSet.prototype._onTouch = function (event) { - // store the touched item, used in _onDragStart - this.touchParams.item = ItemSet.itemFromTarget(event); + function StepNumber(start, end, step, prettyStep) { + // set default values + this._start = 0; + this._end = 0; + this._step = 1; + this.prettyStep = true; + this.precision = 5; + + this._current = 0; + this.setRange(start, end, step, prettyStep); }; /** - * Start dragging the selected events - * @param {Event} event - * @private + * Set a new range: start, end and step. + * + * @param {Number} start The start value + * @param {Number} end The end value + * @param {Number} step Optional. Step size. Must be a positive value. + * @param {boolean} prettyStep Optional. If true, the step size is rounded + * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...) */ - ItemSet.prototype._onDragStart = function (event) { - if (!this.options.editable.updateTime && !this.options.editable.updateGroup) { - return; - } - - var item = this.touchParams.item || null, - me = this, - props; - - if (item && item.selected) { - var dragLeftItem = event.target.dragLeftItem; - var dragRightItem = event.target.dragRightItem; - - if (dragLeftItem) { - props = { - item: dragLeftItem - }; - - if (me.options.editable.updateTime) { - props.start = item.data.start.valueOf(); - } - if (me.options.editable.updateGroup) { - if ('group' in item.data) props.group = item.data.group; - } - - this.touchParams.itemProps = [props]; - } - else if (dragRightItem) { - props = { - item: dragRightItem - }; - - if (me.options.editable.updateTime) { - props.end = item.data.end.valueOf(); - } - if (me.options.editable.updateGroup) { - if ('group' in item.data) props.group = item.data.group; - } - - this.touchParams.itemProps = [props]; - } - else { - this.touchParams.itemProps = this.getSelection().map(function (id) { - var item = me.items[id]; - var props = { - item: item - }; - - if (me.options.editable.updateTime) { - if ('start' in item.data) props.start = item.data.start.valueOf(); - if ('end' in item.data) props.end = item.data.end.valueOf(); - } - if (me.options.editable.updateGroup) { - if ('group' in item.data) props.group = item.data.group; - } - - return props; - }); - } + StepNumber.prototype.setRange = function(start, end, step, prettyStep) { + this._start = start ? start : 0; + this._end = end ? end : 0; - event.stopPropagation(); - } + this.setStep(step, prettyStep); }; /** - * Drag selected items - * @param {Event} event - * @private + * Set a new step size + * @param {Number} step New step size. Must be a positive value + * @param {boolean} prettyStep Optional. If true, the provided step is rounded + * to a pretty step size (like 1, 2, 5, 10, 20, 50, ...) */ - ItemSet.prototype._onDrag = function (event) { - if (this.touchParams.itemProps) { - var range = this.body.range, - snap = this.body.util.snap || null, - deltaX = event.gesture.deltaX, - scale = (this.props.width / (range.end - range.start)), - offset = deltaX / scale; + StepNumber.prototype.setStep = function(step, prettyStep) { + if (step === undefined || step <= 0) + return; - // move - this.touchParams.itemProps.forEach(function (props) { - if ('start' in props) { - var start = new Date(props.start + offset); - props.item.data.start = snap ? snap(start) : start; - } + if (prettyStep !== undefined) + this.prettyStep = prettyStep; - if ('end' in props) { - var end = new Date(props.end + offset); - props.item.data.end = snap ? snap(end) : end; - } + if (this.prettyStep === true) + this._step = StepNumber.calculatePrettyStep(step); + else + this._step = step; + }; - if ('group' in props) { - // drag from one group to another - var group = ItemSet.groupFromTarget(event); - _moveToGroup(props.item, group); - } - }); + /** + * Calculate a nice step size, closest to the desired step size. + * Returns a value in one of the ranges 1*10^n, 2*10^n, or 5*10^n, where n is an + * integer Number. For example 1, 2, 5, 10, 20, 50, etc... + * @param {Number} step Desired step size + * @return {Number} Nice step size + */ + StepNumber.calculatePrettyStep = function (step) { + var log10 = function (x) {return Math.log(x) / Math.LN10;}; - // TODO: implement onMoving handler + // try three steps (multiple of 1, 2, or 5 + var step1 = Math.pow(10, Math.round(log10(step))), + step2 = 2 * Math.pow(10, Math.round(log10(step / 2))), + step5 = 5 * Math.pow(10, Math.round(log10(step / 5))); - this.stackDirty = true; // force re-stacking of all items next redraw - this.body.emitter.emit('change'); + // choose the best step (closest to minimum step) + var prettyStep = step1; + if (Math.abs(step2 - step) <= Math.abs(prettyStep - step)) prettyStep = step2; + if (Math.abs(step5 - step) <= Math.abs(prettyStep - step)) prettyStep = step5; - event.stopPropagation(); + // for safety + if (prettyStep <= 0) { + prettyStep = 1; } + + return prettyStep; }; /** - * Move an item to another group - * @param {Item} item - * @param {Group} group - * @private + * returns the current value of the step + * @return {Number} current value */ - function _moveToGroup (item, group) { - if (group && group.groupId != item.data.group) { - var oldGroup = item.parent; - oldGroup.remove(item); - oldGroup.order(); - group.add(item); - group.order(); + StepNumber.prototype.getCurrent = function () { + return parseFloat(this._current.toPrecision(this.precision)); + }; - item.data.group = group.groupId; - } - } + /** + * returns the current step size + * @return {Number} current step size + */ + StepNumber.prototype.getStep = function () { + return this._step; + }; /** - * End of dragging selected items - * @param {Event} event - * @private + * Set the current value to the largest value smaller than start, which + * is a multiple of the step size */ - ItemSet.prototype._onDragEnd = function (event) { - if (this.touchParams.itemProps) { - // prepare a change set for the changed items - var changes = [], - me = this, - dataset = this.itemsData.getDataSet(); + StepNumber.prototype.start = function() { + this._current = this._start - this._start % this._step; + }; - var itemProps = this.touchParams.itemProps ; - this.touchParams.itemProps = null; - itemProps.forEach(function (props) { - var id = props.item.id, - itemData = me.itemsData.get(id, me.itemOptions); + /** + * Do a step, add the step size to the current value + */ + StepNumber.prototype.next = function () { + this._current += this._step; + }; - var changed = false; - if ('start' in props.item.data) { - changed = (props.start != props.item.data.start.valueOf()); - itemData.start = util.convert(props.item.data.start, - dataset._options.type && dataset._options.type.start || 'Date'); - } - if ('end' in props.item.data) { - changed = changed || (props.end != props.item.data.end.valueOf()); - itemData.end = util.convert(props.item.data.end, - dataset._options.type && dataset._options.type.end || 'Date'); - } - if ('group' in props.item.data) { - changed = changed || (props.group != props.item.data.group); - itemData.group = props.item.data.group; - } + /** + * Returns true whether the end is reached + * @return {boolean} True if the current value has passed the end value. + */ + StepNumber.prototype.end = function () { + return (this._current > this._end); + }; - // only apply changes when start or end is actually changed - if (changed) { - me.options.onMove(itemData, function (itemData) { - if (itemData) { - // apply changes - itemData[dataset._fieldId] = id; // ensure the item contains its id (can be undefined) - changes.push(itemData); - } - else { - // restore original values - if ('start' in props) props.item.data.start = props.start; - if ('end' in props) props.item.data.end = props.end; - if ('group' in props && props.item.data.group != props.group) { - var group = me.groups[props.group]; - _moveToGroup(props.item, group); - } + module.exports = StepNumber; - me.stackDirty = true; // force re-stacking of all items next redraw - me.body.emitter.emit('change'); - } - }); - } - }); - // apply the changes to the data (if there are changes) - if (changes.length) { - dataset.update(changes); - } +/***/ }, +/* 17 */ +/***/ function(module, exports, __webpack_require__) { - event.stopPropagation(); - } - }; + var Emitter = __webpack_require__(10); + var Hammer = __webpack_require__(18); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(7); + var DataView = __webpack_require__(8); + var Range = __webpack_require__(20); + var Core = __webpack_require__(23); + var TimeAxis = __webpack_require__(24); + var CurrentTime = __webpack_require__(26); + var CustomTime = __webpack_require__(28); + var ItemSet = __webpack_require__(29); /** - * Handle selecting/deselecting an item when tapping it - * @param {Event} event - * @private + * Create a timeline visualization + * @param {HTMLElement} container + * @param {vis.DataSet | Array | google.visualization.DataTable} [items] + * @param {Object} [options] See Timeline.setOptions for the available options. + * @constructor + * @extends Core */ - ItemSet.prototype._onSelectItem = function (event) { - if (!this.options.selectable) return; - - var ctrlKey = event.gesture.srcEvent && event.gesture.srcEvent.ctrlKey; - var shiftKey = event.gesture.srcEvent && event.gesture.srcEvent.shiftKey; - if (ctrlKey || shiftKey) { - this._onMultiSelectItem(event); - return; + function Timeline (container, items, options) { + if (!(this instanceof Timeline)) { + throw new SyntaxError('Constructor must be called with the new operator'); } - var oldSelection = this.getSelection(); + var me = this; + this.defaultOptions = { + start: null, + end: null, - var item = ItemSet.itemFromTarget(event); - var selection = item ? [item.id] : []; - this.setSelection(selection); + autoResize: true, - var newSelection = this.getSelection(); + orientation: 'bottom', + width: null, + height: null, + maxHeight: null, + minHeight: null + }; + this.options = util.deepExtend({}, this.defaultOptions); - // emit a select event, - // except when old selection is empty and new selection is still empty - if (newSelection.length > 0 || oldSelection.length > 0) { - this.body.emitter.emit('select', { - items: this.getSelection() - }); - } + // Create the DOM, props, and emitter + this._create(container); - event.stopPropagation(); - }; + // all components listed here will be repainted automatically + this.components = []; - /** - * Handle creation and updates of an item on double tap - * @param event - * @private - */ - ItemSet.prototype._onAddItem = function (event) { - if (!this.options.selectable) return; - if (!this.options.editable.add) return; + this.body = { + dom: this.dom, + domProps: this.props, + emitter: { + on: this.on.bind(this), + off: this.off.bind(this), + emit: this.emit.bind(this) + }, + util: { + snap: null, // will be specified after TimeAxis is created + toScreen: me._toScreen.bind(me), + toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width + toTime: me._toTime.bind(me), + toGlobalTime : me._toGlobalTime.bind(me) + } + }; - var me = this, - snap = this.body.util.snap || null, - item = ItemSet.itemFromTarget(event); + // range + this.range = new Range(this.body); + this.components.push(this.range); + this.body.range = this.range; - if (item) { - // update item + // time axis + this.timeAxis = new TimeAxis(this.body); + this.components.push(this.timeAxis); + this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); - // execute async handler to update the item (or cancel it) - var itemData = me.itemsData.get(item.id); // get a clone of the data from the dataset - this.options.onUpdate(itemData, function (itemData) { - if (itemData) { - me.itemsData.update(itemData); - } - }); + // current time bar + this.currentTime = new CurrentTime(this.body); + this.components.push(this.currentTime); + + // custom time bar + // Note: time bar will be attached in this.setOptions when selected + this.customTime = new CustomTime(this.body); + this.components.push(this.customTime); + + // item set + this.itemSet = new ItemSet(this.body); + this.components.push(this.itemSet); + + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet + + // apply options + if (options) { + this.setOptions(options); } - else { - // add item - var xAbs = util.getAbsoluteLeft(this.dom.frame); - var x = event.gesture.center.pageX - xAbs; - var start = this.body.util.toTime(x); - var newItem = { - start: snap ? snap(start) : start, - content: 'new item' - }; - // when default type is a range, add a default end date to the new item - if (this.options.type === 'range') { - var end = this.body.util.toTime(x + this.props.width / 5); - newItem.end = snap ? snap(end) : end; - } + // create itemset + if (items) { + this.setItems(items); + } + else { + this.redraw(); + } + } - newItem[this.itemsData.fieldId] = util.randomUUID(); + // Extend the functionality from Core + Timeline.prototype = new Core(); - var group = ItemSet.groupFromTarget(event); - if (group) { - newItem.group = group.groupId; - } + /** + * Set items + * @param {vis.DataSet | Array | google.visualization.DataTable | null} items + */ + Timeline.prototype.setItems = function(items) { + var initialLoad = (this.itemsData == null); - // execute async handler to customize (or cancel) adding an item - this.options.onAdd(newItem, function (item) { - if (item) { - me.itemsData.add(newItem); - // TODO: need to trigger a redraw? + // convert to type DataSet when needed + var newDataSet; + if (!items) { + newDataSet = null; + } + else if (items instanceof DataSet || items instanceof DataView) { + newDataSet = items; + } + else { + // turn an array into a dataset + newDataSet = new DataSet(items, { + type: { + start: 'Date', + end: 'Date' } }); } - }; - - /** - * Handle selecting/deselecting multiple items when holding an item - * @param {Event} event - * @private - */ - ItemSet.prototype._onMultiSelectItem = function (event) { - if (!this.options.selectable) return; - var selection, - item = ItemSet.itemFromTarget(event); + // set items + this.itemsData = newDataSet; + this.itemSet && this.itemSet.setItems(newDataSet); - if (item) { - // multi select items - selection = this.getSelection(); // current selection - var index = selection.indexOf(item.id); - if (index == -1) { - // item is not yet selected -> select it - selection.push(item.id); - } - else { - // item is already selected -> deselect it - selection.splice(index, 1); - } - this.setSelection(selection); + if (initialLoad && ('start' in this.options || 'end' in this.options)) { + this.fit(); - this.body.emitter.emit('select', { - items: this.getSelection() - }); + var start = ('start' in this.options) ? util.convert(this.options.start, 'Date') : null; + var end = ('end' in this.options) ? util.convert(this.options.end, 'Date') : null; - event.stopPropagation(); + this.setWindow(start, end); } }; /** - * Find an item from an event target: - * searches for the attribute 'timeline-item' in the event target's element tree - * @param {Event} event - * @return {Item | null} item + * Set groups + * @param {vis.DataSet | Array | google.visualization.DataTable} groups */ - ItemSet.itemFromTarget = function(event) { - var target = event.target; - while (target) { - if (target.hasOwnProperty('timeline-item')) { - return target['timeline-item']; - } - target = target.parentNode; + Timeline.prototype.setGroups = function(groups) { + // convert to type DataSet when needed + var newDataSet; + if (!groups) { + newDataSet = null; + } + else if (groups instanceof DataSet || groups instanceof DataView) { + newDataSet = groups; + } + else { + // turn an array into a dataset + newDataSet = new DataSet(groups); } - return null; + this.groupsData = newDataSet; + this.itemSet.setGroups(newDataSet); }; /** - * Find the Group from an event target: - * searches for the attribute 'timeline-group' in the event target's element tree - * @param {Event} event - * @return {Group | null} group + * Set selected items by their id. Replaces the current selection + * Unknown id's are silently ignored. + * @param {string[] | string} [ids] An array with zero or more id's of the items to be + * selected. If ids is an empty array, all items will be + * unselected. + * @param {Object} [options] Available options: + * `focus: boolean` If true, focus will be set + * to the selected item(s) */ - ItemSet.groupFromTarget = function(event) { - var target = event.target; - while (target) { - if (target.hasOwnProperty('timeline-group')) { - return target['timeline-group']; - } - target = target.parentNode; + Timeline.prototype.setSelection = function(ids, options) { + this.itemSet && this.itemSet.setSelection(ids); + + if (options && options.focus) { + this.focus(ids); } + }; - return null; + /** + * Get the selected items by their id + * @return {Array} ids The ids of the selected items + */ + Timeline.prototype.getSelection = function() { + return this.itemSet && this.itemSet.getSelection() || []; }; /** - * Find the ItemSet from an event target: - * searches for the attribute 'timeline-itemset' in the event target's element tree - * @param {Event} event - * @return {ItemSet | null} item + * Adjust the visible window such that the selected item (or multiple items) + * are centered on screen. + * @param {String | String[]} id An item id or array with item ids */ - ItemSet.itemSetFromTarget = function(event) { - var target = event.target; - while (target) { - if (target.hasOwnProperty('timeline-itemset')) { - return target['timeline-itemset']; + Timeline.prototype.focus = function(id) { + if (!this.itemsData || id == undefined) return; + + var ids = Array.isArray(id) ? id : [id]; + + // get the specified item(s) + var itemsData = this.itemsData.getDataSet().get(ids, { + type: { + start: 'Date', + end: 'Date' } - target = target.parentNode; - } + }); - return null; - }; + // calculate minimum start and maximum end of specified items + var start = null; + var end = null; + itemsData.forEach(function (itemData) { + var s = itemData.start.valueOf(); + var e = 'end' in itemData ? itemData.end.valueOf() : itemData.start.valueOf(); - module.exports = ItemSet; + if (start === null || s < start) { + start = s; + } + if (end === null || e > end) { + end = e; + } + }); -/***/ }, -/* 25 */ -/***/ function(module, exports, __webpack_require__) { + // calculate the new middle and interval for the window + var middle = (start + end) / 2; + var interval = Math.max((this.range.end - this.range.start), (end - start) * 1.1); - var util = __webpack_require__(1); - var DOMutil = __webpack_require__(2); - var Component = __webpack_require__(18); + this.range.setRange(middle - interval / 2, middle + interval / 2); + }; /** - * Legend for Graph2d + * Get the data range of the item set. + * @returns {{min: Date, max: Date}} range A range with a start and end Date. + * When no minimum is found, min==null + * When no maximum is found, max==null */ - function Legend(body, options, side) { - this.body = body; - this.defaultOptions = { - enabled: true, - icons: true, - iconSize: 20, - iconSpacing: 6, - left: { - visible: true, - position: 'top-left' // top/bottom - left,center,right - }, - right: { - visible: true, - position: 'top-left' // top/bottom - left,center,right + Timeline.prototype.getItemRange = function() { + // calculate min from start filed + var dataset = this.itemsData.getDataSet(), + min = null, + max = null; + + if (dataset) { + // calculate the minimum value of the field 'start' + var minItem = dataset.min('start'); + min = minItem ? util.convert(minItem.start, 'Date').valueOf() : null; + // Note: we convert first to Date and then to number because else + // a conversion from ISODate to Number will fail + + // calculate maximum value of fields 'start' and 'end' + var maxStartItem = dataset.max('start'); + if (maxStartItem) { + max = util.convert(maxStartItem.start, 'Date').valueOf(); + } + var maxEndItem = dataset.max('end'); + if (maxEndItem) { + if (max == null) { + max = util.convert(maxEndItem.end, 'Date').valueOf(); + } + else { + max = Math.max(max, util.convert(maxEndItem.end, 'Date').valueOf()); + } } } - this.side = side; - this.options = util.extend({},this.defaultOptions); - this.svgElements = {}; - this.dom = {}; - this.groups = {}; - this.amountOfGroups = 0; - this._create(); + return { + min: (min != null) ? new Date(min) : null, + max: (max != null) ? new Date(max) : null + }; + }; - this.setOptions(options); + + module.exports = Timeline; + + +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + + // Only load hammer.js when in a browser environment + // (loading hammer.js in a node.js environment gives errors) + if (typeof window !== 'undefined') { + module.exports = window['Hammer'] || __webpack_require__(19); + } + else { + module.exports = function () { + throw Error('hammer.js is only available in a browser, not in node.js.'); + } } - Legend.prototype = new Component(); +/***/ }, +/* 19 */ +/***/ function(module, exports, __webpack_require__) { - Legend.prototype.addGroup = function(label, graphOptions) { - if (!this.groups.hasOwnProperty(label)) { - this.groups[label] = graphOptions; - } - this.amountOfGroups += 1; - }; + var __WEBPACK_AMD_DEFINE_RESULT__;/*! Hammer.JS - v1.1.3 - 2014-05-20 + * http://eightmedia.github.io/hammer.js + * + * Copyright (c) 2014 Jorik Tangelder ; + * Licensed under the MIT license */ - Legend.prototype.updateGroup = function(label, graphOptions) { - this.groups[label] = graphOptions; - }; + (function(window, undefined) { + 'use strict'; - Legend.prototype.removeGroup = function(label) { - if (this.groups.hasOwnProperty(label)) { - delete this.groups[label]; - this.amountOfGroups -= 1; - } + /** + * @main + * @module hammer + * + * @class Hammer + * @static + */ + + /** + * Hammer, use this to create instances + * ```` + * var hammertime = new Hammer(myElement); + * ```` + * + * @method Hammer + * @param {HTMLElement} element + * @param {Object} [options={}] + * @return {Hammer.Instance} + */ + var Hammer = function Hammer(element, options) { + return new Hammer.Instance(element, options || {}); }; - Legend.prototype._create = function() { - this.dom.frame = document.createElement('div'); - this.dom.frame.className = 'legend'; - this.dom.frame.style.position = "absolute"; - this.dom.frame.style.top = "10px"; - this.dom.frame.style.display = "block"; + /** + * version, as defined in package.json + * the value will be set at each build + * @property VERSION + * @final + * @type {String} + */ + Hammer.VERSION = '1.1.3'; - this.dom.textArea = document.createElement('div'); - this.dom.textArea.className = 'legendText'; - this.dom.textArea.style.position = "relative"; - this.dom.textArea.style.top = "0px"; + /** + * default settings. + * more settings are defined per gesture at `/gestures`. Each gesture can be disabled/enabled + * by setting it's name (like `swipe`) to false. + * You can set the defaults for all instances by changing this object before creating an instance. + * @example + * ```` + * Hammer.defaults.drag = false; + * Hammer.defaults.behavior.touchAction = 'pan-y'; + * delete Hammer.defaults.behavior.userSelect; + * ```` + * @property defaults + * @type {Object} + */ + Hammer.defaults = { + /** + * this setting object adds styles and attributes to the element to prevent the browser from doing + * its native behavior. The css properties are auto prefixed for the browsers when needed. + * @property defaults.behavior + * @type {Object} + */ + behavior: { + /** + * Disables text selection to improve the dragging gesture. When the value is `none` it also sets + * `onselectstart=false` for IE on the element. Mainly for desktop browsers. + * @property defaults.behavior.userSelect + * @type {String} + * @default 'none' + */ + userSelect: 'none', - this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); - this.svg.style.position = 'absolute'; - this.svg.style.top = 0 +'px'; - this.svg.style.width = this.options.iconSize + 5 + 'px'; + /** + * Specifies whether and how a given region can be manipulated by the user (for instance, by panning or zooming). + * Used by Chrome 35> and IE10>. By default this makes the element blocking any touch event. + * @property defaults.behavior.touchAction + * @type {String} + * @default: 'pan-y' + */ + touchAction: 'pan-y', - this.dom.frame.appendChild(this.svg); - this.dom.frame.appendChild(this.dom.textArea); + /** + * Disables the default callout shown when you touch and hold a touch target. + * On iOS, when you touch and hold a touch target such as a link, Safari displays + * a callout containing information about the link. This property allows you to disable that callout. + * @property defaults.behavior.touchCallout + * @type {String} + * @default 'none' + */ + touchCallout: 'none', + + /** + * Specifies whether zooming is enabled. Used by IE10> + * @property defaults.behavior.contentZooming + * @type {String} + * @default 'none' + */ + contentZooming: 'none', + + /** + * Specifies that an entire element should be draggable instead of its contents. + * Mainly for desktop browsers. + * @property defaults.behavior.userDrag + * @type {String} + * @default 'none' + */ + userDrag: 'none', + + /** + * Overrides the highlight color shown when the user taps a link or a JavaScript + * clickable element in Safari on iPhone. This property obeys the alpha value, if specified. + * + * If you don't specify an alpha value, Safari on iPhone applies a default alpha value + * to the color. To disable tap highlighting, set the alpha value to 0 (invisible). + * If you set the alpha value to 1.0 (opaque), the element is not visible when tapped. + * @property defaults.behavior.tapHighlightColor + * @type {String} + * @default 'rgba(0,0,0,0)' + */ + tapHighlightColor: 'rgba(0,0,0,0)' + } }; /** - * Hide the component from the DOM + * hammer document where the base events are added at + * @property DOCUMENT + * @type {HTMLElement} + * @default window.document */ - Legend.prototype.hide = function() { - // remove the frame containing the items - if (this.dom.frame.parentNode) { - this.dom.frame.parentNode.removeChild(this.dom.frame); - } - }; + Hammer.DOCUMENT = document; /** - * Show the component in the DOM (when not already visible). - * @return {Boolean} changed + * detect support for pointer events + * @property HAS_POINTEREVENTS + * @type {Boolean} */ - Legend.prototype.show = function() { - // show frame containing the items - if (!this.dom.frame.parentNode) { - this.body.dom.center.appendChild(this.dom.frame); - } - }; + Hammer.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled; - Legend.prototype.setOptions = function(options) { - var fields = ['enabled','orientation','icons','left','right']; - util.selectiveDeepExtend(fields, this.options, options); - }; + /** + * detect support for touch events + * @property HAS_TOUCHEVENTS + * @type {Boolean} + */ + Hammer.HAS_TOUCHEVENTS = ('ontouchstart' in window); - Legend.prototype.redraw = function() { - var activeGroups = 0; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true) { - activeGroups++; - } - } - } + /** + * detect mobile browsers + * @property IS_MOBILE + * @type {Boolean} + */ + Hammer.IS_MOBILE = /mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent); - if (this.options[this.side].visible == false || this.amountOfGroups == 0 || this.options.enabled == false || activeGroups == 0) { - this.hide(); - } - else { - this.show(); - if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'bottom-left') { - this.dom.frame.style.left = '4px'; - this.dom.frame.style.textAlign = "left"; - this.dom.textArea.style.textAlign = "left"; - this.dom.textArea.style.left = (this.options.iconSize + 15) + 'px'; - this.dom.textArea.style.right = ''; - this.svg.style.left = 0 +'px'; - this.svg.style.right = ''; - } - else { - this.dom.frame.style.right = '4px'; - this.dom.frame.style.textAlign = "right"; - this.dom.textArea.style.textAlign = "right"; - this.dom.textArea.style.right = (this.options.iconSize + 15) + 'px'; - this.dom.textArea.style.left = ''; - this.svg.style.right = 0 +'px'; - this.svg.style.left = ''; - } + /** + * detect if we want to support mouseevents at all + * @property NO_MOUSEEVENTS + * @type {Boolean} + */ + Hammer.NO_MOUSEEVENTS = (Hammer.HAS_TOUCHEVENTS && Hammer.IS_MOBILE) || Hammer.HAS_POINTEREVENTS; - if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'top-right') { - this.dom.frame.style.top = 4 - Number(this.body.dom.center.style.top.replace("px","")) + 'px'; - this.dom.frame.style.bottom = ''; - } - else { - this.dom.frame.style.bottom = 4 - Number(this.body.dom.center.style.top.replace("px","")) + 'px'; - this.dom.frame.style.top = ''; - } + /** + * interval in which Hammer recalculates current velocity/direction/angle in ms + * @property CALCULATE_INTERVAL + * @type {Number} + * @default 25 + */ + Hammer.CALCULATE_INTERVAL = 25; - if (this.options.icons == false) { - this.dom.frame.style.width = this.dom.textArea.offsetWidth + 10 + 'px'; - this.dom.textArea.style.right = ''; - this.dom.textArea.style.left = ''; - this.svg.style.width = '0px'; - } - else { - this.dom.frame.style.width = this.options.iconSize + 15 + this.dom.textArea.offsetWidth + 10 + 'px' - this.drawLegendIcons(); - } + /** + * eventtypes per touchevent (start, move, end) are filled by `Event.determineEventTypes` on `setup` + * the object contains the DOM event names per type (`EVENT_START`, `EVENT_MOVE`, `EVENT_END`) + * @property EVENT_TYPES + * @private + * @writeOnce + * @type {Object} + */ + var EVENT_TYPES = {}; - var content = ''; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true) { - content += this.groups[groupId].content + '
'; - } - } - } - this.dom.textArea.innerHTML = content; - this.dom.textArea.style.lineHeight = ((0.75 * this.options.iconSize) + this.options.iconSpacing) + 'px'; - } - }; + /** + * direction strings, for safe comparisons + * @property DIRECTION_DOWN|LEFT|UP|RIGHT + * @final + * @type {String} + * @default 'down' 'left' 'up' 'right' + */ + var DIRECTION_DOWN = Hammer.DIRECTION_DOWN = 'down'; + var DIRECTION_LEFT = Hammer.DIRECTION_LEFT = 'left'; + var DIRECTION_UP = Hammer.DIRECTION_UP = 'up'; + var DIRECTION_RIGHT = Hammer.DIRECTION_RIGHT = 'right'; - Legend.prototype.drawLegendIcons = function() { - if (this.dom.frame.parentNode) { - DOMutil.prepareElements(this.svgElements); - var padding = window.getComputedStyle(this.dom.frame).paddingTop; - var iconOffset = Number(padding.replace('px','')); - var x = iconOffset; - var iconWidth = this.options.iconSize; - var iconHeight = 0.75 * this.options.iconSize; - var y = iconOffset + 0.5 * iconHeight + 3; + /** + * pointertype strings, for safe comparisons + * @property POINTER_MOUSE|TOUCH|PEN + * @final + * @type {String} + * @default 'mouse' 'touch' 'pen' + */ + var POINTER_MOUSE = Hammer.POINTER_MOUSE = 'mouse'; + var POINTER_TOUCH = Hammer.POINTER_TOUCH = 'touch'; + var POINTER_PEN = Hammer.POINTER_PEN = 'pen'; - this.svg.style.width = iconWidth + 5 + iconOffset + 'px'; + /** + * eventtypes + * @property EVENT_START|MOVE|END|RELEASE|TOUCH + * @final + * @type {String} + * @default 'start' 'change' 'move' 'end' 'release' 'touch' + */ + var EVENT_START = Hammer.EVENT_START = 'start'; + var EVENT_MOVE = Hammer.EVENT_MOVE = 'move'; + var EVENT_END = Hammer.EVENT_END = 'end'; + var EVENT_RELEASE = Hammer.EVENT_RELEASE = 'release'; + var EVENT_TOUCH = Hammer.EVENT_TOUCH = 'touch'; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true) { - this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); - y += iconHeight + this.options.iconSpacing; - } - } - } + /** + * if the window events are set... + * @property READY + * @writeOnce + * @type {Boolean} + * @default false + */ + Hammer.READY = false; - DOMutil.cleanupElements(this.svgElements); - } - }; + /** + * plugins namespace + * @property plugins + * @type {Object} + */ + Hammer.plugins = Hammer.plugins || {}; - module.exports = Legend; + /** + * gestures namespace + * see `/gestures` for the definitions + * @property gestures + * @type {Object} + */ + Hammer.gestures = Hammer.gestures || {}; + + /** + * setup events to detect gestures on the document + * this function is called when creating an new instance + * @private + */ + function setup() { + if(Hammer.READY) { + return; + } + // find what eventtypes we add listeners to + Event.determineEventTypes(); -/***/ }, -/* 26 */ -/***/ function(module, exports, __webpack_require__) { + // Register all gestures inside Hammer.gestures + Utils.each(Hammer.gestures, function(gesture) { + Detection.register(gesture); + }); - var util = __webpack_require__(1); - var DOMutil = __webpack_require__(2); - var DataSet = __webpack_require__(3); - var DataView = __webpack_require__(4); - var Component = __webpack_require__(18); - var DataAxis = __webpack_require__(21); - var GraphGroup = __webpack_require__(22); - var Legend = __webpack_require__(25); + // Add touch events on the document + Event.onTouch(Hammer.DOCUMENT, EVENT_MOVE, Detection.detect); + Event.onTouch(Hammer.DOCUMENT, EVENT_END, Detection.detect); - var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items + // Hammer is ready...! + Hammer.READY = true; + } /** - * This is the constructor of the LineGraph. It requires a Timeline body and options. + * @module hammer * - * @param body - * @param options - * @constructor + * @class Utils + * @static */ - function LineGraph(body, options) { - this.id = util.randomUUID(); - this.body = body; + var Utils = Hammer.utils = { + /** + * extend method, could also be used for cloning when `dest` is an empty object. + * changes the dest object + * @method extend + * @param {Object} dest + * @param {Object} src + * @param {Boolean} [merge=false] do a merge + * @return {Object} dest + */ + extend: function extend(dest, src, merge) { + for(var key in src) { + if(!src.hasOwnProperty(key) || (dest[key] !== undefined && merge)) { + continue; + } + dest[key] = src[key]; + } + return dest; + }, - this.defaultOptions = { - yAxisOrientation: 'left', - defaultGroup: 'default', - sort: true, - sampling: true, - graphHeight: '400px', - shaded: { - enabled: false, - orientation: 'bottom' // top, bottom + /** + * simple addEventListener wrapper + * @method on + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + */ + on: function on(element, type, handler) { + element.addEventListener(type, handler, false); }, - style: 'line', // line, bar - barChart: { - width: 50, - handleOverlap: 'overlap', - align: 'center' // left, center, right + + /** + * simple removeEventListener wrapper + * @method off + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + */ + off: function off(element, type, handler) { + element.removeEventListener(type, handler, false); }, - catmullRom: { - enabled: true, - parametrization: 'centripetal', // uniform (alpha = 0.0), chordal (alpha = 1.0), centripetal (alpha = 0.5) - alpha: 0.5 + + /** + * forEach over arrays and objects + * @method each + * @param {Object|Array} obj + * @param {Function} iterator + * @param {any} iterator.item + * @param {Number} iterator.index + * @param {Object|Array} iterator.obj the source object + * @param {Object} context value to use as `this` in the iterator + */ + each: function each(obj, iterator, context) { + var i, len; + + // native forEach on arrays + if('forEach' in obj) { + obj.forEach(iterator, context); + // arrays + } else if(obj.length !== undefined) { + for(i = 0, len = obj.length; i < len; i++) { + if(iterator.call(context, obj[i], i, obj) === false) { + return; + } + } + // objects + } else { + for(i in obj) { + if(obj.hasOwnProperty(i) && + iterator.call(context, obj[i], i, obj) === false) { + return; + } + } + } }, - drawPoints: { - enabled: true, - size: 6, - style: 'square' // square, circle + + /** + * find if a string contains the string using indexOf + * @method inStr + * @param {String} src + * @param {String} find + * @return {Boolean} found + */ + inStr: function inStr(src, find) { + return src.indexOf(find) > -1; }, - dataAxis: { - showMinorLabels: true, - showMajorLabels: true, - icons: false, - width: '40px', - visible: true, - customRange: { - left: {min:undefined, max:undefined}, - right: {min:undefined, max:undefined} - } + + /** + * find if a array contains the object using indexOf or a simple polyfill + * @method inArray + * @param {String} src + * @param {String} find + * @return {Boolean|Number} false when not found, or the index + */ + inArray: function inArray(src, find) { + if(src.indexOf) { + var index = src.indexOf(find); + return (index === -1) ? false : index; + } else { + for(var i = 0, len = src.length; i < len; i++) { + if(src[i] === find) { + return i; + } + } + return false; + } }, - legend: { - enabled: false, - icons: true, - left: { - visible: true, - position: 'top-left' // top/bottom - left,right - }, - right: { - visible: true, - position: 'top-right' // top/bottom - left,right - } + + /** + * convert an array-like object (`arguments`, `touchlist`) to an array + * @method toArray + * @param {Object} obj + * @return {Array} + */ + toArray: function toArray(obj) { + return Array.prototype.slice.call(obj, 0); }, - groups: { - visibility: {} - } - }; - // options is shared by this ItemSet and all its items - this.options = util.extend({}, this.defaultOptions); - this.dom = {}; - this.props = {}; - this.hammer = null; - this.groups = {}; - this.abortedGraphUpdate = false; + /** + * find if a node is in the given parent + * @method hasParent + * @param {HTMLElement} node + * @param {HTMLElement} parent + * @return {Boolean} found + */ + hasParent: function hasParent(node, parent) { + while(node) { + if(node == parent) { + return true; + } + node = node.parentNode; + } + return false; + }, - var me = this; - this.itemsData = null; // DataSet - this.groupsData = null; // DataSet + /** + * get the center of all the touches + * @method getCenter + * @param {Array} touches + * @return {Object} center contains `pageX`, `pageY`, `clientX` and `clientY` properties + */ + getCenter: function getCenter(touches) { + var pageX = [], + pageY = [], + clientX = [], + clientY = [], + min = Math.min, + max = Math.max; - // listeners for the DataSet of the items - this.itemListeners = { - 'add': function (event, params, senderId) { - me._onAdd(params.items); + // no need to loop when only one touch + if(touches.length === 1) { + return { + pageX: touches[0].pageX, + pageY: touches[0].pageY, + clientX: touches[0].clientX, + clientY: touches[0].clientY + }; + } + + Utils.each(touches, function(touch) { + pageX.push(touch.pageX); + pageY.push(touch.pageY); + clientX.push(touch.clientX); + clientY.push(touch.clientY); + }); + + return { + pageX: (min.apply(Math, pageX) + max.apply(Math, pageX)) / 2, + pageY: (min.apply(Math, pageY) + max.apply(Math, pageY)) / 2, + clientX: (min.apply(Math, clientX) + max.apply(Math, clientX)) / 2, + clientY: (min.apply(Math, clientY) + max.apply(Math, clientY)) / 2 + }; }, - 'update': function (event, params, senderId) { - me._onUpdate(params.items); + + /** + * calculate the velocity between two points. unit is in px per ms. + * @method getVelocity + * @param {Number} deltaTime + * @param {Number} deltaX + * @param {Number} deltaY + * @return {Object} velocity `x` and `y` + */ + getVelocity: function getVelocity(deltaTime, deltaX, deltaY) { + return { + x: Math.abs(deltaX / deltaTime) || 0, + y: Math.abs(deltaY / deltaTime) || 0 + }; }, - 'remove': function (event, params, senderId) { - me._onRemove(params.items); - } - }; - // listeners for the DataSet of the groups - this.groupListeners = { - 'add': function (event, params, senderId) { - me._onAddGroups(params.items); + /** + * calculate the angle between two coordinates + * @method getAngle + * @param {Touch} touch1 + * @param {Touch} touch2 + * @return {Number} angle + */ + getAngle: function getAngle(touch1, touch2) { + var x = touch2.clientX - touch1.clientX, + y = touch2.clientY - touch1.clientY; + + return Math.atan2(y, x) * 180 / Math.PI; }, - 'update': function (event, params, senderId) { - me._onUpdateGroups(params.items); + + /** + * do a small comparision to get the direction between two touches. + * @method getDirection + * @param {Touch} touch1 + * @param {Touch} touch2 + * @return {String} direction matches `DIRECTION_LEFT|RIGHT|UP|DOWN` + */ + getDirection: function getDirection(touch1, touch2) { + var x = Math.abs(touch1.clientX - touch2.clientX), + y = Math.abs(touch1.clientY - touch2.clientY); + + if(x >= y) { + return touch1.clientX - touch2.clientX > 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + return touch1.clientY - touch2.clientY > 0 ? DIRECTION_UP : DIRECTION_DOWN; }, - 'remove': function (event, params, senderId) { - me._onRemoveGroups(params.items); - } - }; - this.items = {}; // object with an Item for every data item - this.selection = []; // list with the ids of all selected nodes - this.lastStart = this.body.range.start; - this.touchParams = {}; // stores properties while dragging + /** + * calculate the distance between two touches + * @method getDistance + * @param {Touch}touch1 + * @param {Touch} touch2 + * @return {Number} distance + */ + getDistance: function getDistance(touch1, touch2) { + var x = touch2.clientX - touch1.clientX, + y = touch2.clientY - touch1.clientY; - this.svgElements = {}; - this.setOptions(options); - this.groupsUsingDefaultStyles = [0]; + return Math.sqrt((x * x) + (y * y)); + }, - this.body.emitter.on("rangechange",function() { - if (me.lastStart != 0) { - var offset = me.body.range.start - me.lastStart; - var range = me.body.range.end - me.body.range.start; - if (me.width != 0) { - var rangePerPixelInv = me.width/range; - var xOffset = offset * rangePerPixelInv; - me.svg.style.left = (-me.width - xOffset) + "px"; + /** + * calculate the scale factor between two touchLists + * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out + * @method getScale + * @param {Array} start array of touches + * @param {Array} end array of touches + * @return {Number} scale + */ + getScale: function getScale(start, end) { + // need two fingers... + if(start.length >= 2 && end.length >= 2) { + return this.getDistance(end[0], end[1]) / this.getDistance(start[0], start[1]); } - } - }); - this.body.emitter.on("rangechanged", function() { - me.lastStart = me.body.range.start; - me.svg.style.left = util.option.asSize(-me.width); - me._updateGraph.apply(me); - }); + return 1; + }, - // create the HTML DOM - this._create(); - this.body.emitter.emit("change"); - } + /** + * calculate the rotation degrees between two touchLists + * @method getRotation + * @param {Array} start array of touches + * @param {Array} end array of touches + * @return {Number} rotation + */ + getRotation: function getRotation(start, end) { + // need two fingers + if(start.length >= 2 && end.length >= 2) { + return this.getAngle(end[1], end[0]) - this.getAngle(start[1], start[0]); + } + return 0; + }, - LineGraph.prototype = new Component(); + /** + * find out if the direction is vertical * + * @method isVertical + * @param {String} direction matches `DIRECTION_UP|DOWN` + * @return {Boolean} is_vertical + */ + isVertical: function isVertical(direction) { + return direction == DIRECTION_UP || direction == DIRECTION_DOWN; + }, - /** - * Create the HTML DOM for the ItemSet - */ - LineGraph.prototype._create = function(){ - var frame = document.createElement('div'); - frame.className = 'LineGraph'; - this.dom.frame = frame; + /** + * set css properties with their prefixes + * @param {HTMLElement} element + * @param {String} prop + * @param {String} value + * @param {Boolean} [toggle=true] + * @return {Boolean} + */ + setPrefixedCss: function setPrefixedCss(element, prop, value, toggle) { + var prefixes = ['', 'Webkit', 'Moz', 'O', 'ms']; + prop = Utils.toCamelCase(prop); + + for(var i = 0; i < prefixes.length; i++) { + var p = prop; + // prefixes + if(prefixes[i]) { + p = prefixes[i] + p.slice(0, 1).toUpperCase() + p.slice(1); + } + + // test the style + if(p in element.style) { + element.style[p] = (toggle == null || toggle) && value || ''; + break; + } + } + }, - // create svg element for graph drawing. - this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); - this.svg.style.position = "relative"; - this.svg.style.height = ('' + this.options.graphHeight).replace("px",'') + 'px'; - this.svg.style.display = "block"; - frame.appendChild(this.svg); + /** + * toggle browser default behavior by setting css properties. + * `userSelect='none'` also sets `element.onselectstart` to false + * `userDrag='none'` also sets `element.ondragstart` to false + * + * @method toggleBehavior + * @param {HtmlElement} element + * @param {Object} props + * @param {Boolean} [toggle=true] + */ + toggleBehavior: function toggleBehavior(element, props, toggle) { + if(!props || !element || !element.style) { + return; + } - // data axis - this.options.dataAxis.orientation = 'left'; - this.yAxisLeft = new DataAxis(this.body, this.options.dataAxis, this.svg); + // set the css properties + Utils.each(props, function(value, prop) { + Utils.setPrefixedCss(element, prop, value, toggle); + }); - this.options.dataAxis.orientation = 'right'; - this.yAxisRight = new DataAxis(this.body, this.options.dataAxis, this.svg); - delete this.options.dataAxis.orientation; + var falseFn = toggle && function() { + return false; + }; - // legends - this.legendLeft = new Legend(this.body, this.options.legend, 'left'); - this.legendRight = new Legend(this.body, this.options.legend, 'right'); + // also the disable onselectstart + if(props.userSelect == 'none') { + element.onselectstart = falseFn; + } + // and disable ondragstart + if(props.userDrag == 'none') { + element.ondragstart = falseFn; + } + }, - this.show(); + /** + * convert a string with underscores to camelCase + * so prevent_default becomes preventDefault + * @param {String} str + * @return {String} camelCaseStr + */ + toCamelCase: function toCamelCase(str) { + return str.replace(/[_-]([a-z])/g, function(s) { + return s[1].toUpperCase(); + }); + } }; + /** - * set the options of the LineGraph. the mergeOptions is used for subObjects that have an enabled element. - * @param options + * @module hammer */ - LineGraph.prototype.setOptions = function(options) { - if (options) { - var fields = ['sampling','defaultGroup','graphHeight','yAxisOrientation','style','barChart','dataAxis','sort','groups']; - util.selectiveDeepExtend(fields, this.options, options); - util.mergeOptions(this.options, options,'catmullRom'); - util.mergeOptions(this.options, options,'drawPoints'); - util.mergeOptions(this.options, options,'shaded'); - util.mergeOptions(this.options, options,'legend'); + /** + * @class Event + * @static + */ + var Event = Hammer.event = { + /** + * when touch events have been fired, this is true + * this is used to stop mouse events + * @property prevent_mouseevents + * @private + * @type {Boolean} + */ + preventMouseEvents: false, - if (options.catmullRom) { - if (typeof options.catmullRom == 'object') { - if (options.catmullRom.parametrization) { - if (options.catmullRom.parametrization == 'uniform') { - this.options.catmullRom.alpha = 0; - } - else if (options.catmullRom.parametrization == 'chordal') { - this.options.catmullRom.alpha = 1.0; - } - else { - this.options.catmullRom.parametrization = 'centripetal'; - this.options.catmullRom.alpha = 0.5; - } - } - } - } + /** + * if EVENT_START has been fired + * @property started + * @private + * @type {Boolean} + */ + started: false, - if (this.yAxisLeft) { - if (options.dataAxis !== undefined) { - this.yAxisLeft.setOptions(this.options.dataAxis); - this.yAxisRight.setOptions(this.options.dataAxis); - } - } + /** + * when the mouse is hold down, this is true + * @property should_detect + * @private + * @type {Boolean} + */ + shouldDetect: false, - if (this.legendLeft) { - if (options.legend !== undefined) { - this.legendLeft.setOptions(this.options.legend); - this.legendRight.setOptions(this.options.legend); - } - } + /** + * simple event binder with a hook and support for multiple types + * @method on + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + * @param {Function} [hook] + * @param {Object} hook.type + */ + on: function on(element, type, handler, hook) { + var types = type.split(' '); + Utils.each(types, function(type) { + Utils.on(element, type, handler); + hook && hook(type); + }); + }, - if (this.groups.hasOwnProperty(UNGROUPED)) { - this.groups[UNGROUPED].setOptions(options); - } - } - if (this.dom.frame) { - this._updateGraph(); - } - }; + /** + * simple event unbinder with a hook and support for multiple types + * @method off + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + * @param {Function} [hook] + * @param {Object} hook.type + */ + off: function off(element, type, handler, hook) { + var types = type.split(' '); + Utils.each(types, function(type) { + Utils.off(element, type, handler); + hook && hook(type); + }); + }, - /** - * Hide the component from the DOM - */ - LineGraph.prototype.hide = function() { - // remove the frame containing the items - if (this.dom.frame.parentNode) { - this.dom.frame.parentNode.removeChild(this.dom.frame); - } - }; + /** + * the core touch event handler. + * this finds out if we should to detect gestures + * @method onTouch + * @param {HTMLElement} element + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {Function} handler + * @return onTouchHandler {Function} the core event handler + */ + onTouch: function onTouch(element, eventType, handler) { + var self = this; - /** - * Show the component in the DOM (when not already visible). - * @return {Boolean} changed - */ - LineGraph.prototype.show = function() { - // show frame containing the items - if (!this.dom.frame.parentNode) { - this.body.dom.center.appendChild(this.dom.frame); - } - }; + var onTouchHandler = function onTouchHandler(ev) { + var srcType = ev.type.toLowerCase(), + isPointer = Hammer.HAS_POINTEREVENTS, + isMouse = Utils.inStr(srcType, 'mouse'), + triggerType; + // if we are in a mouseevent, but there has been a touchevent triggered in this session + // we want to do nothing. simply break out of the event. + if(isMouse && self.preventMouseEvents) { + return; - /** - * Set items - * @param {vis.DataSet | null} items - */ - LineGraph.prototype.setItems = function(items) { - var me = this, - ids, - oldItemsData = this.itemsData; + // mousebutton must be down + } else if(isMouse && eventType == EVENT_START && ev.button === 0) { + self.preventMouseEvents = false; + self.shouldDetect = true; + } else if(isPointer && eventType == EVENT_START) { + self.shouldDetect = (ev.buttons === 1 || PointerEvent.matchType(POINTER_TOUCH, ev)); + // just a valid start event, but no mouse + } else if(!isMouse && eventType == EVENT_START) { + self.preventMouseEvents = true; + self.shouldDetect = true; + } - // replace the dataset - if (!items) { - this.itemsData = null; - } - else if (items instanceof DataSet || items instanceof DataView) { - this.itemsData = items; - } - else { - throw new TypeError('Data must be an instance of DataSet or DataView'); - } + // update the pointer event before entering the detection + if(isPointer && eventType != EVENT_END) { + PointerEvent.updatePointer(eventType, ev); + } - if (oldItemsData) { - // unsubscribe from old dataset - util.forEach(this.itemListeners, function (callback, event) { - oldItemsData.off(event, callback); - }); + // we are in a touch/down state, so allowed detection of gestures + if(self.shouldDetect) { + triggerType = self.doDetect.call(self, ev, eventType, element, handler); + } - // remove all drawn items - ids = oldItemsData.getIds(); - this._onRemove(ids); - } + // ...and we are done with the detection + // so reset everything to start each detection totally fresh + if(triggerType == EVENT_END) { + self.preventMouseEvents = false; + self.shouldDetect = false; + PointerEvent.reset(); + // update the pointerevent object after the detection + } - if (this.itemsData) { - // subscribe to new dataset - var id = this.id; - util.forEach(this.itemListeners, function (callback, event) { - me.itemsData.on(event, callback, id); - }); + if(isPointer && eventType == EVENT_END) { + PointerEvent.updatePointer(eventType, ev); + } + }; - // add all new items - ids = this.itemsData.getIds(); - this._onAdd(ids); - } - this._updateUngrouped(); - this._updateGraph(); - this.redraw(); - }; + this.on(element, EVENT_TYPES[eventType], onTouchHandler); + return onTouchHandler; + }, - /** - * Set groups - * @param {vis.DataSet} groups - */ - LineGraph.prototype.setGroups = function(groups) { - var me = this, - ids; + /** + * the core detection method + * this finds out what hammer-touch-events to trigger + * @method doDetect + * @param {Object} ev + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {HTMLElement} element + * @param {Function} handler + * @return {String} triggerType matches `EVENT_START|MOVE|END` + */ + doDetect: function doDetect(ev, eventType, element, handler) { + var touchList = this.getTouchList(ev, eventType); + var touchListLength = touchList.length; + var triggerType = eventType; + var triggerChange = touchList.trigger; // used by fakeMultitouch plugin + var changedLength = touchListLength; - // unsubscribe from current dataset - if (this.groupsData) { - util.forEach(this.groupListeners, function (callback, event) { - me.groupsData.unsubscribe(event, callback); - }); + // at each touchstart-like event we want also want to trigger a TOUCH event... + if(eventType == EVENT_START) { + triggerChange = EVENT_TOUCH; + // ...the same for a touchend-like event + } else if(eventType == EVENT_END) { + triggerChange = EVENT_RELEASE; - // remove all drawn groups - ids = this.groupsData.getIds(); - this.groupsData = null; - this._onRemoveGroups(ids); // note: this will cause a redraw - } + // keep track of how many touches have been removed + changedLength = touchList.length - ((ev.changedTouches) ? ev.changedTouches.length : 1); + } - // replace the dataset - if (!groups) { - this.groupsData = null; - } - else if (groups instanceof DataSet || groups instanceof DataView) { - this.groupsData = groups; - } - else { - throw new TypeError('Data must be an instance of DataSet or DataView'); - } + // after there are still touches on the screen, + // we just want to trigger a MOVE event. so change the START or END to a MOVE + // but only after detection has been started, the first time we actualy want a START + if(changedLength > 0 && this.started) { + triggerType = EVENT_MOVE; + } - if (this.groupsData) { - // subscribe to new dataset - var id = this.id; - util.forEach(this.groupListeners, function (callback, event) { - me.groupsData.on(event, callback, id); - }); + // detection has been started, we keep track of this, see above + this.started = true; - // draw all ms - ids = this.groupsData.getIds(); - this._onAddGroups(ids); - } - this._onUpdate(); - }; + // generate some event data, some basic information + var evData = this.collectEventData(element, triggerType, touchList, ev); + // trigger the triggerType event before the change (TOUCH, RELEASE) events + // but the END event should be at last + if(eventType != EVENT_END) { + handler.call(Detection, evData); + } - /** - * Update the datapoints - * @param [ids] - * @private - */ - LineGraph.prototype._onUpdate = function(ids) { - this._updateUngrouped(); - this._updateAllGroupData(); - this._updateGraph(); - this.redraw(); - }; - LineGraph.prototype._onAdd = function (ids) {this._onUpdate(ids);}; - LineGraph.prototype._onRemove = function (ids) {this._onUpdate(ids);}; - LineGraph.prototype._onUpdateGroups = function (groupIds) { - for (var i = 0; i < groupIds.length; i++) { - var group = this.groupsData.get(groupIds[i]); - this._updateGroup(group, groupIds[i]); - } + // trigger a change (TOUCH, RELEASE) event, this means the length of the touches changed + if(triggerChange) { + evData.changedLength = changedLength; + evData.eventType = triggerChange; - this._updateGraph(); - this.redraw(); - }; - LineGraph.prototype._onAddGroups = function (groupIds) {this._onUpdateGroups(groupIds);}; + handler.call(Detection, evData); - LineGraph.prototype._onRemoveGroups = function (groupIds) { - for (var i = 0; i < groupIds.length; i++) { - if (!this.groups.hasOwnProperty(groupIds[i])) { - if (this.groups[groupIds[i]].options.yAxisOrientation == 'right') { - this.yAxisRight.removeGroup(groupIds[i]); - this.legendRight.removeGroup(groupIds[i]); - this.legendRight.redraw(); - } - else { - this.yAxisLeft.removeGroup(groupIds[i]); - this.legendLeft.removeGroup(groupIds[i]); - this.legendLeft.redraw(); - } - delete this.groups[groupIds[i]]; - } - } - this._updateUngrouped(); - this._updateGraph(); - this.redraw(); - }; + evData.eventType = triggerType; + delete evData.changedLength; + } - /** - * update a group object - * - * @param group - * @param groupId - * @private - */ - LineGraph.prototype._updateGroup = function (group, groupId) { - if (!this.groups.hasOwnProperty(groupId)) { - this.groups[groupId] = new GraphGroup(group, groupId, this.options, this.groupsUsingDefaultStyles); - if (this.groups[groupId].options.yAxisOrientation == 'right') { - this.yAxisRight.addGroup(groupId, this.groups[groupId]); - this.legendRight.addGroup(groupId, this.groups[groupId]); - } - else { - this.yAxisLeft.addGroup(groupId, this.groups[groupId]); - this.legendLeft.addGroup(groupId, this.groups[groupId]); - } - } - else { - this.groups[groupId].update(group); - if (this.groups[groupId].options.yAxisOrientation == 'right') { - this.yAxisRight.updateGroup(groupId, this.groups[groupId]); - this.legendRight.updateGroup(groupId, this.groups[groupId]); - } - else { - this.yAxisLeft.updateGroup(groupId, this.groups[groupId]); - this.legendLeft.updateGroup(groupId, this.groups[groupId]); - } - } - this.legendLeft.redraw(); - this.legendRight.redraw(); - }; + // trigger the END event + if(triggerType == EVENT_END) { + handler.call(Detection, evData); - LineGraph.prototype._updateAllGroupData = function () { - if (this.itemsData != null) { - var groupsContent = {}; - var groupId; - for (groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - groupsContent[groupId] = []; - } - } - for (var itemId in this.itemsData._data) { - if (this.itemsData._data.hasOwnProperty(itemId)) { - var item = this.itemsData._data[itemId]; - item.x = util.convert(item.x,"Date"); - groupsContent[item.group].push(item); - } - } - for (groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - this.groups[groupId].setItems(groupsContent[groupId]); - } - } - } - }; + // ...and we are done with the detection + // so reset everything to start each detection totally fresh + this.started = false; + } - /** - * Create or delete the group holding all ungrouped items. This group is used when - * there are no groups specified. This anonymous group is called 'graph'. - * @protected - */ - LineGraph.prototype._updateUngrouped = function() { - if (this.itemsData != null) { - // var t0 = new Date(); - var group = {id: UNGROUPED, content: this.options.defaultGroup}; - this._updateGroup(group, UNGROUPED); - var ungroupedCounter = 0; - if (this.itemsData) { - for (var itemId in this.itemsData._data) { - if (this.itemsData._data.hasOwnProperty(itemId)) { - var item = this.itemsData._data[itemId]; - if (item != undefined) { - if (item.hasOwnProperty('group')) { - if (item.group === undefined) { - item.group = UNGROUPED; - } - } - else { - item.group = UNGROUPED; + return triggerType; + }, + + /** + * we have different events for each device/browser + * determine what we need and set them in the EVENT_TYPES constant + * the `onTouch` method is bind to these properties. + * @method determineEventTypes + * @return {Object} events + */ + determineEventTypes: function determineEventTypes() { + var types; + if(Hammer.HAS_POINTEREVENTS) { + if(window.PointerEvent) { + types = [ + 'pointerdown', + 'pointermove', + 'pointerup pointercancel lostpointercapture' + ]; + } else { + types = [ + 'MSPointerDown', + 'MSPointerMove', + 'MSPointerUp MSPointerCancel MSLostPointerCapture' + ]; } - ungroupedCounter = item.group == UNGROUPED ? ungroupedCounter + 1 : ungroupedCounter; - } + } else if(Hammer.NO_MOUSEEVENTS) { + types = [ + 'touchstart', + 'touchmove', + 'touchend touchcancel' + ]; + } else { + types = [ + 'touchstart mousedown', + 'touchmove mousemove', + 'touchend touchcancel mouseup' + ]; } - } - } - if (ungroupedCounter == 0) { - delete this.groups[UNGROUPED]; - this.legendLeft.removeGroup(UNGROUPED); - this.legendRight.removeGroup(UNGROUPED); - this.yAxisLeft.removeGroup(UNGROUPED); - this.yAxisRight.removeGroup(UNGROUPED); - } - } - else { - delete this.groups[UNGROUPED]; - this.legendLeft.removeGroup(UNGROUPED); - this.legendRight.removeGroup(UNGROUPED); - this.yAxisLeft.removeGroup(UNGROUPED); - this.yAxisRight.removeGroup(UNGROUPED); - } + EVENT_TYPES[EVENT_START] = types[0]; + EVENT_TYPES[EVENT_MOVE] = types[1]; + EVENT_TYPES[EVENT_END] = types[2]; + return EVENT_TYPES; + }, - this.legendLeft.redraw(); - this.legendRight.redraw(); - }; + /** + * create touchList depending on the event + * @method getTouchList + * @param {Object} ev + * @param {String} eventType + * @return {Array} touches + */ + getTouchList: function getTouchList(ev, eventType) { + // get the fake pointerEvent touchlist + if(Hammer.HAS_POINTEREVENTS) { + return PointerEvent.getTouchList(); + } + // get the touchlist + if(ev.touches) { + if(eventType == EVENT_MOVE) { + return ev.touches; + } - /** - * Redraw the component, mandatory function - * @return {boolean} Returns true if the component is resized - */ - LineGraph.prototype.redraw = function() { - var resized = false; + var identifiers = []; + var concat = [].concat(Utils.toArray(ev.touches), Utils.toArray(ev.changedTouches)); + var touchList = []; - this.svg.style.height = ('' + this.options.graphHeight).replace('px','') + 'px'; - if (this.lastWidth === undefined && this.width || this.lastWidth != this.width) { - resized = true; - } - // check if this component is resized - resized = this._isResized() || resized; - // check whether zoomed (in that case we need to re-stack everything) - var visibleInterval = this.body.range.end - this.body.range.start; - var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.width != this.lastWidth); - this.lastVisibleInterval = visibleInterval; - this.lastWidth = this.width; + Utils.each(concat, function(touch) { + if(Utils.inArray(identifiers, touch.identifier) === false) { + touchList.push(touch); + } + identifiers.push(touch.identifier); + }); - // calculate actual size and position - this.width = this.dom.frame.offsetWidth; + return touchList; + } - // the svg element is three times as big as the width, this allows for fully dragging left and right - // without reloading the graph. the controls for this are bound to events in the constructor - if (resized == true) { - this.svg.style.width = util.option.asSize(3*this.width); - this.svg.style.left = util.option.asSize(-this.width); - } - if (zoomed == true || this.abortedGraphUpdate == true) { - this._updateGraph(); - } + // make fake touchList from mouse position + ev.identifier = 1; + return [ev]; + }, - this.legendLeft.redraw(); - this.legendRight.redraw(); + /** + * collect basic event data + * @method collectEventData + * @param {HTMLElement} element + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {Array} touches + * @param {Object} ev + * @return {Object} ev + */ + collectEventData: function collectEventData(element, eventType, touches, ev) { + // find out pointerType + var pointerType = POINTER_TOUCH; + if(Utils.inStr(ev.type, 'mouse') || PointerEvent.matchType(POINTER_MOUSE, ev)) { + pointerType = POINTER_MOUSE; + } else if(PointerEvent.matchType(POINTER_PEN, ev)) { + pointerType = POINTER_PEN; + } - return resized; + return { + center: Utils.getCenter(touches), + timeStamp: Date.now(), + target: ev.target, + touches: touches, + eventType: eventType, + pointerType: pointerType, + srcEvent: ev, + + /** + * prevent the browser default actions + * mostly used to disable scrolling of the browser + */ + preventDefault: function() { + var srcEvent = this.srcEvent; + srcEvent.preventManipulation && srcEvent.preventManipulation(); + srcEvent.preventDefault && srcEvent.preventDefault(); + }, + + /** + * stop bubbling the event up to its parents + */ + stopPropagation: function() { + this.srcEvent.stopPropagation(); + }, + + /** + * immediately stop gesture detection + * might be useful after a swipe was detected + * @return {*} + */ + stopDetect: function() { + return Detection.stopDetect(); + } + }; + } }; + /** - * Update and redraw the graph. + * @module hammer * + * @class PointerEvent + * @static */ - LineGraph.prototype._updateGraph = function () { - // reset the svg elements - DOMutil.prepareElements(this.svgElements); - if (this.width != 0 && this.itemsData != null) { - var group, i; - var preprocessedGroupData = {}; - var processedGroupData = {}; - var groupRanges = {}; - var changeCalled = false; - - // getting group Ids - var groupIds = []; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - group = this.groups[groupId]; - if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) { - groupIds.push(groupId); - } - } - } - if (groupIds.length > 0) { - // this is the range of the SVG canvas - var minDate = this.body.util.toGlobalTime(- this.body.domProps.root.width); - var maxDate = this.body.util.toGlobalTime(2 * this.body.domProps.root.width); - var groupsData = {}; - // fill groups data - this._getRelevantData(groupIds, groupsData, minDate, maxDate); - // we transform the X coordinates to detect collisions - for (i = 0; i < groupIds.length; i++) { - preprocessedGroupData[groupIds[i]] = this._convertXcoordinates(groupsData[groupIds[i]]); - } - // now all needed data has been collected we start the processing. - this._getYRanges(groupIds, preprocessedGroupData, groupRanges); - - // update the Y axis first, we use this data to draw at the correct Y points - // changeCalled is required to clean the SVG on a change emit. - changeCalled = this._updateYAxis(groupIds, groupRanges); - if (changeCalled == true) { - DOMutil.cleanupElements(this.svgElements); - this.abortedGraphUpdate = true; - this.body.emitter.emit("change"); - return; - } - this.abortedGraphUpdate = false; + var PointerEvent = Hammer.PointerEvent = { + /** + * holds all pointers, by `identifier` + * @property pointers + * @type {Object} + */ + pointers: {}, - // With the yAxis scaled correctly, use this to get the Y values of the points. - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - processedGroupData[groupIds[i]] = this._convertYcoordinates(groupsData[groupIds[i]], group); - } + /** + * get the pointers as an array + * @method getTouchList + * @return {Array} touchlist + */ + getTouchList: function getTouchList() { + var touchlist = []; + // we can use forEach since pointerEvents only is in IE10 + Utils.each(this.pointers, function(pointer) { + touchlist.push(pointer); + }); + return touchlist; + }, + /** + * update the position of a pointer + * @method updatePointer + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {Object} pointerEvent + */ + updatePointer: function updatePointer(eventType, pointerEvent) { + if(eventType == EVENT_END || (eventType != EVENT_END && pointerEvent.buttons !== 1)) { + delete this.pointers[pointerEvent.pointerId]; + } else { + pointerEvent.identifier = pointerEvent.pointerId; + this.pointers[pointerEvent.pointerId] = pointerEvent; + } + }, - // draw the groups - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - if (group.options.style == 'line') { - this._drawLineGraph(processedGroupData[groupIds[i]], group); + /** + * check if ev matches pointertype + * @method matchType + * @param {String} pointerType matches `POINTER_MOUSE|TOUCH|PEN` + * @param {PointerEvent} ev + */ + matchType: function matchType(pointerType, ev) { + if(!ev.pointerType) { + return false; } - } - this._drawBarGraphs(groupIds, processedGroupData); - } - } - // cleanup unused svg elements - DOMutil.cleanupElements(this.svgElements); - }; + var pt = ev.pointerType, + types = {}; + types[POINTER_MOUSE] = (pt === (ev.MSPOINTER_TYPE_MOUSE || POINTER_MOUSE)); + types[POINTER_TOUCH] = (pt === (ev.MSPOINTER_TYPE_TOUCH || POINTER_TOUCH)); + types[POINTER_PEN] = (pt === (ev.MSPOINTER_TYPE_PEN || POINTER_PEN)); + return types[pointerType]; + }, - LineGraph.prototype._getRelevantData = function (groupIds, groupsData, minDate, maxDate) { - // first select and preprocess the data from the datasets. - // the groups have their preselection of data, we now loop over this data to see - // what data we need to draw. Sorted data is much faster. - // more optimization is possible by doing the sampling before and using the binary search - // to find the end date to determine the increment. - var group, i, j, item; - if (groupIds.length > 0) { - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - groupsData[groupIds[i]] = []; - var dataContainer = groupsData[groupIds[i]]; - // optimization for sorted data - if (group.options.sort == true) { - var guess = Math.max(0, util.binarySearchGeneric(group.itemsData, minDate, 'x', 'before')); - for (j = guess; j < group.itemsData.length; j++) { - item = group.itemsData[j]; - if (item !== undefined) { - if (item.x > maxDate) { - dataContainer.push(item); - break; - } - else { - dataContainer.push(item); - } - } - } - } - else { - for (j = 0; j < group.itemsData.length; j++) { - item = group.itemsData[j]; - if (item !== undefined) { - if (item.x > minDate && item.x < maxDate) { - dataContainer.push(item); - } - } - } - } + /** + * reset the stored pointers + * @method reset + */ + reset: function resetList() { + this.pointers = {}; } - } - - this._applySampling(groupIds, groupsData); }; - LineGraph.prototype._applySampling = function (groupIds, groupsData) { - var group; - if (groupIds.length > 0) { - for (var i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - if (group.options.sampling == true) { - var dataContainer = groupsData[groupIds[i]]; - if (dataContainer.length > 0) { - var increment = 1; - var amountOfPoints = dataContainer.length; - // the global screen is used because changing the width of the yAxis may affect the increment, resulting in an endless loop - // of width changing of the yAxis. - var xDistance = this.body.util.toGlobalScreen(dataContainer[dataContainer.length - 1].x) - this.body.util.toGlobalScreen(dataContainer[0].x); - var pointsPerPixel = amountOfPoints / xDistance; - increment = Math.min(Math.ceil(0.2 * amountOfPoints), Math.max(1, Math.round(pointsPerPixel))); + /** + * @module hammer + * + * @class Detection + * @static + */ + var Detection = Hammer.detection = { + // contains all registred Hammer.gestures in the correct order + gestures: [], - var sampledData = []; - for (var j = 0; j < amountOfPoints; j += increment) { - sampledData.push(dataContainer[j]); + // data of the current Hammer.gesture detection session + current: null, - } - groupsData[groupIds[i]] = sampledData; - } - } - } - } - }; + // the previous Hammer.gesture session data + // is a full clone of the previous gesture.current object + previous: null, - LineGraph.prototype._getYRanges = function (groupIds, groupsData, groupRanges) { - var groupData, group, i,j; - var barCombinedDataLeft = []; - var barCombinedDataRight = []; - var barCombinedData; - if (groupIds.length > 0) { - for (i = 0; i < groupIds.length; i++) { - groupData = groupsData[groupIds[i]]; - if (groupData.length > 0) { - group = this.groups[groupIds[i]]; - if (group.options.style == 'line' || group.options.barChart.handleOverlap != "stack") { - var yMin = groupData[0].y; - var yMax = groupData[0].y; - for (j = 0; j < groupData.length; j++) { - yMin = yMin > groupData[j].y ? groupData[j].y : yMin; - yMax = yMax < groupData[j].y ? groupData[j].y : yMax; - } - groupRanges[groupIds[i]] = {min: yMin, max: yMax, yAxisOrientation: group.options.yAxisOrientation}; + // when this becomes true, no gestures are fired + stopped: false, + + /** + * start Hammer.gesture detection + * @method startDetect + * @param {Hammer.Instance} inst + * @param {Object} eventData + */ + startDetect: function startDetect(inst, eventData) { + // already busy with a Hammer.gesture detection on an element + if(this.current) { + return; } - else if (group.options.style == 'bar') { - if (group.options.yAxisOrientation == 'left') { - barCombinedData = barCombinedDataLeft; - } - else { - barCombinedData = barCombinedDataRight; - } - groupRanges[groupIds[i]] = {min: 0, max: 0, yAxisOrientation: group.options.yAxisOrientation, ignore: true}; + this.stopped = false; - // combine data - for (j = 0; j < groupData.length; j++) { - barCombinedData.push({ - x: groupData[j].x, - y: groupData[j].y, - groupId: groupIds[i] - }); - } + // holds current session + this.current = { + inst: inst, // reference to HammerInstance we're working for + startEvent: Utils.extend({}, eventData), // start eventData for distances, timing etc + lastEvent: false, // last eventData + lastCalcEvent: false, // last eventData for calculations. + futureCalcEvent: false, // last eventData for calculations. + lastCalcData: {}, // last lastCalcData + name: '' // current gesture we're in/detected, can be 'tap', 'hold' etc + }; + + this.detect(eventData); + }, + + /** + * Hammer.gesture detection + * @method detect + * @param {Object} eventData + * @return {any} + */ + detect: function detect(eventData) { + if(!this.current || this.stopped) { + return; } - } - } - var intersections; - if (barCombinedDataLeft.length > 0) { - // sort by time and by group - barCombinedDataLeft.sort(function (a, b) { - if (a.x == b.x) { - return a.groupId - b.groupId; - } else { - return a.x - b.x; + // extend event data with calculations about scale, distance etc + eventData = this.extendEventData(eventData); + + // hammer instance and instance options + var inst = this.current.inst, + instOptions = inst.options; + + // call Hammer.gesture handlers + Utils.each(this.gestures, function triggerGesture(gesture) { + // only when the instance options have enabled this gesture + if(!this.stopped && inst.enabled && instOptions[gesture.name]) { + gesture.handler.call(gesture, eventData, inst); + } + }, this); + + // store as previous event event + if(this.current) { + this.current.lastEvent = eventData; } - }); - intersections = {}; - this._getDataIntersections(intersections, barCombinedDataLeft); - groupRanges["__barchartLeft"] = this._getStackedBarYRange(intersections, barCombinedDataLeft); - groupRanges["__barchartLeft"].yAxisOrientation = "left"; - groupIds.push("__barchartLeft"); - } - if (barCombinedDataRight.length > 0) { - // sort by time and by group - barCombinedDataRight.sort(function (a, b) { - if (a.x == b.x) { - return a.groupId - b.groupId; - } else { - return a.x - b.x; + + if(eventData.eventType == EVENT_END) { + this.stopDetect(); } - }); - intersections = {}; - this._getDataIntersections(intersections, barCombinedDataRight); - groupRanges["__barchartRight"] = this._getStackedBarYRange(intersections, barCombinedDataRight); - groupRanges["__barchartRight"].yAxisOrientation = "right"; - groupIds.push("__barchartRight"); - } - } - }; - LineGraph.prototype._getStackedBarYRange = function (intersections, combinedData) { - var key; - var yMin = combinedData[0].y; - var yMax = combinedData[0].y; - for (var i = 0; i < combinedData.length; i++) { - key = combinedData[i].x; - if (intersections[key] === undefined) { - yMin = yMin > combinedData[i].y ? combinedData[i].y : yMin; - yMax = yMax < combinedData[i].y ? combinedData[i].y : yMax; - } - else { - intersections[key].accumulated += combinedData[i].y; - } - } - for (var xpos in intersections) { - if (intersections.hasOwnProperty(xpos)) { - yMin = yMin > intersections[xpos].accumulated ? intersections[xpos].accumulated : yMin; - yMax = yMax < intersections[xpos].accumulated ? intersections[xpos].accumulated : yMax; - } - } + return eventData; + }, + + /** + * clear the Hammer.gesture vars + * this is called on endDetect, but can also be used when a final Hammer.gesture has been detected + * to stop other Hammer.gestures from being fired + * @method stopDetect + */ + stopDetect: function stopDetect() { + // clone current data to the store as the previous gesture + // used for the double tap gesture, since this is an other gesture detect session + this.previous = Utils.extend({}, this.current); - return {min: yMin, max: yMax}; - }; + // reset the current + this.current = null; + this.stopped = true; + }, + /** + * calculate velocity, angle and direction + * @method getVelocityData + * @param {Object} ev + * @param {Object} center + * @param {Number} deltaTime + * @param {Number} deltaX + * @param {Number} deltaY + */ + getCalculatedData: function getCalculatedData(ev, center, deltaTime, deltaX, deltaY) { + var cur = this.current, + recalc = false, + calcEv = cur.lastCalcEvent, + calcData = cur.lastCalcData; - /** - * this sets the Y ranges for the Y axis. It also determines which of the axis should be shown or hidden. - * @param {Array} groupIds - * @param {Object} groupRanges - * @private - */ - LineGraph.prototype._updateYAxis = function (groupIds, groupRanges) { - var changeCalled = false; - var yAxisLeftUsed = false; - var yAxisRightUsed = false; - var minLeft = 1e9, minRight = 1e9, maxLeft = -1e9, maxRight = -1e9, minVal, maxVal; - // if groups are present - if (groupIds.length > 0) { - for (var i = 0; i < groupIds.length; i++) { - if (groupRanges.hasOwnProperty(groupIds[i])) { - if (groupRanges[groupIds[i]].ignore !== true) { - minVal = groupRanges[groupIds[i]].min; - maxVal = groupRanges[groupIds[i]].max; + if(calcEv && ev.timeStamp - calcEv.timeStamp > Hammer.CALCULATE_INTERVAL) { + center = calcEv.center; + deltaTime = ev.timeStamp - calcEv.timeStamp; + deltaX = ev.center.clientX - calcEv.center.clientX; + deltaY = ev.center.clientY - calcEv.center.clientY; + recalc = true; + } - if (groupRanges[groupIds[i]].yAxisOrientation == 'left') { - yAxisLeftUsed = true; - minLeft = minLeft > minVal ? minVal : minLeft; - maxLeft = maxLeft < maxVal ? maxVal : maxLeft; - } - else { - yAxisRightUsed = true; - minRight = minRight > minVal ? minVal : minRight; - maxRight = maxRight < maxVal ? maxVal : maxRight; - } + if(ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) { + cur.futureCalcEvent = ev; } - } - } - if (yAxisLeftUsed == true) { - this.yAxisLeft.setRange(minLeft, maxLeft); - } - if (yAxisRightUsed == true) { - this.yAxisRight.setRange(minRight, maxRight); - } - } + if(!cur.lastCalcEvent || recalc) { + calcData.velocity = Utils.getVelocity(deltaTime, deltaX, deltaY); + calcData.angle = Utils.getAngle(center, ev.center); + calcData.direction = Utils.getDirection(center, ev.center); - changeCalled = this._toggleAxisVisiblity(yAxisLeftUsed , this.yAxisLeft) || changeCalled; - changeCalled = this._toggleAxisVisiblity(yAxisRightUsed, this.yAxisRight) || changeCalled; + cur.lastCalcEvent = cur.futureCalcEvent || ev; + cur.futureCalcEvent = ev; + } - if (yAxisRightUsed == true && yAxisLeftUsed == true) { - this.yAxisLeft.drawIcons = true; - this.yAxisRight.drawIcons = true; - } - else { - this.yAxisLeft.drawIcons = false; - this.yAxisRight.drawIcons = false; - } + ev.velocityX = calcData.velocity.x; + ev.velocityY = calcData.velocity.y; + ev.interimAngle = calcData.angle; + ev.interimDirection = calcData.direction; + }, - this.yAxisRight.master = !yAxisLeftUsed; + /** + * extend eventData for Hammer.gestures + * @method extendEventData + * @param {Object} ev + * @return {Object} ev + */ + extendEventData: function extendEventData(ev) { + var cur = this.current, + startEv = cur.startEvent, + lastEv = cur.lastEvent || startEv; - if (this.yAxisRight.master == false) { - if (yAxisRightUsed == true) {this.yAxisLeft.lineOffset = this.yAxisRight.width;} - else {this.yAxisLeft.lineOffset = 0;} + // update the start touchlist to calculate the scale/rotation + if(ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) { + startEv.touches = []; + Utils.each(ev.touches, function(touch) { + startEv.touches.push({ + clientX: touch.clientX, + clientY: touch.clientY + }); + }); + } - changeCalled = this.yAxisLeft.redraw() || changeCalled; - this.yAxisRight.stepPixelsForced = this.yAxisLeft.stepPixels; - changeCalled = this.yAxisRight.redraw() || changeCalled; - } - else { - changeCalled = this.yAxisRight.redraw() || changeCalled; - } + var deltaTime = ev.timeStamp - startEv.timeStamp, + deltaX = ev.center.clientX - startEv.center.clientX, + deltaY = ev.center.clientY - startEv.center.clientY; - // clean the accumulated lists - if (groupIds.indexOf("__barchartLeft") != -1) { - groupIds.splice(groupIds.indexOf("__barchartLeft"),1); - } - if (groupIds.indexOf("__barchartRight") != -1) { - groupIds.splice(groupIds.indexOf("__barchartRight"),1); - } + this.getCalculatedData(ev, lastEv.center, deltaTime, deltaX, deltaY); - return changeCalled; - }; + Utils.extend(ev, { + startEvent: startEv, - /** - * This shows or hides the Y axis if needed. If there is a change, the changed event is emitted by the updateYAxis function - * - * @param {boolean} axisUsed - * @returns {boolean} - * @private - * @param axis - */ - LineGraph.prototype._toggleAxisVisiblity = function (axisUsed, axis) { - var changed = false; - if (axisUsed == false) { - if (axis.dom.frame.parentNode) { - axis.hide(); - changed = true; - } - } - else { - if (!axis.dom.frame.parentNode) { - axis.show(); - changed = true; - } - } - return changed; - }; + deltaTime: deltaTime, + deltaX: deltaX, + deltaY: deltaY, + distance: Utils.getDistance(startEv.center, ev.center), + angle: Utils.getAngle(startEv.center, ev.center), + direction: Utils.getDirection(startEv.center, ev.center), + scale: Utils.getScale(startEv.touches, ev.touches), + rotation: Utils.getRotation(startEv.touches, ev.touches) + }); - /** - * draw a bar graph - * - * @param groupIds - * @param processedGroupData - */ - LineGraph.prototype._drawBarGraphs = function (groupIds, processedGroupData) { - var combinedData = []; - var intersections = {}; - var coreDistance; - var key, drawData; - var group; - var i,j; - var barPoints = 0; + return ev; + }, - // combine all barchart data - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - if (group.options.style == 'bar') { - if (group.visible == true && (this.options.groups.visibility[groupIds[i]] === undefined || this.options.groups.visibility[groupIds[i]] == true)) { - for (j = 0; j < processedGroupData[groupIds[i]].length; j++) { - combinedData.push({ - x: processedGroupData[groupIds[i]][j].x, - y: processedGroupData[groupIds[i]][j].y, - groupId: groupIds[i] - }); - barPoints += 1; + /** + * register new gesture + * @method register + * @param {Object} gesture object, see `gestures/` for documentation + * @return {Array} gestures + */ + register: function register(gesture) { + // add an enable gesture options if there is no given + var options = gesture.defaults || {}; + if(options[gesture.name] === undefined) { + options[gesture.name] = true; } - } - } - } - - if (barPoints == 0) {return;} - - // sort by time and by group - combinedData.sort(function (a, b) { - if (a.x == b.x) { - return a.groupId - b.groupId; - } else { - return a.x - b.x; - } - }); - // get intersections - this._getDataIntersections(intersections, combinedData); + // extend Hammer default options with the Hammer.gesture options + Utils.extend(Hammer.defaults, options, true); - // plot barchart - for (i = 0; i < combinedData.length; i++) { - group = this.groups[combinedData[i].groupId]; - var minWidth = 0.1 * group.options.barChart.width; + // set its index + gesture.index = gesture.index || 1000; - key = combinedData[i].x; - var heightOffset = 0; - if (intersections[key] === undefined) { - if (i+1 < combinedData.length) {coreDistance = Math.abs(combinedData[i+1].x - key);} - if (i > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[i-1].x - key));} - drawData = this._getSafeDrawData(coreDistance, group, minWidth); - } - else { - var nextKey = i + (intersections[key].amount - intersections[key].resolved); - var prevKey = i - (intersections[key].resolved + 1); - if (nextKey < combinedData.length) {coreDistance = Math.abs(combinedData[nextKey].x - key);} - if (prevKey > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[prevKey].x - key));} - drawData = this._getSafeDrawData(coreDistance, group, minWidth); - intersections[key].resolved += 1; + // add Hammer.gesture to the list + this.gestures.push(gesture); - if (group.options.barChart.handleOverlap == 'stack') { - heightOffset = intersections[key].accumulated; - intersections[key].accumulated += group.zeroPosition - combinedData[i].y; - } - else if (group.options.barChart.handleOverlap == 'sideBySide') { - drawData.width = drawData.width / intersections[key].amount; - drawData.offset += (intersections[key].resolved) * drawData.width - (0.5*drawData.width * (intersections[key].amount+1)); - if (group.options.barChart.align == 'left') {drawData.offset -= 0.5*drawData.width;} - else if (group.options.barChart.align == 'right') {drawData.offset += 0.5*drawData.width;} - } - } - DOMutil.drawBar(combinedData[i].x + drawData.offset, combinedData[i].y - heightOffset, drawData.width, group.zeroPosition - combinedData[i].y, group.className + ' bar', this.svgElements, this.svg); - // draw points - if (group.options.drawPoints.enabled == true) { - DOMutil.drawPoint(combinedData[i].x + drawData.offset, combinedData[i].y - heightOffset, group, this.svgElements, this.svg); + // sort the list by index + this.gestures.sort(function(a, b) { + if(a.index < b.index) { + return -1; + } + if(a.index > b.index) { + return 1; + } + return 0; + }); + + return this.gestures; } - } }; + /** - * Fill the intersections object with counters of how many datapoints share the same x coordinates - * @param intersections - * @param combinedData - * @private + * @module hammer */ - LineGraph.prototype._getDataIntersections = function (intersections, combinedData) { - // get intersections - var coreDistance; - for (var i = 0; i < combinedData.length; i++) { - if (i + 1 < combinedData.length) { - coreDistance = Math.abs(combinedData[i + 1].x - combinedData[i].x); - } - if (i > 0) { - coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].x - combinedData[i].x)); - } - if (coreDistance == 0) { - if (intersections[combinedData[i].x] === undefined) { - intersections[combinedData[i].x] = {amount: 0, resolved: 0, accumulated: 0}; - } - intersections[combinedData[i].x].amount += 1; - } - } - }; /** - * Get the width and offset for bargraphs based on the coredistance between datapoints + * create new hammer instance + * all methods should return the instance itself, so it is chainable. * - * @param coreDistance - * @param group - * @param minWidth - * @returns {{width: Number, offset: Number}} - * @private + * @class Instance + * @constructor + * @param {HTMLElement} element + * @param {Object} [options={}] options are merged with `Hammer.defaults` + * @return {Hammer.Instance} */ - LineGraph.prototype._getSafeDrawData = function (coreDistance, group, minWidth) { - var width, offset; - if (coreDistance < group.options.barChart.width && coreDistance > 0) { - width = coreDistance < minWidth ? minWidth : coreDistance; + Hammer.Instance = function(element, options) { + var self = this; - offset = 0; // recalculate offset with the new width; - if (group.options.barChart.align == 'left') { - offset -= 0.5 * coreDistance; - } - else if (group.options.barChart.align == 'right') { - offset += 0.5 * coreDistance; - } - } - else { - // default settings - width = group.options.barChart.width; - offset = 0; - if (group.options.barChart.align == 'left') { - offset -= 0.5 * group.options.barChart.width; - } - else if (group.options.barChart.align == 'right') { - offset += 0.5 * group.options.barChart.width; + // setup HammerJS window events and register all gestures + // this also sets up the default options + setup(); + + /** + * @property element + * @type {HTMLElement} + */ + this.element = element; + + /** + * @property enabled + * @type {Boolean} + * @protected + */ + this.enabled = true; + + /** + * options, merged with the defaults + * options with an _ are converted to camelCase + * @property options + * @type {Object} + */ + Utils.each(options, function(value, name) { + delete options[name]; + options[Utils.toCamelCase(name)] = value; + }); + + this.options = Utils.extend(Utils.extend({}, Hammer.defaults), options || {}); + + // add some css to the element to prevent the browser from doing its native behavoir + if(this.options.behavior) { + Utils.toggleBehavior(this.element, this.options.behavior, true); } - } - return {width: width, offset: offset}; + /** + * event start handler on the element to start the detection + * @property eventStartHandler + * @type {Object} + */ + this.eventStartHandler = Event.onTouch(element, EVENT_START, function(ev) { + if(self.enabled && ev.eventType == EVENT_START) { + Detection.startDetect(self, ev); + } else if(ev.eventType == EVENT_TOUCH) { + Detection.detect(ev); + } + }); + + /** + * keep a list of user event handlers which needs to be removed when calling 'dispose' + * @property eventHandlers + * @type {Array} + */ + this.eventHandlers = []; }; + Hammer.Instance.prototype = { + /** + * bind events to the instance + * @method on + * @chainable + * @param {String} gestures multiple gestures by splitting with a space + * @param {Function} handler + * @param {Object} handler.ev event object + */ + on: function onEvent(gestures, handler) { + var self = this; + Event.on(self.element, gestures, handler, function(type) { + self.eventHandlers.push({ gesture: type, handler: handler }); + }); + return self; + }, - /** - * draw a line graph - * - * @param dataset - * @param group - */ - LineGraph.prototype._drawLineGraph = function (dataset, group) { - if (dataset != null) { - if (dataset.length > 0) { - var path, d; - var svgHeight = Number(this.svg.style.height.replace("px","")); - path = DOMutil.getSVGElement('path', this.svgElements, this.svg); - path.setAttributeNS(null, "class", group.className); + /** + * unbind events to the instance + * @method off + * @chainable + * @param {String} gestures + * @param {Function} handler + */ + off: function offEvent(gestures, handler) { + var self = this; - // construct path from dataset - if (group.options.catmullRom.enabled == true) { - d = this._catmullRom(dataset, group); - } - else { - d = this._linear(dataset); - } + Event.off(self.element, gestures, handler, function(type) { + var index = Utils.inArray({ gesture: type, handler: handler }); + if(index !== false) { + self.eventHandlers.splice(index, 1); + } + }); + return self; + }, - // append with points for fill and finalize the path - if (group.options.shaded.enabled == true) { - var fillPath = DOMutil.getSVGElement('path',this.svgElements, this.svg); - var dFill; - if (group.options.shaded.orientation == 'top') { - dFill = "M" + dataset[0].x + "," + 0 + " " + d + "L" + dataset[dataset.length - 1].x + "," + 0; + /** + * trigger gesture event + * @method trigger + * @chainable + * @param {String} gesture + * @param {Object} [eventData] + */ + trigger: function triggerEvent(gesture, eventData) { + // optional + if(!eventData) { + eventData = {}; } - else { - dFill = "M" + dataset[0].x + "," + svgHeight + " " + d + "L" + dataset[dataset.length - 1].x + "," + svgHeight; + + // create DOM event + var event = Hammer.DOCUMENT.createEvent('Event'); + event.initEvent(gesture, true, true); + event.gesture = eventData; + + // trigger on the target if it is in the instance element, + // this is for event delegation tricks + var element = this.element; + if(Utils.hasParent(eventData.target, element)) { + element = eventData.target; + } + + element.dispatchEvent(event); + return this; + }, + + /** + * enable of disable hammer.js detection + * @method enable + * @chainable + * @param {Boolean} state + */ + enable: function enable(state) { + this.enabled = state; + return this; + }, + + /** + * dispose this hammer instance + * @method dispose + * @return {Null} + */ + dispose: function dispose() { + var i, eh; + + // undo all changes made by stop_browser_behavior + Utils.toggleBehavior(this.element, this.options.behavior, false); + + // unbind all custom event handlers + for(i = -1; (eh = this.eventHandlers[++i]);) { + Utils.off(this.element, eh.gesture, eh.handler); } - fillPath.setAttributeNS(null, "class", group.className + " fill"); - fillPath.setAttributeNS(null, "d", dFill); - } - // copy properties to path for drawing. - path.setAttributeNS(null, "d", "M" + d); - // draw points - if (group.options.drawPoints.enabled == true) { - this._drawPoints(dataset, group, this.svgElements, this.svg); - } + this.eventHandlers = []; + + // unbind the start event listener + Event.off(this.element, EVENT_TYPES[EVENT_START], this.eventStartHandler); + + return null; } - } }; + /** - * draw the data points - * - * @param {Array} dataset - * @param {Object} JSONcontainer - * @param {Object} svg | SVG DOM element - * @param {GraphGroup} group - * @param {Number} [offset] + * @module gestures */ - LineGraph.prototype._drawPoints = function (dataset, group, JSONcontainer, svg, offset) { - if (offset === undefined) {offset = 0;} - for (var i = 0; i < dataset.length; i++) { - DOMutil.drawPoint(dataset[i].x + offset, dataset[i].y, group, JSONcontainer, svg); - } - }; - - - /** - * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the - * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for - * the yAxis. + * Move with x fingers (default 1) around on the page. + * Preventing the default browser behavior is a good way to improve feel and working. + * ```` + * hammertime.on("drag", function(ev) { + * console.log(ev); + * ev.gesture.preventDefault(); + * }); + * ```` * - * @param datapoints - * @returns {Array} - * @private + * @class Drag + * @static + */ + /** + * @event drag + * @param {Object} ev + */ + /** + * @event dragstart + * @param {Object} ev + */ + /** + * @event dragend + * @param {Object} ev + */ + /** + * @event drapleft + * @param {Object} ev + */ + /** + * @event dragright + * @param {Object} ev + */ + /** + * @event dragup + * @param {Object} ev + */ + /** + * @event dragdown + * @param {Object} ev */ - LineGraph.prototype._convertXcoordinates = function (datapoints) { - var extractedData = []; - var xValue, yValue; - var toScreen = this.body.util.toScreen; - - for (var i = 0; i < datapoints.length; i++) { - xValue = toScreen(datapoints[i].x) + this.width - 1; - yValue = datapoints[i].y; - extractedData.push({x: xValue, y: yValue}); - } - - return extractedData; - }; - - /** - * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the - * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for - * the yAxis. - * - * @param datapoints - * @returns {Array} - * @private + * @param {String} name */ - LineGraph.prototype._convertYcoordinates = function (datapoints, group) { - var extractedData = []; - var xValue, yValue; - var toScreen = this.body.util.toScreen; - var axis = this.yAxisLeft; - var svgHeight = Number(this.svg.style.height.replace("px","")); - if (group.options.yAxisOrientation == 'right') { - axis = this.yAxisRight; - } + (function(name) { + var triggered = false; - for (var i = 0; i < datapoints.length; i++) { - xValue = toScreen(datapoints[i].x) + this.width - 1; - yValue = Math.round(axis.convertValue(datapoints[i].y)); - extractedData.push({x: xValue, y: yValue}); - } + function dragGesture(ev, inst) { + var cur = Detection.current; - group.setZeroPosition(Math.min(svgHeight, axis.convertValue(0))); + // max touches + if(inst.options.dragMaxTouches > 0 && + ev.touches.length > inst.options.dragMaxTouches) { + return; + } - return extractedData; - }; + switch(ev.eventType) { + case EVENT_START: + triggered = false; + break; - /** - * This uses an uniform parametrization of the CatmullRom algorithm: - * "On the Parameterization of Catmull-Rom Curves" by Cem Yuksel et al. - * @param data - * @returns {string} - * @private - */ - LineGraph.prototype._catmullRomUniform = function(data) { - // catmull rom - var p0, p1, p2, p3, bp1, bp2; - var d = Math.round(data[0].x) + "," + Math.round(data[0].y) + " "; - var normalization = 1/6; - var length = data.length; - for (var i = 0; i < length - 1; i++) { + case EVENT_MOVE: + // when the distance we moved is too small we skip this gesture + // or we can be already in dragging + if(ev.distance < inst.options.dragMinDistance && + cur.name != name) { + return; + } - p0 = (i == 0) ? data[0] : data[i-1]; - p1 = data[i]; - p2 = data[i+1]; - p3 = (i + 2 < length) ? data[i+2] : p2; + var startCenter = cur.startEvent.center; + // we are dragging! + if(cur.name != name) { + cur.name = name; + if(inst.options.dragDistanceCorrection && ev.distance > 0) { + // When a drag is triggered, set the event center to dragMinDistance pixels from the original event center. + // Without this correction, the dragged distance would jumpstart at dragMinDistance pixels instead of at 0. + // It might be useful to save the original start point somewhere + var factor = Math.abs(inst.options.dragMinDistance / ev.distance); + startCenter.pageX += ev.deltaX * factor; + startCenter.pageY += ev.deltaY * factor; + startCenter.clientX += ev.deltaX * factor; + startCenter.clientY += ev.deltaY * factor; - // Catmull-Rom to Cubic Bezier conversion matrix - // 0 1 0 0 - // -1/6 1 1/6 0 - // 0 1/6 1 -1/6 - // 0 0 1 0 + // recalculate event data using new start point + ev = Detection.extendEventData(ev); + } + } - // bp0 = { x: p1.x, y: p1.y }; - bp1 = { x: ((-p0.x + 6*p1.x + p2.x) *normalization), y: ((-p0.y + 6*p1.y + p2.y) *normalization)}; - bp2 = { x: (( p1.x + 6*p2.x - p3.x) *normalization), y: (( p1.y + 6*p2.y - p3.y) *normalization)}; - // bp0 = { x: p2.x, y: p2.y }; + // lock drag to axis? + if(cur.lastEvent.dragLockToAxis || + ( inst.options.dragLockToAxis && + inst.options.dragLockMinDistance <= ev.distance + )) { + ev.dragLockToAxis = true; + } - d += "C" + - bp1.x + "," + - bp1.y + " " + - bp2.x + "," + - bp2.y + " " + - p2.x + "," + - p2.y + " "; - } + // keep direction on the axis that the drag gesture started on + var lastDirection = cur.lastEvent.direction; + if(ev.dragLockToAxis && lastDirection !== ev.direction) { + if(Utils.isVertical(lastDirection)) { + ev.direction = (ev.deltaY < 0) ? DIRECTION_UP : DIRECTION_DOWN; + } else { + ev.direction = (ev.deltaX < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + } - return d; - }; + // first time, trigger dragstart event + if(!triggered) { + inst.trigger(name + 'start', ev); + triggered = true; + } - /** - * This uses either the chordal or centripetal parameterization of the catmull-rom algorithm. - * By default, the centripetal parameterization is used because this gives the nicest results. - * These parameterizations are relatively heavy because the distance between 4 points have to be calculated. - * - * One optimization can be used to reuse distances since this is a sliding window approach. - * @param data - * @returns {string} - * @private - */ - LineGraph.prototype._catmullRom = function(data, group) { - var alpha = group.options.catmullRom.alpha; - if (alpha == 0 || alpha === undefined) { - return this._catmullRomUniform(data); - } - else { - var p0, p1, p2, p3, bp1, bp2, d1,d2,d3, A, B, N, M; - var d3powA, d2powA, d3pow2A, d2pow2A, d1pow2A, d1powA; - var d = Math.round(data[0].x) + "," + Math.round(data[0].y) + " "; - var length = data.length; - for (var i = 0; i < length - 1; i++) { + // trigger events + inst.trigger(name, ev); + inst.trigger(name + ev.direction, ev); - p0 = (i == 0) ? data[0] : data[i-1]; - p1 = data[i]; - p2 = data[i+1]; - p3 = (i + 2 < length) ? data[i+2] : p2; + var isVertical = Utils.isVertical(ev.direction); - d1 = Math.sqrt(Math.pow(p0.x - p1.x,2) + Math.pow(p0.y - p1.y,2)); - d2 = Math.sqrt(Math.pow(p1.x - p2.x,2) + Math.pow(p1.y - p2.y,2)); - d3 = Math.sqrt(Math.pow(p2.x - p3.x,2) + Math.pow(p2.y - p3.y,2)); + // block the browser events + if((inst.options.dragBlockVertical && isVertical) || + (inst.options.dragBlockHorizontal && !isVertical)) { + ev.preventDefault(); + } + break; + + case EVENT_RELEASE: + if(triggered && ev.changedLength <= inst.options.dragMaxTouches) { + inst.trigger(name + 'end', ev); + triggered = false; + } + break; - // Catmull-Rom to Cubic Bezier conversion matrix - // - // A = 2d1^2a + 3d1^a * d2^a + d3^2a - // B = 2d3^2a + 3d3^a * d2^a + d2^2a - // - // [ 0 1 0 0 ] - // [ -d2^2a/N A/N d1^2a/N 0 ] - // [ 0 d3^2a/M B/M -d2^2a/M ] - // [ 0 0 1 0 ] + case EVENT_END: + triggered = false; + break; + } + } - // [ 0 1 0 0 ] - // [ -d2pow2a/N A/N d1pow2a/N 0 ] - // [ 0 d3pow2a/M B/M -d2pow2a/M ] - // [ 0 0 1 0 ] + Hammer.gestures.Drag = { + name: name, + index: 50, + handler: dragGesture, + defaults: { + /** + * minimal movement that have to be made before the drag event gets triggered + * @property dragMinDistance + * @type {Number} + * @default 10 + */ + dragMinDistance: 10, - d3powA = Math.pow(d3, alpha); - d3pow2A = Math.pow(d3,2*alpha); - d2powA = Math.pow(d2, alpha); - d2pow2A = Math.pow(d2,2*alpha); - d1powA = Math.pow(d1, alpha); - d1pow2A = Math.pow(d1,2*alpha); + /** + * Set dragDistanceCorrection to true to make the starting point of the drag + * be calculated from where the drag was triggered, not from where the touch started. + * Useful to avoid a jerk-starting drag, which can make fine-adjustments + * through dragging difficult, and be visually unappealing. + * @property dragDistanceCorrection + * @type {Boolean} + * @default true + */ + dragDistanceCorrection: true, - A = 2*d1pow2A + 3*d1powA * d2powA + d2pow2A; - B = 2*d3pow2A + 3*d3powA * d2powA + d2pow2A; - N = 3*d1powA * (d1powA + d2powA); - if (N > 0) {N = 1 / N;} - M = 3*d3powA * (d3powA + d2powA); - if (M > 0) {M = 1 / M;} + /** + * set 0 for unlimited, but this can conflict with transform + * @property dragMaxTouches + * @type {Number} + * @default 1 + */ + dragMaxTouches: 1, - bp1 = { x: ((-d2pow2A * p0.x + A*p1.x + d1pow2A * p2.x) * N), - y: ((-d2pow2A * p0.y + A*p1.y + d1pow2A * p2.y) * N)}; + /** + * prevent default browser behavior when dragging occurs + * be careful with it, it makes the element a blocking element + * when you are using the drag gesture, it is a good practice to set this true + * @property dragBlockHorizontal + * @type {Boolean} + * @default false + */ + dragBlockHorizontal: false, - bp2 = { x: (( d3pow2A * p1.x + B*p2.x - d2pow2A * p3.x) * M), - y: (( d3pow2A * p1.y + B*p2.y - d2pow2A * p3.y) * M)}; + /** + * same as `dragBlockHorizontal`, but for vertical movement + * @property dragBlockVertical + * @type {Boolean} + * @default false + */ + dragBlockVertical: false, - if (bp1.x == 0 && bp1.y == 0) {bp1 = p1;} - if (bp2.x == 0 && bp2.y == 0) {bp2 = p2;} - d += "C" + - bp1.x + "," + - bp1.y + " " + - bp2.x + "," + - bp2.y + " " + - p2.x + "," + - p2.y + " "; - } + /** + * dragLockToAxis keeps the drag gesture on the axis that it started on, + * It disallows vertical directions if the initial direction was horizontal, and vice versa. + * @property dragLockToAxis + * @type {Boolean} + * @default false + */ + dragLockToAxis: false, - return d; - } - }; + /** + * drag lock only kicks in when distance > dragLockMinDistance + * This way, locking occurs only when the distance has become large enough to reliably determine the direction + * @property dragLockMinDistance + * @type {Number} + * @default 25 + */ + dragLockMinDistance: 25 + } + }; + })('drag'); /** - * this generates the SVG path for a linear drawing between datapoints. - * @param data - * @returns {string} - * @private + * @module gestures */ - LineGraph.prototype._linear = function(data) { - // linear - var d = ""; - for (var i = 0; i < data.length; i++) { - if (i == 0) { - d += data[i].x + "," + data[i].y; - } - else { - d += " " + data[i].x + "," + data[i].y; + /** + * trigger a simple gesture event, so you can do anything in your handler. + * only usable if you know what your doing... + * + * @class Gesture + * @static + */ + /** + * @event gesture + * @param {Object} ev + */ + Hammer.gestures.Gesture = { + name: 'gesture', + index: 1337, + handler: function releaseGesture(ev, inst) { + inst.trigger(this.name, ev); } - } - return d; }; - module.exports = LineGraph; + /** + * @module gestures + */ + /** + * Touch stays at the same place for x time + * + * @class Hold + * @static + */ + /** + * @event hold + * @param {Object} ev + */ + /** + * @param {String} name + */ + (function(name) { + var timer; -/***/ }, -/* 27 */ -/***/ function(module, exports, __webpack_require__) { + function holdGesture(ev, inst) { + var options = inst.options, + current = Detection.current; - var util = __webpack_require__(1); - var Component = __webpack_require__(18); - var TimeStep = __webpack_require__(17); - var moment = __webpack_require__(40); + switch(ev.eventType) { + case EVENT_START: + clearTimeout(timer); - /** - * A horizontal time axis - * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body - * @param {Object} [options] See TimeAxis.setOptions for the available - * options. - * @constructor TimeAxis - * @extends Component - */ - function TimeAxis (body, options) { - this.dom = { - foreground: null, - majorLines: [], - majorTexts: [], - minorLines: [], - minorTexts: [], - redundant: { - majorLines: [], - majorTexts: [], - minorLines: [], - minorTexts: [] - } - }; - this.props = { - range: { - start: 0, - end: 0, - minimumStep: 0 - }, - lineTop: 0 - }; + // set the gesture so we can check in the timeout if it still is + current.name = name; - this.defaultOptions = { - orientation: 'bottom', // supported: 'top', 'bottom' - // TODO: implement timeaxis orientations 'left' and 'right' - showMinorLabels: true, - showMajorLabels: true - }; - this.options = util.extend({}, this.defaultOptions); + // set timer and if after the timeout it still is hold, + // we trigger the hold event + timer = setTimeout(function() { + if(current && current.name == name) { + inst.trigger(name, ev); + } + }, options.holdTimeout); + break; - this.body = body; + case EVENT_MOVE: + if(ev.distance > options.holdThreshold) { + clearTimeout(timer); + } + break; - // create the HTML DOM - this._create(); + case EVENT_RELEASE: + clearTimeout(timer); + break; + } + } - this.setOptions(options); - } + Hammer.gestures.Hold = { + name: name, + index: 10, + defaults: { + /** + * @property holdTimeout + * @type {Number} + * @default 500 + */ + holdTimeout: 500, - TimeAxis.prototype = new Component(); + /** + * movement allowed while holding + * @property holdThreshold + * @type {Number} + * @default 2 + */ + holdThreshold: 2 + }, + handler: holdGesture + }; + })('hold'); /** - * Set options for the TimeAxis. - * Parameters will be merged in current options. - * @param {Object} options Available options: - * {string} [orientation] - * {boolean} [showMinorLabels] - * {boolean} [showMajorLabels] + * @module gestures */ - TimeAxis.prototype.setOptions = function(options) { - if (options) { - // copy all options that we know - util.selectiveExtend(['orientation', 'showMinorLabels', 'showMajorLabels'], this.options, options); - - // apply locale to moment.js - // TODO: not so nice, this is applied globally to moment.js - if ('locale' in options) { - if (typeof moment.locale === 'function') { - // moment.js 2.8.1+ - moment.locale(options.locale); - } - else { - moment.lang(options.locale); - } + /** + * when a touch is being released from the page + * + * @class Release + * @static + */ + /** + * @event release + * @param {Object} ev + */ + Hammer.gestures.Release = { + name: 'release', + index: Infinity, + handler: function releaseGesture(ev, inst) { + if(ev.eventType == EVENT_RELEASE) { + inst.trigger(this.name, ev); + } } - } }; /** - * Create the HTML DOM for the TimeAxis + * @module gestures */ - TimeAxis.prototype._create = function() { - this.dom.foreground = document.createElement('div'); - this.dom.background = document.createElement('div'); - - this.dom.foreground.className = 'timeaxis foreground'; - this.dom.background.className = 'timeaxis background'; - }; - /** - * Destroy the TimeAxis + * triggers swipe events when the end velocity is above the threshold + * for best usage, set `preventDefault` (on the drag gesture) to `true` + * ```` + * hammertime.on("dragleft swipeleft", function(ev) { + * console.log(ev); + * ev.gesture.preventDefault(); + * }); + * ```` + * + * @class Swipe + * @static */ - TimeAxis.prototype.destroy = function() { - // remove from DOM - if (this.dom.foreground.parentNode) { - this.dom.foreground.parentNode.removeChild(this.dom.foreground); - } - if (this.dom.background.parentNode) { - this.dom.background.parentNode.removeChild(this.dom.background); - } - - this.body = null; - }; - /** - * Repaint the component - * @return {boolean} Returns true if the component is resized + * @event swipe + * @param {Object} ev */ - TimeAxis.prototype.redraw = function () { - var options = this.options, - props = this.props, - foreground = this.dom.foreground, - background = this.dom.background; - - // determine the correct parent DOM element (depending on option orientation) - var parent = (options.orientation == 'top') ? this.body.dom.top : this.body.dom.bottom; - var parentChanged = (foreground.parentNode !== parent); - - // calculate character width and height - this._calculateCharSize(); - - // TODO: recalculate sizes only needed when parent is resized or options is changed - var orientation = this.options.orientation, - showMinorLabels = this.options.showMinorLabels, - showMajorLabels = this.options.showMajorLabels; - - // determine the width and height of the elemens for the axis - props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; - props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; - props.height = props.minorLabelHeight + props.majorLabelHeight; - props.width = foreground.offsetWidth; + /** + * @event swipeleft + * @param {Object} ev + */ + /** + * @event swiperight + * @param {Object} ev + */ + /** + * @event swipeup + * @param {Object} ev + */ + /** + * @event swipedown + * @param {Object} ev + */ + Hammer.gestures.Swipe = { + name: 'swipe', + index: 40, + defaults: { + /** + * @property swipeMinTouches + * @type {Number} + * @default 1 + */ + swipeMinTouches: 1, - props.minorLineHeight = this.body.domProps.root.height - props.majorLabelHeight - - (options.orientation == 'top' ? this.body.domProps.bottom.height : this.body.domProps.top.height); - props.minorLineWidth = 1; // TODO: really calculate width - props.majorLineHeight = props.minorLineHeight + props.majorLabelHeight; - props.majorLineWidth = 1; // TODO: really calculate width + /** + * @property swipeMaxTouches + * @type {Number} + * @default 1 + */ + swipeMaxTouches: 1, - // take foreground and background offline while updating (is almost twice as fast) - var foregroundNextSibling = foreground.nextSibling; - var backgroundNextSibling = background.nextSibling; - foreground.parentNode && foreground.parentNode.removeChild(foreground); - background.parentNode && background.parentNode.removeChild(background); + /** + * horizontal swipe velocity + * @property swipeVelocityX + * @type {Number} + * @default 0.6 + */ + swipeVelocityX: 0.6, - foreground.style.height = this.props.height + 'px'; + /** + * vertical swipe velocity + * @property swipeVelocityY + * @type {Number} + * @default 0.6 + */ + swipeVelocityY: 0.6 + }, - this._repaintLabels(); + handler: function swipeGesture(ev, inst) { + if(ev.eventType == EVENT_RELEASE) { + var touches = ev.touches.length, + options = inst.options; - // put DOM online again (at the same place) - if (foregroundNextSibling) { - parent.insertBefore(foreground, foregroundNextSibling); - } - else { - parent.appendChild(foreground) - } - if (backgroundNextSibling) { - this.body.dom.backgroundVertical.insertBefore(background, backgroundNextSibling); - } - else { - this.body.dom.backgroundVertical.appendChild(background) - } + // max touches + if(touches < options.swipeMinTouches || + touches > options.swipeMaxTouches) { + return; + } - return this._isResized() || parentChanged; + // when the distance we moved is too small we skip this gesture + // or we can be already in dragging + if(ev.velocityX > options.swipeVelocityX || + ev.velocityY > options.swipeVelocityY) { + // trigger swipe events + inst.trigger(this.name, ev); + inst.trigger(this.name + ev.direction, ev); + } + } + } }; /** - * Repaint major and minor text labels and vertical grid lines - * @private + * @module gestures + */ + /** + * Single tap and a double tap on a place + * + * @class Tap + * @static + */ + /** + * @event tap + * @param {Object} ev + */ + /** + * @event doubletap + * @param {Object} ev */ - TimeAxis.prototype._repaintLabels = function () { - var orientation = this.options.orientation; - // calculate range and step (step such that we have space for 7 characters per label) - var start = util.convert(this.body.range.start, 'Number'), - end = util.convert(this.body.range.end, 'Number'), - minimumStep = this.body.util.toTime((this.props.minorCharWidth || 10) * 7).valueOf() - -this.body.util.toTime(0).valueOf(); - var step = new TimeStep(new Date(start), new Date(end), minimumStep); - this.step = step; + /** + * @param {String} name + */ + (function(name) { + var hasMoved = false; - // Move all DOM elements to a "redundant" list, where they - // can be picked for re-use, and clear the lists with lines and texts. - // At the end of the function _repaintLabels, left over elements will be cleaned up - var dom = this.dom; - dom.redundant.majorLines = dom.majorLines; - dom.redundant.majorTexts = dom.majorTexts; - dom.redundant.minorLines = dom.minorLines; - dom.redundant.minorTexts = dom.minorTexts; - dom.majorLines = []; - dom.majorTexts = []; - dom.minorLines = []; - dom.minorTexts = []; + function tapGesture(ev, inst) { + var options = inst.options, + current = Detection.current, + prev = Detection.previous, + sincePrev, + didDoubleTap; - step.first(); - var xFirstMajorLabel = undefined; - var max = 0; - while (step.hasNext() && max < 1000) { - max++; - var cur = step.getCurrent(), - x = this.body.util.toScreen(cur), - isMajor = step.isMajor(); + switch(ev.eventType) { + case EVENT_START: + hasMoved = false; + break; - // TODO: lines must have a width, such that we can create css backgrounds + case EVENT_MOVE: + hasMoved = hasMoved || (ev.distance > options.tapMaxDistance); + break; - if (this.options.showMinorLabels) { - this._repaintMinorText(x, step.getLabelMinor(), orientation); - } + case EVENT_END: + if(!Utils.inStr(ev.srcEvent.type, 'cancel') && ev.deltaTime < options.tapMaxTime && !hasMoved) { + // previous gesture, for the double tap since these are two different gesture detections + sincePrev = prev && prev.lastEvent && ev.timeStamp - prev.lastEvent.timeStamp; + didDoubleTap = false; - if (isMajor && this.options.showMajorLabels) { - if (x > 0) { - if (xFirstMajorLabel == undefined) { - xFirstMajorLabel = x; + // check if double tap + if(prev && prev.name == name && + (sincePrev && sincePrev < options.doubleTapInterval) && + ev.distance < options.doubleTapDistance) { + inst.trigger('doubletap', ev); + didDoubleTap = true; + } + + // do a single tap + if(!didDoubleTap || options.tapAlways) { + current.name = name; + inst.trigger(current.name, ev); + } + } + break; } - this._repaintMajorText(x, step.getLabelMajor(), orientation); - } - this._repaintMajorLine(x, orientation); - } - else { - this._repaintMinorLine(x, orientation); } - step.next(); - } + Hammer.gestures.Tap = { + name: name, + index: 100, + handler: tapGesture, + defaults: { + /** + * max time of a tap, this is for the slow tappers + * @property tapMaxTime + * @type {Number} + * @default 250 + */ + tapMaxTime: 250, - // create a major label on the left when needed - if (this.options.showMajorLabels) { - var leftTime = this.body.util.toTime(0), - leftText = step.getLabelMajor(leftTime), - widthText = leftText.length * (this.props.majorCharWidth || 10) + 10; // upper bound estimation + /** + * max distance of movement of a tap, this is for the slow tappers + * @property tapMaxDistance + * @type {Number} + * @default 10 + */ + tapMaxDistance: 10, - if (xFirstMajorLabel == undefined || widthText < xFirstMajorLabel) { - this._repaintMajorText(0, leftText, orientation); - } - } + /** + * always trigger the `tap` event, even while double-tapping + * @property tapAlways + * @type {Boolean} + * @default true + */ + tapAlways: true, - // Cleanup leftover DOM elements from the redundant list - util.forEach(this.dom.redundant, function (arr) { - while (arr.length) { - var elem = arr.pop(); - if (elem && elem.parentNode) { - elem.parentNode.removeChild(elem); - } - } - }); - }; + /** + * max distance between two taps + * @property doubleTapDistance + * @type {Number} + * @default 20 + */ + doubleTapDistance: 20, + + /** + * max time between two taps + * @property doubleTapInterval + * @type {Number} + * @default 300 + */ + doubleTapInterval: 300 + } + }; + })('tap'); /** - * Create a minor label for the axis at position x - * @param {Number} x - * @param {String} text - * @param {String} orientation "top" or "bottom" (default) - * @private + * @module gestures */ - TimeAxis.prototype._repaintMinorText = function (x, text, orientation) { - // reuse redundant label - var label = this.dom.redundant.minorTexts.shift(); + /** + * when a touch is being touched at the page + * + * @class Touch + * @static + */ + /** + * @event touch + * @param {Object} ev + */ + Hammer.gestures.Touch = { + name: 'touch', + index: -Infinity, + defaults: { + /** + * call preventDefault at touchstart, and makes the element blocking by disabling the scrolling of the page, + * but it improves gestures like transforming and dragging. + * be careful with using this, it can be very annoying for users to be stuck on the page + * @property preventDefault + * @type {Boolean} + * @default false + */ + preventDefault: false, - if (!label) { - // create new label - var content = document.createTextNode(''); - label = document.createElement('div'); - label.appendChild(content); - label.className = 'text minor'; - this.dom.foreground.appendChild(label); - } - this.dom.minorTexts.push(label); + /** + * disable mouse events, so only touch (or pen!) input triggers events + * @property preventMouse + * @type {Boolean} + * @default false + */ + preventMouse: false + }, + handler: function touchGesture(ev, inst) { + if(inst.options.preventMouse && ev.pointerType == POINTER_MOUSE) { + ev.stopDetect(); + return; + } - label.childNodes[0].nodeValue = text; + if(inst.options.preventDefault) { + ev.preventDefault(); + } - label.style.top = (orientation == 'top') ? (this.props.majorLabelHeight + 'px') : '0'; - label.style.left = x + 'px'; - //label.title = title; // TODO: this is a heavy operation + if(ev.eventType == EVENT_TOUCH) { + inst.trigger('touch', ev); + } + } }; /** - * Create a Major label for the axis at position x - * @param {Number} x - * @param {String} text - * @param {String} orientation "top" or "bottom" (default) - * @private + * @module gestures + */ + /** + * User want to scale or rotate with 2 fingers + * Preventing the default browser behavior is a good way to improve feel and working. This can be done with the + * `preventDefault` option. + * + * @class Transform + * @static + */ + /** + * @event transform + * @param {Object} ev + */ + /** + * @event transformstart + * @param {Object} ev + */ + /** + * @event transformend + * @param {Object} ev + */ + /** + * @event pinchin + * @param {Object} ev + */ + /** + * @event pinchout + * @param {Object} ev + */ + /** + * @event rotate + * @param {Object} ev */ - TimeAxis.prototype._repaintMajorText = function (x, text, orientation) { - // reuse redundant label - var label = this.dom.redundant.majorTexts.shift(); - - if (!label) { - // create label - var content = document.createTextNode(text); - label = document.createElement('div'); - label.className = 'text major'; - label.appendChild(content); - this.dom.foreground.appendChild(label); - } - this.dom.majorTexts.push(label); - - label.childNodes[0].nodeValue = text; - //label.title = title; // TODO: this is a heavy operation - - label.style.top = (orientation == 'top') ? '0' : (this.props.minorLabelHeight + 'px'); - label.style.left = x + 'px'; - }; /** - * Create a minor line for the axis at position x - * @param {Number} x - * @param {String} orientation "top" or "bottom" (default) - * @private + * @param {String} name */ - TimeAxis.prototype._repaintMinorLine = function (x, orientation) { - // reuse redundant line - var line = this.dom.redundant.minorLines.shift(); + (function(name) { + var triggered = false; - if (!line) { - // create vertical line - line = document.createElement('div'); - line.className = 'grid vertical minor'; - this.dom.background.appendChild(line); - } - this.dom.minorLines.push(line); + function transformGesture(ev, inst) { + switch(ev.eventType) { + case EVENT_START: + triggered = false; + break; + + case EVENT_MOVE: + // at least multitouch + if(ev.touches.length < 2) { + return; + } + + var scaleThreshold = Math.abs(1 - ev.scale); + var rotationThreshold = Math.abs(ev.rotation); - var props = this.props; - if (orientation == 'top') { - line.style.top = props.majorLabelHeight + 'px'; - } - else { - line.style.top = this.body.domProps.top.height + 'px'; - } - line.style.height = props.minorLineHeight + 'px'; - line.style.left = (x - props.minorLineWidth / 2) + 'px'; - }; + // when the distance we moved is too small we skip this gesture + // or we can be already in dragging + if(scaleThreshold < inst.options.transformMinScale && + rotationThreshold < inst.options.transformMinRotation) { + return; + } - /** - * Create a Major line for the axis at position x - * @param {Number} x - * @param {String} orientation "top" or "bottom" (default) - * @private - */ - TimeAxis.prototype._repaintMajorLine = function (x, orientation) { - // reuse redundant line - var line = this.dom.redundant.majorLines.shift(); + // we are transforming! + Detection.current.name = name; - if (!line) { - // create vertical line - line = document.createElement('DIV'); - line.className = 'grid vertical major'; - this.dom.background.appendChild(line); - } - this.dom.majorLines.push(line); + // first time, trigger dragstart event + if(!triggered) { + inst.trigger(name + 'start', ev); + triggered = true; + } - var props = this.props; - if (orientation == 'top') { - line.style.top = '0'; - } - else { - line.style.top = this.body.domProps.top.height + 'px'; - } - line.style.left = (x - props.majorLineWidth / 2) + 'px'; - line.style.height = props.majorLineHeight + 'px'; - }; + inst.trigger(name, ev); // basic transform event - /** - * Determine the size of text on the axis (both major and minor axis). - * The size is calculated only once and then cached in this.props. - * @private - */ - TimeAxis.prototype._calculateCharSize = function () { - // Note: We calculate char size with every redraw. Size may change, for - // example when any of the timelines parents had display:none for example. + // trigger rotate event + if(rotationThreshold > inst.options.transformMinRotation) { + inst.trigger('rotate', ev); + } - // determine the char width and height on the minor axis - if (!this.dom.measureCharMinor) { - this.dom.measureCharMinor = document.createElement('DIV'); - this.dom.measureCharMinor.className = 'text minor measure'; - this.dom.measureCharMinor.style.position = 'absolute'; + // trigger pinch event + if(scaleThreshold > inst.options.transformMinScale) { + inst.trigger('pinch', ev); + inst.trigger('pinch' + (ev.scale < 1 ? 'in' : 'out'), ev); + } + break; - this.dom.measureCharMinor.appendChild(document.createTextNode('0')); - this.dom.foreground.appendChild(this.dom.measureCharMinor); - } - this.props.minorCharHeight = this.dom.measureCharMinor.clientHeight; - this.props.minorCharWidth = this.dom.measureCharMinor.clientWidth; + case EVENT_RELEASE: + if(triggered && ev.changedLength < 2) { + inst.trigger(name + 'end', ev); + triggered = false; + } + break; + } + } - // determine the char width and height on the major axis - if (!this.dom.measureCharMajor) { - this.dom.measureCharMajor = document.createElement('DIV'); - this.dom.measureCharMajor.className = 'text minor measure'; - this.dom.measureCharMajor.style.position = 'absolute'; + Hammer.gestures.Transform = { + name: name, + index: 45, + defaults: { + /** + * minimal scale factor, no scale is 1, zoomin is to 0 and zoomout until higher then 1 + * @property transformMinScale + * @type {Number} + * @default 0.01 + */ + transformMinScale: 0.01, - this.dom.measureCharMajor.appendChild(document.createTextNode('0')); - this.dom.foreground.appendChild(this.dom.measureCharMajor); - } - this.props.majorCharHeight = this.dom.measureCharMajor.clientHeight; - this.props.majorCharWidth = this.dom.measureCharMajor.clientWidth; - }; + /** + * rotation in degrees + * @property transformMinRotation + * @type {Number} + * @default 1 + */ + transformMinRotation: 1 + }, + + handler: transformGesture + }; + })('transform'); /** - * Snap a date to a rounded value. - * The snap intervals are dependent on the current scale and step. - * @param {Date} date the date to be snapped. - * @return {Date} snappedDate + * @module hammer */ - TimeAxis.prototype.snap = function(date) { - return this.step.snap(date); - }; - module.exports = TimeAxis; + // AMD export + if(true) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { + return Hammer; + }.call(exports, __webpack_require__, exports, module)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + // commonjs export + } else if(typeof module !== 'undefined' && module.exports) { + module.exports = Hammer; + // browser export + } else { + window.Hammer = Hammer; + } + })(window); /***/ }, -/* 28 */ +/* 20 */ /***/ function(module, exports, __webpack_require__) { - var Hammer = __webpack_require__(41); + var util = __webpack_require__(1); + var hammerUtil = __webpack_require__(21); + var moment = __webpack_require__(2); + var Component = __webpack_require__(22); /** - * @constructor Item - * @param {Object} data Object containing (optional) parameters type, - * start, end, content, group, className. - * @param {{toScreen: function, toTime: function}} conversion - * Conversion functions from time to screen and vice versa - * @param {Object} options Configuration options - * // TODO: describe available options + * @constructor Range + * A Range controls a numeric range with a start and end value. + * The Range adjusts the range based on mouse events or programmatic changes, + * and triggers events when the range is changing or has been changed. + * @param {{dom: Object, domProps: Object, emitter: Emitter}} body + * @param {Object} [options] See description at Range.setOptions */ - function Item (data, conversion, options) { - this.id = null; - this.parent = null; - this.data = data; - this.dom = null; - this.conversion = conversion || {}; - this.options = options || {}; + function Range(body, options) { + var now = moment().hours(0).minutes(0).seconds(0).milliseconds(0); + this.start = now.clone().add('days', -3).valueOf(); // Number + this.end = now.clone().add('days', 4).valueOf(); // Number - this.selected = false; - this.displayed = false; - this.dirty = true; + this.body = body; - this.top = null; - this.left = null; - this.width = null; - this.height = null; + // default options + this.defaultOptions = { + start: null, + end: null, + direction: 'horizontal', // 'horizontal' or 'vertical' + moveable: true, + zoomable: true, + min: null, + max: null, + zoomMin: 10, // milliseconds + zoomMax: 1000 * 60 * 60 * 24 * 365 * 10000 // milliseconds + }; + this.options = util.extend({}, this.defaultOptions); + + this.props = { + touch: {} + }; + + // drag listeners for dragging + this.body.emitter.on('dragstart', this._onDragStart.bind(this)); + this.body.emitter.on('drag', this._onDrag.bind(this)); + this.body.emitter.on('dragend', this._onDragEnd.bind(this)); + + // ignore dragging when holding + this.body.emitter.on('hold', this._onHold.bind(this)); + + // mouse wheel for zooming + this.body.emitter.on('mousewheel', this._onMouseWheel.bind(this)); + this.body.emitter.on('DOMMouseScroll', this._onMouseWheel.bind(this)); // For FF + + // pinch to zoom + this.body.emitter.on('touch', this._onTouch.bind(this)); + this.body.emitter.on('pinch', this._onPinch.bind(this)); + + this.setOptions(options); } - /** - * Select current item - */ - Item.prototype.select = function() { - this.selected = true; - if (this.displayed) this.redraw(); - }; + Range.prototype = new Component(); /** - * Unselect current item + * Set options for the range controller + * @param {Object} options Available options: + * {Number | Date | String} start Start date for the range + * {Number | Date | String} end End date for the range + * {Number} min Minimum value for start + * {Number} max Maximum value for end + * {Number} zoomMin Set a minimum value for + * (end - start). + * {Number} zoomMax Set a maximum value for + * (end - start). + * {Boolean} moveable Enable moving of the range + * by dragging. True by default + * {Boolean} zoomable Enable zooming of the range + * by pinching/scrolling. True by default */ - Item.prototype.unselect = function() { - this.selected = false; - if (this.displayed) this.redraw(); - }; + Range.prototype.setOptions = function (options) { + if (options) { + // copy the options that we know + var fields = ['direction', 'min', 'max', 'zoomMin', 'zoomMax', 'moveable', 'zoomable']; + util.selectiveExtend(fields, this.options, options); - /** - * Set a parent for the item - * @param {ItemSet | Group} parent - */ - Item.prototype.setParent = function(parent) { - if (this.displayed) { - this.hide(); - this.parent = parent; - if (this.parent) { - this.show(); + if ('start' in options || 'end' in options) { + // apply a new range. both start and end are optional + this.setRange(options.start, options.end); } } - else { - this.parent = parent; - } }; /** - * Check whether this item is visible inside given range - * @returns {{start: Number, end: Number}} range with a timestamp for start and end - * @returns {boolean} True if visible + * Test whether direction has a valid value + * @param {String} direction 'horizontal' or 'vertical' */ - Item.prototype.isVisible = function(range) { - // Should be implemented by Item implementations - return false; - }; + function validateDirection (direction) { + if (direction != 'horizontal' && direction != 'vertical') { + throw new TypeError('Unknown direction "' + direction + '". ' + + 'Choose "horizontal" or "vertical".'); + } + } /** - * Show the Item in the DOM (when not already visible) - * @return {Boolean} changed + * Set a new start and end range + * @param {Number} [start] + * @param {Number} [end] */ - Item.prototype.show = function() { - return false; + Range.prototype.setRange = function(start, end) { + var changed = this._applyRange(start, end); + if (changed) { + var params = { + start: new Date(this.start), + end: new Date(this.end) + }; + this.body.emitter.emit('rangechange', params); + this.body.emitter.emit('rangechanged', params); + } }; /** - * Hide the Item from the DOM (when visible) + * Set a new start and end range. This method is the same as setRange, but + * does not trigger a range change and range changed event, and it returns + * true when the range is changed + * @param {Number} [start] + * @param {Number} [end] * @return {Boolean} changed + * @private */ - Item.prototype.hide = function() { - return false; - }; - - /** - * Repaint the item - */ - Item.prototype.redraw = function() { - // should be implemented by the item - }; + Range.prototype._applyRange = function(start, end) { + var newStart = (start != null) ? util.convert(start, 'Date').valueOf() : this.start, + newEnd = (end != null) ? util.convert(end, 'Date').valueOf() : this.end, + max = (this.options.max != null) ? util.convert(this.options.max, 'Date').valueOf() : null, + min = (this.options.min != null) ? util.convert(this.options.min, 'Date').valueOf() : null, + diff; - /** - * Reposition the Item horizontally - */ - Item.prototype.repositionX = function() { - // should be implemented by the item - }; + // check for valid number + if (isNaN(newStart) || newStart === null) { + throw new Error('Invalid start "' + start + '"'); + } + if (isNaN(newEnd) || newEnd === null) { + throw new Error('Invalid end "' + end + '"'); + } - /** - * Reposition the Item vertically - */ - Item.prototype.repositionY = function() { - // should be implemented by the item - }; + // prevent start < end + if (newEnd < newStart) { + newEnd = newStart; + } - /** - * Repaint a delete button on the top right of the item when the item is selected - * @param {HTMLElement} anchor - * @protected - */ - Item.prototype._repaintDeleteButton = function (anchor) { - if (this.selected && this.options.editable.remove && !this.dom.deleteButton) { - // create and show button - var me = this; + // prevent start < min + if (min !== null) { + if (newStart < min) { + diff = (min - newStart); + newStart += diff; + newEnd += diff; - var deleteButton = document.createElement('div'); - deleteButton.className = 'delete'; - deleteButton.title = 'Delete this item'; + // prevent end > max + if (max != null) { + if (newEnd > max) { + newEnd = max; + } + } + } + } - Hammer(deleteButton, { - preventDefault: true - }).on('tap', function (event) { - me.parent.removeFromDataSet(me); - event.stopPropagation(); - }); + // prevent end > max + if (max !== null) { + if (newEnd > max) { + diff = (newEnd - max); + newStart -= diff; + newEnd -= diff; - anchor.appendChild(deleteButton); - this.dom.deleteButton = deleteButton; + // prevent start < min + if (min != null) { + if (newStart < min) { + newStart = min; + } + } + } } - else if (!this.selected && this.dom.deleteButton) { - // remove button - if (this.dom.deleteButton.parentNode) { - this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton); + + // prevent (end-start) < zoomMin + if (this.options.zoomMin !== null) { + var zoomMin = parseFloat(this.options.zoomMin); + if (zoomMin < 0) { + zoomMin = 0; + } + if ((newEnd - newStart) < zoomMin) { + if ((this.end - this.start) === zoomMin) { + // ignore this action, we are already zoomed to the minimum + newStart = this.start; + newEnd = this.end; + } + else { + // zoom to the minimum + diff = (zoomMin - (newEnd - newStart)); + newStart -= diff / 2; + newEnd += diff / 2; + } } - this.dom.deleteButton = null; } - }; - module.exports = Item; + // prevent (end-start) > zoomMax + if (this.options.zoomMax !== null) { + var zoomMax = parseFloat(this.options.zoomMax); + if (zoomMax < 0) { + zoomMax = 0; + } + if ((newEnd - newStart) > zoomMax) { + if ((this.end - this.start) === zoomMax) { + // ignore this action, we are already zoomed to the maximum + newStart = this.start; + newEnd = this.end; + } + else { + // zoom to the maximum + diff = ((newEnd - newStart) - zoomMax); + newStart += diff / 2; + newEnd -= diff / 2; + } + } + } + var changed = (this.start != newStart || this.end != newEnd); -/***/ }, -/* 29 */ -/***/ function(module, exports, __webpack_require__) { + this.start = newStart; + this.end = newEnd; - var Item = __webpack_require__(28); + return changed; + }; /** - * @constructor ItemBox - * @extends Item - * @param {Object} data Object containing parameters start - * content, className. - * @param {{toScreen: function, toTime: function}} conversion - * Conversion functions from time to screen and vice versa - * @param {Object} [options] Configuration options - * // TODO: describe available options + * Retrieve the current range. + * @return {Object} An object with start and end properties */ - function ItemBox (data, conversion, options) { - this.props = { - dot: { - width: 0, - height: 0 - }, - line: { - width: 0, - height: 0 - } + Range.prototype.getRange = function() { + return { + start: this.start, + end: this.end }; + }; - // validate data - if (data) { - if (data.start == undefined) { - throw new Error('Property "start" missing in item ' + data); + /** + * Calculate the conversion offset and scale for current range, based on + * the provided width + * @param {Number} width + * @returns {{offset: number, scale: number}} conversion + */ + Range.prototype.conversion = function (width) { + return Range.conversion(this.start, this.end, width); + }; + + /** + * Static method to calculate the conversion offset and scale for a range, + * based on the provided start, end, and width + * @param {Number} start + * @param {Number} end + * @param {Number} width + * @returns {{offset: number, scale: number}} conversion + */ + Range.conversion = function (start, end, width) { + if (width != 0 && (end - start != 0)) { + return { + offset: start, + scale: width / (end - start) } } + else { + return { + offset: 0, + scale: 1 + }; + } + }; - Item.call(this, data, conversion, options); - } + /** + * Start dragging horizontally or vertically + * @param {Event} event + * @private + */ + Range.prototype._onDragStart = function(event) { + // only allow dragging when configured as movable + if (!this.options.moveable) return; + + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.props.touch.allowDragging) return; - ItemBox.prototype = new Item (null, null, null); + this.props.touch.start = this.start; + this.props.touch.end = this.end; + + if (this.body.dom.root) { + this.body.dom.root.style.cursor = 'move'; + } + }; /** - * Check whether this item is visible inside given range - * @returns {{start: Number, end: Number}} range with a timestamp for start and end - * @returns {boolean} True if visible + * Perform dragging operation + * @param {Event} event + * @private */ - ItemBox.prototype.isVisible = function(range) { - // determine visibility - // TODO: account for the real width of the item. Right now we just add 1/4 to the window - var interval = (range.end - range.start) / 4; - return (this.data.start > range.start - interval) && (this.data.start < range.end + interval); + Range.prototype._onDrag = function (event) { + // only allow dragging when configured as movable + if (!this.options.moveable) return; + var direction = this.options.direction; + validateDirection(direction); + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.props.touch.allowDragging) return; + var delta = (direction == 'horizontal') ? event.gesture.deltaX : event.gesture.deltaY, + interval = (this.props.touch.end - this.props.touch.start), + width = (direction == 'horizontal') ? this.body.domProps.center.width : this.body.domProps.center.height, + diffRange = -delta / width * interval; + this._applyRange(this.props.touch.start + diffRange, this.props.touch.end + diffRange); + this.body.emitter.emit('rangechange', { + start: new Date(this.start), + end: new Date(this.end) + }); }; /** - * Repaint the item + * Stop dragging operation + * @param {event} event + * @private */ - ItemBox.prototype.redraw = function() { - var dom = this.dom; - if (!dom) { - // create DOM - this.dom = {}; - dom = this.dom; + Range.prototype._onDragEnd = function (event) { + // only allow dragging when configured as movable + if (!this.options.moveable) return; - // create main box - dom.box = document.createElement('DIV'); + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.props.touch.allowDragging) return; - // contents box (inside the background box). used for making margins - dom.content = document.createElement('DIV'); - dom.content.className = 'content'; - dom.box.appendChild(dom.content); + if (this.body.dom.root) { + this.body.dom.root.style.cursor = 'auto'; + } - // line to axis - dom.line = document.createElement('DIV'); - dom.line.className = 'line'; + // fire a rangechanged event + this.body.emitter.emit('rangechanged', { + start: new Date(this.start), + end: new Date(this.end) + }); + }; - // dot on axis - dom.dot = document.createElement('DIV'); - dom.dot.className = 'dot'; + /** + * Event handler for mouse wheel event, used to zoom + * Code from http://adomas.org/javascript-mouse-wheel/ + * @param {Event} event + * @private + */ + Range.prototype._onMouseWheel = function(event) { + // only allow zooming when configured as zoomable and moveable + if (!(this.options.zoomable && this.options.moveable)) return; - // attach this item as attribute - dom.box['timeline-item'] = this; + // retrieve delta + var delta = 0; + if (event.wheelDelta) { /* IE/Opera. */ + delta = event.wheelDelta / 120; + } else if (event.detail) { /* Mozilla case. */ + // In Mozilla, sign of delta is different than in IE. + // Also, delta is multiple of 3. + delta = -event.detail / 3; } - // append DOM to parent DOM - if (!this.parent) { - throw new Error('Cannot redraw item: no parent attached'); - } - if (!dom.box.parentNode) { - var foreground = this.parent.dom.foreground; - if (!foreground) throw new Error('Cannot redraw time axis: parent has no foreground container element'); - foreground.appendChild(dom.box); - } - if (!dom.line.parentNode) { - var background = this.parent.dom.background; - if (!background) throw new Error('Cannot redraw time axis: parent has no background container element'); - background.appendChild(dom.line); - } - if (!dom.dot.parentNode) { - var axis = this.parent.dom.axis; - if (!background) throw new Error('Cannot redraw time axis: parent has no axis container element'); - axis.appendChild(dom.dot); - } - this.displayed = true; + // If delta is nonzero, handle it. + // Basically, delta is now positive if wheel was scrolled up, + // and negative, if wheel was scrolled down. + if (delta) { + // perform the zoom action. Delta is normally 1 or -1 - // update contents - if (this.data.content != this.content) { - this.content = this.data.content; - if (this.content instanceof Element) { - dom.content.innerHTML = ''; - dom.content.appendChild(this.content); - } - else if (this.data.content != undefined) { - dom.content.innerHTML = this.content; + // adjust a negative delta such that zooming in with delta 0.1 + // equals zooming out with a delta -0.1 + var scale; + if (delta < 0) { + scale = 1 - (delta / 5); } else { - throw new Error('Property "content" missing in item ' + this.data.id); + scale = 1 / (1 + (delta / 5)) ; } - this.dirty = true; - } - - // update title - if (this.data.title != this.title) { - dom.box.title = this.data.title; - this.title = this.data.title; - } - - // update class - var className = (this.data.className? ' ' + this.data.className : '') + - (this.selected ? ' selected' : ''); - if (this.className != className) { - this.className = className; - dom.box.className = 'item box' + className; - dom.line.className = 'item line' + className; - dom.dot.className = 'item dot' + className; - - this.dirty = true; - } - - // recalculate size - if (this.dirty) { - this.props.dot.height = dom.dot.offsetHeight; - this.props.dot.width = dom.dot.offsetWidth; - this.props.line.width = dom.line.offsetWidth; - this.width = dom.box.offsetWidth; - this.height = dom.box.offsetHeight; + // calculate center, the date to zoom around + var gesture = hammerUtil.fakeGesture(this, event), + pointer = getPointer(gesture.center, this.body.dom.center), + pointerDate = this._pointerToDate(pointer); - this.dirty = false; + this.zoom(scale, pointerDate); } - this._repaintDeleteButton(dom.box); + // Prevent default actions caused by mouse wheel + // (else the page and timeline both zoom and scroll) + event.preventDefault(); }; /** - * Show the item in the DOM (when not already displayed). The items DOM will - * be created when needed. + * Start of a touch gesture + * @private */ - ItemBox.prototype.show = function() { - if (!this.displayed) { - this.redraw(); - } + Range.prototype._onTouch = function (event) { + this.props.touch.start = this.start; + this.props.touch.end = this.end; + this.props.touch.allowDragging = true; + this.props.touch.center = null; }; /** - * Hide the item from the DOM (when visible) + * On start of a hold gesture + * @private */ - ItemBox.prototype.hide = function() { - if (this.displayed) { - var dom = this.dom; - - if (dom.box.parentNode) dom.box.parentNode.removeChild(dom.box); - if (dom.line.parentNode) dom.line.parentNode.removeChild(dom.line); - if (dom.dot.parentNode) dom.dot.parentNode.removeChild(dom.dot); - - this.top = null; - this.left = null; - - this.displayed = false; - } + Range.prototype._onHold = function () { + this.props.touch.allowDragging = false; }; /** - * Reposition the item horizontally - * @Override + * Handle pinch event + * @param {Event} event + * @private */ - ItemBox.prototype.repositionX = function() { - var start = this.conversion.toScreen(this.data.start), - align = this.options.align, - left, - box = this.dom.box, - line = this.dom.line, - dot = this.dom.dot; - - // calculate left position of the box - if (align == 'right') { - this.left = start - this.width; - } - else if (align == 'left') { - this.left = start; - } - else { - // default or 'center' - this.left = start - this.width / 2; - } - - // reposition box - box.style.left = this.left + 'px'; - - // reposition line - line.style.left = (start - this.props.line.width / 2) + 'px'; + Range.prototype._onPinch = function (event) { + // only allow zooming when configured as zoomable and moveable + if (!(this.options.zoomable && this.options.moveable)) return; - // reposition dot - dot.style.left = (start - this.props.dot.width / 2) + 'px'; - }; + this.props.touch.allowDragging = false; - /** - * Reposition the item vertically - * @Override - */ - ItemBox.prototype.repositionY = function() { - var orientation = this.options.orientation, - box = this.dom.box, - line = this.dom.line, - dot = this.dom.dot; + if (event.gesture.touches.length > 1) { + if (!this.props.touch.center) { + this.props.touch.center = getPointer(event.gesture.center, this.body.dom.center); + } - if (orientation == 'top') { - box.style.top = (this.top || 0) + 'px'; + var scale = 1 / event.gesture.scale, + initDate = this._pointerToDate(this.props.touch.center); - line.style.top = '0'; - line.style.height = (this.parent.top + this.top + 1) + 'px'; - line.style.bottom = ''; - } - else { // orientation 'bottom' - var itemSetHeight = this.parent.itemSet.props.height; // TODO: this is nasty - var lineHeight = itemSetHeight - this.parent.top - this.parent.height + this.top; + // calculate new start and end + var newStart = parseInt(initDate + (this.props.touch.start - initDate) * scale); + var newEnd = parseInt(initDate + (this.props.touch.end - initDate) * scale); - box.style.top = (this.parent.height - this.top - this.height || 0) + 'px'; - line.style.top = (itemSetHeight - lineHeight) + 'px'; - line.style.bottom = '0'; + // apply new range + this.setRange(newStart, newEnd); } - - dot.style.top = (-this.props.dot.height / 2) + 'px'; }; - module.exports = ItemBox; - + /** + * Helper function to calculate the center date for zooming + * @param {{x: Number, y: Number}} pointer + * @return {number} date + * @private + */ + Range.prototype._pointerToDate = function (pointer) { + var conversion; + var direction = this.options.direction; -/***/ }, -/* 30 */ -/***/ function(module, exports, __webpack_require__) { + validateDirection(direction); - var Item = __webpack_require__(28); + if (direction == 'horizontal') { + var width = this.body.domProps.center.width; + conversion = this.conversion(width); + return pointer.x / conversion.scale + conversion.offset; + } + else { + var height = this.body.domProps.center.height; + conversion = this.conversion(height); + return pointer.y / conversion.scale + conversion.offset; + } + }; /** - * @constructor ItemPoint - * @extends Item - * @param {Object} data Object containing parameters start - * content, className. - * @param {{toScreen: function, toTime: function}} conversion - * Conversion functions from time to screen and vice versa - * @param {Object} [options] Configuration options - * // TODO: describe available options + * Get the pointer location relative to the location of the dom element + * @param {{pageX: Number, pageY: Number}} touch + * @param {Element} element HTML DOM element + * @return {{x: Number, y: Number}} pointer + * @private */ - function ItemPoint (data, conversion, options) { - this.props = { - dot: { - top: 0, - width: 0, - height: 0 - }, - content: { - height: 0, - marginLeft: 0 - } + function getPointer (touch, element) { + return { + x: touch.pageX - util.getAbsoluteLeft(element), + y: touch.pageY - util.getAbsoluteTop(element) }; + } - // validate data - if (data) { - if (data.start == undefined) { - throw new Error('Property "start" missing in item ' + data); - } + /** + * Zoom the range the given scale in or out. Start and end date will + * be adjusted, and the timeline will be redrawn. You can optionally give a + * date around which to zoom. + * For example, try scale = 0.9 or 1.1 + * @param {Number} scale Scaling factor. Values above 1 will zoom out, + * values below 1 will zoom in. + * @param {Number} [center] Value representing a date around which will + * be zoomed. + */ + Range.prototype.zoom = function(scale, center) { + // if centerDate is not provided, take it half between start Date and end Date + if (center == null) { + center = (this.start + this.end) / 2; } - Item.call(this, data, conversion, options); - } + // calculate new start and end + var newStart = center + (this.start - center) * scale; + var newEnd = center + (this.end - center) * scale; - ItemPoint.prototype = new Item (null, null, null); + this.setRange(newStart, newEnd); + }; /** - * Check whether this item is visible inside given range - * @returns {{start: Number, end: Number}} range with a timestamp for start and end - * @returns {boolean} True if visible + * Move the range with a given delta to the left or right. Start and end + * value will be adjusted. For example, try delta = 0.1 or -0.1 + * @param {Number} delta Moving amount. Positive value will move right, + * negative value will move left */ - ItemPoint.prototype.isVisible = function(range) { - // determine visibility - // TODO: account for the real width of the item. Right now we just add 1/4 to the window - var interval = (range.end - range.start) / 4; - return (this.data.start > range.start - interval) && (this.data.start < range.end + interval); + Range.prototype.move = function(delta) { + // zoom start Date and end Date relative to the centerDate + var diff = (this.end - this.start); + + // apply new values + var newStart = this.start + diff * delta; + var newEnd = this.end + diff * delta; + + // TODO: reckon with min and max range + + this.start = newStart; + this.end = newEnd; }; /** - * Repaint the item + * Move the range to a new center point + * @param {Number} moveTo New center point of the range */ - ItemPoint.prototype.redraw = function() { - var dom = this.dom; - if (!dom) { - // create DOM - this.dom = {}; - dom = this.dom; + Range.prototype.moveTo = function(moveTo) { + var center = (this.start + this.end) / 2; - // background box - dom.point = document.createElement('div'); - // className is updated in redraw() + var diff = center - moveTo; - // contents box, right from the dot - dom.content = document.createElement('div'); - dom.content.className = 'content'; - dom.point.appendChild(dom.content); + // calculate new start and end + var newStart = this.start - diff; + var newEnd = this.end - diff; - // dot at start - dom.dot = document.createElement('div'); - dom.point.appendChild(dom.dot); + this.setRange(newStart, newEnd); + }; - // attach this item as attribute - dom.point['timeline-item'] = this; - } + module.exports = Range; - // append DOM to parent DOM - if (!this.parent) { - throw new Error('Cannot redraw item: no parent attached'); - } - if (!dom.point.parentNode) { - var foreground = this.parent.dom.foreground; - if (!foreground) { - throw new Error('Cannot redraw time axis: parent has no foreground container element'); - } - foreground.appendChild(dom.point); - } - this.displayed = true; - // update contents - if (this.data.content != this.content) { - this.content = this.data.content; - if (this.content instanceof Element) { - dom.content.innerHTML = ''; - dom.content.appendChild(this.content); - } - else if (this.data.content != undefined) { - dom.content.innerHTML = this.content; - } - else { - throw new Error('Property "content" missing in item ' + this.data.id); - } +/***/ }, +/* 21 */ +/***/ function(module, exports, __webpack_require__) { - this.dirty = true; - } + var Hammer = __webpack_require__(18); - // update title - if (this.data.title != this.title) { - dom.point.title = this.data.title; - this.title = this.data.title; - } + /** + * Fake a hammer.js gesture. Event can be a ScrollEvent or MouseMoveEvent + * @param {Element} element + * @param {Event} event + */ + exports.fakeGesture = function(element, event) { + var eventType = null; - // update class - var className = (this.data.className? ' ' + this.data.className : '') + - (this.selected ? ' selected' : ''); - if (this.className != className) { - this.className = className; - dom.point.className = 'item point' + className; - dom.dot.className = 'item dot' + className; + // for hammer.js 1.0.5 + // var gesture = Hammer.event.collectEventData(this, eventType, event); - this.dirty = true; - } + // for hammer.js 1.0.6+ + var touches = Hammer.event.getTouchList(event, eventType); + var gesture = Hammer.event.collectEventData(this, eventType, touches, event); - // recalculate size - if (this.dirty) { - this.width = dom.point.offsetWidth; - this.height = dom.point.offsetHeight; - this.props.dot.width = dom.dot.offsetWidth; - this.props.dot.height = dom.dot.offsetHeight; - this.props.content.height = dom.content.offsetHeight; + // on IE in standards mode, no touches are recognized by hammer.js, + // resulting in NaN values for center.pageX and center.pageY + if (isNaN(gesture.center.pageX)) { + gesture.center.pageX = event.pageX; + } + if (isNaN(gesture.center.pageY)) { + gesture.center.pageY = event.pageY; + } - // resize contents - dom.content.style.marginLeft = 2 * this.props.dot.width + 'px'; - //dom.content.style.marginRight = ... + 'px'; // TODO: margin right + return gesture; + }; - dom.dot.style.top = ((this.height - this.props.dot.height) / 2) + 'px'; - dom.dot.style.left = (this.props.dot.width / 2) + 'px'; - this.dirty = false; - } +/***/ }, +/* 22 */ +/***/ function(module, exports, __webpack_require__) { - this._repaintDeleteButton(dom.point); - }; + /** + * Prototype for visual components + * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} [body] + * @param {Object} [options] + */ + function Component (body, options) { + this.options = null; + this.props = null; + } /** - * Show the item in the DOM (when not already visible). The items DOM will - * be created when needed. + * Set options for the component. The new options will be merged into the + * current options. + * @param {Object} options */ - ItemPoint.prototype.show = function() { - if (!this.displayed) { - this.redraw(); + Component.prototype.setOptions = function(options) { + if (options) { + util.extend(this.options, options); } }; /** - * Hide the item from the DOM (when visible) + * Repaint the component + * @return {boolean} Returns true if the component is resized */ - ItemPoint.prototype.hide = function() { - if (this.displayed) { - if (this.dom.point.parentNode) { - this.dom.point.parentNode.removeChild(this.dom.point); - } - - this.top = null; - this.left = null; - - this.displayed = false; - } + Component.prototype.redraw = function() { + // should be implemented by the component + return false; }; /** - * Reposition the item horizontally - * @Override + * Destroy the component. Cleanup DOM and event listeners */ - ItemPoint.prototype.repositionX = function() { - var start = this.conversion.toScreen(this.data.start); - - this.left = start - this.props.dot.width; - - // reposition point - this.dom.point.style.left = this.left + 'px'; + Component.prototype.destroy = function() { + // should be implemented by the component }; /** - * Reposition the item vertically - * @Override + * Test whether the component is resized since the last time _isResized() was + * called. + * @return {Boolean} Returns true if the component is resized + * @protected */ - ItemPoint.prototype.repositionY = function() { - var orientation = this.options.orientation, - point = this.dom.point; + Component.prototype._isResized = function() { + var resized = (this.props._previousWidth !== this.props.width || + this.props._previousHeight !== this.props.height); - if (orientation == 'top') { - point.style.top = this.top + 'px'; - } - else { - point.style.top = (this.parent.height - this.top - this.height) + 'px'; - } + this.props._previousWidth = this.props.width; + this.props._previousHeight = this.props.height; + + return resized; }; - module.exports = ItemPoint; + module.exports = Component; /***/ }, -/* 31 */ +/* 23 */ /***/ function(module, exports, __webpack_require__) { - var Hammer = __webpack_require__(41); - var Item = __webpack_require__(28); + var Emitter = __webpack_require__(10); + var Hammer = __webpack_require__(18); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(7); + var DataView = __webpack_require__(8); + var Range = __webpack_require__(20); + var TimeAxis = __webpack_require__(24); + var CurrentTime = __webpack_require__(26); + var CustomTime = __webpack_require__(28); + var ItemSet = __webpack_require__(29); + var Activator = __webpack_require__(36); /** - * @constructor ItemRange - * @extends Item - * @param {Object} data Object containing parameters start, end - * content, className. - * @param {{toScreen: function, toTime: function}} conversion - * Conversion functions from time to screen and vice versa - * @param {Object} [options] Configuration options - * // TODO: describe options + * Create a timeline visualization + * @param {HTMLElement} container + * @param {vis.DataSet | Array | google.visualization.DataTable} [items] + * @param {Object} [options] See Core.setOptions for the available options. + * @constructor */ - function ItemRange (data, conversion, options) { - this.props = { - content: { - width: 0 - } - }; - this.overflow = false; // if contents can overflow (css styling), this flag is set to true + function Core () {} - // validate data - if (data) { - if (data.start == undefined) { - throw new Error('Property "start" missing in item ' + data.id); - } - if (data.end == undefined) { - throw new Error('Property "end" missing in item ' + data.id); - } - } + // turn Core into an event emitter + Emitter(Core.prototype); - Item.call(this, data, conversion, options); - } + /** + * Create the main DOM for the Core: a root panel containing left, right, + * top, bottom, content, and background panel. + * @param {Element} container The container element where the Core will + * be attached. + * @private + */ + Core.prototype._create = function (container) { + this.dom = {}; - ItemRange.prototype = new Item (null, null, null); + this.dom.root = document.createElement('div'); + this.dom.background = document.createElement('div'); + this.dom.backgroundVertical = document.createElement('div'); + this.dom.backgroundHorizontal = document.createElement('div'); + this.dom.centerContainer = document.createElement('div'); + this.dom.leftContainer = document.createElement('div'); + this.dom.rightContainer = document.createElement('div'); + this.dom.center = document.createElement('div'); + this.dom.left = document.createElement('div'); + this.dom.right = document.createElement('div'); + this.dom.top = document.createElement('div'); + this.dom.bottom = document.createElement('div'); + this.dom.shadowTop = document.createElement('div'); + this.dom.shadowBottom = document.createElement('div'); + this.dom.shadowTopLeft = document.createElement('div'); + this.dom.shadowBottomLeft = document.createElement('div'); + this.dom.shadowTopRight = document.createElement('div'); + this.dom.shadowBottomRight = document.createElement('div'); - ItemRange.prototype.baseClassName = 'item range'; + this.dom.root.className = 'vis timeline root'; + this.dom.background.className = 'vispanel background'; + this.dom.backgroundVertical.className = 'vispanel background vertical'; + this.dom.backgroundHorizontal.className = 'vispanel background horizontal'; + this.dom.centerContainer.className = 'vispanel center'; + this.dom.leftContainer.className = 'vispanel left'; + this.dom.rightContainer.className = 'vispanel right'; + this.dom.top.className = 'vispanel top'; + this.dom.bottom.className = 'vispanel bottom'; + this.dom.left.className = 'content'; + this.dom.center.className = 'content'; + this.dom.right.className = 'content'; + this.dom.shadowTop.className = 'shadow top'; + this.dom.shadowBottom.className = 'shadow bottom'; + this.dom.shadowTopLeft.className = 'shadow top'; + this.dom.shadowBottomLeft.className = 'shadow bottom'; + this.dom.shadowTopRight.className = 'shadow top'; + this.dom.shadowBottomRight.className = 'shadow bottom'; - /** - * Check whether this item is visible inside given range - * @returns {{start: Number, end: Number}} range with a timestamp for start and end - * @returns {boolean} True if visible - */ - ItemRange.prototype.isVisible = function(range) { - // determine visibility - return (this.data.start < range.end) && (this.data.end > range.start); - }; + this.dom.root.appendChild(this.dom.background); + this.dom.root.appendChild(this.dom.backgroundVertical); + this.dom.root.appendChild(this.dom.backgroundHorizontal); + this.dom.root.appendChild(this.dom.centerContainer); + this.dom.root.appendChild(this.dom.leftContainer); + this.dom.root.appendChild(this.dom.rightContainer); + this.dom.root.appendChild(this.dom.top); + this.dom.root.appendChild(this.dom.bottom); - /** - * Repaint the item - */ - ItemRange.prototype.redraw = function() { - var dom = this.dom; - if (!dom) { - // create DOM - this.dom = {}; - dom = this.dom; + this.dom.centerContainer.appendChild(this.dom.center); + this.dom.leftContainer.appendChild(this.dom.left); + this.dom.rightContainer.appendChild(this.dom.right); - // background box - dom.box = document.createElement('div'); - // className is updated in redraw() + this.dom.centerContainer.appendChild(this.dom.shadowTop); + this.dom.centerContainer.appendChild(this.dom.shadowBottom); + this.dom.leftContainer.appendChild(this.dom.shadowTopLeft); + this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft); + this.dom.rightContainer.appendChild(this.dom.shadowTopRight); + this.dom.rightContainer.appendChild(this.dom.shadowBottomRight); - // contents box - dom.content = document.createElement('div'); - dom.content.className = 'content'; - dom.box.appendChild(dom.content); + this.on('rangechange', this.redraw.bind(this)); + this.on('change', this.redraw.bind(this)); + this.on('touch', this._onTouch.bind(this)); + this.on('pinch', this._onPinch.bind(this)); + this.on('dragstart', this._onDragStart.bind(this)); + this.on('drag', this._onDrag.bind(this)); - // attach this item as attribute - dom.box['timeline-item'] = this; - } + // create event listeners for all interesting events, these events will be + // emitted via emitter + this.hammer = Hammer(this.dom.root, { + prevent_default: true + }); + this.listeners = {}; - // append DOM to parent DOM - if (!this.parent) { - throw new Error('Cannot redraw item: no parent attached'); - } - if (!dom.box.parentNode) { - var foreground = this.parent.dom.foreground; - if (!foreground) { - throw new Error('Cannot redraw time axis: parent has no foreground container element'); - } - foreground.appendChild(dom.box); - } - this.displayed = true; + var me = this; + var events = [ + 'touch', 'pinch', + 'tap', 'doubletap', 'hold', + 'dragstart', 'drag', 'dragend', + 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox + ]; + events.forEach(function (event) { + var listener = function () { + var args = [event].concat(Array.prototype.slice.call(arguments, 0)); + if (me.isActive()) { + me.emit.apply(me, args); + } + }; + me.hammer.on(event, listener); + me.listeners[event] = listener; + }); - // update contents - if (this.data.content != this.content) { - this.content = this.data.content; - if (this.content instanceof Element) { - dom.content.innerHTML = ''; - dom.content.appendChild(this.content); - } - else if (this.data.content != undefined) { - dom.content.innerHTML = this.content; - } - else { - throw new Error('Property "content" missing in item ' + this.data.id); - } + // size properties of each of the panels + this.props = { + root: {}, + background: {}, + centerContainer: {}, + leftContainer: {}, + rightContainer: {}, + center: {}, + left: {}, + right: {}, + top: {}, + bottom: {}, + border: {}, + scrollTop: 0, + scrollTopMin: 0 + }; + this.touch = {}; // store state information needed for touch events - this.dirty = true; - } + // attach the root panel to the provided container + if (!container) throw new Error('No container provided'); + container.appendChild(this.dom.root); + }; - // update title - if (this.data.title != this.title) { - dom.box.title = this.data.title; - this.title = this.data.title; - } + /** + * Set options. Options will be passed to all components loaded in the Timeline. + * @param {Object} [options] + * {String} orientation + * Vertical orientation for the Timeline, + * can be 'bottom' (default) or 'top'. + * {String | Number} width + * Width for the timeline, a number in pixels or + * a css string like '1000px' or '75%'. '100%' by default. + * {String | Number} height + * Fixed height for the Timeline, a number in pixels or + * a css string like '400px' or '75%'. If undefined, + * The Timeline will automatically size such that + * its contents fit. + * {String | Number} minHeight + * Minimum height for the Timeline, a number in pixels or + * a css string like '400px' or '75%'. + * {String | Number} maxHeight + * Maximum height for the Timeline, a number in pixels or + * a css string like '400px' or '75%'. + * {Number | Date | String} start + * Start date for the visible window + * {Number | Date | String} end + * End date for the visible window + */ + Core.prototype.setOptions = function (options) { + if (options) { + // copy the known options + var fields = ['width', 'height', 'minHeight', 'maxHeight', 'autoResize', 'start', 'end', 'orientation', 'clickToUse']; + util.selectiveExtend(fields, this.options, options); - // update class - var className = (this.data.className ? (' ' + this.data.className) : '') + - (this.selected ? ' selected' : ''); - if (this.className != className) { - this.className = className; - dom.box.className = this.baseClassName + className; + if ('clickToUse' in options) { + if (options.clickToUse) { + this.activator = new Activator(this.dom.root); + } + else { + if (this.activator) { + this.activator.destroy(); + delete this.activator; + } + } + } - this.dirty = true; + // enable/disable autoResize + this._initAutoResize(); } - // recalculate size - if (this.dirty) { - // determine from css whether this box has overflow - this.overflow = window.getComputedStyle(dom.content).overflow !== 'hidden'; - - this.props.content.width = this.dom.content.offsetWidth; - this.height = this.dom.box.offsetHeight; + // propagate options to all components + this.components.forEach(function (component) { + component.setOptions(options); + }); - this.dirty = false; + // TODO: remove deprecation error one day (deprecated since version 0.8.0) + if (options && options.order) { + throw new Error('Option order is deprecated. There is no replacement for this feature.'); } - this._repaintDeleteButton(dom.box); - this._repaintDragLeft(); - this._repaintDragRight(); + // redraw everything + this.redraw(); }; /** - * Show the item in the DOM (when not already visible). The items DOM will - * be created when needed. + * Returns true when the Timeline is active. + * @returns {boolean} */ - ItemRange.prototype.show = function() { - if (!this.displayed) { - this.redraw(); - } + Core.prototype.isActive = function () { + return !this.activator || this.activator.active; }; /** - * Hide the item from the DOM (when visible) - * @return {Boolean} changed + * Destroy the Core, clean up all DOM elements and event listeners. */ - ItemRange.prototype.hide = function() { - if (this.displayed) { - var box = this.dom.box; + Core.prototype.destroy = function () { + // unbind datasets + this.clear(); - if (box.parentNode) { - box.parentNode.removeChild(box); - } + // remove all event listeners + this.off(); - this.top = null; - this.left = null; + // stop checking for changed size + this._stopAutoResize(); - this.displayed = false; + // remove from DOM + if (this.dom.root.parentNode) { + this.dom.root.parentNode.removeChild(this.dom.root); } - }; - - /** - * Reposition the item horizontally - * @Override - */ - ItemRange.prototype.repositionX = function() { - var props = this.props, - parentWidth = this.parent.width, - start = this.conversion.toScreen(this.data.start), - end = this.conversion.toScreen(this.data.end), - padding = this.options.padding, - contentLeft; + this.dom = null; - // limit the width of the this, as browsers cannot draw very wide divs - if (start < -parentWidth) { - start = -parentWidth; + // remove Activator + if (this.activator) { + this.activator.destroy(); + delete this.activator; } - if (end > 2 * parentWidth) { - end = 2 * parentWidth; + + // cleanup hammer touch events + for (var event in this.listeners) { + if (this.listeners.hasOwnProperty(event)) { + delete this.listeners[event]; + } } - var boxWidth = Math.max(end - start, 1); + this.listeners = null; + this.hammer = null; - if (this.overflow) { - // when range exceeds left of the window, position the contents at the left of the visible area - contentLeft = Math.max(-start, 0); + // give all components the opportunity to cleanup + this.components.forEach(function (component) { + component.destroy(); + }); - this.left = start; - this.width = boxWidth + this.props.content.width; - // Note: The calculation of width is an optimistic calculation, giving - // a width which will not change when moving the Timeline - // So no restacking needed, which is nicer for the eye; - } - else { // no overflow - // when range exceeds left of the window, position the contents at the left of the visible area - if (start < 0) { - contentLeft = Math.min(-start, - (end - start - props.content.width - 2 * padding)); - // TODO: remove the need for options.padding. it's terrible. - } - else { - contentLeft = 0; - } + this.body = null; + }; - this.left = start; - this.width = boxWidth; + + /** + * Set a custom time bar + * @param {Date} time + */ + Core.prototype.setCustomTime = function (time) { + if (!this.customTime) { + throw new Error('Cannot get custom time: Custom time bar is not enabled'); } - this.dom.box.style.left = this.left + 'px'; - this.dom.box.style.width = boxWidth + 'px'; - this.dom.content.style.left = contentLeft + 'px'; + this.customTime.setCustomTime(time); }; /** - * Reposition the item vertically - * @Override + * Retrieve the current custom time. + * @return {Date} customTime */ - ItemRange.prototype.repositionY = function() { - var orientation = this.options.orientation, - box = this.dom.box; - - if (orientation == 'top') { - box.style.top = this.top + 'px'; - } - else { - box.style.top = (this.parent.height - this.top - this.height) + 'px'; + Core.prototype.getCustomTime = function() { + if (!this.customTime) { + throw new Error('Cannot get custom time: Custom time bar is not enabled'); } + + return this.customTime.getCustomTime(); }; + /** - * Repaint a drag area on the left side of the range when the range is selected - * @protected + * Get the id's of the currently visible items. + * @returns {Array} The ids of the visible items */ - ItemRange.prototype._repaintDragLeft = function () { - if (this.selected && this.options.editable.updateTime && !this.dom.dragLeft) { - // create and show drag area - var dragLeft = document.createElement('div'); - dragLeft.className = 'drag-left'; - dragLeft.dragLeftItem = this; + Core.prototype.getVisibleItems = function() { + return this.itemSet && this.itemSet.getVisibleItems() || []; + }; - // TODO: this should be redundant? - Hammer(dragLeft, { - preventDefault: true - }).on('drag', function () { - //console.log('drag left') - }); - this.dom.box.appendChild(dragLeft); - this.dom.dragLeft = dragLeft; + + /** + * Clear the Core. By Default, items, groups and options are cleared. + * Example usage: + * + * timeline.clear(); // clear items, groups, and options + * timeline.clear({options: true}); // clear options only + * + * @param {Object} [what] Optionally specify what to clear. By default: + * {items: true, groups: true, options: true} + */ + Core.prototype.clear = function(what) { + // clear items + if (!what || what.items) { + this.setItems(null); } - else if (!this.selected && this.dom.dragLeft) { - // delete drag area - if (this.dom.dragLeft.parentNode) { - this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft); - } - this.dom.dragLeft = null; + + // clear groups + if (!what || what.groups) { + this.setGroups(null); + } + + // clear options of timeline and of each of the components + if (!what || what.options) { + this.components.forEach(function (component) { + component.setOptions(component.defaultOptions); + }); + + this.setOptions(this.defaultOptions); // this will also do a redraw } }; /** - * Repaint a drag area on the right side of the range when the range is selected - * @protected + * Set Core window such that it fits all items */ - ItemRange.prototype._repaintDragRight = function () { - if (this.selected && this.options.editable.updateTime && !this.dom.dragRight) { - // create and show drag area - var dragRight = document.createElement('div'); - dragRight.className = 'drag-right'; - dragRight.dragRightItem = this; - - // TODO: this should be redundant? - Hammer(dragRight, { - preventDefault: true - }).on('drag', function () { - //console.log('drag right') - }); + Core.prototype.fit = function() { + // apply the data range as range + var dataRange = this.getItemRange(); - this.dom.box.appendChild(dragRight); - this.dom.dragRight = dragRight; - } - else if (!this.selected && this.dom.dragRight) { - // delete drag area - if (this.dom.dragRight.parentNode) { - this.dom.dragRight.parentNode.removeChild(this.dom.dragRight); + // add 5% space on both sides + var start = dataRange.min; + var end = dataRange.max; + if (start != null && end != null) { + var interval = (end.valueOf() - start.valueOf()); + if (interval <= 0) { + // prevent an empty interval + interval = 24 * 60 * 60 * 1000; // 1 day } - this.dom.dragRight = null; + start = new Date(start.valueOf() - interval * 0.05); + end = new Date(end.valueOf() + interval * 0.05); } - }; - module.exports = ItemRange; - - -/***/ }, -/* 32 */ -/***/ function(module, exports, __webpack_require__) { + // skip range set if there is no start and end date + if (start === null && end === null) { + return; + } - var Emitter = __webpack_require__(49); - var Hammer = __webpack_require__(41); - var mousetrap = __webpack_require__(50); - var util = __webpack_require__(1); - var hammerUtil = __webpack_require__(43); - var DataSet = __webpack_require__(3); - var DataView = __webpack_require__(4); - var dotparser = __webpack_require__(38); - var gephiParser = __webpack_require__(39); - var Groups = __webpack_require__(34); - var Images = __webpack_require__(35); - var Node = __webpack_require__(36); - var Edge = __webpack_require__(33); - var Popup = __webpack_require__(37); - var MixinLoader = __webpack_require__(47); - var Activator = __webpack_require__(48); - var locales = __webpack_require__(45); + this.range.setRange(start, end); + }; - // Load custom shapes into CanvasRenderingContext2D - __webpack_require__(46); /** - * @constructor Network - * Create a network visualization, displaying nodes and edges. + * Set the visible window. Both parameters are optional, you can change only + * start or only end. Syntax: * - * @param {Element} container The DOM element in which the Network will - * be created. Normally a div element. - * @param {Object} data An object containing parameters - * {Array} nodes - * {Array} edges - * @param {Object} options Options + * TimeLine.setWindow(start, end) + * TimeLine.setWindow(range) + * + * Where start and end can be a Date, number, or string, and range is an + * object with properties start and end. + * + * @param {Date | Number | String | Object} [start] Start date of visible window + * @param {Date | Number | String} [end] End date of visible window */ - function Network (container, data, options) { - if (!(this instanceof Network)) { - throw new SyntaxError('Constructor must be called with the new operator'); + Core.prototype.setWindow = function(start, end) { + if (arguments.length == 1) { + var range = arguments[0]; + this.range.setRange(range.start, range.end); } - - this._initializeMixinLoaders(); - - // create variables and set default values - this.containerElement = container; - - // render and calculation settings - this.renderRefreshRate = 60; // hz (fps) - this.renderTimestep = 1000 / this.renderRefreshRate; // ms -- saves calculation later on - this.renderTime = 0.5 * this.renderTimestep; // measured time it takes to render a frame - this.maxPhysicsTicksPerRender = 3; // max amount of physics ticks per render step. - this.physicsDiscreteStepsize = 0.50; // discrete stepsize of the simulation - - this.initializing = true; - - this.triggerFunctions = {add:null,edit:null,editEdge:null,connect:null,del:null}; - - // set constant values - this.defaultOptions = { - nodes: { - mass: 1, - radiusMin: 10, - radiusMax: 30, - radius: 10, - shape: 'ellipse', - image: undefined, - widthMin: 16, // px - widthMax: 64, // px - fixed: false, - fontColor: 'black', - fontSize: 14, // px - fontFace: 'verdana', - level: -1, - color: { - border: '#2B7CE9', - background: '#97C2FC', - highlight: { - border: '#2B7CE9', - background: '#D2E5FF' - }, - hover: { - border: '#2B7CE9', - background: '#D2E5FF' - } - }, - borderColor: '#2B7CE9', - backgroundColor: '#97C2FC', - highlightColor: '#D2E5FF', - group: undefined, - borderWidth: 1 - }, - edges: { - widthMin: 1, - widthMax: 15, - width: 1, - widthSelectionMultiplier: 2, - hoverWidth: 1.5, - style: 'line', - color: { - color:'#848484', - highlight:'#848484', - hover: '#848484' - }, - fontColor: '#343434', - fontSize: 14, // px - fontFace: 'arial', - fontFill: 'white', - arrowScaleFactor: 1, - dash: { - length: 10, - gap: 5, - altLength: undefined - }, - inheritColor: "from" // to, from, false, true (== from) - }, - configurePhysics:false, - physics: { - barnesHut: { - enabled: true, - theta: 1 / 0.6, // inverted to save time during calculation - gravitationalConstant: -2000, - centralGravity: 0.3, - springLength: 95, - springConstant: 0.04, - damping: 0.09 - }, - repulsion: { - centralGravity: 0.0, - springLength: 200, - springConstant: 0.05, - nodeDistance: 100, - damping: 0.09 - }, - hierarchicalRepulsion: { - enabled: false, - centralGravity: 0.0, - springLength: 100, - springConstant: 0.01, - nodeDistance: 150, - damping: 0.09 - }, - damping: null, - centralGravity: null, - springLength: null, - springConstant: null - }, - clustering: { // Per Node in Cluster = PNiC - enabled: false, // (Boolean) | global on/off switch for clustering. - initialMaxNodes: 100, // (# nodes) | if the initial amount of nodes is larger than this, we cluster until the total number is less than this threshold. - clusterThreshold:500, // (# nodes) | during calculate forces, we check if the total number of nodes is larger than this. If it is, cluster until reduced to reduceToNodes - reduceToNodes:300, // (# nodes) | during calculate forces, we check if the total number of nodes is larger than clusterThreshold. If it is, cluster until reduced to this - chainThreshold: 0.4, // (% of all drawn nodes)| maximum percentage of allowed chainnodes (long strings of connected nodes) within all nodes. (lower means less chains). - clusterEdgeThreshold: 20, // (px) | edge length threshold. if smaller, this node is clustered. - sectorThreshold: 100, // (# nodes in cluster) | cluster size threshold. If larger, expanding in own sector. - screenSizeThreshold: 0.2, // (% of canvas) | relative size threshold. If the width or height of a clusternode takes up this much of the screen, decluster node. - fontSizeMultiplier: 4.0, // (px PNiC) | how much the cluster font size grows per node in cluster (in px). - maxFontSize: 1000, - forceAmplification: 0.1, // (multiplier PNiC) | factor of increase fo the repulsion force of a cluster (per node in cluster). - distanceAmplification: 0.1, // (multiplier PNiC) | factor how much the repulsion distance of a cluster increases (per node in cluster). - edgeGrowth: 20, // (px PNiC) | amount of clusterSize connected to the edge is multiplied with this and added to edgeLength. - nodeScaling: {width: 1, // (px PNiC) | growth of the width per node in cluster. - height: 1, // (px PNiC) | growth of the height per node in cluster. - radius: 1}, // (px PNiC) | growth of the radius per node in cluster. - maxNodeSizeIncrements: 600, // (# increments) | max growth of the width per node in cluster. - activeAreaBoxSize: 80, // (px) | box area around the curser where clusters are popped open. - clusterLevelDifference: 2 - }, - navigation: { - enabled: false - }, - keyboard: { - enabled: false, - speed: {x: 10, y: 10, zoom: 0.02} - }, - dataManipulation: { - enabled: false, - initiallyVisible: false - }, - hierarchicalLayout: { - enabled:false, - levelSeparation: 150, - nodeSpacing: 100, - direction: "UD" // UD, DU, LR, RL - }, - freezeForStabilization: false, - smoothCurves: { - enabled: true, - dynamic: true, - type: "continuous", - roundness: 0.5 - }, - dynamicSmoothCurves: true, - maxVelocity: 30, - minVelocity: 0.1, // px/s - stabilize: true, // stabilize before displaying the network - stabilizationIterations: 1000, // maximum number of iteration to stabilize - locale: 'en', - locales: locales, - tooltip: { - delay: 300, - fontColor: 'black', - fontSize: 14, // px - fontFace: 'verdana', - color: { - border: '#666', - background: '#FFFFC6' - } - }, - dragNetwork: true, - dragNodes: true, - zoomable: true, - hover: false, - hideEdgesOnDrag: false, - hideNodesOnDrag: false, - width : '100%', - height : '100%', - selectable: true + else { + this.range.setRange(start, end); + } + }; + + /** + * Get the visible window + * @return {{start: Date, end: Date}} Visible range + */ + Core.prototype.getWindow = function() { + var range = this.range.getRange(); + return { + start: new Date(range.start), + end: new Date(range.end) }; - this.constants = util.extend({}, this.defaultOptions); + }; - this.hoverObj = {nodes:{},edges:{}}; - this.controlNodesActive = false; + /** + * Force a redraw of the Core. Can be useful to manually redraw when + * option autoResize=false + */ + Core.prototype.redraw = function() { + var resized = false, + options = this.options, + props = this.props, + dom = this.dom; - // Node variables - var network = this; - this.groups = new Groups(); // object with groups - this.images = new Images(); // object with images - this.images.setOnloadCallback(function () { - network._redraw(); + if (!dom) return; // when destroyed + + // update class names + if (options.orientation == 'top') { + util.addClassName(dom.root, 'top'); + util.removeClassName(dom.root, 'bottom'); + } + else { + util.removeClassName(dom.root, 'top'); + util.addClassName(dom.root, 'bottom'); + } + + // update root width and height options + dom.root.style.maxHeight = util.option.asSize(options.maxHeight, ''); + dom.root.style.minHeight = util.option.asSize(options.minHeight, ''); + dom.root.style.width = util.option.asSize(options.width, ''); + + // calculate border widths + props.border.left = (dom.centerContainer.offsetWidth - dom.centerContainer.clientWidth) / 2; + props.border.right = props.border.left; + props.border.top = (dom.centerContainer.offsetHeight - dom.centerContainer.clientHeight) / 2; + props.border.bottom = props.border.top; + var borderRootHeight= dom.root.offsetHeight - dom.root.clientHeight; + var borderRootWidth = dom.root.offsetWidth - dom.root.clientWidth; + + // calculate the heights. If any of the side panels is empty, we set the height to + // minus the border width, such that the border will be invisible + props.center.height = dom.center.offsetHeight; + props.left.height = dom.left.offsetHeight; + props.right.height = dom.right.offsetHeight; + props.top.height = dom.top.clientHeight || -props.border.top; + props.bottom.height = dom.bottom.clientHeight || -props.border.bottom; + + // TODO: compensate borders when any of the panels is empty. + + // apply auto height + // TODO: only calculate autoHeight when needed (else we cause an extra reflow/repaint of the DOM) + var contentHeight = Math.max(props.left.height, props.center.height, props.right.height); + var autoHeight = props.top.height + contentHeight + props.bottom.height + + borderRootHeight + props.border.top + props.border.bottom; + dom.root.style.height = util.option.asSize(options.height, autoHeight + 'px'); + + // calculate heights of the content panels + props.root.height = dom.root.offsetHeight; + props.background.height = props.root.height - borderRootHeight; + var containerHeight = props.root.height - props.top.height - props.bottom.height - + borderRootHeight; + props.centerContainer.height = containerHeight; + props.leftContainer.height = containerHeight; + props.rightContainer.height = props.leftContainer.height; + + // calculate the widths of the panels + props.root.width = dom.root.offsetWidth; + props.background.width = props.root.width - borderRootWidth; + props.left.width = dom.leftContainer.clientWidth || -props.border.left; + props.leftContainer.width = props.left.width; + props.right.width = dom.rightContainer.clientWidth || -props.border.right; + props.rightContainer.width = props.right.width; + var centerWidth = props.root.width - props.left.width - props.right.width - borderRootWidth; + props.center.width = centerWidth; + props.centerContainer.width = centerWidth; + props.top.width = centerWidth; + props.bottom.width = centerWidth; + + // resize the panels + dom.background.style.height = props.background.height + 'px'; + dom.backgroundVertical.style.height = props.background.height + 'px'; + dom.backgroundHorizontal.style.height = props.centerContainer.height + 'px'; + dom.centerContainer.style.height = props.centerContainer.height + 'px'; + dom.leftContainer.style.height = props.leftContainer.height + 'px'; + dom.rightContainer.style.height = props.rightContainer.height + 'px'; + + dom.background.style.width = props.background.width + 'px'; + dom.backgroundVertical.style.width = props.centerContainer.width + 'px'; + dom.backgroundHorizontal.style.width = props.background.width + 'px'; + dom.centerContainer.style.width = props.center.width + 'px'; + dom.top.style.width = props.top.width + 'px'; + dom.bottom.style.width = props.bottom.width + 'px'; + + // reposition the panels + dom.background.style.left = '0'; + dom.background.style.top = '0'; + dom.backgroundVertical.style.left = props.left.width + 'px'; + dom.backgroundVertical.style.top = '0'; + dom.backgroundHorizontal.style.left = '0'; + dom.backgroundHorizontal.style.top = props.top.height + 'px'; + dom.centerContainer.style.left = props.left.width + 'px'; + dom.centerContainer.style.top = props.top.height + 'px'; + dom.leftContainer.style.left = '0'; + dom.leftContainer.style.top = props.top.height + 'px'; + dom.rightContainer.style.left = (props.left.width + props.center.width) + 'px'; + dom.rightContainer.style.top = props.top.height + 'px'; + dom.top.style.left = props.left.width + 'px'; + dom.top.style.top = '0'; + dom.bottom.style.left = props.left.width + 'px'; + dom.bottom.style.top = (props.top.height + props.centerContainer.height) + 'px'; + + // update the scrollTop, feasible range for the offset can be changed + // when the height of the Core or of the contents of the center changed + this._updateScrollTop(); + + // reposition the scrollable contents + var offset = this.props.scrollTop; + if (options.orientation == 'bottom') { + offset += Math.max(this.props.centerContainer.height - this.props.center.height - + this.props.border.top - this.props.border.bottom, 0); + } + dom.center.style.left = '0'; + dom.center.style.top = offset + 'px'; + dom.left.style.left = '0'; + dom.left.style.top = offset + 'px'; + dom.right.style.left = '0'; + dom.right.style.top = offset + 'px'; + + // show shadows when vertical scrolling is available + var visibilityTop = this.props.scrollTop == 0 ? 'hidden' : ''; + var visibilityBottom = this.props.scrollTop == this.props.scrollTopMin ? 'hidden' : ''; + dom.shadowTop.style.visibility = visibilityTop; + dom.shadowBottom.style.visibility = visibilityBottom; + dom.shadowTopLeft.style.visibility = visibilityTop; + dom.shadowBottomLeft.style.visibility = visibilityBottom; + dom.shadowTopRight.style.visibility = visibilityTop; + dom.shadowBottomRight.style.visibility = visibilityBottom; + + // redraw all components + this.components.forEach(function (component) { + resized = component.redraw() || resized; }); + if (resized) { + // keep repainting until all sizes are settled + this.redraw(); + } + }; - // keyboard navigation variables - this.xIncrement = 0; - this.yIncrement = 0; - this.zoomIncrement = 0; + // TODO: deprecated since version 1.1.0, remove some day + Core.prototype.repaint = function () { + throw new Error('Function repaint is deprecated. Use redraw instead.'); + }; - // loading all the mixins: - // load the force calculation functions, grouped under the physics system. - this._loadPhysicsSystem(); - // create a frame and canvas - this._create(); - // load the sector system. (mandatory, fully integrated with Network) - this._loadSectorSystem(); - // load the cluster system. (mandatory, even when not using the cluster system, there are function calls to it) - this._loadClusterSystem(); - // load the selection system. (mandatory, required by Network) - this._loadSelectionSystem(); - // load the selection system. (mandatory, required by Network) - this._loadHierarchySystem(); + /** + * Convert a position on screen (pixels) to a datetime + * @param {int} x Position on the screen in pixels + * @return {Date} time The datetime the corresponds with given position x + * @private + */ + // TODO: move this function to Range + Core.prototype._toTime = function(x) { + var conversion = this.range.conversion(this.props.center.width); + return new Date(x / conversion.scale + conversion.offset); + }; - // apply options - this._setTranslation(this.frame.clientWidth / 2, this.frame.clientHeight / 2); - this._setScale(1); - this.setOptions(options); - // other vars - this.freezeSimulation = false;// freeze the simulation - this.cachedFunctions = {}; + /** + * Convert a position on the global screen (pixels) to a datetime + * @param {int} x Position on the screen in pixels + * @return {Date} time The datetime the corresponds with given position x + * @private + */ + // TODO: move this function to Range + Core.prototype._toGlobalTime = function(x) { + var conversion = this.range.conversion(this.props.root.width); + return new Date(x / conversion.scale + conversion.offset); + }; - // containers for nodes and edges - this.calculationNodes = {}; - this.calculationNodeIndices = []; - this.nodeIndices = []; // array with all the indices of the nodes. Used to speed up forces calculation - this.nodes = {}; // object with Node objects - this.edges = {}; // object with Edge objects + /** + * Convert a datetime (Date object) into a position on the screen + * @param {Date} time A date + * @return {int} x The position on the screen in pixels which corresponds + * with the given date. + * @private + */ + // TODO: move this function to Range + Core.prototype._toScreen = function(time) { + var conversion = this.range.conversion(this.props.center.width); + return (time.valueOf() - conversion.offset) * conversion.scale; + }; + + + /** + * Convert a datetime (Date object) into a position on the root + * This is used to get the pixel density estimate for the screen, not the center panel + * @param {Date} time A date + * @return {int} x The position on root in pixels which corresponds + * with the given date. + * @private + */ + // TODO: move this function to Range + Core.prototype._toGlobalScreen = function(time) { + var conversion = this.range.conversion(this.props.root.width); + return (time.valueOf() - conversion.offset) * conversion.scale; + }; + + + /** + * Initialize watching when option autoResize is true + * @private + */ + Core.prototype._initAutoResize = function () { + if (this.options.autoResize == true) { + this._startAutoResize(); + } + else { + this._stopAutoResize(); + } + }; - // position and scale variables and objects - this.canvasTopLeft = {"x": 0,"y": 0}; // coordinates of the top left of the canvas. they will be set during _redraw. - this.canvasBottomRight = {"x": 0,"y": 0}; // coordinates of the bottom right of the canvas. they will be set during _redraw - this.pointerPosition = {"x": 0,"y": 0}; // coordinates of the bottom right of the canvas. they will be set during _redraw - this.areaCenter = {}; // object with x and y elements used for determining the center of the zoom action - this.scale = 1; // defining the global scale variable in the constructor - this.previousScale = this.scale; // this is used to check if the zoom operation is zooming in or out + /** + * Watch for changes in the size of the container. On resize, the Panel will + * automatically redraw itself. + * @private + */ + Core.prototype._startAutoResize = function () { + var me = this; - // datasets or dataviews - this.nodesData = null; // A DataSet or DataView - this.edgesData = null; // A DataSet or DataView + this._stopAutoResize(); - // create event listeners used to subscribe on the DataSets of the nodes and edges - this.nodesListeners = { - 'add': function (event, params) { - network._addNodes(params.items); - network.start(); - }, - 'update': function (event, params) { - network._updateNodes(params.items); - network.start(); - }, - 'remove': function (event, params) { - network._removeNodes(params.items); - network.start(); + this._onResize = function() { + if (me.options.autoResize != true) { + // stop watching when the option autoResize is changed to false + me._stopAutoResize(); + return; } - }; - this.edgesListeners = { - 'add': function (event, params) { - network._addEdges(params.items); - network.start(); - }, - 'update': function (event, params) { - network._updateEdges(params.items); - network.start(); - }, - 'remove': function (event, params) { - network._removeEdges(params.items); - network.start(); + + if (me.dom.root) { + // check whether the frame is resized + if ((me.dom.root.clientWidth != me.props.lastWidth) || + (me.dom.root.clientHeight != me.props.lastHeight)) { + me.props.lastWidth = me.dom.root.clientWidth; + me.props.lastHeight = me.dom.root.clientHeight; + + me.emit('change'); + } } }; - // properties for the animation - this.moving = true; - this.timer = undefined; // Scheduling function. Is definded in this.start(); + // add event listener to window resize + util.addEventListener(window, 'resize', this._onResize); - // load data (the disable start variable will be the same as the enabled clustering) - this.setData(data,this.constants.clustering.enabled || this.constants.hierarchicalLayout.enabled); + this.watchTimer = setInterval(this._onResize, 1000); + }; - // hierarchical layout - this.initializing = false; - if (this.constants.hierarchicalLayout.enabled == true) { - this._setupHierarchicalLayout(); - } - else { - // zoom so all data will fit on the screen, if clustering is enabled, we do not want start to be called here. - if (this.constants.stabilize == false) { - this.zoomExtent(true,this.constants.clustering.enabled); - } + /** + * Stop watching for a resize of the frame. + * @private + */ + Core.prototype._stopAutoResize = function () { + if (this.watchTimer) { + clearInterval(this.watchTimer); + this.watchTimer = undefined; } - // if clustering is disabled, the simulation will have started in the setData function - if (this.constants.clustering.enabled) { - this.startWithClustering(); - } - } + // remove event listener on window.resize + util.removeEventListener(window, 'resize', this._onResize); + this._onResize = null; + }; - // Extend Network with an Emitter mixin - Emitter(Network.prototype); + /** + * Start moving the timeline vertically + * @param {Event} event + * @private + */ + Core.prototype._onTouch = function (event) { + this.touch.allowDragging = true; + }; /** - * Get the script path where the vis.js library is located - * - * @returns {string | null} path Path or null when not found. Path does not - * end with a slash. + * Start moving the timeline vertically + * @param {Event} event * @private */ - Network.prototype._getScriptPath = function() { - var scripts = document.getElementsByTagName( 'script' ); + Core.prototype._onPinch = function (event) { + this.touch.allowDragging = false; + }; - // find script named vis.js or vis.min.js - for (var i = 0; i < scripts.length; i++) { - var src = scripts[i].src; - var match = src && /\/?vis(.min)?\.js$/.exec(src); - if (match) { - // return path without the script name - return src.substring(0, src.length - match[0].length); - } - } + /** + * Start moving the timeline vertically + * @param {Event} event + * @private + */ + Core.prototype._onDragStart = function (event) { + this.touch.initialScrollTop = this.props.scrollTop; + }; - return null; + /** + * Move the timeline vertically + * @param {Event} event + * @private + */ + Core.prototype._onDrag = function (event) { + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.touch.allowDragging) return; + + var delta = event.gesture.deltaY; + + var oldScrollTop = this._getScrollTop(); + var newScrollTop = this._setScrollTop(this.touch.initialScrollTop + delta); + + if (newScrollTop != oldScrollTop) { + this.redraw(); // TODO: this causes two redraws when dragging, the other is triggered by rangechange already + } }; + /** + * Apply a scrollTop + * @param {Number} scrollTop + * @returns {Number} scrollTop Returns the applied scrollTop + * @private + */ + Core.prototype._setScrollTop = function (scrollTop) { + this.props.scrollTop = scrollTop; + this._updateScrollTop(); + return this.props.scrollTop; + }; /** - * Find the center position of the network + * Update the current scrollTop when the height of the containers has been changed + * @returns {Number} scrollTop Returns the applied scrollTop * @private */ - Network.prototype._getRange = function() { - var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (minX > (node.x)) {minX = node.x;} - if (maxX < (node.x)) {maxX = node.x;} - if (minY > (node.y)) {minY = node.y;} - if (maxY < (node.y)) {maxY = node.y;} + Core.prototype._updateScrollTop = function () { + // recalculate the scrollTopMin + var scrollTopMin = Math.min(this.props.centerContainer.height - this.props.center.height, 0); // is negative or zero + if (scrollTopMin != this.props.scrollTopMin) { + // in case of bottom orientation, change the scrollTop such that the contents + // do not move relative to the time axis at the bottom + if (this.options.orientation == 'bottom') { + this.props.scrollTop += (scrollTopMin - this.props.scrollTopMin); } + this.props.scrollTopMin = scrollTopMin; } - if (minX == 1e9 && maxX == -1e9 && minY == 1e9 && maxY == -1e9) { - minY = 0, maxY = 0, minX = 0, maxX = 0; - } - return {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; - }; + // limit the scrollTop to the feasible scroll range + if (this.props.scrollTop > 0) this.props.scrollTop = 0; + if (this.props.scrollTop < scrollTopMin) this.props.scrollTop = scrollTopMin; + + return this.props.scrollTop; + }; /** - * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; - * @returns {{x: number, y: number}} + * Get the current scrollTop + * @returns {number} scrollTop * @private */ - Network.prototype._findCenter = function(range) { - return {x: (0.5 * (range.maxX + range.minX)), - y: (0.5 * (range.maxY + range.minY))}; + Core.prototype._getScrollTop = function () { + return this.props.scrollTop; }; + module.exports = Core; + + +/***/ }, +/* 24 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var Component = __webpack_require__(22); + var TimeStep = __webpack_require__(25); + var moment = __webpack_require__(2); + + /** + * A horizontal time axis + * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body + * @param {Object} [options] See TimeAxis.setOptions for the available + * options. + * @constructor TimeAxis + * @extends Component + */ + function TimeAxis (body, options) { + this.dom = { + foreground: null, + majorLines: [], + majorTexts: [], + minorLines: [], + minorTexts: [], + redundant: { + majorLines: [], + majorTexts: [], + minorLines: [], + minorTexts: [] + } + }; + this.props = { + range: { + start: 0, + end: 0, + minimumStep: 0 + }, + lineTop: 0 + }; + + this.defaultOptions = { + orientation: 'bottom', // supported: 'top', 'bottom' + // TODO: implement timeaxis orientations 'left' and 'right' + showMinorLabels: true, + showMajorLabels: true + }; + this.options = util.extend({}, this.defaultOptions); - /** - * center the network - * - * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; - */ - Network.prototype._centerNetwork = function(range) { - var center = this._findCenter(range); + this.body = body; - center.x *= this.scale; - center.y *= this.scale; - center.x -= 0.5 * this.frame.canvas.clientWidth; - center.y -= 0.5 * this.frame.canvas.clientHeight; + // create the HTML DOM + this._create(); - this._setTranslation(-center.x,-center.y); // set at 0,0 - }; + this.setOptions(options); + } + TimeAxis.prototype = new Component(); /** - * This function zooms out to fit all data on screen based on amount of nodes - * - * @param {Boolean} [initialZoom] | zoom based on fitted formula or range, true = fitted, default = false; - * @param {Boolean} [disableStart] | If true, start is not called. + * Set options for the TimeAxis. + * Parameters will be merged in current options. + * @param {Object} options Available options: + * {string} [orientation] + * {boolean} [showMinorLabels] + * {boolean} [showMajorLabels] */ - Network.prototype.zoomExtent = function(initialZoom, disableStart) { - if (initialZoom === undefined) { - initialZoom = false; - } - if (disableStart === undefined) { - disableStart = false; - } - - var range = this._getRange(); - var zoomLevel; + TimeAxis.prototype.setOptions = function(options) { + if (options) { + // copy all options that we know + util.selectiveExtend(['orientation', 'showMinorLabels', 'showMajorLabels'], this.options, options); - if (initialZoom == true) { - var numberOfNodes = this.nodeIndices.length; - if (this.constants.smoothCurves == true) { - if (this.constants.clustering.enabled == true && - numberOfNodes >= this.constants.clustering.initialMaxNodes) { - zoomLevel = 49.07548 / (numberOfNodes + 142.05338) + 9.1444e-04; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. - } - else { - zoomLevel = 12.662 / (numberOfNodes + 7.4147) + 0.0964822; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. - } - } - else { - if (this.constants.clustering.enabled == true && - numberOfNodes >= this.constants.clustering.initialMaxNodes) { - zoomLevel = 77.5271985 / (numberOfNodes + 187.266146) + 4.76710517e-05; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. + // apply locale to moment.js + // TODO: not so nice, this is applied globally to moment.js + if ('locale' in options) { + if (typeof moment.locale === 'function') { + // moment.js 2.8.1+ + moment.locale(options.locale); } else { - zoomLevel = 30.5062972 / (numberOfNodes + 19.93597763) + 0.08413486; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. + moment.lang(options.locale); } } - - // correct for larger canvasses. - var factor = Math.min(this.frame.canvas.clientWidth / 600, this.frame.canvas.clientHeight / 600); - zoomLevel *= factor; - } - else { - var xDistance = (Math.abs(range.minX) + Math.abs(range.maxX)) * 1.1; - var yDistance = (Math.abs(range.minY) + Math.abs(range.maxY)) * 1.1; - - var xZoomLevel = this.frame.canvas.clientWidth / xDistance; - var yZoomLevel = this.frame.canvas.clientHeight / yDistance; - - zoomLevel = (xZoomLevel <= yZoomLevel) ? xZoomLevel : yZoomLevel; - } - - if (zoomLevel > 1.0) { - zoomLevel = 1.0; - } - - - this._setScale(zoomLevel); - this._centerNetwork(range); - if (disableStart == false) { - this.moving = true; - this.start(); } }; - /** - * Update the this.nodeIndices with the most recent node index list - * @private + * Create the HTML DOM for the TimeAxis */ - Network.prototype._updateNodeIndexList = function() { - this._clearNodeIndexList(); - for (var idx in this.nodes) { - if (this.nodes.hasOwnProperty(idx)) { - this.nodeIndices.push(idx); - } - } - }; + TimeAxis.prototype._create = function() { + this.dom.foreground = document.createElement('div'); + this.dom.background = document.createElement('div'); + this.dom.foreground.className = 'timeaxis foreground'; + this.dom.background.className = 'timeaxis background'; + }; /** - * Set nodes and edges, and optionally options as well. - * - * @param {Object} data Object containing parameters: - * {Array | DataSet | DataView} [nodes] Array with nodes - * {Array | DataSet | DataView} [edges] Array with edges - * {String} [dot] String containing data in DOT format - * {String} [gephi] String containing data in gephi JSON format - * {Options} [options] Object with options - * @param {Boolean} [disableStart] | optional: disable the calling of the start function. + * Destroy the TimeAxis */ - Network.prototype.setData = function(data, disableStart) { - if (disableStart === undefined) { - disableStart = false; - } - - if (data && data.dot && (data.nodes || data.edges)) { - throw new SyntaxError('Data must contain either parameter "dot" or ' + - ' parameter pair "nodes" and "edges", but not both.'); - } - - // set options - this.setOptions(data && data.options); - - // set all data - if (data && data.dot) { - // parse DOT file - if(data && data.dot) { - var dotData = dotparser.DOTToGraph(data.dot); - this.setData(dotData); - return; - } - } - else if (data && data.gephi) { - // parse DOT file - if(data && data.gephi) { - var gephiData = gephiParser.parseGephi(data.gephi); - this.setData(gephiData); - return; - } + TimeAxis.prototype.destroy = function() { + // remove from DOM + if (this.dom.foreground.parentNode) { + this.dom.foreground.parentNode.removeChild(this.dom.foreground); } - else { - this._setNodes(data && data.nodes); - this._setEdges(data && data.edges); + if (this.dom.background.parentNode) { + this.dom.background.parentNode.removeChild(this.dom.background); } - this._putDataInSector(); - if (!disableStart) { - // find a stable position or start animating to a stable position - if (this.constants.stabilize) { - var me = this; - setTimeout(function() {me._stabilize(); me.start();},0) - } - else { - this.start(); - } - } + this.body = null; }; /** - * Set options - * @param {Object} options + * Repaint the component + * @return {boolean} Returns true if the component is resized */ - Network.prototype.setOptions = function (options) { - if (options) { - var prop; + TimeAxis.prototype.redraw = function () { + var options = this.options, + props = this.props, + foreground = this.dom.foreground, + background = this.dom.background; - var fields = ['nodes','edges','smoothCurves','hierarchicalLayout','clustering','navigation','keyboard','dataManipulation', - 'onAdd','onEdit','onEditEdge','onConnect','onDelete','clickToUse' - ]; - util.selectiveNotDeepExtend(fields,this.constants, options); - util.selectiveNotDeepExtend(['color'],this.constants.nodes, options.nodes); - util.selectiveNotDeepExtend(['color','length'],this.constants.edges, options.edges); + // determine the correct parent DOM element (depending on option orientation) + var parent = (options.orientation == 'top') ? this.body.dom.top : this.body.dom.bottom; + var parentChanged = (foreground.parentNode !== parent); - if (options.physics) { - util.mergeOptions(this.constants.physics, options.physics,'barnesHut'); - util.mergeOptions(this.constants.physics, options.physics,'repulsion'); + // calculate character width and height + this._calculateCharSize(); - if (options.physics.hierarchicalRepulsion) { - this.constants.hierarchicalLayout.enabled = true; - this.constants.physics.hierarchicalRepulsion.enabled = true; - this.constants.physics.barnesHut.enabled = false; - for (prop in options.physics.hierarchicalRepulsion) { - if (options.physics.hierarchicalRepulsion.hasOwnProperty(prop)) { - this.constants.physics.hierarchicalRepulsion[prop] = options.physics.hierarchicalRepulsion[prop]; - } - } - } - } + // TODO: recalculate sizes only needed when parent is resized or options is changed + var orientation = this.options.orientation, + showMinorLabels = this.options.showMinorLabels, + showMajorLabels = this.options.showMajorLabels; - if (options.onAdd) {this.triggerFunctions.add = options.onAdd;} - if (options.onEdit) {this.triggerFunctions.edit = options.onEdit;} - if (options.onEditEdge) {this.triggerFunctions.editEdge = options.onEditEdge;} - if (options.onConnect) {this.triggerFunctions.connect = options.onConnect;} - if (options.onDelete) {this.triggerFunctions.del = options.onDelete;} + // determine the width and height of the elemens for the axis + props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; + props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; + props.height = props.minorLabelHeight + props.majorLabelHeight; + props.width = foreground.offsetWidth; - util.mergeOptions(this.constants, options,'smoothCurves'); - util.mergeOptions(this.constants, options,'hierarchicalLayout'); - util.mergeOptions(this.constants, options,'clustering'); - util.mergeOptions(this.constants, options,'navigation'); - util.mergeOptions(this.constants, options,'keyboard'); - util.mergeOptions(this.constants, options,'dataManipulation'); + props.minorLineHeight = this.body.domProps.root.height - props.majorLabelHeight - + (options.orientation == 'top' ? this.body.domProps.bottom.height : this.body.domProps.top.height); + props.minorLineWidth = 1; // TODO: really calculate width + props.majorLineHeight = props.minorLineHeight + props.majorLabelHeight; + props.majorLineWidth = 1; // TODO: really calculate width + + // take foreground and background offline while updating (is almost twice as fast) + var foregroundNextSibling = foreground.nextSibling; + var backgroundNextSibling = background.nextSibling; + foreground.parentNode && foreground.parentNode.removeChild(foreground); + background.parentNode && background.parentNode.removeChild(background); + + foreground.style.height = this.props.height + 'px'; + + this._repaintLabels(); + + // put DOM online again (at the same place) + if (foregroundNextSibling) { + parent.insertBefore(foreground, foregroundNextSibling); + } + else { + parent.appendChild(foreground) + } + if (backgroundNextSibling) { + this.body.dom.backgroundVertical.insertBefore(background, backgroundNextSibling); + } + else { + this.body.dom.backgroundVertical.appendChild(background) + } + return this._isResized() || parentChanged; + }; - if (options.dataManipulation) { - this.editMode = this.constants.dataManipulation.initiallyVisible; - } + /** + * Repaint major and minor text labels and vertical grid lines + * @private + */ + TimeAxis.prototype._repaintLabels = function () { + var orientation = this.options.orientation; + // calculate range and step (step such that we have space for 7 characters per label) + var start = util.convert(this.body.range.start, 'Number'), + end = util.convert(this.body.range.end, 'Number'), + minimumStep = this.body.util.toTime((this.props.minorCharWidth || 10) * 7).valueOf() + -this.body.util.toTime(0).valueOf(); + var step = new TimeStep(new Date(start), new Date(end), minimumStep); + this.step = step; - // TODO: work out these options and document them - if (options.edges) { - if (options.edges.color !== undefined) { - if (util.isString(options.edges.color)) { - this.constants.edges.color = {}; - this.constants.edges.color.color = options.edges.color; - this.constants.edges.color.highlight = options.edges.color; - this.constants.edges.color.hover = options.edges.color; - } - else { - if (options.edges.color.color !== undefined) {this.constants.edges.color.color = options.edges.color.color;} - if (options.edges.color.highlight !== undefined) {this.constants.edges.color.highlight = options.edges.color.highlight;} - if (options.edges.color.hover !== undefined) {this.constants.edges.color.hover = options.edges.color.hover;} - } - } + // Move all DOM elements to a "redundant" list, where they + // can be picked for re-use, and clear the lists with lines and texts. + // At the end of the function _repaintLabels, left over elements will be cleaned up + var dom = this.dom; + dom.redundant.majorLines = dom.majorLines; + dom.redundant.majorTexts = dom.majorTexts; + dom.redundant.minorLines = dom.minorLines; + dom.redundant.minorTexts = dom.minorTexts; + dom.majorLines = []; + dom.majorTexts = []; + dom.minorLines = []; + dom.minorTexts = []; - if (!options.edges.fontColor) { - if (options.edges.color !== undefined) { - if (util.isString(options.edges.color)) {this.constants.edges.fontColor = options.edges.color;} - else if (options.edges.color.color !== undefined) {this.constants.edges.fontColor = options.edges.color.color;} - } - } - } + step.first(); + var xFirstMajorLabel = undefined; + var max = 0; + while (step.hasNext() && max < 1000) { + max++; + var cur = step.getCurrent(), + x = this.body.util.toScreen(cur), + isMajor = step.isMajor(); - if (options.nodes) { - if (options.nodes.color) { - var newColorObj = util.parseColor(options.nodes.color); - this.constants.nodes.color.background = newColorObj.background; - this.constants.nodes.color.border = newColorObj.border; - this.constants.nodes.color.highlight.background = newColorObj.highlight.background; - this.constants.nodes.color.highlight.border = newColorObj.highlight.border; - this.constants.nodes.color.hover.background = newColorObj.hover.background; - this.constants.nodes.color.hover.border = newColorObj.hover.border; - } - } - if (options.groups) { - for (var groupname in options.groups) { - if (options.groups.hasOwnProperty(groupname)) { - var group = options.groups[groupname]; - this.groups.add(groupname, group); - } - } - } + // TODO: lines must have a width, such that we can create css backgrounds - if (options.tooltip) { - for (prop in options.tooltip) { - if (options.tooltip.hasOwnProperty(prop)) { - this.constants.tooltip[prop] = options.tooltip[prop]; - } - } - if (options.tooltip.color) { - this.constants.tooltip.color = util.parseColor(options.tooltip.color); - } + if (this.options.showMinorLabels) { + this._repaintMinorText(x, step.getLabelMinor(), orientation); } - if ('clickToUse' in options) { - if (options.clickToUse) { - this.activator = new Activator(this.frame); - this.activator.on('change', this._createKeyBinds.bind(this)); - } - else { - if (this.activator) { - this.activator.destroy(); - delete this.activator; + if (isMajor && this.options.showMajorLabels) { + if (x > 0) { + if (xFirstMajorLabel == undefined) { + xFirstMajorLabel = x; } + this._repaintMajorText(x, step.getLabelMajor(), orientation); } + this._repaintMajorLine(x, orientation); } - - if (options.labels) { - throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.'); + else { + this._repaintMinorLine(x, orientation); } - } - - // (Re)loading the mixins that can be enabled or disabled in the options. - // load the force calculation functions, grouped under the physics system. - this._loadPhysicsSystem(); - // load the navigation system. - this._loadNavigationControls(); - // load the data manipulation system - this._loadManipulationSystem(); - // configure the smooth curves - this._configureSmoothCurves(); - - - // bind keys. If disabled, this will not do anything; - this._createKeyBinds(); - this.setSize(this.constants.width, this.constants.height); - this.moving = true; - this.start(); - - }; - /** - * Create the main frame for the Network. - * This function is executed once when a Network object is created. The frame - * contains a canvas, and this canvas contains all objects like the axis and - * nodes. - * @private - */ - Network.prototype._create = function () { - // remove all elements from the container element. - while (this.containerElement.hasChildNodes()) { - this.containerElement.removeChild(this.containerElement.firstChild); + step.next(); } - this.frame = document.createElement('div'); - this.frame.className = 'vis network-frame'; - this.frame.style.position = 'relative'; - this.frame.style.overflow = 'hidden'; + // create a major label on the left when needed + if (this.options.showMajorLabels) { + var leftTime = this.body.util.toTime(0), + leftText = step.getLabelMajor(leftTime), + widthText = leftText.length * (this.props.majorCharWidth || 10) + 10; // upper bound estimation - // create the network canvas (HTML canvas element) - this.frame.canvas = document.createElement( 'canvas' ); - this.frame.canvas.style.position = 'relative'; - this.frame.appendChild(this.frame.canvas); - if (!this.frame.canvas.getContext) { - var noCanvas = document.createElement( 'DIV' ); - noCanvas.style.color = 'red'; - noCanvas.style.fontWeight = 'bold' ; - noCanvas.style.padding = '10px'; - noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; - this.frame.canvas.appendChild(noCanvas); + if (xFirstMajorLabel == undefined || widthText < xFirstMajorLabel) { + this._repaintMajorText(0, leftText, orientation); + } } - var me = this; - this.drag = {}; - this.pinch = {}; - this.hammer = Hammer(this.frame.canvas, { - prevent_default: true + // Cleanup leftover DOM elements from the redundant list + util.forEach(this.dom.redundant, function (arr) { + while (arr.length) { + var elem = arr.pop(); + if (elem && elem.parentNode) { + elem.parentNode.removeChild(elem); + } + } }); - this.hammer.on('tap', me._onTap.bind(me) ); - this.hammer.on('doubletap', me._onDoubleTap.bind(me) ); - this.hammer.on('hold', me._onHold.bind(me) ); - this.hammer.on('pinch', me._onPinch.bind(me) ); - this.hammer.on('touch', me._onTouch.bind(me) ); - this.hammer.on('dragstart', me._onDragStart.bind(me) ); - this.hammer.on('drag', me._onDrag.bind(me) ); - this.hammer.on('dragend', me._onDragEnd.bind(me) ); - this.hammer.on('release', me._onRelease.bind(me) ); - this.hammer.on('mousewheel',me._onMouseWheel.bind(me) ); - this.hammer.on('DOMMouseScroll',me._onMouseWheel.bind(me) ); // for FF - this.hammer.on('mousemove', me._onMouseMoveTitle.bind(me) ); - - // add the frame to the container element - this.containerElement.appendChild(this.frame); - }; - /** - * Binding the keys for keyboard navigation. These functions are defined in the NavigationMixin + * Create a minor label for the axis at position x + * @param {Number} x + * @param {String} text + * @param {String} orientation "top" or "bottom" (default) * @private */ - Network.prototype._createKeyBinds = function() { - var me = this; - this.mousetrap = mousetrap; - - this.mousetrap.reset(); + TimeAxis.prototype._repaintMinorText = function (x, text, orientation) { + // reuse redundant label + var label = this.dom.redundant.minorTexts.shift(); - if (this.constants.keyboard.enabled && this.isActive()) { - this.mousetrap.bind("up", this._moveUp.bind(me) , "keydown"); - this.mousetrap.bind("up", this._yStopMoving.bind(me), "keyup"); - this.mousetrap.bind("down", this._moveDown.bind(me) , "keydown"); - this.mousetrap.bind("down", this._yStopMoving.bind(me), "keyup"); - this.mousetrap.bind("left", this._moveLeft.bind(me) , "keydown"); - this.mousetrap.bind("left", this._xStopMoving.bind(me), "keyup"); - this.mousetrap.bind("right",this._moveRight.bind(me), "keydown"); - this.mousetrap.bind("right",this._xStopMoving.bind(me), "keyup"); - this.mousetrap.bind("=", this._zoomIn.bind(me), "keydown"); - this.mousetrap.bind("=", this._stopZoom.bind(me), "keyup"); - this.mousetrap.bind("-", this._zoomOut.bind(me), "keydown"); - this.mousetrap.bind("-", this._stopZoom.bind(me), "keyup"); - this.mousetrap.bind("[", this._zoomIn.bind(me), "keydown"); - this.mousetrap.bind("[", this._stopZoom.bind(me), "keyup"); - this.mousetrap.bind("]", this._zoomOut.bind(me), "keydown"); - this.mousetrap.bind("]", this._stopZoom.bind(me), "keyup"); - this.mousetrap.bind("pageup",this._zoomIn.bind(me), "keydown"); - this.mousetrap.bind("pageup",this._stopZoom.bind(me), "keyup"); - this.mousetrap.bind("pagedown",this._zoomOut.bind(me),"keydown"); - this.mousetrap.bind("pagedown",this._stopZoom.bind(me), "keyup"); + if (!label) { + // create new label + var content = document.createTextNode(''); + label = document.createElement('div'); + label.appendChild(content); + label.className = 'text minor'; + this.dom.foreground.appendChild(label); } + this.dom.minorTexts.push(label); - if (this.constants.dataManipulation.enabled == true) { - this.mousetrap.bind("escape",this._createManipulatorBar.bind(me)); - this.mousetrap.bind("del",this._deleteSelected.bind(me)); - } - }; + label.childNodes[0].nodeValue = text; - /** - * Get the pointer location from a touch location - * @param {{pageX: Number, pageY: Number}} touch - * @return {{x: Number, y: Number}} pointer - * @private - */ - Network.prototype._getPointer = function (touch) { - return { - x: touch.pageX - util.getAbsoluteLeft(this.frame.canvas), - y: touch.pageY - util.getAbsoluteTop(this.frame.canvas) - }; + label.style.top = (orientation == 'top') ? (this.props.majorLabelHeight + 'px') : '0'; + label.style.left = x + 'px'; + //label.title = title; // TODO: this is a heavy operation }; /** - * On start of a touch gesture, store the pointer - * @param event + * Create a Major label for the axis at position x + * @param {Number} x + * @param {String} text + * @param {String} orientation "top" or "bottom" (default) * @private */ - Network.prototype._onTouch = function (event) { - this.drag.pointer = this._getPointer(event.gesture.center); - this.drag.pinched = false; - this.pinch.scale = this._getScale(); + TimeAxis.prototype._repaintMajorText = function (x, text, orientation) { + // reuse redundant label + var label = this.dom.redundant.majorTexts.shift(); - this._handleTouch(this.drag.pointer); + if (!label) { + // create label + var content = document.createTextNode(text); + label = document.createElement('div'); + label.className = 'text major'; + label.appendChild(content); + this.dom.foreground.appendChild(label); + } + this.dom.majorTexts.push(label); + + label.childNodes[0].nodeValue = text; + //label.title = title; // TODO: this is a heavy operation + + label.style.top = (orientation == 'top') ? '0' : (this.props.minorLabelHeight + 'px'); + label.style.left = x + 'px'; }; /** - * handle drag start event + * Create a minor line for the axis at position x + * @param {Number} x + * @param {String} orientation "top" or "bottom" (default) * @private */ - Network.prototype._onDragStart = function () { - this._handleDragStart(); - }; + TimeAxis.prototype._repaintMinorLine = function (x, orientation) { + // reuse redundant line + var line = this.dom.redundant.minorLines.shift(); + + if (!line) { + // create vertical line + line = document.createElement('div'); + line.className = 'grid vertical minor'; + this.dom.background.appendChild(line); + } + this.dom.minorLines.push(line); + var props = this.props; + if (orientation == 'top') { + line.style.top = props.majorLabelHeight + 'px'; + } + else { + line.style.top = this.body.domProps.top.height + 'px'; + } + line.style.height = props.minorLineHeight + 'px'; + line.style.left = (x - props.minorLineWidth / 2) + 'px'; + }; /** - * This function is called by _onDragStart. - * It is separated out because we can then overload it for the datamanipulation system. - * + * Create a Major line for the axis at position x + * @param {Number} x + * @param {String} orientation "top" or "bottom" (default) * @private */ - Network.prototype._handleDragStart = function() { - var drag = this.drag; - var node = this._getNodeAt(drag.pointer); - // note: drag.pointer is set in _onTouch to get the initial touch location - - drag.dragging = true; - drag.selection = []; - drag.translation = this._getTranslation(); - drag.nodeId = null; - - if (node != null) { - drag.nodeId = node.id; - // select the clicked node if not yet selected - if (!node.isSelected()) { - this._selectObject(node,false); - } - - // create an array with the selected nodes and their original location and status - for (var objectId in this.selectionObj.nodes) { - if (this.selectionObj.nodes.hasOwnProperty(objectId)) { - var object = this.selectionObj.nodes[objectId]; - var s = { - id: object.id, - node: object, - - // store original x, y, xFixed and yFixed, make the node temporarily Fixed - x: object.x, - y: object.y, - xFixed: object.xFixed, - yFixed: object.yFixed - }; + TimeAxis.prototype._repaintMajorLine = function (x, orientation) { + // reuse redundant line + var line = this.dom.redundant.majorLines.shift(); - object.xFixed = true; - object.yFixed = true; + if (!line) { + // create vertical line + line = document.createElement('DIV'); + line.className = 'grid vertical major'; + this.dom.background.appendChild(line); + } + this.dom.majorLines.push(line); - drag.selection.push(s); - } - } + var props = this.props; + if (orientation == 'top') { + line.style.top = '0'; + } + else { + line.style.top = this.body.domProps.top.height + 'px'; } + line.style.left = (x - props.majorLineWidth / 2) + 'px'; + line.style.height = props.majorLineHeight + 'px'; }; - /** - * handle drag event + * Determine the size of text on the axis (both major and minor axis). + * The size is calculated only once and then cached in this.props. * @private */ - Network.prototype._onDrag = function (event) { - this._handleOnDrag(event) - }; + TimeAxis.prototype._calculateCharSize = function () { + // Note: We calculate char size with every redraw. Size may change, for + // example when any of the timelines parents had display:none for example. + // determine the char width and height on the minor axis + if (!this.dom.measureCharMinor) { + this.dom.measureCharMinor = document.createElement('DIV'); + this.dom.measureCharMinor.className = 'text minor measure'; + this.dom.measureCharMinor.style.position = 'absolute'; - /** - * This function is called by _onDrag. - * It is separated out because we can then overload it for the datamanipulation system. - * - * @private - */ - Network.prototype._handleOnDrag = function(event) { - if (this.drag.pinched) { - return; + this.dom.measureCharMinor.appendChild(document.createTextNode('0')); + this.dom.foreground.appendChild(this.dom.measureCharMinor); } + this.props.minorCharHeight = this.dom.measureCharMinor.clientHeight; + this.props.minorCharWidth = this.dom.measureCharMinor.clientWidth; - var pointer = this._getPointer(event.gesture.center); - - var me = this; - var drag = this.drag; - var selection = drag.selection; - if (selection && selection.length && this.constants.dragNodes == true) { - // calculate delta's and new location - var deltaX = pointer.x - drag.pointer.x; - var deltaY = pointer.y - drag.pointer.y; + // determine the char width and height on the major axis + if (!this.dom.measureCharMajor) { + this.dom.measureCharMajor = document.createElement('DIV'); + this.dom.measureCharMajor.className = 'text minor measure'; + this.dom.measureCharMajor.style.position = 'absolute'; - // update position of all selected nodes - selection.forEach(function (s) { - var node = s.node; + this.dom.measureCharMajor.appendChild(document.createTextNode('0')); + this.dom.foreground.appendChild(this.dom.measureCharMajor); + } + this.props.majorCharHeight = this.dom.measureCharMajor.clientHeight; + this.props.majorCharWidth = this.dom.measureCharMajor.clientWidth; + }; - if (!s.xFixed) { - node.x = me._XconvertDOMtoCanvas(me._XconvertCanvasToDOM(s.x) + deltaX); - } + /** + * Snap a date to a rounded value. + * The snap intervals are dependent on the current scale and step. + * @param {Date} date the date to be snapped. + * @return {Date} snappedDate + */ + TimeAxis.prototype.snap = function(date) { + return this.step.snap(date); + }; - if (!s.yFixed) { - node.y = me._YconvertDOMtoCanvas(me._YconvertCanvasToDOM(s.y) + deltaY); - } - }); + module.exports = TimeAxis; - // start _animationStep if not yet running - if (!this.moving) { - this.moving = true; - this.start(); - } - } - else { - if (this.constants.dragNetwork == true) { - // move the network - var diffX = pointer.x - this.drag.pointer.x; - var diffY = pointer.y - this.drag.pointer.y; +/***/ }, +/* 25 */ +/***/ function(module, exports, __webpack_require__) { - this._setTranslation( - this.drag.translation.x + diffX, - this.drag.translation.y + diffY - ); - this._redraw(); - // this.moving = true; - // this.start(); - } - } - }; + var moment = __webpack_require__(2); /** - * handle drag start event - * @private + * @constructor TimeStep + * The class TimeStep is an iterator for dates. You provide a start date and an + * end date. The class itself determines the best scale (step size) based on the + * provided start Date, end Date, and minimumStep. + * + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * + * Alternatively, you can set a scale by hand. + * After creation, you can initialize the class by executing first(). Then you + * can iterate from the start date to the end date via next(). You can check if + * the end date is reached with the function hasNext(). After each step, you can + * retrieve the current date via getCurrent(). + * The TimeStep has scales ranging from milliseconds, seconds, minutes, hours, + * days, to years. + * + * Version: 1.2 + * + * @param {Date} [start] The start date, for example new Date(2010, 9, 21) + * or new Date(2010, 9, 21, 23, 45, 00) + * @param {Date} [end] The end date + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds */ - Network.prototype._onDragEnd = function () { - this.drag.dragging = false; - var selection = this.drag.selection; - if (selection && selection.length) { - selection.forEach(function (s) { - // restore original xFixed and yFixed - s.node.xFixed = s.xFixed; - s.node.yFixed = s.yFixed; - }); - this.moving = true; - this.start(); - } - else { - this._redraw(); - } + function TimeStep(start, end, minimumStep) { + // variables + this.current = new Date(); + this._start = new Date(); + this._end = new Date(); - }; + this.autoScale = true; + this.scale = TimeStep.SCALE.DAY; + this.step = 1; - /** - * handle tap/click event: select/unselect a node - * @private - */ - Network.prototype._onTap = function (event) { - var pointer = this._getPointer(event.gesture.center); - this.pointerPosition = pointer; - this._handleTap(pointer); + // initialize the range + this.setRange(start, end, minimumStep); + } + /// enum scale + TimeStep.SCALE = { + MILLISECOND: 1, + SECOND: 2, + MINUTE: 3, + HOUR: 4, + DAY: 5, + WEEKDAY: 6, + MONTH: 7, + YEAR: 8 }; /** - * handle doubletap event - * @private + * Set a new range + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * @param {Date} [start] The start date and time. + * @param {Date} [end] The end date and time. + * @param {int} [minimumStep] Optional. Minimum step size in milliseconds */ - Network.prototype._onDoubleTap = function (event) { - var pointer = this._getPointer(event.gesture.center); - this._handleDoubleTap(pointer); - }; + TimeStep.prototype.setRange = function(start, end, minimumStep) { + if (!(start instanceof Date) || !(end instanceof Date)) { + throw "No legal start or end date in method setRange"; + } + this._start = (start != undefined) ? new Date(start.valueOf()) : new Date(); + this._end = (end != undefined) ? new Date(end.valueOf()) : new Date(); - /** - * handle long tap event: multi select nodes - * @private - */ - Network.prototype._onHold = function (event) { - var pointer = this._getPointer(event.gesture.center); - this.pointerPosition = pointer; - this._handleOnHold(pointer); + if (this.autoScale) { + this.setMinimumStep(minimumStep); + } }; /** - * handle the release of the screen - * - * @private + * Set the range iterator to the start date. */ - Network.prototype._onRelease = function (event) { - var pointer = this._getPointer(event.gesture.center); - this._handleOnRelease(pointer); + TimeStep.prototype.first = function() { + this.current = new Date(this._start.valueOf()); + this.roundToMinor(); }; /** - * Handle pinch event - * @param event - * @private + * Round the current date to the first minor date value + * This must be executed once when the current date is set to start Date */ - Network.prototype._onPinch = function (event) { - var pointer = this._getPointer(event.gesture.center); - - this.drag.pinched = true; - if (!('scale' in this.pinch)) { - this.pinch.scale = 1; + TimeStep.prototype.roundToMinor = function() { + // round to floor + // IMPORTANT: we have no breaks in this switch! (this is no bug) + //noinspection FallthroughInSwitchStatementJS + switch (this.scale) { + case TimeStep.SCALE.YEAR: + this.current.setFullYear(this.step * Math.floor(this.current.getFullYear() / this.step)); + this.current.setMonth(0); + case TimeStep.SCALE.MONTH: this.current.setDate(1); + case TimeStep.SCALE.DAY: // intentional fall through + case TimeStep.SCALE.WEEKDAY: this.current.setHours(0); + case TimeStep.SCALE.HOUR: this.current.setMinutes(0); + case TimeStep.SCALE.MINUTE: this.current.setSeconds(0); + case TimeStep.SCALE.SECOND: this.current.setMilliseconds(0); + //case TimeStep.SCALE.MILLISECOND: // nothing to do for milliseconds } - // TODO: enabled moving while pinching? - var scale = this.pinch.scale * event.gesture.scale; - this._zoom(scale, pointer) + if (this.step != 1) { + // round down to the first minor value that is a multiple of the current step size + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: this.current.setMilliseconds(this.current.getMilliseconds() - this.current.getMilliseconds() % this.step); break; + case TimeStep.SCALE.SECOND: this.current.setSeconds(this.current.getSeconds() - this.current.getSeconds() % this.step); break; + case TimeStep.SCALE.MINUTE: this.current.setMinutes(this.current.getMinutes() - this.current.getMinutes() % this.step); break; + case TimeStep.SCALE.HOUR: this.current.setHours(this.current.getHours() - this.current.getHours() % this.step); break; + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: this.current.setDate((this.current.getDate()-1) - (this.current.getDate()-1) % this.step + 1); break; + case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() - this.current.getMonth() % this.step); break; + case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() - this.current.getFullYear() % this.step); break; + default: break; + } + } }; /** - * Zoom the network in or out - * @param {Number} scale a number around 1, and between 0.01 and 10 - * @param {{x: Number, y: Number}} pointer Position on screen - * @return {Number} appliedScale scale is limited within the boundaries - * @private + * Check if the there is a next step + * @return {boolean} true if the current date has not passed the end date */ - Network.prototype._zoom = function(scale, pointer) { - if (this.constants.zoomable == true) { - var scaleOld = this._getScale(); - if (scale < 0.00001) { - scale = 0.00001; - } - if (scale > 10) { - scale = 10; - } - - var preScaleDragPointer = null; - if (this.drag !== undefined) { - if (this.drag.dragging == true) { - preScaleDragPointer = this.DOMtoCanvas(this.drag.pointer); - } - } - // + this.frame.canvas.clientHeight / 2 - var translation = this._getTranslation(); - - var scaleFrac = scale / scaleOld; - var tx = (1 - scaleFrac) * pointer.x + translation.x * scaleFrac; - var ty = (1 - scaleFrac) * pointer.y + translation.y * scaleFrac; + TimeStep.prototype.hasNext = function () { + return (this.current.valueOf() <= this._end.valueOf()); + }; - this.areaCenter = {"x" : this._XconvertDOMtoCanvas(pointer.x), - "y" : this._YconvertDOMtoCanvas(pointer.y)}; + /** + * Do the next step + */ + TimeStep.prototype.next = function() { + var prev = this.current.valueOf(); - this._setScale(scale); - this._setTranslation(tx, ty); - this.updateClustersDefault(); + // Two cases, needed to prevent issues with switching daylight savings + // (end of March and end of October) + if (this.current.getMonth() < 6) { + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: - if (preScaleDragPointer != null) { - var postScaleDragPointer = this.canvasToDOM(preScaleDragPointer); - this.drag.pointer.x = postScaleDragPointer.x; - this.drag.pointer.y = postScaleDragPointer.y; + this.current = new Date(this.current.valueOf() + this.step); break; + case TimeStep.SCALE.SECOND: this.current = new Date(this.current.valueOf() + this.step * 1000); break; + case TimeStep.SCALE.MINUTE: this.current = new Date(this.current.valueOf() + this.step * 1000 * 60); break; + case TimeStep.SCALE.HOUR: + this.current = new Date(this.current.valueOf() + this.step * 1000 * 60 * 60); + // in case of skipping an hour for daylight savings, adjust the hour again (else you get: 0h 5h 9h ... instead of 0h 4h 8h ...) + var h = this.current.getHours(); + this.current.setHours(h - (h % this.step)); + break; + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: this.current.setDate(this.current.getDate() + this.step); break; + case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() + this.step); break; + case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() + this.step); break; + default: break; } - - this._redraw(); - - if (scaleOld < scale) { - this.emit("zoom", {direction:"+"}); + } + else { + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: this.current = new Date(this.current.valueOf() + this.step); break; + case TimeStep.SCALE.SECOND: this.current.setSeconds(this.current.getSeconds() + this.step); break; + case TimeStep.SCALE.MINUTE: this.current.setMinutes(this.current.getMinutes() + this.step); break; + case TimeStep.SCALE.HOUR: this.current.setHours(this.current.getHours() + this.step); break; + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: this.current.setDate(this.current.getDate() + this.step); break; + case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() + this.step); break; + case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() + this.step); break; + default: break; } - else { - this.emit("zoom", {direction:"-"}); + } + + if (this.step != 1) { + // round down to the correct major value + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: if(this.current.getMilliseconds() < this.step) this.current.setMilliseconds(0); break; + case TimeStep.SCALE.SECOND: if(this.current.getSeconds() < this.step) this.current.setSeconds(0); break; + case TimeStep.SCALE.MINUTE: if(this.current.getMinutes() < this.step) this.current.setMinutes(0); break; + case TimeStep.SCALE.HOUR: if(this.current.getHours() < this.step) this.current.setHours(0); break; + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: if(this.current.getDate() < this.step+1) this.current.setDate(1); break; + case TimeStep.SCALE.MONTH: if(this.current.getMonth() < this.step) this.current.setMonth(0); break; + case TimeStep.SCALE.YEAR: break; // nothing to do for year + default: break; } + } - return scale; + // safety mechanism: if current time is still unchanged, move to the end + if (this.current.valueOf() == prev) { + this.current = new Date(this._end.valueOf()); } }; /** - * Event handler for mouse wheel event, used to zoom the timeline - * See http://adomas.org/javascript-mouse-wheel/ - * https://github.com/EightMedia/hammer.js/issues/256 - * @param {MouseEvent} event - * @private + * Get the current datetime + * @return {Date} current The current date */ - Network.prototype._onMouseWheel = function(event) { - // retrieve delta - var delta = 0; - if (event.wheelDelta) { /* IE/Opera. */ - delta = event.wheelDelta/120; - } else if (event.detail) { /* Mozilla case. */ - // In Mozilla, sign of delta is different than in IE. - // Also, delta is multiple of 3. - delta = -event.detail/3; + TimeStep.prototype.getCurrent = function() { + return this.current; + }; + + /** + * Set a custom scale. Autoscaling will be disabled. + * For example setScale(SCALE.MINUTES, 5) will result + * in minor steps of 5 minutes, and major steps of an hour. + * + * @param {TimeStep.SCALE} newScale + * A scale. Choose from SCALE.MILLISECOND, + * SCALE.SECOND, SCALE.MINUTE, SCALE.HOUR, + * SCALE.WEEKDAY, SCALE.DAY, SCALE.MONTH, + * SCALE.YEAR. + * @param {Number} newStep A step size, by default 1. Choose for + * example 1, 2, 5, or 10. + */ + TimeStep.prototype.setScale = function(newScale, newStep) { + this.scale = newScale; + + if (newStep > 0) { + this.step = newStep; } - // If delta is nonzero, handle it. - // Basically, delta is now positive if wheel was scrolled up, - // and negative, if wheel was scrolled down. - if (delta) { + this.autoScale = false; + }; - // calculate the new scale - var scale = this._getScale(); - var zoom = delta / 10; - if (delta < 0) { - zoom = zoom / (1 - zoom); - } - scale *= (1 + zoom); + /** + * Enable or disable autoscaling + * @param {boolean} enable If true, autoascaling is set true + */ + TimeStep.prototype.setAutoScale = function (enable) { + this.autoScale = enable; + }; - // calculate the pointer location - var gesture = hammerUtil.fakeGesture(this, event); - var pointer = this._getPointer(gesture.center); - // apply the new scale - this._zoom(scale, pointer); + /** + * Automatically determine the scale that bests fits the provided minimum step + * @param {Number} [minimumStep] The minimum step size in milliseconds + */ + TimeStep.prototype.setMinimumStep = function(minimumStep) { + if (minimumStep == undefined) { + return; } - // Prevent default actions caused by mouse wheel. - event.preventDefault(); - }; + var stepYear = (1000 * 60 * 60 * 24 * 30 * 12); + var stepMonth = (1000 * 60 * 60 * 24 * 30); + var stepDay = (1000 * 60 * 60 * 24); + var stepHour = (1000 * 60 * 60); + var stepMinute = (1000 * 60); + var stepSecond = (1000); + var stepMillisecond= (1); + // find the smallest step that is larger than the provided minimumStep + if (stepYear*1000 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 1000;} + if (stepYear*500 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 500;} + if (stepYear*100 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 100;} + if (stepYear*50 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 50;} + if (stepYear*10 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 10;} + if (stepYear*5 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 5;} + if (stepYear > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 1;} + if (stepMonth*3 > minimumStep) {this.scale = TimeStep.SCALE.MONTH; this.step = 3;} + if (stepMonth > minimumStep) {this.scale = TimeStep.SCALE.MONTH; this.step = 1;} + if (stepDay*5 > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 5;} + if (stepDay*2 > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 2;} + if (stepDay > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 1;} + if (stepDay/2 > minimumStep) {this.scale = TimeStep.SCALE.WEEKDAY; this.step = 1;} + if (stepHour*4 > minimumStep) {this.scale = TimeStep.SCALE.HOUR; this.step = 4;} + if (stepHour > minimumStep) {this.scale = TimeStep.SCALE.HOUR; this.step = 1;} + if (stepMinute*15 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 15;} + if (stepMinute*10 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 10;} + if (stepMinute*5 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 5;} + if (stepMinute > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 1;} + if (stepSecond*15 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 15;} + if (stepSecond*10 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 10;} + if (stepSecond*5 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 5;} + if (stepSecond > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 1;} + if (stepMillisecond*200 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 200;} + if (stepMillisecond*100 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 100;} + if (stepMillisecond*50 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 50;} + if (stepMillisecond*10 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 10;} + if (stepMillisecond*5 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 5;} + if (stepMillisecond > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 1;} + }; /** - * Mouse move handler for checking whether the title moves over a node with a title. - * @param {Event} event - * @private + * Snap a date to a rounded value. + * The snap intervals are dependent on the current scale and step. + * @param {Date} date the date to be snapped. + * @return {Date} snappedDate */ - Network.prototype._onMouseMoveTitle = function (event) { - var gesture = hammerUtil.fakeGesture(this, event); - var pointer = this._getPointer(gesture.center); + TimeStep.prototype.snap = function(date) { + var clone = new Date(date.valueOf()); - // check if the previously selected node is still selected - if (this.popupObj) { - this._checkHidePopup(pointer); + if (this.scale == TimeStep.SCALE.YEAR) { + var year = clone.getFullYear() + Math.round(clone.getMonth() / 12); + clone.setFullYear(Math.round(year / this.step) * this.step); + clone.setMonth(0); + clone.setDate(0); + clone.setHours(0); + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); } + else if (this.scale == TimeStep.SCALE.MONTH) { + if (clone.getDate() > 15) { + clone.setDate(1); + clone.setMonth(clone.getMonth() + 1); + // important: first set Date to 1, after that change the month. + } + else { + clone.setDate(1); + } - // start a timeout that will check if the mouse is positioned above - // an element - var me = this; - var checkShow = function() { - me._checkShowPopup(pointer); - }; - if (this.popupTimer) { - clearInterval(this.popupTimer); // stop any running calculationTimer + clone.setHours(0); + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); } - if (!this.drag.dragging) { - this.popupTimer = setTimeout(checkShow, this.constants.tooltip.delay); + else if (this.scale == TimeStep.SCALE.DAY) { + //noinspection FallthroughInSwitchStatementJS + switch (this.step) { + case 5: + case 2: + clone.setHours(Math.round(clone.getHours() / 24) * 24); break; + default: + clone.setHours(Math.round(clone.getHours() / 12) * 12); break; + } + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); } - - - /** - * Adding hover highlights - */ - if (this.constants.hover == true) { - // removing all hover highlights - for (var edgeId in this.hoverObj.edges) { - if (this.hoverObj.edges.hasOwnProperty(edgeId)) { - this.hoverObj.edges[edgeId].hover = false; - delete this.hoverObj.edges[edgeId]; - } + else if (this.scale == TimeStep.SCALE.WEEKDAY) { + //noinspection FallthroughInSwitchStatementJS + switch (this.step) { + case 5: + case 2: + clone.setHours(Math.round(clone.getHours() / 12) * 12); break; + default: + clone.setHours(Math.round(clone.getHours() / 6) * 6); break; } - - // adding hover highlights - var obj = this._getNodeAt(pointer); - if (obj == null) { - obj = this._getEdgeAt(pointer); + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); + } + else if (this.scale == TimeStep.SCALE.HOUR) { + switch (this.step) { + case 4: + clone.setMinutes(Math.round(clone.getMinutes() / 60) * 60); break; + default: + clone.setMinutes(Math.round(clone.getMinutes() / 30) * 30); break; } - if (obj != null) { - this._hoverObject(obj); + clone.setSeconds(0); + clone.setMilliseconds(0); + } else if (this.scale == TimeStep.SCALE.MINUTE) { + //noinspection FallthroughInSwitchStatementJS + switch (this.step) { + case 15: + case 10: + clone.setMinutes(Math.round(clone.getMinutes() / 5) * 5); + clone.setSeconds(0); + break; + case 5: + clone.setSeconds(Math.round(clone.getSeconds() / 60) * 60); break; + default: + clone.setSeconds(Math.round(clone.getSeconds() / 30) * 30); break; } - - // removing all node hover highlights except for the selected one. - for (var nodeId in this.hoverObj.nodes) { - if (this.hoverObj.nodes.hasOwnProperty(nodeId)) { - if (obj instanceof Node && obj.id != nodeId || obj instanceof Edge || obj == null) { - this._blurObject(this.hoverObj.nodes[nodeId]); - delete this.hoverObj.nodes[nodeId]; - } - } + clone.setMilliseconds(0); + } + else if (this.scale == TimeStep.SCALE.SECOND) { + //noinspection FallthroughInSwitchStatementJS + switch (this.step) { + case 15: + case 10: + clone.setSeconds(Math.round(clone.getSeconds() / 5) * 5); + clone.setMilliseconds(0); + break; + case 5: + clone.setMilliseconds(Math.round(clone.getMilliseconds() / 1000) * 1000); break; + default: + clone.setMilliseconds(Math.round(clone.getMilliseconds() / 500) * 500); break; } - this.redraw(); } + else if (this.scale == TimeStep.SCALE.MILLISECOND) { + var step = this.step > 5 ? this.step / 2 : 1; + clone.setMilliseconds(Math.round(clone.getMilliseconds() / step) * step); + } + + return clone; }; /** - * Check if there is an element on the given position in the network - * (a node or edge). If so, and if this element has a title, - * show a popup window with its title. - * - * @param {{x:Number, y:Number}} pointer - * @private - */ - Network.prototype._checkShowPopup = function (pointer) { - var obj = { - left: this._XconvertDOMtoCanvas(pointer.x), - top: this._YconvertDOMtoCanvas(pointer.y), - right: this._XconvertDOMtoCanvas(pointer.x), - bottom: this._YconvertDOMtoCanvas(pointer.y) - }; - - var id; - var lastPopupNode = this.popupObj; - - if (this.popupObj == undefined) { - // search the nodes for overlap, select the top one in case of multiple nodes - var nodes = this.nodes; - for (id in nodes) { - if (nodes.hasOwnProperty(id)) { - var node = nodes[id]; - if (node.getTitle() !== undefined && node.isOverlappingWith(obj)) { - this.popupObj = node; - break; - } - } - } - } - - if (this.popupObj === undefined) { - // search the edges for overlap - var edges = this.edges; - for (id in edges) { - if (edges.hasOwnProperty(id)) { - var edge = edges[id]; - if (edge.connected && (edge.getTitle() !== undefined) && - edge.isOverlappingWith(obj)) { - this.popupObj = edge; - break; - } - } - } + * Check if the current value is a major value (for example when the step + * is DAY, a major value is each first day of the MONTH) + * @return {boolean} true if current date is major, else false. + */ + TimeStep.prototype.isMajor = function() { + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: + return (this.current.getMilliseconds() == 0); + case TimeStep.SCALE.SECOND: + return (this.current.getSeconds() == 0); + case TimeStep.SCALE.MINUTE: + return (this.current.getHours() == 0) && (this.current.getMinutes() == 0); + // Note: this is no bug. Major label is equal for both minute and hour scale + case TimeStep.SCALE.HOUR: + return (this.current.getHours() == 0); + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: + return (this.current.getDate() == 1); + case TimeStep.SCALE.MONTH: + return (this.current.getMonth() == 0); + case TimeStep.SCALE.YEAR: + return false; + default: + return false; } + }; - if (this.popupObj) { - // show popup message window - if (this.popupObj != lastPopupNode) { - var me = this; - if (!me.popup) { - me.popup = new Popup(me.frame, me.constants.tooltip); - } - // adjust a small offset such that the mouse cursor is located in the - // bottom left location of the popup, and you can easily move over the - // popup area - me.popup.setPosition(pointer.x - 3, pointer.y - 3); - me.popup.setText(me.popupObj.getTitle()); - me.popup.show(); - } + /** + * Returns formatted text for the minor axislabel, depending on the current + * date and the scale. For example when scale is MINUTE, the current time is + * formatted as "hh:mm". + * @param {Date} [date] custom date. if not provided, current date is taken + */ + TimeStep.prototype.getLabelMinor = function(date) { + if (date == undefined) { + date = this.current; } - else { - if (this.popup) { - this.popup.hide(); - } + + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: return moment(date).format('SSS'); + case TimeStep.SCALE.SECOND: return moment(date).format('s'); + case TimeStep.SCALE.MINUTE: return moment(date).format('HH:mm'); + case TimeStep.SCALE.HOUR: return moment(date).format('HH:mm'); + case TimeStep.SCALE.WEEKDAY: return moment(date).format('ddd D'); + case TimeStep.SCALE.DAY: return moment(date).format('D'); + case TimeStep.SCALE.MONTH: return moment(date).format('MMM'); + case TimeStep.SCALE.YEAR: return moment(date).format('YYYY'); + default: return ''; } }; /** - * Check if the popup must be hided, which is the case when the mouse is no - * longer hovering on the object - * @param {{x:Number, y:Number}} pointer - * @private + * Returns formatted text for the major axis label, depending on the current + * date and the scale. For example when scale is MINUTE, the major scale is + * hours, and the hour will be formatted as "hh". + * @param {Date} [date] custom date. if not provided, current date is taken */ - Network.prototype._checkHidePopup = function (pointer) { - if (!this.popupObj || !this._getNodeAt(pointer) ) { - this.popupObj = undefined; - if (this.popup) { - this.popup.hide(); - } + TimeStep.prototype.getLabelMajor = function(date) { + if (date == undefined) { + date = this.current; + } + + //noinspection FallthroughInSwitchStatementJS + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND:return moment(date).format('HH:mm:ss'); + case TimeStep.SCALE.SECOND: return moment(date).format('D MMMM HH:mm'); + case TimeStep.SCALE.MINUTE: + case TimeStep.SCALE.HOUR: return moment(date).format('ddd D MMMM'); + case TimeStep.SCALE.WEEKDAY: + case TimeStep.SCALE.DAY: return moment(date).format('MMMM YYYY'); + case TimeStep.SCALE.MONTH: return moment(date).format('YYYY'); + case TimeStep.SCALE.YEAR: return ''; + default: return ''; } }; + module.exports = TimeStep; + + +/***/ }, +/* 26 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var Component = __webpack_require__(22); + var moment = __webpack_require__(2); + var locales = __webpack_require__(27); /** - * Set a new size for the network - * @param {string} width Width in pixels or percentage (for example '800px' - * or '50%') - * @param {string} height Height in pixels or percentage (for example '400px' - * or '30%') + * A current time bar + * @param {{range: Range, dom: Object, domProps: Object}} body + * @param {Object} [options] Available parameters: + * {Boolean} [showCurrentTime] + * @constructor CurrentTime + * @extends Component */ - Network.prototype.setSize = function(width, height) { - this.frame.style.width = width; - this.frame.style.height = height; + function CurrentTime (body, options) { + this.body = body; - this.frame.canvas.style.width = '100%'; - this.frame.canvas.style.height = '100%'; + // default options + this.defaultOptions = { + showCurrentTime: true, - this.frame.canvas.width = this.frame.canvas.clientWidth; - this.frame.canvas.height = this.frame.canvas.clientHeight; + locales: locales, + locale: 'en' + }; + this.options = util.extend({}, this.defaultOptions); - this.emit('resize', {width:this.frame.canvas.width,height:this.frame.canvas.height}); - }; + this._create(); + + this.setOptions(options); + } + + CurrentTime.prototype = new Component(); /** - * Set a data set with nodes for the network - * @param {Array | DataSet | DataView} nodes The data containing the nodes. + * Create the HTML DOM for the current time bar * @private */ - Network.prototype._setNodes = function(nodes) { - var oldNodesData = this.nodesData; - - if (nodes instanceof DataSet || nodes instanceof DataView) { - this.nodesData = nodes; - } - else if (nodes instanceof Array) { - this.nodesData = new DataSet(); - this.nodesData.add(nodes); - } - else if (!nodes) { - this.nodesData = new DataSet(); - } - else { - throw new TypeError('Array or DataSet expected'); - } - - if (oldNodesData) { - // unsubscribe from old dataset - util.forEach(this.nodesListeners, function (callback, event) { - oldNodesData.off(event, callback); - }); - } + CurrentTime.prototype._create = function() { + var bar = document.createElement('div'); + bar.className = 'currenttime'; + bar.style.position = 'absolute'; + bar.style.top = '0px'; + bar.style.height = '100%'; - // remove drawn nodes - this.nodes = {}; + this.bar = bar; + }; - if (this.nodesData) { - // subscribe to new dataset - var me = this; - util.forEach(this.nodesListeners, function (callback, event) { - me.nodesData.on(event, callback); - }); + /** + * Destroy the CurrentTime bar + */ + CurrentTime.prototype.destroy = function () { + this.options.showCurrentTime = false; + this.redraw(); // will remove the bar from the DOM and stop refreshing - // draw all new nodes - var ids = this.nodesData.getIds(); - this._addNodes(ids); - } - this._updateSelection(); + this.body = null; }; /** - * Add nodes - * @param {Number[] | String[]} ids - * @private + * Set options for the component. Options will be merged in current options. + * @param {Object} options Available parameters: + * {boolean} [showCurrentTime] */ - Network.prototype._addNodes = function(ids) { - var id; - for (var i = 0, len = ids.length; i < len; i++) { - id = ids[i]; - var data = this.nodesData.get(id); - var node = new Node(data, this.images, this.groups, this.constants); - this.nodes[id] = node; // note: this may replace an existing node - if ((node.xFixed == false || node.yFixed == false) && (node.x === null || node.y === null)) { - var radius = 10 * 0.1*ids.length + 10; - var angle = 2 * Math.PI * Math.random(); - if (node.xFixed == false) {node.x = radius * Math.cos(angle);} - if (node.yFixed == false) {node.y = radius * Math.sin(angle);} - } - this.moving = true; - } - this._updateNodeIndexList(); - if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { - this._resetLevels(); - this._setupHierarchicalLayout(); + CurrentTime.prototype.setOptions = function(options) { + if (options) { + // copy all options that we know + util.selectiveExtend(['showCurrentTime', 'locale', 'locales'], this.options, options); } - this._updateCalculationNodes(); - this._reconnectEdges(); - this._updateValueRange(this.nodes); - this.updateLabels(); }; /** - * Update existing nodes, or create them when not yet existing - * @param {Number[] | String[]} ids - * @private + * Repaint the component + * @return {boolean} Returns true if the component is resized */ - Network.prototype._updateNodes = function(ids) { - var nodes = this.nodes, - nodesData = this.nodesData; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; - var node = nodes[id]; - var data = nodesData.get(id); - if (node) { - // update node - node.setProperties(data, this.constants); - } - else { - // create node - node = new Node(properties, this.images, this.groups, this.constants); - nodes[id] = node; + CurrentTime.prototype.redraw = function() { + if (this.options.showCurrentTime) { + var parent = this.body.dom.backgroundVertical; + if (this.bar.parentNode != parent) { + // attach to the dom + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); + } + parent.appendChild(this.bar); + + this.start(); } + + var now = new Date(); + var x = this.body.util.toScreen(now); + + var locale = this.options.locales[this.options.locale]; + var title = locale.current + ' ' + locale.time + ': ' + moment(now).format('dddd, MMMM Do YYYY, H:mm:ss'); + title = title.charAt(0).toUpperCase() + title.substring(1); + + this.bar.style.left = x + 'px'; + this.bar.title = title; } - this.moving = true; - if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { - this._resetLevels(); - this._setupHierarchicalLayout(); + else { + // remove the line from the DOM + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); + } + this.stop(); } - this._updateNodeIndexList(); - this._reconnectEdges(); - this._updateValueRange(nodes); + + return false; }; /** - * Remove existing nodes. If nodes do not exist, the method will just ignore it. - * @param {Number[] | String[]} ids - * @private + * Start auto refreshing the current time bar */ - Network.prototype._removeNodes = function(ids) { - var nodes = this.nodes; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; - delete nodes[id]; - } - this._updateNodeIndexList(); - if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { - this._resetLevels(); - this._setupHierarchicalLayout(); + CurrentTime.prototype.start = function() { + var me = this; + + function update () { + me.stop(); + + // determine interval to refresh + var scale = me.body.range.conversion(me.body.domProps.center.width).scale; + var interval = 1 / scale / 10; + if (interval < 30) interval = 30; + if (interval > 1000) interval = 1000; + + me.redraw(); + + // start a timer to adjust for the new time + me.currentTimeTimer = setTimeout(update, interval); } - this._updateCalculationNodes(); - this._reconnectEdges(); - this._updateSelection(); - this._updateValueRange(nodes); + + update(); }; /** - * Load edges by reading the data table - * @param {Array | DataSet | DataView} edges The data containing the edges. - * @private - * @private + * Stop auto refreshing the current time bar */ - Network.prototype._setEdges = function(edges) { - var oldEdgesData = this.edgesData; - - if (edges instanceof DataSet || edges instanceof DataView) { - this.edgesData = edges; - } - else if (edges instanceof Array) { - this.edgesData = new DataSet(); - this.edgesData.add(edges); - } - else if (!edges) { - this.edgesData = new DataSet(); - } - else { - throw new TypeError('Array or DataSet expected'); + CurrentTime.prototype.stop = function() { + if (this.currentTimeTimer !== undefined) { + clearTimeout(this.currentTimeTimer); + delete this.currentTimeTimer; } + }; - if (oldEdgesData) { - // unsubscribe from old dataset - util.forEach(this.edgesListeners, function (callback, event) { - oldEdgesData.off(event, callback); - }); - } + module.exports = CurrentTime; - // remove drawn edges - this.edges = {}; - if (this.edgesData) { - // subscribe to new dataset - var me = this; - util.forEach(this.edgesListeners, function (callback, event) { - me.edgesData.on(event, callback); - }); +/***/ }, +/* 27 */ +/***/ function(module, exports, __webpack_require__) { - // draw all new nodes - var ids = this.edgesData.getIds(); - this._addEdges(ids); - } + // English + exports['en'] = { + current: 'current', + time: 'time' + }; + exports['en_EN'] = exports['en']; + exports['en_US'] = exports['en']; - this._reconnectEdges(); + // Dutch + exports['nl'] = { + custom: 'aangepaste', + time: 'tijd' }; + exports['nl_NL'] = exports['nl']; + exports['nl_BE'] = exports['nl']; + + +/***/ }, +/* 28 */ +/***/ function(module, exports, __webpack_require__) { + + var Hammer = __webpack_require__(18); + var util = __webpack_require__(1); + var Component = __webpack_require__(22); + var moment = __webpack_require__(2); + var locales = __webpack_require__(27); /** - * Add edges - * @param {Number[] | String[]} ids - * @private + * A custom time bar + * @param {{range: Range, dom: Object}} body + * @param {Object} [options] Available parameters: + * {Boolean} [showCustomTime] + * @constructor CustomTime + * @extends Component */ - Network.prototype._addEdges = function (ids) { - var edges = this.edges, - edgesData = this.edgesData; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; + function CustomTime (body, options) { + this.body = body; - var oldEdge = edges[id]; - if (oldEdge) { - oldEdge.disconnect(); - } + // default options + this.defaultOptions = { + showCustomTime: false, + locales: locales, + locale: 'en' + }; + this.options = util.extend({}, this.defaultOptions); - var data = edgesData.get(id, {"showInternalIds" : true}); - edges[id] = new Edge(data, this, this.constants); - } + this.customTime = new Date(); + this.eventParams = {}; // stores state parameters while dragging the bar - this.moving = true; - this._updateValueRange(edges); - this._createBezierNodes(); - if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { - this._resetLevels(); - this._setupHierarchicalLayout(); + // create the DOM + this._create(); + + this.setOptions(options); + } + + CustomTime.prototype = new Component(); + + /** + * Set options for the component. Options will be merged in current options. + * @param {Object} options Available parameters: + * {boolean} [showCustomTime] + */ + CustomTime.prototype.setOptions = function(options) { + if (options) { + // copy all options that we know + util.selectiveExtend(['showCustomTime', 'locale', 'locales'], this.options, options); } - this._updateCalculationNodes(); }; /** - * Update existing edges, or create them when not yet existing - * @param {Number[] | String[]} ids + * Create the DOM for the custom time * @private */ - Network.prototype._updateEdges = function (ids) { - var edges = this.edges, - edgesData = this.edgesData; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; + CustomTime.prototype._create = function() { + var bar = document.createElement('div'); + bar.className = 'customtime'; + bar.style.position = 'absolute'; + bar.style.top = '0px'; + bar.style.height = '100%'; + this.bar = bar; - var data = edgesData.get(id); - var edge = edges[id]; - if (edge) { - // update edge - edge.disconnect(); - edge.setProperties(data, this.constants); - edge.connect(); + var drag = document.createElement('div'); + drag.style.position = 'relative'; + drag.style.top = '0px'; + drag.style.left = '-10px'; + drag.style.height = '100%'; + drag.style.width = '20px'; + bar.appendChild(drag); + + // attach event listeners + this.hammer = Hammer(bar, { + prevent_default: true + }); + this.hammer.on('dragstart', this._onDragStart.bind(this)); + this.hammer.on('drag', this._onDrag.bind(this)); + this.hammer.on('dragend', this._onDragEnd.bind(this)); + }; + + /** + * Destroy the CustomTime bar + */ + CustomTime.prototype.destroy = function () { + this.options.showCustomTime = false; + this.redraw(); // will remove the bar from the DOM + + this.hammer.enable(false); + this.hammer = null; + + this.body = null; + }; + + /** + * Repaint the component + * @return {boolean} Returns true if the component is resized + */ + CustomTime.prototype.redraw = function () { + if (this.options.showCustomTime) { + var parent = this.body.dom.backgroundVertical; + if (this.bar.parentNode != parent) { + // attach to the dom + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); + } + parent.appendChild(this.bar); } - else { - // create edge - edge = new Edge(data, this, this.constants); - this.edges[id] = edge; + + var x = this.body.util.toScreen(this.customTime); + + var locale = this.options.locales[this.options.locale]; + var title = locale.time + ': ' + moment(this.customTime).format('dddd, MMMM Do YYYY, H:mm:ss'); + title = title.charAt(0).toUpperCase() + title.substring(1); + + this.bar.style.left = x + 'px'; + this.bar.title = title; + } + else { + // remove the line from the DOM + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); } } - this._createBezierNodes(); - if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { - this._resetLevels(); - this._setupHierarchicalLayout(); - } - this.moving = true; - this._updateValueRange(edges); + return false; }; /** - * Remove existing edges. Non existing ids will be ignored - * @param {Number[] | String[]} ids - * @private + * Set custom time. + * @param {Date} time */ - Network.prototype._removeEdges = function (ids) { - var edges = this.edges; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; - var edge = edges[id]; - if (edge) { - if (edge.via != null) { - delete this.sectors['support']['nodes'][edge.via.id]; - } - edge.disconnect(); - delete edges[id]; - } - } + CustomTime.prototype.setCustomTime = function(time) { + this.customTime = new Date(time.valueOf()); + this.redraw(); + }; - this.moving = true; - this._updateValueRange(edges); - if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { - this._resetLevels(); - this._setupHierarchicalLayout(); - } - this._updateCalculationNodes(); + /** + * Retrieve the current custom time. + * @return {Date} customTime + */ + CustomTime.prototype.getCustomTime = function() { + return new Date(this.customTime.valueOf()); }; /** - * Reconnect all edges + * Start moving horizontally + * @param {Event} event * @private */ - Network.prototype._reconnectEdges = function() { - var id, - nodes = this.nodes, - edges = this.edges; - for (id in nodes) { - if (nodes.hasOwnProperty(id)) { - nodes[id].edges = []; - } - } + CustomTime.prototype._onDragStart = function(event) { + this.eventParams.dragging = true; + this.eventParams.customTime = this.customTime; - for (id in edges) { - if (edges.hasOwnProperty(id)) { - var edge = edges[id]; - edge.from = null; - edge.to = null; - edge.connect(); - } - } + event.stopPropagation(); + event.preventDefault(); }; /** - * Update the values of all object in the given array according to the current - * value range of the objects in the array. - * @param {Object} obj An object containing a set of Edges or Nodes - * The objects must have a method getValue() and - * setValueRange(min, max). + * Perform moving operating. + * @param {Event} event * @private */ - Network.prototype._updateValueRange = function(obj) { - var id; + CustomTime.prototype._onDrag = function (event) { + if (!this.eventParams.dragging) return; - // determine the range of the objects - var valueMin = undefined; - var valueMax = undefined; - for (id in obj) { - if (obj.hasOwnProperty(id)) { - var value = obj[id].getValue(); - if (value !== undefined) { - valueMin = (valueMin === undefined) ? value : Math.min(value, valueMin); - valueMax = (valueMax === undefined) ? value : Math.max(value, valueMax); - } - } - } + var deltaX = event.gesture.deltaX, + x = this.body.util.toScreen(this.eventParams.customTime) + deltaX, + time = this.body.util.toTime(x); - // adjust the range of all objects - if (valueMin !== undefined && valueMax !== undefined) { - for (id in obj) { - if (obj.hasOwnProperty(id)) { - obj[id].setValueRange(valueMin, valueMax); - } - } - } + this.setCustomTime(time); + + // fire a timechange event + this.body.emitter.emit('timechange', { + time: new Date(this.customTime.valueOf()) + }); + + event.stopPropagation(); + event.preventDefault(); }; /** - * Redraw the network with the current data - * chart will be resized too. + * Stop moving operating. + * @param {event} event + * @private */ - Network.prototype.redraw = function() { - this.setSize(this.constants.width, this.constants.height); - this._redraw(); + CustomTime.prototype._onDragEnd = function (event) { + if (!this.eventParams.dragging) return; + + // fire a timechanged event + this.body.emitter.emit('timechanged', { + time: new Date(this.customTime.valueOf()) + }); + + event.stopPropagation(); + event.preventDefault(); }; + module.exports = CustomTime; + + +/***/ }, +/* 29 */ +/***/ function(module, exports, __webpack_require__) { + + var Hammer = __webpack_require__(18); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(7); + var DataView = __webpack_require__(8); + var Component = __webpack_require__(22); + var Group = __webpack_require__(30); + var ItemBox = __webpack_require__(34); + var ItemPoint = __webpack_require__(35); + var ItemRange = __webpack_require__(32); + + + var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items + /** - * Redraw the network with the current data - * @private + * An ItemSet holds a set of items and ranges which can be displayed in a + * range. The width is determined by the parent of the ItemSet, and the height + * is determined by the size of the items. + * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body + * @param {Object} [options] See ItemSet.setOptions for the available options. + * @constructor ItemSet + * @extends Component */ - Network.prototype._redraw = function() { - var ctx = this.frame.canvas.getContext('2d'); - // clear the canvas - var w = this.frame.canvas.width; - var h = this.frame.canvas.height; - ctx.clearRect(0, 0, w, h); + function ItemSet(body, options) { + this.body = body; - // set scaling and translation - ctx.save(); - ctx.translate(this.translation.x, this.translation.y); - ctx.scale(this.scale, this.scale); + this.defaultOptions = { + type: null, // 'box', 'point', 'range' + orientation: 'bottom', // 'top' or 'bottom' + align: 'center', // alignment of box items + stack: true, + groupOrder: null, - this.canvasTopLeft = { - "x": this._XconvertDOMtoCanvas(0), - "y": this._YconvertDOMtoCanvas(0) + selectable: true, + editable: { + updateTime: false, + updateGroup: false, + add: false, + remove: false + }, + + onAdd: function (item, callback) { + callback(item); + }, + onUpdate: function (item, callback) { + callback(item); + }, + onMove: function (item, callback) { + callback(item); + }, + onRemove: function (item, callback) { + callback(item); + }, + + margin: { + item: { + horizontal: 10, + vertical: 10 + }, + axis: 20 + }, + padding: 5 }; - this.canvasBottomRight = { - "x": this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth), - "y": this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight) + + // options is shared by this ItemSet and all its items + this.options = util.extend({}, this.defaultOptions); + + // options for getting items from the DataSet with the correct type + this.itemOptions = { + type: {start: 'Date', end: 'Date'} + }; + + this.conversion = { + toScreen: body.util.toScreen, + toTime: body.util.toTime + }; + this.dom = {}; + this.props = {}; + this.hammer = null; + + var me = this; + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet + + // listeners for the DataSet of the items + this.itemListeners = { + 'add': function (event, params, senderId) { + me._onAdd(params.items); + }, + 'update': function (event, params, senderId) { + me._onUpdate(params.items); + }, + 'remove': function (event, params, senderId) { + me._onRemove(params.items); + } + }; + + // listeners for the DataSet of the groups + this.groupListeners = { + 'add': function (event, params, senderId) { + me._onAddGroups(params.items); + }, + 'update': function (event, params, senderId) { + me._onUpdateGroups(params.items); + }, + 'remove': function (event, params, senderId) { + me._onRemoveGroups(params.items); + } }; + this.items = {}; // object with an Item for every data item + this.groups = {}; // Group object for every group + this.groupIds = []; + + this.selection = []; // list with the ids of all selected nodes + this.stackDirty = true; // if true, all items will be restacked on next redraw - this._doInAllSectors("_drawAllSectorNodes",ctx); - if (this.drag.dragging == false || this.drag.dragging === undefined || this.constants.hideEdgesOnDrag == false) { - this._doInAllSectors("_drawEdges",ctx); - } + this.touchParams = {}; // stores properties while dragging + // create the HTML DOM - if (this.drag.dragging == false || this.drag.dragging === undefined || this.constants.hideNodesOnDrag == false) { - this._doInAllSectors("_drawNodes",ctx,false); - } + this._create(); - if (this.controlNodesActive == true) { - this._doInAllSectors("_drawControlNodes",ctx); - } + this.setOptions(options); + } - // this._doInSupportSector("_drawNodes",ctx,true); - // this._drawTree(ctx,"#F00F0F"); + ItemSet.prototype = new Component(); - // restore original scaling and translation - ctx.restore(); + // available item types will be registered here + ItemSet.types = { + box: ItemBox, + range: ItemRange, + point: ItemPoint }; /** - * Set the translation of the network - * @param {Number} offsetX Horizontal offset - * @param {Number} offsetY Vertical offset - * @private + * Create the HTML DOM for the ItemSet */ - Network.prototype._setTranslation = function(offsetX, offsetY) { - if (this.translation === undefined) { - this.translation = { - x: 0, - y: 0 - }; - } - - if (offsetX !== undefined) { - this.translation.x = offsetX; - } - if (offsetY !== undefined) { - this.translation.y = offsetY; - } + ItemSet.prototype._create = function(){ + var frame = document.createElement('div'); + frame.className = 'itemset'; + frame['timeline-itemset'] = this; + this.dom.frame = frame; - this.emit('viewChanged'); - }; + // create background panel + var background = document.createElement('div'); + background.className = 'background'; + frame.appendChild(background); + this.dom.background = background; - /** - * Get the translation of the network - * @return {Object} translation An object with parameters x and y, both a number - * @private - */ - Network.prototype._getTranslation = function() { - return { - x: this.translation.x, - y: this.translation.y - }; - }; + // create foreground panel + var foreground = document.createElement('div'); + foreground.className = 'foreground'; + frame.appendChild(foreground); + this.dom.foreground = foreground; - /** - * Scale the network - * @param {Number} scale Scaling factor 1.0 is unscaled - * @private - */ - Network.prototype._setScale = function(scale) { - this.scale = scale; - }; + // create axis panel + var axis = document.createElement('div'); + axis.className = 'axis'; + this.dom.axis = axis; - /** - * Get the current scale of the network - * @return {Number} scale Scaling factor 1.0 is unscaled - * @private - */ - Network.prototype._getScale = function() { - return this.scale; - }; + // create labelset + var labelSet = document.createElement('div'); + labelSet.className = 'labelset'; + this.dom.labelSet = labelSet; - /** - * Convert the X coordinate in DOM-space (coordinate point in browser relative to the container div) to - * the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon) - * @param {number} x - * @returns {number} - * @private - */ - Network.prototype._XconvertDOMtoCanvas = function(x) { - return (x - this.translation.x) / this.scale; - }; + // create ungrouped Group + this._updateUngrouped(); - /** - * Convert the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to - * the X coordinate in DOM-space (coordinate point in browser relative to the container div) - * @param {number} x - * @returns {number} - * @private - */ - Network.prototype._XconvertCanvasToDOM = function(x) { - return x * this.scale + this.translation.x; - }; + // attach event listeners + // Note: we bind to the centerContainer for the case where the height + // of the center container is larger than of the ItemSet, so we + // can click in the empty area to create a new item or deselect an item. + this.hammer = Hammer(this.body.dom.centerContainer, { + prevent_default: true + }); - /** - * Convert the Y coordinate in DOM-space (coordinate point in browser relative to the container div) to - * the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) - * @param {number} y - * @returns {number} - * @private - */ - Network.prototype._YconvertDOMtoCanvas = function(y) { - return (y - this.translation.y) / this.scale; - }; + // drag items when selected + this.hammer.on('touch', this._onTouch.bind(this)); + this.hammer.on('dragstart', this._onDragStart.bind(this)); + this.hammer.on('drag', this._onDrag.bind(this)); + this.hammer.on('dragend', this._onDragEnd.bind(this)); - /** - * Convert the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to - * the Y coordinate in DOM-space (coordinate point in browser relative to the container div) - * @param {number} y - * @returns {number} - * @private - */ - Network.prototype._YconvertCanvasToDOM = function(y) { - return y * this.scale + this.translation.y ; - }; + // single select (or unselect) when tapping an item + this.hammer.on('tap', this._onSelectItem.bind(this)); + // multi select when holding mouse/touch, or on ctrl+click + this.hammer.on('hold', this._onMultiSelectItem.bind(this)); - /** - * - * @param {object} pos = {x: number, y: number} - * @returns {{x: number, y: number}} - * @constructor - */ - Network.prototype.canvasToDOM = function(pos) { - return {x:this._XconvertCanvasToDOM(pos.x),y:this._YconvertCanvasToDOM(pos.y)}; - } + // add item on doubletap + this.hammer.on('doubletap', this._onAddItem.bind(this)); - /** - * - * @param {object} pos = {x: number, y: number} - * @returns {{x: number, y: number}} - * @constructor - */ - Network.prototype.DOMtoCanvas = function(pos) { - return {x:this._XconvertDOMtoCanvas(pos.x),y:this._YconvertDOMtoCanvas(pos.y)}; - } + // attach to the DOM + this.show(); + }; /** - * Redraw all nodes - * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); - * @param {CanvasRenderingContext2D} ctx - * @param {Boolean} [alwaysShow] - * @private + * Set options for the ItemSet. Existing options will be extended/overwritten. + * @param {Object} [options] The following options are available: + * {String} type + * Default type for the items. Choose from 'box' + * (default), 'point', or 'range'. The default + * Style can be overwritten by individual items. + * {String} align + * Alignment for the items, only applicable for + * ItemBox. Choose 'center' (default), 'left', or + * 'right'. + * {String} orientation + * Orientation of the item set. Choose 'top' or + * 'bottom' (default). + * {Function} groupOrder + * A sorting function for ordering groups + * {Boolean} stack + * If true (deafult), items will be stacked on + * top of each other. + * {Number} margin.axis + * Margin between the axis and the items in pixels. + * Default is 20. + * {Number} margin.item.horizontal + * Horizontal margin between items in pixels. + * Default is 10. + * {Number} margin.item.vertical + * Vertical Margin between items in pixels. + * Default is 10. + * {Number} margin.item + * Margin between items in pixels in both horizontal + * and vertical direction. Default is 10. + * {Number} margin + * Set margin for both axis and items in pixels. + * {Number} padding + * Padding of the contents of an item in pixels. + * Must correspond with the items css. Default is 5. + * {Boolean} selectable + * If true (default), items can be selected. + * {Boolean} editable + * Set all editable options to true or false + * {Boolean} editable.updateTime + * Allow dragging an item to an other moment in time + * {Boolean} editable.updateGroup + * Allow dragging an item to an other group + * {Boolean} editable.add + * Allow creating new items on double tap + * {Boolean} editable.remove + * Allow removing items by clicking the delete button + * top right of a selected item. + * {Function(item: Item, callback: Function)} onAdd + * Callback function triggered when an item is about to be added: + * when the user double taps an empty space in the Timeline. + * {Function(item: Item, callback: Function)} onUpdate + * Callback function fired when an item is about to be updated. + * This function typically has to show a dialog where the user + * change the item. If not implemented, nothing happens. + * {Function(item: Item, callback: Function)} onMove + * Fired when an item has been moved. If not implemented, + * the move action will be accepted. + * {Function(item: Item, callback: Function)} onRemove + * Fired when an item is about to be deleted. + * If not implemented, the item will be always removed. */ - Network.prototype._drawNodes = function(ctx,alwaysShow) { - if (alwaysShow === undefined) { - alwaysShow = false; - } - - // first draw the unselected nodes - var nodes = this.nodes; - var selected = []; + ItemSet.prototype.setOptions = function(options) { + if (options) { + // copy all options that we know + var fields = ['type', 'align', 'orientation', 'padding', 'stack', 'selectable', 'groupOrder']; + util.selectiveExtend(fields, this.options, options); - for (var id in nodes) { - if (nodes.hasOwnProperty(id)) { - nodes[id].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight); - if (nodes[id].isSelected()) { - selected.push(id); + if ('margin' in options) { + if (typeof options.margin === 'number') { + this.options.margin.axis = options.margin; + this.options.margin.item.horizontal = options.margin; + this.options.margin.item.vertical = options.margin; } - else { - if (nodes[id].inArea() || alwaysShow) { - nodes[id].draw(ctx); + else if (typeof options.margin === 'object') { + util.selectiveExtend(['axis'], this.options.margin, options.margin); + if ('item' in options.margin) { + if (typeof options.margin.item === 'number') { + this.options.margin.item.horizontal = options.margin.item; + this.options.margin.item.vertical = options.margin.item; + } + else if (typeof options.margin.item === 'object') { + util.selectiveExtend(['horizontal', 'vertical'], this.options.margin.item, options.margin.item); + } } } } - } - // draw the selected nodes on top - for (var s = 0, sMax = selected.length; s < sMax; s++) { - if (nodes[selected[s]].inArea() || alwaysShow) { - nodes[selected[s]].draw(ctx); + if ('editable' in options) { + if (typeof options.editable === 'boolean') { + this.options.editable.updateTime = options.editable; + this.options.editable.updateGroup = options.editable; + this.options.editable.add = options.editable; + this.options.editable.remove = options.editable; + } + else if (typeof options.editable === 'object') { + util.selectiveExtend(['updateTime', 'updateGroup', 'add', 'remove'], this.options.editable, options.editable); + } } + + // callback functions + var addCallback = (function (name) { + if (name in options) { + var fn = options[name]; + if (!(fn instanceof Function)) { + throw new Error('option ' + name + ' must be a function ' + name + '(item, callback)'); + } + this.options[name] = fn; + } + }).bind(this); + ['onAdd', 'onUpdate', 'onRemove', 'onMove'].forEach(addCallback); + + // force the itemSet to refresh: options like orientation and margins may be changed + this.markDirty(); } }; /** - * Redraw all edges - * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); - * @param {CanvasRenderingContext2D} ctx - * @private + * Mark the ItemSet dirty so it will refresh everything with next redraw */ - Network.prototype._drawEdges = function(ctx) { - var edges = this.edges; - for (var id in edges) { - if (edges.hasOwnProperty(id)) { - var edge = edges[id]; - edge.setScale(this.scale); - if (edge.connected) { - edges[id].draw(ctx); - } - } - } + ItemSet.prototype.markDirty = function() { + this.groupIds = []; + this.stackDirty = true; }; /** - * Redraw all edges - * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); - * @param {CanvasRenderingContext2D} ctx - * @private + * Destroy the ItemSet */ - Network.prototype._drawControlNodes = function(ctx) { - var edges = this.edges; - for (var id in edges) { - if (edges.hasOwnProperty(id)) { - edges[id]._drawControlNodes(ctx); - } - } + ItemSet.prototype.destroy = function() { + this.hide(); + this.setItems(null); + this.setGroups(null); + + this.hammer = null; + + this.body = null; + this.conversion = null; }; /** - * Find a stable position for all nodes - * @private + * Hide the component from the DOM */ - Network.prototype._stabilize = function() { - if (this.constants.freezeForStabilization == true) { - this._freezeDefinedNodes(); + ItemSet.prototype.hide = function() { + // remove the frame containing the items + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); } - // find stable position - var count = 0; - while (this.moving && count < this.constants.stabilizationIterations) { - this._physicsTick(); - count++; + // remove the axis with dots + if (this.dom.axis.parentNode) { + this.dom.axis.parentNode.removeChild(this.dom.axis); } - this.zoomExtent(false,true); - if (this.constants.freezeForStabilization == true) { - this._restoreFrozenNodes(); + + // remove the labelset containing all group labels + if (this.dom.labelSet.parentNode) { + this.dom.labelSet.parentNode.removeChild(this.dom.labelSet); } - this.emit("stabilized",{iterations:count}); }; /** - * When initializing and stabilizing, we can freeze nodes with a predefined position. This greatly speeds up stabilization - * because only the supportnodes for the smoothCurves have to settle. - * - * @private + * Show the component in the DOM (when not already visible). + * @return {Boolean} changed */ - Network.prototype._freezeDefinedNodes = function() { - var nodes = this.nodes; - for (var id in nodes) { - if (nodes.hasOwnProperty(id)) { - if (nodes[id].x != null && nodes[id].y != null) { - nodes[id].fixedData.x = nodes[id].xFixed; - nodes[id].fixedData.y = nodes[id].yFixed; - nodes[id].xFixed = true; - nodes[id].yFixed = true; - } - } + ItemSet.prototype.show = function() { + // show frame containing the items + if (!this.dom.frame.parentNode) { + this.body.dom.center.appendChild(this.dom.frame); + } + + // show axis with dots + if (!this.dom.axis.parentNode) { + this.body.dom.top.appendChild(this.dom.axis); + } + + // show labelset containing labels + if (!this.dom.labelSet.parentNode) { + this.body.dom.left.appendChild(this.dom.labelSet); } }; /** - * Unfreezes the nodes that have been frozen by _freezeDefinedNodes. - * - * @private + * Set selected items by their id. Replaces the current selection + * Unknown id's are silently ignored. + * @param {string[] | string} [ids] An array with zero or more id's of the items to be + * selected, or a single item id. If ids is undefined + * or an empty array, all items will be unselected. */ - Network.prototype._restoreFrozenNodes = function() { - var nodes = this.nodes; - for (var id in nodes) { - if (nodes.hasOwnProperty(id)) { - if (nodes[id].fixedData.x != null) { - nodes[id].xFixed = nodes[id].fixedData.x; - nodes[id].yFixed = nodes[id].fixedData.y; - } + ItemSet.prototype.setSelection = function(ids) { + var i, ii, id, item; + + if (ids == undefined) ids = []; + if (!Array.isArray(ids)) ids = [ids]; + + // unselect currently selected items + for (i = 0, ii = this.selection.length; i < ii; i++) { + id = this.selection[i]; + item = this.items[id]; + if (item) item.unselect(); + } + + // select items + this.selection = []; + for (i = 0, ii = ids.length; i < ii; i++) { + id = ids[i]; + item = this.items[id]; + if (item) { + this.selection.push(id); + item.select(); } } }; - /** - * Check if any of the nodes is still moving - * @param {number} vmin the minimum velocity considered as 'moving' - * @return {boolean} true if moving, false if non of the nodes is moving - * @private + * Get the selected items by their id + * @return {Array} ids The ids of the selected items */ - Network.prototype._isMoving = function(vmin) { - var nodes = this.nodes; - for (var id in nodes) { - if (nodes.hasOwnProperty(id) && nodes[id].isMoving(vmin)) { - return true; - } - } - return false; + ItemSet.prototype.getSelection = function() { + return this.selection.concat([]); }; - /** - * /** - * Perform one discrete step for all nodes - * - * @private + * Get the id's of the currently visible items. + * @returns {Array} The ids of the visible items */ - Network.prototype._discreteStepNodes = function(checkMovement) { - var interval = this.physicsDiscreteStepsize; - var nodes = this.nodes; - var nodeId; - var nodesPresent = false; - - if (this.constants.maxVelocity > 0) { - for (nodeId in nodes) { - if (nodes.hasOwnProperty(nodeId)) { - nodes[nodeId].discreteStepLimited(interval, this.constants.maxVelocity); - nodesPresent = true; - } - } - } - else { - for (nodeId in nodes) { - if (nodes.hasOwnProperty(nodeId)) { - nodes[nodeId].discreteStep(interval); - nodesPresent = true; - } - } - } + ItemSet.prototype.getVisibleItems = function() { + var range = this.body.range.getRange(); + var left = this.body.util.toScreen(range.start); + var right = this.body.util.toScreen(range.end); - if (nodesPresent == true && (checkMovement === undefined || checkMovement == true)) { - var vminCorrected = this.constants.minVelocity / Math.max(this.scale,0.05); - if (vminCorrected > 0.5*this.constants.maxVelocity) { - this.moving = true; - } - else { - this.moving = this._isMoving(vminCorrected); - if (this.moving == false) { - this.emit("stabilized",{iterations:null}); - } - this.moving = this.moving || this.configurePhysics; + var ids = []; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + var group = this.groups[groupId]; + var rawVisibleItems = group.visibleItems; + // filter the "raw" set with visibleItems into a set which is really + // visible by pixels + for (var i = 0; i < rawVisibleItems.length; i++) { + var item = rawVisibleItems[i]; + // TODO: also check whether visible vertically + if ((item.left < right) && (item.left + item.width > left)) { + ids.push(item.id); + } + } } } + + return ids; }; /** - * A single simulation step (or "tick") in the physics simulation - * + * Deselect a selected item + * @param {String | Number} id * @private */ - Network.prototype._physicsTick = function() { - if (!this.freezeSimulation) { - if (this.moving == true) { - this._doInAllActiveSectors("_initializeForceCalculation"); - this._doInAllActiveSectors("_discreteStepNodes"); - if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { - this._doInSupportSector("_discreteStepNodes", false); - } - this._findCenter(this._getRange()) + ItemSet.prototype._deselect = function(id) { + var selection = this.selection; + for (var i = 0, ii = selection.length; i < ii; i++) { + if (selection[i] == id) { // non-strict comparison! + selection.splice(i, 1); + break; } } }; - /** - * This function runs one step of the animation. It calls an x amount of physics ticks and one render tick. - * It reschedules itself at the beginning of the function - * - * @private + * Repaint the component + * @return {boolean} Returns true if the component is resized */ - Network.prototype._animationStep = function() { - // reset the timer so a new scheduled animation step can be set - this.timer = undefined; - // handle the keyboad movement - this._handleNavigation(); - - // this schedules a new animation step - this.start(); - - // start the physics simulation - var calculationTime = Date.now(); - var maxSteps = 1; - this._physicsTick(); - var timeRequired = Date.now() - calculationTime; - while (timeRequired < 0.9*(this.renderTimestep - this.renderTime) && maxSteps < this.maxPhysicsTicksPerRender) { - this._physicsTick(); - timeRequired = Date.now() - calculationTime; - maxSteps++; - } - // start the rendering process - var renderTime = Date.now(); - this._redraw(); - this.renderTime = Date.now() - renderTime; + ItemSet.prototype.redraw = function() { + var margin = this.options.margin, + range = this.body.range, + asSize = util.option.asSize, + options = this.options, + orientation = options.orientation, + resized = false, + frame = this.dom.frame, + editable = options.editable.updateTime || options.editable.updateGroup; - }; + // update class name + frame.className = 'itemset' + (editable ? ' editable' : ''); - if (typeof window !== 'undefined') { - window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || - window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; - } + // reorder the groups (if needed) + resized = this._orderGroups() || resized; - /** - * Schedule a animation step with the refreshrate interval. - */ - Network.prototype.start = function() { - if (this.moving == true || this.xIncrement != 0 || this.yIncrement != 0 || this.zoomIncrement != 0) { - if (!this.timer) { - var ua = navigator.userAgent.toLowerCase(); + // check whether zoomed (in that case we need to re-stack everything) + // TODO: would be nicer to get this as a trigger from Range + var visibleInterval = range.end - range.start; + var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.props.width != this.props.lastWidth); + if (zoomed) this.stackDirty = true; + this.lastVisibleInterval = visibleInterval; + this.props.lastWidth = this.props.width; - var requiresTimeout = false; - if (ua.indexOf('msie 9.0') != -1) { // IE 9 - requiresTimeout = true; - } - else if (ua.indexOf('safari') != -1) { // safari - if (ua.indexOf('chrome') <= -1) { - requiresTimeout = true; - } - } + // redraw all groups + var restack = this.stackDirty, + firstGroup = this._firstGroup(), + firstMargin = { + item: margin.item, + axis: margin.axis + }, + nonFirstMargin = { + item: margin.item, + axis: margin.item.vertical / 2 + }, + height = 0, + minHeight = margin.axis + margin.item.vertical; + util.forEach(this.groups, function (group) { + var groupMargin = (group == firstGroup) ? firstMargin : nonFirstMargin; + var groupResized = group.redraw(range, groupMargin, restack); + resized = groupResized || resized; + height += group.height; + }); + height = Math.max(height, minHeight); + this.stackDirty = false; - if (requiresTimeout == true) { - this.timer = window.setTimeout(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function - } - else{ - this.timer = window.requestAnimationFrame(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function - } - } - } - else { - this._redraw(); - } - }; + // update frame height + frame.style.height = asSize(height); + // calculate actual size and position + this.props.top = frame.offsetTop; + this.props.left = frame.offsetLeft; + this.props.width = frame.offsetWidth; + this.props.height = height; - /** - * Move the network according to the keyboard presses. - * - * @private - */ - Network.prototype._handleNavigation = function() { - if (this.xIncrement != 0 || this.yIncrement != 0) { - var translation = this._getTranslation(); - this._setTranslation(translation.x+this.xIncrement, translation.y+this.yIncrement); - } - if (this.zoomIncrement != 0) { - var center = { - x: this.frame.canvas.clientWidth / 2, - y: this.frame.canvas.clientHeight / 2 - }; - this._zoom(this.scale*(1 + this.zoomIncrement), center); - } - }; + // reposition axis + this.dom.axis.style.top = asSize((orientation == 'top') ? + (this.body.domProps.top.height + this.body.domProps.border.top) : + (this.body.domProps.top.height + this.body.domProps.centerContainer.height)); + this.dom.axis.style.left = '0'; + // check if this component is resized + resized = this._isResized() || resized; - /** - * Freeze the _animationStep - */ - Network.prototype.toggleFreeze = function() { - if (this.freezeSimulation == false) { - this.freezeSimulation = true; - } - else { - this.freezeSimulation = false; - this.start(); - } + return resized; }; - /** - * This function cleans the support nodes if they are not needed and adds them when they are. - * - * @param {boolean} [disableStart] + * Get the first group, aligned with the axis + * @return {Group | null} firstGroup * @private */ - Network.prototype._configureSmoothCurves = function(disableStart) { - if (disableStart === undefined) { - disableStart = true; - } - if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { - this._createBezierNodes(); - // cleanup unused support nodes - for (var nodeId in this.sectors['support']['nodes']) { - if (this.sectors['support']['nodes'].hasOwnProperty(nodeId)) { - if (this.edges[this.sectors['support']['nodes'][nodeId].parentEdgeId] === undefined) { - delete this.sectors['support']['nodes'][nodeId]; - } - } - } - } - else { - // delete the support nodes - this.sectors['support']['nodes'] = {}; - for (var edgeId in this.edges) { - if (this.edges.hasOwnProperty(edgeId)) { - this.edges[edgeId].via = null; - } - } - } - + ItemSet.prototype._firstGroup = function() { + var firstGroupIndex = (this.options.orientation == 'top') ? 0 : (this.groupIds.length - 1); + var firstGroupId = this.groupIds[firstGroupIndex]; + var firstGroup = this.groups[firstGroupId] || this.groups[UNGROUPED]; - this._updateCalculationNodes(); - if (!disableStart) { - this.moving = true; - this.start(); - } + return firstGroup || null; }; - /** - * Bezier curves require an anchor point to calculate the smooth flow. These points are nodes. These nodes are invisible but - * are used for the force calculation. - * - * @private + * Create or delete the group holding all ungrouped items. This group is used when + * there are no groups specified. + * @protected */ - Network.prototype._createBezierNodes = function() { - if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { - for (var edgeId in this.edges) { - if (this.edges.hasOwnProperty(edgeId)) { - var edge = this.edges[edgeId]; - if (edge.via == null) { - var nodeId = "edgeId:".concat(edge.id); - this.sectors['support']['nodes'][nodeId] = new Node( - {id:nodeId, - mass:1, - shape:'circle', - image:"", - internalMultiplier:1 - },{},{},this.constants); - edge.via = this.sectors['support']['nodes'][nodeId]; - edge.via.parentEdgeId = edge.id; - edge.positionBezierNode(); + ItemSet.prototype._updateUngrouped = function() { + var ungrouped = this.groups[UNGROUPED]; + + if (this.groupsData) { + // remove the group holding all ungrouped items + if (ungrouped) { + ungrouped.hide(); + delete this.groups[UNGROUPED]; + } + } + else { + // create a group holding all (unfiltered) items + if (!ungrouped) { + var id = null; + var data = null; + ungrouped = new Group(id, data, this); + this.groups[UNGROUPED] = ungrouped; + + for (var itemId in this.items) { + if (this.items.hasOwnProperty(itemId)) { + ungrouped.add(this.items[itemId]); } } + + ungrouped.show(); } } }; /** - * load the functions that load the mixins into the prototype. - * - * @private + * Get the element for the labelset + * @return {HTMLElement} labelSet */ - Network.prototype._initializeMixinLoaders = function () { - for (var mixin in MixinLoader) { - if (MixinLoader.hasOwnProperty(mixin)) { - Network.prototype[mixin] = MixinLoader[mixin]; - } - } + ItemSet.prototype.getLabelSet = function() { + return this.dom.labelSet; }; /** - * Load the XY positions of the nodes into the dataset. + * Set items + * @param {vis.DataSet | null} items */ - Network.prototype.storePosition = function() { - var dataArray = []; - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - var node = this.nodes[nodeId]; - var allowedToMoveX = !this.nodes.xFixed; - var allowedToMoveY = !this.nodes.yFixed; - if (this.nodesData._data[nodeId].x != Math.round(node.x) || this.nodesData._data[nodeId].y != Math.round(node.y)) { - dataArray.push({id:nodeId,x:Math.round(node.x),y:Math.round(node.y),allowedToMoveX:allowedToMoveX,allowedToMoveY:allowedToMoveY}); - } - } - } - this.nodesData.update(dataArray); - }; + ItemSet.prototype.setItems = function(items) { + var me = this, + ids, + oldItemsData = this.itemsData; + // replace the dataset + if (!items) { + this.itemsData = null; + } + else if (items instanceof DataSet || items instanceof DataView) { + this.itemsData = items; + } + else { + throw new TypeError('Data must be an instance of DataSet or DataView'); + } - /** - * Center a node in view. - * - * @param {Number} nodeId - * @param {Number} [zoomLevel] - */ - Network.prototype.focusOnNode = function (nodeId, zoomLevel) { - if (this.nodes.hasOwnProperty(nodeId)) { - if (zoomLevel === undefined) { - zoomLevel = this._getScale(); - } - var nodePosition= {x: this.nodes[nodeId].x, y: this.nodes[nodeId].y}; + if (oldItemsData) { + // unsubscribe from old dataset + util.forEach(this.itemListeners, function (callback, event) { + oldItemsData.off(event, callback); + }); - var requiredScale = zoomLevel; - this._setScale(requiredScale); + // remove all drawn items + ids = oldItemsData.getIds(); + this._onRemove(ids); + } - var canvasCenter = this.DOMtoCanvas({x:0.5 * this.frame.canvas.width,y:0.5 * this.frame.canvas.height}); - var translation = this._getTranslation(); + if (this.itemsData) { + // subscribe to new dataset + var id = this.id; + util.forEach(this.itemListeners, function (callback, event) { + me.itemsData.on(event, callback, id); + }); - var distanceFromCenter = {x:canvasCenter.x - nodePosition.x, - y:canvasCenter.y - nodePosition.y}; + // add all new items + ids = this.itemsData.getIds(); + this._onAdd(ids); - this._setTranslation(translation.x + requiredScale * distanceFromCenter.x, - translation.y + requiredScale * distanceFromCenter.y); - this.redraw(); - } - else { - console.log("This nodeId cannot be found.") + // update the group holding all ungrouped items + this._updateUngrouped(); } }; /** - * Returns true when the Timeline is active. - * @returns {boolean} + * Get the current items + * @returns {vis.DataSet | null} */ - Network.prototype.isActive = function () { - return !this.activator || this.activator.active; + ItemSet.prototype.getItems = function() { + return this.itemsData; }; - module.exports = Network; - - -/***/ }, -/* 33 */ -/***/ function(module, exports, __webpack_require__) { - - var util = __webpack_require__(1); - var Node = __webpack_require__(36); - /** - * @class Edge - * - * A edge connects two nodes - * @param {Object} properties Object with properties. Must contain - * At least properties from and to. - * Available properties: from (number), - * to (number), label (string, color (string), - * width (number), style (string), - * length (number), title (string) - * @param {Network} network A Network object, used to find and edge to - * nodes. - * @param {Object} constants An object with default values for - * example for the color + * Set groups + * @param {vis.DataSet} groups */ - function Edge (properties, network, networkConstants) { - if (!network) { - throw "No network provided"; - } - var fields = ['edges','physics']; - var constants = util.selectiveBridgeObject(fields,networkConstants); - this.options = constants.edges; - this.physics = constants.physics; - this.options['smoothCurves'] = networkConstants['smoothCurves']; - + ItemSet.prototype.setGroups = function(groups) { + var me = this, + ids; - this.network = network; + // unsubscribe from current dataset + if (this.groupsData) { + util.forEach(this.groupListeners, function (callback, event) { + me.groupsData.unsubscribe(event, callback); + }); - // initialize variables - this.id = undefined; - this.fromId = undefined; - this.toId = undefined; - this.title = undefined; - this.widthSelected = this.options.width * this.options.widthSelectionMultiplier; - this.value = undefined; - this.selected = false; - this.hover = false; + // remove all drawn groups + ids = this.groupsData.getIds(); + this.groupsData = null; + this._onRemoveGroups(ids); // note: this will cause a redraw + } - this.from = null; // a node - this.to = null; // a node - this.via = null; // a temp node + // replace the dataset + if (!groups) { + this.groupsData = null; + } + else if (groups instanceof DataSet || groups instanceof DataView) { + this.groupsData = groups; + } + else { + throw new TypeError('Data must be an instance of DataSet or DataView'); + } - // we use this to be able to reconnect the edge to a cluster if its node is put into a cluster - // by storing the original information we can revert to the original connection when the cluser is opened. - this.originalFromId = []; - this.originalToId = []; + if (this.groupsData) { + // subscribe to new dataset + var id = this.id; + util.forEach(this.groupListeners, function (callback, event) { + me.groupsData.on(event, callback, id); + }); - this.connected = false; + // draw all ms + ids = this.groupsData.getIds(); + this._onAddGroups(ids); + } - this.widthFixed = false; - this.lengthFixed = false; + // update the group holding all ungrouped items + this._updateUngrouped(); - this.setProperties(properties); + // update the order of all items in each group + this._order(); - this.controlNodesEnabled = false; - this.controlNodes = {from:null, to:null, positions:{}}; - this.connectedNode = null; - } + this.body.emitter.emit('change'); + }; /** - * Set or overwrite properties for the edge - * @param {Object} properties an object with properties - * @param {Object} constants and object with default, global properties + * Get the current groups + * @returns {vis.DataSet | null} groups */ - Edge.prototype.setProperties = function(properties) { - if (!properties) { - return; - } - - var fields = ['style','fontSize','fontFace','fontColor','fontFill','width', - 'widthSelectionMultiplier','hoverWidth','arrowScaleFactor','dash' - ]; - util.selectiveDeepExtend(fields, this.options, properties); - - if (properties.from !== undefined) {this.fromId = properties.from;} - if (properties.to !== undefined) {this.toId = properties.to;} - - if (properties.id !== undefined) {this.id = properties.id;} - if (properties.label !== undefined) {this.label = properties.label;} - - if (properties.title !== undefined) {this.title = properties.title;} - if (properties.value !== undefined) {this.value = properties.value;} - if (properties.length !== undefined) {this.physics.springLength = properties.length;} - - // scale the arrow - if (properties.arrowScaleFactor !== undefined) {this.options.arrowScaleFactor = properties.arrowScaleFactor;} - - if (properties.inheritColor !== undefined) {this.options.inheritColor = properties.inheritColor;} - - if (properties.color !== undefined) { - this.options.inheritColor = false; - if (util.isString(properties.color)) { - this.options.color.color = properties.color; - this.options.color.highlight = properties.color; - } - else { - if (properties.color.color !== undefined) {this.options.color.color = properties.color.color;} - if (properties.color.highlight !== undefined) {this.options.color.highlight = properties.color.highlight;} - if (properties.color.hover !== undefined) {this.options.color.hover = properties.color.hover;} - } - } - - // A node is connected when it has a from and to node. - this.connect(); - - this.widthFixed = this.widthFixed || (properties.width !== undefined); - this.lengthFixed = this.lengthFixed || (properties.length !== undefined); + ItemSet.prototype.getGroups = function() { + return this.groupsData; + }; - this.widthSelected = this.options.width* this.options.widthSelectionMultiplier; + /** + * Remove an item by its id + * @param {String | Number} id + */ + ItemSet.prototype.removeItem = function(id) { + var item = this.itemsData.get(id), + dataset = this.itemsData.getDataSet(); - // set draw method based on style - switch (this.options.style) { - case 'line': this.draw = this._drawLine; break; - case 'arrow': this.draw = this._drawArrow; break; - case 'arrow-center': this.draw = this._drawArrowCenter; break; - case 'dash-line': this.draw = this._drawDashLine; break; - default: this.draw = this._drawLine; break; + if (item) { + // confirm deletion + this.options.onRemove(item, function (item) { + if (item) { + // remove by id here, it is possible that an item has no id defined + // itself, so better not delete by the item itself + dataset.remove(id); + } + }); } }; /** - * Connect an edge to its nodes + * Handle updated items + * @param {Number[]} ids + * @protected */ - Edge.prototype.connect = function () { - this.disconnect(); + ItemSet.prototype._onUpdate = function(ids) { + var me = this; - this.from = this.network.nodes[this.fromId] || null; - this.to = this.network.nodes[this.toId] || null; - this.connected = (this.from && this.to); + ids.forEach(function (id) { + var itemData = me.itemsData.get(id, me.itemOptions), + item = me.items[id], + type = itemData.type || me.options.type || (itemData.end ? 'range' : 'box'); - if (this.connected) { - this.from.attachEdge(this); - this.to.attachEdge(this); - } - else { - if (this.from) { - this.from.detachEdge(this); + var constructor = ItemSet.types[type]; + + if (item) { + // update item + if (!constructor || !(item instanceof constructor)) { + // item type has changed, delete the item and recreate it + me._removeItem(item); + item = null; + } + else { + me._updateItem(item, itemData); + } } - if (this.to) { - this.to.detachEdge(this); + + if (!item) { + // create item + if (constructor) { + item = new constructor(itemData, me.conversion, me.options); + item.id = id; // TODO: not so nice setting id afterwards + me._addItem(item); + } + else if (type == 'rangeoverflow') { + // TODO: deprecated since version 2.1.0 (or 3.0.0?). cleanup some day + throw new TypeError('Item type "rangeoverflow" is deprecated. Use css styling instead: ' + + '.vis.timeline .item.range .content {overflow: visible;}'); + } + else { + throw new TypeError('Unknown item type "' + type + '"'); + } } - } + }); + + this._order(); + this.stackDirty = true; // force re-stacking of all items next redraw + this.body.emitter.emit('change'); }; /** - * Disconnect an edge from its nodes + * Handle added items + * @param {Number[]} ids + * @protected */ - Edge.prototype.disconnect = function () { - if (this.from) { - this.from.detachEdge(this); - this.from = null; - } - if (this.to) { - this.to.detachEdge(this); - this.to = null; - } + ItemSet.prototype._onAdd = ItemSet.prototype._onUpdate; - this.connected = false; + /** + * Handle removed items + * @param {Number[]} ids + * @protected + */ + ItemSet.prototype._onRemove = function(ids) { + var count = 0; + var me = this; + ids.forEach(function (id) { + var item = me.items[id]; + if (item) { + count++; + me._removeItem(item); + } + }); + + if (count) { + // update order + this._order(); + this.stackDirty = true; // force re-stacking of all items next redraw + this.body.emitter.emit('change'); + } }; /** - * get the title of this edge. - * @return {string} title The title of the edge, or undefined when no title - * has been set. + * Update the order of item in all groups + * @private */ - Edge.prototype.getTitle = function() { - return typeof this.title === "function" ? this.title() : this.title; + ItemSet.prototype._order = function() { + // reorder the items in all groups + // TODO: optimization: only reorder groups affected by the changed items + util.forEach(this.groups, function (group) { + group.order(); + }); }; - /** - * Retrieve the value of the edge. Can be undefined - * @return {Number} value + * Handle updated groups + * @param {Number[]} ids + * @private */ - Edge.prototype.getValue = function() { - return this.value; + ItemSet.prototype._onUpdateGroups = function(ids) { + this._onAddGroups(ids); }; /** - * Adjust the value range of the edge. The edge will adjust it's width - * based on its value. - * @param {Number} min - * @param {Number} max + * Handle changed groups + * @param {Number[]} ids + * @private */ - Edge.prototype.setValueRange = function(min, max) { - if (!this.widthFixed && this.value !== undefined) { - var scale = (this.options.widthMax - this.options.widthMin) / (max - min); - this.options.width= (this.value - min) * scale + this.options.widthMin; - this.widthSelected = this.options.width* this.options.widthSelectionMultiplier; - } + ItemSet.prototype._onAddGroups = function(ids) { + var me = this; + + ids.forEach(function (id) { + var groupData = me.groupsData.get(id); + var group = me.groups[id]; + + if (!group) { + // check for reserved ids + if (id == UNGROUPED) { + throw new Error('Illegal group id. ' + id + ' is a reserved id.'); + } + + var groupOptions = Object.create(me.options); + util.extend(groupOptions, { + height: null + }); + + group = new Group(id, groupData, me); + me.groups[id] = group; + + // add items with this groupId to the new group + for (var itemId in me.items) { + if (me.items.hasOwnProperty(itemId)) { + var item = me.items[itemId]; + if (item.data.group == id) { + group.add(item); + } + } + } + + group.order(); + group.show(); + } + else { + // update group + group.setData(groupData); + } + }); + + this.body.emitter.emit('change'); }; /** - * Redraw a edge - * Draw this edge in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx + * Handle removed groups + * @param {Number[]} ids + * @private */ - Edge.prototype.draw = function(ctx) { - throw "Method draw not initialized in edge"; + ItemSet.prototype._onRemoveGroups = function(ids) { + var groups = this.groups; + ids.forEach(function (id) { + var group = groups[id]; + + if (group) { + group.hide(); + delete groups[id]; + } + }); + + this.markDirty(); + + this.body.emitter.emit('change'); }; /** - * Check if this object is overlapping with the provided object - * @param {Object} obj an object with parameters left, top - * @return {boolean} True if location is located on the edge + * Reorder the groups if needed + * @return {boolean} changed + * @private */ - Edge.prototype.isOverlappingWith = function(obj) { - if (this.connected) { - var distMax = 10; - var xFrom = this.from.x; - var yFrom = this.from.y; - var xTo = this.to.x; - var yTo = this.to.y; - var xObj = obj.left; - var yObj = obj.top; + ItemSet.prototype._orderGroups = function () { + if (this.groupsData) { + // reorder the groups + var groupIds = this.groupsData.getIds({ + order: this.options.groupOrder + }); - var dist = this._getDistanceToEdge(xFrom, yFrom, xTo, yTo, xObj, yObj); + var changed = !util.equalArray(groupIds, this.groupIds); + if (changed) { + // hide all groups, removes them from the DOM + var groups = this.groups; + groupIds.forEach(function (groupId) { + groups[groupId].hide(); + }); + + // show the groups again, attach them to the DOM in correct order + groupIds.forEach(function (groupId) { + groups[groupId].show(); + }); + + this.groupIds = groupIds; + } - return (dist < distMax); + return changed; } else { - return false + return false; } }; - Edge.prototype._getColor = function() { - var colorObj = this.options.color; - if (this.options.inheritColor == "to") { - colorObj = { - highlight: this.to.options.color.highlight.border, - hover: this.to.options.color.hover.border, - color: this.to.options.color.border - }; - } - else if (this.options.inheritColor == "from" || this.options.inheritColor == true) { - colorObj = { - highlight: this.from.options.color.highlight.border, - hover: this.from.options.color.hover.border, - color: this.from.options.color.border - }; + /** + * Add a new item + * @param {Item} item + * @private + */ + ItemSet.prototype._addItem = function(item) { + this.items[item.id] = item; + + // add to group + var groupId = this.groupsData ? item.data.group : UNGROUPED; + var group = this.groups[groupId]; + if (group) group.add(item); + }; + + /** + * Update an existing item + * @param {Item} item + * @param {Object} itemData + * @private + */ + ItemSet.prototype._updateItem = function(item, itemData) { + var oldGroupId = item.data.group; + + item.data = itemData; + if (item.displayed) { + item.redraw(); } - if (this.selected == true) {return colorObj.highlight;} - else if (this.hover == true) {return colorObj.hover;} - else {return colorObj.color;} - } + // update group + if (oldGroupId != item.data.group) { + var oldGroup = this.groups[oldGroupId]; + if (oldGroup) oldGroup.remove(item); + var groupId = this.groupsData ? item.data.group : UNGROUPED; + var group = this.groups[groupId]; + if (group) group.add(item); + } + }; /** - * Redraw a edge as a line - * Draw this edge in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx + * Delete an item from the ItemSet: remove it from the DOM, from the map + * with items, and from the map with visible items, and from the selection + * @param {Item} item * @private */ - Edge.prototype._drawLine = function(ctx) { - // set style - ctx.strokeStyle = this._getColor(); - ctx.lineWidth = this._getLineWidth(); + ItemSet.prototype._removeItem = function(item) { + // remove from DOM + item.hide(); - if (this.from != this.to) { - // draw line - var via = this._line(ctx); + // remove from items + delete this.items[item.id]; - // draw label - var point; - if (this.label) { - if (this.options.smoothCurves.enabled == true && via != null) { - var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); - var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); - point = {x:midpointX, y:midpointY}; - } - else { - point = this._pointOnLine(0.5); - } - this._label(ctx, this.label, point.x, point.y); - } - } - else { - var x, y; - var radius = this.physics.springLength / 4; - var node = this.from; - if (!node.width) { - node.resize(ctx); - } - if (node.width > node.height) { - x = node.x + node.width / 2; - y = node.y - radius; - } - else { - x = node.x + radius; - y = node.y - node.height / 2; - } - this._circle(ctx, x, y, radius); - point = this._pointOnCircle(x, y, radius, 0.5); - this._label(ctx, this.label, point.x, point.y); - } + // remove from selection + var index = this.selection.indexOf(item.id); + if (index != -1) this.selection.splice(index, 1); + + // remove from group + var groupId = this.groupsData ? item.data.group : UNGROUPED; + var group = this.groups[groupId]; + if (group) group.remove(item); }; /** - * Get the line width of the edge. Depends on width and whether one of the - * connected nodes is selected. - * @return {Number} width + * Create an array containing all items being a range (having an end date) + * @param array + * @returns {Array} * @private */ - Edge.prototype._getLineWidth = function() { - if (this.selected == true) { - return Math.min(this.widthSelected, this.options.widthMax)*this.networkScaleInv; - } - else { - if (this.hover == true) { - return Math.min(this.options.hoverWidth, this.options.widthMax)*this.networkScaleInv; - } - else { - return this.options.width*this.networkScaleInv; + ItemSet.prototype._constructByEndArray = function(array) { + var endArray = []; + + for (var i = 0; i < array.length; i++) { + if (array[i] instanceof ItemRange) { + endArray.push(array[i]); } } + return endArray; }; - Edge.prototype._getViaCoordinates = function () { - var xVia = null; - var yVia = null; - var factor = this.options.smoothCurves.roundness; - var type = this.options.smoothCurves.type; + /** + * Register the clicked item on touch, before dragStart is initiated. + * + * dragStart is initiated from a mousemove event, which can have left the item + * already resulting in an item == null + * + * @param {Event} event + * @private + */ + ItemSet.prototype._onTouch = function (event) { + // store the touched item, used in _onDragStart + this.touchParams.item = ItemSet.itemFromTarget(event); + }; - var dx = Math.abs(this.from.x - this.to.x); - var dy = Math.abs(this.from.y - this.to.y); - if (type == 'discrete' || type == 'diagonalCross') { - if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { - if (this.from.y > this.to.y) { - if (this.from.x < this.to.x) { - xVia = this.from.x + factor * dy; - yVia = this.from.y - factor * dy; - } - else if (this.from.x > this.to.x) { - xVia = this.from.x - factor * dy; - yVia = this.from.y - factor * dy; - } - } - else if (this.from.y < this.to.y) { - if (this.from.x < this.to.x) { - xVia = this.from.x + factor * dy; - yVia = this.from.y + factor * dy; - } - else if (this.from.x > this.to.x) { - xVia = this.from.x - factor * dy; - yVia = this.from.y + factor * dy; - } - } - if (type == "discrete") { - xVia = dx < factor * dy ? this.from.x : xVia; - } - } - else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { - if (this.from.y > this.to.y) { - if (this.from.x < this.to.x) { - xVia = this.from.x + factor * dx; - yVia = this.from.y - factor * dx; - } - else if (this.from.x > this.to.x) { - xVia = this.from.x - factor * dx; - yVia = this.from.y - factor * dx; - } - } - else if (this.from.y < this.to.y) { - if (this.from.x < this.to.x) { - xVia = this.from.x + factor * dx; - yVia = this.from.y + factor * dx; - } - else if (this.from.x > this.to.x) { - xVia = this.from.x - factor * dx; - yVia = this.from.y + factor * dx; - } - } - if (type == "discrete") { - yVia = dy < factor * dx ? this.from.y : yVia; - } - } - } - else if (type == "straightCross") { - if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { // up - down - xVia = this.from.x; - if (this.from.y < this.to.y) { - yVia = this.to.y - (1-factor) * dy; - } - else { - yVia = this.to.y + (1-factor) * dy; - } - } - else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { // left - right - if (this.from.x < this.to.x) { - xVia = this.to.x - (1-factor) * dx; - } - else { - xVia = this.to.x + (1-factor) * dx; - } - yVia = this.from.y; - } - } - else if (type == 'horizontal') { - if (this.from.x < this.to.x) { - xVia = this.to.x - (1-factor) * dx; - } - else { - xVia = this.to.x + (1-factor) * dx; - } - yVia = this.from.y; - } - else if (type == 'vertical') { - xVia = this.from.x; - if (this.from.y < this.to.y) { - yVia = this.to.y - (1-factor) * dy; - } - else { - yVia = this.to.y + (1-factor) * dy; - } + /** + * Start dragging the selected events + * @param {Event} event + * @private + */ + ItemSet.prototype._onDragStart = function (event) { + if (!this.options.editable.updateTime && !this.options.editable.updateGroup) { + return; } - else { // continuous - if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { - if (this.from.y > this.to.y) { - if (this.from.x < this.to.x) { - // console.log(1) - xVia = this.from.x + factor * dy; - yVia = this.from.y - factor * dy; - xVia = this.to.x < xVia ? this.to.x : xVia; - } - else if (this.from.x > this.to.x) { - // console.log(2) - xVia = this.from.x - factor * dy; - yVia = this.from.y - factor * dy; - xVia = this.to.x > xVia ? this.to.x :xVia; - } + + var item = this.touchParams.item || null, + me = this, + props; + + if (item && item.selected) { + var dragLeftItem = event.target.dragLeftItem; + var dragRightItem = event.target.dragRightItem; + + if (dragLeftItem) { + props = { + item: dragLeftItem + }; + + if (me.options.editable.updateTime) { + props.start = item.data.start.valueOf(); } - else if (this.from.y < this.to.y) { - if (this.from.x < this.to.x) { - // console.log(3) - xVia = this.from.x + factor * dy; - yVia = this.from.y + factor * dy; - xVia = this.to.x < xVia ? this.to.x : xVia; - } - else if (this.from.x > this.to.x) { - // console.log(4, this.from.x, this.to.x) - xVia = this.from.x - factor * dy; - yVia = this.from.y + factor * dy; - xVia = this.to.x > xVia ? this.to.x : xVia; - } + if (me.options.editable.updateGroup) { + if ('group' in item.data) props.group = item.data.group; } + + this.touchParams.itemProps = [props]; } - else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { - if (this.from.y > this.to.y) { - if (this.from.x < this.to.x) { - // console.log(5) - xVia = this.from.x + factor * dx; - yVia = this.from.y - factor * dx; - yVia = this.to.y > yVia ? this.to.y : yVia; - } - else if (this.from.x > this.to.x) { - // console.log(6) - xVia = this.from.x - factor * dx; - yVia = this.from.y - factor * dx; - yVia = this.to.y > yVia ? this.to.y : yVia; - } + else if (dragRightItem) { + props = { + item: dragRightItem + }; + + if (me.options.editable.updateTime) { + props.end = item.data.end.valueOf(); } - else if (this.from.y < this.to.y) { - if (this.from.x < this.to.x) { - // console.log(7) - xVia = this.from.x + factor * dx; - yVia = this.from.y + factor * dx; - yVia = this.to.y < yVia ? this.to.y : yVia; - } - else if (this.from.x > this.to.x) { - // console.log(8) - xVia = this.from.x - factor * dx; - yVia = this.from.y + factor * dx; - yVia = this.to.y < yVia ? this.to.y : yVia; - } + if (me.options.editable.updateGroup) { + if ('group' in item.data) props.group = item.data.group; } + + this.touchParams.itemProps = [props]; } - } + else { + this.touchParams.itemProps = this.getSelection().map(function (id) { + var item = me.items[id]; + var props = { + item: item + }; + + if (me.options.editable.updateTime) { + if ('start' in item.data) props.start = item.data.start.valueOf(); + if ('end' in item.data) props.end = item.data.end.valueOf(); + } + if (me.options.editable.updateGroup) { + if ('group' in item.data) props.group = item.data.group; + } + return props; + }); + } - return {x:xVia, y:yVia}; - } + event.stopPropagation(); + } + }; /** - * Draw a line between two nodes - * @param {CanvasRenderingContext2D} ctx + * Drag selected items + * @param {Event} event * @private */ - Edge.prototype._line = function (ctx) { - // draw a straight line - ctx.beginPath(); - ctx.moveTo(this.from.x, this.from.y); - if (this.options.smoothCurves.enabled == true) { - if (this.options.smoothCurves.dynamic == false) { - var via = this._getViaCoordinates(); - if (via.x == null) { - ctx.lineTo(this.to.x, this.to.y); - ctx.stroke(); - return null; + ItemSet.prototype._onDrag = function (event) { + if (this.touchParams.itemProps) { + var range = this.body.range, + snap = this.body.util.snap || null, + deltaX = event.gesture.deltaX, + scale = (this.props.width / (range.end - range.start)), + offset = deltaX / scale; + + // move + this.touchParams.itemProps.forEach(function (props) { + if ('start' in props) { + var start = new Date(props.start + offset); + props.item.data.start = snap ? snap(start) : start; } - else { - // this.via.x = via.x; - // this.via.y = via.y; - ctx.quadraticCurveTo(via.x,via.y,this.to.x, this.to.y); - ctx.stroke(); - return via; + + if ('end' in props) { + var end = new Date(props.end + offset); + props.item.data.end = snap ? snap(end) : end; } - } - else { - ctx.quadraticCurveTo(this.via.x,this.via.y,this.to.x, this.to.y); - ctx.stroke(); - return this.via; - } - } - else { - ctx.lineTo(this.to.x, this.to.y); - ctx.stroke(); - return null; + + if ('group' in props) { + // drag from one group to another + var group = ItemSet.groupFromTarget(event); + _moveToGroup(props.item, group); + } + }); + + // TODO: implement onMoving handler + + this.stackDirty = true; // force re-stacking of all items next redraw + this.body.emitter.emit('change'); + + event.stopPropagation(); } }; /** - * Draw a line from a node to itself, a circle - * @param {CanvasRenderingContext2D} ctx - * @param {Number} x - * @param {Number} y - * @param {Number} radius + * Move an item to another group + * @param {Item} item + * @param {Group} group * @private */ - Edge.prototype._circle = function (ctx, x, y, radius) { - // draw a circle - ctx.beginPath(); - ctx.arc(x, y, radius, 0, 2 * Math.PI, false); - ctx.stroke(); - }; + function _moveToGroup (item, group) { + if (group && group.groupId != item.data.group) { + var oldGroup = item.parent; + oldGroup.remove(item); + oldGroup.order(); + group.add(item); + group.order(); + + item.data.group = group.groupId; + } + } /** - * Draw label with white background and with the middle at (x, y) - * @param {CanvasRenderingContext2D} ctx - * @param {String} text - * @param {Number} x - * @param {Number} y + * End of dragging selected items + * @param {Event} event * @private */ - Edge.prototype._label = function (ctx, text, x, y) { - if (text) { - // TODO: cache the calculated size - ctx.font = ((this.from.selected || this.to.selected) ? "bold " : "") + - this.options.fontSize + "px " + this.options.fontFace; - ctx.fillStyle = this.options.fontFill; - var width = ctx.measureText(text).width; - var height = this.options.fontSize; - var left = x - width / 2; - var top = y - height / 2; + ItemSet.prototype._onDragEnd = function (event) { + if (this.touchParams.itemProps) { + // prepare a change set for the changed items + var changes = [], + me = this, + dataset = this.itemsData.getDataSet(); + + var itemProps = this.touchParams.itemProps ; + this.touchParams.itemProps = null; + itemProps.forEach(function (props) { + var id = props.item.id, + itemData = me.itemsData.get(id, me.itemOptions); + + var changed = false; + if ('start' in props.item.data) { + changed = (props.start != props.item.data.start.valueOf()); + itemData.start = util.convert(props.item.data.start, + dataset._options.type && dataset._options.type.start || 'Date'); + } + if ('end' in props.item.data) { + changed = changed || (props.end != props.item.data.end.valueOf()); + itemData.end = util.convert(props.item.data.end, + dataset._options.type && dataset._options.type.end || 'Date'); + } + if ('group' in props.item.data) { + changed = changed || (props.group != props.item.data.group); + itemData.group = props.item.data.group; + } + + // only apply changes when start or end is actually changed + if (changed) { + me.options.onMove(itemData, function (itemData) { + if (itemData) { + // apply changes + itemData[dataset._fieldId] = id; // ensure the item contains its id (can be undefined) + changes.push(itemData); + } + else { + // restore original values + if ('start' in props) props.item.data.start = props.start; + if ('end' in props) props.item.data.end = props.end; + if ('group' in props && props.item.data.group != props.group) { + var group = me.groups[props.group]; + _moveToGroup(props.item, group); + } - ctx.fillRect(left, top, width, height); + me.stackDirty = true; // force re-stacking of all items next redraw + me.body.emitter.emit('change'); + } + }); + } + }); - // draw text - ctx.fillStyle = this.options.fontColor || "black"; - ctx.textAlign = "left"; - ctx.textBaseline = "top"; - ctx.fillText(text, left, top); + // apply the changes to the data (if there are changes) + if (changes.length) { + dataset.update(changes); + } + + event.stopPropagation(); } }; /** - * Redraw a edge as a dashed line - * Draw this edge in the given canvas - * @author David Jordan - * @date 2012-08-08 - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx + * Handle selecting/deselecting an item when tapping it + * @param {Event} event * @private */ - Edge.prototype._drawDashLine = function(ctx) { - // set style - if (this.selected == true) {ctx.strokeStyle = this.options.color.highlight;} - else if (this.hover == true) {ctx.strokeStyle = this.options.color.hover;} - else {ctx.strokeStyle = this.options.color.color;} - - ctx.lineWidth = this._getLineWidth(); - - var via = null; - // only firefox and chrome support this method, else we use the legacy one. - if (ctx.mozDash !== undefined || ctx.setLineDash !== undefined) { - // configure the dash pattern - var pattern = [0]; - if (this.options.dash.length !== undefined && this.options.dash.gap !== undefined) { - pattern = [this.options.dash.length,this.options.dash.gap]; - } - else { - pattern = [5,5]; - } + ItemSet.prototype._onSelectItem = function (event) { + if (!this.options.selectable) return; - // set dash settings for chrome or firefox - if (typeof ctx.setLineDash !== 'undefined') { //Chrome - ctx.setLineDash(pattern); - ctx.lineDashOffset = 0; + var ctrlKey = event.gesture.srcEvent && event.gesture.srcEvent.ctrlKey; + var shiftKey = event.gesture.srcEvent && event.gesture.srcEvent.shiftKey; + if (ctrlKey || shiftKey) { + this._onMultiSelectItem(event); + return; + } - } else { //Firefox - ctx.mozDash = pattern; - ctx.mozDashOffset = 0; - } + var oldSelection = this.getSelection(); - // draw the line - via = this._line(ctx); + var item = ItemSet.itemFromTarget(event); + var selection = item ? [item.id] : []; + this.setSelection(selection); - // restore the dash settings. - if (typeof ctx.setLineDash !== 'undefined') { //Chrome - ctx.setLineDash([0]); - ctx.lineDashOffset = 0; + var newSelection = this.getSelection(); - } else { //Firefox - ctx.mozDash = [0]; - ctx.mozDashOffset = 0; - } - } - else { // unsupporting smooth lines - // draw dashed line - ctx.beginPath(); - ctx.lineCap = 'round'; - if (this.options.dash.altLength !== undefined) //If an alt dash value has been set add to the array this value - { - ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, - [this.options.dash.length,this.options.dash.gap,this.options.dash.altLength,this.options.dash.gap]); - } - else if (this.options.dash.length !== undefined && this.options.dash.gap !== undefined) //If a dash and gap value has been set add to the array this value - { - ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, - [this.options.dash.length,this.options.dash.gap]); - } - else //If all else fails draw a line - { - ctx.moveTo(this.from.x, this.from.y); - ctx.lineTo(this.to.x, this.to.y); - } - ctx.stroke(); + // emit a select event, + // except when old selection is empty and new selection is still empty + if (newSelection.length > 0 || oldSelection.length > 0) { + this.body.emitter.emit('select', { + items: this.getSelection() + }); } - // draw label - if (this.label) { - var point; - if (this.options.smoothCurves.enabled == true && via != null) { - var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); - var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); - point = {x:midpointX, y:midpointY}; - } - else { - point = this._pointOnLine(0.5); - } - this._label(ctx, this.label, point.x, point.y); - } + event.stopPropagation(); }; /** - * Get a point on a line - * @param {Number} percentage. Value between 0 (line start) and 1 (line end) - * @return {Object} point + * Handle creation and updates of an item on double tap + * @param event * @private */ - Edge.prototype._pointOnLine = function (percentage) { - return { - x: (1 - percentage) * this.from.x + percentage * this.to.x, - y: (1 - percentage) * this.from.y + percentage * this.to.y + ItemSet.prototype._onAddItem = function (event) { + if (!this.options.selectable) return; + if (!this.options.editable.add) return; + + var me = this, + snap = this.body.util.snap || null, + item = ItemSet.itemFromTarget(event); + + if (item) { + // update item + + // execute async handler to update the item (or cancel it) + var itemData = me.itemsData.get(item.id); // get a clone of the data from the dataset + this.options.onUpdate(itemData, function (itemData) { + if (itemData) { + me.itemsData.update(itemData); + } + }); } - }; + else { + // add item + var xAbs = util.getAbsoluteLeft(this.dom.frame); + var x = event.gesture.center.pageX - xAbs; + var start = this.body.util.toTime(x); + var newItem = { + start: snap ? snap(start) : start, + content: 'new item' + }; - /** - * Get a point on a circle - * @param {Number} x - * @param {Number} y - * @param {Number} radius - * @param {Number} percentage. Value between 0 (line start) and 1 (line end) - * @return {Object} point - * @private - */ - Edge.prototype._pointOnCircle = function (x, y, radius, percentage) { - var angle = (percentage - 3/8) * 2 * Math.PI; - return { - x: x + radius * Math.cos(angle), - y: y - radius * Math.sin(angle) + // when default type is a range, add a default end date to the new item + if (this.options.type === 'range') { + var end = this.body.util.toTime(x + this.props.width / 5); + newItem.end = snap ? snap(end) : end; + } + + newItem[this.itemsData.fieldId] = util.randomUUID(); + + var group = ItemSet.groupFromTarget(event); + if (group) { + newItem.group = group.groupId; + } + + // execute async handler to customize (or cancel) adding an item + this.options.onAdd(newItem, function (item) { + if (item) { + me.itemsData.add(newItem); + // TODO: need to trigger a redraw? + } + }); } }; /** - * Redraw a edge as a line with an arrow halfway the line - * Draw this edge in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx + * Handle selecting/deselecting multiple items when holding an item + * @param {Event} event * @private */ - Edge.prototype._drawArrowCenter = function(ctx) { - var point; - // set style - if (this.selected == true) {ctx.strokeStyle = this.options.color.highlight; ctx.fillStyle = this.options.color.highlight;} - else if (this.hover == true) {ctx.strokeStyle = this.options.color.hover; ctx.fillStyle = this.options.color.hover;} - else {ctx.strokeStyle = this.options.color.color; ctx.fillStyle = this.options.color.color;} - ctx.lineWidth = this._getLineWidth(); + ItemSet.prototype._onMultiSelectItem = function (event) { + if (!this.options.selectable) return; - if (this.from != this.to) { - // draw line - var via = this._line(ctx); + var selection, + item = ItemSet.itemFromTarget(event); - var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); - var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; - // draw an arrow halfway the line - if (this.options.smoothCurves.enabled == true && via != null) { - var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); - var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); - point = {x:midpointX, y:midpointY}; + if (item) { + // multi select items + selection = this.getSelection(); // current selection + var index = selection.indexOf(item.id); + if (index == -1) { + // item is not yet selected -> select it + selection.push(item.id); } else { - point = this._pointOnLine(0.5); + // item is already selected -> deselect it + selection.splice(index, 1); } + this.setSelection(selection); - ctx.arrow(point.x, point.y, angle, length); - ctx.fill(); - ctx.stroke(); + this.body.emitter.emit('select', { + items: this.getSelection() + }); - // draw label - if (this.label) { - this._label(ctx, this.label, point.x, point.y); + event.stopPropagation(); + } + }; + + /** + * Find an item from an event target: + * searches for the attribute 'timeline-item' in the event target's element tree + * @param {Event} event + * @return {Item | null} item + */ + ItemSet.itemFromTarget = function(event) { + var target = event.target; + while (target) { + if (target.hasOwnProperty('timeline-item')) { + return target['timeline-item']; } + target = target.parentNode; } - else { - // draw circle - var x, y; - var radius = 0.25 * Math.max(100,this.physics.springLength); - var node = this.from; - if (!node.width) { - node.resize(ctx); - } - if (node.width > node.height) { - x = node.x + node.width * 0.5; - y = node.y - radius; - } - else { - x = node.x + radius; - y = node.y - node.height * 0.5; + + return null; + }; + + /** + * Find the Group from an event target: + * searches for the attribute 'timeline-group' in the event target's element tree + * @param {Event} event + * @return {Group | null} group + */ + ItemSet.groupFromTarget = function(event) { + var target = event.target; + while (target) { + if (target.hasOwnProperty('timeline-group')) { + return target['timeline-group']; } - this._circle(ctx, x, y, radius); + target = target.parentNode; + } - // draw all arrows - var angle = 0.2 * Math.PI; - var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; - point = this._pointOnCircle(x, y, radius, 0.5); - ctx.arrow(point.x, point.y, angle, length); - ctx.fill(); - ctx.stroke(); + return null; + }; - // draw label - if (this.label) { - point = this._pointOnCircle(x, y, radius, 0.5); - this._label(ctx, this.label, point.x, point.y); + /** + * Find the ItemSet from an event target: + * searches for the attribute 'timeline-itemset' in the event target's element tree + * @param {Event} event + * @return {ItemSet | null} item + */ + ItemSet.itemSetFromTarget = function(event) { + var target = event.target; + while (target) { + if (target.hasOwnProperty('timeline-itemset')) { + return target['timeline-itemset']; } + target = target.parentNode; } + + return null; }; + module.exports = ItemSet; + +/***/ }, +/* 30 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var stack = __webpack_require__(31); + var ItemRange = __webpack_require__(32); /** - * Redraw a edge as a line with an arrow - * Draw this edge in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx - * @private + * @constructor Group + * @param {Number | String} groupId + * @param {Object} data + * @param {ItemSet} itemSet */ - Edge.prototype._drawArrow = function(ctx) { - // set style - if (this.selected == true) {ctx.strokeStyle = this.options.color.highlight; ctx.fillStyle = this.options.color.highlight;} - else if (this.hover == true) {ctx.strokeStyle = this.options.color.hover; ctx.fillStyle = this.options.color.hover;} - else {ctx.strokeStyle = this.options.color.color; ctx.fillStyle = this.options.color.color;} + function Group (groupId, data, itemSet) { + this.groupId = groupId; - ctx.lineWidth = this._getLineWidth(); + this.itemSet = itemSet; - var angle, length; - //draw a line - if (this.from != this.to) { - angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); - var dx = (this.to.x - this.from.x); - var dy = (this.to.y - this.from.y); - var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); + this.dom = {}; + this.props = { + label: { + width: 0, + height: 0 + } + }; + this.className = null; - var fromBorderDist = this.from.distanceToBorder(ctx, angle + Math.PI); - var fromBorderPoint = (edgeSegmentLength - fromBorderDist) / edgeSegmentLength; - var xFrom = (fromBorderPoint) * this.from.x + (1 - fromBorderPoint) * this.to.x; - var yFrom = (fromBorderPoint) * this.from.y + (1 - fromBorderPoint) * this.to.y; + this.items = {}; // items filtered by groupId of this group + this.visibleItems = []; // items currently visible in window + this.orderedItems = { // items sorted by start and by end + byStart: [], + byEnd: [] + }; - var via; - if (this.options.smoothCurves.dynamic == true && this.options.smoothCurves.enabled == true ) { - via = this.via; - } - else if (this.options.smoothCurves.enabled == true) { - via = this._getViaCoordinates(); - } + this._create(); - if (this.options.smoothCurves.enabled == true && via.x != null) { - angle = Math.atan2((this.to.y - via.y), (this.to.x - via.x)); - dx = (this.to.x - via.x); - dy = (this.to.y - via.y); - edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); - } - var toBorderDist = this.to.distanceToBorder(ctx, angle); - var toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength; + this.setData(data); + } - var xTo,yTo; - if (this.options.smoothCurves.enabled == true && via.x != null) { - xTo = (1 - toBorderPoint) * via.x + toBorderPoint * this.to.x; - yTo = (1 - toBorderPoint) * via.y + toBorderPoint * this.to.y; - } - else { - xTo = (1 - toBorderPoint) * this.from.x + toBorderPoint * this.to.x; - yTo = (1 - toBorderPoint) * this.from.y + toBorderPoint * this.to.y; - } + /** + * Create DOM elements for the group + * @private + */ + Group.prototype._create = function() { + var label = document.createElement('div'); + label.className = 'vlabel'; + this.dom.label = label; - ctx.beginPath(); - ctx.moveTo(xFrom,yFrom); - if (this.options.smoothCurves.enabled == true && via.x != null) { - ctx.quadraticCurveTo(via.x,via.y,xTo, yTo); - } - else { - ctx.lineTo(xTo, yTo); - } - ctx.stroke(); + var inner = document.createElement('div'); + inner.className = 'inner'; + label.appendChild(inner); + this.dom.inner = inner; - // draw arrow at the end of the line - length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; - ctx.arrow(xTo, yTo, angle, length); - ctx.fill(); - ctx.stroke(); + var foreground = document.createElement('div'); + foreground.className = 'group'; + foreground['timeline-group'] = this; + this.dom.foreground = foreground; - // draw label - if (this.label) { - var point; - if (this.options.smoothCurves.enabled == true && via != null) { - var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); - var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); - point = {x:midpointX, y:midpointY}; - } - else { - point = this._pointOnLine(0.5); - } - this._label(ctx, this.label, point.x, point.y); - } + this.dom.background = document.createElement('div'); + this.dom.background.className = 'group'; + + this.dom.axis = document.createElement('div'); + this.dom.axis.className = 'group'; + + // create a hidden marker to detect when the Timelines container is attached + // to the DOM, or the style of a parent of the Timeline is changed from + // display:none is changed to visible. + this.dom.marker = document.createElement('div'); + this.dom.marker.style.visibility = 'hidden'; + this.dom.marker.innerHTML = '?'; + this.dom.background.appendChild(this.dom.marker); + }; + + /** + * Set the group data for this group + * @param {Object} data Group data, can contain properties content and className + */ + Group.prototype.setData = function(data) { + // update contents + var content = data && data.content; + if (content instanceof Element) { + this.dom.inner.appendChild(content); + } + else if (content !== undefined && content !== null) { + this.dom.inner.innerHTML = content; } else { - // draw circle - var node = this.from; - var x, y, arrow; - var radius = 0.25 * Math.max(100,this.physics.springLength); - if (!node.width) { - node.resize(ctx); - } - if (node.width > node.height) { - x = node.x + node.width * 0.5; - y = node.y - radius; - arrow = { - x: x, - y: node.y, - angle: 0.9 * Math.PI - }; - } - else { - x = node.x + radius; - y = node.y - node.height * 0.5; - arrow = { - x: node.x, - y: y, - angle: 0.6 * Math.PI - }; - } - ctx.beginPath(); - // TODO: similarly, for a line without arrows, draw to the border of the nodes instead of the center - ctx.arc(x, y, radius, 0, 2 * Math.PI, false); - ctx.stroke(); + this.dom.inner.innerHTML = this.groupId || ''; // groupId can be null + } - // draw all arrows - var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; - ctx.arrow(arrow.x, arrow.y, arrow.angle, length); - ctx.fill(); - ctx.stroke(); + // update title + this.dom.label.title = data && data.title || ''; - // draw label - if (this.label) { - point = this._pointOnCircle(x, y, radius, 0.5); - this._label(ctx, this.label, point.x, point.y); + if (!this.dom.inner.firstChild) { + util.addClassName(this.dom.inner, 'hidden'); + } + else { + util.removeClassName(this.dom.inner, 'hidden'); + } + + // update className + var className = data && data.className || null; + if (className != this.className) { + if (this.className) { + util.removeClassName(this.dom.label, className); + util.removeClassName(this.dom.foreground, className); + util.removeClassName(this.dom.background, className); + util.removeClassName(this.dom.axis, className); } + util.addClassName(this.dom.label, className); + util.addClassName(this.dom.foreground, className); + util.addClassName(this.dom.background, className); + util.addClassName(this.dom.axis, className); } }; + /** + * Get the width of the group label + * @return {number} width + */ + Group.prototype.getLabelWidth = function() { + return this.props.label.width; + }; /** - * Calculate the distance between a point (x3,y3) and a line segment from - * (x1,y1) to (x2,y2). - * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment - * @param {number} x1 - * @param {number} y1 - * @param {number} x2 - * @param {number} y2 - * @param {number} x3 - * @param {number} y3 - * @private + * Repaint this group + * @param {{start: number, end: number}} range + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * @param {boolean} [restack=false] Force restacking of all items + * @return {boolean} Returns true if the group is resized */ - Edge.prototype._getDistanceToEdge = function (x1,y1, x2,y2, x3,y3) { // x3,y3 is the point - if (this.from != this.to) { - if (this.options.smoothCurves.enabled == true) { - var xVia, yVia; - if (this.options.smoothCurves.enabled == true && this.options.smoothCurves.dynamic == true) { - xVia = this.via.x; - yVia = this.via.y; - } - else { - var via = this._getViaCoordinates(); - xVia = via.x; - yVia = via.y; - } - var minDistance = 1e9; - var distance; - var i,t,x,y, lastX, lastY; - for (i = 0; i < 10; i++) { - t = 0.1*i; - x = Math.pow(1-t,2)*x1 + (2*t*(1 - t))*xVia + Math.pow(t,2)*x2; - y = Math.pow(1-t,2)*y1 + (2*t*(1 - t))*yVia + Math.pow(t,2)*y2; - if (i > 0) { - distance = this._getDistanceToLine(lastX,lastY,x,y, x3,y3); - minDistance = distance < minDistance ? distance : minDistance; - } - lastX = x; lastY = y; - } - return minDistance - } - else { - return this._getDistanceToLine(x1,y1,x2,y2,x3,y3); + Group.prototype.redraw = function(range, margin, restack) { + var resized = false; + + this.visibleItems = this._updateVisibleItems(this.orderedItems, this.visibleItems, range); + + // force recalculation of the height of the items when the marker height changed + // (due to the Timeline being attached to the DOM or changed from display:none to visible) + var markerHeight = this.dom.marker.clientHeight; + if (markerHeight != this.lastMarkerHeight) { + this.lastMarkerHeight = markerHeight; + + util.forEach(this.items, function (item) { + item.dirty = true; + if (item.displayed) item.redraw(); + }); + + restack = true; + } + + // reposition visible items vertically + if (this.itemSet.options.stack) { // TODO: ugly way to access options... + stack.stack(this.visibleItems, margin, restack); + } + else { // no stacking + stack.nostack(this.visibleItems, margin); + } + + // recalculate the height of the group + var height; + var visibleItems = this.visibleItems; + if (visibleItems.length) { + var min = visibleItems[0].top; + var max = visibleItems[0].top + visibleItems[0].height; + util.forEach(visibleItems, function (item) { + min = Math.min(min, item.top); + max = Math.max(max, (item.top + item.height)); + }); + if (min > margin.axis) { + // there is an empty gap between the lowest item and the axis + var offset = min - margin.axis; + max -= offset; + util.forEach(visibleItems, function (item) { + item.top -= offset; + }); } + height = max + margin.item.vertical / 2; } else { - var x, y, dx, dy; - var radius = 0.25 * this.physics.springLength; - var node = this.from; - if (node.width > node.height) { - x = node.x + 0.5 * node.width; - y = node.y - radius; - } - else { - x = node.x + radius; - y = node.y - 0.5 * node.height; - } - dx = x - x3; - dy = y - y3; - return Math.abs(Math.sqrt(dx*dx + dy*dy) - radius); + height = margin.axis + margin.item.vertical; } - }; + height = Math.max(height, this.props.label.height); - Edge.prototype._getDistanceToLine = function(x1,y1,x2,y2,x3,y3) { - var px = x2-x1, - py = y2-y1, - something = px*px + py*py, - u = ((x3 - x1) * px + (y3 - y1) * py) / something; + // calculate actual size and position + var foreground = this.dom.foreground; + this.top = foreground.offsetTop; + this.left = foreground.offsetLeft; + this.width = foreground.offsetWidth; + resized = util.updateProperty(this, 'height', height) || resized; - if (u > 1) { - u = 1; - } - else if (u < 0) { - u = 0; - } + // recalculate size of label + resized = util.updateProperty(this.props.label, 'width', this.dom.inner.clientWidth) || resized; + resized = util.updateProperty(this.props.label, 'height', this.dom.inner.clientHeight) || resized; - var x = x1 + u * px, - y = y1 + u * py, - dx = x - x3, - dy = y - y3; + // apply new height + this.dom.background.style.height = height + 'px'; + this.dom.foreground.style.height = height + 'px'; + this.dom.label.style.height = height + 'px'; - //# Note: If the actual distance does not matter, - //# if you only want to compare what this function - //# returns to other results of this function, you - //# can just return the squared distance instead - //# (i.e. remove the sqrt) to gain a little performance + // update vertical position of items after they are re-stacked and the height of the group is calculated + for (var i = 0, ii = this.visibleItems.length; i < ii; i++) { + var item = this.visibleItems[i]; + item.repositionY(); + } - return Math.sqrt(dx*dx + dy*dy); - } + return resized; + }; /** - * This allows the zoom level of the network to influence the rendering - * - * @param scale + * Show this group: attach to the DOM */ - Edge.prototype.setScale = function(scale) { - this.networkScaleInv = 1.0/scale; - }; + Group.prototype.show = function() { + if (!this.dom.label.parentNode) { + this.itemSet.dom.labelSet.appendChild(this.dom.label); + } + if (!this.dom.foreground.parentNode) { + this.itemSet.dom.foreground.appendChild(this.dom.foreground); + } - Edge.prototype.select = function() { - this.selected = true; - }; + if (!this.dom.background.parentNode) { + this.itemSet.dom.background.appendChild(this.dom.background); + } - Edge.prototype.unselect = function() { - this.selected = false; + if (!this.dom.axis.parentNode) { + this.itemSet.dom.axis.appendChild(this.dom.axis); + } }; - Edge.prototype.positionBezierNode = function() { - if (this.via !== null && this.from !== null && this.to !== null) { - this.via.x = 0.5 * (this.from.x + this.to.x); - this.via.y = 0.5 * (this.from.y + this.to.y); + /** + * Hide this group: remove from the DOM + */ + Group.prototype.hide = function() { + var label = this.dom.label; + if (label.parentNode) { + label.parentNode.removeChild(label); + } + + var foreground = this.dom.foreground; + if (foreground.parentNode) { + foreground.parentNode.removeChild(foreground); + } + + var background = this.dom.background; + if (background.parentNode) { + background.parentNode.removeChild(background); + } + + var axis = this.dom.axis; + if (axis.parentNode) { + axis.parentNode.removeChild(axis); } }; /** - * This function draws the control nodes for the manipulator. In order to enable this, only set the this.controlNodesEnabled to true. - * @param ctx + * Add an item to the group + * @param {Item} item */ - Edge.prototype._drawControlNodes = function(ctx) { - if (this.controlNodesEnabled == true) { - if (this.controlNodes.from === null && this.controlNodes.to === null) { - var nodeIdFrom = "edgeIdFrom:".concat(this.id); - var nodeIdTo = "edgeIdTo:".concat(this.id); - var constants = { - nodes:{group:'', radius:8}, - physics:{damping:0}, - clustering: {maxNodeSizeIncrements: 0 ,nodeScaling: {width:0, height: 0, radius:0}} - }; - this.controlNodes.from = new Node( - {id:nodeIdFrom, - shape:'dot', - color:{background:'#ff4e00', border:'#3c3c3c', highlight: {background:'#07f968'}} - },{},{},constants); - this.controlNodes.to = new Node( - {id:nodeIdTo, - shape:'dot', - color:{background:'#ff4e00', border:'#3c3c3c', highlight: {background:'#07f968'}} - },{},{},constants); - } - - if (this.controlNodes.from.selected == false && this.controlNodes.to.selected == false) { - this.controlNodes.positions = this.getControlNodePositions(ctx); - this.controlNodes.from.x = this.controlNodes.positions.from.x; - this.controlNodes.from.y = this.controlNodes.positions.from.y; - this.controlNodes.to.x = this.controlNodes.positions.to.x; - this.controlNodes.to.y = this.controlNodes.positions.to.y; - } + Group.prototype.add = function(item) { + this.items[item.id] = item; + item.setParent(this); - this.controlNodes.from.draw(ctx); - this.controlNodes.to.draw(ctx); - } - else { - this.controlNodes = {from:null, to:null, positions:{}}; + if (this.visibleItems.indexOf(item) == -1) { + var range = this.itemSet.body.range; // TODO: not nice accessing the range like this + this._checkIfVisible(item, this.visibleItems, range); } }; /** - * Enable control nodes. - * @private + * Remove an item from the group + * @param {Item} item */ - Edge.prototype._enableControlNodes = function() { - this.controlNodesEnabled = true; + Group.prototype.remove = function(item) { + delete this.items[item.id]; + item.setParent(this.itemSet); + + // remove from visible items + var index = this.visibleItems.indexOf(item); + if (index != -1) this.visibleItems.splice(index, 1); + + // TODO: also remove from ordered items? }; /** - * disable control nodes + * Remove an item from the corresponding DataSet + * @param {Item} item + */ + Group.prototype.removeFromDataSet = function(item) { + this.itemSet.removeItem(item.id); + }; + + /** + * Reorder the items + */ + Group.prototype.order = function() { + var array = util.toArray(this.items); + this.orderedItems.byStart = array; + this.orderedItems.byEnd = this._constructByEndArray(array); + + stack.orderByStart(this.orderedItems.byStart); + stack.orderByEnd(this.orderedItems.byEnd); + }; + + /** + * Create an array containing all items being a range (having an end date) + * @param {Item[]} array + * @returns {ItemRange[]} * @private */ - Edge.prototype._disableControlNodes = function() { - this.controlNodesEnabled = false; + Group.prototype._constructByEndArray = function(array) { + var endArray = []; + + for (var i = 0; i < array.length; i++) { + if (array[i] instanceof ItemRange) { + endArray.push(array[i]); + } + } + return endArray; }; /** - * This checks if one of the control nodes is selected and if so, returns the control node object. Else it returns null. - * @param x - * @param y - * @returns {null} + * Update the visible items + * @param {{byStart: Item[], byEnd: Item[]}} orderedItems All items ordered by start date and by end date + * @param {Item[]} visibleItems The previously visible items. + * @param {{start: number, end: number}} range Visible range + * @return {Item[]} visibleItems The new visible items. * @private */ - Edge.prototype._getSelectedControlNode = function(x,y) { - var positions = this.controlNodes.positions; - var fromDistance = Math.sqrt(Math.pow(x - positions.from.x,2) + Math.pow(y - positions.from.y,2)); - var toDistance = Math.sqrt(Math.pow(x - positions.to.x ,2) + Math.pow(y - positions.to.y ,2)); + Group.prototype._updateVisibleItems = function(orderedItems, visibleItems, range) { + var initialPosByStart, + newVisibleItems = [], + i; - if (fromDistance < 15) { - this.connectedNode = this.from; - this.from = this.controlNodes.from; - return this.controlNodes.from; + // first check if the items that were in view previously are still in view. + // this handles the case for the ItemRange that is both before and after the current one. + if (visibleItems.length > 0) { + for (i = 0; i < visibleItems.length; i++) { + this._checkIfVisible(visibleItems[i], newVisibleItems, range); + } } - else if (toDistance < 15) { - this.connectedNode = this.to; - this.to = this.controlNodes.to; - return this.controlNodes.to; + + // If there were no visible items previously, use binarySearch to find a visible ItemPoint or ItemRange (based on startTime) + if (newVisibleItems.length == 0) { + initialPosByStart = util.binarySearch(orderedItems.byStart, range, 'data','start'); } else { - return null; + initialPosByStart = orderedItems.byStart.indexOf(newVisibleItems[0]); } + + // use visible search to find a visible ItemRange (only based on endTime) + var initialPosByEnd = util.binarySearch(orderedItems.byEnd, range, 'data','end'); + + // if we found a initial ID to use, trace it up and down until we meet an invisible item. + if (initialPosByStart != -1) { + for (i = initialPosByStart; i >= 0; i--) { + if (this._checkIfInvisible(orderedItems.byStart[i], newVisibleItems, range)) {break;} + } + for (i = initialPosByStart + 1; i < orderedItems.byStart.length; i++) { + if (this._checkIfInvisible(orderedItems.byStart[i], newVisibleItems, range)) {break;} + } + } + + // if we found a initial ID to use, trace it up and down until we meet an invisible item. + if (initialPosByEnd != -1) { + for (i = initialPosByEnd; i >= 0; i--) { + if (this._checkIfInvisible(orderedItems.byEnd[i], newVisibleItems, range)) {break;} + } + for (i = initialPosByEnd + 1; i < orderedItems.byEnd.length; i++) { + if (this._checkIfInvisible(orderedItems.byEnd[i], newVisibleItems, range)) {break;} + } + } + + return newVisibleItems; }; + /** - * this resets the control nodes to their original position. + * this function checks if an item is invisible. If it is NOT we make it visible + * and add it to the global visible items. If it is, return true. + * + * @param {Item} item + * @param {Item[]} visibleItems + * @param {{start:number, end:number}} range + * @returns {boolean} * @private */ - Edge.prototype._restoreControlNodes = function() { - if (this.controlNodes.from.selected == true) { - this.from = this.connectedNode; - this.connectedNode = null; - this.controlNodes.from.unselect(); + Group.prototype._checkIfInvisible = function(item, visibleItems, range) { + if (item.isVisible(range)) { + if (!item.displayed) item.show(); + item.repositionX(); + if (visibleItems.indexOf(item) == -1) { + visibleItems.push(item); + } + return false; } - if (this.controlNodes.to.selected == true) { - this.to = this.connectedNode; - this.connectedNode = null; - this.controlNodes.to.unselect(); + else { + if (item.displayed) item.hide(); + return true; } }; /** - * this calculates the position of the control nodes on the edges of the parent nodes. + * this function is very similar to the _checkIfInvisible() but it does not + * return booleans, hides the item if it should not be seen and always adds to + * the visibleItems. + * this one is for brute forcing and hiding. * - * @param ctx - * @returns {{from: {x: number, y: number}, to: {x: *, y: *}}} + * @param {Item} item + * @param {Array} visibleItems + * @param {{start:number, end:number}} range + * @private */ - Edge.prototype.getControlNodePositions = function(ctx) { - var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); - var dx = (this.to.x - this.from.x); - var dy = (this.to.y - this.from.y); - var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); - var fromBorderDist = this.from.distanceToBorder(ctx, angle + Math.PI); - var fromBorderPoint = (edgeSegmentLength - fromBorderDist) / edgeSegmentLength; - var xFrom = (fromBorderPoint) * this.from.x + (1 - fromBorderPoint) * this.to.x; - var yFrom = (fromBorderPoint) * this.from.y + (1 - fromBorderPoint) * this.to.y; - - var via; - if (this.options.smoothCurves.dynamic == true && this.options.smoothCurves.enabled == true) { - via = this.via; - } - else if (this.options.smoothCurves.enabled == true) { - via = this._getViaCoordinates(); - } - - if (this.options.smoothCurves.enabled == true && via.x != null) { - angle = Math.atan2((this.to.y - via.y), (this.to.x - via.x)); - dx = (this.to.x - via.x); - dy = (this.to.y - via.y); - edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); - } - var toBorderDist = this.to.distanceToBorder(ctx, angle); - var toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength; - - var xTo,yTo; - if (this.options.smoothCurves.enabled == true && via.x != null) { - xTo = (1 - toBorderPoint) * via.x + toBorderPoint * this.to.x; - yTo = (1 - toBorderPoint) * via.y + toBorderPoint * this.to.y; + Group.prototype._checkIfVisible = function(item, visibleItems, range) { + if (item.isVisible(range)) { + if (!item.displayed) item.show(); + // reposition item horizontally + item.repositionX(); + visibleItems.push(item); } else { - xTo = (1 - toBorderPoint) * this.from.x + toBorderPoint * this.to.x; - yTo = (1 - toBorderPoint) * this.from.y + toBorderPoint * this.to.y; + if (item.displayed) item.hide(); } - - return {from:{x:xFrom,y:yFrom},to:{x:xTo,y:yTo}}; }; - module.exports = Edge; + module.exports = Group; + /***/ }, -/* 34 */ +/* 31 */ /***/ function(module, exports, __webpack_require__) { - var util = __webpack_require__(1); + // Utility functions for ordering and stacking of items + var EPSILON = 0.001; // used when checking collisions, to prevent round-off errors /** - * @class Groups - * This class can store groups and properties specific for groups. + * Order items by their start data + * @param {Item[]} items */ - function Groups() { - this.clear(); - this.defaultIndex = 0; - } + exports.orderByStart = function(items) { + items.sort(function (a, b) { + return a.data.start - b.data.start; + }); + }; + /** + * Order items by their end date. If they have no end date, their start date + * is used. + * @param {Item[]} items + */ + exports.orderByEnd = function(items) { + items.sort(function (a, b) { + var aTime = ('end' in a.data) ? a.data.end : a.data.start, + bTime = ('end' in b.data) ? b.data.end : b.data.start; + + return aTime - bTime; + }); + }; + + /** + * Adjust vertical positions of the items such that they don't overlap each + * other. + * @param {Item[]} items + * All visible items + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * Margins between items and between items and the axis. + * @param {boolean} [force=false] + * If true, all items will be repositioned. If false (default), only + * items having a top===null will be re-stacked + */ + exports.stack = function(items, margin, force) { + var i, iMax; + + if (force) { + // reset top position of all items + for (i = 0, iMax = items.length; i < iMax; i++) { + items[i].top = null; + } + } - /** - * default constants for group colors - */ - Groups.DEFAULT = [ - {border: "#2B7CE9", background: "#97C2FC", highlight: {border: "#2B7CE9", background: "#D2E5FF"}, hover: {border: "#2B7CE9", background: "#D2E5FF"}}, // blue - {border: "#FFA500", background: "#FFFF00", highlight: {border: "#FFA500", background: "#FFFFA3"}, hover: {border: "#FFA500", background: "#FFFFA3"}}, // yellow - {border: "#FA0A10", background: "#FB7E81", highlight: {border: "#FA0A10", background: "#FFAFB1"}, hover: {border: "#FA0A10", background: "#FFAFB1"}}, // red - {border: "#41A906", background: "#7BE141", highlight: {border: "#41A906", background: "#A1EC76"}, hover: {border: "#41A906", background: "#A1EC76"}}, // green - {border: "#E129F0", background: "#EB7DF4", highlight: {border: "#E129F0", background: "#F0B3F5"}, hover: {border: "#E129F0", background: "#F0B3F5"}}, // magenta - {border: "#7C29F0", background: "#AD85E4", highlight: {border: "#7C29F0", background: "#D3BDF0"}, hover: {border: "#7C29F0", background: "#D3BDF0"}}, // purple - {border: "#C37F00", background: "#FFA807", highlight: {border: "#C37F00", background: "#FFCA66"}, hover: {border: "#C37F00", background: "#FFCA66"}}, // orange - {border: "#4220FB", background: "#6E6EFD", highlight: {border: "#4220FB", background: "#9B9BFD"}, hover: {border: "#4220FB", background: "#9B9BFD"}}, // darkblue - {border: "#FD5A77", background: "#FFC0CB", highlight: {border: "#FD5A77", background: "#FFD1D9"}, hover: {border: "#FD5A77", background: "#FFD1D9"}}, // pink - {border: "#4AD63A", background: "#C2FABC", highlight: {border: "#4AD63A", background: "#E6FFE3"}, hover: {border: "#4AD63A", background: "#E6FFE3"}} // mint - ]; + // calculate new, non-overlapping positions + for (i = 0, iMax = items.length; i < iMax; i++) { + var item = items[i]; + if (item.top === null) { + // initialize top position + item.top = margin.axis; + do { + // TODO: optimize checking for overlap. when there is a gap without items, + // you only need to check for items from the next item on, not from zero + var collidingItem = null; + for (var j = 0, jj = items.length; j < jj; j++) { + var other = items[j]; + if (other.top !== null && other !== item && exports.collision(item, other, margin.item)) { + collidingItem = other; + break; + } + } - /** - * Clear all groups - */ - Groups.prototype.clear = function () { - this.groups = {}; - this.groups.length = function() - { - var i = 0; - for ( var p in this ) { - if (this.hasOwnProperty(p)) { - i++; - } + if (collidingItem != null) { + // There is a collision. Reposition the items above the colliding element + item.top = collidingItem.top + collidingItem.height + margin.item.vertical; + } + } while (collidingItem); } - return i; } }; - /** - * get group properties of a groupname. If groupname is not found, a new group - * is added. - * @param {*} groupname Can be a number, string, Date, etc. - * @return {Object} group The created group, containing all group properties + * Adjust vertical positions of the items without stacking them + * @param {Item[]} items + * All visible items + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * Margins between items and between items and the axis. */ - Groups.prototype.get = function (groupname) { - var group = this.groups[groupname]; - if (group == undefined) { - // create new group - var index = this.defaultIndex % Groups.DEFAULT.length; - this.defaultIndex++; - group = {}; - group.color = Groups.DEFAULT[index]; - this.groups[groupname] = group; - } + exports.nostack = function(items, margin) { + var i, iMax; - return group; + // reset top position of all items + for (i = 0, iMax = items.length; i < iMax; i++) { + items[i].top = margin.axis; + } }; /** - * Add a custom group style - * @param {String} groupname - * @param {Object} style An object containing borderColor, - * backgroundColor, etc. - * @return {Object} group The created group object + * Test if the two provided items collide + * The items must have parameters left, width, top, and height. + * @param {Item} a The first item + * @param {Item} b The second item + * @param {{horizontal: number, vertical: number}} margin + * An object containing a horizontal and vertical + * minimum required margin. + * @return {boolean} true if a and b collide, else false */ - Groups.prototype.add = function (groupname, style) { - this.groups[groupname] = style; - if (style.color) { - style.color = util.parseColor(style.color); - } - return style; + exports.collision = function(a, b, margin) { + return ((a.left - margin.horizontal + EPSILON) < (b.left + b.width) && + (a.left + a.width + margin.horizontal - EPSILON) > b.left && + (a.top - margin.vertical + EPSILON) < (b.top + b.height) && + (a.top + a.height + margin.vertical - EPSILON) > b.top); }; - module.exports = Groups; - /***/ }, -/* 35 */ +/* 32 */ /***/ function(module, exports, __webpack_require__) { + var Hammer = __webpack_require__(18); + var Item = __webpack_require__(33); + /** - * @class Images - * This class loads images and keeps them stored. + * @constructor ItemRange + * @extends Item + * @param {Object} data Object containing parameters start, end + * content, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options + * // TODO: describe options */ - function Images() { - this.images = {}; + function ItemRange (data, conversion, options) { + this.props = { + content: { + width: 0 + } + }; + this.overflow = false; // if contents can overflow (css styling), this flag is set to true - this.callback = undefined; + // validate data + if (data) { + if (data.start == undefined) { + throw new Error('Property "start" missing in item ' + data.id); + } + if (data.end == undefined) { + throw new Error('Property "end" missing in item ' + data.id); + } + } + + Item.call(this, data, conversion, options); } + ItemRange.prototype = new Item (null, null, null); + + ItemRange.prototype.baseClassName = 'item range'; + /** - * Set an onload callback function. This will be called each time an image - * is loaded - * @param {function} callback + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible */ - Images.prototype.setOnloadCallback = function(callback) { - this.callback = callback; + ItemRange.prototype.isVisible = function(range) { + // determine visibility + return (this.data.start < range.end) && (this.data.end > range.start); }; /** - * - * @param {string} url Url of the image - * @return {Image} img The image object + * Repaint the item */ - Images.prototype.load = function(url) { - var img = this.images[url]; - if (img == undefined) { - // create the image - var images = this; - img = new Image(); - this.images[url] = img; - img.onload = function() { - if (images.callback) { - images.callback(this); - } - }; - img.src = url; - } - - return img; - }; - - module.exports = Images; - - -/***/ }, -/* 36 */ -/***/ function(module, exports, __webpack_require__) { + ItemRange.prototype.redraw = function() { + var dom = this.dom; + if (!dom) { + // create DOM + this.dom = {}; + dom = this.dom; - var util = __webpack_require__(1); + // background box + dom.box = document.createElement('div'); + // className is updated in redraw() - /** - * @class Node - * A node. A node can be connected to other nodes via one or multiple edges. - * @param {object} properties An object containing properties for the node. All - * properties are optional, except for the id. - * {number} id Id of the node. Required - * {string} label Text label for the node - * {number} x Horizontal position of the node - * {number} y Vertical position of the node - * {string} shape Node shape, available: - * "database", "circle", "ellipse", - * "box", "image", "text", "dot", - * "star", "triangle", "triangleDown", - * "square" - * {string} image An image url - * {string} title An title text, can be HTML - * {anytype} group A group name or number - * @param {Network.Images} imagelist A list with images. Only needed - * when the node has an image - * @param {Network.Groups} grouplist A list with groups. Needed for - * retrieving group properties - * @param {Object} constants An object with default values for - * example for the color - * - */ - function Node(properties, imagelist, grouplist, networkConstants) { - var constants = util.selectiveBridgeObject(['nodes'],networkConstants); - this.options = constants.nodes; + // contents box + dom.content = document.createElement('div'); + dom.content.className = 'content'; + dom.box.appendChild(dom.content); - this.selected = false; - this.hover = false; + // attach this item as attribute + dom.box['timeline-item'] = this; + } - this.edges = []; // all edges connected to this node - this.dynamicEdges = []; - this.reroutedEdges = {}; + // append DOM to parent DOM + if (!this.parent) { + throw new Error('Cannot redraw item: no parent attached'); + } + if (!dom.box.parentNode) { + var foreground = this.parent.dom.foreground; + if (!foreground) { + throw new Error('Cannot redraw time axis: parent has no foreground container element'); + } + foreground.appendChild(dom.box); + } + this.displayed = true; - this.fontDrawThreshold = 3; + // update contents + if (this.data.content != this.content) { + this.content = this.data.content; + if (this.content instanceof Element) { + dom.content.innerHTML = ''; + dom.content.appendChild(this.content); + } + else if (this.data.content != undefined) { + dom.content.innerHTML = this.content; + } + else { + throw new Error('Property "content" missing in item ' + this.data.id); + } - // set defaults for the properties - this.id = undefined; - this.x = null; - this.y = null; - this.xFixed = false; - this.yFixed = false; - this.horizontalAlignLeft = true; // these are for the navigation controls - this.verticalAlignTop = true; // these are for the navigation controls - this.baseRadiusValue = networkConstants.nodes.radius; - this.radiusFixed = false; - this.level = -1; - this.preassignedLevel = false; + this.dirty = true; + } + // update title + if (this.data.title != this.title) { + dom.box.title = this.data.title; + this.title = this.data.title; + } - this.imagelist = imagelist; - this.grouplist = grouplist; + // update class + var className = (this.data.className ? (' ' + this.data.className) : '') + + (this.selected ? ' selected' : ''); + if (this.className != className) { + this.className = className; + dom.box.className = this.baseClassName + className; - // physics properties - this.fx = 0.0; // external force x - this.fy = 0.0; // external force y - this.vx = 0.0; // velocity x - this.vy = 0.0; // velocity y - this.damping = networkConstants.physics.damping; // written every time gravity is calculated - this.fixedData = {x:null,y:null}; + this.dirty = true; + } + // recalculate size + if (this.dirty) { + // determine from css whether this box has overflow + this.overflow = window.getComputedStyle(dom.content).overflow !== 'hidden'; - this.setProperties(properties, constants); + this.props.content.width = this.dom.content.offsetWidth; + this.height = this.dom.box.offsetHeight; - // creating the variables for clustering - this.resetCluster(); - this.dynamicEdgesLength = 0; - this.clusterSession = 0; - this.clusterSizeWidthFactor = networkConstants.clustering.nodeScaling.width; - this.clusterSizeHeightFactor = networkConstants.clustering.nodeScaling.height; - this.clusterSizeRadiusFactor = networkConstants.clustering.nodeScaling.radius; - this.maxNodeSizeIncrements = networkConstants.clustering.maxNodeSizeIncrements; - this.growthIndicator = 0; + this.dirty = false; + } - // variables to tell the node about the network. - this.networkScaleInv = 1; - this.networkScale = 1; - this.canvasTopLeft = {"x": -300, "y": -300}; - this.canvasBottomRight = {"x": 300, "y": 300}; - this.parentEdgeId = null; - } + this._repaintDeleteButton(dom.box); + this._repaintDragLeft(); + this._repaintDragRight(); + }; /** - * (re)setting the clustering variables and objects + * Show the item in the DOM (when not already visible). The items DOM will + * be created when needed. */ - Node.prototype.resetCluster = function() { - // clustering variables - this.formationScale = undefined; // this is used to determine when to open the cluster - this.clusterSize = 1; // this signifies the total amount of nodes in this cluster - this.containedNodes = {}; - this.containedEdges = {}; - this.clusterSessions = []; + ItemRange.prototype.show = function() { + if (!this.displayed) { + this.redraw(); + } }; /** - * Attach a edge to the node - * @param {Edge} edge + * Hide the item from the DOM (when visible) + * @return {Boolean} changed */ - Node.prototype.attachEdge = function(edge) { - if (this.edges.indexOf(edge) == -1) { - this.edges.push(edge); - } - if (this.dynamicEdges.indexOf(edge) == -1) { - this.dynamicEdges.push(edge); + ItemRange.prototype.hide = function() { + if (this.displayed) { + var box = this.dom.box; + + if (box.parentNode) { + box.parentNode.removeChild(box); + } + + this.top = null; + this.left = null; + + this.displayed = false; } - this.dynamicEdgesLength = this.dynamicEdges.length; }; /** - * Detach a edge from the node - * @param {Edge} edge + * Reposition the item horizontally + * @Override */ - Node.prototype.detachEdge = function(edge) { - var index = this.edges.indexOf(edge); - if (index != -1) { - this.edges.splice(index, 1); - this.dynamicEdges.splice(index, 1); + ItemRange.prototype.repositionX = function() { + var props = this.props, + parentWidth = this.parent.width, + start = this.conversion.toScreen(this.data.start), + end = this.conversion.toScreen(this.data.end), + padding = this.options.padding, + contentLeft; + + // limit the width of the this, as browsers cannot draw very wide divs + if (start < -parentWidth) { + start = -parentWidth; } - this.dynamicEdgesLength = this.dynamicEdges.length; - }; + if (end > 2 * parentWidth) { + end = 2 * parentWidth; + } + var boxWidth = Math.max(end - start, 1); + if (this.overflow) { + // when range exceeds left of the window, position the contents at the left of the visible area + contentLeft = Math.max(-start, 0); - /** - * Set or overwrite properties for the node - * @param {Object} properties an object with properties - * @param {Object} constants and object with default, global properties - */ - Node.prototype.setProperties = function(properties, constants) { - if (!properties) { - return; + this.left = start; + this.width = boxWidth + this.props.content.width; + // Note: The calculation of width is an optimistic calculation, giving + // a width which will not change when moving the Timeline + // So no restacking needed, which is nicer for the eye; } + else { // no overflow + // when range exceeds left of the window, position the contents at the left of the visible area + if (start < 0) { + contentLeft = Math.min(-start, + (end - start - props.content.width - 2 * padding)); + // TODO: remove the need for options.padding. it's terrible. + } + else { + contentLeft = 0; + } - var fields = ['borderWidth','borderWidthSelected','shape','image','radius','fontColor', - 'fontSize','fontFace','group','mass' - ]; - util.selectiveDeepExtend(fields, this.options, properties); + this.left = start; + this.width = boxWidth; + } - this.originalLabel = undefined; - // basic properties - if (properties.id !== undefined) {this.id = properties.id;} - if (properties.label !== undefined) {this.label = properties.label; this.originalLabel = properties.label;} - if (properties.title !== undefined) {this.title = properties.title;} - if (properties.x !== undefined) {this.x = properties.x;} - if (properties.y !== undefined) {this.y = properties.y;} - if (properties.value !== undefined) {this.value = properties.value;} - if (properties.level !== undefined) {this.level = properties.level; this.preassignedLevel = true;} + this.dom.box.style.left = this.left + 'px'; + this.dom.box.style.width = boxWidth + 'px'; + this.dom.content.style.left = contentLeft + 'px'; + }; - // navigation controls properties - if (properties.horizontalAlignLeft !== undefined) {this.horizontalAlignLeft = properties.horizontalAlignLeft;} - if (properties.verticalAlignTop !== undefined) {this.verticalAlignTop = properties.verticalAlignTop;} - if (properties.triggerFunction !== undefined) {this.triggerFunction = properties.triggerFunction;} + /** + * Reposition the item vertically + * @Override + */ + ItemRange.prototype.repositionY = function() { + var orientation = this.options.orientation, + box = this.dom.box; - if (this.id === undefined) { - throw "Node must have an id"; + if (orientation == 'top') { + box.style.top = this.top + 'px'; + } + else { + box.style.top = (this.parent.height - this.top - this.height) + 'px'; } + }; - // copy group properties - if (typeof this.options.group === 'number' || (typeof this.options.group === 'string' && this.options.group != '')) { - var groupObj = this.grouplist.get(this.options.group); - for (var prop in groupObj) { - if (groupObj.hasOwnProperty(prop)) { - this.options[prop] = groupObj[prop]; - } + /** + * Repaint a drag area on the left side of the range when the range is selected + * @protected + */ + ItemRange.prototype._repaintDragLeft = function () { + if (this.selected && this.options.editable.updateTime && !this.dom.dragLeft) { + // create and show drag area + var dragLeft = document.createElement('div'); + dragLeft.className = 'drag-left'; + dragLeft.dragLeftItem = this; + + // TODO: this should be redundant? + Hammer(dragLeft, { + preventDefault: true + }).on('drag', function () { + //console.log('drag left') + }); + + this.dom.box.appendChild(dragLeft); + this.dom.dragLeft = dragLeft; + } + else if (!this.selected && this.dom.dragLeft) { + // delete drag area + if (this.dom.dragLeft.parentNode) { + this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft); } + this.dom.dragLeft = null; } + }; + /** + * Repaint a drag area on the right side of the range when the range is selected + * @protected + */ + ItemRange.prototype._repaintDragRight = function () { + if (this.selected && this.options.editable.updateTime && !this.dom.dragRight) { + // create and show drag area + var dragRight = document.createElement('div'); + dragRight.className = 'drag-right'; + dragRight.dragRightItem = this; - // individual shape properties - if (properties.radius !== undefined) {this.baseRadiusValue = this.options.radius;} - if (properties.color !== undefined) {this.options.color = util.parseColor(properties.color);} + // TODO: this should be redundant? + Hammer(dragRight, { + preventDefault: true + }).on('drag', function () { + //console.log('drag right') + }); - if (this.options.image!== undefined && this.options.image!= "") { - if (this.imagelist) { - this.imageObj = this.imagelist.load(this.options.image); - } - else { - throw "No imagelist provided"; + this.dom.box.appendChild(dragRight); + this.dom.dragRight = dragRight; + } + else if (!this.selected && this.dom.dragRight) { + // delete drag area + if (this.dom.dragRight.parentNode) { + this.dom.dragRight.parentNode.removeChild(this.dom.dragRight); } + this.dom.dragRight = null; } + }; - this.xFixed = this.xFixed || (properties.x !== undefined && !properties.allowedToMoveX); - this.yFixed = this.yFixed || (properties.y !== undefined && !properties.allowedToMoveY); - this.radiusFixed = this.radiusFixed || (properties.radius !== undefined); + module.exports = ItemRange; - if (this.options.shape == 'image') { - this.options.radiusMin = constants.nodes.widthMin; - this.options.radiusMax = constants.nodes.widthMax; - } +/***/ }, +/* 33 */ +/***/ function(module, exports, __webpack_require__) { - // choose draw method depending on the shape - switch (this.options.shape) { - case 'database': this.draw = this._drawDatabase; this.resize = this._resizeDatabase; break; - case 'box': this.draw = this._drawBox; this.resize = this._resizeBox; break; - case 'circle': this.draw = this._drawCircle; this.resize = this._resizeCircle; break; - case 'ellipse': this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; - // TODO: add diamond shape - case 'image': this.draw = this._drawImage; this.resize = this._resizeImage; break; - case 'text': this.draw = this._drawText; this.resize = this._resizeText; break; - case 'dot': this.draw = this._drawDot; this.resize = this._resizeShape; break; - case 'square': this.draw = this._drawSquare; this.resize = this._resizeShape; break; - case 'triangle': this.draw = this._drawTriangle; this.resize = this._resizeShape; break; - case 'triangleDown': this.draw = this._drawTriangleDown; this.resize = this._resizeShape; break; - case 'star': this.draw = this._drawStar; this.resize = this._resizeShape; break; - default: this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; - } - // reset the size of the node, this can be changed - this._reset(); - }; + var Hammer = __webpack_require__(18); /** - * select this node + * @constructor Item + * @param {Object} data Object containing (optional) parameters type, + * start, end, content, group, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} options Configuration options + * // TODO: describe available options */ - Node.prototype.select = function() { - this.selected = true; - this._reset(); - }; + function Item (data, conversion, options) { + this.id = null; + this.parent = null; + this.data = data; + this.dom = null; + this.conversion = conversion || {}; + this.options = options || {}; - /** - * unselect this node - */ - Node.prototype.unselect = function() { this.selected = false; - this._reset(); - }; + this.displayed = false; + this.dirty = true; + this.top = null; + this.left = null; + this.width = null; + this.height = null; + } /** - * Reset the calculated size of the node, forces it to recalculate its size + * Select current item */ - Node.prototype.clearSizeCache = function() { - this._reset(); + Item.prototype.select = function() { + this.selected = true; + if (this.displayed) this.redraw(); }; /** - * Reset the calculated size of the node, forces it to recalculate its size - * @private + * Unselect current item */ - Node.prototype._reset = function() { - this.width = undefined; - this.height = undefined; + Item.prototype.unselect = function() { + this.selected = false; + if (this.displayed) this.redraw(); }; /** - * get the title of this node. - * @return {string} title The title of the node, or undefined when no title - * has been set. + * Set a parent for the item + * @param {ItemSet | Group} parent */ - Node.prototype.getTitle = function() { - return typeof this.title === "function" ? this.title() : this.title; + Item.prototype.setParent = function(parent) { + if (this.displayed) { + this.hide(); + this.parent = parent; + if (this.parent) { + this.show(); + } + } + else { + this.parent = parent; + } }; /** - * Calculate the distance to the border of the Node - * @param {CanvasRenderingContext2D} ctx - * @param {Number} angle Angle in radians - * @returns {number} distance Distance to the border in pixels + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible */ - Node.prototype.distanceToBorder = function (ctx, angle) { - var borderWidth = 1; - - if (!this.width) { - this.resize(ctx); - } - - switch (this.options.shape) { - case 'circle': - case 'dot': - return this.options.radius+ borderWidth; - - case 'ellipse': - var a = this.width / 2; - var b = this.height / 2; - var w = (Math.sin(angle) * a); - var h = (Math.cos(angle) * b); - return a * b / Math.sqrt(w * w + h * h); - - // TODO: implement distanceToBorder for database - // TODO: implement distanceToBorder for triangle - // TODO: implement distanceToBorder for triangleDown - - case 'box': - case 'image': - case 'text': - default: - if (this.width) { - return Math.min( - Math.abs(this.width / 2 / Math.cos(angle)), - Math.abs(this.height / 2 / Math.sin(angle))) + borderWidth; - // TODO: reckon with border radius too in case of box - } - else { - return 0; - } - - } - // TODO: implement calculation of distance to border for all shapes + Item.prototype.isVisible = function(range) { + // Should be implemented by Item implementations + return false; }; /** - * Set forces acting on the node - * @param {number} fx Force in horizontal direction - * @param {number} fy Force in vertical direction + * Show the Item in the DOM (when not already visible) + * @return {Boolean} changed */ - Node.prototype._setForce = function(fx, fy) { - this.fx = fx; - this.fy = fy; + Item.prototype.show = function() { + return false; }; /** - * Add forces acting on the node - * @param {number} fx Force in horizontal direction - * @param {number} fy Force in vertical direction - * @private + * Hide the Item from the DOM (when visible) + * @return {Boolean} changed */ - Node.prototype._addForce = function(fx, fy) { - this.fx += fx; - this.fy += fy; + Item.prototype.hide = function() { + return false; }; /** - * Perform one discrete step for the node - * @param {number} interval Time interval in seconds + * Repaint the item */ - Node.prototype.discreteStep = function(interval) { - if (!this.xFixed) { - var dx = this.damping * this.vx; // damping force - var ax = (this.fx - dx) / this.options.mass; // acceleration - this.vx += ax * interval; // velocity - this.x += this.vx * interval; // position - } - - if (!this.yFixed) { - var dy = this.damping * this.vy; // damping force - var ay = (this.fy - dy) / this.options.mass; // acceleration - this.vy += ay * interval; // velocity - this.y += this.vy * interval; // position - } + Item.prototype.redraw = function() { + // should be implemented by the item }; - - /** - * Perform one discrete step for the node - * @param {number} interval Time interval in seconds - * @param {number} maxVelocity The speed limit imposed on the velocity + * Reposition the Item horizontally */ - Node.prototype.discreteStepLimited = function(interval, maxVelocity) { - if (!this.xFixed) { - var dx = this.damping * this.vx; // damping force - var ax = (this.fx - dx) / this.options.mass; // acceleration - this.vx += ax * interval; // velocity - this.vx = (Math.abs(this.vx) > maxVelocity) ? ((this.vx > 0) ? maxVelocity : -maxVelocity) : this.vx; - this.x += this.vx * interval; // position - } - else { - this.fx = 0; - } - - if (!this.yFixed) { - var dy = this.damping * this.vy; // damping force - var ay = (this.fy - dy) / this.options.mass; // acceleration - this.vy += ay * interval; // velocity - this.vy = (Math.abs(this.vy) > maxVelocity) ? ((this.vy > 0) ? maxVelocity : -maxVelocity) : this.vy; - this.y += this.vy * interval; // position - } - else { - this.fy = 0; - } + Item.prototype.repositionX = function() { + // should be implemented by the item }; /** - * Check if this node has a fixed x and y position - * @return {boolean} true if fixed, false if not + * Reposition the Item vertically */ - Node.prototype.isFixed = function() { - return (this.xFixed && this.yFixed); + Item.prototype.repositionY = function() { + // should be implemented by the item }; /** - * Check if this node is moving - * @param {number} vmin the minimum velocity considered as "moving" - * @return {boolean} true if moving, false if it has no velocity + * Repaint a delete button on the top right of the item when the item is selected + * @param {HTMLElement} anchor + * @protected */ - Node.prototype.isMoving = function(vmin) { - var velocity = Math.sqrt(Math.pow(this.vx,2) + Math.pow(this.vy,2)); - // this.velocity = Math.sqrt(Math.pow(this.vx,2) + Math.pow(this.vy,2)) - return (velocity > vmin); + Item.prototype._repaintDeleteButton = function (anchor) { + if (this.selected && this.options.editable.remove && !this.dom.deleteButton) { + // create and show button + var me = this; + + var deleteButton = document.createElement('div'); + deleteButton.className = 'delete'; + deleteButton.title = 'Delete this item'; + + Hammer(deleteButton, { + preventDefault: true + }).on('tap', function (event) { + me.parent.removeFromDataSet(me); + event.stopPropagation(); + }); + + anchor.appendChild(deleteButton); + this.dom.deleteButton = deleteButton; + } + else if (!this.selected && this.dom.deleteButton) { + // remove button + if (this.dom.deleteButton.parentNode) { + this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton); + } + this.dom.deleteButton = null; + } }; - /** - * check if this node is selecte - * @return {boolean} selected True if node is selected, else false - */ - Node.prototype.isSelected = function() { - return this.selected; - }; + module.exports = Item; - /** - * Retrieve the value of the node. Can be undefined - * @return {Number} value - */ - Node.prototype.getValue = function() { - return this.value; - }; - /** - * Calculate the distance from the nodes location to the given location (x,y) - * @param {Number} x - * @param {Number} y - * @return {Number} value - */ - Node.prototype.getDistance = function(x, y) { - var dx = this.x - x, - dy = this.y - y; - return Math.sqrt(dx * dx + dy * dy); - }; +/***/ }, +/* 34 */ +/***/ function(module, exports, __webpack_require__) { + var Item = __webpack_require__(33); /** - * Adjust the value range of the node. The node will adjust it's radius - * based on its value. - * @param {Number} min - * @param {Number} max + * @constructor ItemBox + * @extends Item + * @param {Object} data Object containing parameters start + * content, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options + * // TODO: describe available options */ - Node.prototype.setValueRange = function(min, max) { - if (!this.radiusFixed && this.value !== undefined) { - if (max == min) { - this.options.radius= (this.options.radiusMin + this.options.radiusMax) / 2; + function ItemBox (data, conversion, options) { + this.props = { + dot: { + width: 0, + height: 0 + }, + line: { + width: 0, + height: 0 } - else { - var scale = (this.options.radiusMax - this.options.radiusMin) / (max - min); - this.options.radius= (this.value - min) * scale + this.options.radiusMin; + }; + + // validate data + if (data) { + if (data.start == undefined) { + throw new Error('Property "start" missing in item ' + data); } } - this.baseRadiusValue = this.options.radius; - }; - /** - * Draw this node in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx - */ - Node.prototype.draw = function(ctx) { - throw "Draw method not initialized for node"; - }; + Item.call(this, data, conversion, options); + } + + ItemBox.prototype = new Item (null, null, null); /** - * Recalculate the size of this node in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible */ - Node.prototype.resize = function(ctx) { - throw "Resize method not initialized for node"; + ItemBox.prototype.isVisible = function(range) { + // determine visibility + // TODO: account for the real width of the item. Right now we just add 1/4 to the window + var interval = (range.end - range.start) / 4; + return (this.data.start > range.start - interval) && (this.data.start < range.end + interval); }; /** - * Check if this object is overlapping with the provided object - * @param {Object} obj an object with parameters left, top, right, bottom - * @return {boolean} True if location is located on node + * Repaint the item */ - Node.prototype.isOverlappingWith = function(obj) { - return (this.left < obj.right && - this.left + this.width > obj.left && - this.top < obj.bottom && - this.top + this.height > obj.top); - }; + ItemBox.prototype.redraw = function() { + var dom = this.dom; + if (!dom) { + // create DOM + this.dom = {}; + dom = this.dom; - Node.prototype._resizeImage = function (ctx) { - // TODO: pre calculate the image size + // create main box + dom.box = document.createElement('DIV'); - if (!this.width || !this.height) { // undefined or 0 - var width, height; - if (this.value) { - this.options.radius= this.baseRadiusValue; - var scale = this.imageObj.height / this.imageObj.width; - if (scale !== undefined) { - width = this.options.radius|| this.imageObj.width; - height = this.options.radius* scale || this.imageObj.height; - } - else { - width = 0; - height = 0; - } + // contents box (inside the background box). used for making margins + dom.content = document.createElement('DIV'); + dom.content.className = 'content'; + dom.box.appendChild(dom.content); + + // line to axis + dom.line = document.createElement('DIV'); + dom.line.className = 'line'; + + // dot on axis + dom.dot = document.createElement('DIV'); + dom.dot.className = 'dot'; + + // attach this item as attribute + dom.box['timeline-item'] = this; + } + + // append DOM to parent DOM + if (!this.parent) { + throw new Error('Cannot redraw item: no parent attached'); + } + if (!dom.box.parentNode) { + var foreground = this.parent.dom.foreground; + if (!foreground) throw new Error('Cannot redraw time axis: parent has no foreground container element'); + foreground.appendChild(dom.box); + } + if (!dom.line.parentNode) { + var background = this.parent.dom.background; + if (!background) throw new Error('Cannot redraw time axis: parent has no background container element'); + background.appendChild(dom.line); + } + if (!dom.dot.parentNode) { + var axis = this.parent.dom.axis; + if (!background) throw new Error('Cannot redraw time axis: parent has no axis container element'); + axis.appendChild(dom.dot); + } + this.displayed = true; + + // update contents + if (this.data.content != this.content) { + this.content = this.data.content; + if (this.content instanceof Element) { + dom.content.innerHTML = ''; + dom.content.appendChild(this.content); + } + else if (this.data.content != undefined) { + dom.content.innerHTML = this.content; } else { - width = this.imageObj.width; - height = this.imageObj.height; + throw new Error('Property "content" missing in item ' + this.data.id); } - this.width = width; - this.height = height; - this.growthIndicator = 0; - if (this.width > 0 && this.height > 0) { - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - width; - } + this.dirty = true; } + // update title + if (this.data.title != this.title) { + dom.box.title = this.data.title; + this.title = this.data.title; + } + + // update class + var className = (this.data.className? ' ' + this.data.className : '') + + (this.selected ? ' selected' : ''); + if (this.className != className) { + this.className = className; + dom.box.className = 'item box' + className; + dom.line.className = 'item line' + className; + dom.dot.className = 'item dot' + className; + + this.dirty = true; + } + + // recalculate size + if (this.dirty) { + this.props.dot.height = dom.dot.offsetHeight; + this.props.dot.width = dom.dot.offsetWidth; + this.props.line.width = dom.line.offsetWidth; + this.width = dom.box.offsetWidth; + this.height = dom.box.offsetHeight; + + this.dirty = false; + } + + this._repaintDeleteButton(dom.box); }; - Node.prototype._drawImage = function (ctx) { - this._resizeImage(ctx); + /** + * Show the item in the DOM (when not already displayed). The items DOM will + * be created when needed. + */ + ItemBox.prototype.show = function() { + if (!this.displayed) { + this.redraw(); + } + }; - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + /** + * Hide the item from the DOM (when visible) + */ + ItemBox.prototype.hide = function() { + if (this.displayed) { + var dom = this.dom; - var yLabel; - if (this.imageObj.width != 0 ) { - // draw the shade - if (this.clusterSize > 1) { - var lineWidth = ((this.clusterSize > 1) ? 10 : 0.0); - lineWidth *= this.networkScaleInv; - lineWidth = Math.min(0.2 * this.width,lineWidth); + if (dom.box.parentNode) dom.box.parentNode.removeChild(dom.box); + if (dom.line.parentNode) dom.line.parentNode.removeChild(dom.line); + if (dom.dot.parentNode) dom.dot.parentNode.removeChild(dom.dot); + + this.top = null; + this.left = null; + + this.displayed = false; + } + }; - ctx.globalAlpha = 0.5; - ctx.drawImage(this.imageObj, this.left - lineWidth, this.top - lineWidth, this.width + 2*lineWidth, this.height + 2*lineWidth); - } + /** + * Reposition the item horizontally + * @Override + */ + ItemBox.prototype.repositionX = function() { + var start = this.conversion.toScreen(this.data.start), + align = this.options.align, + left, + box = this.dom.box, + line = this.dom.line, + dot = this.dom.dot; - // draw the image - ctx.globalAlpha = 1.0; - ctx.drawImage(this.imageObj, this.left, this.top, this.width, this.height); - yLabel = this.y + this.height / 2; + // calculate left position of the box + if (align == 'right') { + this.left = start - this.width; + } + else if (align == 'left') { + this.left = start; } else { - // image still loading... just draw the label for now - yLabel = this.y; + // default or 'center' + this.left = start - this.width / 2; } - this._label(ctx, this.label, this.x, yLabel, undefined, "top"); + // reposition box + box.style.left = this.left + 'px'; + + // reposition line + line.style.left = (start - this.props.line.width / 2) + 'px'; + + // reposition dot + dot.style.left = (start - this.props.dot.width / 2) + 'px'; }; + /** + * Reposition the item vertically + * @Override + */ + ItemBox.prototype.repositionY = function() { + var orientation = this.options.orientation, + box = this.dom.box, + line = this.dom.line, + dot = this.dom.dot; - Node.prototype._resizeBox = function (ctx) { - if (!this.width) { - var margin = 5; - var textSize = this.getTextSize(ctx); - this.width = textSize.width + 2 * margin; - this.height = textSize.height + 2 * margin; + if (orientation == 'top') { + box.style.top = (this.top || 0) + 'px'; - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; - this.growthIndicator = this.width - (textSize.width + 2 * margin); - // this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; + line.style.top = '0'; + line.style.height = (this.parent.top + this.top + 1) + 'px'; + line.style.bottom = ''; + } + else { // orientation 'bottom' + var itemSetHeight = this.parent.itemSet.props.height; // TODO: this is nasty + var lineHeight = itemSetHeight - this.parent.top - this.parent.height + this.top; + box.style.top = (this.parent.height - this.top - this.height || 0) + 'px'; + line.style.top = (itemSetHeight - lineHeight) + 'px'; + line.style.bottom = '0'; } + + dot.style.top = (-this.props.dot.height / 2) + 'px'; }; - Node.prototype._drawBox = function (ctx) { - this._resizeBox(ctx); + module.exports = ItemBox; - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; - var clusterLineWidth = 2.5; - var borderWidth = this.options.borderWidth; - var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; +/***/ }, +/* 35 */ +/***/ function(module, exports, __webpack_require__) { - ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + var Item = __webpack_require__(33); - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + /** + * @constructor ItemPoint + * @extends Item + * @param {Object} data Object containing parameters start + * content, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options + * // TODO: describe available options + */ + function ItemPoint (data, conversion, options) { + this.props = { + dot: { + top: 0, + width: 0, + height: 0 + }, + content: { + height: 0, + marginLeft: 0 + } + }; - ctx.roundRect(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth, this.options.radius); - ctx.stroke(); + // validate data + if (data) { + if (data.start == undefined) { + throw new Error('Property "start" missing in item ' + data); + } } - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.options.color.background; + Item.call(this, data, conversion, options); + } - ctx.roundRect(this.left, this.top, this.width, this.height, this.options.radius); - ctx.fill(); - ctx.stroke(); + ItemPoint.prototype = new Item (null, null, null); - this._label(ctx, this.label, this.x, this.y); + /** + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible + */ + ItemPoint.prototype.isVisible = function(range) { + // determine visibility + // TODO: account for the real width of the item. Right now we just add 1/4 to the window + var interval = (range.end - range.start) / 4; + return (this.data.start > range.start - interval) && (this.data.start < range.end + interval); }; + /** + * Repaint the item + */ + ItemPoint.prototype.redraw = function() { + var dom = this.dom; + if (!dom) { + // create DOM + this.dom = {}; + dom = this.dom; - Node.prototype._resizeDatabase = function (ctx) { - if (!this.width) { - var margin = 5; - var textSize = this.getTextSize(ctx); - var size = textSize.width + 2 * margin; - this.width = size; - this.height = size; + // background box + dom.point = document.createElement('div'); + // className is updated in redraw() - // scaling used for clustering - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - size; + // contents box, right from the dot + dom.content = document.createElement('div'); + dom.content.className = 'content'; + dom.point.appendChild(dom.content); + + // dot at start + dom.dot = document.createElement('div'); + dom.point.appendChild(dom.dot); + + // attach this item as attribute + dom.point['timeline-item'] = this; } - }; - Node.prototype._drawDatabase = function (ctx) { - this._resizeDatabase(ctx); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + // append DOM to parent DOM + if (!this.parent) { + throw new Error('Cannot redraw item: no parent attached'); + } + if (!dom.point.parentNode) { + var foreground = this.parent.dom.foreground; + if (!foreground) { + throw new Error('Cannot redraw time axis: parent has no foreground container element'); + } + foreground.appendChild(dom.point); + } + this.displayed = true; - var clusterLineWidth = 2.5; - var borderWidth = this.options.borderWidth; - var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + // update contents + if (this.data.content != this.content) { + this.content = this.data.content; + if (this.content instanceof Element) { + dom.content.innerHTML = ''; + dom.content.appendChild(this.content); + } + else if (this.data.content != undefined) { + dom.content.innerHTML = this.content; + } + else { + throw new Error('Property "content" missing in item ' + this.data.id); + } - ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + this.dirty = true; + } - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + // update title + if (this.data.title != this.title) { + dom.point.title = this.data.title; + this.title = this.data.title; + } - ctx.database(this.x - this.width/2 - 2*ctx.lineWidth, this.y - this.height*0.5 - 2*ctx.lineWidth, this.width + 4*ctx.lineWidth, this.height + 4*ctx.lineWidth); - ctx.stroke(); + // update class + var className = (this.data.className? ' ' + this.data.className : '') + + (this.selected ? ' selected' : ''); + if (this.className != className) { + this.className = className; + dom.point.className = 'item point' + className; + dom.dot.className = 'item dot' + className; + + this.dirty = true; } - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; - ctx.database(this.x - this.width/2, this.y - this.height*0.5, this.width, this.height); - ctx.fill(); - ctx.stroke(); + // recalculate size + if (this.dirty) { + this.width = dom.point.offsetWidth; + this.height = dom.point.offsetHeight; + this.props.dot.width = dom.dot.offsetWidth; + this.props.dot.height = dom.dot.offsetHeight; + this.props.content.height = dom.content.offsetHeight; - this._label(ctx, this.label, this.x, this.y); + // resize contents + dom.content.style.marginLeft = 2 * this.props.dot.width + 'px'; + //dom.content.style.marginRight = ... + 'px'; // TODO: margin right + + dom.dot.style.top = ((this.height - this.props.dot.height) / 2) + 'px'; + dom.dot.style.left = (this.props.dot.width / 2) + 'px'; + + this.dirty = false; + } + + this._repaintDeleteButton(dom.point); }; + /** + * Show the item in the DOM (when not already visible). The items DOM will + * be created when needed. + */ + ItemPoint.prototype.show = function() { + if (!this.displayed) { + this.redraw(); + } + }; - Node.prototype._resizeCircle = function (ctx) { - if (!this.width) { - var margin = 5; - var textSize = this.getTextSize(ctx); - var diameter = Math.max(textSize.width, textSize.height) + 2 * margin; - this.options.radius = diameter / 2; + /** + * Hide the item from the DOM (when visible) + */ + ItemPoint.prototype.hide = function() { + if (this.displayed) { + if (this.dom.point.parentNode) { + this.dom.point.parentNode.removeChild(this.dom.point); + } - this.width = diameter; - this.height = diameter; + this.top = null; + this.left = null; - // scaling used for clustering - // this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; - // this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; - this.options.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; - this.growthIndicator = this.options.radius- 0.5*diameter; + this.displayed = false; } }; - Node.prototype._drawCircle = function (ctx) { - this._resizeCircle(ctx); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + /** + * Reposition the item horizontally + * @Override + */ + ItemPoint.prototype.repositionX = function() { + var start = this.conversion.toScreen(this.data.start); - var clusterLineWidth = 2.5; - var borderWidth = this.options.borderWidth; - var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + this.left = start - this.props.dot.width; - ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + // reposition point + this.dom.point.style.left = this.left + 'px'; + }; - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + /** + * Reposition the item vertically + * @Override + */ + ItemPoint.prototype.repositionY = function() { + var orientation = this.options.orientation, + point = this.dom.point; - ctx.circle(this.x, this.y, this.options.radius+2*ctx.lineWidth); - ctx.stroke(); + if (orientation == 'top') { + point.style.top = this.top + 'px'; } - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + else { + point.style.top = (this.parent.height - this.top - this.height) + 'px'; + } + }; - ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; - ctx.circle(this.x, this.y, this.options.radius); - ctx.fill(); - ctx.stroke(); + module.exports = ItemPoint; - this._label(ctx, this.label, this.x, this.y); - }; - Node.prototype._resizeEllipse = function (ctx) { - if (!this.width) { - var textSize = this.getTextSize(ctx); +/***/ }, +/* 36 */ +/***/ function(module, exports, __webpack_require__) { - this.width = textSize.width * 1.5; - this.height = textSize.height * 2; - if (this.width < this.height) { - this.width = this.height; - } - var defaultSize = this.width; + var mousetrap = __webpack_require__(37); + var Emitter = __webpack_require__(10); + var Hammer = __webpack_require__(18); + var util = __webpack_require__(1); - // scaling used for clustering - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.options.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - defaultSize; - } - }; + /** + * Turn an element into an clickToUse element. + * When not active, the element has a transparent overlay. When the overlay is + * clicked, the mode is changed to active. + * When active, the element is displayed with a blue border around it, and + * the interactive contents of the element can be used. When clicked outside + * the element, the elements mode is changed to inactive. + * @param {Element} container + * @constructor + */ + function Activator(container) { + this.active = false; - Node.prototype._drawEllipse = function (ctx) { - this._resizeEllipse(ctx); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + this.dom = { + container: container + }; - var clusterLineWidth = 2.5; - var borderWidth = this.options.borderWidth; - var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + this.dom.overlay = document.createElement('div'); + this.dom.overlay.className = 'overlay'; - ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + this.dom.container.appendChild(this.dom.overlay); - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + this.hammer = Hammer(this.dom.overlay, {prevent_default: false}); + this.hammer.on('tap', this._onTapOverlay.bind(this)); - ctx.ellipse(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth); - ctx.stroke(); - } - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + // block all touch events (except tap) + var me = this; + var events = [ + 'touch', 'pinch', + 'doubletap', 'hold', + 'dragstart', 'drag', 'dragend', + 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox + ]; + events.forEach(function (event) { + me.hammer.on(event, function (event) { + event.stopPropagation(); + }); + }); - ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; + // attach a tap event to the window, in order to deactivate when clicking outside the timeline + this.windowHammer = Hammer(window, {prevent_default: false}); + this.windowHammer.on('tap', function (event) { + // deactivate when clicked outside the container + if (!_hasParent(event.target, container)) { + me.deactivate(); + } + }); - ctx.ellipse(this.left, this.top, this.width, this.height); - ctx.fill(); - ctx.stroke(); - this._label(ctx, this.label, this.x, this.y); - }; + // mousetrap listener only bounded when active) + this.escListener = this.deactivate.bind(this); + } - Node.prototype._drawDot = function (ctx) { - this._drawShape(ctx, 'circle'); - }; + // turn into an event emitter + Emitter(Activator.prototype); - Node.prototype._drawTriangle = function (ctx) { - this._drawShape(ctx, 'triangle'); - }; + // The currently active activator + Activator.current = null; - Node.prototype._drawTriangleDown = function (ctx) { - this._drawShape(ctx, 'triangleDown'); - }; + /** + * Destroy the activator. Cleans up all created DOM and event listeners + */ + Activator.prototype.destroy = function () { + this.deactivate(); - Node.prototype._drawSquare = function (ctx) { - this._drawShape(ctx, 'square'); - }; + // remove dom + this.dom.overlay.parentNode.removeChild(this.dom.overlay); - Node.prototype._drawStar = function (ctx) { - this._drawShape(ctx, 'star'); + // cleanup hammer instances + this.hammer = null; + this.windowHammer = null; + // FIXME: cleaning up hammer instances doesn't work (Timeline not removed from memory) }; - Node.prototype._resizeShape = function (ctx) { - if (!this.width) { - this.options.radius= this.baseRadiusValue; - var size = 2 * this.options.radius; - this.width = size; - this.height = size; - - // scaling used for clustering - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - size; + /** + * Activate the element + * Overlay is hidden, element is decorated with a blue shadow border + */ + Activator.prototype.activate = function () { + // we allow only one active activator at a time + if (Activator.current) { + Activator.current.deactivate(); } - }; + Activator.current = this; - Node.prototype._drawShape = function (ctx, shape) { - this._resizeShape(ctx); + this.active = true; + this.dom.overlay.style.display = 'none'; + util.addClassName(this.dom.container, 'vis-active'); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + this.emit('change'); + this.emit('activate'); - var clusterLineWidth = 2.5; - var borderWidth = this.options.borderWidth; - var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; - var radiusMultiplier = 2; + // ugly hack: bind ESC after emitting the events, as the Network rebinds all + // keyboard events on a 'change' event + mousetrap.bind('esc', this.escListener); + }; - // choose draw method depending on the shape - switch (shape) { - case 'dot': radiusMultiplier = 2; break; - case 'square': radiusMultiplier = 2; break; - case 'triangle': radiusMultiplier = 3; break; - case 'triangleDown': radiusMultiplier = 3; break; - case 'star': radiusMultiplier = 4; break; - } + /** + * Deactivate the element + * Overlay is displayed on top of the element + */ + Activator.prototype.deactivate = function () { + this.active = false; + this.dom.overlay.style.display = ''; + util.removeClassName(this.dom.container, 'vis-active'); + mousetrap.unbind('esc', this.escListener); - ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + this.emit('change'); + this.emit('deactivate'); + }; - ctx[shape](this.x, this.y, this.options.radius+ radiusMultiplier * ctx.lineWidth); - ctx.stroke(); + /** + * Handle a tap event: activate the container + * @param event + * @private + */ + Activator.prototype._onTapOverlay = function (event) { + // activate the container + this.activate(); + event.stopPropagation(); + }; + + /** + * Test whether the element has the requested parent element somewhere in + * its chain of parent nodes. + * @param {HTMLElement} element + * @param {HTMLElement} parent + * @returns {boolean} Returns true when the parent is found somewhere in the + * chain of parent nodes. + * @private + */ + function _hasParent(element, parent) { + while (element) { + if (element === parent) { + return true + } + element = element.parentNode; } - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + return false; + } - ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; - ctx[shape](this.x, this.y, this.options.radius); - ctx.fill(); - ctx.stroke(); + module.exports = Activator; - if (this.label) { - this._label(ctx, this.label, this.x, this.y + this.height / 2, undefined, 'top',true); - } - }; - Node.prototype._resizeText = function (ctx) { - if (!this.width) { - var margin = 5; - var textSize = this.getTextSize(ctx); - this.width = textSize.width + 2 * margin; - this.height = textSize.height + 2 * margin; +/***/ }, +/* 37 */ +/***/ function(module, exports, __webpack_require__) { - // scaling used for clustering - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - (textSize.width + 2 * margin); - } - }; + /** + * Copyright 2012 Craig Campbell + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Mousetrap is a simple keyboard shortcut library for Javascript with + * no external dependencies + * + * @version 1.1.2 + * @url craig.is/killing/mice + */ - Node.prototype._drawText = function (ctx) { - this._resizeText(ctx); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + /** + * mapping of special keycodes to their corresponding keys + * + * everything in this dictionary cannot use keypress events + * so it has to be here to map to the correct keycodes for + * keyup/keydown events + * + * @type {Object} + */ + var _MAP = { + 8: 'backspace', + 9: 'tab', + 13: 'enter', + 16: 'shift', + 17: 'ctrl', + 18: 'alt', + 20: 'capslock', + 27: 'esc', + 32: 'space', + 33: 'pageup', + 34: 'pagedown', + 35: 'end', + 36: 'home', + 37: 'left', + 38: 'up', + 39: 'right', + 40: 'down', + 45: 'ins', + 46: 'del', + 91: 'meta', + 93: 'meta', + 224: 'meta' + }, - this._label(ctx, this.label, this.x, this.y); - }; + /** + * mapping for special characters so they can support + * + * this dictionary is only used incase you want to bind a + * keyup or keydown event to one of these keys + * + * @type {Object} + */ + _KEYCODE_MAP = { + 106: '*', + 107: '+', + 109: '-', + 110: '.', + 111 : '/', + 186: ';', + 187: '=', + 188: ',', + 189: '-', + 190: '.', + 191: '/', + 192: '`', + 219: '[', + 220: '\\', + 221: ']', + 222: '\'' + }, + /** + * this is a mapping of keys that require shift on a US keypad + * back to the non shift equivelents + * + * this is so you can use keyup events with these keys + * + * note that this will only work reliably on US keyboards + * + * @type {Object} + */ + _SHIFT_MAP = { + '~': '`', + '!': '1', + '@': '2', + '#': '3', + '$': '4', + '%': '5', + '^': '6', + '&': '7', + '*': '8', + '(': '9', + ')': '0', + '_': '-', + '+': '=', + ':': ';', + '\"': '\'', + '<': ',', + '>': '.', + '?': '/', + '|': '\\' + }, - Node.prototype._label = function (ctx, text, x, y, align, baseline, labelUnderNode) { - if (text && Number(this.options.fontSize) * this.networkScale > this.fontDrawThreshold) { - ctx.font = (this.selected ? "bold " : "") + this.options.fontSize + "px " + this.options.fontFace; - ctx.fillStyle = this.options.fontColor || "black"; - ctx.textAlign = align || "center"; - ctx.textBaseline = baseline || "middle"; + /** + * this is a list of special strings you can use to map + * to modifier keys when you specify your keyboard shortcuts + * + * @type {Object} + */ + _SPECIAL_ALIASES = { + 'option': 'alt', + 'command': 'meta', + 'return': 'enter', + 'escape': 'esc' + }, - var lines = text.split('\n'); - var lineCount = lines.length; - var fontSize = (Number(this.options.fontSize) + 4); - var yLine = y + (1 - lineCount) / 2 * fontSize; - if (labelUnderNode == true) { - yLine = y + (1 - lineCount) / (2 * fontSize); - } + /** + * variable to store the flipped version of _MAP from above + * needed to check if we should use keypress or not when no action + * is specified + * + * @type {Object|undefined} + */ + _REVERSE_MAP, - for (var i = 0; i < lineCount; i++) { - ctx.fillText(lines[i], x, yLine); - yLine += fontSize; - } - } - }; + /** + * a list of all the callbacks setup via Mousetrap.bind() + * + * @type {Object} + */ + _callbacks = {}, + /** + * direct map of string combinations to callbacks used for trigger() + * + * @type {Object} + */ + _direct_map = {}, - Node.prototype.getTextSize = function(ctx) { - if (this.label !== undefined) { - ctx.font = (this.selected ? "bold " : "") + this.options.fontSize + "px " + this.options.fontFace; + /** + * keeps track of what level each sequence is at since multiple + * sequences can start out with the same sequence + * + * @type {Object} + */ + _sequence_levels = {}, - var lines = this.label.split('\n'), - height = (Number(this.options.fontSize) + 4) * lines.length, - width = 0; + /** + * variable to store the setTimeout call + * + * @type {null|number} + */ + _reset_timer, + + /** + * temporary state where we will ignore the next keyup + * + * @type {boolean|string} + */ + _ignore_next_keyup = false, - for (var i = 0, iMax = lines.length; i < iMax; i++) { - width = Math.max(width, ctx.measureText(lines[i]).width); - } + /** + * are we currently inside of a sequence? + * type of action ("keyup" or "keydown" or "keypress") or false + * + * @type {boolean|string} + */ + _inside_sequence = false; - return {"width": width, "height": height}; - } - else { - return {"width": 0, "height": 0}; + /** + * loop through the f keys, f1 to f19 and add them to the map + * programatically + */ + for (var i = 1; i < 20; ++i) { + _MAP[111 + i] = 'f' + i; } - }; - /** - * this is used to determine if a node is visible at all. this is used to determine when it needs to be drawn. - * there is a safety margin of 0.3 * width; - * - * @returns {boolean} - */ - Node.prototype.inArea = function() { - if (this.width !== undefined) { - return (this.x + this.width *this.networkScaleInv >= this.canvasTopLeft.x && - this.x - this.width *this.networkScaleInv < this.canvasBottomRight.x && - this.y + this.height*this.networkScaleInv >= this.canvasTopLeft.y && - this.y - this.height*this.networkScaleInv < this.canvasBottomRight.y); + /** + * loop through to map numbers on the numeric keypad + */ + for (i = 0; i <= 9; ++i) { + _MAP[i + 96] = i; } - else { - return true; + + /** + * cross browser add event method + * + * @param {Element|HTMLDocument} object + * @param {string} type + * @param {Function} callback + * @returns void + */ + function _addEvent(object, type, callback) { + if (object.addEventListener) { + return object.addEventListener(type, callback, false); + } + + object.attachEvent('on' + type, callback); } - }; - /** - * checks if the core of the node is in the display area, this is used for opening clusters around zoom - * @returns {boolean} - */ - Node.prototype.inView = function() { - return (this.x >= this.canvasTopLeft.x && - this.x < this.canvasBottomRight.x && - this.y >= this.canvasTopLeft.y && - this.y < this.canvasBottomRight.y); - }; + /** + * takes the event and returns the key character + * + * @param {Event} e + * @return {string} + */ + function _characterFromEvent(e) { - /** - * This allows the zoom level of the network to influence the rendering - * We store the inverted scale and the coordinates of the top left, and bottom right points of the canvas - * - * @param scale - * @param canvasTopLeft - * @param canvasBottomRight - */ - Node.prototype.setScaleAndPos = function(scale,canvasTopLeft,canvasBottomRight) { - this.networkScaleInv = 1.0/scale; - this.networkScale = scale; - this.canvasTopLeft = canvasTopLeft; - this.canvasBottomRight = canvasBottomRight; - }; + // for keypress events we should return the character as is + if (e.type == 'keypress') { + return String.fromCharCode(e.which); + } + // for non keypress events the special maps are needed + if (_MAP[e.which]) { + return _MAP[e.which]; + } - /** - * This allows the zoom level of the network to influence the rendering - * - * @param scale - */ - Node.prototype.setScale = function(scale) { - this.networkScaleInv = 1.0/scale; - this.networkScale = scale; - }; + if (_KEYCODE_MAP[e.which]) { + return _KEYCODE_MAP[e.which]; + } + // if it is not in the special map + return String.fromCharCode(e.which).toLowerCase(); + } + /** + * should we stop this event before firing off callbacks + * + * @param {Event} e + * @return {boolean} + */ + function _stop(e) { + var element = e.target || e.srcElement, + tag_name = element.tagName; - /** - * set the velocity at 0. Is called when this node is contained in another during clustering - */ - Node.prototype.clearVelocity = function() { - this.vx = 0; - this.vy = 0; - }; + // if the element has the class "mousetrap" then no need to stop + if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) { + return false; + } + // stop for input, select, and textarea + return tag_name == 'INPUT' || tag_name == 'SELECT' || tag_name == 'TEXTAREA' || (element.contentEditable && element.contentEditable == 'true'); + } - /** - * Basic preservation of (kinectic) energy - * - * @param massBeforeClustering - */ - Node.prototype.updateVelocity = function(massBeforeClustering) { - var energyBefore = this.vx * this.vx * massBeforeClustering; - //this.vx = (this.vx < 0) ? -Math.sqrt(energyBefore/this.options.mass) : Math.sqrt(energyBefore/this.options.mass); - this.vx = Math.sqrt(energyBefore/this.options.mass); - energyBefore = this.vy * this.vy * massBeforeClustering; - //this.vy = (this.vy < 0) ? -Math.sqrt(energyBefore/this.options.mass) : Math.sqrt(energyBefore/this.options.mass); - this.vy = Math.sqrt(energyBefore/this.options.mass); - }; + /** + * checks if two arrays are equal + * + * @param {Array} modifiers1 + * @param {Array} modifiers2 + * @returns {boolean} + */ + function _modifiersMatch(modifiers1, modifiers2) { + return modifiers1.sort().join(',') === modifiers2.sort().join(','); + } - module.exports = Node; + /** + * resets all sequence counters except for the ones passed in + * + * @param {Object} do_not_reset + * @returns void + */ + function _resetSequences(do_not_reset) { + do_not_reset = do_not_reset || {}; + var active_sequences = false, + key; -/***/ }, -/* 37 */ -/***/ function(module, exports, __webpack_require__) { + for (key in _sequence_levels) { + if (do_not_reset[key]) { + active_sequences = true; + continue; + } + _sequence_levels[key] = 0; + } - /** - * Popup is a class to create a popup window with some text - * @param {Element} container The container object. - * @param {Number} [x] - * @param {Number} [y] - * @param {String} [text] - * @param {Object} [style] An object containing borderColor, - * backgroundColor, etc. - */ - function Popup(container, x, y, text, style) { - if (container) { - this.container = container; - } - else { - this.container = document.body; + if (!active_sequences) { + _inside_sequence = false; + } } - // x, y and text are optional, see if a style object was passed in their place - if (style === undefined) { - if (typeof x === "object") { - style = x; - x = undefined; - } else if (typeof text === "object") { - style = text; - text = undefined; - } else { - // for backwards compatibility, in case clients other than Network are creating Popup directly - style = { - fontColor: 'black', - fontSize: 14, // px - fontFace: 'verdana', - color: { - border: '#666', - background: '#FFFFC6' - } + /** + * finds all callbacks that match based on the keycode, modifiers, + * and action + * + * @param {string} character + * @param {Array} modifiers + * @param {string} action + * @param {boolean=} remove - should we remove any matches + * @param {string=} combination + * @returns {Array} + */ + function _getMatches(character, modifiers, action, remove, combination) { + var i, + callback, + matches = []; + + // if there are no events related to this keycode + if (!_callbacks[character]) { + return []; } - } - } - this.x = 0; - this.y = 0; - this.padding = 5; + // if a modifier key is coming up on its own we should allow it + if (action == 'keyup' && _isModifier(character)) { + modifiers = [character]; + } + + // loop through all callbacks for the key that was pressed + // and see if any of them match + for (i = 0; i < _callbacks[character].length; ++i) { + callback = _callbacks[character][i]; + + // if this is a sequence but it is not at the right level + // then move onto the next match + if (callback.seq && _sequence_levels[callback.seq] != callback.level) { + continue; + } - if (x !== undefined && y !== undefined ) { - this.setPosition(x, y); - } - if (text !== undefined) { - this.setText(text); - } + // if the action we are looking for doesn't match the action we got + // then we should keep going + if (action != callback.action) { + continue; + } - // create the frame - this.frame = document.createElement("div"); - var styleAttr = this.frame.style; - styleAttr.position = "absolute"; - styleAttr.visibility = "hidden"; - styleAttr.border = "1px solid " + style.color.border; - styleAttr.color = style.fontColor; - styleAttr.fontSize = style.fontSize + "px"; - styleAttr.fontFamily = style.fontFace; - styleAttr.padding = this.padding + "px"; - styleAttr.backgroundColor = style.color.background; - styleAttr.borderRadius = "3px"; - styleAttr.MozBorderRadius = "3px"; - styleAttr.WebkitBorderRadius = "3px"; - styleAttr.boxShadow = "3px 3px 10px rgba(128, 128, 128, 0.5)"; - styleAttr.whiteSpace = "nowrap"; - this.container.appendChild(this.frame); - } + // if this is a keypress event that means that we need to only + // look at the character, otherwise check the modifiers as + // well + if (action == 'keypress' || _modifiersMatch(modifiers, callback.modifiers)) { - /** - * @param {number} x Horizontal position of the popup window - * @param {number} y Vertical position of the popup window - */ - Popup.prototype.setPosition = function(x, y) { - this.x = parseInt(x); - this.y = parseInt(y); - }; + // remove is used so if you change your mind and call bind a + // second time with a new function the first one is overwritten + if (remove && callback.combo == combination) { + _callbacks[character].splice(i, 1); + } - /** - * Set the text for the popup window. This can be HTML code - * @param {string} text - */ - Popup.prototype.setText = function(text) { - this.frame.innerHTML = text; - }; + matches.push(callback); + } + } - /** - * Show the popup window - * @param {boolean} show Optional. Show or hide the window - */ - Popup.prototype.show = function (show) { - if (show === undefined) { - show = true; + return matches; } - if (show) { - var height = this.frame.clientHeight; - var width = this.frame.clientWidth; - var maxHeight = this.frame.parentNode.clientHeight; - var maxWidth = this.frame.parentNode.clientWidth; + /** + * takes a key event and figures out what the modifiers are + * + * @param {Event} e + * @returns {Array} + */ + function _eventModifiers(e) { + var modifiers = []; - var top = (this.y - height); - if (top + height + this.padding > maxHeight) { - top = maxHeight - height - this.padding; - } - if (top < this.padding) { - top = this.padding; - } + if (e.shiftKey) { + modifiers.push('shift'); + } - var left = this.x; - if (left + width + this.padding > maxWidth) { - left = maxWidth - width - this.padding; - } - if (left < this.padding) { - left = this.padding; - } + if (e.altKey) { + modifiers.push('alt'); + } - this.frame.style.left = left + "px"; - this.frame.style.top = top + "px"; - this.frame.style.visibility = "visible"; - } - else { - this.hide(); + if (e.ctrlKey) { + modifiers.push('ctrl'); + } + + if (e.metaKey) { + modifiers.push('meta'); + } + + return modifiers; } - }; - /** - * Hide the popup window - */ - Popup.prototype.hide = function () { - this.frame.style.visibility = "hidden"; - }; + /** + * actually calls the callback function + * + * if your callback function returns false this will use the jquery + * convention - prevent default and stop propogation on the event + * + * @param {Function} callback + * @param {Event} e + * @returns void + */ + function _fireCallback(callback, e) { + if (callback(e) === false) { + if (e.preventDefault) { + e.preventDefault(); + } - module.exports = Popup; + if (e.stopPropagation) { + e.stopPropagation(); + } + e.returnValue = false; + e.cancelBubble = true; + } + } -/***/ }, -/* 38 */ -/***/ function(module, exports, __webpack_require__) { + /** + * handles a character key event + * + * @param {string} character + * @param {Event} e + * @returns void + */ + function _handleCharacter(character, e) { - /** - * Parse a text source containing data in DOT language into a JSON object. - * The object contains two lists: one with nodes and one with edges. - * - * DOT language reference: http://www.graphviz.org/doc/info/lang.html - * - * @param {String} data Text containing a graph in DOT-notation - * @return {Object} graph An object containing two parameters: - * {Object[]} nodes - * {Object[]} edges - */ - function parseDOT (data) { - dot = data; - return parseGraph(); - } + // if this event should not happen stop here + if (_stop(e)) { + return; + } - // token types enumeration - var TOKENTYPE = { - NULL : 0, - DELIMITER : 1, - IDENTIFIER: 2, - UNKNOWN : 3 - }; + var callbacks = _getMatches(character, _eventModifiers(e), e.type), + i, + do_not_reset = {}, + processed_sequence_callback = false; - // map with all delimiters - var DELIMITERS = { - '{': true, - '}': true, - '[': true, - ']': true, - ';': true, - '=': true, - ',': true, + // loop through matching callbacks for this key event + for (i = 0; i < callbacks.length; ++i) { - '->': true, - '--': true - }; + // fire for all sequence callbacks + // this is because if for example you have multiple sequences + // bound such as "g i" and "g t" they both need to fire the + // callback for matching g cause otherwise you can only ever + // match the first one + if (callbacks[i].seq) { + processed_sequence_callback = true; - var dot = ''; // current dot file - var index = 0; // current index in dot file - var c = ''; // current token character in expr - var token = ''; // current token - var tokenType = TOKENTYPE.NULL; // type of the token + // keep a list of which sequences were matches for later + do_not_reset[callbacks[i].seq] = 1; + _fireCallback(callbacks[i].callback, e); + continue; + } - /** - * Get the first character from the dot file. - * The character is stored into the char c. If the end of the dot file is - * reached, the function puts an empty string in c. - */ - function first() { - index = 0; - c = dot.charAt(0); - } + // if there were no sequence matches but we are still here + // that means this is a regular match so we should fire that + if (!processed_sequence_callback && !_inside_sequence) { + _fireCallback(callbacks[i].callback, e); + } + } - /** - * Get the next character from the dot file. - * The character is stored into the char c. If the end of the dot file is - * reached, the function puts an empty string in c. - */ - function next() { - index++; - c = dot.charAt(index); - } + // if you are inside of a sequence and the key you are pressing + // is not a modifier key then we should reset all sequences + // that were not matched by this key event + if (e.type == _inside_sequence && !_isModifier(character)) { + _resetSequences(do_not_reset); + } + } - /** - * Preview the next character from the dot file. - * @return {String} cNext - */ - function nextPreview() { - return dot.charAt(index + 1); - } + /** + * handles a keydown event + * + * @param {Event} e + * @returns void + */ + function _handleKey(e) { - /** - * Test whether given character is alphabetic or numeric - * @param {String} c - * @return {Boolean} isAlphaNumeric - */ - var regexAlphaNumeric = /[a-zA-Z_0-9.:#]/; - function isAlphaNumeric(c) { - return regexAlphaNumeric.test(c); - } + // normalize e.which for key events + // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion + e.which = typeof e.which == "number" ? e.which : e.keyCode; - /** - * Merge all properties of object b into object b - * @param {Object} a - * @param {Object} b - * @return {Object} a - */ - function merge (a, b) { - if (!a) { - a = {}; - } + var character = _characterFromEvent(e); - if (b) { - for (var name in b) { - if (b.hasOwnProperty(name)) { - a[name] = b[name]; + // no character found then stop + if (!character) { + return; } - } - } - return a; - } - /** - * Set a value in an object, where the provided parameter name can be a - * path with nested parameters. For example: - * - * var obj = {a: 2}; - * setValue(obj, 'b.c', 3); // obj = {a: 2, b: {c: 3}} - * - * @param {Object} obj - * @param {String} path A parameter name or dot-separated parameter path, - * like "color.highlight.border". - * @param {*} value - */ - function setValue(obj, path, value) { - var keys = path.split('.'); - var o = obj; - while (keys.length) { - var key = keys.shift(); - if (keys.length) { - // this isn't the end point - if (!o[key]) { - o[key] = {}; + if (e.type == 'keyup' && _ignore_next_keyup == character) { + _ignore_next_keyup = false; + return; } - o = o[key]; - } - else { - // this is the end point - o[key] = value; - } + + _handleCharacter(character, e); } - } - /** - * Add a node to a graph object. If there is already a node with - * the same id, their attributes will be merged. - * @param {Object} graph - * @param {Object} node - */ - function addNode(graph, node) { - var i, len; - var current = null; + /** + * determines if the keycode specified is a modifier key or not + * + * @param {string} key + * @returns {boolean} + */ + function _isModifier(key) { + return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta'; + } - // find root graph (in case of subgraph) - var graphs = [graph]; // list with all graphs from current graph to root graph - var root = graph; - while (root.parent) { - graphs.push(root.parent); - root = root.parent; + /** + * called to set a 1 second timeout on the specified sequence + * + * this is so after each key press in the sequence you have 1 second + * to press the next key before you have to start over + * + * @returns void + */ + function _resetSequenceTimer() { + clearTimeout(_reset_timer); + _reset_timer = setTimeout(_resetSequences, 1000); } - // find existing node (at root level) by its id - if (root.nodes) { - for (i = 0, len = root.nodes.length; i < len; i++) { - if (node.id === root.nodes[i].id) { - current = root.nodes[i]; - break; + /** + * reverses the map lookup so that we can look for specific keys + * to see what can and can't use keypress + * + * @return {Object} + */ + function _getReverseMap() { + if (!_REVERSE_MAP) { + _REVERSE_MAP = {}; + for (var key in _MAP) { + + // pull out the numeric keypad from here cause keypress should + // be able to detect the keys from the character + if (key > 95 && key < 112) { + continue; + } + + if (_MAP.hasOwnProperty(key)) { + _REVERSE_MAP[_MAP[key]] = key; + } + } } - } + return _REVERSE_MAP; } - if (!current) { - // this is a new node - current = { - id: node.id - }; - if (graph.node) { - // clone default attributes - current.attr = merge(current.attr, graph.node); - } - } + /** + * picks the best action based on the key combination + * + * @param {string} key - character for key + * @param {Array} modifiers + * @param {string=} action passed in + */ + function _pickBestAction(key, modifiers, action) { - // add node to this (sub)graph and all its parent graphs - for (i = graphs.length - 1; i >= 0; i--) { - var g = graphs[i]; + // if no action was picked in we should try to pick the one + // that we think would work best for this key + if (!action) { + action = _getReverseMap()[key] ? 'keydown' : 'keypress'; + } - if (!g.nodes) { - g.nodes = []; - } - if (g.nodes.indexOf(current) == -1) { - g.nodes.push(current); - } - } + // modifier keys don't work as expected with keypress, + // switch to keydown + if (action == 'keypress' && modifiers.length) { + action = 'keydown'; + } - // merge attributes - if (node.attr) { - current.attr = merge(current.attr, node.attr); + return action; } - } - /** - * Add an edge to a graph object - * @param {Object} graph - * @param {Object} edge - */ - function addEdge(graph, edge) { - if (!graph.edges) { - graph.edges = []; - } - graph.edges.push(edge); - if (graph.edge) { - var attr = merge({}, graph.edge); // clone default attributes - edge.attr = merge(attr, edge.attr); // merge attributes - } - } + /** + * binds a key sequence to an event + * + * @param {string} combo - combo specified in bind call + * @param {Array} keys + * @param {Function} callback + * @param {string=} action + * @returns void + */ + function _bindSequence(combo, keys, callback, action) { - /** - * Create an edge to a graph object - * @param {Object} graph - * @param {String | Number | Object} from - * @param {String | Number | Object} to - * @param {String} type - * @param {Object | null} attr - * @return {Object} edge - */ - function createEdge(graph, from, to, type, attr) { - var edge = { - from: from, - to: to, - type: type - }; + // start off by adding a sequence level record for this combination + // and setting the level to 0 + _sequence_levels[combo] = 0; + + // if there is no action pick the best one for the first key + // in the sequence + if (!action) { + action = _pickBestAction(keys[0], []); + } + + /** + * callback to increase the sequence level for this sequence and reset + * all other sequences that were active + * + * @param {Event} e + * @returns void + */ + var _increaseSequence = function(e) { + _inside_sequence = action; + ++_sequence_levels[combo]; + _resetSequenceTimer(); + }, + + /** + * wraps the specified callback inside of another function in order + * to reset all sequence counters as soon as this sequence is done + * + * @param {Event} e + * @returns void + */ + _callbackAndReset = function(e) { + _fireCallback(callback, e); + + // we should ignore the next key up if the action is key down + // or keypress. this is so if you finish a sequence and + // release the key the final key will not trigger a keyup + if (action !== 'keyup') { + _ignore_next_keyup = _characterFromEvent(e); + } - if (graph.edge) { - edge.attr = merge({}, graph.edge); // clone default attributes - } - edge.attr = merge(edge.attr || {}, attr); // merge attributes + // weird race condition if a sequence ends with the key + // another sequence begins with + setTimeout(_resetSequences, 10); + }, + i; - return edge; - } + // loop through keys one at a time and bind the appropriate callback + // function. for any key leading up to the final one it should + // increase the sequence. after the final, it should reset all sequences + for (i = 0; i < keys.length; ++i) { + _bindSingle(keys[i], i < keys.length - 1 ? _increaseSequence : _callbackAndReset, action, combo, i); + } + } - /** - * Get next token in the current dot file. - * The token and token type are available as token and tokenType - */ - function getToken() { - tokenType = TOKENTYPE.NULL; - token = ''; + /** + * binds a single keyboard combination + * + * @param {string} combination + * @param {Function} callback + * @param {string=} action + * @param {string=} sequence_name - name of sequence if part of sequence + * @param {number=} level - what part of the sequence the command is + * @returns void + */ + function _bindSingle(combination, callback, action, sequence_name, level) { - // skip over whitespaces - while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { // space, tab, enter - next(); - } + // make sure multiple spaces in a row become a single space + combination = combination.replace(/\s+/g, ' '); - do { - var isComment = false; + var sequence = combination.split(' '), + i, + key, + keys, + modifiers = []; - // skip comment - if (c == '#') { - // find the previous non-space character - var i = index - 1; - while (dot.charAt(i) == ' ' || dot.charAt(i) == '\t') { - i--; - } - if (dot.charAt(i) == '\n' || dot.charAt(i) == '') { - // the # is at the start of a line, this is indeed a line comment - while (c != '' && c != '\n') { - next(); - } - isComment = true; + // if this pattern is a sequence of keys then run through this method + // to reprocess each pattern one key at a time + if (sequence.length > 1) { + return _bindSequence(combination, sequence, callback, action); } - } - if (c == '/' && nextPreview() == '/') { - // skip line comment - while (c != '' && c != '\n') { - next(); + + // take the keys from this pattern and figure out what the actual + // pattern is all about + keys = combination === '+' ? ['+'] : combination.split('+'); + + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + + // normalize key names + if (_SPECIAL_ALIASES[key]) { + key = _SPECIAL_ALIASES[key]; + } + + // if this is not a keypress event then we should + // be smart about using shift keys + // this will only work for US keyboards however + if (action && action != 'keypress' && _SHIFT_MAP[key]) { + key = _SHIFT_MAP[key]; + modifiers.push('shift'); + } + + // if this key is a modifier then add it to the list of modifiers + if (_isModifier(key)) { + modifiers.push(key); + } } - isComment = true; - } - if (c == '/' && nextPreview() == '*') { - // skip block comment - while (c != '') { - if (c == '*' && nextPreview() == '/') { - // end of block comment found. skip these last two characters - next(); - next(); - break; - } - else { - next(); - } + + // depending on what the key combination is + // we will try to pick the best event for it + action = _pickBestAction(key, modifiers, action); + + // make sure to initialize array if this is the first time + // a callback is added for this key + if (!_callbacks[key]) { + _callbacks[key] = []; } - isComment = true; - } - // skip over whitespaces - while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { // space, tab, enter - next(); - } - } - while (isComment); + // remove an existing match if there is one + _getMatches(key, modifiers, action, !sequence_name, combination); - // check for end of dot file - if (c == '') { - // token is still empty - tokenType = TOKENTYPE.DELIMITER; - return; + // add this call back to the array + // if it is a sequence put it at the beginning + // if not put it at the end + // + // this is important because the way these are processed expects + // the sequence ones to come first + _callbacks[key][sequence_name ? 'unshift' : 'push']({ + callback: callback, + modifiers: modifiers, + action: action, + seq: sequence_name, + level: level, + combo: combination + }); } - // check for delimiters consisting of 2 characters - var c2 = c + nextPreview(); - if (DELIMITERS[c2]) { - tokenType = TOKENTYPE.DELIMITER; - token = c2; - next(); - next(); - return; + /** + * binds multiple combinations to the same callback + * + * @param {Array} combinations + * @param {Function} callback + * @param {string|undefined} action + * @returns void + */ + function _bindMultiple(combinations, callback, action) { + for (var i = 0; i < combinations.length; ++i) { + _bindSingle(combinations[i], callback, action); + } } - // check for delimiters consisting of 1 character - if (DELIMITERS[c]) { - tokenType = TOKENTYPE.DELIMITER; - token = c; - next(); - return; - } + // start! + _addEvent(document, 'keypress', _handleKey); + _addEvent(document, 'keydown', _handleKey); + _addEvent(document, 'keyup', _handleKey); - // check for an identifier (number or string) - // TODO: more precise parsing of numbers/strings (and the port separator ':') - if (isAlphaNumeric(c) || c == '-') { - token += c; - next(); + var mousetrap = { - while (isAlphaNumeric(c)) { - token += c; - next(); - } - if (token == 'false') { - token = false; // convert to boolean - } - else if (token == 'true') { - token = true; // convert to boolean - } - else if (!isNaN(Number(token))) { - token = Number(token); // convert to number - } - tokenType = TOKENTYPE.IDENTIFIER; - return; - } + /** + * binds an event to mousetrap + * + * can be a single key, a combination of keys separated with +, + * a comma separated list of keys, an array of keys, or + * a sequence of keys separated by spaces + * + * be sure to list the modifier keys first to make sure that the + * correct key ends up getting bound (the last key in the pattern) + * + * @param {string|Array} keys + * @param {Function} callback + * @param {string=} action - 'keypress', 'keydown', or 'keyup' + * @returns void + */ + bind: function(keys, callback, action) { + _bindMultiple(keys instanceof Array ? keys : [keys], callback, action); + _direct_map[keys + ':' + action] = callback; + return this; + }, + + /** + * unbinds an event to mousetrap + * + * the unbinding sets the callback function of the specified key combo + * to an empty function and deletes the corresponding key in the + * _direct_map dict. + * + * the keycombo+action has to be exactly the same as + * it was defined in the bind method + * + * TODO: actually remove this from the _callbacks dictionary instead + * of binding an empty function + * + * @param {string|Array} keys + * @param {string} action + * @returns void + */ + unbind: function(keys, action) { + if (_direct_map[keys + ':' + action]) { + delete _direct_map[keys + ':' + action]; + this.bind(keys, function() {}, action); + } + return this; + }, + + /** + * triggers an event that has already been bound + * + * @param {string} keys + * @param {string=} action + * @returns void + */ + trigger: function(keys, action) { + _direct_map[keys + ':' + action](); + return this; + }, - // check for a string enclosed by double quotes - if (c == '"') { - next(); - while (c != '' && (c != '"' || (c == '"' && nextPreview() == '"'))) { - token += c; - if (c == '"') { // skip the escape character - next(); + /** + * resets the library back to its initial state. this is useful + * if you want to clear out the current keyboard shortcuts and bind + * new ones - for example if you switch to another page + * + * @returns void + */ + reset: function() { + _callbacks = {}; + _direct_map = {}; + return this; } - next(); - } - if (c != '"') { - throw newSyntaxError('End of string " expected'); - } - next(); - tokenType = TOKENTYPE.IDENTIFIER; - return; - } + }; - // something unknown is found, wrong characters, a syntax error - tokenType = TOKENTYPE.UNKNOWN; - while (c != '') { - token += c; - next(); - } - throw new SyntaxError('Syntax error in part "' + chop(token, 30) + '"'); - } + module.exports = mousetrap; - /** - * Parse a graph. - * @returns {Object} graph - */ - function parseGraph() { - var graph = {}; - first(); - getToken(); - // optional strict keyword - if (token == 'strict') { - graph.strict = true; - getToken(); - } +/***/ }, +/* 38 */ +/***/ function(module, exports, __webpack_require__) { - // graph or digraph keyword - if (token == 'graph' || token == 'digraph') { - graph.type = token; - getToken(); - } + var Emitter = __webpack_require__(10); + var Hammer = __webpack_require__(18); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(7); + var DataView = __webpack_require__(8); + var Range = __webpack_require__(20); + var Core = __webpack_require__(23); + var TimeAxis = __webpack_require__(24); + var CurrentTime = __webpack_require__(26); + var CustomTime = __webpack_require__(28); + var LineGraph = __webpack_require__(39); - // optional graph id - if (tokenType == TOKENTYPE.IDENTIFIER) { - graph.id = token; - getToken(); - } + /** + * Create a timeline visualization + * @param {HTMLElement} container + * @param {vis.DataSet | Array | google.visualization.DataTable} [items] + * @param {Object} [options] See Graph2d.setOptions for the available options. + * @constructor + * @extends Core + */ + function Graph2d (container, items, options, groups) { + var me = this; + this.defaultOptions = { + start: null, + end: null, - // open angle bracket - if (token != '{') { - throw newSyntaxError('Angle bracket { expected'); - } - getToken(); + autoResize: true, - // statements - parseStatements(graph); + orientation: 'bottom', + width: null, + height: null, + maxHeight: null, + minHeight: null + }; + this.options = util.deepExtend({}, this.defaultOptions); - // close angle bracket - if (token != '}') { - throw newSyntaxError('Angle bracket } expected'); - } - getToken(); + // Create the DOM, props, and emitter + this._create(container); - // end of file - if (token !== '') { - throw newSyntaxError('End of file expected'); - } - getToken(); + // all components listed here will be repainted automatically + this.components = []; - // remove temporary default properties - delete graph.node; - delete graph.edge; - delete graph.graph; + this.body = { + dom: this.dom, + domProps: this.props, + emitter: { + on: this.on.bind(this), + off: this.off.bind(this), + emit: this.emit.bind(this) + }, + util: { + snap: null, // will be specified after TimeAxis is created + toScreen: me._toScreen.bind(me), + toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width + toTime: me._toTime.bind(me), + toGlobalTime : me._toGlobalTime.bind(me) + } + }; - return graph; - } + // range + this.range = new Range(this.body); + this.components.push(this.range); + this.body.range = this.range; - /** - * Parse a list with statements. - * @param {Object} graph - */ - function parseStatements (graph) { - while (token !== '' && token != '}') { - parseStatement(graph); - if (token == ';') { - getToken(); - } - } - } + // time axis + this.timeAxis = new TimeAxis(this.body); + this.components.push(this.timeAxis); + this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); - /** - * Parse a single statement. Can be a an attribute statement, node - * statement, a series of node statements and edge statements, or a - * parameter. - * @param {Object} graph - */ - function parseStatement(graph) { - // parse subgraph - var subgraph = parseSubgraph(graph); - if (subgraph) { - // edge statements - parseEdge(graph, subgraph); + // current time bar + this.currentTime = new CurrentTime(this.body); + this.components.push(this.currentTime); - return; - } + // custom time bar + // Note: time bar will be attached in this.setOptions when selected + this.customTime = new CustomTime(this.body); + this.components.push(this.customTime); - // parse an attribute statement - var attr = parseAttributeStatement(graph); - if (attr) { - return; + // item set + this.linegraph = new LineGraph(this.body); + this.components.push(this.linegraph); + + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet + + // apply options + if (options) { + this.setOptions(options); } - // parse node - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Identifier expected'); + // IMPORTANT: THIS HAPPENS BEFORE SET ITEMS! + if (groups) { + this.setGroups(groups); } - var id = token; // id can be a string or a number - getToken(); - if (token == '=') { - // id statement - getToken(); - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Identifier expected'); - } - graph[id] = token; - getToken(); - // TODO: implement comma separated list with "a_list: ID=ID [','] [a_list] " + // create itemset + if (items) { + this.setItems(items); } else { - parseNodeStatement(graph, id); + this.redraw(); } } + // Extend the functionality from Core + Graph2d.prototype = new Core(); + /** - * Parse a subgraph - * @param {Object} graph parent graph object - * @return {Object | null} subgraph + * Set items + * @param {vis.DataSet | Array | google.visualization.DataTable | null} items */ - function parseSubgraph (graph) { - var subgraph = null; - - // optional subgraph keyword - if (token == 'subgraph') { - subgraph = {}; - subgraph.type = 'subgraph'; - getToken(); + Graph2d.prototype.setItems = function(items) { + var initialLoad = (this.itemsData == null); - // optional graph id - if (tokenType == TOKENTYPE.IDENTIFIER) { - subgraph.id = token; - getToken(); - } + // convert to type DataSet when needed + var newDataSet; + if (!items) { + newDataSet = null; + } + else if (items instanceof DataSet || items instanceof DataView) { + newDataSet = items; + } + else { + // turn an array into a dataset + newDataSet = new DataSet(items, { + type: { + start: 'Date', + end: 'Date' + } + }); } - // open angle bracket - if (token == '{') { - getToken(); - - if (!subgraph) { - subgraph = {}; - } - subgraph.parent = graph; - subgraph.node = graph.node; - subgraph.edge = graph.edge; - subgraph.graph = graph.graph; - - // statements - parseStatements(subgraph); + // set items + this.itemsData = newDataSet; + this.linegraph && this.linegraph.setItems(newDataSet); - // close angle bracket - if (token != '}') { - throw newSyntaxError('Angle bracket } expected'); - } - getToken(); + if (initialLoad && ('start' in this.options || 'end' in this.options)) { + this.fit(); - // remove temporary default properties - delete subgraph.node; - delete subgraph.edge; - delete subgraph.graph; - delete subgraph.parent; + var start = ('start' in this.options) ? util.convert(this.options.start, 'Date') : null; + var end = ('end' in this.options) ? util.convert(this.options.end, 'Date') : null; - // register at the parent graph - if (!graph.subgraphs) { - graph.subgraphs = []; - } - graph.subgraphs.push(subgraph); + this.setWindow(start, end); } - - return subgraph; - } + }; /** - * parse an attribute statement like "node [shape=circle fontSize=16]". - * Available keywords are 'node', 'edge', 'graph'. - * The previous list with default attributes will be replaced - * @param {Object} graph - * @returns {String | null} keyword Returns the name of the parsed attribute - * (node, edge, graph), or null if nothing - * is parsed. + * Set groups + * @param {vis.DataSet | Array | google.visualization.DataTable} groups */ - function parseAttributeStatement (graph) { - // attribute statements - if (token == 'node') { - getToken(); - - // node attributes - graph.node = parseAttributeList(); - return 'node'; + Graph2d.prototype.setGroups = function(groups) { + // convert to type DataSet when needed + var newDataSet; + if (!groups) { + newDataSet = null; } - else if (token == 'edge') { - getToken(); - - // edge attributes - graph.edge = parseAttributeList(); - return 'edge'; + else if (groups instanceof DataSet || groups instanceof DataView) { + newDataSet = groups; } - else if (token == 'graph') { - getToken(); - - // graph attributes - graph.graph = parseAttributeList(); - return 'graph'; + else { + // turn an array into a dataset + newDataSet = new DataSet(groups); } - return null; - } + this.groupsData = newDataSet; + this.linegraph.setGroups(newDataSet); + }; /** - * parse a node statement - * @param {Object} graph - * @param {String | Number} id + * Returns an object containing an SVG element with the icon of the group (size determined by iconWidth and iconHeight), the label of the group (content) and the yAxisOrientation of the group (left or right). + * @param groupId + * @param width + * @param height */ - function parseNodeStatement(graph, id) { - // node statement - var node = { - id: id - }; - var attr = parseAttributeList(); - if (attr) { - node.attr = attr; + Graph2d.prototype.getLegend = function(groupId, width, height) { + if (width === undefined) {width = 15;} + if (height === undefined) {height = 15;} + if (this.linegraph.groups[groupId] !== undefined) { + return this.linegraph.groups[groupId].getLegend(width,height); } - addNode(graph, node); + else { + return "cannot find group:" + groupId; + } + } - // edge statements - parseEdge(graph, id); + /** + * This checks if the visible option of the supplied group (by ID) is true or false. + * @param groupId + * @returns {*} + */ + Graph2d.prototype.isGroupVisible = function(groupId) { + if (this.linegraph.groups[groupId] !== undefined) { + return (this.linegraph.groups[groupId].visible && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)); + } + else { + return false; + } } + /** - * Parse an edge or a series of edges - * @param {Object} graph - * @param {String | Number} from Id of the from node + * Get the data range of the item set. + * @returns {{min: Date, max: Date}} range A range with a start and end Date. + * When no minimum is found, min==null + * When no maximum is found, max==null */ - function parseEdge(graph, from) { - while (token == '->' || token == '--') { - var to; - var type = token; - getToken(); + Graph2d.prototype.getItemRange = function() { + var min = null; + var max = null; - var subgraph = parseSubgraph(graph); - if (subgraph) { - to = subgraph; - } - else { - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Identifier or subgraph expected'); + // calculate min from start filed + for (var groupId in this.linegraph.groups) { + if (this.linegraph.groups.hasOwnProperty(groupId)) { + if (this.linegraph.groups[groupId].visible == true) { + for (var i = 0; i < this.linegraph.groups[groupId].itemsData.length; i++) { + var item = this.linegraph.groups[groupId].itemsData[i]; + var value = util.convert(item.x, 'Date').valueOf(); + min = min == null ? value : min > value ? value : min; + max = max == null ? value : max < value ? value : max; + } } - to = token; - addNode(graph, { - id: to - }); - getToken(); } + } - // parse edge attributes - var attr = parseAttributeList(); + return { + min: (min != null) ? new Date(min) : null, + max: (max != null) ? new Date(max) : null + }; + }; - // create edge - var edge = createEdge(graph, from, to, type, attr); - addEdge(graph, edge); - from = to; - } - } - /** - * Parse a set with attributes, - * for example [label="1.000", shape=solid] - * @return {Object | null} attr - */ - function parseAttributeList() { - var attr = null; + module.exports = Graph2d; - while (token == '[') { - getToken(); - attr = {}; - while (token !== '' && token != ']') { - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Attribute name expected'); - } - var name = token; - getToken(); - if (token != '=') { - throw newSyntaxError('Equal sign = expected'); - } - getToken(); +/***/ }, +/* 39 */ +/***/ function(module, exports, __webpack_require__) { - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Attribute value expected'); - } - var value = token; - setValue(attr, name, value); // name can be a path + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(6); + var DataSet = __webpack_require__(7); + var DataView = __webpack_require__(8); + var Component = __webpack_require__(22); + var DataAxis = __webpack_require__(40); + var GraphGroup = __webpack_require__(42); + var Legend = __webpack_require__(43); - getToken(); - if (token ==',') { - getToken(); + var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items + + /** + * This is the constructor of the LineGraph. It requires a Timeline body and options. + * + * @param body + * @param options + * @constructor + */ + function LineGraph(body, options) { + this.id = util.randomUUID(); + this.body = body; + + this.defaultOptions = { + yAxisOrientation: 'left', + defaultGroup: 'default', + sort: true, + sampling: true, + graphHeight: '400px', + shaded: { + enabled: false, + orientation: 'bottom' // top, bottom + }, + style: 'line', // line, bar + barChart: { + width: 50, + handleOverlap: 'overlap', + align: 'center' // left, center, right + }, + catmullRom: { + enabled: true, + parametrization: 'centripetal', // uniform (alpha = 0.0), chordal (alpha = 1.0), centripetal (alpha = 0.5) + alpha: 0.5 + }, + drawPoints: { + enabled: true, + size: 6, + style: 'square' // square, circle + }, + dataAxis: { + showMinorLabels: true, + showMajorLabels: true, + icons: false, + width: '40px', + visible: true, + customRange: { + left: {min:undefined, max:undefined}, + right: {min:undefined, max:undefined} + } + }, + legend: { + enabled: false, + icons: true, + left: { + visible: true, + position: 'top-left' // top/bottom - left,right + }, + right: { + visible: true, + position: 'top-right' // top/bottom - left,right } + }, + groups: { + visibility: {} } + }; - if (token != ']') { - throw newSyntaxError('Bracket ] expected'); + // options is shared by this ItemSet and all its items + this.options = util.extend({}, this.defaultOptions); + this.dom = {}; + this.props = {}; + this.hammer = null; + this.groups = {}; + this.abortedGraphUpdate = false; + + var me = this; + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet + + // listeners for the DataSet of the items + this.itemListeners = { + 'add': function (event, params, senderId) { + me._onAdd(params.items); + }, + 'update': function (event, params, senderId) { + me._onUpdate(params.items); + }, + 'remove': function (event, params, senderId) { + me._onRemove(params.items); } - getToken(); - } + }; - return attr; - } + // listeners for the DataSet of the groups + this.groupListeners = { + 'add': function (event, params, senderId) { + me._onAddGroups(params.items); + }, + 'update': function (event, params, senderId) { + me._onUpdateGroups(params.items); + }, + 'remove': function (event, params, senderId) { + me._onRemoveGroups(params.items); + } + }; - /** - * Create a syntax error with extra information on current token and index. - * @param {String} message - * @returns {SyntaxError} err - */ - function newSyntaxError(message) { - return new SyntaxError(message + ', got "' + chop(token, 30) + '" (char ' + index + ')'); - } + this.items = {}; // object with an Item for every data item + this.selection = []; // list with the ids of all selected nodes + this.lastStart = this.body.range.start; + this.touchParams = {}; // stores properties while dragging - /** - * Chop off text after a maximum length - * @param {String} text - * @param {Number} maxLength - * @returns {String} - */ - function chop (text, maxLength) { - return (text.length <= maxLength) ? text : (text.substr(0, 27) + '...'); - } + this.svgElements = {}; + this.setOptions(options); + this.groupsUsingDefaultStyles = [0]; - /** - * Execute a function fn for each pair of elements in two arrays - * @param {Array | *} array1 - * @param {Array | *} array2 - * @param {function} fn - */ - function forEach2(array1, array2, fn) { - if (array1 instanceof Array) { - array1.forEach(function (elem1) { - if (array2 instanceof Array) { - array2.forEach(function (elem2) { - fn(elem1, elem2); - }); - } - else { - fn(elem1, array2); + this.body.emitter.on("rangechange",function() { + if (me.lastStart != 0) { + var offset = me.body.range.start - me.lastStart; + var range = me.body.range.end - me.body.range.start; + if (me.width != 0) { + var rangePerPixelInv = me.width/range; + var xOffset = offset * rangePerPixelInv; + me.svg.style.left = (-me.width - xOffset) + "px"; + } } }); - } - else { - if (array2 instanceof Array) { - array2.forEach(function (elem2) { - fn(array1, elem2); - }); - } - else { - fn(array1, array2); - } - } + this.body.emitter.on("rangechanged", function() { + me.lastStart = me.body.range.start; + me.svg.style.left = util.option.asSize(-me.width); + me._updateGraph.apply(me); + }); + + // create the HTML DOM + this._create(); + this.body.emitter.emit("change"); } + LineGraph.prototype = new Component(); + /** - * Convert a string containing a graph in DOT language into a map containing - * with nodes and edges in the format of graph. - * @param {String} data Text containing a graph in DOT-notation - * @return {Object} graphData + * Create the HTML DOM for the ItemSet */ - function DOTToGraph (data) { - // parse the DOT file - var dotData = parseDOT(data); - var graphData = { - nodes: [], - edges: [], - options: {} - }; + LineGraph.prototype._create = function(){ + var frame = document.createElement('div'); + frame.className = 'LineGraph'; + this.dom.frame = frame; - // copy the nodes - if (dotData.nodes) { - dotData.nodes.forEach(function (dotNode) { - var graphNode = { - id: dotNode.id, - label: String(dotNode.label || dotNode.id) - }; - merge(graphNode, dotNode.attr); - if (graphNode.image) { - graphNode.shape = 'image'; - } - graphData.nodes.push(graphNode); - }); - } + // create svg element for graph drawing. + this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); + this.svg.style.position = "relative"; + this.svg.style.height = ('' + this.options.graphHeight).replace("px",'') + 'px'; + this.svg.style.display = "block"; + frame.appendChild(this.svg); - // copy the edges - if (dotData.edges) { - /** - * Convert an edge in DOT format to an edge with VisGraph format - * @param {Object} dotEdge - * @returns {Object} graphEdge - */ - function convertEdge(dotEdge) { - var graphEdge = { - from: dotEdge.from, - to: dotEdge.to - }; - merge(graphEdge, dotEdge.attr); - graphEdge.style = (dotEdge.type == '->') ? 'arrow' : 'line'; - return graphEdge; - } + // data axis + this.options.dataAxis.orientation = 'left'; + this.yAxisLeft = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); - dotData.edges.forEach(function (dotEdge) { - var from, to; - if (dotEdge.from instanceof Object) { - from = dotEdge.from.nodes; - } - else { - from = { - id: dotEdge.from - } - } + this.options.dataAxis.orientation = 'right'; + this.yAxisRight = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); + delete this.options.dataAxis.orientation; - if (dotEdge.to instanceof Object) { - to = dotEdge.to.nodes; - } - else { - to = { - id: dotEdge.to - } - } + // legends + this.legendLeft = new Legend(this.body, this.options.legend, 'left', this.options.groups); + this.legendRight = new Legend(this.body, this.options.legend, 'right', this.options.groups); - if (dotEdge.from instanceof Object && dotEdge.from.edges) { - dotEdge.from.edges.forEach(function (subEdge) { - var graphEdge = convertEdge(subEdge); - graphData.edges.push(graphEdge); - }); - } + this.show(); + }; - forEach2(from, to, function (from, to) { - var subEdge = createEdge(graphData, from.id, to.id, dotEdge.type, dotEdge.attr); - var graphEdge = convertEdge(subEdge); - graphData.edges.push(graphEdge); - }); + /** + * set the options of the LineGraph. the mergeOptions is used for subObjects that have an enabled element. + * @param options + */ + LineGraph.prototype.setOptions = function(options) { + if (options) { + var fields = ['sampling','defaultGroup','graphHeight','yAxisOrientation','style','barChart','dataAxis','sort','groups']; + util.selectiveDeepExtend(fields, this.options, options); + util.mergeOptions(this.options, options,'catmullRom'); + util.mergeOptions(this.options, options,'drawPoints'); + util.mergeOptions(this.options, options,'shaded'); + util.mergeOptions(this.options, options,'legend'); - if (dotEdge.to instanceof Object && dotEdge.to.edges) { - dotEdge.to.edges.forEach(function (subEdge) { - var graphEdge = convertEdge(subEdge); - graphData.edges.push(graphEdge); - }); + if (options.catmullRom) { + if (typeof options.catmullRom == 'object') { + if (options.catmullRom.parametrization) { + if (options.catmullRom.parametrization == 'uniform') { + this.options.catmullRom.alpha = 0; + } + else if (options.catmullRom.parametrization == 'chordal') { + this.options.catmullRom.alpha = 1.0; + } + else { + this.options.catmullRom.parametrization = 'centripetal'; + this.options.catmullRom.alpha = 0.5; + } + } } - }); - } - - // copy the options - if (dotData.attr) { - graphData.options = dotData.attr; - } - - return graphData; - } - - // exports - exports.parseDOT = parseDOT; - exports.DOTToGraph = DOTToGraph; - + } -/***/ }, -/* 39 */ -/***/ function(module, exports, __webpack_require__) { + if (this.yAxisLeft) { + if (options.dataAxis !== undefined) { + this.yAxisLeft.setOptions(this.options.dataAxis); + this.yAxisRight.setOptions(this.options.dataAxis); + } + } - - function parseGephi(gephiJSON, options) { - var edges = []; - var nodes = []; - this.options = { - edges: { - inheritColor: true - }, - nodes: { - allowedToMove: false, - parseColor: false + if (this.legendLeft) { + if (options.legend !== undefined) { + this.legendLeft.setOptions(this.options.legend); + this.legendRight.setOptions(this.options.legend); + } } - }; - if (options !== undefined) { - this.options.nodes['allowedToMove'] = options.allowedToMove | false; - this.options.nodes['parseColor'] = options.parseColor | false; - this.options.edges['inheritColor'] = options.inheritColor | true; + if (this.groups.hasOwnProperty(UNGROUPED)) { + this.groups[UNGROUPED].setOptions(options); + } } - - var gEdges = gephiJSON.edges; - var gNodes = gephiJSON.nodes; - for (var i = 0; i < gEdges.length; i++) { - var edge = {}; - var gEdge = gEdges[i]; - edge['id'] = gEdge.id; - edge['from'] = gEdge.source; - edge['to'] = gEdge.target; - edge['attributes'] = gEdge.attributes; - // edge['value'] = gEdge.attributes !== undefined ? gEdge.attributes.Weight : undefined; - // edge['width'] = edge['value'] !== undefined ? undefined : edgegEdge.size; - edge['color'] = gEdge.color; - edge['inheritColor'] = edge['color'] !== undefined ? false : this.options.inheritColor; - edges.push(edge); + if (this.dom.frame) { + this._updateGraph(); } + }; - for (var i = 0; i < gNodes.length; i++) { - var node = {}; - var gNode = gNodes[i]; - node['id'] = gNode.id; - node['attributes'] = gNode.attributes; - node['x'] = gNode.x; - node['y'] = gNode.y; - node['label'] = gNode.label; - if (this.options.nodes.parseColor == true) { - node['color'] = gNode.color; - } - else { - node['color'] = gNode.color !== undefined ? {background:gNode.color, border:gNode.color} : undefined; - } - node['radius'] = gNode.size; - node['allowedToMoveX'] = this.options.nodes.allowedToMove; - node['allowedToMoveY'] = this.options.nodes.allowedToMove; - nodes.push(node); + /** + * Hide the component from the DOM + */ + LineGraph.prototype.hide = function() { + // remove the frame containing the items + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); } + }; - return {nodes:nodes, edges:edges}; - } - - exports.parseGephi = parseGephi; - -/***/ }, -/* 40 */ -/***/ function(module, exports, __webpack_require__) { - - // first check if moment.js is already loaded in the browser window, if so, - // use this instance. Else, load via commonjs. - module.exports = (typeof window !== 'undefined') && window['moment'] || __webpack_require__(51); + /** + * Show the component in the DOM (when not already visible). + * @return {Boolean} changed + */ + LineGraph.prototype.show = function() { + // show frame containing the items + if (!this.dom.frame.parentNode) { + this.body.dom.center.appendChild(this.dom.frame); + } + }; -/***/ }, -/* 41 */ -/***/ function(module, exports, __webpack_require__) { + /** + * Set items + * @param {vis.DataSet | null} items + */ + LineGraph.prototype.setItems = function(items) { + var me = this, + ids, + oldItemsData = this.itemsData; - // Only load hammer.js when in a browser environment - // (loading hammer.js in a node.js environment gives errors) - if (typeof window !== 'undefined') { - module.exports = window['Hammer'] || __webpack_require__(52); - } - else { - module.exports = function () { - throw Error('hammer.js is only available in a browser, not in node.js.'); + // replace the dataset + if (!items) { + this.itemsData = null; + } + else if (items instanceof DataSet || items instanceof DataView) { + this.itemsData = items; + } + else { + throw new TypeError('Data must be an instance of DataSet or DataView'); } - } - -/***/ }, -/* 42 */ -/***/ function(module, exports, __webpack_require__) { + if (oldItemsData) { + // unsubscribe from old dataset + util.forEach(this.itemListeners, function (callback, event) { + oldItemsData.off(event, callback); + }); - var Emitter = __webpack_require__(49); - var Hammer = __webpack_require__(41); - var util = __webpack_require__(1); - var DataSet = __webpack_require__(3); - var DataView = __webpack_require__(4); - var Range = __webpack_require__(15); - var TimeAxis = __webpack_require__(27); - var CurrentTime = __webpack_require__(19); - var CustomTime = __webpack_require__(20); - var ItemSet = __webpack_require__(24); - var Activator = __webpack_require__(48); + // remove all drawn items + ids = oldItemsData.getIds(); + this._onRemove(ids); + } - /** - * Create a timeline visualization - * @param {HTMLElement} container - * @param {vis.DataSet | Array | google.visualization.DataTable} [items] - * @param {Object} [options] See Core.setOptions for the available options. - * @constructor - */ - function Core () {} + if (this.itemsData) { + // subscribe to new dataset + var id = this.id; + util.forEach(this.itemListeners, function (callback, event) { + me.itemsData.on(event, callback, id); + }); - // turn Core into an event emitter - Emitter(Core.prototype); + // add all new items + ids = this.itemsData.getIds(); + this._onAdd(ids); + } + this._updateUngrouped(); + this._updateGraph(); + this.redraw(); + }; /** - * Create the main DOM for the Core: a root panel containing left, right, - * top, bottom, content, and background panel. - * @param {Element} container The container element where the Core will - * be attached. - * @private + * Set groups + * @param {vis.DataSet} groups */ - Core.prototype._create = function (container) { - this.dom = {}; - - this.dom.root = document.createElement('div'); - this.dom.background = document.createElement('div'); - this.dom.backgroundVertical = document.createElement('div'); - this.dom.backgroundHorizontal = document.createElement('div'); - this.dom.centerContainer = document.createElement('div'); - this.dom.leftContainer = document.createElement('div'); - this.dom.rightContainer = document.createElement('div'); - this.dom.center = document.createElement('div'); - this.dom.left = document.createElement('div'); - this.dom.right = document.createElement('div'); - this.dom.top = document.createElement('div'); - this.dom.bottom = document.createElement('div'); - this.dom.shadowTop = document.createElement('div'); - this.dom.shadowBottom = document.createElement('div'); - this.dom.shadowTopLeft = document.createElement('div'); - this.dom.shadowBottomLeft = document.createElement('div'); - this.dom.shadowTopRight = document.createElement('div'); - this.dom.shadowBottomRight = document.createElement('div'); + LineGraph.prototype.setGroups = function(groups) { + var me = this, + ids; - this.dom.root.className = 'vis timeline root'; - this.dom.background.className = 'vispanel background'; - this.dom.backgroundVertical.className = 'vispanel background vertical'; - this.dom.backgroundHorizontal.className = 'vispanel background horizontal'; - this.dom.centerContainer.className = 'vispanel center'; - this.dom.leftContainer.className = 'vispanel left'; - this.dom.rightContainer.className = 'vispanel right'; - this.dom.top.className = 'vispanel top'; - this.dom.bottom.className = 'vispanel bottom'; - this.dom.left.className = 'content'; - this.dom.center.className = 'content'; - this.dom.right.className = 'content'; - this.dom.shadowTop.className = 'shadow top'; - this.dom.shadowBottom.className = 'shadow bottom'; - this.dom.shadowTopLeft.className = 'shadow top'; - this.dom.shadowBottomLeft.className = 'shadow bottom'; - this.dom.shadowTopRight.className = 'shadow top'; - this.dom.shadowBottomRight.className = 'shadow bottom'; + // unsubscribe from current dataset + if (this.groupsData) { + util.forEach(this.groupListeners, function (callback, event) { + me.groupsData.unsubscribe(event, callback); + }); - this.dom.root.appendChild(this.dom.background); - this.dom.root.appendChild(this.dom.backgroundVertical); - this.dom.root.appendChild(this.dom.backgroundHorizontal); - this.dom.root.appendChild(this.dom.centerContainer); - this.dom.root.appendChild(this.dom.leftContainer); - this.dom.root.appendChild(this.dom.rightContainer); - this.dom.root.appendChild(this.dom.top); - this.dom.root.appendChild(this.dom.bottom); + // remove all drawn groups + ids = this.groupsData.getIds(); + this.groupsData = null; + this._onRemoveGroups(ids); // note: this will cause a redraw + } - this.dom.centerContainer.appendChild(this.dom.center); - this.dom.leftContainer.appendChild(this.dom.left); - this.dom.rightContainer.appendChild(this.dom.right); + // replace the dataset + if (!groups) { + this.groupsData = null; + } + else if (groups instanceof DataSet || groups instanceof DataView) { + this.groupsData = groups; + } + else { + throw new TypeError('Data must be an instance of DataSet or DataView'); + } - this.dom.centerContainer.appendChild(this.dom.shadowTop); - this.dom.centerContainer.appendChild(this.dom.shadowBottom); - this.dom.leftContainer.appendChild(this.dom.shadowTopLeft); - this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft); - this.dom.rightContainer.appendChild(this.dom.shadowTopRight); - this.dom.rightContainer.appendChild(this.dom.shadowBottomRight); + if (this.groupsData) { + // subscribe to new dataset + var id = this.id; + util.forEach(this.groupListeners, function (callback, event) { + me.groupsData.on(event, callback, id); + }); - this.on('rangechange', this.redraw.bind(this)); - this.on('change', this.redraw.bind(this)); - this.on('touch', this._onTouch.bind(this)); - this.on('pinch', this._onPinch.bind(this)); - this.on('dragstart', this._onDragStart.bind(this)); - this.on('drag', this._onDrag.bind(this)); + // draw all ms + ids = this.groupsData.getIds(); + this._onAddGroups(ids); + } + this._onUpdate(); + }; - // create event listeners for all interesting events, these events will be - // emitted via emitter - this.hammer = Hammer(this.dom.root, { - prevent_default: true - }); - this.listeners = {}; - var me = this; - var events = [ - 'touch', 'pinch', - 'tap', 'doubletap', 'hold', - 'dragstart', 'drag', 'dragend', - 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox - ]; - events.forEach(function (event) { - var listener = function () { - var args = [event].concat(Array.prototype.slice.call(arguments, 0)); - if (me.isActive()) { - me.emit.apply(me, args); - } - }; - me.hammer.on(event, listener); - me.listeners[event] = listener; - }); + /** + * Update the datapoints + * @param [ids] + * @private + */ + LineGraph.prototype._onUpdate = function(ids) { + this._updateUngrouped(); + this._updateAllGroupData(); + this._updateGraph(); + this.redraw(); + }; + LineGraph.prototype._onAdd = function (ids) {this._onUpdate(ids);}; + LineGraph.prototype._onRemove = function (ids) {this._onUpdate(ids);}; + LineGraph.prototype._onUpdateGroups = function (groupIds) { + for (var i = 0; i < groupIds.length; i++) { + var group = this.groupsData.get(groupIds[i]); + this._updateGroup(group, groupIds[i]); + } - // size properties of each of the panels - this.props = { - root: {}, - background: {}, - centerContainer: {}, - leftContainer: {}, - rightContainer: {}, - center: {}, - left: {}, - right: {}, - top: {}, - bottom: {}, - border: {}, - scrollTop: 0, - scrollTopMin: 0 - }; - this.touch = {}; // store state information needed for touch events + this._updateGraph(); + this.redraw(); + }; + LineGraph.prototype._onAddGroups = function (groupIds) {this._onUpdateGroups(groupIds);}; - // attach the root panel to the provided container - if (!container) throw new Error('No container provided'); - container.appendChild(this.dom.root); + LineGraph.prototype._onRemoveGroups = function (groupIds) { + for (var i = 0; i < groupIds.length; i++) { + if (!this.groups.hasOwnProperty(groupIds[i])) { + if (this.groups[groupIds[i]].options.yAxisOrientation == 'right') { + this.yAxisRight.removeGroup(groupIds[i]); + this.legendRight.removeGroup(groupIds[i]); + this.legendRight.redraw(); + } + else { + this.yAxisLeft.removeGroup(groupIds[i]); + this.legendLeft.removeGroup(groupIds[i]); + this.legendLeft.redraw(); + } + delete this.groups[groupIds[i]]; + } + } + this._updateUngrouped(); + this._updateGraph(); + this.redraw(); }; /** - * Set options. Options will be passed to all components loaded in the Timeline. - * @param {Object} [options] - * {String} orientation - * Vertical orientation for the Timeline, - * can be 'bottom' (default) or 'top'. - * {String | Number} width - * Width for the timeline, a number in pixels or - * a css string like '1000px' or '75%'. '100%' by default. - * {String | Number} height - * Fixed height for the Timeline, a number in pixels or - * a css string like '400px' or '75%'. If undefined, - * The Timeline will automatically size such that - * its contents fit. - * {String | Number} minHeight - * Minimum height for the Timeline, a number in pixels or - * a css string like '400px' or '75%'. - * {String | Number} maxHeight - * Maximum height for the Timeline, a number in pixels or - * a css string like '400px' or '75%'. - * {Number | Date | String} start - * Start date for the visible window - * {Number | Date | String} end - * End date for the visible window + * update a group object + * + * @param group + * @param groupId + * @private */ - Core.prototype.setOptions = function (options) { - if (options) { - // copy the known options - var fields = ['width', 'height', 'minHeight', 'maxHeight', 'autoResize', 'start', 'end', 'orientation', 'clickToUse']; - util.selectiveExtend(fields, this.options, options); + LineGraph.prototype._updateGroup = function (group, groupId) { + if (!this.groups.hasOwnProperty(groupId)) { + this.groups[groupId] = new GraphGroup(group, groupId, this.options, this.groupsUsingDefaultStyles); + if (this.groups[groupId].options.yAxisOrientation == 'right') { + this.yAxisRight.addGroup(groupId, this.groups[groupId]); + this.legendRight.addGroup(groupId, this.groups[groupId]); + } + else { + this.yAxisLeft.addGroup(groupId, this.groups[groupId]); + this.legendLeft.addGroup(groupId, this.groups[groupId]); + } + } + else { + this.groups[groupId].update(group); + if (this.groups[groupId].options.yAxisOrientation == 'right') { + this.yAxisRight.updateGroup(groupId, this.groups[groupId]); + this.legendRight.updateGroup(groupId, this.groups[groupId]); + } + else { + this.yAxisLeft.updateGroup(groupId, this.groups[groupId]); + this.legendLeft.updateGroup(groupId, this.groups[groupId]); + } + } + this.legendLeft.redraw(); + this.legendRight.redraw(); + }; - if ('clickToUse' in options) { - if (options.clickToUse) { - this.activator = new Activator(this.dom.root); + LineGraph.prototype._updateAllGroupData = function () { + if (this.itemsData != null) { + var groupsContent = {}; + var groupId; + for (groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + groupsContent[groupId] = []; } - else { - if (this.activator) { - this.activator.destroy(); - delete this.activator; + } + for (var itemId in this.itemsData._data) { + if (this.itemsData._data.hasOwnProperty(itemId)) { + var item = this.itemsData._data[itemId]; + item.x = util.convert(item.x,"Date"); + groupsContent[item.group].push(item); + } + } + for (groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + this.groups[groupId].setItems(groupsContent[groupId]); + } + } + } + }; + + /** + * Create or delete the group holding all ungrouped items. This group is used when + * there are no groups specified. This anonymous group is called 'graph'. + * @protected + */ + LineGraph.prototype._updateUngrouped = function() { + if (this.itemsData != null) { + // var t0 = new Date(); + var group = {id: UNGROUPED, content: this.options.defaultGroup}; + this._updateGroup(group, UNGROUPED); + var ungroupedCounter = 0; + if (this.itemsData) { + for (var itemId in this.itemsData._data) { + if (this.itemsData._data.hasOwnProperty(itemId)) { + var item = this.itemsData._data[itemId]; + if (item != undefined) { + if (item.hasOwnProperty('group')) { + if (item.group === undefined) { + item.group = UNGROUPED; + } + } + else { + item.group = UNGROUPED; + } + ungroupedCounter = item.group == UNGROUPED ? ungroupedCounter + 1 : ungroupedCounter; + } } } } - // enable/disable autoResize - this._initAutoResize(); + if (ungroupedCounter == 0) { + delete this.groups[UNGROUPED]; + this.legendLeft.removeGroup(UNGROUPED); + this.legendRight.removeGroup(UNGROUPED); + this.yAxisLeft.removeGroup(UNGROUPED); + this.yAxisRight.removeGroup(UNGROUPED); + } + } + else { + delete this.groups[UNGROUPED]; + this.legendLeft.removeGroup(UNGROUPED); + this.legendRight.removeGroup(UNGROUPED); + this.yAxisLeft.removeGroup(UNGROUPED); + this.yAxisRight.removeGroup(UNGROUPED); } - // propagate options to all components - this.components.forEach(function (component) { - component.setOptions(options); - }); + this.legendLeft.redraw(); + this.legendRight.redraw(); + }; + + + /** + * Redraw the component, mandatory function + * @return {boolean} Returns true if the component is resized + */ + LineGraph.prototype.redraw = function() { + var resized = false; + + this.svg.style.height = ('' + this.options.graphHeight).replace('px','') + 'px'; + if (this.lastWidth === undefined && this.width || this.lastWidth != this.width) { + resized = true; + } + // check if this component is resized + resized = this._isResized() || resized; + // check whether zoomed (in that case we need to re-stack everything) + var visibleInterval = this.body.range.end - this.body.range.start; + var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.width != this.lastWidth); + this.lastVisibleInterval = visibleInterval; + this.lastWidth = this.width; + + // calculate actual size and position + this.width = this.dom.frame.offsetWidth; - // TODO: remove deprecation error one day (deprecated since version 0.8.0) - if (options && options.order) { - throw new Error('Option order is deprecated. There is no replacement for this feature.'); + // the svg element is three times as big as the width, this allows for fully dragging left and right + // without reloading the graph. the controls for this are bound to events in the constructor + if (resized == true) { + this.svg.style.width = util.option.asSize(3*this.width); + this.svg.style.left = util.option.asSize(-this.width); + } + if (zoomed == true || this.abortedGraphUpdate == true) { + this._updateGraph(); } - // redraw everything - this.redraw(); - }; + this.legendLeft.redraw(); + this.legendRight.redraw(); - /** - * Returns true when the Timeline is active. - * @returns {boolean} - */ - Core.prototype.isActive = function () { - return !this.activator || this.activator.active; + return resized; }; /** - * Destroy the Core, clean up all DOM elements and event listeners. + * Update and redraw the graph. + * */ - Core.prototype.destroy = function () { - // unbind datasets - this.clear(); + LineGraph.prototype._updateGraph = function () { + // reset the svg elements + DOMutil.prepareElements(this.svgElements); + if (this.width != 0 && this.itemsData != null) { + var group, i; + var preprocessedGroupData = {}; + var processedGroupData = {}; + var groupRanges = {}; + var changeCalled = false; - // remove all event listeners - this.off(); + // getting group Ids + var groupIds = []; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + group = this.groups[groupId]; + if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) { + groupIds.push(groupId); + } + } + } + if (groupIds.length > 0) { + // this is the range of the SVG canvas + var minDate = this.body.util.toGlobalTime(- this.body.domProps.root.width); + var maxDate = this.body.util.toGlobalTime(2 * this.body.domProps.root.width); + var groupsData = {}; + // fill groups data + this._getRelevantData(groupIds, groupsData, minDate, maxDate); + // we transform the X coordinates to detect collisions + for (i = 0; i < groupIds.length; i++) { + preprocessedGroupData[groupIds[i]] = this._convertXcoordinates(groupsData[groupIds[i]]); + } + // now all needed data has been collected we start the processing. + this._getYRanges(groupIds, preprocessedGroupData, groupRanges); - // stop checking for changed size - this._stopAutoResize(); + // update the Y axis first, we use this data to draw at the correct Y points + // changeCalled is required to clean the SVG on a change emit. + changeCalled = this._updateYAxis(groupIds, groupRanges); + if (changeCalled == true) { + DOMutil.cleanupElements(this.svgElements); + this.abortedGraphUpdate = true; + this.body.emitter.emit("change"); + return; + } + this.abortedGraphUpdate = false; - // remove from DOM - if (this.dom.root.parentNode) { - this.dom.root.parentNode.removeChild(this.dom.root); - } - this.dom = null; + // With the yAxis scaled correctly, use this to get the Y values of the points. + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + processedGroupData[groupIds[i]] = this._convertYcoordinates(groupsData[groupIds[i]], group); + } - // remove Activator - if (this.activator) { - this.activator.destroy(); - delete this.activator; - } - // cleanup hammer touch events - for (var event in this.listeners) { - if (this.listeners.hasOwnProperty(event)) { - delete this.listeners[event]; + // draw the groups + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (group.options.style == 'line') { + this._drawLineGraph(processedGroupData[groupIds[i]], group); + } + } + this._drawBarGraphs(groupIds, processedGroupData); } } - this.listeners = null; - this.hammer = null; - - // give all components the opportunity to cleanup - this.components.forEach(function (component) { - component.destroy(); - }); - this.body = null; + // cleanup unused svg elements + DOMutil.cleanupElements(this.svgElements); }; - /** - * Set a custom time bar - * @param {Date} time - */ - Core.prototype.setCustomTime = function (time) { - if (!this.customTime) { - throw new Error('Cannot get custom time: Custom time bar is not enabled'); + LineGraph.prototype._getRelevantData = function (groupIds, groupsData, minDate, maxDate) { + // first select and preprocess the data from the datasets. + // the groups have their preselection of data, we now loop over this data to see + // what data we need to draw. Sorted data is much faster. + // more optimization is possible by doing the sampling before and using the binary search + // to find the end date to determine the increment. + var group, i, j, item; + if (groupIds.length > 0) { + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + groupsData[groupIds[i]] = []; + var dataContainer = groupsData[groupIds[i]]; + // optimization for sorted data + if (group.options.sort == true) { + var guess = Math.max(0, util.binarySearchGeneric(group.itemsData, minDate, 'x', 'before')); + for (j = guess; j < group.itemsData.length; j++) { + item = group.itemsData[j]; + if (item !== undefined) { + if (item.x > maxDate) { + dataContainer.push(item); + break; + } + else { + dataContainer.push(item); + } + } + } + } + else { + for (j = 0; j < group.itemsData.length; j++) { + item = group.itemsData[j]; + if (item !== undefined) { + if (item.x > minDate && item.x < maxDate) { + dataContainer.push(item); + } + } + } + } + } } - this.customTime.setCustomTime(time); + this._applySampling(groupIds, groupsData); }; - /** - * Retrieve the current custom time. - * @return {Date} customTime - */ - Core.prototype.getCustomTime = function() { - if (!this.customTime) { - throw new Error('Cannot get custom time: Custom time bar is not enabled'); - } + LineGraph.prototype._applySampling = function (groupIds, groupsData) { + var group; + if (groupIds.length > 0) { + for (var i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (group.options.sampling == true) { + var dataContainer = groupsData[groupIds[i]]; + if (dataContainer.length > 0) { + var increment = 1; + var amountOfPoints = dataContainer.length; - return this.customTime.getCustomTime(); - }; + // the global screen is used because changing the width of the yAxis may affect the increment, resulting in an endless loop + // of width changing of the yAxis. + var xDistance = this.body.util.toGlobalScreen(dataContainer[dataContainer.length - 1].x) - this.body.util.toGlobalScreen(dataContainer[0].x); + var pointsPerPixel = amountOfPoints / xDistance; + increment = Math.min(Math.ceil(0.2 * amountOfPoints), Math.max(1, Math.round(pointsPerPixel))); + var sampledData = []; + for (var j = 0; j < amountOfPoints; j += increment) { + sampledData.push(dataContainer[j]); - /** - * Get the id's of the currently visible items. - * @returns {Array} The ids of the visible items - */ - Core.prototype.getVisibleItems = function() { - return this.itemSet && this.itemSet.getVisibleItems() || []; + } + groupsData[groupIds[i]] = sampledData; + } + } + } + } }; + LineGraph.prototype._getYRanges = function (groupIds, groupsData, groupRanges) { + var groupData, group, i,j; + var barCombinedDataLeft = []; + var barCombinedDataRight = []; + var barCombinedData; + if (groupIds.length > 0) { + for (i = 0; i < groupIds.length; i++) { + groupData = groupsData[groupIds[i]]; + if (groupData.length > 0) { + group = this.groups[groupIds[i]]; + if (group.options.style == 'line' || group.options.barChart.handleOverlap != "stack") { + var yMin = groupData[0].y; + var yMax = groupData[0].y; + for (j = 0; j < groupData.length; j++) { + yMin = yMin > groupData[j].y ? groupData[j].y : yMin; + yMax = yMax < groupData[j].y ? groupData[j].y : yMax; + } + groupRanges[groupIds[i]] = {min: yMin, max: yMax, yAxisOrientation: group.options.yAxisOrientation}; + } + else if (group.options.style == 'bar') { + if (group.options.yAxisOrientation == 'left') { + barCombinedData = barCombinedDataLeft; + } + else { + barCombinedData = barCombinedDataRight; + } + groupRanges[groupIds[i]] = {min: 0, max: 0, yAxisOrientation: group.options.yAxisOrientation, ignore: true}; - /** - * Clear the Core. By Default, items, groups and options are cleared. - * Example usage: - * - * timeline.clear(); // clear items, groups, and options - * timeline.clear({options: true}); // clear options only - * - * @param {Object} [what] Optionally specify what to clear. By default: - * {items: true, groups: true, options: true} - */ - Core.prototype.clear = function(what) { - // clear items - if (!what || what.items) { - this.setItems(null); - } - - // clear groups - if (!what || what.groups) { - this.setGroups(null); - } - - // clear options of timeline and of each of the components - if (!what || what.options) { - this.components.forEach(function (component) { - component.setOptions(component.defaultOptions); - }); + // combine data + for (j = 0; j < groupData.length; j++) { + barCombinedData.push({ + x: groupData[j].x, + y: groupData[j].y, + groupId: groupIds[i] + }); + } + } + } + } - this.setOptions(this.defaultOptions); // this will also do a redraw + var intersections; + if (barCombinedDataLeft.length > 0) { + // sort by time and by group + barCombinedDataLeft.sort(function (a, b) { + if (a.x == b.x) { + return a.groupId - b.groupId; + } else { + return a.x - b.x; + } + }); + intersections = {}; + this._getDataIntersections(intersections, barCombinedDataLeft); + groupRanges["__barchartLeft"] = this._getStackedBarYRange(intersections, barCombinedDataLeft); + groupRanges["__barchartLeft"].yAxisOrientation = "left"; + groupIds.push("__barchartLeft"); + } + if (barCombinedDataRight.length > 0) { + // sort by time and by group + barCombinedDataRight.sort(function (a, b) { + if (a.x == b.x) { + return a.groupId - b.groupId; + } else { + return a.x - b.x; + } + }); + intersections = {}; + this._getDataIntersections(intersections, barCombinedDataRight); + groupRanges["__barchartRight"] = this._getStackedBarYRange(intersections, barCombinedDataRight); + groupRanges["__barchartRight"].yAxisOrientation = "right"; + groupIds.push("__barchartRight"); + } } }; - /** - * Set Core window such that it fits all items - */ - Core.prototype.fit = function() { - // apply the data range as range - var dataRange = this.getItemRange(); - - // add 5% space on both sides - var start = dataRange.min; - var end = dataRange.max; - if (start != null && end != null) { - var interval = (end.valueOf() - start.valueOf()); - if (interval <= 0) { - // prevent an empty interval - interval = 24 * 60 * 60 * 1000; // 1 day + LineGraph.prototype._getStackedBarYRange = function (intersections, combinedData) { + var key; + var yMin = combinedData[0].y; + var yMax = combinedData[0].y; + for (var i = 0; i < combinedData.length; i++) { + key = combinedData[i].x; + if (intersections[key] === undefined) { + yMin = yMin > combinedData[i].y ? combinedData[i].y : yMin; + yMax = yMax < combinedData[i].y ? combinedData[i].y : yMax; + } + else { + intersections[key].accumulated += combinedData[i].y; } - start = new Date(start.valueOf() - interval * 0.05); - end = new Date(end.valueOf() + interval * 0.05); } - - // skip range set if there is no start and end date - if (start === null && end === null) { - return; + for (var xpos in intersections) { + if (intersections.hasOwnProperty(xpos)) { + yMin = yMin > intersections[xpos].accumulated ? intersections[xpos].accumulated : yMin; + yMax = yMax < intersections[xpos].accumulated ? intersections[xpos].accumulated : yMax; + } } - this.range.setRange(start, end); + return {min: yMin, max: yMax}; }; /** - * Set the visible window. Both parameters are optional, you can change only - * start or only end. Syntax: - * - * TimeLine.setWindow(start, end) - * TimeLine.setWindow(range) - * - * Where start and end can be a Date, number, or string, and range is an - * object with properties start and end. - * - * @param {Date | Number | String | Object} [start] Start date of visible window - * @param {Date | Number | String} [end] End date of visible window + * this sets the Y ranges for the Y axis. It also determines which of the axis should be shown or hidden. + * @param {Array} groupIds + * @param {Object} groupRanges + * @private */ - Core.prototype.setWindow = function(start, end) { - if (arguments.length == 1) { - var range = arguments[0]; - this.range.setRange(range.start, range.end); - } - else { - this.range.setRange(start, end); - } - }; + LineGraph.prototype._updateYAxis = function (groupIds, groupRanges) { + var changeCalled = false; + var yAxisLeftUsed = false; + var yAxisRightUsed = false; + var minLeft = 1e9, minRight = 1e9, maxLeft = -1e9, maxRight = -1e9, minVal, maxVal; + // if groups are present + if (groupIds.length > 0) { + for (var i = 0; i < groupIds.length; i++) { + if (groupRanges.hasOwnProperty(groupIds[i])) { + if (groupRanges[groupIds[i]].ignore !== true) { + minVal = groupRanges[groupIds[i]].min; + maxVal = groupRanges[groupIds[i]].max; - /** - * Get the visible window - * @return {{start: Date, end: Date}} Visible range - */ - Core.prototype.getWindow = function() { - var range = this.range.getRange(); - return { - start: new Date(range.start), - end: new Date(range.end) - }; - }; + if (groupRanges[groupIds[i]].yAxisOrientation == 'left') { + yAxisLeftUsed = true; + minLeft = minLeft > minVal ? minVal : minLeft; + maxLeft = maxLeft < maxVal ? maxVal : maxLeft; + } + else { + yAxisRightUsed = true; + minRight = minRight > minVal ? minVal : minRight; + maxRight = maxRight < maxVal ? maxVal : maxRight; + } + } + } + } - /** - * Force a redraw of the Core. Can be useful to manually redraw when - * option autoResize=false - */ - Core.prototype.redraw = function() { - var resized = false, - options = this.options, - props = this.props, - dom = this.dom; + if (yAxisLeftUsed == true) { + this.yAxisLeft.setRange(minLeft, maxLeft); + } + if (yAxisRightUsed == true) { + this.yAxisRight.setRange(minRight, maxRight); + } + } - if (!dom) return; // when destroyed + changeCalled = this._toggleAxisVisiblity(yAxisLeftUsed , this.yAxisLeft) || changeCalled; + changeCalled = this._toggleAxisVisiblity(yAxisRightUsed, this.yAxisRight) || changeCalled; - // update class names - if (options.orientation == 'top') { - util.addClassName(dom.root, 'top'); - util.removeClassName(dom.root, 'bottom'); + if (yAxisRightUsed == true && yAxisLeftUsed == true) { + this.yAxisLeft.drawIcons = true; + this.yAxisRight.drawIcons = true; } else { - util.removeClassName(dom.root, 'top'); - util.addClassName(dom.root, 'bottom'); + this.yAxisLeft.drawIcons = false; + this.yAxisRight.drawIcons = false; } - // update root width and height options - dom.root.style.maxHeight = util.option.asSize(options.maxHeight, ''); - dom.root.style.minHeight = util.option.asSize(options.minHeight, ''); - dom.root.style.width = util.option.asSize(options.width, ''); - - // calculate border widths - props.border.left = (dom.centerContainer.offsetWidth - dom.centerContainer.clientWidth) / 2; - props.border.right = props.border.left; - props.border.top = (dom.centerContainer.offsetHeight - dom.centerContainer.clientHeight) / 2; - props.border.bottom = props.border.top; - var borderRootHeight= dom.root.offsetHeight - dom.root.clientHeight; - var borderRootWidth = dom.root.offsetWidth - dom.root.clientWidth; - - // calculate the heights. If any of the side panels is empty, we set the height to - // minus the border width, such that the border will be invisible - props.center.height = dom.center.offsetHeight; - props.left.height = dom.left.offsetHeight; - props.right.height = dom.right.offsetHeight; - props.top.height = dom.top.clientHeight || -props.border.top; - props.bottom.height = dom.bottom.clientHeight || -props.border.bottom; - - // TODO: compensate borders when any of the panels is empty. - - // apply auto height - // TODO: only calculate autoHeight when needed (else we cause an extra reflow/repaint of the DOM) - var contentHeight = Math.max(props.left.height, props.center.height, props.right.height); - var autoHeight = props.top.height + contentHeight + props.bottom.height + - borderRootHeight + props.border.top + props.border.bottom; - dom.root.style.height = util.option.asSize(options.height, autoHeight + 'px'); - - // calculate heights of the content panels - props.root.height = dom.root.offsetHeight; - props.background.height = props.root.height - borderRootHeight; - var containerHeight = props.root.height - props.top.height - props.bottom.height - - borderRootHeight; - props.centerContainer.height = containerHeight; - props.leftContainer.height = containerHeight; - props.rightContainer.height = props.leftContainer.height; - - // calculate the widths of the panels - props.root.width = dom.root.offsetWidth; - props.background.width = props.root.width - borderRootWidth; - props.left.width = dom.leftContainer.clientWidth || -props.border.left; - props.leftContainer.width = props.left.width; - props.right.width = dom.rightContainer.clientWidth || -props.border.right; - props.rightContainer.width = props.right.width; - var centerWidth = props.root.width - props.left.width - props.right.width - borderRootWidth; - props.center.width = centerWidth; - props.centerContainer.width = centerWidth; - props.top.width = centerWidth; - props.bottom.width = centerWidth; - - // resize the panels - dom.background.style.height = props.background.height + 'px'; - dom.backgroundVertical.style.height = props.background.height + 'px'; - dom.backgroundHorizontal.style.height = props.centerContainer.height + 'px'; - dom.centerContainer.style.height = props.centerContainer.height + 'px'; - dom.leftContainer.style.height = props.leftContainer.height + 'px'; - dom.rightContainer.style.height = props.rightContainer.height + 'px'; - - dom.background.style.width = props.background.width + 'px'; - dom.backgroundVertical.style.width = props.centerContainer.width + 'px'; - dom.backgroundHorizontal.style.width = props.background.width + 'px'; - dom.centerContainer.style.width = props.center.width + 'px'; - dom.top.style.width = props.top.width + 'px'; - dom.bottom.style.width = props.bottom.width + 'px'; - - // reposition the panels - dom.background.style.left = '0'; - dom.background.style.top = '0'; - dom.backgroundVertical.style.left = props.left.width + 'px'; - dom.backgroundVertical.style.top = '0'; - dom.backgroundHorizontal.style.left = '0'; - dom.backgroundHorizontal.style.top = props.top.height + 'px'; - dom.centerContainer.style.left = props.left.width + 'px'; - dom.centerContainer.style.top = props.top.height + 'px'; - dom.leftContainer.style.left = '0'; - dom.leftContainer.style.top = props.top.height + 'px'; - dom.rightContainer.style.left = (props.left.width + props.center.width) + 'px'; - dom.rightContainer.style.top = props.top.height + 'px'; - dom.top.style.left = props.left.width + 'px'; - dom.top.style.top = '0'; - dom.bottom.style.left = props.left.width + 'px'; - dom.bottom.style.top = (props.top.height + props.centerContainer.height) + 'px'; + this.yAxisRight.master = !yAxisLeftUsed; - // update the scrollTop, feasible range for the offset can be changed - // when the height of the Core or of the contents of the center changed - this._updateScrollTop(); + if (this.yAxisRight.master == false) { + if (yAxisRightUsed == true) {this.yAxisLeft.lineOffset = this.yAxisRight.width;} + else {this.yAxisLeft.lineOffset = 0;} - // reposition the scrollable contents - var offset = this.props.scrollTop; - if (options.orientation == 'bottom') { - offset += Math.max(this.props.centerContainer.height - this.props.center.height - - this.props.border.top - this.props.border.bottom, 0); + changeCalled = this.yAxisLeft.redraw() || changeCalled; + this.yAxisRight.stepPixelsForced = this.yAxisLeft.stepPixels; + changeCalled = this.yAxisRight.redraw() || changeCalled; + } + else { + changeCalled = this.yAxisRight.redraw() || changeCalled; } - dom.center.style.left = '0'; - dom.center.style.top = offset + 'px'; - dom.left.style.left = '0'; - dom.left.style.top = offset + 'px'; - dom.right.style.left = '0'; - dom.right.style.top = offset + 'px'; - - // show shadows when vertical scrolling is available - var visibilityTop = this.props.scrollTop == 0 ? 'hidden' : ''; - var visibilityBottom = this.props.scrollTop == this.props.scrollTopMin ? 'hidden' : ''; - dom.shadowTop.style.visibility = visibilityTop; - dom.shadowBottom.style.visibility = visibilityBottom; - dom.shadowTopLeft.style.visibility = visibilityTop; - dom.shadowBottomLeft.style.visibility = visibilityBottom; - dom.shadowTopRight.style.visibility = visibilityTop; - dom.shadowBottomRight.style.visibility = visibilityBottom; - // redraw all components - this.components.forEach(function (component) { - resized = component.redraw() || resized; - }); - if (resized) { - // keep repainting until all sizes are settled - this.redraw(); + // clean the accumulated lists + if (groupIds.indexOf("__barchartLeft") != -1) { + groupIds.splice(groupIds.indexOf("__barchartLeft"),1); + } + if (groupIds.indexOf("__barchartRight") != -1) { + groupIds.splice(groupIds.indexOf("__barchartRight"),1); } - }; - // TODO: deprecated since version 1.1.0, remove some day - Core.prototype.repaint = function () { - throw new Error('Function repaint is deprecated. Use redraw instead.'); + return changeCalled; }; /** - * Convert a position on screen (pixels) to a datetime - * @param {int} x Position on the screen in pixels - * @return {Date} time The datetime the corresponds with given position x + * This shows or hides the Y axis if needed. If there is a change, the changed event is emitted by the updateYAxis function + * + * @param {boolean} axisUsed + * @returns {boolean} * @private + * @param axis */ - // TODO: move this function to Range - Core.prototype._toTime = function(x) { - var conversion = this.range.conversion(this.props.center.width); - return new Date(x / conversion.scale + conversion.offset); + LineGraph.prototype._toggleAxisVisiblity = function (axisUsed, axis) { + var changed = false; + if (axisUsed == false) { + if (axis.dom.frame.parentNode) { + axis.hide(); + changed = true; + } + } + else { + if (!axis.dom.frame.parentNode) { + axis.show(); + changed = true; + } + } + return changed; }; /** - * Convert a position on the global screen (pixels) to a datetime - * @param {int} x Position on the screen in pixels - * @return {Date} time The datetime the corresponds with given position x - * @private + * draw a bar graph + * + * @param groupIds + * @param processedGroupData */ - // TODO: move this function to Range - Core.prototype._toGlobalTime = function(x) { - var conversion = this.range.conversion(this.props.root.width); - return new Date(x / conversion.scale + conversion.offset); - }; + LineGraph.prototype._drawBarGraphs = function (groupIds, processedGroupData) { + var combinedData = []; + var intersections = {}; + var coreDistance; + var key, drawData; + var group; + var i,j; + var barPoints = 0; - /** - * Convert a datetime (Date object) into a position on the screen - * @param {Date} time A date - * @return {int} x The position on the screen in pixels which corresponds - * with the given date. - * @private - */ - // TODO: move this function to Range - Core.prototype._toScreen = function(time) { - var conversion = this.range.conversion(this.props.center.width); - return (time.valueOf() - conversion.offset) * conversion.scale; - }; + // combine all barchart data + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (group.options.style == 'bar') { + if (group.visible == true && (this.options.groups.visibility[groupIds[i]] === undefined || this.options.groups.visibility[groupIds[i]] == true)) { + for (j = 0; j < processedGroupData[groupIds[i]].length; j++) { + combinedData.push({ + x: processedGroupData[groupIds[i]][j].x, + y: processedGroupData[groupIds[i]][j].y, + groupId: groupIds[i] + }); + barPoints += 1; + } + } + } + } + + if (barPoints == 0) {return;} + // sort by time and by group + combinedData.sort(function (a, b) { + if (a.x == b.x) { + return a.groupId - b.groupId; + } else { + return a.x - b.x; + } + }); - /** - * Convert a datetime (Date object) into a position on the root - * This is used to get the pixel density estimate for the screen, not the center panel - * @param {Date} time A date - * @return {int} x The position on root in pixels which corresponds - * with the given date. - * @private - */ - // TODO: move this function to Range - Core.prototype._toGlobalScreen = function(time) { - var conversion = this.range.conversion(this.props.root.width); - return (time.valueOf() - conversion.offset) * conversion.scale; - }; + // get intersections + this._getDataIntersections(intersections, combinedData); + + // plot barchart + for (i = 0; i < combinedData.length; i++) { + group = this.groups[combinedData[i].groupId]; + var minWidth = 0.1 * group.options.barChart.width; + + key = combinedData[i].x; + var heightOffset = 0; + if (intersections[key] === undefined) { + if (i+1 < combinedData.length) {coreDistance = Math.abs(combinedData[i+1].x - key);} + if (i > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[i-1].x - key));} + drawData = this._getSafeDrawData(coreDistance, group, minWidth); + } + else { + var nextKey = i + (intersections[key].amount - intersections[key].resolved); + var prevKey = i - (intersections[key].resolved + 1); + if (nextKey < combinedData.length) {coreDistance = Math.abs(combinedData[nextKey].x - key);} + if (prevKey > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[prevKey].x - key));} + drawData = this._getSafeDrawData(coreDistance, group, minWidth); + intersections[key].resolved += 1; + if (group.options.barChart.handleOverlap == 'stack') { + heightOffset = intersections[key].accumulated; + intersections[key].accumulated += group.zeroPosition - combinedData[i].y; + } + else if (group.options.barChart.handleOverlap == 'sideBySide') { + drawData.width = drawData.width / intersections[key].amount; + drawData.offset += (intersections[key].resolved) * drawData.width - (0.5*drawData.width * (intersections[key].amount+1)); + if (group.options.barChart.align == 'left') {drawData.offset -= 0.5*drawData.width;} + else if (group.options.barChart.align == 'right') {drawData.offset += 0.5*drawData.width;} + } + } + DOMutil.drawBar(combinedData[i].x + drawData.offset, combinedData[i].y - heightOffset, drawData.width, group.zeroPosition - combinedData[i].y, group.className + ' bar', this.svgElements, this.svg); + // draw points + if (group.options.drawPoints.enabled == true) { + DOMutil.drawPoint(combinedData[i].x + drawData.offset, combinedData[i].y - heightOffset, group, this.svgElements, this.svg); + } + } + }; /** - * Initialize watching when option autoResize is true + * Fill the intersections object with counters of how many datapoints share the same x coordinates + * @param intersections + * @param combinedData * @private */ - Core.prototype._initAutoResize = function () { - if (this.options.autoResize == true) { - this._startAutoResize(); - } - else { - this._stopAutoResize(); + LineGraph.prototype._getDataIntersections = function (intersections, combinedData) { + // get intersections + var coreDistance; + for (var i = 0; i < combinedData.length; i++) { + if (i + 1 < combinedData.length) { + coreDistance = Math.abs(combinedData[i + 1].x - combinedData[i].x); + } + if (i > 0) { + coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].x - combinedData[i].x)); + } + if (coreDistance == 0) { + if (intersections[combinedData[i].x] === undefined) { + intersections[combinedData[i].x] = {amount: 0, resolved: 0, accumulated: 0}; + } + intersections[combinedData[i].x].amount += 1; + } } }; /** - * Watch for changes in the size of the container. On resize, the Panel will - * automatically redraw itself. + * Get the width and offset for bargraphs based on the coredistance between datapoints + * + * @param coreDistance + * @param group + * @param minWidth + * @returns {{width: Number, offset: Number}} * @private */ - Core.prototype._startAutoResize = function () { - var me = this; - - this._stopAutoResize(); + LineGraph.prototype._getSafeDrawData = function (coreDistance, group, minWidth) { + var width, offset; + if (coreDistance < group.options.barChart.width && coreDistance > 0) { + width = coreDistance < minWidth ? minWidth : coreDistance; - this._onResize = function() { - if (me.options.autoResize != true) { - // stop watching when the option autoResize is changed to false - me._stopAutoResize(); - return; + offset = 0; // recalculate offset with the new width; + if (group.options.barChart.align == 'left') { + offset -= 0.5 * coreDistance; } - - if (me.dom.root) { - // check whether the frame is resized - if ((me.dom.root.clientWidth != me.props.lastWidth) || - (me.dom.root.clientHeight != me.props.lastHeight)) { - me.props.lastWidth = me.dom.root.clientWidth; - me.props.lastHeight = me.dom.root.clientHeight; - - me.emit('change'); - } + else if (group.options.barChart.align == 'right') { + offset += 0.5 * coreDistance; + } + } + else { + // default settings + width = group.options.barChart.width; + offset = 0; + if (group.options.barChart.align == 'left') { + offset -= 0.5 * group.options.barChart.width; } - }; - - // add event listener to window resize - util.addEventListener(window, 'resize', this._onResize); + else if (group.options.barChart.align == 'right') { + offset += 0.5 * group.options.barChart.width; + } + } - this.watchTimer = setInterval(this._onResize, 1000); + return {width: width, offset: offset}; }; + /** - * Stop watching for a resize of the frame. - * @private + * draw a line graph + * + * @param dataset + * @param group */ - Core.prototype._stopAutoResize = function () { - if (this.watchTimer) { - clearInterval(this.watchTimer); - this.watchTimer = undefined; - } + LineGraph.prototype._drawLineGraph = function (dataset, group) { + if (dataset != null) { + if (dataset.length > 0) { + var path, d; + var svgHeight = Number(this.svg.style.height.replace("px","")); + path = DOMutil.getSVGElement('path', this.svgElements, this.svg); + path.setAttributeNS(null, "class", group.className); - // remove event listener on window.resize - util.removeEventListener(window, 'resize', this._onResize); - this._onResize = null; - }; + // construct path from dataset + if (group.options.catmullRom.enabled == true) { + d = this._catmullRom(dataset, group); + } + else { + d = this._linear(dataset); + } - /** - * Start moving the timeline vertically - * @param {Event} event - * @private - */ - Core.prototype._onTouch = function (event) { - this.touch.allowDragging = true; - }; + // append with points for fill and finalize the path + if (group.options.shaded.enabled == true) { + var fillPath = DOMutil.getSVGElement('path',this.svgElements, this.svg); + var dFill; + if (group.options.shaded.orientation == 'top') { + dFill = "M" + dataset[0].x + "," + 0 + " " + d + "L" + dataset[dataset.length - 1].x + "," + 0; + } + else { + dFill = "M" + dataset[0].x + "," + svgHeight + " " + d + "L" + dataset[dataset.length - 1].x + "," + svgHeight; + } + fillPath.setAttributeNS(null, "class", group.className + " fill"); + fillPath.setAttributeNS(null, "d", dFill); + } + // copy properties to path for drawing. + path.setAttributeNS(null, "d", "M" + d); - /** - * Start moving the timeline vertically - * @param {Event} event - * @private - */ - Core.prototype._onPinch = function (event) { - this.touch.allowDragging = false; + // draw points + if (group.options.drawPoints.enabled == true) { + this._drawPoints(dataset, group, this.svgElements, this.svg); + } + } + } }; /** - * Start moving the timeline vertically - * @param {Event} event - * @private + * draw the data points + * + * @param {Array} dataset + * @param {Object} JSONcontainer + * @param {Object} svg | SVG DOM element + * @param {GraphGroup} group + * @param {Number} [offset] */ - Core.prototype._onDragStart = function (event) { - this.touch.initialScrollTop = this.props.scrollTop; + LineGraph.prototype._drawPoints = function (dataset, group, JSONcontainer, svg, offset) { + if (offset === undefined) {offset = 0;} + for (var i = 0; i < dataset.length; i++) { + DOMutil.drawPoint(dataset[i].x + offset, dataset[i].y, group, JSONcontainer, svg); + } }; + + /** - * Move the timeline vertically - * @param {Event} event + * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the + * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for + * the yAxis. + * + * @param datapoints + * @returns {Array} * @private */ - Core.prototype._onDrag = function (event) { - // refuse to drag when we where pinching to prevent the timeline make a jump - // when releasing the fingers in opposite order from the touch screen - if (!this.touch.allowDragging) return; - - var delta = event.gesture.deltaY; - - var oldScrollTop = this._getScrollTop(); - var newScrollTop = this._setScrollTop(this.touch.initialScrollTop + delta); + LineGraph.prototype._convertXcoordinates = function (datapoints) { + var extractedData = []; + var xValue, yValue; + var toScreen = this.body.util.toScreen; - if (newScrollTop != oldScrollTop) { - this.redraw(); // TODO: this causes two redraws when dragging, the other is triggered by rangechange already + for (var i = 0; i < datapoints.length; i++) { + xValue = toScreen(datapoints[i].x) + this.width - 1; + yValue = datapoints[i].y; + extractedData.push({x: xValue, y: yValue}); } - }; - /** - * Apply a scrollTop - * @param {Number} scrollTop - * @returns {Number} scrollTop Returns the applied scrollTop - * @private - */ - Core.prototype._setScrollTop = function (scrollTop) { - this.props.scrollTop = scrollTop; - this._updateScrollTop(); - return this.props.scrollTop; + return extractedData; }; + + /** - * Update the current scrollTop when the height of the containers has been changed - * @returns {Number} scrollTop Returns the applied scrollTop + * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the + * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for + * the yAxis. + * + * @param datapoints + * @returns {Array} * @private */ - Core.prototype._updateScrollTop = function () { - // recalculate the scrollTopMin - var scrollTopMin = Math.min(this.props.centerContainer.height - this.props.center.height, 0); // is negative or zero - if (scrollTopMin != this.props.scrollTopMin) { - // in case of bottom orientation, change the scrollTop such that the contents - // do not move relative to the time axis at the bottom - if (this.options.orientation == 'bottom') { - this.props.scrollTop += (scrollTopMin - this.props.scrollTopMin); - } - this.props.scrollTopMin = scrollTopMin; + LineGraph.prototype._convertYcoordinates = function (datapoints, group) { + var extractedData = []; + var xValue, yValue; + var toScreen = this.body.util.toScreen; + var axis = this.yAxisLeft; + var svgHeight = Number(this.svg.style.height.replace("px","")); + if (group.options.yAxisOrientation == 'right') { + axis = this.yAxisRight; } - // limit the scrollTop to the feasible scroll range - if (this.props.scrollTop > 0) this.props.scrollTop = 0; - if (this.props.scrollTop < scrollTopMin) this.props.scrollTop = scrollTopMin; + for (var i = 0; i < datapoints.length; i++) { + xValue = toScreen(datapoints[i].x) + this.width - 1; + yValue = Math.round(axis.convertValue(datapoints[i].y)); + extractedData.push({x: xValue, y: yValue}); + } - return this.props.scrollTop; + group.setZeroPosition(Math.min(svgHeight, axis.convertValue(0))); + + return extractedData; }; /** - * Get the current scrollTop - * @returns {number} scrollTop + * This uses an uniform parametrization of the CatmullRom algorithm: + * "On the Parameterization of Catmull-Rom Curves" by Cem Yuksel et al. + * @param data + * @returns {string} * @private */ - Core.prototype._getScrollTop = function () { - return this.props.scrollTop; - }; + LineGraph.prototype._catmullRomUniform = function(data) { + // catmull rom + var p0, p1, p2, p3, bp1, bp2; + var d = Math.round(data[0].x) + "," + Math.round(data[0].y) + " "; + var normalization = 1/6; + var length = data.length; + for (var i = 0; i < length - 1; i++) { - module.exports = Core; + p0 = (i == 0) ? data[0] : data[i-1]; + p1 = data[i]; + p2 = data[i+1]; + p3 = (i + 2 < length) ? data[i+2] : p2; -/***/ }, -/* 43 */ -/***/ function(module, exports, __webpack_require__) { + // Catmull-Rom to Cubic Bezier conversion matrix + // 0 1 0 0 + // -1/6 1 1/6 0 + // 0 1/6 1 -1/6 + // 0 0 1 0 + + // bp0 = { x: p1.x, y: p1.y }; + bp1 = { x: ((-p0.x + 6*p1.x + p2.x) *normalization), y: ((-p0.y + 6*p1.y + p2.y) *normalization)}; + bp2 = { x: (( p1.x + 6*p2.x - p3.x) *normalization), y: (( p1.y + 6*p2.y - p3.y) *normalization)}; + // bp0 = { x: p2.x, y: p2.y }; + + d += "C" + + bp1.x + "," + + bp1.y + " " + + bp2.x + "," + + bp2.y + " " + + p2.x + "," + + p2.y + " "; + } - var Hammer = __webpack_require__(41); + return d; + }; /** - * Fake a hammer.js gesture. Event can be a ScrollEvent or MouseMoveEvent - * @param {Element} element - * @param {Event} event + * This uses either the chordal or centripetal parameterization of the catmull-rom algorithm. + * By default, the centripetal parameterization is used because this gives the nicest results. + * These parameterizations are relatively heavy because the distance between 4 points have to be calculated. + * + * One optimization can be used to reuse distances since this is a sliding window approach. + * @param data + * @returns {string} + * @private */ - exports.fakeGesture = function(element, event) { - var eventType = null; - - // for hammer.js 1.0.5 - // var gesture = Hammer.event.collectEventData(this, eventType, event); + LineGraph.prototype._catmullRom = function(data, group) { + var alpha = group.options.catmullRom.alpha; + if (alpha == 0 || alpha === undefined) { + return this._catmullRomUniform(data); + } + else { + var p0, p1, p2, p3, bp1, bp2, d1,d2,d3, A, B, N, M; + var d3powA, d2powA, d3pow2A, d2pow2A, d1pow2A, d1powA; + var d = Math.round(data[0].x) + "," + Math.round(data[0].y) + " "; + var length = data.length; + for (var i = 0; i < length - 1; i++) { - // for hammer.js 1.0.6+ - var touches = Hammer.event.getTouchList(event, eventType); - var gesture = Hammer.event.collectEventData(this, eventType, touches, event); + p0 = (i == 0) ? data[0] : data[i-1]; + p1 = data[i]; + p2 = data[i+1]; + p3 = (i + 2 < length) ? data[i+2] : p2; - // on IE in standards mode, no touches are recognized by hammer.js, - // resulting in NaN values for center.pageX and center.pageY - if (isNaN(gesture.center.pageX)) { - gesture.center.pageX = event.pageX; - } - if (isNaN(gesture.center.pageY)) { - gesture.center.pageY = event.pageY; - } + d1 = Math.sqrt(Math.pow(p0.x - p1.x,2) + Math.pow(p0.y - p1.y,2)); + d2 = Math.sqrt(Math.pow(p1.x - p2.x,2) + Math.pow(p1.y - p2.y,2)); + d3 = Math.sqrt(Math.pow(p2.x - p3.x,2) + Math.pow(p2.y - p3.y,2)); - return gesture; - }; + // Catmull-Rom to Cubic Bezier conversion matrix + // + // A = 2d1^2a + 3d1^a * d2^a + d3^2a + // B = 2d3^2a + 3d3^a * d2^a + d2^2a + // + // [ 0 1 0 0 ] + // [ -d2^2a/N A/N d1^2a/N 0 ] + // [ 0 d3^2a/M B/M -d2^2a/M ] + // [ 0 0 1 0 ] + // [ 0 1 0 0 ] + // [ -d2pow2a/N A/N d1pow2a/N 0 ] + // [ 0 d3pow2a/M B/M -d2pow2a/M ] + // [ 0 0 1 0 ] -/***/ }, -/* 44 */ -/***/ function(module, exports, __webpack_require__) { + d3powA = Math.pow(d3, alpha); + d3pow2A = Math.pow(d3,2*alpha); + d2powA = Math.pow(d2, alpha); + d2pow2A = Math.pow(d2,2*alpha); + d1powA = Math.pow(d1, alpha); + d1pow2A = Math.pow(d1,2*alpha); - // English - exports['en'] = { - current: 'current', - time: 'time' - }; - exports['en_EN'] = exports['en']; - exports['en_US'] = exports['en']; + A = 2*d1pow2A + 3*d1powA * d2powA + d2pow2A; + B = 2*d3pow2A + 3*d3powA * d2powA + d2pow2A; + N = 3*d1powA * (d1powA + d2powA); + if (N > 0) {N = 1 / N;} + M = 3*d3powA * (d3powA + d2powA); + if (M > 0) {M = 1 / M;} - // Dutch - exports['nl'] = { - custom: 'aangepaste', - time: 'tijd' - }; - exports['nl_NL'] = exports['nl']; - exports['nl_BE'] = exports['nl']; + bp1 = { x: ((-d2pow2A * p0.x + A*p1.x + d1pow2A * p2.x) * N), + y: ((-d2pow2A * p0.y + A*p1.y + d1pow2A * p2.y) * N)}; + bp2 = { x: (( d3pow2A * p1.x + B*p2.x - d2pow2A * p3.x) * M), + y: (( d3pow2A * p1.y + B*p2.y - d2pow2A * p3.y) * M)}; -/***/ }, -/* 45 */ -/***/ function(module, exports, __webpack_require__) { + if (bp1.x == 0 && bp1.y == 0) {bp1 = p1;} + if (bp2.x == 0 && bp2.y == 0) {bp2 = p2;} + d += "C" + + bp1.x + "," + + bp1.y + " " + + bp2.x + "," + + bp2.y + " " + + p2.x + "," + + p2.y + " "; + } - // English - exports['en'] = { - edit: 'Edit', - del: 'Delete selected', - back: 'Back', - addNode: 'Add Node', - addEdge: 'Add Edge', - editNode: 'Edit Node', - editEdge: 'Edit Edge', - addDescription: 'Click in an empty space to place a new node.', - edgeDescription: 'Click on a node and drag the edge to another node to connect them.', - editEdgeDescription: 'Click on the control points and drag them to a node to connect to it.', - createEdgeError: 'Cannot link edges to a cluster.', - deleteClusterError: 'Clusters cannot be deleted.' + return d; + } }; - exports['en_EN'] = exports['en']; - exports['en_US'] = exports['en']; - // Dutch - exports['nl'] = { - edit: 'Wijzigen', - del: 'Selectie verwijderen', - back: 'Terug', - addNode: 'Node toevoegen', - addEdge: 'Link toevoegen', - editNode: 'Node wijzigen', - editEdge: 'Link wijzigen', - addDescription: 'Klik op een leeg gebied om een nieuwe node te maken.', - edgeDescription: 'Klik op een node en sleep de link naar een andere node om ze te verbinden.', - editEdgeDescription: 'Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.', - createEdgeError: 'Kan geen link maken naar een cluster.', - deleteClusterError: 'Clusters kunnen niet worden verwijderd.' + /** + * this generates the SVG path for a linear drawing between datapoints. + * @param data + * @returns {string} + * @private + */ + LineGraph.prototype._linear = function(data) { + // linear + var d = ""; + for (var i = 0; i < data.length; i++) { + if (i == 0) { + d += data[i].x + "," + data[i].y; + } + else { + d += " " + data[i].x + "," + data[i].y; + } + } + return d; }; - exports['nl_NL'] = exports['nl']; - exports['nl_BE'] = exports['nl']; + + module.exports = LineGraph; /***/ }, -/* 46 */ +/* 40 */ /***/ function(module, exports, __webpack_require__) { + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(6); + var Component = __webpack_require__(22); + var DataStep = __webpack_require__(41); + /** - * Canvas shapes used by Network + * A horizontal time axis + * @param {Object} [options] See DataAxis.setOptions for the available + * options. + * @constructor DataAxis + * @extends Component + * @param body */ - if (typeof CanvasRenderingContext2D !== 'undefined') { + function DataAxis (body, options, svg, linegraphOptions) { + this.id = util.randomUUID(); + this.body = body; - /** - * Draw a circle shape - */ - CanvasRenderingContext2D.prototype.circle = function(x, y, r) { - this.beginPath(); - this.arc(x, y, r, 0, 2*Math.PI, false); + this.defaultOptions = { + orientation: 'left', // supported: 'left', 'right' + showMinorLabels: true, + showMajorLabels: true, + icons: true, + majorLinesOffset: 7, + minorLinesOffset: 4, + labelOffsetX: 10, + labelOffsetY: 2, + iconWidth: 20, + width: '40px', + visible: true, + customRange: { + left: {min:undefined, max:undefined}, + right: {min:undefined, max:undefined} + } }; - /** - * Draw a square shape - * @param {Number} x horizontal center - * @param {Number} y vertical center - * @param {Number} r size, width and height of the square - */ - CanvasRenderingContext2D.prototype.square = function(x, y, r) { - this.beginPath(); - this.rect(x - r, y - r, r * 2, r * 2); + this.linegraphOptions = linegraphOptions; + this.linegraphSVG = svg; + this.props = {}; + this.DOMelements = { // dynamic elements + lines: {}, + labels: {} }; - /** - * Draw a triangle shape - * @param {Number} x horizontal center - * @param {Number} y vertical center - * @param {Number} r radius, half the length of the sides of the triangle - */ - CanvasRenderingContext2D.prototype.triangle = function(x, y, r) { - // http://en.wikipedia.org/wiki/Equilateral_triangle - this.beginPath(); + this.dom = {}; - var s = r * 2; - var s2 = s / 2; - var ir = Math.sqrt(3) / 6 * s; // radius of inner circle - var h = Math.sqrt(s * s - s2 * s2); // height + this.range = {start:0, end:0}; - this.moveTo(x, y - (h - ir)); - this.lineTo(x + s2, y + ir); - this.lineTo(x - s2, y + ir); - this.lineTo(x, y - (h - ir)); - this.closePath(); - }; + this.options = util.extend({}, this.defaultOptions); + this.conversionFactor = 1; - /** - * Draw a triangle shape in downward orientation - * @param {Number} x horizontal center - * @param {Number} y vertical center - * @param {Number} r radius - */ - CanvasRenderingContext2D.prototype.triangleDown = function(x, y, r) { - // http://en.wikipedia.org/wiki/Equilateral_triangle - this.beginPath(); + this.setOptions(options); + this.width = Number(('' + this.options.width).replace("px","")); + this.minWidth = this.width; + this.height = this.linegraphSVG.offsetHeight; - var s = r * 2; - var s2 = s / 2; - var ir = Math.sqrt(3) / 6 * s; // radius of inner circle - var h = Math.sqrt(s * s - s2 * s2); // height + this.stepPixels = 25; + this.stepPixelsForced = 25; + this.lineOffset = 0; + this.master = true; + this.svgElements = {}; - this.moveTo(x, y + (h - ir)); - this.lineTo(x + s2, y - ir); - this.lineTo(x - s2, y - ir); - this.lineTo(x, y + (h - ir)); - this.closePath(); - }; - /** - * Draw a star shape, a star with 5 points - * @param {Number} x horizontal center - * @param {Number} y vertical center - * @param {Number} r radius, half the length of the sides of the triangle - */ - CanvasRenderingContext2D.prototype.star = function(x, y, r) { - // http://www.html5canvastutorials.com/labs/html5-canvas-star-spinner/ - this.beginPath(); + this.groups = {}; + this.amountOfGroups = 0; - for (var n = 0; n < 10; n++) { - var radius = (n % 2 === 0) ? r * 1.3 : r * 0.5; - this.lineTo( - x + radius * Math.sin(n * 2 * Math.PI / 10), - y - radius * Math.cos(n * 2 * Math.PI / 10) - ); - } + // create the HTML DOM + this._create(); + } + + DataAxis.prototype = new Component(); + + + + DataAxis.prototype.addGroup = function(label, graphOptions) { + if (!this.groups.hasOwnProperty(label)) { + this.groups[label] = graphOptions; + } + this.amountOfGroups += 1; + }; - this.closePath(); - }; + DataAxis.prototype.updateGroup = function(label, graphOptions) { + this.groups[label] = graphOptions; + }; - /** - * http://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-on-html-canvas - */ - CanvasRenderingContext2D.prototype.roundRect = function(x, y, w, h, r) { - var r2d = Math.PI/180; - if( w - ( 2 * r ) < 0 ) { r = ( w / 2 ); } //ensure that the radius isn't too large for x - if( h - ( 2 * r ) < 0 ) { r = ( h / 2 ); } //ensure that the radius isn't too large for y - this.beginPath(); - this.moveTo(x+r,y); - this.lineTo(x+w-r,y); - this.arc(x+w-r,y+r,r,r2d*270,r2d*360,false); - this.lineTo(x+w,y+h-r); - this.arc(x+w-r,y+h-r,r,0,r2d*90,false); - this.lineTo(x+r,y+h); - this.arc(x+r,y+h-r,r,r2d*90,r2d*180,false); - this.lineTo(x,y+r); - this.arc(x+r,y+r,r,r2d*180,r2d*270,false); - }; + DataAxis.prototype.removeGroup = function(label) { + if (this.groups.hasOwnProperty(label)) { + delete this.groups[label]; + this.amountOfGroups -= 1; + } + }; - /** - * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas - */ - CanvasRenderingContext2D.prototype.ellipse = function(x, y, w, h) { - var kappa = .5522848, - ox = (w / 2) * kappa, // control point offset horizontal - oy = (h / 2) * kappa, // control point offset vertical - xe = x + w, // x-end - ye = y + h, // y-end - xm = x + w / 2, // x-middle - ym = y + h / 2; // y-middle - this.beginPath(); - this.moveTo(x, ym); - this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); - this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); - this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); - this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); - }; + DataAxis.prototype.setOptions = function (options) { + if (options) { + var redraw = false; + if (this.options.orientation != options.orientation && options.orientation !== undefined) { + redraw = true; + } + var fields = [ + 'orientation', + 'showMinorLabels', + 'showMajorLabels', + 'icons', + 'majorLinesOffset', + 'minorLinesOffset', + 'labelOffsetX', + 'labelOffsetY', + 'iconWidth', + 'width', + 'visible', + 'customRange' + ]; + util.selectiveExtend(fields, this.options, options); + this.minWidth = Number(('' + this.options.width).replace("px","")); + if (redraw == true && this.dom.frame) { + this.hide(); + this.show(); + } + } + }; - /** - * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas - */ - CanvasRenderingContext2D.prototype.database = function(x, y, w, h) { - var f = 1/3; - var wEllipse = w; - var hEllipse = h * f; - var kappa = .5522848, - ox = (wEllipse / 2) * kappa, // control point offset horizontal - oy = (hEllipse / 2) * kappa, // control point offset vertical - xe = x + wEllipse, // x-end - ye = y + hEllipse, // y-end - xm = x + wEllipse / 2, // x-middle - ym = y + hEllipse / 2, // y-middle - ymb = y + (h - hEllipse/2), // y-midlle, bottom ellipse - yeb = y + h; // y-end, bottom ellipse + /** + * Create the HTML DOM for the DataAxis + */ + DataAxis.prototype._create = function() { + this.dom.frame = document.createElement('div'); + this.dom.frame.style.width = this.options.width; + this.dom.frame.style.height = this.height; - this.beginPath(); - this.moveTo(xe, ym); + this.dom.lineContainer = document.createElement('div'); + this.dom.lineContainer.style.width = '100%'; + this.dom.lineContainer.style.height = this.height; - this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); - this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + // create svg element for graph drawing. + this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); + this.svg.style.position = "absolute"; + this.svg.style.top = '0px'; + this.svg.style.height = '100%'; + this.svg.style.width = '100%'; + this.svg.style.display = "block"; + this.dom.frame.appendChild(this.svg); + }; - this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); - this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + DataAxis.prototype._redrawGroupIcons = function () { + DOMutil.prepareElements(this.svgElements); - this.lineTo(xe, ymb); + var x; + var iconWidth = this.options.iconWidth; + var iconHeight = 15; + var iconOffset = 4; + var y = iconOffset + 0.5 * iconHeight; - this.bezierCurveTo(xe, ymb + oy, xm + ox, yeb, xm, yeb); - this.bezierCurveTo(xm - ox, yeb, x, ymb + oy, x, ymb); + if (this.options.orientation == 'left') { + x = iconOffset; + } + else { + x = this.width - iconWidth - iconOffset; + } - this.lineTo(x, ym); - }; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); + y += iconHeight + iconOffset; + } + } + } + DOMutil.cleanupElements(this.svgElements); + }; - /** - * Draw an arrow point (no line) - */ - CanvasRenderingContext2D.prototype.arrow = function(x, y, angle, length) { - // tail - var xt = x - length * Math.cos(angle); - var yt = y - length * Math.sin(angle); + /** + * Create the HTML DOM for the DataAxis + */ + DataAxis.prototype.show = function() { + if (!this.dom.frame.parentNode) { + if (this.options.orientation == 'left') { + this.body.dom.left.appendChild(this.dom.frame); + } + else { + this.body.dom.right.appendChild(this.dom.frame); + } + } - // inner tail - // TODO: allow to customize different shapes - var xi = x - length * 0.9 * Math.cos(angle); - var yi = y - length * 0.9 * Math.sin(angle); + if (!this.dom.lineContainer.parentNode) { + this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer); + } + }; - // left - var xl = xt + length / 3 * Math.cos(angle + 0.5 * Math.PI); - var yl = yt + length / 3 * Math.sin(angle + 0.5 * Math.PI); + /** + * Create the HTML DOM for the DataAxis + */ + DataAxis.prototype.hide = function() { + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); + } - // right - var xr = xt + length / 3 * Math.cos(angle - 0.5 * Math.PI); - var yr = yt + length / 3 * Math.sin(angle - 0.5 * Math.PI); + if (this.dom.lineContainer.parentNode) { + this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer); + } + }; - this.beginPath(); - this.moveTo(x, y); - this.lineTo(xl, yl); - this.lineTo(xi, yi); - this.lineTo(xr, yr); - this.closePath(); - }; + /** + * Set a range (start and end) + * @param end + * @param start + * @param end + */ + DataAxis.prototype.setRange = function (start, end) { + this.range.start = start; + this.range.end = end; + }; - /** - * Sets up the dashedLine functionality for drawing - * Original code came from http://stackoverflow.com/questions/4576724/dotted-stroke-in-canvas - * @author David Jordan - * @date 2012-08-08 - */ - CanvasRenderingContext2D.prototype.dashedLine = function(x,y,x2,y2,dashArray){ - if (!dashArray) dashArray=[10,5]; - if (dashLength==0) dashLength = 0.001; // Hack for Safari - var dashCount = dashArray.length; - this.moveTo(x, y); - var dx = (x2-x), dy = (y2-y); - var slope = dy/dx; - var distRemaining = Math.sqrt( dx*dx + dy*dy ); - var dashIndex=0, draw=true; - while (distRemaining>=0.1){ - var dashLength = dashArray[dashIndex++%dashCount]; - if (dashLength > distRemaining) dashLength = distRemaining; - var xStep = Math.sqrt( dashLength*dashLength / (1 + slope*slope) ); - if (dx<0) xStep = -xStep; - x += xStep; - y += slope*xStep; - this[draw ? 'lineTo' : 'moveTo'](x,y); - distRemaining -= dashLength; - draw = !draw; + /** + * Repaint the component + * @return {boolean} Returns true if the component is resized + */ + DataAxis.prototype.redraw = function () { + var changeCalled = false; + var activeGroups = 0; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + activeGroups++; + } } - }; + } + if (this.amountOfGroups == 0 || activeGroups == 0) { + this.hide(); + } + else { + this.show(); + this.height = Number(this.linegraphSVG.style.height.replace("px","")); + // svg offsetheight did not work in firefox and explorer... + + this.dom.lineContainer.style.height = this.height + 'px'; + this.width = this.options.visible == true ? Number(('' + this.options.width).replace("px","")) : 0; - // TODO: add diamond shape - } + var props = this.props; + var frame = this.dom.frame; + // update classname + frame.className = 'dataaxis'; -/***/ }, -/* 47 */ -/***/ function(module, exports, __webpack_require__) { + // calculate character width and height + this._calculateCharSize(); - var PhysicsMixin = __webpack_require__(59); - var ClusterMixin = __webpack_require__(53); - var SectorsMixin = __webpack_require__(54); - var SelectionMixin = __webpack_require__(55); - var ManipulationMixin = __webpack_require__(56); - var NavigationMixin = __webpack_require__(57); - var HierarchicalLayoutMixin = __webpack_require__(58); + var orientation = this.options.orientation; + var showMinorLabels = this.options.showMinorLabels; + var showMajorLabels = this.options.showMajorLabels; - /** - * Load a mixin into the network object - * - * @param {Object} sourceVariable | this object has to contain functions. - * @private - */ - exports._loadMixin = function (sourceVariable) { - for (var mixinFunction in sourceVariable) { - if (sourceVariable.hasOwnProperty(mixinFunction)) { - this[mixinFunction] = sourceVariable[mixinFunction]; - } - } - }; + // determine the width and height of the elemens for the axis + props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; + props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; + props.minorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.minorLinesOffset; + props.minorLineHeight = 1; + props.majorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.majorLinesOffset; + props.majorLineHeight = 1; - /** - * removes a mixin from the network object. - * - * @param {Object} sourceVariable | this object has to contain functions. - * @private - */ - exports._clearMixin = function (sourceVariable) { - for (var mixinFunction in sourceVariable) { - if (sourceVariable.hasOwnProperty(mixinFunction)) { - this[mixinFunction] = undefined; + // take frame offline while updating (is almost twice as fast) + if (orientation == 'left') { + frame.style.top = '0'; + frame.style.left = '0'; + frame.style.bottom = ''; + frame.style.width = this.width + 'px'; + frame.style.height = this.height + "px"; + } + else { // right + frame.style.top = ''; + frame.style.bottom = '0'; + frame.style.left = '0'; + frame.style.width = this.width + 'px'; + frame.style.height = this.height + "px"; + } + changeCalled = this._redrawLabels(); + if (this.options.icons == true) { + this._redrawGroupIcons(); } } + return changeCalled; }; - /** - * Mixin the physics system and initialize the parameters required. - * + * Repaint major and minor text labels and vertical grid lines * @private */ - exports._loadPhysicsSystem = function () { - this._loadMixin(PhysicsMixin); - this._loadSelectedForceSolver(); - if (this.constants.configurePhysics == true) { - this._loadPhysicsConfiguration(); + DataAxis.prototype._redrawLabels = function () { + DOMutil.prepareElements(this.DOMelements.lines); + DOMutil.prepareElements(this.DOMelements.labels); + + var orientation = this.options['orientation']; + + // calculate range and step (step such that we have space for 7 characters per label) + var minimumStep = this.master ? this.props.majorCharHeight || 10 : this.stepPixelsForced; + var step = new DataStep(this.range.start, this.range.end, minimumStep, this.dom.frame.offsetHeight, this.options.customRange[this.options.orientation]); + this.step = step; + // get the distance in pixels for a step + // dead space is space that is "left over" after a step + var stepPixels = (this.dom.frame.offsetHeight - (step.deadSpace * (this.dom.frame.offsetHeight / step.marginRange))) / (((step.marginRange - step.deadSpace) / step.step)); + this.stepPixels = stepPixels; + + var amountOfSteps = this.height / stepPixels; + var stepDifference = 0; + + if (this.master == false) { + stepPixels = this.stepPixelsForced; + stepDifference = Math.round((this.dom.frame.offsetHeight / stepPixels) - amountOfSteps); + for (var i = 0; i < 0.5 * stepDifference; i++) { + step.previous(); + } + amountOfSteps = this.height / stepPixels; + } + else { + amountOfSteps += 0.25; } - }; - /** - * Mixin the cluster system and initialize the parameters required. - * - * @private - */ - exports._loadClusterSystem = function () { - this.clusterSession = 0; - this.hubThreshold = 5; - this._loadMixin(ClusterMixin); - }; + this.valueAtZero = step.marginEnd; + var marginStartPos = 0; + // do not draw the first label + var max = 1; - /** - * Mixin the sector system and initialize the parameters required - * - * @private - */ - exports._loadSectorSystem = function () { - this.sectors = {}; - this.activeSector = ["default"]; - this.sectors["active"] = {}; - this.sectors["active"]["default"] = {"nodes": {}, - "edges": {}, - "nodeIndices": [], - "formationScale": 1.0, - "drawingNode": undefined }; - this.sectors["frozen"] = {}; - this.sectors["support"] = {"nodes": {}, - "edges": {}, - "nodeIndices": [], - "formationScale": 1.0, - "drawingNode": undefined }; + this.maxLabelSize = 0; + var y = 0; + while (max < Math.round(amountOfSteps)) { + step.next(); + y = Math.round(max * stepPixels); + marginStartPos = max * stepPixels; + var isMajor = step.isMajor(); - this.nodeIndices = this.sectors["active"]["default"]["nodeIndices"]; // the node indices list is used to speed up the computation of the repulsion fields + if (this.options['showMinorLabels'] && isMajor == false || this.master == false && this.options['showMinorLabels'] == true) { + this._redrawLabel(y - 2, step.getCurrent(), orientation, 'yAxis minor', this.props.minorCharHeight); + } - this._loadMixin(SectorsMixin); - }; + if (isMajor && this.options['showMajorLabels'] && this.master == true || + this.options['showMinorLabels'] == false && this.master == false && isMajor == true) { + if (y >= 0) { + this._redrawLabel(y - 2, step.getCurrent(), orientation, 'yAxis major', this.props.majorCharHeight); + } + this._redrawLine(y, orientation, 'grid horizontal major', this.options.majorLinesOffset, this.props.majorLineWidth); + } + else { + this._redrawLine(y, orientation, 'grid horizontal minor', this.options.minorLinesOffset, this.props.minorLineWidth); + } + max++; + } - /** - * Mixin the selection system and initialize the parameters required - * - * @private - */ - exports._loadSelectionSystem = function () { - this.selectionObj = {nodes: {}, edges: {}}; + if (this.master == false) { + this.conversionFactor = y / (this.valueAtZero - step.current); + } + else { + this.conversionFactor = this.dom.frame.offsetHeight / step.marginRange; + } - this._loadMixin(SelectionMixin); + var offset = this.options.icons == true ? this.options.iconWidth + this.options.labelOffsetX + 15 : this.options.labelOffsetX + 15; + // this will resize the yAxis to accomodate the labels. + if (this.maxLabelSize > (this.width - offset) && this.options.visible == true) { + this.width = this.maxLabelSize + offset; + this.options.width = this.width + "px"; + DOMutil.cleanupElements(this.DOMelements.lines); + DOMutil.cleanupElements(this.DOMelements.labels); + this.redraw(); + return true; + } + // this will resize the yAxis if it is too big for the labels. + else if (this.maxLabelSize < (this.width - offset) && this.options.visible == true && this.width > this.minWidth) { + this.width = Math.max(this.minWidth,this.maxLabelSize + offset); + this.options.width = this.width + "px"; + DOMutil.cleanupElements(this.DOMelements.lines); + DOMutil.cleanupElements(this.DOMelements.labels); + this.redraw(); + return true; + } + else { + DOMutil.cleanupElements(this.DOMelements.lines); + DOMutil.cleanupElements(this.DOMelements.labels); + return false; + } }; + DataAxis.prototype.convertValue = function (value) { + var invertedValue = this.valueAtZero - value; + var convertedValue = invertedValue * this.conversionFactor; + return convertedValue; + }; /** - * Mixin the navigationUI (User Interface) system and initialize the parameters required - * + * Create a label for the axis at position x * @private + * @param y + * @param text + * @param orientation + * @param className + * @param characterHeight */ - exports._loadManipulationSystem = function () { - // reset global variables -- these are used by the selection of nodes and edges. - this.blockConnectingEdgeSelection = false; - this.forceAppendSelection = false; - - if (this.constants.dataManipulation.enabled == true) { - // load the manipulator HTML elements. All styling done in css. - if (this.manipulationDiv === undefined) { - this.manipulationDiv = document.createElement('div'); - this.manipulationDiv.className = 'network-manipulationDiv'; - this.manipulationDiv.id = 'network-manipulationDiv'; - if (this.editMode == true) { - this.manipulationDiv.style.display = "block"; - } - else { - this.manipulationDiv.style.display = "none"; - } - this.frame.appendChild(this.manipulationDiv); - } - - if (this.editModeDiv === undefined) { - this.editModeDiv = document.createElement('div'); - this.editModeDiv.className = 'network-manipulation-editMode'; - this.editModeDiv.id = 'network-manipulation-editMode'; - if (this.editMode == true) { - this.editModeDiv.style.display = "none"; - } - else { - this.editModeDiv.style.display = "block"; - } - this.frame.appendChild(this.editModeDiv); - } + DataAxis.prototype._redrawLabel = function (y, text, orientation, className, characterHeight) { + // reuse redundant label + var label = DOMutil.getDOMElement('div',this.DOMelements.labels, this.dom.frame); //this.dom.redundant.labels.shift(); + label.className = className; + label.innerHTML = text; + if (orientation == 'left') { + label.style.left = '-' + this.options.labelOffsetX + 'px'; + label.style.textAlign = "right"; + } + else { + label.style.right = '-' + this.options.labelOffsetX + 'px'; + label.style.textAlign = "left"; + } - if (this.closeDiv === undefined) { - this.closeDiv = document.createElement('div'); - this.closeDiv.className = 'network-manipulation-closeDiv'; - this.closeDiv.id = 'network-manipulation-closeDiv'; - this.closeDiv.style.display = this.manipulationDiv.style.display; - this.frame.appendChild(this.closeDiv); - } + label.style.top = y - 0.5 * characterHeight + this.options.labelOffsetY + 'px'; - // load the manipulation functions - this._loadMixin(ManipulationMixin); + text += ''; - // create the manipulator toolbar - this._createManipulatorBar(); + var largestWidth = Math.max(this.props.majorCharWidth,this.props.minorCharWidth); + if (this.maxLabelSize < text.length * largestWidth) { + this.maxLabelSize = text.length * largestWidth; } - else { - if (this.manipulationDiv !== undefined) { - // removes all the bindings and overloads - this._createManipulatorBar(); - // remove the manipulation divs - this.containerElement.removeChild(this.manipulationDiv); - this.containerElement.removeChild(this.editModeDiv); - this.containerElement.removeChild(this.closeDiv); + }; - this.manipulationDiv = undefined; - this.editModeDiv = undefined; - this.closeDiv = undefined; - // remove the mixin functions - this._clearMixin(ManipulationMixin); + /** + * Create a minor line for the axis at position y + * @param y + * @param orientation + * @param className + * @param offset + * @param width + */ + DataAxis.prototype._redrawLine = function (y, orientation, className, offset, width) { + if (this.master == true) { + var line = DOMutil.getDOMElement('div',this.DOMelements.lines, this.dom.lineContainer);//this.dom.redundant.lines.shift(); + line.className = className; + line.innerHTML = ''; + + if (orientation == 'left') { + line.style.left = (this.width - offset) + 'px'; + } + else { + line.style.right = (this.width - offset) + 'px'; } + + line.style.width = width + 'px'; + line.style.top = y + 'px'; } }; + + + /** - * Mixin the navigation (User Interface) system and initialize the parameters required - * + * Determine the size of text on the axis (both major and minor axis). + * The size is calculated only once and then cached in this.props. * @private */ - exports._loadNavigationControls = function () { - this._loadMixin(NavigationMixin); + DataAxis.prototype._calculateCharSize = function () { + // determine the char width and height on the minor axis + if (!('minorCharHeight' in this.props)) { + var textMinor = document.createTextNode('0'); + var measureCharMinor = document.createElement('DIV'); + measureCharMinor.className = 'yAxis minor measure'; + measureCharMinor.appendChild(textMinor); + this.dom.frame.appendChild(measureCharMinor); - // the clean function removes the button divs, this is done to remove the bindings. - this._cleanNavigation(); - if (this.constants.navigation.enabled == true) { - this._loadNavigationElements(); + this.props.minorCharHeight = measureCharMinor.clientHeight; + this.props.minorCharWidth = measureCharMinor.clientWidth; + + this.dom.frame.removeChild(measureCharMinor); } - }; + if (!('majorCharHeight' in this.props)) { + var textMajor = document.createTextNode('0'); + var measureCharMajor = document.createElement('DIV'); + measureCharMajor.className = 'yAxis major measure'; + measureCharMajor.appendChild(textMajor); + this.dom.frame.appendChild(measureCharMajor); + + this.props.majorCharHeight = measureCharMajor.clientHeight; + this.props.majorCharWidth = measureCharMajor.clientWidth; + + this.dom.frame.removeChild(measureCharMajor); + } + }; /** - * Mixin the hierarchical layout system. - * - * @private + * Snap a date to a rounded value. + * The snap intervals are dependent on the current scale and step. + * @param {Date} date the date to be snapped. + * @return {Date} snappedDate */ - exports._loadHierarchySystem = function () { - this._loadMixin(HierarchicalLayoutMixin); + DataAxis.prototype.snap = function(date) { + return this.step.snap(date); }; + module.exports = DataAxis; + /***/ }, -/* 48 */ +/* 41 */ /***/ function(module, exports, __webpack_require__) { - var mousetrap = __webpack_require__(50); - var Emitter = __webpack_require__(49); - var Hammer = __webpack_require__(41); - var util = __webpack_require__(1); - /** - * Turn an element into an clickToUse element. - * When not active, the element has a transparent overlay. When the overlay is - * clicked, the mode is changed to active. - * When active, the element is displayed with a blue border around it, and - * the interactive contents of the element can be used. When clicked outside - * the element, the elements mode is changed to inactive. - * @param {Element} container - * @constructor + * @constructor DataStep + * The class DataStep is an iterator for data for the lineGraph. You provide a start data point and an + * end data point. The class itself determines the best scale (step size) based on the + * provided start Date, end Date, and minimumStep. + * + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * + * Alternatively, you can set a scale by hand. + * After creation, you can initialize the class by executing first(). Then you + * can iterate from the start date to the end date via next(). You can check if + * the end date is reached with the function hasNext(). After each step, you can + * retrieve the current date via getCurrent(). + * The DataStep has scales ranging from milliseconds, seconds, minutes, hours, + * days, to years. + * + * Version: 1.2 + * + * @param {Date} [start] The start date, for example new Date(2010, 9, 21) + * or new Date(2010, 9, 21, 23, 45, 00) + * @param {Date} [end] The end date + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds */ - function Activator(container) { - this.active = false; + function DataStep(start, end, minimumStep, containerHeight, customRange) { + // variables + this.current = 0; - this.dom = { - container: container - }; + this.autoScale = true; + this.stepIndex = 0; + this.step = 1; + this.scale = 1; - this.dom.overlay = document.createElement('div'); - this.dom.overlay.className = 'overlay'; + this.marginStart; + this.marginEnd; + this.deadSpace = 0; - this.dom.container.appendChild(this.dom.overlay); + this.majorSteps = [1, 2, 5, 10]; + this.minorSteps = [0.25, 0.5, 1, 2]; - this.hammer = Hammer(this.dom.overlay, {prevent_default: false}); - this.hammer.on('tap', this._onTapOverlay.bind(this)); + this.setRange(start, end, minimumStep, containerHeight, customRange); + } - // block all touch events (except tap) - var me = this; - var events = [ - 'touch', 'pinch', - 'doubletap', 'hold', - 'dragstart', 'drag', 'dragend', - 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox - ]; - events.forEach(function (event) { - me.hammer.on(event, function (event) { - event.stopPropagation(); - }); - }); - // attach a tap event to the window, in order to deactivate when clicking outside the timeline - this.windowHammer = Hammer(window, {prevent_default: false}); - this.windowHammer.on('tap', function (event) { - // deactivate when clicked outside the container - if (!_hasParent(event.target, container)) { - me.deactivate(); - } - }); - // mousetrap listener only bounded when active) - this.escListener = this.deactivate.bind(this); - } + /** + * Set a new range + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * @param {Number} [start] The start date and time. + * @param {Number} [end] The end date and time. + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds + */ + DataStep.prototype.setRange = function(start, end, minimumStep, containerHeight, customRange) { + this._start = customRange.min === undefined ? start : customRange.min; + this._end = customRange.max === undefined ? end : customRange.max; - // turn into an event emitter - Emitter(Activator.prototype); + if (start == end) { + this._start = start - 0.75; + this._end = end + 1; + } - // The currently active activator - Activator.current = null; + if (this.autoScale) { + this.setMinimumStep(minimumStep, containerHeight); + } + this.setFirst(customRange); + }; /** - * Destroy the activator. Cleans up all created DOM and event listeners + * Automatically determine the scale that bests fits the provided minimum step + * @param {Number} [minimumStep] The minimum step size in milliseconds */ - Activator.prototype.destroy = function () { - this.deactivate(); + DataStep.prototype.setMinimumStep = function(minimumStep, containerHeight) { + // round to floor + var size = this._end - this._start; + var safeSize = size * 1.2; + var minimumStepValue = minimumStep * (safeSize / containerHeight); + var orderOfMagnitude = Math.round(Math.log(safeSize)/Math.LN10); - // remove dom - this.dom.overlay.parentNode.removeChild(this.dom.overlay); + var minorStepIdx = -1; + var magnitudefactor = Math.pow(10,orderOfMagnitude); - // cleanup hammer instances - this.hammer = null; - this.windowHammer = null; - // FIXME: cleaning up hammer instances doesn't work (Timeline not removed from memory) + var start = 0; + if (orderOfMagnitude < 0) { + start = orderOfMagnitude; + } + + var solutionFound = false; + for (var i = start; Math.abs(i) <= Math.abs(orderOfMagnitude); i++) { + magnitudefactor = Math.pow(10,i); + for (var j = 0; j < this.minorSteps.length; j++) { + var stepSize = magnitudefactor * this.minorSteps[j]; + if (stepSize >= minimumStepValue) { + solutionFound = true; + minorStepIdx = j; + break; + } + } + if (solutionFound == true) { + break; + } + } + this.stepIndex = minorStepIdx; + this.scale = magnitudefactor; + this.step = magnitudefactor * this.minorSteps[minorStepIdx]; }; + + /** - * Activate the element - * Overlay is hidden, element is decorated with a blue shadow border + * Round the current date to the first minor date value + * This must be executed once when the current date is set to start Date */ - Activator.prototype.activate = function () { - // we allow only one active activator at a time - if (Activator.current) { - Activator.current.deactivate(); + DataStep.prototype.setFirst = function(customRange) { + if (customRange === undefined) { + customRange = {}; } - Activator.current = this; + var niceStart = customRange.min === undefined ? this._start - (this.scale * 2 * this.minorSteps[this.stepIndex]) : customRange.min; + var niceEnd = customRange.max === undefined ? this._end + (this.scale * this.minorSteps[this.stepIndex]) : customRange.max; - this.active = true; - this.dom.overlay.style.display = 'none'; - util.addClassName(this.dom.container, 'vis-active'); + this.marginEnd = customRange.max === undefined ? this.roundToMinor(niceEnd) : customRange.max; + this.marginStart = customRange.min === undefined ? this.roundToMinor(niceStart) : customRange.min; + this.deadSpace = this.roundToMinor(niceEnd) - niceEnd + this.roundToMinor(niceStart) - niceStart; + this.marginRange = this.marginEnd - this.marginStart; - this.emit('change'); - this.emit('activate'); + this.current = this.marginEnd; - // ugly hack: bind ESC after emitting the events, as the Network rebinds all - // keyboard events on a 'change' event - mousetrap.bind('esc', this.escListener); }; - /** - * Deactivate the element - * Overlay is displayed on top of the element - */ - Activator.prototype.deactivate = function () { - this.active = false; - this.dom.overlay.style.display = ''; - util.removeClassName(this.dom.container, 'vis-active'); - mousetrap.unbind('esc', this.escListener); + DataStep.prototype.roundToMinor = function(value) { + var rounded = value - (value % (this.scale * this.minorSteps[this.stepIndex])); + if (value % (this.scale * this.minorSteps[this.stepIndex]) > 0.5 * (this.scale * this.minorSteps[this.stepIndex])) { + return rounded + (this.scale * this.minorSteps[this.stepIndex]); + } + else { + return rounded; + } + } - this.emit('change'); - this.emit('deactivate'); - }; /** - * Handle a tap event: activate the container - * @param event - * @private + * Check if the there is a next step + * @return {boolean} true if the current date has not passed the end date */ - Activator.prototype._onTapOverlay = function (event) { - // activate the container - this.activate(); - event.stopPropagation(); + DataStep.prototype.hasNext = function () { + return (this.current >= this.marginStart); }; /** - * Test whether the element has the requested parent element somewhere in - * its chain of parent nodes. - * @param {HTMLElement} element - * @param {HTMLElement} parent - * @returns {boolean} Returns true when the parent is found somewhere in the - * chain of parent nodes. - * @private + * Do the next step */ - function _hasParent(element, parent) { - while (element) { - if (element === parent) { - return true - } - element = element.parentNode; - } - return false; - } - - module.exports = Activator; - + DataStep.prototype.next = function() { + var prev = this.current; + this.current -= this.step; -/***/ }, -/* 49 */ -/***/ function(module, exports, __webpack_require__) { + // safety mechanism: if current time is still unchanged, move to the end + if (this.current == prev) { + this.current = this._end; + } + }; - /** - * Expose `Emitter`. + * Do the next step */ + DataStep.prototype.previous = function() { + this.current += this.step; + this.marginEnd += this.step; + this.marginRange = this.marginEnd - this.marginStart; + }; + - module.exports = Emitter; /** - * Initialize a new `Emitter`. - * - * @api public + * Get the current datetime + * @return {String} current The current date */ + DataStep.prototype.getCurrent = function() { + var toPrecision = '' + Number(this.current).toPrecision(5); + for (var i = toPrecision.length-1; i > 0; i--) { + if (toPrecision[i] == "0") { + toPrecision = toPrecision.slice(0,i); + } + else if (toPrecision[i] == "." || toPrecision[i] == ",") { + toPrecision = toPrecision.slice(0,i); + break; + } + else{ + break; + } + } - function Emitter(obj) { - if (obj) return mixin(obj); + return toPrecision; }; - /** - * Mixin the emitter properties. - * - * @param {Object} obj - * @return {Object} - * @api private - */ - function mixin(obj) { - for (var key in Emitter.prototype) { - obj[key] = Emitter.prototype[key]; - } - return obj; - } /** - * Listen on the given `event` with `fn`. - * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public + * Snap a date to a rounded value. + * The snap intervals are dependent on the current scale and step. + * @param {Date} date the date to be snapped. + * @return {Date} snappedDate */ + DataStep.prototype.snap = function(date) { - Emitter.prototype.on = - Emitter.prototype.addEventListener = function(event, fn){ - this._callbacks = this._callbacks || {}; - (this._callbacks[event] = this._callbacks[event] || []) - .push(fn); - return this; }; /** - * Adds an `event` listener that will be invoked a single - * time then automatically removed. - * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public + * Check if the current value is a major value (for example when the step + * is DAY, a major value is each first day of the MONTH) + * @return {boolean} true if current date is major, else false. */ + DataStep.prototype.isMajor = function() { + return (this.current % (this.scale * this.majorSteps[this.stepIndex]) == 0); + }; - Emitter.prototype.once = function(event, fn){ - var self = this; - this._callbacks = this._callbacks || {}; + module.exports = DataStep; - function on() { - self.off(event, on); - fn.apply(this, arguments); - } - on.fn = fn; - this.on(event, on); - return this; - }; +/***/ }, +/* 42 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(6); /** - * Remove the given callback for `event` or all - * registered callbacks. - * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public + * @constructor Group + * @param {Number | String} groupId + * @param {Object} data + * @param {ItemSet} itemSet */ + function GraphGroup (group, groupId, options, groupsUsingDefaultStyles) { + this.id = groupId; + var fields = ['sampling','style','sort','yAxisOrientation','barChart','drawPoints','shaded','catmullRom'] + this.options = util.selectiveBridgeObject(fields,options); + this.usingDefaultStyle = group.className === undefined; + this.groupsUsingDefaultStyles = groupsUsingDefaultStyles; + this.zeroPosition = 0; + this.update(group); + if (this.usingDefaultStyle == true) { + this.groupsUsingDefaultStyles[0] += 1; + } + this.itemsData = []; + this.visible = group.visible === undefined ? true : group.visible; + } - Emitter.prototype.off = - Emitter.prototype.removeListener = - Emitter.prototype.removeAllListeners = - Emitter.prototype.removeEventListener = function(event, fn){ - this._callbacks = this._callbacks || {}; - - // all - if (0 == arguments.length) { - this._callbacks = {}; - return this; + GraphGroup.prototype.setItems = function(items) { + if (items != null) { + this.itemsData = items; + if (this.options.sort == true) { + this.itemsData.sort(function (a,b) {return a.x - b.x;}) + } + } + else { + this.itemsData = []; } + }; - // specific event - var callbacks = this._callbacks[event]; - if (!callbacks) return this; + GraphGroup.prototype.setZeroPosition = function(pos) { + this.zeroPosition = pos; + }; - // remove all handlers - if (1 == arguments.length) { - delete this._callbacks[event]; - return this; - } + GraphGroup.prototype.setOptions = function(options) { + if (options !== undefined) { + var fields = ['sampling','style','sort','yAxisOrientation','barChart']; + util.selectiveDeepExtend(fields, this.options, options); - // remove specific handler - var cb; - for (var i = 0; i < callbacks.length; i++) { - cb = callbacks[i]; - if (cb === fn || cb.fn === fn) { - callbacks.splice(i, 1); - break; + util.mergeOptions(this.options, options,'catmullRom'); + util.mergeOptions(this.options, options,'drawPoints'); + util.mergeOptions(this.options, options,'shaded'); + + if (options.catmullRom) { + if (typeof options.catmullRom == 'object') { + if (options.catmullRom.parametrization) { + if (options.catmullRom.parametrization == 'uniform') { + this.options.catmullRom.alpha = 0; + } + else if (options.catmullRom.parametrization == 'chordal') { + this.options.catmullRom.alpha = 1.0; + } + else { + this.options.catmullRom.parametrization = 'centripetal'; + this.options.catmullRom.alpha = 0.5; + } + } + } } } - return this; }; - /** - * Emit `event` with the given args. - * - * @param {String} event - * @param {Mixed} ... - * @return {Emitter} - */ + GraphGroup.prototype.update = function(group) { + this.group = group; + this.content = group.content || 'graph'; + this.className = group.className || this.className || "graphGroup" + this.groupsUsingDefaultStyles[0] % 10; + this.visible = group.visible === undefined ? true : group.visible; + this.setOptions(group.options); + }; - Emitter.prototype.emit = function(event){ - this._callbacks = this._callbacks || {}; - var args = [].slice.call(arguments, 1) - , callbacks = this._callbacks[event]; + GraphGroup.prototype.drawIcon = function(x, y, JSONcontainer, SVGcontainer, iconWidth, iconHeight) { + var fillHeight = iconHeight * 0.5; + var path, fillPath; - if (callbacks) { - callbacks = callbacks.slice(0); - for (var i = 0, len = callbacks.length; i < len; ++i) { - callbacks[i].apply(this, args); + var outline = DOMutil.getSVGElement("rect", JSONcontainer, SVGcontainer); + outline.setAttributeNS(null, "x", x); + outline.setAttributeNS(null, "y", y - fillHeight); + outline.setAttributeNS(null, "width", iconWidth); + outline.setAttributeNS(null, "height", 2*fillHeight); + outline.setAttributeNS(null, "class", "outline"); + + if (this.options.style == 'line') { + path = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); + path.setAttributeNS(null, "class", this.className); + path.setAttributeNS(null, "d", "M" + x + ","+y+" L" + (x + iconWidth) + ","+y+""); + if (this.options.shaded.enabled == true) { + fillPath = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); + if (this.options.shaded.orientation == 'top') { + fillPath.setAttributeNS(null, "d", "M"+x+", " + (y - fillHeight) + + "L"+x+","+y+" L"+ (x + iconWidth) + ","+y+" L"+ (x + iconWidth) + "," + (y - fillHeight)); + } + else { + fillPath.setAttributeNS(null, "d", "M"+x+","+y+" " + + "L"+x+"," + (y + fillHeight) + " " + + "L"+ (x + iconWidth) + "," + (y + fillHeight) + + "L"+ (x + iconWidth) + ","+y); + } + fillPath.setAttributeNS(null, "class", this.className + " iconFill"); } - } - return this; - }; + if (this.options.drawPoints.enabled == true) { + DOMutil.drawPoint(x + 0.5 * iconWidth,y, this, JSONcontainer, SVGcontainer); + } + } + else { + var barWidth = Math.round(0.3 * iconWidth); + var bar1Height = Math.round(0.4 * iconHeight); + var bar2Height = Math.round(0.75 * iconHeight); - /** - * Return array of callbacks for `event`. - * - * @param {String} event - * @return {Array} - * @api public - */ + var offset = Math.round((iconWidth - (2 * barWidth))/3); - Emitter.prototype.listeners = function(event){ - this._callbacks = this._callbacks || {}; - return this._callbacks[event] || []; + DOMutil.drawBar(x + 0.5*barWidth + offset , y + fillHeight - bar1Height - 1, barWidth, bar1Height, this.className + ' bar', JSONcontainer, SVGcontainer); + DOMutil.drawBar(x + 1.5*barWidth + offset + 2, y + fillHeight - bar2Height - 1, barWidth, bar2Height, this.className + ' bar', JSONcontainer, SVGcontainer); + } }; /** - * Check if this emitter has `event` handlers. * - * @param {String} event - * @return {Boolean} - * @api public + * @param iconWidth + * @param iconHeight + * @returns {{icon: HTMLElement, label: (group.content|*|string), orientation: (.options.yAxisOrientation|*)}} */ + GraphGroup.prototype.getLegend = function(iconWidth, iconHeight) { + var svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); + this.drawIcon(0,0.5*iconHeight,[],svg,iconWidth,iconHeight); + return {icon: svg, label: this.content, orientation:this.options.yAxisOrientation}; + } - Emitter.prototype.hasListeners = function(event){ - return !! this.listeners(event).length; - }; + module.exports = GraphGroup; /***/ }, -/* 50 */ +/* 43 */ /***/ function(module, exports, __webpack_require__) { + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(6); + var Component = __webpack_require__(22); + /** - * Copyright 2012 Craig Campbell - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Mousetrap is a simple keyboard shortcut library for Javascript with - * no external dependencies - * - * @version 1.1.2 - * @url craig.is/killing/mice + * Legend for Graph2d */ + function Legend(body, options, side, linegraphOptions) { + this.body = body; + this.defaultOptions = { + enabled: true, + icons: true, + iconSize: 20, + iconSpacing: 6, + left: { + visible: true, + position: 'top-left' // top/bottom - left,center,right + }, + right: { + visible: true, + position: 'top-left' // top/bottom - left,center,right + } + } + this.side = side; + this.options = util.extend({},this.defaultOptions); + this.linegraphOptions = linegraphOptions; - /** - * mapping of special keycodes to their corresponding keys - * - * everything in this dictionary cannot use keypress events - * so it has to be here to map to the correct keycodes for - * keyup/keydown events - * - * @type {Object} - */ - var _MAP = { - 8: 'backspace', - 9: 'tab', - 13: 'enter', - 16: 'shift', - 17: 'ctrl', - 18: 'alt', - 20: 'capslock', - 27: 'esc', - 32: 'space', - 33: 'pageup', - 34: 'pagedown', - 35: 'end', - 36: 'home', - 37: 'left', - 38: 'up', - 39: 'right', - 40: 'down', - 45: 'ins', - 46: 'del', - 91: 'meta', - 93: 'meta', - 224: 'meta' - }, - - /** - * mapping for special characters so they can support - * - * this dictionary is only used incase you want to bind a - * keyup or keydown event to one of these keys - * - * @type {Object} - */ - _KEYCODE_MAP = { - 106: '*', - 107: '+', - 109: '-', - 110: '.', - 111 : '/', - 186: ';', - 187: '=', - 188: ',', - 189: '-', - 190: '.', - 191: '/', - 192: '`', - 219: '[', - 220: '\\', - 221: ']', - 222: '\'' - }, + this.svgElements = {}; + this.dom = {}; + this.groups = {}; + this.amountOfGroups = 0; + this._create(); - /** - * this is a mapping of keys that require shift on a US keypad - * back to the non shift equivelents - * - * this is so you can use keyup events with these keys - * - * note that this will only work reliably on US keyboards - * - * @type {Object} - */ - _SHIFT_MAP = { - '~': '`', - '!': '1', - '@': '2', - '#': '3', - '$': '4', - '%': '5', - '^': '6', - '&': '7', - '*': '8', - '(': '9', - ')': '0', - '_': '-', - '+': '=', - ':': ';', - '\"': '\'', - '<': ',', - '>': '.', - '?': '/', - '|': '\\' - }, + this.setOptions(options); + } - /** - * this is a list of special strings you can use to map - * to modifier keys when you specify your keyboard shortcuts - * - * @type {Object} - */ - _SPECIAL_ALIASES = { - 'option': 'alt', - 'command': 'meta', - 'return': 'enter', - 'escape': 'esc' - }, + Legend.prototype = new Component(); - /** - * variable to store the flipped version of _MAP from above - * needed to check if we should use keypress or not when no action - * is specified - * - * @type {Object|undefined} - */ - _REVERSE_MAP, - /** - * a list of all the callbacks setup via Mousetrap.bind() - * - * @type {Object} - */ - _callbacks = {}, + Legend.prototype.addGroup = function(label, graphOptions) { + if (!this.groups.hasOwnProperty(label)) { + this.groups[label] = graphOptions; + } + this.amountOfGroups += 1; + }; - /** - * direct map of string combinations to callbacks used for trigger() - * - * @type {Object} - */ - _direct_map = {}, + Legend.prototype.updateGroup = function(label, graphOptions) { + this.groups[label] = graphOptions; + }; - /** - * keeps track of what level each sequence is at since multiple - * sequences can start out with the same sequence - * - * @type {Object} - */ - _sequence_levels = {}, + Legend.prototype.removeGroup = function(label) { + if (this.groups.hasOwnProperty(label)) { + delete this.groups[label]; + this.amountOfGroups -= 1; + } + }; - /** - * variable to store the setTimeout call - * - * @type {null|number} - */ - _reset_timer, + Legend.prototype._create = function() { + this.dom.frame = document.createElement('div'); + this.dom.frame.className = 'legend'; + this.dom.frame.style.position = "absolute"; + this.dom.frame.style.top = "10px"; + this.dom.frame.style.display = "block"; - /** - * temporary state where we will ignore the next keyup - * - * @type {boolean|string} - */ - _ignore_next_keyup = false, + this.dom.textArea = document.createElement('div'); + this.dom.textArea.className = 'legendText'; + this.dom.textArea.style.position = "relative"; + this.dom.textArea.style.top = "0px"; - /** - * are we currently inside of a sequence? - * type of action ("keyup" or "keydown" or "keypress") or false - * - * @type {boolean|string} - */ - _inside_sequence = false; + this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); + this.svg.style.position = 'absolute'; + this.svg.style.top = 0 +'px'; + this.svg.style.width = this.options.iconSize + 5 + 'px'; - /** - * loop through the f keys, f1 to f19 and add them to the map - * programatically - */ - for (var i = 1; i < 20; ++i) { - _MAP[111 + i] = 'f' + i; + this.dom.frame.appendChild(this.svg); + this.dom.frame.appendChild(this.dom.textArea); + }; + + /** + * Hide the component from the DOM + */ + Legend.prototype.hide = function() { + // remove the frame containing the items + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); } + }; - /** - * loop through to map numbers on the numeric keypad - */ - for (i = 0; i <= 9; ++i) { - _MAP[i + 96] = i; + /** + * Show the component in the DOM (when not already visible). + * @return {Boolean} changed + */ + Legend.prototype.show = function() { + // show frame containing the items + if (!this.dom.frame.parentNode) { + this.body.dom.center.appendChild(this.dom.frame); } + }; - /** - * cross browser add event method - * - * @param {Element|HTMLDocument} object - * @param {string} type - * @param {Function} callback - * @returns void - */ - function _addEvent(object, type, callback) { - if (object.addEventListener) { - return object.addEventListener(type, callback, false); + Legend.prototype.setOptions = function(options) { + var fields = ['enabled','orientation','icons','left','right']; + util.selectiveDeepExtend(fields, this.options, options); + }; + + Legend.prototype.redraw = function() { + var activeGroups = 0; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + activeGroups++; } + } + } - object.attachEvent('on' + type, callback); + if (this.options[this.side].visible == false || this.amountOfGroups == 0 || this.options.enabled == false || activeGroups == 0) { + this.hide(); } + else { + this.show(); + if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'bottom-left') { + this.dom.frame.style.left = '4px'; + this.dom.frame.style.textAlign = "left"; + this.dom.textArea.style.textAlign = "left"; + this.dom.textArea.style.left = (this.options.iconSize + 15) + 'px'; + this.dom.textArea.style.right = ''; + this.svg.style.left = 0 +'px'; + this.svg.style.right = ''; + } + else { + this.dom.frame.style.right = '4px'; + this.dom.frame.style.textAlign = "right"; + this.dom.textArea.style.textAlign = "right"; + this.dom.textArea.style.right = (this.options.iconSize + 15) + 'px'; + this.dom.textArea.style.left = ''; + this.svg.style.right = 0 +'px'; + this.svg.style.left = ''; + } - /** - * takes the event and returns the key character - * - * @param {Event} e - * @return {string} - */ - function _characterFromEvent(e) { + if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'top-right') { + this.dom.frame.style.top = 4 - Number(this.body.dom.center.style.top.replace("px","")) + 'px'; + this.dom.frame.style.bottom = ''; + } + else { + this.dom.frame.style.bottom = 4 - Number(this.body.dom.center.style.top.replace("px","")) + 'px'; + this.dom.frame.style.top = ''; + } - // for keypress events we should return the character as is - if (e.type == 'keypress') { - return String.fromCharCode(e.which); - } + if (this.options.icons == false) { + this.dom.frame.style.width = this.dom.textArea.offsetWidth + 10 + 'px'; + this.dom.textArea.style.right = ''; + this.dom.textArea.style.left = ''; + this.svg.style.width = '0px'; + } + else { + this.dom.frame.style.width = this.options.iconSize + 15 + this.dom.textArea.offsetWidth + 10 + 'px' + this.drawLegendIcons(); + } - // for non keypress events the special maps are needed - if (_MAP[e.which]) { - return _MAP[e.which]; + var content = ''; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + content += this.groups[groupId].content + '
'; + } } + } + this.dom.textArea.innerHTML = content; + this.dom.textArea.style.lineHeight = ((0.75 * this.options.iconSize) + this.options.iconSpacing) + 'px'; + } + }; - if (_KEYCODE_MAP[e.which]) { - return _KEYCODE_MAP[e.which]; + Legend.prototype.drawLegendIcons = function() { + if (this.dom.frame.parentNode) { + DOMutil.prepareElements(this.svgElements); + var padding = window.getComputedStyle(this.dom.frame).paddingTop; + var iconOffset = Number(padding.replace('px','')); + var x = iconOffset; + var iconWidth = this.options.iconSize; + var iconHeight = 0.75 * this.options.iconSize; + var y = iconOffset + 0.5 * iconHeight + 3; + + this.svg.style.width = iconWidth + 5 + iconOffset + 'px'; + + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); + y += iconHeight + this.options.iconSpacing; + } } + } - // if it is not in the special map - return String.fromCharCode(e.which).toLowerCase(); + DOMutil.cleanupElements(this.svgElements); } + }; - /** - * should we stop this event before firing off callbacks - * - * @param {Event} e - * @return {boolean} - */ - function _stop(e) { - var element = e.target || e.srcElement, - tag_name = element.tagName; + module.exports = Legend; - // if the element has the class "mousetrap" then no need to stop - if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) { - return false; - } - // stop for input, select, and textarea - return tag_name == 'INPUT' || tag_name == 'SELECT' || tag_name == 'TEXTAREA' || (element.contentEditable && element.contentEditable == 'true'); +/***/ }, +/* 44 */ +/***/ function(module, exports, __webpack_require__) { + + var Emitter = __webpack_require__(10); + var Hammer = __webpack_require__(18); + var mousetrap = __webpack_require__(37); + var util = __webpack_require__(1); + var hammerUtil = __webpack_require__(21); + var DataSet = __webpack_require__(7); + var DataView = __webpack_require__(8); + var dotparser = __webpack_require__(45); + var gephiParser = __webpack_require__(46); + var Groups = __webpack_require__(47); + var Images = __webpack_require__(48); + var Node = __webpack_require__(49); + var Edge = __webpack_require__(50); + var Popup = __webpack_require__(51); + var MixinLoader = __webpack_require__(52); + var Activator = __webpack_require__(36); + var locales = __webpack_require__(63); + + // Load custom shapes into CanvasRenderingContext2D + __webpack_require__(64); + + /** + * @constructor Network + * Create a network visualization, displaying nodes and edges. + * + * @param {Element} container The DOM element in which the Network will + * be created. Normally a div element. + * @param {Object} data An object containing parameters + * {Array} nodes + * {Array} edges + * @param {Object} options Options + */ + function Network (container, data, options) { + if (!(this instanceof Network)) { + throw new SyntaxError('Constructor must be called with the new operator'); } - /** - * checks if two arrays are equal - * - * @param {Array} modifiers1 - * @param {Array} modifiers2 - * @returns {boolean} - */ - function _modifiersMatch(modifiers1, modifiers2) { - return modifiers1.sort().join(',') === modifiers2.sort().join(','); - } + this._initializeMixinLoaders(); - /** - * resets all sequence counters except for the ones passed in - * - * @param {Object} do_not_reset - * @returns void - */ - function _resetSequences(do_not_reset) { - do_not_reset = do_not_reset || {}; + // create variables and set default values + this.containerElement = container; - var active_sequences = false, - key; + // render and calculation settings + this.renderRefreshRate = 60; // hz (fps) + this.renderTimestep = 1000 / this.renderRefreshRate; // ms -- saves calculation later on + this.renderTime = 0.5 * this.renderTimestep; // measured time it takes to render a frame + this.maxPhysicsTicksPerRender = 3; // max amount of physics ticks per render step. + this.physicsDiscreteStepsize = 0.50; // discrete stepsize of the simulation - for (key in _sequence_levels) { - if (do_not_reset[key]) { - active_sequences = true; - continue; - } - _sequence_levels[key] = 0; - } + this.initializing = true; - if (!active_sequences) { - _inside_sequence = false; + this.triggerFunctions = {add:null,edit:null,editEdge:null,connect:null,del:null}; + + // set constant values + this.defaultOptions = { + nodes: { + mass: 1, + radiusMin: 10, + radiusMax: 30, + radius: 10, + shape: 'ellipse', + image: undefined, + widthMin: 16, // px + widthMax: 64, // px + fixed: false, + fontColor: 'black', + fontSize: 14, // px + fontFace: 'verdana', + level: -1, + color: { + border: '#2B7CE9', + background: '#97C2FC', + highlight: { + border: '#2B7CE9', + background: '#D2E5FF' + }, + hover: { + border: '#2B7CE9', + background: '#D2E5FF' + } + }, + borderColor: '#2B7CE9', + backgroundColor: '#97C2FC', + highlightColor: '#D2E5FF', + group: undefined, + borderWidth: 1 + }, + edges: { + widthMin: 1, + widthMax: 15, + width: 1, + widthSelectionMultiplier: 2, + hoverWidth: 1.5, + style: 'line', + color: { + color:'#848484', + highlight:'#848484', + hover: '#848484' + }, + fontColor: '#343434', + fontSize: 14, // px + fontFace: 'arial', + fontFill: 'white', + arrowScaleFactor: 1, + dash: { + length: 10, + gap: 5, + altLength: undefined + }, + inheritColor: "from" // to, from, false, true (== from) + }, + configurePhysics:false, + physics: { + barnesHut: { + enabled: true, + theta: 1 / 0.6, // inverted to save time during calculation + gravitationalConstant: -2000, + centralGravity: 0.3, + springLength: 95, + springConstant: 0.04, + damping: 0.09 + }, + repulsion: { + centralGravity: 0.0, + springLength: 200, + springConstant: 0.05, + nodeDistance: 100, + damping: 0.09 + }, + hierarchicalRepulsion: { + enabled: false, + centralGravity: 0.0, + springLength: 100, + springConstant: 0.01, + nodeDistance: 150, + damping: 0.09 + }, + damping: null, + centralGravity: null, + springLength: null, + springConstant: null + }, + clustering: { // Per Node in Cluster = PNiC + enabled: false, // (Boolean) | global on/off switch for clustering. + initialMaxNodes: 100, // (# nodes) | if the initial amount of nodes is larger than this, we cluster until the total number is less than this threshold. + clusterThreshold:500, // (# nodes) | during calculate forces, we check if the total number of nodes is larger than this. If it is, cluster until reduced to reduceToNodes + reduceToNodes:300, // (# nodes) | during calculate forces, we check if the total number of nodes is larger than clusterThreshold. If it is, cluster until reduced to this + chainThreshold: 0.4, // (% of all drawn nodes)| maximum percentage of allowed chainnodes (long strings of connected nodes) within all nodes. (lower means less chains). + clusterEdgeThreshold: 20, // (px) | edge length threshold. if smaller, this node is clustered. + sectorThreshold: 100, // (# nodes in cluster) | cluster size threshold. If larger, expanding in own sector. + screenSizeThreshold: 0.2, // (% of canvas) | relative size threshold. If the width or height of a clusternode takes up this much of the screen, decluster node. + fontSizeMultiplier: 4.0, // (px PNiC) | how much the cluster font size grows per node in cluster (in px). + maxFontSize: 1000, + forceAmplification: 0.1, // (multiplier PNiC) | factor of increase fo the repulsion force of a cluster (per node in cluster). + distanceAmplification: 0.1, // (multiplier PNiC) | factor how much the repulsion distance of a cluster increases (per node in cluster). + edgeGrowth: 20, // (px PNiC) | amount of clusterSize connected to the edge is multiplied with this and added to edgeLength. + nodeScaling: {width: 1, // (px PNiC) | growth of the width per node in cluster. + height: 1, // (px PNiC) | growth of the height per node in cluster. + radius: 1}, // (px PNiC) | growth of the radius per node in cluster. + maxNodeSizeIncrements: 600, // (# increments) | max growth of the width per node in cluster. + activeAreaBoxSize: 80, // (px) | box area around the curser where clusters are popped open. + clusterLevelDifference: 2 + }, + navigation: { + enabled: false + }, + keyboard: { + enabled: false, + speed: {x: 10, y: 10, zoom: 0.02} + }, + dataManipulation: { + enabled: false, + initiallyVisible: false + }, + hierarchicalLayout: { + enabled:false, + levelSeparation: 150, + nodeSpacing: 100, + direction: "UD" // UD, DU, LR, RL + }, + freezeForStabilization: false, + smoothCurves: { + enabled: true, + dynamic: true, + type: "continuous", + roundness: 0.5 + }, + dynamicSmoothCurves: true, + maxVelocity: 30, + minVelocity: 0.1, // px/s + stabilize: true, // stabilize before displaying the network + stabilizationIterations: 1000, // maximum number of iteration to stabilize + locale: 'en', + locales: locales, + tooltip: { + delay: 300, + fontColor: 'black', + fontSize: 14, // px + fontFace: 'verdana', + color: { + border: '#666', + background: '#FFFFC6' } - } + }, + dragNetwork: true, + dragNodes: true, + zoomable: true, + hover: false, + hideEdgesOnDrag: false, + hideNodesOnDrag: false, + width : '100%', + height : '100%', + selectable: true + }; + this.constants = util.extend({}, this.defaultOptions); - /** - * finds all callbacks that match based on the keycode, modifiers, - * and action - * - * @param {string} character - * @param {Array} modifiers - * @param {string} action - * @param {boolean=} remove - should we remove any matches - * @param {string=} combination - * @returns {Array} - */ - function _getMatches(character, modifiers, action, remove, combination) { - var i, - callback, - matches = []; + this.hoverObj = {nodes:{},edges:{}}; + this.controlNodesActive = false; - // if there are no events related to this keycode - if (!_callbacks[character]) { - return []; - } + // Node variables + var network = this; + this.groups = new Groups(); // object with groups + this.images = new Images(); // object with images + this.images.setOnloadCallback(function () { + network._redraw(); + }); - // if a modifier key is coming up on its own we should allow it - if (action == 'keyup' && _isModifier(character)) { - modifiers = [character]; - } + // keyboard navigation variables + this.xIncrement = 0; + this.yIncrement = 0; + this.zoomIncrement = 0; - // loop through all callbacks for the key that was pressed - // and see if any of them match - for (i = 0; i < _callbacks[character].length; ++i) { - callback = _callbacks[character][i]; + // loading all the mixins: + // load the force calculation functions, grouped under the physics system. + this._loadPhysicsSystem(); + // create a frame and canvas + this._create(); + // load the sector system. (mandatory, fully integrated with Network) + this._loadSectorSystem(); + // load the cluster system. (mandatory, even when not using the cluster system, there are function calls to it) + this._loadClusterSystem(); + // load the selection system. (mandatory, required by Network) + this._loadSelectionSystem(); + // load the selection system. (mandatory, required by Network) + this._loadHierarchySystem(); - // if this is a sequence but it is not at the right level - // then move onto the next match - if (callback.seq && _sequence_levels[callback.seq] != callback.level) { - continue; - } + // apply options + this._setTranslation(this.frame.clientWidth / 2, this.frame.clientHeight / 2); + this._setScale(1); + this.setOptions(options); - // if the action we are looking for doesn't match the action we got - // then we should keep going - if (action != callback.action) { - continue; - } + // other vars + this.freezeSimulation = false;// freeze the simulation + this.cachedFunctions = {}; - // if this is a keypress event that means that we need to only - // look at the character, otherwise check the modifiers as - // well - if (action == 'keypress' || _modifiersMatch(modifiers, callback.modifiers)) { + // containers for nodes and edges + this.calculationNodes = {}; + this.calculationNodeIndices = []; + this.nodeIndices = []; // array with all the indices of the nodes. Used to speed up forces calculation + this.nodes = {}; // object with Node objects + this.edges = {}; // object with Edge objects - // remove is used so if you change your mind and call bind a - // second time with a new function the first one is overwritten - if (remove && callback.combo == combination) { - _callbacks[character].splice(i, 1); - } + // position and scale variables and objects + this.canvasTopLeft = {"x": 0,"y": 0}; // coordinates of the top left of the canvas. they will be set during _redraw. + this.canvasBottomRight = {"x": 0,"y": 0}; // coordinates of the bottom right of the canvas. they will be set during _redraw + this.pointerPosition = {"x": 0,"y": 0}; // coordinates of the bottom right of the canvas. they will be set during _redraw + this.areaCenter = {}; // object with x and y elements used for determining the center of the zoom action + this.scale = 1; // defining the global scale variable in the constructor + this.previousScale = this.scale; // this is used to check if the zoom operation is zooming in or out - matches.push(callback); - } - } + // datasets or dataviews + this.nodesData = null; // A DataSet or DataView + this.edgesData = null; // A DataSet or DataView - return matches; - } + // create event listeners used to subscribe on the DataSets of the nodes and edges + this.nodesListeners = { + 'add': function (event, params) { + network._addNodes(params.items); + network.start(); + }, + 'update': function (event, params) { + network._updateNodes(params.items); + network.start(); + }, + 'remove': function (event, params) { + network._removeNodes(params.items); + network.start(); + } + }; + this.edgesListeners = { + 'add': function (event, params) { + network._addEdges(params.items); + network.start(); + }, + 'update': function (event, params) { + network._updateEdges(params.items); + network.start(); + }, + 'remove': function (event, params) { + network._removeEdges(params.items); + network.start(); + } + }; - /** - * takes a key event and figures out what the modifiers are - * - * @param {Event} e - * @returns {Array} - */ - function _eventModifiers(e) { - var modifiers = []; + // properties for the animation + this.moving = true; + this.timer = undefined; // Scheduling function. Is definded in this.start(); - if (e.shiftKey) { - modifiers.push('shift'); - } + // load data (the disable start variable will be the same as the enabled clustering) + this.setData(data,this.constants.clustering.enabled || this.constants.hierarchicalLayout.enabled); - if (e.altKey) { - modifiers.push('alt'); - } + // hierarchical layout + this.initializing = false; + if (this.constants.hierarchicalLayout.enabled == true) { + this._setupHierarchicalLayout(); + } + else { + // zoom so all data will fit on the screen, if clustering is enabled, we do not want start to be called here. + if (this.constants.stabilize == false) { + this.zoomExtent(true,this.constants.clustering.enabled); + } + } - if (e.ctrlKey) { - modifiers.push('ctrl'); - } + // if clustering is disabled, the simulation will have started in the setData function + if (this.constants.clustering.enabled) { + this.startWithClustering(); + } + } - if (e.metaKey) { - modifiers.push('meta'); - } + // Extend Network with an Emitter mixin + Emitter(Network.prototype); - return modifiers; + /** + * Get the script path where the vis.js library is located + * + * @returns {string | null} path Path or null when not found. Path does not + * end with a slash. + * @private + */ + Network.prototype._getScriptPath = function() { + var scripts = document.getElementsByTagName( 'script' ); + + // find script named vis.js or vis.min.js + for (var i = 0; i < scripts.length; i++) { + var src = scripts[i].src; + var match = src && /\/?vis(.min)?\.js$/.exec(src); + if (match) { + // return path without the script name + return src.substring(0, src.length - match[0].length); + } } - /** - * actually calls the callback function - * - * if your callback function returns false this will use the jquery - * convention - prevent default and stop propogation on the event - * - * @param {Function} callback - * @param {Event} e - * @returns void - */ - function _fireCallback(callback, e) { - if (callback(e) === false) { - if (e.preventDefault) { - e.preventDefault(); - } + return null; + }; - if (e.stopPropagation) { - e.stopPropagation(); - } - e.returnValue = false; - e.cancelBubble = true; - } + /** + * Find the center position of the network + * @private + */ + Network.prototype._getRange = function() { + var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (minX > (node.x)) {minX = node.x;} + if (maxX < (node.x)) {maxX = node.x;} + if (minY > (node.y)) {minY = node.y;} + if (maxY < (node.y)) {maxY = node.y;} + } + } + if (minX == 1e9 && maxX == -1e9 && minY == 1e9 && maxY == -1e9) { + minY = 0, maxY = 0, minX = 0, maxX = 0; } + return {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; + }; - /** - * handles a character key event - * - * @param {string} character - * @param {Event} e - * @returns void - */ - function _handleCharacter(character, e) { - // if this event should not happen stop here - if (_stop(e)) { - return; - } + /** + * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; + * @returns {{x: number, y: number}} + * @private + */ + Network.prototype._findCenter = function(range) { + return {x: (0.5 * (range.maxX + range.minX)), + y: (0.5 * (range.maxY + range.minY))}; + }; - var callbacks = _getMatches(character, _eventModifiers(e), e.type), - i, - do_not_reset = {}, - processed_sequence_callback = false; - // loop through matching callbacks for this key event - for (i = 0; i < callbacks.length; ++i) { + /** + * center the network + * + * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; + */ + Network.prototype._centerNetwork = function(range) { + var center = this._findCenter(range); - // fire for all sequence callbacks - // this is because if for example you have multiple sequences - // bound such as "g i" and "g t" they both need to fire the - // callback for matching g cause otherwise you can only ever - // match the first one - if (callbacks[i].seq) { - processed_sequence_callback = true; + center.x *= this.scale; + center.y *= this.scale; + center.x -= 0.5 * this.frame.canvas.clientWidth; + center.y -= 0.5 * this.frame.canvas.clientHeight; - // keep a list of which sequences were matches for later - do_not_reset[callbacks[i].seq] = 1; - _fireCallback(callbacks[i].callback, e); - continue; - } + this._setTranslation(-center.x,-center.y); // set at 0,0 + }; - // if there were no sequence matches but we are still here - // that means this is a regular match so we should fire that - if (!processed_sequence_callback && !_inside_sequence) { - _fireCallback(callbacks[i].callback, e); - } - } - // if you are inside of a sequence and the key you are pressing - // is not a modifier key then we should reset all sequences - // that were not matched by this key event - if (e.type == _inside_sequence && !_isModifier(character)) { - _resetSequences(do_not_reset); - } + /** + * This function zooms out to fit all data on screen based on amount of nodes + * + * @param {Boolean} [initialZoom] | zoom based on fitted formula or range, true = fitted, default = false; + * @param {Boolean} [disableStart] | If true, start is not called. + */ + Network.prototype.zoomExtent = function(initialZoom, disableStart) { + if (initialZoom === undefined) { + initialZoom = false; + } + if (disableStart === undefined) { + disableStart = false; } - /** - * handles a keydown event - * - * @param {Event} e - * @returns void - */ - function _handleKey(e) { - - // normalize e.which for key events - // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion - e.which = typeof e.which == "number" ? e.which : e.keyCode; - - var character = _characterFromEvent(e); + var range = this._getRange(); + var zoomLevel; - // no character found then stop - if (!character) { - return; + if (initialZoom == true) { + var numberOfNodes = this.nodeIndices.length; + if (this.constants.smoothCurves == true) { + if (this.constants.clustering.enabled == true && + numberOfNodes >= this.constants.clustering.initialMaxNodes) { + zoomLevel = 49.07548 / (numberOfNodes + 142.05338) + 9.1444e-04; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. } - - if (e.type == 'keyup' && _ignore_next_keyup == character) { - _ignore_next_keyup = false; - return; + else { + zoomLevel = 12.662 / (numberOfNodes + 7.4147) + 0.0964822; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. } + } + else { + if (this.constants.clustering.enabled == true && + numberOfNodes >= this.constants.clustering.initialMaxNodes) { + zoomLevel = 77.5271985 / (numberOfNodes + 187.266146) + 4.76710517e-05; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. + } + else { + zoomLevel = 30.5062972 / (numberOfNodes + 19.93597763) + 0.08413486; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. + } + } - _handleCharacter(character, e); + // correct for larger canvasses. + var factor = Math.min(this.frame.canvas.clientWidth / 600, this.frame.canvas.clientHeight / 600); + zoomLevel *= factor; } + else { + var xDistance = (Math.abs(range.minX) + Math.abs(range.maxX)) * 1.1; + var yDistance = (Math.abs(range.minY) + Math.abs(range.maxY)) * 1.1; - /** - * determines if the keycode specified is a modifier key or not - * - * @param {string} key - * @returns {boolean} - */ - function _isModifier(key) { - return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta'; - } + var xZoomLevel = this.frame.canvas.clientWidth / xDistance; + var yZoomLevel = this.frame.canvas.clientHeight / yDistance; - /** - * called to set a 1 second timeout on the specified sequence - * - * this is so after each key press in the sequence you have 1 second - * to press the next key before you have to start over - * - * @returns void - */ - function _resetSequenceTimer() { - clearTimeout(_reset_timer); - _reset_timer = setTimeout(_resetSequences, 1000); + zoomLevel = (xZoomLevel <= yZoomLevel) ? xZoomLevel : yZoomLevel; } - /** - * reverses the map lookup so that we can look for specific keys - * to see what can and can't use keypress - * - * @return {Object} - */ - function _getReverseMap() { - if (!_REVERSE_MAP) { - _REVERSE_MAP = {}; - for (var key in _MAP) { - - // pull out the numeric keypad from here cause keypress should - // be able to detect the keys from the character - if (key > 95 && key < 112) { - continue; - } - - if (_MAP.hasOwnProperty(key)) { - _REVERSE_MAP[_MAP[key]] = key; - } - } - } - return _REVERSE_MAP; + if (zoomLevel > 1.0) { + zoomLevel = 1.0; } - /** - * picks the best action based on the key combination - * - * @param {string} key - character for key - * @param {Array} modifiers - * @param {string=} action passed in - */ - function _pickBestAction(key, modifiers, action) { - - // if no action was picked in we should try to pick the one - // that we think would work best for this key - if (!action) { - action = _getReverseMap()[key] ? 'keydown' : 'keypress'; - } - - // modifier keys don't work as expected with keypress, - // switch to keydown - if (action == 'keypress' && modifiers.length) { - action = 'keydown'; - } - return action; + this._setScale(zoomLevel); + this._centerNetwork(range); + if (disableStart == false) { + this.moving = true; + this.start(); } + }; - /** - * binds a key sequence to an event - * - * @param {string} combo - combo specified in bind call - * @param {Array} keys - * @param {Function} callback - * @param {string=} action - * @returns void - */ - function _bindSequence(combo, keys, callback, action) { - - // start off by adding a sequence level record for this combination - // and setting the level to 0 - _sequence_levels[combo] = 0; - // if there is no action pick the best one for the first key - // in the sequence - if (!action) { - action = _pickBestAction(keys[0], []); - } + /** + * Update the this.nodeIndices with the most recent node index list + * @private + */ + Network.prototype._updateNodeIndexList = function() { + this._clearNodeIndexList(); + for (var idx in this.nodes) { + if (this.nodes.hasOwnProperty(idx)) { + this.nodeIndices.push(idx); + } + } + }; - /** - * callback to increase the sequence level for this sequence and reset - * all other sequences that were active - * - * @param {Event} e - * @returns void - */ - var _increaseSequence = function(e) { - _inside_sequence = action; - ++_sequence_levels[combo]; - _resetSequenceTimer(); - }, - /** - * wraps the specified callback inside of another function in order - * to reset all sequence counters as soon as this sequence is done - * - * @param {Event} e - * @returns void - */ - _callbackAndReset = function(e) { - _fireCallback(callback, e); + /** + * Set nodes and edges, and optionally options as well. + * + * @param {Object} data Object containing parameters: + * {Array | DataSet | DataView} [nodes] Array with nodes + * {Array | DataSet | DataView} [edges] Array with edges + * {String} [dot] String containing data in DOT format + * {String} [gephi] String containing data in gephi JSON format + * {Options} [options] Object with options + * @param {Boolean} [disableStart] | optional: disable the calling of the start function. + */ + Network.prototype.setData = function(data, disableStart) { + if (disableStart === undefined) { + disableStart = false; + } - // we should ignore the next key up if the action is key down - // or keypress. this is so if you finish a sequence and - // release the key the final key will not trigger a keyup - if (action !== 'keyup') { - _ignore_next_keyup = _characterFromEvent(e); - } + if (data && data.dot && (data.nodes || data.edges)) { + throw new SyntaxError('Data must contain either parameter "dot" or ' + + ' parameter pair "nodes" and "edges", but not both.'); + } - // weird race condition if a sequence ends with the key - // another sequence begins with - setTimeout(_resetSequences, 10); - }, - i; + // set options + this.setOptions(data && data.options); - // loop through keys one at a time and bind the appropriate callback - // function. for any key leading up to the final one it should - // increase the sequence. after the final, it should reset all sequences - for (i = 0; i < keys.length; ++i) { - _bindSingle(keys[i], i < keys.length - 1 ? _increaseSequence : _callbackAndReset, action, combo, i); - } + // set all data + if (data && data.dot) { + // parse DOT file + if(data && data.dot) { + var dotData = dotparser.DOTToGraph(data.dot); + this.setData(dotData); + return; + } + } + else if (data && data.gephi) { + // parse DOT file + if(data && data.gephi) { + var gephiData = gephiParser.parseGephi(data.gephi); + this.setData(gephiData); + return; + } + } + else { + this._setNodes(data && data.nodes); + this._setEdges(data && data.edges); } - /** - * binds a single keyboard combination - * - * @param {string} combination - * @param {Function} callback - * @param {string=} action - * @param {string=} sequence_name - name of sequence if part of sequence - * @param {number=} level - what part of the sequence the command is - * @returns void - */ - function _bindSingle(combination, callback, action, sequence_name, level) { + this._putDataInSector(); + if (!disableStart) { + // find a stable position or start animating to a stable position + if (this.constants.stabilize) { + var me = this; + setTimeout(function() {me._stabilize(); me.start();},0) + } + else { + this.start(); + } + } + }; - // make sure multiple spaces in a row become a single space - combination = combination.replace(/\s+/g, ' '); + /** + * Set options + * @param {Object} options + */ + Network.prototype.setOptions = function (options) { + if (options) { + var prop; - var sequence = combination.split(' '), - i, - key, - keys, - modifiers = []; + var fields = ['nodes','edges','smoothCurves','hierarchicalLayout','clustering','navigation','keyboard','dataManipulation', + 'onAdd','onEdit','onEditEdge','onConnect','onDelete','clickToUse' + ]; + util.selectiveNotDeepExtend(fields,this.constants, options); + util.selectiveNotDeepExtend(['color'],this.constants.nodes, options.nodes); + util.selectiveNotDeepExtend(['color','length'],this.constants.edges, options.edges); - // if this pattern is a sequence of keys then run through this method - // to reprocess each pattern one key at a time - if (sequence.length > 1) { - return _bindSequence(combination, sequence, callback, action); + if (options.physics) { + util.mergeOptions(this.constants.physics, options.physics,'barnesHut'); + util.mergeOptions(this.constants.physics, options.physics,'repulsion'); + + if (options.physics.hierarchicalRepulsion) { + this.constants.hierarchicalLayout.enabled = true; + this.constants.physics.hierarchicalRepulsion.enabled = true; + this.constants.physics.barnesHut.enabled = false; + for (prop in options.physics.hierarchicalRepulsion) { + if (options.physics.hierarchicalRepulsion.hasOwnProperty(prop)) { + this.constants.physics.hierarchicalRepulsion[prop] = options.physics.hierarchicalRepulsion[prop]; + } + } } + } - // take the keys from this pattern and figure out what the actual - // pattern is all about - keys = combination === '+' ? ['+'] : combination.split('+'); + if (options.onAdd) {this.triggerFunctions.add = options.onAdd;} + if (options.onEdit) {this.triggerFunctions.edit = options.onEdit;} + if (options.onEditEdge) {this.triggerFunctions.editEdge = options.onEditEdge;} + if (options.onConnect) {this.triggerFunctions.connect = options.onConnect;} + if (options.onDelete) {this.triggerFunctions.del = options.onDelete;} - for (i = 0; i < keys.length; ++i) { - key = keys[i]; + util.mergeOptions(this.constants, options,'smoothCurves'); + util.mergeOptions(this.constants, options,'hierarchicalLayout'); + util.mergeOptions(this.constants, options,'clustering'); + util.mergeOptions(this.constants, options,'navigation'); + util.mergeOptions(this.constants, options,'keyboard'); + util.mergeOptions(this.constants, options,'dataManipulation'); - // normalize key names - if (_SPECIAL_ALIASES[key]) { - key = _SPECIAL_ALIASES[key]; - } - // if this is not a keypress event then we should - // be smart about using shift keys - // this will only work for US keyboards however - if (action && action != 'keypress' && _SHIFT_MAP[key]) { - key = _SHIFT_MAP[key]; - modifiers.push('shift'); - } + if (options.dataManipulation) { + this.editMode = this.constants.dataManipulation.initiallyVisible; + } - // if this key is a modifier then add it to the list of modifiers - if (_isModifier(key)) { - modifiers.push(key); - } + + // TODO: work out these options and document them + if (options.edges) { + if (options.edges.color !== undefined) { + if (util.isString(options.edges.color)) { + this.constants.edges.color = {}; + this.constants.edges.color.color = options.edges.color; + this.constants.edges.color.highlight = options.edges.color; + this.constants.edges.color.hover = options.edges.color; + } + else { + if (options.edges.color.color !== undefined) {this.constants.edges.color.color = options.edges.color.color;} + if (options.edges.color.highlight !== undefined) {this.constants.edges.color.highlight = options.edges.color.highlight;} + if (options.edges.color.hover !== undefined) {this.constants.edges.color.hover = options.edges.color.hover;} + } } - // depending on what the key combination is - // we will try to pick the best event for it - action = _pickBestAction(key, modifiers, action); + if (!options.edges.fontColor) { + if (options.edges.color !== undefined) { + if (util.isString(options.edges.color)) {this.constants.edges.fontColor = options.edges.color;} + else if (options.edges.color.color !== undefined) {this.constants.edges.fontColor = options.edges.color.color;} + } + } + } - // make sure to initialize array if this is the first time - // a callback is added for this key - if (!_callbacks[key]) { - _callbacks[key] = []; + if (options.nodes) { + if (options.nodes.color) { + var newColorObj = util.parseColor(options.nodes.color); + this.constants.nodes.color.background = newColorObj.background; + this.constants.nodes.color.border = newColorObj.border; + this.constants.nodes.color.highlight.background = newColorObj.highlight.background; + this.constants.nodes.color.highlight.border = newColorObj.highlight.border; + this.constants.nodes.color.hover.background = newColorObj.hover.background; + this.constants.nodes.color.hover.border = newColorObj.hover.border; + } + } + if (options.groups) { + for (var groupname in options.groups) { + if (options.groups.hasOwnProperty(groupname)) { + var group = options.groups[groupname]; + this.groups.add(groupname, group); + } } + } - // remove an existing match if there is one - _getMatches(key, modifiers, action, !sequence_name, combination); + if (options.tooltip) { + for (prop in options.tooltip) { + if (options.tooltip.hasOwnProperty(prop)) { + this.constants.tooltip[prop] = options.tooltip[prop]; + } + } + if (options.tooltip.color) { + this.constants.tooltip.color = util.parseColor(options.tooltip.color); + } + } - // add this call back to the array - // if it is a sequence put it at the beginning - // if not put it at the end - // - // this is important because the way these are processed expects - // the sequence ones to come first - _callbacks[key][sequence_name ? 'unshift' : 'push']({ - callback: callback, - modifiers: modifiers, - action: action, - seq: sequence_name, - level: level, - combo: combination - }); + if ('clickToUse' in options) { + if (options.clickToUse) { + this.activator = new Activator(this.frame); + this.activator.on('change', this._createKeyBinds.bind(this)); + } + else { + if (this.activator) { + this.activator.destroy(); + delete this.activator; + } + } + } + + if (options.labels) { + throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.'); + } } - /** - * binds multiple combinations to the same callback - * - * @param {Array} combinations - * @param {Function} callback - * @param {string|undefined} action - * @returns void - */ - function _bindMultiple(combinations, callback, action) { - for (var i = 0; i < combinations.length; ++i) { - _bindSingle(combinations[i], callback, action); - } + // (Re)loading the mixins that can be enabled or disabled in the options. + // load the force calculation functions, grouped under the physics system. + this._loadPhysicsSystem(); + // load the navigation system. + this._loadNavigationControls(); + // load the data manipulation system + this._loadManipulationSystem(); + // configure the smooth curves + this._configureSmoothCurves(); + + + // bind keys. If disabled, this will not do anything; + this._createKeyBinds(); + this.setSize(this.constants.width, this.constants.height); + this.moving = true; + this.start(); + + }; + + /** + * Create the main frame for the Network. + * This function is executed once when a Network object is created. The frame + * contains a canvas, and this canvas contains all objects like the axis and + * nodes. + * @private + */ + Network.prototype._create = function () { + // remove all elements from the container element. + while (this.containerElement.hasChildNodes()) { + this.containerElement.removeChild(this.containerElement.firstChild); } - // start! - _addEvent(document, 'keypress', _handleKey); - _addEvent(document, 'keydown', _handleKey); - _addEvent(document, 'keyup', _handleKey); + this.frame = document.createElement('div'); + this.frame.className = 'vis network-frame'; + this.frame.style.position = 'relative'; + this.frame.style.overflow = 'hidden'; - var mousetrap = { + // create the network canvas (HTML canvas element) + this.frame.canvas = document.createElement( 'canvas' ); + this.frame.canvas.style.position = 'relative'; + this.frame.appendChild(this.frame.canvas); + if (!this.frame.canvas.getContext) { + var noCanvas = document.createElement( 'DIV' ); + noCanvas.style.color = 'red'; + noCanvas.style.fontWeight = 'bold' ; + noCanvas.style.padding = '10px'; + noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; + this.frame.canvas.appendChild(noCanvas); + } - /** - * binds an event to mousetrap - * - * can be a single key, a combination of keys separated with +, - * a comma separated list of keys, an array of keys, or - * a sequence of keys separated by spaces - * - * be sure to list the modifier keys first to make sure that the - * correct key ends up getting bound (the last key in the pattern) - * - * @param {string|Array} keys - * @param {Function} callback - * @param {string=} action - 'keypress', 'keydown', or 'keyup' - * @returns void - */ - bind: function(keys, callback, action) { - _bindMultiple(keys instanceof Array ? keys : [keys], callback, action); - _direct_map[keys + ':' + action] = callback; - return this; - }, + var me = this; + this.drag = {}; + this.pinch = {}; + this.hammer = Hammer(this.frame.canvas, { + prevent_default: true + }); + this.hammer.on('tap', me._onTap.bind(me) ); + this.hammer.on('doubletap', me._onDoubleTap.bind(me) ); + this.hammer.on('hold', me._onHold.bind(me) ); + this.hammer.on('pinch', me._onPinch.bind(me) ); + this.hammer.on('touch', me._onTouch.bind(me) ); + this.hammer.on('dragstart', me._onDragStart.bind(me) ); + this.hammer.on('drag', me._onDrag.bind(me) ); + this.hammer.on('dragend', me._onDragEnd.bind(me) ); + this.hammer.on('release', me._onRelease.bind(me) ); + this.hammer.on('mousewheel',me._onMouseWheel.bind(me) ); + this.hammer.on('DOMMouseScroll',me._onMouseWheel.bind(me) ); // for FF + this.hammer.on('mousemove', me._onMouseMoveTitle.bind(me) ); - /** - * unbinds an event to mousetrap - * - * the unbinding sets the callback function of the specified key combo - * to an empty function and deletes the corresponding key in the - * _direct_map dict. - * - * the keycombo+action has to be exactly the same as - * it was defined in the bind method - * - * TODO: actually remove this from the _callbacks dictionary instead - * of binding an empty function - * - * @param {string|Array} keys - * @param {string} action - * @returns void - */ - unbind: function(keys, action) { - if (_direct_map[keys + ':' + action]) { - delete _direct_map[keys + ':' + action]; - this.bind(keys, function() {}, action); - } - return this; - }, + // add the frame to the container element + this.containerElement.appendChild(this.frame); - /** - * triggers an event that has already been bound - * - * @param {string} keys - * @param {string=} action - * @returns void - */ - trigger: function(keys, action) { - _direct_map[keys + ':' + action](); - return this; - }, + }; - /** - * resets the library back to its initial state. this is useful - * if you want to clear out the current keyboard shortcuts and bind - * new ones - for example if you switch to another page - * - * @returns void - */ - reset: function() { - _callbacks = {}; - _direct_map = {}; - return this; - } - }; - module.exports = mousetrap; + /** + * Binding the keys for keyboard navigation. These functions are defined in the NavigationMixin + * @private + */ + Network.prototype._createKeyBinds = function() { + var me = this; + this.mousetrap = mousetrap; + this.mousetrap.reset(); + if (this.constants.keyboard.enabled && this.isActive()) { + this.mousetrap.bind("up", this._moveUp.bind(me) , "keydown"); + this.mousetrap.bind("up", this._yStopMoving.bind(me), "keyup"); + this.mousetrap.bind("down", this._moveDown.bind(me) , "keydown"); + this.mousetrap.bind("down", this._yStopMoving.bind(me), "keyup"); + this.mousetrap.bind("left", this._moveLeft.bind(me) , "keydown"); + this.mousetrap.bind("left", this._xStopMoving.bind(me), "keyup"); + this.mousetrap.bind("right",this._moveRight.bind(me), "keydown"); + this.mousetrap.bind("right",this._xStopMoving.bind(me), "keyup"); + this.mousetrap.bind("=", this._zoomIn.bind(me), "keydown"); + this.mousetrap.bind("=", this._stopZoom.bind(me), "keyup"); + this.mousetrap.bind("-", this._zoomOut.bind(me), "keydown"); + this.mousetrap.bind("-", this._stopZoom.bind(me), "keyup"); + this.mousetrap.bind("[", this._zoomIn.bind(me), "keydown"); + this.mousetrap.bind("[", this._stopZoom.bind(me), "keyup"); + this.mousetrap.bind("]", this._zoomOut.bind(me), "keydown"); + this.mousetrap.bind("]", this._stopZoom.bind(me), "keyup"); + this.mousetrap.bind("pageup",this._zoomIn.bind(me), "keydown"); + this.mousetrap.bind("pageup",this._stopZoom.bind(me), "keyup"); + this.mousetrap.bind("pagedown",this._zoomOut.bind(me),"keydown"); + this.mousetrap.bind("pagedown",this._stopZoom.bind(me), "keyup"); + } -/***/ }, -/* 51 */ -/***/ function(module, exports, __webpack_require__) { + if (this.constants.dataManipulation.enabled == true) { + this.mousetrap.bind("escape",this._createManipulatorBar.bind(me)); + this.mousetrap.bind("del",this._deleteSelected.bind(me)); + } + }; - var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(global, module) {//! moment.js - //! version : 2.7.0 - //! authors : Tim Wood, Iskren Chernev, Moment.js contributors - //! license : MIT - //! momentjs.com + /** + * Get the pointer location from a touch location + * @param {{pageX: Number, pageY: Number}} touch + * @return {{x: Number, y: Number}} pointer + * @private + */ + Network.prototype._getPointer = function (touch) { + return { + x: touch.pageX - util.getAbsoluteLeft(this.frame.canvas), + y: touch.pageY - util.getAbsoluteTop(this.frame.canvas) + }; + }; - (function (undefined) { + /** + * On start of a touch gesture, store the pointer + * @param event + * @private + */ + Network.prototype._onTouch = function (event) { + this.drag.pointer = this._getPointer(event.gesture.center); + this.drag.pinched = false; + this.pinch.scale = this._getScale(); - /************************************ - Constants - ************************************/ + this._handleTouch(this.drag.pointer); + }; - var moment, - VERSION = "2.7.0", - // the global-scope this is NOT the global object in Node.js - globalScope = typeof global !== 'undefined' ? global : this, - oldGlobalMoment, - round = Math.round, - i, + /** + * handle drag start event + * @private + */ + Network.prototype._onDragStart = function () { + this._handleDragStart(); + }; - YEAR = 0, - MONTH = 1, - DATE = 2, - HOUR = 3, - MINUTE = 4, - SECOND = 5, - MILLISECOND = 6, - // internal storage for language config files - languages = {}, + /** + * This function is called by _onDragStart. + * It is separated out because we can then overload it for the datamanipulation system. + * + * @private + */ + Network.prototype._handleDragStart = function() { + var drag = this.drag; + var node = this._getNodeAt(drag.pointer); + // note: drag.pointer is set in _onTouch to get the initial touch location - // moment internal properties - momentProperties = { - _isAMomentObject: null, - _i : null, - _f : null, - _l : null, - _strict : null, - _tzm : null, - _isUTC : null, - _offset : null, // optional. Combine with _isUTC - _pf : null, - _lang : null // optional - }, + drag.dragging = true; + drag.selection = []; + drag.translation = this._getTranslation(); + drag.nodeId = null; - // check for nodeJS - hasModule = (typeof module !== 'undefined' && module.exports), + if (node != null) { + drag.nodeId = node.id; + // select the clicked node if not yet selected + if (!node.isSelected()) { + this._selectObject(node,false); + } - // ASP.NET json date format regex - aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, - aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, + // create an array with the selected nodes and their original location and status + for (var objectId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(objectId)) { + var object = this.selectionObj.nodes[objectId]; + var s = { + id: object.id, + node: object, - // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html - // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere - isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, + // store original x, y, xFixed and yFixed, make the node temporarily Fixed + x: object.x, + y: object.y, + xFixed: object.xFixed, + yFixed: object.yFixed + }; - // format tokens - formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g, - localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g, + object.xFixed = true; + object.yFixed = true; - // parsing token regexes - parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 - parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 - parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 - parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 - parseTokenDigits = /\d+/, // nonzero number of digits - parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. - parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z - parseTokenT = /T/i, // T (ISO separator) - parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 - parseTokenOrdinal = /\d{1,2}/, + drag.selection.push(s); + } + } + } + }; - //strict parsing regexes - parseTokenOneDigit = /\d/, // 0 - 9 - parseTokenTwoDigits = /\d\d/, // 00 - 99 - parseTokenThreeDigits = /\d{3}/, // 000 - 999 - parseTokenFourDigits = /\d{4}/, // 0000 - 9999 - parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 - parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf - // iso 8601 regex - // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) - isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, + /** + * handle drag event + * @private + */ + Network.prototype._onDrag = function (event) { + this._handleOnDrag(event) + }; - isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', - isoDates = [ - ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/], - ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/], - ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/], - ['GGGG-[W]WW', /\d{4}-W\d{2}/], - ['YYYY-DDD', /\d{4}-\d{3}/] - ], + /** + * This function is called by _onDrag. + * It is separated out because we can then overload it for the datamanipulation system. + * + * @private + */ + Network.prototype._handleOnDrag = function(event) { + if (this.drag.pinched) { + return; + } + + var pointer = this._getPointer(event.gesture.center); - // iso time formats and regexes - isoTimes = [ - ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], - ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], - ['HH:mm', /(T| )\d\d:\d\d/], - ['HH', /(T| )\d\d/] - ], + var me = this; + var drag = this.drag; + var selection = drag.selection; + if (selection && selection.length && this.constants.dragNodes == true) { + // calculate delta's and new location + var deltaX = pointer.x - drag.pointer.x; + var deltaY = pointer.y - drag.pointer.y; - // timezone chunker "+10:00" > ["10", "00"] or "-1530" > ["-15", "30"] - parseTimezoneChunker = /([\+\-]|\d\d)/gi, + // update position of all selected nodes + selection.forEach(function (s) { + var node = s.node; - // getter and setter names - proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), - unitMillisecondFactors = { - 'Milliseconds' : 1, - 'Seconds' : 1e3, - 'Minutes' : 6e4, - 'Hours' : 36e5, - 'Days' : 864e5, - 'Months' : 2592e6, - 'Years' : 31536e6 - }, + if (!s.xFixed) { + node.x = me._XconvertDOMtoCanvas(me._XconvertCanvasToDOM(s.x) + deltaX); + } - unitAliases = { - ms : 'millisecond', - s : 'second', - m : 'minute', - h : 'hour', - d : 'day', - D : 'date', - w : 'week', - W : 'isoWeek', - M : 'month', - Q : 'quarter', - y : 'year', - DDD : 'dayOfYear', - e : 'weekday', - E : 'isoWeekday', - gg: 'weekYear', - GG: 'isoWeekYear' - }, + if (!s.yFixed) { + node.y = me._YconvertDOMtoCanvas(me._YconvertCanvasToDOM(s.y) + deltaY); + } + }); - camelFunctions = { - dayofyear : 'dayOfYear', - isoweekday : 'isoWeekday', - isoweek : 'isoWeek', - weekyear : 'weekYear', - isoweekyear : 'isoWeekYear' - }, - // format function strings - formatFunctions = {}, + // start _animationStep if not yet running + if (!this.moving) { + this.moving = true; + this.start(); + } + } + else { + if (this.constants.dragNetwork == true) { + // move the network + var diffX = pointer.x - this.drag.pointer.x; + var diffY = pointer.y - this.drag.pointer.y; - // default relative time thresholds - relativeTimeThresholds = { - s: 45, //seconds to minutes - m: 45, //minutes to hours - h: 22, //hours to days - dd: 25, //days to month (month == 1) - dm: 45, //days to months (months > 1) - dy: 345 //days to year - }, + this._setTranslation( + this.drag.translation.x + diffX, + this.drag.translation.y + diffY + ); + this._redraw(); + // this.moving = true; + // this.start(); + } + } + }; - // tokens to ordinalize and pad - ordinalizeTokens = 'DDD w W M D d'.split(' '), - paddedTokens = 'M D H h m s w W'.split(' '), + /** + * handle drag start event + * @private + */ + Network.prototype._onDragEnd = function () { + this.drag.dragging = false; + var selection = this.drag.selection; + if (selection && selection.length) { + selection.forEach(function (s) { + // restore original xFixed and yFixed + s.node.xFixed = s.xFixed; + s.node.yFixed = s.yFixed; + }); + this.moving = true; + this.start(); + } + else { + this._redraw(); + } - formatTokenFunctions = { - M : function () { - return this.month() + 1; - }, - MMM : function (format) { - return this.lang().monthsShort(this, format); - }, - MMMM : function (format) { - return this.lang().months(this, format); - }, - D : function () { - return this.date(); - }, - DDD : function () { - return this.dayOfYear(); - }, - d : function () { - return this.day(); - }, - dd : function (format) { - return this.lang().weekdaysMin(this, format); - }, - ddd : function (format) { - return this.lang().weekdaysShort(this, format); - }, - dddd : function (format) { - return this.lang().weekdays(this, format); - }, - w : function () { - return this.week(); - }, - W : function () { - return this.isoWeek(); - }, - YY : function () { - return leftZeroFill(this.year() % 100, 2); - }, - YYYY : function () { - return leftZeroFill(this.year(), 4); - }, - YYYYY : function () { - return leftZeroFill(this.year(), 5); - }, - YYYYYY : function () { - var y = this.year(), sign = y >= 0 ? '+' : '-'; - return sign + leftZeroFill(Math.abs(y), 6); - }, - gg : function () { - return leftZeroFill(this.weekYear() % 100, 2); - }, - gggg : function () { - return leftZeroFill(this.weekYear(), 4); - }, - ggggg : function () { - return leftZeroFill(this.weekYear(), 5); - }, - GG : function () { - return leftZeroFill(this.isoWeekYear() % 100, 2); - }, - GGGG : function () { - return leftZeroFill(this.isoWeekYear(), 4); - }, - GGGGG : function () { - return leftZeroFill(this.isoWeekYear(), 5); - }, - e : function () { - return this.weekday(); - }, - E : function () { - return this.isoWeekday(); - }, - a : function () { - return this.lang().meridiem(this.hours(), this.minutes(), true); - }, - A : function () { - return this.lang().meridiem(this.hours(), this.minutes(), false); - }, - H : function () { - return this.hours(); - }, - h : function () { - return this.hours() % 12 || 12; - }, - m : function () { - return this.minutes(); - }, - s : function () { - return this.seconds(); - }, - S : function () { - return toInt(this.milliseconds() / 100); - }, - SS : function () { - return leftZeroFill(toInt(this.milliseconds() / 10), 2); - }, - SSS : function () { - return leftZeroFill(this.milliseconds(), 3); - }, - SSSS : function () { - return leftZeroFill(this.milliseconds(), 3); - }, - Z : function () { - var a = -this.zone(), - b = "+"; - if (a < 0) { - a = -a; - b = "-"; - } - return b + leftZeroFill(toInt(a / 60), 2) + ":" + leftZeroFill(toInt(a) % 60, 2); - }, - ZZ : function () { - var a = -this.zone(), - b = "+"; - if (a < 0) { - a = -a; - b = "-"; - } - return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); - }, - z : function () { - return this.zoneAbbr(); - }, - zz : function () { - return this.zoneName(); - }, - X : function () { - return this.unix(); - }, - Q : function () { - return this.quarter(); - } - }, + }; - lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin']; + /** + * handle tap/click event: select/unselect a node + * @private + */ + Network.prototype._onTap = function (event) { + var pointer = this._getPointer(event.gesture.center); + this.pointerPosition = pointer; + this._handleTap(pointer); - // Pick the first defined of two or three arguments. dfl comes from - // default. - function dfl(a, b, c) { - switch (arguments.length) { - case 2: return a != null ? a : b; - case 3: return a != null ? a : b != null ? b : c; - default: throw new Error("Implement me"); - } - } + }; - function defaultParsingFlags() { - // We need to deep clone this object, and es5 standard is not very - // helpful. - return { - empty : false, - unusedTokens : [], - unusedInput : [], - overflow : -2, - charsLeftOver : 0, - nullInput : false, - invalidMonth : null, - invalidFormat : false, - userInvalidated : false, - iso: false - }; - } - function deprecate(msg, fn) { - var firstTime = true; - function printMsg() { - if (moment.suppressDeprecationWarnings === false && - typeof console !== 'undefined' && console.warn) { - console.warn("Deprecation warning: " + msg); - } - } - return extend(function () { - if (firstTime) { - printMsg(); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); - } + /** + * handle doubletap event + * @private + */ + Network.prototype._onDoubleTap = function (event) { + var pointer = this._getPointer(event.gesture.center); + this._handleDoubleTap(pointer); + }; - function padToken(func, count) { - return function (a) { - return leftZeroFill(func.call(this, a), count); - }; + + /** + * handle long tap event: multi select nodes + * @private + */ + Network.prototype._onHold = function (event) { + var pointer = this._getPointer(event.gesture.center); + this.pointerPosition = pointer; + this._handleOnHold(pointer); + }; + + /** + * handle the release of the screen + * + * @private + */ + Network.prototype._onRelease = function (event) { + var pointer = this._getPointer(event.gesture.center); + this._handleOnRelease(pointer); + }; + + /** + * Handle pinch event + * @param event + * @private + */ + Network.prototype._onPinch = function (event) { + var pointer = this._getPointer(event.gesture.center); + + this.drag.pinched = true; + if (!('scale' in this.pinch)) { + this.pinch.scale = 1; + } + + // TODO: enabled moving while pinching? + var scale = this.pinch.scale * event.gesture.scale; + this._zoom(scale, pointer) + }; + + /** + * Zoom the network in or out + * @param {Number} scale a number around 1, and between 0.01 and 10 + * @param {{x: Number, y: Number}} pointer Position on screen + * @return {Number} appliedScale scale is limited within the boundaries + * @private + */ + Network.prototype._zoom = function(scale, pointer) { + if (this.constants.zoomable == true) { + var scaleOld = this._getScale(); + if (scale < 0.00001) { + scale = 0.00001; } - function ordinalizeToken(func, period) { - return function (a) { - return this.lang().ordinal(func.call(this, a), period); - }; + if (scale > 10) { + scale = 10; } - while (ordinalizeTokens.length) { - i = ordinalizeTokens.pop(); - formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); - } - while (paddedTokens.length) { - i = paddedTokens.pop(); - formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); + var preScaleDragPointer = null; + if (this.drag !== undefined) { + if (this.drag.dragging == true) { + preScaleDragPointer = this.DOMtoCanvas(this.drag.pointer); + } } - formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); + // + this.frame.canvas.clientHeight / 2 + var translation = this._getTranslation(); + var scaleFrac = scale / scaleOld; + var tx = (1 - scaleFrac) * pointer.x + translation.x * scaleFrac; + var ty = (1 - scaleFrac) * pointer.y + translation.y * scaleFrac; - /************************************ - Constructors - ************************************/ + this.areaCenter = {"x" : this._XconvertDOMtoCanvas(pointer.x), + "y" : this._YconvertDOMtoCanvas(pointer.y)}; - function Language() { + this._setScale(scale); + this._setTranslation(tx, ty); + this.updateClustersDefault(); + if (preScaleDragPointer != null) { + var postScaleDragPointer = this.canvasToDOM(preScaleDragPointer); + this.drag.pointer.x = postScaleDragPointer.x; + this.drag.pointer.y = postScaleDragPointer.y; } - // Moment prototype object - function Moment(config) { - checkOverflow(config); - extend(this, config); + this._redraw(); + + if (scaleOld < scale) { + this.emit("zoom", {direction:"+"}); + } + else { + this.emit("zoom", {direction:"-"}); } - // Duration Constructor - function Duration(duration) { - var normalizedInput = normalizeObjectUnits(duration), - years = normalizedInput.year || 0, - quarters = normalizedInput.quarter || 0, - months = normalizedInput.month || 0, - weeks = normalizedInput.week || 0, - days = normalizedInput.day || 0, - hours = normalizedInput.hour || 0, - minutes = normalizedInput.minute || 0, - seconds = normalizedInput.second || 0, - milliseconds = normalizedInput.millisecond || 0; + return scale; + } + }; - // representation for dateAddRemove - this._milliseconds = +milliseconds + - seconds * 1e3 + // 1000 - minutes * 6e4 + // 1000 * 60 - hours * 36e5; // 1000 * 60 * 60 - // Because of dateAddRemove treats 24 hours as different from a - // day when working around DST, we need to store them separately - this._days = +days + - weeks * 7; - // It is impossible translate months into days without knowing - // which months you are are talking about, so we have to store - // it separately. - this._months = +months + - quarters * 3 + - years * 12; - this._data = {}; + /** + * Event handler for mouse wheel event, used to zoom the timeline + * See http://adomas.org/javascript-mouse-wheel/ + * https://github.com/EightMedia/hammer.js/issues/256 + * @param {MouseEvent} event + * @private + */ + Network.prototype._onMouseWheel = function(event) { + // retrieve delta + var delta = 0; + if (event.wheelDelta) { /* IE/Opera. */ + delta = event.wheelDelta/120; + } else if (event.detail) { /* Mozilla case. */ + // In Mozilla, sign of delta is different than in IE. + // Also, delta is multiple of 3. + delta = -event.detail/3; + } - this._bubble(); + // If delta is nonzero, handle it. + // Basically, delta is now positive if wheel was scrolled up, + // and negative, if wheel was scrolled down. + if (delta) { + + // calculate the new scale + var scale = this._getScale(); + var zoom = delta / 10; + if (delta < 0) { + zoom = zoom / (1 - zoom); } + scale *= (1 + zoom); - /************************************ - Helpers - ************************************/ + // calculate the pointer location + var gesture = hammerUtil.fakeGesture(this, event); + var pointer = this._getPointer(gesture.center); + // apply the new scale + this._zoom(scale, pointer); + } - function extend(a, b) { - for (var i in b) { - if (b.hasOwnProperty(i)) { - a[i] = b[i]; - } - } + // Prevent default actions caused by mouse wheel. + event.preventDefault(); + }; + + + /** + * Mouse move handler for checking whether the title moves over a node with a title. + * @param {Event} event + * @private + */ + Network.prototype._onMouseMoveTitle = function (event) { + var gesture = hammerUtil.fakeGesture(this, event); + var pointer = this._getPointer(gesture.center); + + // check if the previously selected node is still selected + if (this.popupObj) { + this._checkHidePopup(pointer); + } - if (b.hasOwnProperty("toString")) { - a.toString = b.toString; - } + // start a timeout that will check if the mouse is positioned above + // an element + var me = this; + var checkShow = function() { + me._checkShowPopup(pointer); + }; + if (this.popupTimer) { + clearInterval(this.popupTimer); // stop any running calculationTimer + } + if (!this.drag.dragging) { + this.popupTimer = setTimeout(checkShow, this.constants.tooltip.delay); + } - if (b.hasOwnProperty("valueOf")) { - a.valueOf = b.valueOf; - } - return a; + /** + * Adding hover highlights + */ + if (this.constants.hover == true) { + // removing all hover highlights + for (var edgeId in this.hoverObj.edges) { + if (this.hoverObj.edges.hasOwnProperty(edgeId)) { + this.hoverObj.edges[edgeId].hover = false; + delete this.hoverObj.edges[edgeId]; + } } - function cloneMoment(m) { - var result = {}, i; - for (i in m) { - if (m.hasOwnProperty(i) && momentProperties.hasOwnProperty(i)) { - result[i] = m[i]; - } - } - - return result; + // adding hover highlights + var obj = this._getNodeAt(pointer); + if (obj == null) { + obj = this._getEdgeAt(pointer); + } + if (obj != null) { + this._hoverObject(obj); } - function absRound(number) { - if (number < 0) { - return Math.ceil(number); - } else { - return Math.floor(number); + // removing all node hover highlights except for the selected one. + for (var nodeId in this.hoverObj.nodes) { + if (this.hoverObj.nodes.hasOwnProperty(nodeId)) { + if (obj instanceof Node && obj.id != nodeId || obj instanceof Edge || obj == null) { + this._blurObject(this.hoverObj.nodes[nodeId]); + delete this.hoverObj.nodes[nodeId]; } + } } + this.redraw(); + } + }; - // left zero fill a number - // see http://jsperf.com/left-zero-filling for performance comparison - function leftZeroFill(number, targetLength, forceSign) { - var output = '' + Math.abs(number), - sign = number >= 0; + /** + * Check if there is an element on the given position in the network + * (a node or edge). If so, and if this element has a title, + * show a popup window with its title. + * + * @param {{x:Number, y:Number}} pointer + * @private + */ + Network.prototype._checkShowPopup = function (pointer) { + var obj = { + left: this._XconvertDOMtoCanvas(pointer.x), + top: this._YconvertDOMtoCanvas(pointer.y), + right: this._XconvertDOMtoCanvas(pointer.x), + bottom: this._YconvertDOMtoCanvas(pointer.y) + }; - while (output.length < targetLength) { - output = '0' + output; + var id; + var lastPopupNode = this.popupObj; + + if (this.popupObj == undefined) { + // search the nodes for overlap, select the top one in case of multiple nodes + var nodes = this.nodes; + for (id in nodes) { + if (nodes.hasOwnProperty(id)) { + var node = nodes[id]; + if (node.getTitle() !== undefined && node.isOverlappingWith(obj)) { + this.popupObj = node; + break; } - return (sign ? (forceSign ? '+' : '') : '-') + output; + } } + } - // helper function for _.addTime and _.subtractTime - function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { - var milliseconds = duration._milliseconds, - days = duration._days, - months = duration._months; - updateOffset = updateOffset == null ? true : updateOffset; - - if (milliseconds) { - mom._d.setTime(+mom._d + milliseconds * isAdding); - } - if (days) { - rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); - } - if (months) { - rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); - } - if (updateOffset) { - moment.updateOffset(mom, days || months); + if (this.popupObj === undefined) { + // search the edges for overlap + var edges = this.edges; + for (id in edges) { + if (edges.hasOwnProperty(id)) { + var edge = edges[id]; + if (edge.connected && (edge.getTitle() !== undefined) && + edge.isOverlappingWith(obj)) { + this.popupObj = edge; + break; } + } } + } - // check if is an array - function isArray(input) { - return Object.prototype.toString.call(input) === '[object Array]'; - } + if (this.popupObj) { + // show popup message window + if (this.popupObj != lastPopupNode) { + var me = this; + if (!me.popup) { + me.popup = new Popup(me.frame, me.constants.tooltip); + } - function isDate(input) { - return Object.prototype.toString.call(input) === '[object Date]' || - input instanceof Date; + // adjust a small offset such that the mouse cursor is located in the + // bottom left location of the popup, and you can easily move over the + // popup area + me.popup.setPosition(pointer.x - 3, pointer.y - 3); + me.popup.setText(me.popupObj.getTitle()); + me.popup.show(); } - - // compare two arrays, return the number of differences - function compareArrays(array1, array2, dontConvert) { - var len = Math.min(array1.length, array2.length), - lengthDiff = Math.abs(array1.length - array2.length), - diffs = 0, - i; - for (i = 0; i < len; i++) { - if ((dontConvert && array1[i] !== array2[i]) || - (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { - diffs++; - } - } - return diffs + lengthDiff; + } + else { + if (this.popup) { + this.popup.hide(); } + } + }; - function normalizeUnits(units) { - if (units) { - var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); - units = unitAliases[units] || camelFunctions[lowered] || lowered; - } - return units; + + /** + * Check if the popup must be hided, which is the case when the mouse is no + * longer hovering on the object + * @param {{x:Number, y:Number}} pointer + * @private + */ + Network.prototype._checkHidePopup = function (pointer) { + if (!this.popupObj || !this._getNodeAt(pointer) ) { + this.popupObj = undefined; + if (this.popup) { + this.popup.hide(); } + } + }; - function normalizeObjectUnits(inputObject) { - var normalizedInput = {}, - normalizedProp, - prop; - for (prop in inputObject) { - if (inputObject.hasOwnProperty(prop)) { - normalizedProp = normalizeUnits(prop); - if (normalizedProp) { - normalizedInput[normalizedProp] = inputObject[prop]; - } - } - } + /** + * Set a new size for the network + * @param {string} width Width in pixels or percentage (for example '800px' + * or '50%') + * @param {string} height Height in pixels or percentage (for example '400px' + * or '30%') + */ + Network.prototype.setSize = function(width, height) { + this.frame.style.width = width; + this.frame.style.height = height; - return normalizedInput; - } + this.frame.canvas.style.width = '100%'; + this.frame.canvas.style.height = '100%'; - function makeList(field) { - var count, setter; + this.frame.canvas.width = this.frame.canvas.clientWidth; + this.frame.canvas.height = this.frame.canvas.clientHeight; - if (field.indexOf('week') === 0) { - count = 7; - setter = 'day'; - } - else if (field.indexOf('month') === 0) { - count = 12; - setter = 'month'; - } - else { - return; - } + this.emit('resize', {width:this.frame.canvas.width,height:this.frame.canvas.height}); + }; + + /** + * Set a data set with nodes for the network + * @param {Array | DataSet | DataView} nodes The data containing the nodes. + * @private + */ + Network.prototype._setNodes = function(nodes) { + var oldNodesData = this.nodesData; + + if (nodes instanceof DataSet || nodes instanceof DataView) { + this.nodesData = nodes; + } + else if (nodes instanceof Array) { + this.nodesData = new DataSet(); + this.nodesData.add(nodes); + } + else if (!nodes) { + this.nodesData = new DataSet(); + } + else { + throw new TypeError('Array or DataSet expected'); + } + + if (oldNodesData) { + // unsubscribe from old dataset + util.forEach(this.nodesListeners, function (callback, event) { + oldNodesData.off(event, callback); + }); + } - moment[field] = function (format, index) { - var i, getter, - method = moment.fn._lang[field], - results = []; + // remove drawn nodes + this.nodes = {}; - if (typeof format === 'number') { - index = format; - format = undefined; - } + if (this.nodesData) { + // subscribe to new dataset + var me = this; + util.forEach(this.nodesListeners, function (callback, event) { + me.nodesData.on(event, callback); + }); - getter = function (i) { - var m = moment().utc().set(setter, i); - return method.call(moment.fn._lang, m, format || ''); - }; + // draw all new nodes + var ids = this.nodesData.getIds(); + this._addNodes(ids); + } + this._updateSelection(); + }; - if (index != null) { - return getter(index); - } - else { - for (i = 0; i < count; i++) { - results.push(getter(i)); - } - return results; - } - }; + /** + * Add nodes + * @param {Number[] | String[]} ids + * @private + */ + Network.prototype._addNodes = function(ids) { + var id; + for (var i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + var data = this.nodesData.get(id); + var node = new Node(data, this.images, this.groups, this.constants); + this.nodes[id] = node; // note: this may replace an existing node + if ((node.xFixed == false || node.yFixed == false) && (node.x === null || node.y === null)) { + var radius = 10 * 0.1*ids.length + 10; + var angle = 2 * Math.PI * Math.random(); + if (node.xFixed == false) {node.x = radius * Math.cos(angle);} + if (node.yFixed == false) {node.y = radius * Math.sin(angle);} } + this.moving = true; + } + this._updateNodeIndexList(); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this._updateCalculationNodes(); + this._reconnectEdges(); + this._updateValueRange(this.nodes); + this.updateLabels(); + }; - function toInt(argumentForCoercion) { - var coercedNumber = +argumentForCoercion, - value = 0; + /** + * Update existing nodes, or create them when not yet existing + * @param {Number[] | String[]} ids + * @private + */ + Network.prototype._updateNodes = function(ids) { + var nodes = this.nodes, + nodesData = this.nodesData; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + var node = nodes[id]; + var data = nodesData.get(id); + if (node) { + // update node + node.setProperties(data, this.constants); + } + else { + // create node + node = new Node(properties, this.images, this.groups, this.constants); + nodes[id] = node; + } + } + this.moving = true; + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this._updateNodeIndexList(); + this._reconnectEdges(); + this._updateValueRange(nodes); + }; - if (coercedNumber !== 0 && isFinite(coercedNumber)) { - if (coercedNumber >= 0) { - value = Math.floor(coercedNumber); - } else { - value = Math.ceil(coercedNumber); - } - } + /** + * Remove existing nodes. If nodes do not exist, the method will just ignore it. + * @param {Number[] | String[]} ids + * @private + */ + Network.prototype._removeNodes = function(ids) { + var nodes = this.nodes; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + delete nodes[id]; + } + this._updateNodeIndexList(); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this._updateCalculationNodes(); + this._reconnectEdges(); + this._updateSelection(); + this._updateValueRange(nodes); + }; - return value; - } + /** + * Load edges by reading the data table + * @param {Array | DataSet | DataView} edges The data containing the edges. + * @private + * @private + */ + Network.prototype._setEdges = function(edges) { + var oldEdgesData = this.edgesData; - function daysInMonth(year, month) { - return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); - } + if (edges instanceof DataSet || edges instanceof DataView) { + this.edgesData = edges; + } + else if (edges instanceof Array) { + this.edgesData = new DataSet(); + this.edgesData.add(edges); + } + else if (!edges) { + this.edgesData = new DataSet(); + } + else { + throw new TypeError('Array or DataSet expected'); + } - function weeksInYear(year, dow, doy) { - return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; - } + if (oldEdgesData) { + // unsubscribe from old dataset + util.forEach(this.edgesListeners, function (callback, event) { + oldEdgesData.off(event, callback); + }); + } - function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; - } + // remove drawn edges + this.edges = {}; - function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; - } + if (this.edgesData) { + // subscribe to new dataset + var me = this; + util.forEach(this.edgesListeners, function (callback, event) { + me.edgesData.on(event, callback); + }); - function checkOverflow(m) { - var overflow; - if (m._a && m._pf.overflow === -2) { - overflow = - m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : - m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : - m._a[HOUR] < 0 || m._a[HOUR] > 23 ? HOUR : - m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : - m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : - m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : - -1; + // draw all new nodes + var ids = this.edgesData.getIds(); + this._addEdges(ids); + } - if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { - overflow = DATE; - } + this._reconnectEdges(); + }; - m._pf.overflow = overflow; - } - } + /** + * Add edges + * @param {Number[] | String[]} ids + * @private + */ + Network.prototype._addEdges = function (ids) { + var edges = this.edges, + edgesData = this.edgesData; - function isValid(m) { - if (m._isValid == null) { - m._isValid = !isNaN(m._d.getTime()) && - m._pf.overflow < 0 && - !m._pf.empty && - !m._pf.invalidMonth && - !m._pf.nullInput && - !m._pf.invalidFormat && - !m._pf.userInvalidated; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; - if (m._strict) { - m._isValid = m._isValid && - m._pf.charsLeftOver === 0 && - m._pf.unusedTokens.length === 0; - } - } - return m._isValid; + var oldEdge = edges[id]; + if (oldEdge) { + oldEdge.disconnect(); } - function normalizeLanguage(key) { - return key ? key.toLowerCase().replace('_', '-') : key; + var data = edgesData.get(id, {"showInternalIds" : true}); + edges[id] = new Edge(data, this, this.constants); + } + + this.moving = true; + this._updateValueRange(edges); + this._createBezierNodes(); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this._updateCalculationNodes(); + }; + + /** + * Update existing edges, or create them when not yet existing + * @param {Number[] | String[]} ids + * @private + */ + Network.prototype._updateEdges = function (ids) { + var edges = this.edges, + edgesData = this.edgesData; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + + var data = edgesData.get(id); + var edge = edges[id]; + if (edge) { + // update edge + edge.disconnect(); + edge.setProperties(data, this.constants); + edge.connect(); } - - // Return a moment from input, that is local/utc/zone equivalent to model. - function makeAs(input, model) { - return model._isUTC ? moment(input).zone(model._offset || 0) : - moment(input).local(); + else { + // create edge + edge = new Edge(data, this, this.constants); + this.edges[id] = edge; } + } - /************************************ - Languages - ************************************/ - - - extend(Language.prototype, { - - set : function (config) { - var prop, i; - for (i in config) { - prop = config[i]; - if (typeof prop === 'function') { - this[i] = prop; - } else { - this['_' + i] = prop; - } - } - }, - - _months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), - months : function (m) { - return this._months[m.month()]; - }, - - _monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), - monthsShort : function (m) { - return this._monthsShort[m.month()]; - }, + this._createBezierNodes(); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this.moving = true; + this._updateValueRange(edges); + }; - monthsParse : function (monthName) { - var i, mom, regex; + /** + * Remove existing edges. Non existing ids will be ignored + * @param {Number[] | String[]} ids + * @private + */ + Network.prototype._removeEdges = function (ids) { + var edges = this.edges; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + var edge = edges[id]; + if (edge) { + if (edge.via != null) { + delete this.sectors['support']['nodes'][edge.via.id]; + } + edge.disconnect(); + delete edges[id]; + } + } - if (!this._monthsParse) { - this._monthsParse = []; - } + this.moving = true; + this._updateValueRange(edges); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this._updateCalculationNodes(); + }; - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - if (!this._monthsParse[i]) { - mom = moment.utc([2000, i]); - regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); - this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (this._monthsParse[i].test(monthName)) { - return i; - } - } - }, + /** + * Reconnect all edges + * @private + */ + Network.prototype._reconnectEdges = function() { + var id, + nodes = this.nodes, + edges = this.edges; + for (id in nodes) { + if (nodes.hasOwnProperty(id)) { + nodes[id].edges = []; + } + } - _weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), - weekdays : function (m) { - return this._weekdays[m.day()]; - }, + for (id in edges) { + if (edges.hasOwnProperty(id)) { + var edge = edges[id]; + edge.from = null; + edge.to = null; + edge.connect(); + } + } + }; - _weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), - weekdaysShort : function (m) { - return this._weekdaysShort[m.day()]; - }, + /** + * Update the values of all object in the given array according to the current + * value range of the objects in the array. + * @param {Object} obj An object containing a set of Edges or Nodes + * The objects must have a method getValue() and + * setValueRange(min, max). + * @private + */ + Network.prototype._updateValueRange = function(obj) { + var id; - _weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), - weekdaysMin : function (m) { - return this._weekdaysMin[m.day()]; - }, + // determine the range of the objects + var valueMin = undefined; + var valueMax = undefined; + for (id in obj) { + if (obj.hasOwnProperty(id)) { + var value = obj[id].getValue(); + if (value !== undefined) { + valueMin = (valueMin === undefined) ? value : Math.min(value, valueMin); + valueMax = (valueMax === undefined) ? value : Math.max(value, valueMax); + } + } + } - weekdaysParse : function (weekdayName) { - var i, mom, regex; + // adjust the range of all objects + if (valueMin !== undefined && valueMax !== undefined) { + for (id in obj) { + if (obj.hasOwnProperty(id)) { + obj[id].setValueRange(valueMin, valueMax); + } + } + } + }; - if (!this._weekdaysParse) { - this._weekdaysParse = []; - } + /** + * Redraw the network with the current data + * chart will be resized too. + */ + Network.prototype.redraw = function() { + this.setSize(this.constants.width, this.constants.height); + this._redraw(); + }; - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - if (!this._weekdaysParse[i]) { - mom = moment([2000, 1]).day(i); - regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); - this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (this._weekdaysParse[i].test(weekdayName)) { - return i; - } - } - }, + /** + * Redraw the network with the current data + * @private + */ + Network.prototype._redraw = function() { + var ctx = this.frame.canvas.getContext('2d'); + // clear the canvas + var w = this.frame.canvas.width; + var h = this.frame.canvas.height; + ctx.clearRect(0, 0, w, h); - _longDateFormat : { - LT : "h:mm A", - L : "MM/DD/YYYY", - LL : "MMMM D YYYY", - LLL : "MMMM D YYYY LT", - LLLL : "dddd, MMMM D YYYY LT" - }, - longDateFormat : function (key) { - var output = this._longDateFormat[key]; - if (!output && this._longDateFormat[key.toUpperCase()]) { - output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { - return val.slice(1); - }); - this._longDateFormat[key] = output; - } - return output; - }, + // set scaling and translation + ctx.save(); + ctx.translate(this.translation.x, this.translation.y); + ctx.scale(this.scale, this.scale); - isPM : function (input) { - // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays - // Using charAt should be more compatible. - return ((input + '').toLowerCase().charAt(0) === 'p'); - }, + this.canvasTopLeft = { + "x": this._XconvertDOMtoCanvas(0), + "y": this._YconvertDOMtoCanvas(0) + }; + this.canvasBottomRight = { + "x": this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth), + "y": this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight) + }; - _meridiemParse : /[ap]\.?m?\.?/i, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'pm' : 'PM'; - } else { - return isLower ? 'am' : 'AM'; - } - }, - _calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - calendar : function (key, mom) { - var output = this._calendar[key]; - return typeof output === 'function' ? output.apply(mom) : output; - }, + this._doInAllSectors("_drawAllSectorNodes",ctx); + if (this.drag.dragging == false || this.drag.dragging === undefined || this.constants.hideEdgesOnDrag == false) { + this._doInAllSectors("_drawEdges",ctx); + } - _relativeTime : { - future : "in %s", - past : "%s ago", - s : "a few seconds", - m : "a minute", - mm : "%d minutes", - h : "an hour", - hh : "%d hours", - d : "a day", - dd : "%d days", - M : "a month", - MM : "%d months", - y : "a year", - yy : "%d years" - }, - relativeTime : function (number, withoutSuffix, string, isFuture) { - var output = this._relativeTime[string]; - return (typeof output === 'function') ? - output(number, withoutSuffix, string, isFuture) : - output.replace(/%d/i, number); - }, - pastFuture : function (diff, output) { - var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); - }, + if (this.drag.dragging == false || this.drag.dragging === undefined || this.constants.hideNodesOnDrag == false) { + this._doInAllSectors("_drawNodes",ctx,false); + } - ordinal : function (number) { - return this._ordinal.replace("%d", number); - }, - _ordinal : "%d", + if (this.controlNodesActive == true) { + this._doInAllSectors("_drawControlNodes",ctx); + } - preparse : function (string) { - return string; - }, + // this._doInSupportSector("_drawNodes",ctx,true); + // this._drawTree(ctx,"#F00F0F"); - postformat : function (string) { - return string; - }, + // restore original scaling and translation + ctx.restore(); + }; - week : function (mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; - }, + /** + * Set the translation of the network + * @param {Number} offsetX Horizontal offset + * @param {Number} offsetY Vertical offset + * @private + */ + Network.prototype._setTranslation = function(offsetX, offsetY) { + if (this.translation === undefined) { + this.translation = { + x: 0, + y: 0 + }; + } - _week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - }, + if (offsetX !== undefined) { + this.translation.x = offsetX; + } + if (offsetY !== undefined) { + this.translation.y = offsetY; + } - _invalidDate: 'Invalid date', - invalidDate: function () { - return this._invalidDate; - } - }); + this.emit('viewChanged'); + }; - // Loads a language definition into the `languages` cache. The function - // takes a key and optionally values. If not in the browser and no values - // are provided, it will load the language file module. As a convenience, - // this function also returns the language values. - function loadLang(key, values) { - values.abbr = key; - if (!languages[key]) { - languages[key] = new Language(); - } - languages[key].set(values); - return languages[key]; - } + /** + * Get the translation of the network + * @return {Object} translation An object with parameters x and y, both a number + * @private + */ + Network.prototype._getTranslation = function() { + return { + x: this.translation.x, + y: this.translation.y + }; + }; - // Remove a language from the `languages` cache. Mostly useful in tests. - function unloadLang(key) { - delete languages[key]; - } + /** + * Scale the network + * @param {Number} scale Scaling factor 1.0 is unscaled + * @private + */ + Network.prototype._setScale = function(scale) { + this.scale = scale; + }; - // Determines which language definition to use and returns it. - // - // With no parameters, it will return the global language. If you - // pass in a language key, such as 'en', it will return the - // definition for 'en', so long as 'en' has already been loaded using - // moment.lang. - function getLangDefinition(key) { - var i = 0, j, lang, next, split, - get = function (k) { - if (!languages[k] && hasModule) { - try { - __webpack_require__(60)("./" + k); - } catch (e) { } - } - return languages[k]; - }; + /** + * Get the current scale of the network + * @return {Number} scale Scaling factor 1.0 is unscaled + * @private + */ + Network.prototype._getScale = function() { + return this.scale; + }; - if (!key) { - return moment.fn._lang; - } + /** + * Convert the X coordinate in DOM-space (coordinate point in browser relative to the container div) to + * the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon) + * @param {number} x + * @returns {number} + * @private + */ + Network.prototype._XconvertDOMtoCanvas = function(x) { + return (x - this.translation.x) / this.scale; + }; - if (!isArray(key)) { - //short-circuit everything else - lang = get(key); - if (lang) { - return lang; - } - key = [key]; - } + /** + * Convert the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to + * the X coordinate in DOM-space (coordinate point in browser relative to the container div) + * @param {number} x + * @returns {number} + * @private + */ + Network.prototype._XconvertCanvasToDOM = function(x) { + return x * this.scale + this.translation.x; + }; - //pick the language from the array - //try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each - //substring from most specific to least, but move to the next array item if it's a more specific variant than the current root - while (i < key.length) { - split = normalizeLanguage(key[i]).split('-'); - j = split.length; - next = normalizeLanguage(key[i + 1]); - next = next ? next.split('-') : null; - while (j > 0) { - lang = get(split.slice(0, j).join('-')); - if (lang) { - return lang; - } - if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { - //the next array item is better than a shallower substring of this one - break; - } - j--; - } - i++; - } - return moment.fn._lang; - } + /** + * Convert the Y coordinate in DOM-space (coordinate point in browser relative to the container div) to + * the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) + * @param {number} y + * @returns {number} + * @private + */ + Network.prototype._YconvertDOMtoCanvas = function(y) { + return (y - this.translation.y) / this.scale; + }; - /************************************ - Formatting - ************************************/ + /** + * Convert the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to + * the Y coordinate in DOM-space (coordinate point in browser relative to the container div) + * @param {number} y + * @returns {number} + * @private + */ + Network.prototype._YconvertCanvasToDOM = function(y) { + return y * this.scale + this.translation.y ; + }; - function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|\]$/g, ""); - } - return input.replace(/\\/g, ""); - } + /** + * + * @param {object} pos = {x: number, y: number} + * @returns {{x: number, y: number}} + * @constructor + */ + Network.prototype.canvasToDOM = function(pos) { + return {x:this._XconvertCanvasToDOM(pos.x),y:this._YconvertCanvasToDOM(pos.y)}; + } - function makeFormatFunction(format) { - var array = format.match(formattingTokens), i, length; + /** + * + * @param {object} pos = {x: number, y: number} + * @returns {{x: number, y: number}} + * @constructor + */ + Network.prototype.DOMtoCanvas = function(pos) { + return {x:this._XconvertDOMtoCanvas(pos.x),y:this._YconvertDOMtoCanvas(pos.y)}; + } + + /** + * Redraw all nodes + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx + * @param {Boolean} [alwaysShow] + * @private + */ + Network.prototype._drawNodes = function(ctx,alwaysShow) { + if (alwaysShow === undefined) { + alwaysShow = false; + } + + // first draw the unselected nodes + var nodes = this.nodes; + var selected = []; - for (i = 0, length = array.length; i < length; i++) { - if (formatTokenFunctions[array[i]]) { - array[i] = formatTokenFunctions[array[i]]; - } else { - array[i] = removeFormattingTokens(array[i]); - } + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + nodes[id].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight); + if (nodes[id].isSelected()) { + selected.push(id); + } + else { + if (nodes[id].inArea() || alwaysShow) { + nodes[id].draw(ctx); } + } + } + } - return function (mom) { - var output = ""; - for (i = 0; i < length; i++) { - output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; - } - return output; - }; + // draw the selected nodes on top + for (var s = 0, sMax = selected.length; s < sMax; s++) { + if (nodes[selected[s]].inArea() || alwaysShow) { + nodes[selected[s]].draw(ctx); } + } + }; - // format date using native date object - function formatMoment(m, format) { + /** + * Redraw all edges + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Network.prototype._drawEdges = function(ctx) { + var edges = this.edges; + for (var id in edges) { + if (edges.hasOwnProperty(id)) { + var edge = edges[id]; + edge.setScale(this.scale); + if (edge.connected) { + edges[id].draw(ctx); + } + } + } + }; - if (!m.isValid()) { - return m.lang().invalidDate(); - } + /** + * Redraw all edges + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Network.prototype._drawControlNodes = function(ctx) { + var edges = this.edges; + for (var id in edges) { + if (edges.hasOwnProperty(id)) { + edges[id]._drawControlNodes(ctx); + } + } + }; - format = expandFormat(format, m.lang()); + /** + * Find a stable position for all nodes + * @private + */ + Network.prototype._stabilize = function() { + if (this.constants.freezeForStabilization == true) { + this._freezeDefinedNodes(); + } - if (!formatFunctions[format]) { - formatFunctions[format] = makeFormatFunction(format); - } + // find stable position + var count = 0; + while (this.moving && count < this.constants.stabilizationIterations) { + this._physicsTick(); + count++; + } + this.zoomExtent(false,true); + if (this.constants.freezeForStabilization == true) { + this._restoreFrozenNodes(); + } + this.emit("stabilized",{iterations:count}); + }; - return formatFunctions[format](m); + /** + * When initializing and stabilizing, we can freeze nodes with a predefined position. This greatly speeds up stabilization + * because only the supportnodes for the smoothCurves have to settle. + * + * @private + */ + Network.prototype._freezeDefinedNodes = function() { + var nodes = this.nodes; + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + if (nodes[id].x != null && nodes[id].y != null) { + nodes[id].fixedData.x = nodes[id].xFixed; + nodes[id].fixedData.y = nodes[id].yFixed; + nodes[id].xFixed = true; + nodes[id].yFixed = true; + } } + } + }; - function expandFormat(format, lang) { - var i = 5; - - function replaceLongDateFormatTokens(input) { - return lang.longDateFormat(input) || input; - } + /** + * Unfreezes the nodes that have been frozen by _freezeDefinedNodes. + * + * @private + */ + Network.prototype._restoreFrozenNodes = function() { + var nodes = this.nodes; + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + if (nodes[id].fixedData.x != null) { + nodes[id].xFixed = nodes[id].fixedData.x; + nodes[id].yFixed = nodes[id].fixedData.y; + } + } + } + }; - localFormattingTokens.lastIndex = 0; - while (i >= 0 && localFormattingTokens.test(format)) { - format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); - localFormattingTokens.lastIndex = 0; - i -= 1; - } - return format; + /** + * Check if any of the nodes is still moving + * @param {number} vmin the minimum velocity considered as 'moving' + * @return {boolean} true if moving, false if non of the nodes is moving + * @private + */ + Network.prototype._isMoving = function(vmin) { + var nodes = this.nodes; + for (var id in nodes) { + if (nodes.hasOwnProperty(id) && nodes[id].isMoving(vmin)) { + return true; } + } + return false; + }; - /************************************ - Parsing - ************************************/ - + /** + * /** + * Perform one discrete step for all nodes + * + * @private + */ + Network.prototype._discreteStepNodes = function(checkMovement) { + var interval = this.physicsDiscreteStepsize; + var nodes = this.nodes; + var nodeId; + var nodesPresent = false; - // get the regex to find the next token - function getParseRegexForToken(token, config) { - var a, strict = config._strict; - switch (token) { - case 'Q': - return parseTokenOneDigit; - case 'DDDD': - return parseTokenThreeDigits; - case 'YYYY': - case 'GGGG': - case 'gggg': - return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; - case 'Y': - case 'G': - case 'g': - return parseTokenSignedNumber; - case 'YYYYYY': - case 'YYYYY': - case 'GGGGG': - case 'ggggg': - return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; - case 'S': - if (strict) { return parseTokenOneDigit; } - /* falls through */ - case 'SS': - if (strict) { return parseTokenTwoDigits; } - /* falls through */ - case 'SSS': - if (strict) { return parseTokenThreeDigits; } - /* falls through */ - case 'DDD': - return parseTokenOneToThreeDigits; - case 'MMM': - case 'MMMM': - case 'dd': - case 'ddd': - case 'dddd': - return parseTokenWord; - case 'a': - case 'A': - return getLangDefinition(config._l)._meridiemParse; - case 'X': - return parseTokenTimestampMs; - case 'Z': - case 'ZZ': - return parseTokenTimezone; - case 'T': - return parseTokenT; - case 'SSSS': - return parseTokenDigits; - case 'MM': - case 'DD': - case 'YY': - case 'GG': - case 'gg': - case 'HH': - case 'hh': - case 'mm': - case 'ss': - case 'ww': - case 'WW': - return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; - case 'M': - case 'D': - case 'd': - case 'H': - case 'h': - case 'm': - case 's': - case 'w': - case 'W': - case 'e': - case 'E': - return parseTokenOneOrTwoDigits; - case 'Do': - return parseTokenOrdinal; - default : - a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), "i")); - return a; - } + if (this.constants.maxVelocity > 0) { + for (nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + nodes[nodeId].discreteStepLimited(interval, this.constants.maxVelocity); + nodesPresent = true; + } + } + } + else { + for (nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + nodes[nodeId].discreteStep(interval); + nodesPresent = true; + } } + } - function timezoneMinutesFromString(string) { - string = string || ""; - var possibleTzMatches = (string.match(parseTokenTimezone) || []), - tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], - parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], - minutes = +(parts[1] * 60) + toInt(parts[2]); + if (nodesPresent == true && (checkMovement === undefined || checkMovement == true)) { + var vminCorrected = this.constants.minVelocity / Math.max(this.scale,0.05); + if (vminCorrected > 0.5*this.constants.maxVelocity) { + this.moving = true; + } + else { + this.moving = this._isMoving(vminCorrected); + if (this.moving == false) { + this.emit("stabilized",{iterations:null}); + } + this.moving = this.moving || this.configurePhysics; - return parts[0] === '+' ? -minutes : minutes; } + } + }; - // function to convert string input to date - function addTimeToArrayFromToken(token, input, config) { - var a, datePartArray = config._a; + /** + * A single simulation step (or "tick") in the physics simulation + * + * @private + */ + Network.prototype._physicsTick = function() { + if (!this.freezeSimulation) { + if (this.moving == true) { + this._doInAllActiveSectors("_initializeForceCalculation"); + this._doInAllActiveSectors("_discreteStepNodes"); + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + this._doInSupportSector("_discreteStepNodes", false); + } + this._findCenter(this._getRange()) + } + } + }; - switch (token) { - // QUARTER - case 'Q': - if (input != null) { - datePartArray[MONTH] = (toInt(input) - 1) * 3; - } - break; - // MONTH - case 'M' : // fall through to MM - case 'MM' : - if (input != null) { - datePartArray[MONTH] = toInt(input) - 1; - } - break; - case 'MMM' : // fall through to MMMM - case 'MMMM' : - a = getLangDefinition(config._l).monthsParse(input); - // if we didn't find a month name, mark the date as invalid. - if (a != null) { - datePartArray[MONTH] = a; - } else { - config._pf.invalidMonth = input; - } - break; - // DAY OF MONTH - case 'D' : // fall through to DD - case 'DD' : - if (input != null) { - datePartArray[DATE] = toInt(input); - } - break; - case 'Do' : - if (input != null) { - datePartArray[DATE] = toInt(parseInt(input, 10)); - } - break; - // DAY OF YEAR - case 'DDD' : // fall through to DDDD - case 'DDDD' : - if (input != null) { - config._dayOfYear = toInt(input); - } - break; - // YEAR - case 'YY' : - datePartArray[YEAR] = moment.parseTwoDigitYear(input); - break; - case 'YYYY' : - case 'YYYYY' : - case 'YYYYYY' : - datePartArray[YEAR] = toInt(input); - break; - // AM / PM - case 'a' : // fall through to A - case 'A' : - config._isPm = getLangDefinition(config._l).isPM(input); - break; - // 24 HOUR - case 'H' : // fall through to hh - case 'HH' : // fall through to hh - case 'h' : // fall through to hh - case 'hh' : - datePartArray[HOUR] = toInt(input); - break; - // MINUTE - case 'm' : // fall through to mm - case 'mm' : - datePartArray[MINUTE] = toInt(input); - break; - // SECOND - case 's' : // fall through to ss - case 'ss' : - datePartArray[SECOND] = toInt(input); - break; - // MILLISECOND - case 'S' : - case 'SS' : - case 'SSS' : - case 'SSSS' : - datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); - break; - // UNIX TIMESTAMP WITH MS - case 'X': - config._d = new Date(parseFloat(input) * 1000); - break; - // TIMEZONE - case 'Z' : // fall through to ZZ - case 'ZZ' : - config._useUTC = true; - config._tzm = timezoneMinutesFromString(input); - break; - // WEEKDAY - human - case 'dd': - case 'ddd': - case 'dddd': - a = getLangDefinition(config._l).weekdaysParse(input); - // if we didn't get a weekday name, mark the date as invalid - if (a != null) { - config._w = config._w || {}; - config._w['d'] = a; - } else { - config._pf.invalidWeekday = input; - } - break; - // WEEK, WEEK DAY - numeric - case 'w': - case 'ww': - case 'W': - case 'WW': - case 'd': - case 'e': - case 'E': - token = token.substr(0, 1); - /* falls through */ - case 'gggg': - case 'GGGG': - case 'GGGGG': - token = token.substr(0, 2); - if (input) { - config._w = config._w || {}; - config._w[token] = toInt(input); - } - break; - case 'gg': - case 'GG': - config._w = config._w || {}; - config._w[token] = moment.parseTwoDigitYear(input); + /** + * This function runs one step of the animation. It calls an x amount of physics ticks and one render tick. + * It reschedules itself at the beginning of the function + * + * @private + */ + Network.prototype._animationStep = function() { + // reset the timer so a new scheduled animation step can be set + this.timer = undefined; + // handle the keyboad movement + this._handleNavigation(); + + // this schedules a new animation step + this.start(); + + // start the physics simulation + var calculationTime = Date.now(); + var maxSteps = 1; + this._physicsTick(); + var timeRequired = Date.now() - calculationTime; + while (timeRequired < 0.9*(this.renderTimestep - this.renderTime) && maxSteps < this.maxPhysicsTicksPerRender) { + this._physicsTick(); + timeRequired = Date.now() - calculationTime; + maxSteps++; + } + // start the rendering process + var renderTime = Date.now(); + this._redraw(); + this.renderTime = Date.now() - renderTime; + + }; + + if (typeof window !== 'undefined') { + window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; + } + + /** + * Schedule a animation step with the refreshrate interval. + */ + Network.prototype.start = function() { + if (this.moving == true || this.xIncrement != 0 || this.yIncrement != 0 || this.zoomIncrement != 0) { + if (!this.timer) { + var ua = navigator.userAgent.toLowerCase(); + + var requiresTimeout = false; + if (ua.indexOf('msie 9.0') != -1) { // IE 9 + requiresTimeout = true; + } + else if (ua.indexOf('safari') != -1) { // safari + if (ua.indexOf('chrome') <= -1) { + requiresTimeout = true; + } + } + + if (requiresTimeout == true) { + this.timer = window.setTimeout(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function + } + else{ + this.timer = window.requestAnimationFrame(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function + } + } + } + else { + this._redraw(); + } + }; + + + /** + * Move the network according to the keyboard presses. + * + * @private + */ + Network.prototype._handleNavigation = function() { + if (this.xIncrement != 0 || this.yIncrement != 0) { + var translation = this._getTranslation(); + this._setTranslation(translation.x+this.xIncrement, translation.y+this.yIncrement); + } + if (this.zoomIncrement != 0) { + var center = { + x: this.frame.canvas.clientWidth / 2, + y: this.frame.canvas.clientHeight / 2 + }; + this._zoom(this.scale*(1 + this.zoomIncrement), center); + } + }; + + + /** + * Freeze the _animationStep + */ + Network.prototype.toggleFreeze = function() { + if (this.freezeSimulation == false) { + this.freezeSimulation = true; + } + else { + this.freezeSimulation = false; + this.start(); + } + }; + + + /** + * This function cleans the support nodes if they are not needed and adds them when they are. + * + * @param {boolean} [disableStart] + * @private + */ + Network.prototype._configureSmoothCurves = function(disableStart) { + if (disableStart === undefined) { + disableStart = true; + } + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + this._createBezierNodes(); + // cleanup unused support nodes + for (var nodeId in this.sectors['support']['nodes']) { + if (this.sectors['support']['nodes'].hasOwnProperty(nodeId)) { + if (this.edges[this.sectors['support']['nodes'][nodeId].parentEdgeId] === undefined) { + delete this.sectors['support']['nodes'][nodeId]; } + } } + } + else { + // delete the support nodes + this.sectors['support']['nodes'] = {}; + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + this.edges[edgeId].via = null; + } + } + } - function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp, lang; - - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - dow = 1; - doy = 4; - // TODO: We need to take the current isoWeekYear, but that depends on - // how we interpret now (local, utc, fixed offset). So create - // a now version of current config (take local/utc/offset flags, and - // create now). - weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); - week = dfl(w.W, 1); - weekday = dfl(w.E, 1); - } else { - lang = getLangDefinition(config._l); - dow = lang._week.dow; - doy = lang._week.doy; + this._updateCalculationNodes(); + if (!disableStart) { + this.moving = true; + this.start(); + } + }; - weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); - week = dfl(w.w, 1); - if (w.d != null) { - // weekday -- low day numbers are considered next week - weekday = w.d; - if (weekday < dow) { - ++week; - } - } else if (w.e != null) { - // local weekday -- counting starts from begining of week - weekday = w.e + dow; - } else { - // default to begining of week - weekday = dow; - } + /** + * Bezier curves require an anchor point to calculate the smooth flow. These points are nodes. These nodes are invisible but + * are used for the force calculation. + * + * @private + */ + Network.prototype._createBezierNodes = function() { + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + var edge = this.edges[edgeId]; + if (edge.via == null) { + var nodeId = "edgeId:".concat(edge.id); + this.sectors['support']['nodes'][nodeId] = new Node( + {id:nodeId, + mass:1, + shape:'circle', + image:"", + internalMultiplier:1 + },{},{},this.constants); + edge.via = this.sectors['support']['nodes'][nodeId]; + edge.via.parentEdgeId = edge.id; + edge.positionBezierNode(); } - temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + } + } + } + }; - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; + /** + * load the functions that load the mixins into the prototype. + * + * @private + */ + Network.prototype._initializeMixinLoaders = function () { + for (var mixin in MixinLoader) { + if (MixinLoader.hasOwnProperty(mixin)) { + Network.prototype[mixin] = MixinLoader[mixin]; } + } + }; - // convert an array to a date. - // the array should mirror the parameters below - // note: all values past the year are optional and will default to the lowest possible value. - // [year, month, day , hour, minute, second, millisecond] - function dateFromConfig(config) { - var i, date, input = [], currentDate, yearToUse; + /** + * Load the XY positions of the nodes into the dataset. + */ + Network.prototype.storePosition = function() { + var dataArray = []; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + var allowedToMoveX = !this.nodes.xFixed; + var allowedToMoveY = !this.nodes.yFixed; + if (this.nodesData._data[nodeId].x != Math.round(node.x) || this.nodesData._data[nodeId].y != Math.round(node.y)) { + dataArray.push({id:nodeId,x:Math.round(node.x),y:Math.round(node.y),allowedToMoveX:allowedToMoveX,allowedToMoveY:allowedToMoveY}); + } + } + } + this.nodesData.update(dataArray); + }; - if (config._d) { - return; - } - currentDate = currentDateArray(config); + /** + * Center a node in view. + * + * @param {Number} nodeId + * @param {Number} [zoomLevel] + */ + Network.prototype.focusOnNode = function (nodeId, zoomLevel) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (zoomLevel === undefined) { + zoomLevel = this._getScale(); + } + var nodePosition= {x: this.nodes[nodeId].x, y: this.nodes[nodeId].y}; - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - dayOfYearFromWeekInfo(config); - } + var requiredScale = zoomLevel; + this._setScale(requiredScale); - //if the day of the year is set, figure out what it is - if (config._dayOfYear) { - yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); + var canvasCenter = this.DOMtoCanvas({x:0.5 * this.frame.canvas.width,y:0.5 * this.frame.canvas.height}); + var translation = this._getTranslation(); - if (config._dayOfYear > daysInYear(yearToUse)) { - config._pf._overflowDayOfYear = true; - } + var distanceFromCenter = {x:canvasCenter.x - nodePosition.x, + y:canvasCenter.y - nodePosition.y}; - date = makeUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); - } + this._setTranslation(translation.x + requiredScale * distanceFromCenter.x, + translation.y + requiredScale * distanceFromCenter.y); + this.redraw(); + } + else { + console.log("This nodeId cannot be found.") + } + }; - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; - } + /** + * Returns true when the Timeline is active. + * @returns {boolean} + */ + Network.prototype.isActive = function () { + return !this.activator || this.activator.active; + }; - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; - } + module.exports = Network; - config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); - // Apply timezone offset from input. The actual zone can be changed - // with parseZone. - if (config._tzm != null) { - config._d.setUTCMinutes(config._d.getUTCMinutes() + config._tzm); - } - } - function dateFromObject(config) { - var normalizedInput; +/***/ }, +/* 45 */ +/***/ function(module, exports, __webpack_require__) { - if (config._d) { - return; - } + /** + * Parse a text source containing data in DOT language into a JSON object. + * The object contains two lists: one with nodes and one with edges. + * + * DOT language reference: http://www.graphviz.org/doc/info/lang.html + * + * @param {String} data Text containing a graph in DOT-notation + * @return {Object} graph An object containing two parameters: + * {Object[]} nodes + * {Object[]} edges + */ + function parseDOT (data) { + dot = data; + return parseGraph(); + } + + // token types enumeration + var TOKENTYPE = { + NULL : 0, + DELIMITER : 1, + IDENTIFIER: 2, + UNKNOWN : 3 + }; - normalizedInput = normalizeObjectUnits(config._i); - config._a = [ - normalizedInput.year, - normalizedInput.month, - normalizedInput.day, - normalizedInput.hour, - normalizedInput.minute, - normalizedInput.second, - normalizedInput.millisecond - ]; + // map with all delimiters + var DELIMITERS = { + '{': true, + '}': true, + '[': true, + ']': true, + ';': true, + '=': true, + ',': true, - dateFromConfig(config); - } + '->': true, + '--': true + }; - function currentDateArray(config) { - var now = new Date(); - if (config._useUTC) { - return [ - now.getUTCFullYear(), - now.getUTCMonth(), - now.getUTCDate() - ]; - } else { - return [now.getFullYear(), now.getMonth(), now.getDate()]; - } - } + var dot = ''; // current dot file + var index = 0; // current index in dot file + var c = ''; // current token character in expr + var token = ''; // current token + var tokenType = TOKENTYPE.NULL; // type of the token - // date from string and format string - function makeDateFromStringAndFormat(config) { + /** + * Get the first character from the dot file. + * The character is stored into the char c. If the end of the dot file is + * reached, the function puts an empty string in c. + */ + function first() { + index = 0; + c = dot.charAt(0); + } - if (config._f === moment.ISO_8601) { - parseISO(config); - return; - } + /** + * Get the next character from the dot file. + * The character is stored into the char c. If the end of the dot file is + * reached, the function puts an empty string in c. + */ + function next() { + index++; + c = dot.charAt(index); + } - config._a = []; - config._pf.empty = true; + /** + * Preview the next character from the dot file. + * @return {String} cNext + */ + function nextPreview() { + return dot.charAt(index + 1); + } - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var lang = getLangDefinition(config._l), - string = '' + config._i, - i, parsedInput, tokens, token, skipped, - stringLength = string.length, - totalParsedInputLength = 0; + /** + * Test whether given character is alphabetic or numeric + * @param {String} c + * @return {Boolean} isAlphaNumeric + */ + var regexAlphaNumeric = /[a-zA-Z_0-9.:#]/; + function isAlphaNumeric(c) { + return regexAlphaNumeric.test(c); + } - tokens = expandFormat(config._f, lang).match(formattingTokens) || []; + /** + * Merge all properties of object b into object b + * @param {Object} a + * @param {Object} b + * @return {Object} a + */ + function merge (a, b) { + if (!a) { + a = {}; + } - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - config._pf.unusedInput.push(skipped); - } - string = string.slice(string.indexOf(parsedInput) + parsedInput.length); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - config._pf.empty = false; - } - else { - config._pf.unusedTokens.push(token); - } - addTimeToArrayFromToken(token, parsedInput, config); - } - else if (config._strict && !parsedInput) { - config._pf.unusedTokens.push(token); - } - } + if (b) { + for (var name in b) { + if (b.hasOwnProperty(name)) { + a[name] = b[name]; + } + } + } + return a; + } - // add remaining unparsed input length to the string - config._pf.charsLeftOver = stringLength - totalParsedInputLength; - if (string.length > 0) { - config._pf.unusedInput.push(string); - } + /** + * Set a value in an object, where the provided parameter name can be a + * path with nested parameters. For example: + * + * var obj = {a: 2}; + * setValue(obj, 'b.c', 3); // obj = {a: 2, b: {c: 3}} + * + * @param {Object} obj + * @param {String} path A parameter name or dot-separated parameter path, + * like "color.highlight.border". + * @param {*} value + */ + function setValue(obj, path, value) { + var keys = path.split('.'); + var o = obj; + while (keys.length) { + var key = keys.shift(); + if (keys.length) { + // this isn't the end point + if (!o[key]) { + o[key] = {}; + } + o = o[key]; + } + else { + // this is the end point + o[key] = value; + } + } + } - // handle am pm - if (config._isPm && config._a[HOUR] < 12) { - config._a[HOUR] += 12; - } - // if is 12 am, change hours to 0 - if (config._isPm === false && config._a[HOUR] === 12) { - config._a[HOUR] = 0; - } + /** + * Add a node to a graph object. If there is already a node with + * the same id, their attributes will be merged. + * @param {Object} graph + * @param {Object} node + */ + function addNode(graph, node) { + var i, len; + var current = null; - dateFromConfig(config); - checkOverflow(config); + // find root graph (in case of subgraph) + var graphs = [graph]; // list with all graphs from current graph to root graph + var root = graph; + while (root.parent) { + graphs.push(root.parent); + root = root.parent; + } + + // find existing node (at root level) by its id + if (root.nodes) { + for (i = 0, len = root.nodes.length; i < len; i++) { + if (node.id === root.nodes[i].id) { + current = root.nodes[i]; + break; + } } + } - function unescapeFormat(s) { - return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { - return p1 || p2 || p3 || p4; - }); + if (!current) { + // this is a new node + current = { + id: node.id + }; + if (graph.node) { + // clone default attributes + current.attr = merge(current.attr, graph.node); } + } - // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript - function regexpEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + // add node to this (sub)graph and all its parent graphs + for (i = graphs.length - 1; i >= 0; i--) { + var g = graphs[i]; + + if (!g.nodes) { + g.nodes = []; + } + if (g.nodes.indexOf(current) == -1) { + g.nodes.push(current); } + } - // date from string and array of format strings - function makeDateFromStringAndArray(config) { - var tempConfig, - bestMoment, + // merge attributes + if (node.attr) { + current.attr = merge(current.attr, node.attr); + } + } - scoreToBeat, - i, - currentScore; + /** + * Add an edge to a graph object + * @param {Object} graph + * @param {Object} edge + */ + function addEdge(graph, edge) { + if (!graph.edges) { + graph.edges = []; + } + graph.edges.push(edge); + if (graph.edge) { + var attr = merge({}, graph.edge); // clone default attributes + edge.attr = merge(attr, edge.attr); // merge attributes + } + } - if (config._f.length === 0) { - config._pf.invalidFormat = true; - config._d = new Date(NaN); - return; - } + /** + * Create an edge to a graph object + * @param {Object} graph + * @param {String | Number | Object} from + * @param {String | Number | Object} to + * @param {String} type + * @param {Object | null} attr + * @return {Object} edge + */ + function createEdge(graph, from, to, type, attr) { + var edge = { + from: from, + to: to, + type: type + }; - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - tempConfig = extend({}, config); - tempConfig._pf = defaultParsingFlags(); - tempConfig._f = config._f[i]; - makeDateFromStringAndFormat(tempConfig); + if (graph.edge) { + edge.attr = merge({}, graph.edge); // clone default attributes + } + edge.attr = merge(edge.attr || {}, attr); // merge attributes - if (!isValid(tempConfig)) { - continue; - } + return edge; + } - // if there is any input that was not parsed add a penalty for that format - currentScore += tempConfig._pf.charsLeftOver; + /** + * Get next token in the current dot file. + * The token and token type are available as token and tokenType + */ + function getToken() { + tokenType = TOKENTYPE.NULL; + token = ''; - //or tokens - currentScore += tempConfig._pf.unusedTokens.length * 10; + // skip over whitespaces + while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { // space, tab, enter + next(); + } - tempConfig._pf.score = currentScore; + do { + var isComment = false; - if (scoreToBeat == null || currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; - } + // skip comment + if (c == '#') { + // find the previous non-space character + var i = index - 1; + while (dot.charAt(i) == ' ' || dot.charAt(i) == '\t') { + i--; + } + if (dot.charAt(i) == '\n' || dot.charAt(i) == '') { + // the # is at the start of a line, this is indeed a line comment + while (c != '' && c != '\n') { + next(); } - - extend(config, bestMoment || tempConfig); + isComment = true; + } } - - // date from iso format - function parseISO(config) { - var i, l, - string = config._i, - match = isoRegex.exec(string); - - if (match) { - config._pf.iso = true; - for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(string)) { - // match[5] should be "T" or undefined - config._f = isoDates[i][0] + (match[6] || " "); - break; - } - } - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(string)) { - config._f += isoTimes[i][0]; - break; - } - } - if (string.match(parseTokenTimezone)) { - config._f += "Z"; - } - makeDateFromStringAndFormat(config); - } else { - config._isValid = false; - } + if (c == '/' && nextPreview() == '/') { + // skip line comment + while (c != '' && c != '\n') { + next(); + } + isComment = true; } - - // date from iso format or fallback - function makeDateFromString(config) { - parseISO(config); - if (config._isValid === false) { - delete config._isValid; - moment.createFromInputFallback(config); + if (c == '/' && nextPreview() == '*') { + // skip block comment + while (c != '') { + if (c == '*' && nextPreview() == '/') { + // end of block comment found. skip these last two characters + next(); + next(); + break; } - } - - function makeDateFromInput(config) { - var input = config._i, - matched = aspNetJsonRegex.exec(input); - - if (input === undefined) { - config._d = new Date(); - } else if (matched) { - config._d = new Date(+matched[1]); - } else if (typeof input === 'string') { - makeDateFromString(config); - } else if (isArray(input)) { - config._a = input.slice(0); - dateFromConfig(config); - } else if (isDate(input)) { - config._d = new Date(+input); - } else if (typeof(input) === 'object') { - dateFromObject(config); - } else if (typeof(input) === 'number') { - // from milliseconds - config._d = new Date(input); - } else { - moment.createFromInputFallback(config); + else { + next(); } + } + isComment = true; } - function makeDate(y, m, d, h, M, s, ms) { - //can't just apply() to create a date: - //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply - var date = new Date(y, m, d, h, M, s, ms); - - //the date constructor doesn't accept years < 1970 - if (y < 1970) { - date.setFullYear(y); - } - return date; + // skip over whitespaces + while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { // space, tab, enter + next(); } + } + while (isComment); - function makeUTCDate(y) { - var date = new Date(Date.UTC.apply(null, arguments)); - if (y < 1970) { - date.setUTCFullYear(y); - } - return date; - } + // check for end of dot file + if (c == '') { + // token is still empty + tokenType = TOKENTYPE.DELIMITER; + return; + } - function parseWeekday(input, language) { - if (typeof input === 'string') { - if (!isNaN(input)) { - input = parseInt(input, 10); - } - else { - input = language.weekdaysParse(input); - if (typeof input !== 'number') { - return null; - } - } - } - return input; - } + // check for delimiters consisting of 2 characters + var c2 = c + nextPreview(); + if (DELIMITERS[c2]) { + tokenType = TOKENTYPE.DELIMITER; + token = c2; + next(); + next(); + return; + } - /************************************ - Relative Time - ************************************/ + // check for delimiters consisting of 1 character + if (DELIMITERS[c]) { + tokenType = TOKENTYPE.DELIMITER; + token = c; + next(); + return; + } + // check for an identifier (number or string) + // TODO: more precise parsing of numbers/strings (and the port separator ':') + if (isAlphaNumeric(c) || c == '-') { + token += c; + next(); - // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize - function substituteTimeAgo(string, number, withoutSuffix, isFuture, lang) { - return lang.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + while (isAlphaNumeric(c)) { + token += c; + next(); } + if (token == 'false') { + token = false; // convert to boolean + } + else if (token == 'true') { + token = true; // convert to boolean + } + else if (!isNaN(Number(token))) { + token = Number(token); // convert to number + } + tokenType = TOKENTYPE.IDENTIFIER; + return; + } - function relativeTime(milliseconds, withoutSuffix, lang) { - var seconds = round(Math.abs(milliseconds) / 1000), - minutes = round(seconds / 60), - hours = round(minutes / 60), - days = round(hours / 24), - years = round(days / 365), - args = seconds < relativeTimeThresholds.s && ['s', seconds] || - minutes === 1 && ['m'] || - minutes < relativeTimeThresholds.m && ['mm', minutes] || - hours === 1 && ['h'] || - hours < relativeTimeThresholds.h && ['hh', hours] || - days === 1 && ['d'] || - days <= relativeTimeThresholds.dd && ['dd', days] || - days <= relativeTimeThresholds.dm && ['M'] || - days < relativeTimeThresholds.dy && ['MM', round(days / 30)] || - years === 1 && ['y'] || ['yy', years]; - args[2] = withoutSuffix; - args[3] = milliseconds > 0; - args[4] = lang; - return substituteTimeAgo.apply({}, args); + // check for a string enclosed by double quotes + if (c == '"') { + next(); + while (c != '' && (c != '"' || (c == '"' && nextPreview() == '"'))) { + token += c; + if (c == '"') { // skip the escape character + next(); + } + next(); + } + if (c != '"') { + throw newSyntaxError('End of string " expected'); } + next(); + tokenType = TOKENTYPE.IDENTIFIER; + return; + } + // something unknown is found, wrong characters, a syntax error + tokenType = TOKENTYPE.UNKNOWN; + while (c != '') { + token += c; + next(); + } + throw new SyntaxError('Syntax error in part "' + chop(token, 30) + '"'); + } - /************************************ - Week of Year - ************************************/ + /** + * Parse a graph. + * @returns {Object} graph + */ + function parseGraph() { + var graph = {}; + first(); + getToken(); - // firstDayOfWeek 0 = sun, 6 = sat - // the day of the week that starts the week - // (usually sunday or monday) - // firstDayOfWeekOfYear 0 = sun, 6 = sat - // the first week is the week that contains the first - // of this day of the week - // (eg. ISO weeks use thursday (4)) - function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { - var end = firstDayOfWeekOfYear - firstDayOfWeek, - daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), - adjustedMoment; + // optional strict keyword + if (token == 'strict') { + graph.strict = true; + getToken(); + } + // graph or digraph keyword + if (token == 'graph' || token == 'digraph') { + graph.type = token; + getToken(); + } - if (daysToDayOfWeek > end) { - daysToDayOfWeek -= 7; - } + // optional graph id + if (tokenType == TOKENTYPE.IDENTIFIER) { + graph.id = token; + getToken(); + } - if (daysToDayOfWeek < end - 7) { - daysToDayOfWeek += 7; - } + // open angle bracket + if (token != '{') { + throw newSyntaxError('Angle bracket { expected'); + } + getToken(); - adjustedMoment = moment(mom).add('d', daysToDayOfWeek); - return { - week: Math.ceil(adjustedMoment.dayOfYear() / 7), - year: adjustedMoment.year() - }; - } + // statements + parseStatements(graph); - //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { - var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; + // close angle bracket + if (token != '}') { + throw newSyntaxError('Angle bracket } expected'); + } + getToken(); - d = d === 0 ? 7 : d; - weekday = weekday != null ? weekday : firstDayOfWeek; - daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); - dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + // end of file + if (token !== '') { + throw newSyntaxError('End of file expected'); + } + getToken(); - return { - year: dayOfYear > 0 ? year : year - 1, - dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear - }; - } + // remove temporary default properties + delete graph.node; + delete graph.edge; + delete graph.graph; - /************************************ - Top Level Functions - ************************************/ + return graph; + } - function makeMoment(config) { - var input = config._i, - format = config._f; + /** + * Parse a list with statements. + * @param {Object} graph + */ + function parseStatements (graph) { + while (token !== '' && token != '}') { + parseStatement(graph); + if (token == ';') { + getToken(); + } + } + } - if (input === null || (format === undefined && input === '')) { - return moment.invalid({nullInput: true}); - } + /** + * Parse a single statement. Can be a an attribute statement, node + * statement, a series of node statements and edge statements, or a + * parameter. + * @param {Object} graph + */ + function parseStatement(graph) { + // parse subgraph + var subgraph = parseSubgraph(graph); + if (subgraph) { + // edge statements + parseEdge(graph, subgraph); - if (typeof input === 'string') { - config._i = input = getLangDefinition().preparse(input); - } + return; + } - if (moment.isMoment(input)) { - config = cloneMoment(input); + // parse an attribute statement + var attr = parseAttributeStatement(graph); + if (attr) { + return; + } - config._d = new Date(+input._d); - } else if (format) { - if (isArray(format)) { - makeDateFromStringAndArray(config); - } else { - makeDateFromStringAndFormat(config); - } - } else { - makeDateFromInput(config); - } + // parse node + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Identifier expected'); + } + var id = token; // id can be a string or a number + getToken(); - return new Moment(config); + if (token == '=') { + // id statement + getToken(); + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Identifier expected'); } + graph[id] = token; + getToken(); + // TODO: implement comma separated list with "a_list: ID=ID [','] [a_list] " + } + else { + parseNodeStatement(graph, id); + } + } - moment = function (input, format, lang, strict) { - var c; - - if (typeof(lang) === "boolean") { - strict = lang; - lang = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c = {}; - c._isAMomentObject = true; - c._i = input; - c._f = format; - c._l = lang; - c._strict = strict; - c._isUTC = false; - c._pf = defaultParsingFlags(); + /** + * Parse a subgraph + * @param {Object} graph parent graph object + * @return {Object | null} subgraph + */ + function parseSubgraph (graph) { + var subgraph = null; - return makeMoment(c); - }; + // optional subgraph keyword + if (token == 'subgraph') { + subgraph = {}; + subgraph.type = 'subgraph'; + getToken(); - moment.suppressDeprecationWarnings = false; + // optional graph id + if (tokenType == TOKENTYPE.IDENTIFIER) { + subgraph.id = token; + getToken(); + } + } - moment.createFromInputFallback = deprecate( - "moment construction falls back to js Date. This is " + - "discouraged and will be removed in upcoming major " + - "release. Please refer to " + - "https://github.com/moment/moment/issues/1407 for more info.", - function (config) { - config._d = new Date(config._i); - }); + // open angle bracket + if (token == '{') { + getToken(); - // Pick a moment m from moments so that m[fn](other) is true for all - // other. This relies on the function fn to be transitive. - // - // moments should either be an array of moment objects or an array, whose - // first element is an array of moment objects. - function pickBy(fn, moments) { - var res, i; - if (moments.length === 1 && isArray(moments[0])) { - moments = moments[0]; - } - if (!moments.length) { - return moment(); - } - res = moments[0]; - for (i = 1; i < moments.length; ++i) { - if (moments[i][fn](res)) { - res = moments[i]; - } - } - return res; + if (!subgraph) { + subgraph = {}; } + subgraph.parent = graph; + subgraph.node = graph.node; + subgraph.edge = graph.edge; + subgraph.graph = graph.graph; - moment.min = function () { - var args = [].slice.call(arguments, 0); + // statements + parseStatements(subgraph); - return pickBy('isBefore', args); - }; + // close angle bracket + if (token != '}') { + throw newSyntaxError('Angle bracket } expected'); + } + getToken(); - moment.max = function () { - var args = [].slice.call(arguments, 0); + // remove temporary default properties + delete subgraph.node; + delete subgraph.edge; + delete subgraph.graph; + delete subgraph.parent; - return pickBy('isAfter', args); - }; + // register at the parent graph + if (!graph.subgraphs) { + graph.subgraphs = []; + } + graph.subgraphs.push(subgraph); + } - // creating with utc - moment.utc = function (input, format, lang, strict) { - var c; + return subgraph; + } - if (typeof(lang) === "boolean") { - strict = lang; - lang = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c = {}; - c._isAMomentObject = true; - c._useUTC = true; - c._isUTC = true; - c._l = lang; - c._i = input; - c._f = format; - c._strict = strict; - c._pf = defaultParsingFlags(); + /** + * parse an attribute statement like "node [shape=circle fontSize=16]". + * Available keywords are 'node', 'edge', 'graph'. + * The previous list with default attributes will be replaced + * @param {Object} graph + * @returns {String | null} keyword Returns the name of the parsed attribute + * (node, edge, graph), or null if nothing + * is parsed. + */ + function parseAttributeStatement (graph) { + // attribute statements + if (token == 'node') { + getToken(); - return makeMoment(c).utc(); - }; + // node attributes + graph.node = parseAttributeList(); + return 'node'; + } + else if (token == 'edge') { + getToken(); - // creating with unix timestamp (in seconds) - moment.unix = function (input) { - return moment(input * 1000); - }; + // edge attributes + graph.edge = parseAttributeList(); + return 'edge'; + } + else if (token == 'graph') { + getToken(); - // duration - moment.duration = function (input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - parseIso; + // graph attributes + graph.graph = parseAttributeList(); + return 'graph'; + } - if (moment.isDuration(input)) { - duration = { - ms: input._milliseconds, - d: input._days, - M: input._months - }; - } else if (typeof input === 'number') { - duration = {}; - if (key) { - duration[key] = input; - } else { - duration.milliseconds = input; - } - } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { - sign = (match[1] === "-") ? -1 : 1; - duration = { - y: 0, - d: toInt(match[DATE]) * sign, - h: toInt(match[HOUR]) * sign, - m: toInt(match[MINUTE]) * sign, - s: toInt(match[SECOND]) * sign, - ms: toInt(match[MILLISECOND]) * sign - }; - } else if (!!(match = isoDurationRegex.exec(input))) { - sign = (match[1] === "-") ? -1 : 1; - parseIso = function (inp) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; - }; - duration = { - y: parseIso(match[2]), - M: parseIso(match[3]), - d: parseIso(match[4]), - h: parseIso(match[5]), - m: parseIso(match[6]), - s: parseIso(match[7]), - w: parseIso(match[8]) - }; - } + return null; + } - ret = new Duration(duration); + /** + * parse a node statement + * @param {Object} graph + * @param {String | Number} id + */ + function parseNodeStatement(graph, id) { + // node statement + var node = { + id: id + }; + var attr = parseAttributeList(); + if (attr) { + node.attr = attr; + } + addNode(graph, node); - if (moment.isDuration(input) && input.hasOwnProperty('_lang')) { - ret._lang = input._lang; - } + // edge statements + parseEdge(graph, id); + } - return ret; - }; + /** + * Parse an edge or a series of edges + * @param {Object} graph + * @param {String | Number} from Id of the from node + */ + function parseEdge(graph, from) { + while (token == '->' || token == '--') { + var to; + var type = token; + getToken(); - // version number - moment.version = VERSION; + var subgraph = parseSubgraph(graph); + if (subgraph) { + to = subgraph; + } + else { + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Identifier or subgraph expected'); + } + to = token; + addNode(graph, { + id: to + }); + getToken(); + } - // default format - moment.defaultFormat = isoFormat; + // parse edge attributes + var attr = parseAttributeList(); - // constant that refers to the ISO standard - moment.ISO_8601 = function () {}; + // create edge + var edge = createEdge(graph, from, to, type, attr); + addEdge(graph, edge); - // Plugins that add properties should also add the key here (null value), - // so we can properly clone ourselves. - moment.momentProperties = momentProperties; + from = to; + } + } - // This function will be called whenever a moment is mutated. - // It is intended to keep the offset in sync with the timezone. - moment.updateOffset = function () {}; + /** + * Parse a set with attributes, + * for example [label="1.000", shape=solid] + * @return {Object | null} attr + */ + function parseAttributeList() { + var attr = null; - // This function allows you to set a threshold for relative time strings - moment.relativeTimeThreshold = function(threshold, limit) { - if (relativeTimeThresholds[threshold] === undefined) { - return false; + while (token == '[') { + getToken(); + attr = {}; + while (token !== '' && token != ']') { + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Attribute name expected'); } - relativeTimeThresholds[threshold] = limit; - return true; - }; - - // This function will load languages and then set the global language. If - // no arguments are passed in, it will simply return the current global - // language key. - moment.lang = function (key, values) { - var r; - if (!key) { - return moment.fn._lang._abbr; - } - if (values) { - loadLang(normalizeLanguage(key), values); - } else if (values === null) { - unloadLang(key); - key = 'en'; - } else if (!languages[key]) { - getLangDefinition(key); - } - r = moment.duration.fn._lang = moment.fn._lang = getLangDefinition(key); - return r._abbr; - }; + var name = token; - // returns language data - moment.langData = function (key) { - if (key && key._lang && key._lang._abbr) { - key = key._lang._abbr; - } - return getLangDefinition(key); - }; + getToken(); + if (token != '=') { + throw newSyntaxError('Equal sign = expected'); + } + getToken(); - // compare moment object - moment.isMoment = function (obj) { - return obj instanceof Moment || - (obj != null && obj.hasOwnProperty('_isAMomentObject')); - }; + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Attribute value expected'); + } + var value = token; + setValue(attr, name, value); // name can be a path - // for typechecking Duration objects - moment.isDuration = function (obj) { - return obj instanceof Duration; - }; + getToken(); + if (token ==',') { + getToken(); + } + } - for (i = lists.length - 1; i >= 0; --i) { - makeList(lists[i]); + if (token != ']') { + throw newSyntaxError('Bracket ] expected'); } + getToken(); + } - moment.normalizeUnits = function (units) { - return normalizeUnits(units); - }; + return attr; + } - moment.invalid = function (flags) { - var m = moment.utc(NaN); - if (flags != null) { - extend(m._pf, flags); - } - else { - m._pf.userInvalidated = true; - } + /** + * Create a syntax error with extra information on current token and index. + * @param {String} message + * @returns {SyntaxError} err + */ + function newSyntaxError(message) { + return new SyntaxError(message + ', got "' + chop(token, 30) + '" (char ' + index + ')'); + } - return m; - }; + /** + * Chop off text after a maximum length + * @param {String} text + * @param {Number} maxLength + * @returns {String} + */ + function chop (text, maxLength) { + return (text.length <= maxLength) ? text : (text.substr(0, 27) + '...'); + } - moment.parseZone = function () { - return moment.apply(null, arguments).parseZone(); - }; + /** + * Execute a function fn for each pair of elements in two arrays + * @param {Array | *} array1 + * @param {Array | *} array2 + * @param {function} fn + */ + function forEach2(array1, array2, fn) { + if (array1 instanceof Array) { + array1.forEach(function (elem1) { + if (array2 instanceof Array) { + array2.forEach(function (elem2) { + fn(elem1, elem2); + }); + } + else { + fn(elem1, array2); + } + }); + } + else { + if (array2 instanceof Array) { + array2.forEach(function (elem2) { + fn(array1, elem2); + }); + } + else { + fn(array1, array2); + } + } + } - moment.parseTwoDigitYear = function (input) { - return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); - }; + /** + * Convert a string containing a graph in DOT language into a map containing + * with nodes and edges in the format of graph. + * @param {String} data Text containing a graph in DOT-notation + * @return {Object} graphData + */ + function DOTToGraph (data) { + // parse the DOT file + var dotData = parseDOT(data); + var graphData = { + nodes: [], + edges: [], + options: {} + }; - /************************************ - Moment Prototype - ************************************/ + // copy the nodes + if (dotData.nodes) { + dotData.nodes.forEach(function (dotNode) { + var graphNode = { + id: dotNode.id, + label: String(dotNode.label || dotNode.id) + }; + merge(graphNode, dotNode.attr); + if (graphNode.image) { + graphNode.shape = 'image'; + } + graphData.nodes.push(graphNode); + }); + } + + // copy the edges + if (dotData.edges) { + /** + * Convert an edge in DOT format to an edge with VisGraph format + * @param {Object} dotEdge + * @returns {Object} graphEdge + */ + function convertEdge(dotEdge) { + var graphEdge = { + from: dotEdge.from, + to: dotEdge.to + }; + merge(graphEdge, dotEdge.attr); + graphEdge.style = (dotEdge.type == '->') ? 'arrow' : 'line'; + return graphEdge; + } + dotData.edges.forEach(function (dotEdge) { + var from, to; + if (dotEdge.from instanceof Object) { + from = dotEdge.from.nodes; + } + else { + from = { + id: dotEdge.from + } + } - extend(moment.fn = Moment.prototype, { + if (dotEdge.to instanceof Object) { + to = dotEdge.to.nodes; + } + else { + to = { + id: dotEdge.to + } + } - clone : function () { - return moment(this); - }, + if (dotEdge.from instanceof Object && dotEdge.from.edges) { + dotEdge.from.edges.forEach(function (subEdge) { + var graphEdge = convertEdge(subEdge); + graphData.edges.push(graphEdge); + }); + } - valueOf : function () { - return +this._d + ((this._offset || 0) * 60000); - }, + forEach2(from, to, function (from, to) { + var subEdge = createEdge(graphData, from.id, to.id, dotEdge.type, dotEdge.attr); + var graphEdge = convertEdge(subEdge); + graphData.edges.push(graphEdge); + }); - unix : function () { - return Math.floor(+this / 1000); - }, + if (dotEdge.to instanceof Object && dotEdge.to.edges) { + dotEdge.to.edges.forEach(function (subEdge) { + var graphEdge = convertEdge(subEdge); + graphData.edges.push(graphEdge); + }); + } + }); + } - toString : function () { - return this.clone().lang('en').format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ"); - }, + // copy the options + if (dotData.attr) { + graphData.options = dotData.attr; + } - toDate : function () { - return this._offset ? new Date(+this) : this._d; - }, + return graphData; + } - toISOString : function () { - var m = moment(this).utc(); - if (0 < m.year() && m.year() <= 9999) { - return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } else { - return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } - }, + // exports + exports.parseDOT = parseDOT; + exports.DOTToGraph = DOTToGraph; - toArray : function () { - var m = this; - return [ - m.year(), - m.month(), - m.date(), - m.hours(), - m.minutes(), - m.seconds(), - m.milliseconds() - ]; - }, - isValid : function () { - return isValid(this); - }, +/***/ }, +/* 46 */ +/***/ function(module, exports, __webpack_require__) { - isDSTShifted : function () { + + function parseGephi(gephiJSON, options) { + var edges = []; + var nodes = []; + this.options = { + edges: { + inheritColor: true + }, + nodes: { + allowedToMove: false, + parseColor: false + } + }; - if (this._a) { - return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; - } + if (options !== undefined) { + this.options.nodes['allowedToMove'] = options.allowedToMove | false; + this.options.nodes['parseColor'] = options.parseColor | false; + this.options.edges['inheritColor'] = options.inheritColor | true; + } - return false; - }, + var gEdges = gephiJSON.edges; + var gNodes = gephiJSON.nodes; + for (var i = 0; i < gEdges.length; i++) { + var edge = {}; + var gEdge = gEdges[i]; + edge['id'] = gEdge.id; + edge['from'] = gEdge.source; + edge['to'] = gEdge.target; + edge['attributes'] = gEdge.attributes; + // edge['value'] = gEdge.attributes !== undefined ? gEdge.attributes.Weight : undefined; + // edge['width'] = edge['value'] !== undefined ? undefined : edgegEdge.size; + edge['color'] = gEdge.color; + edge['inheritColor'] = edge['color'] !== undefined ? false : this.options.inheritColor; + edges.push(edge); + } - parsingFlags : function () { - return extend({}, this._pf); - }, + for (var i = 0; i < gNodes.length; i++) { + var node = {}; + var gNode = gNodes[i]; + node['id'] = gNode.id; + node['attributes'] = gNode.attributes; + node['x'] = gNode.x; + node['y'] = gNode.y; + node['label'] = gNode.label; + if (this.options.nodes.parseColor == true) { + node['color'] = gNode.color; + } + else { + node['color'] = gNode.color !== undefined ? {background:gNode.color, border:gNode.color} : undefined; + } + node['radius'] = gNode.size; + node['allowedToMoveX'] = this.options.nodes.allowedToMove; + node['allowedToMoveY'] = this.options.nodes.allowedToMove; + nodes.push(node); + } - invalidAt: function () { - return this._pf.overflow; - }, + return {nodes:nodes, edges:edges}; + } - utc : function () { - return this.zone(0); - }, + exports.parseGephi = parseGephi; - local : function () { - this.zone(0); - this._isUTC = false; - return this; - }, +/***/ }, +/* 47 */ +/***/ function(module, exports, __webpack_require__) { - format : function (inputString) { - var output = formatMoment(this, inputString || moment.defaultFormat); - return this.lang().postformat(output); - }, + var util = __webpack_require__(1); - add : function (input, val) { - var dur; - // switch args to support add('s', 1) and add(1, 's') - if (typeof input === 'string' && typeof val === 'string') { - dur = moment.duration(isNaN(+val) ? +input : +val, isNaN(+val) ? val : input); - } else if (typeof input === 'string') { - dur = moment.duration(+val, input); - } else { - dur = moment.duration(input, val); - } - addOrSubtractDurationFromMoment(this, dur, 1); - return this; - }, + /** + * @class Groups + * This class can store groups and properties specific for groups. + */ + function Groups() { + this.clear(); + this.defaultIndex = 0; + } - subtract : function (input, val) { - var dur; - // switch args to support subtract('s', 1) and subtract(1, 's') - if (typeof input === 'string' && typeof val === 'string') { - dur = moment.duration(isNaN(+val) ? +input : +val, isNaN(+val) ? val : input); - } else if (typeof input === 'string') { - dur = moment.duration(+val, input); - } else { - dur = moment.duration(input, val); - } - addOrSubtractDurationFromMoment(this, dur, -1); - return this; - }, - diff : function (input, units, asFloat) { - var that = makeAs(input, this), - zoneDiff = (this.zone() - that.zone()) * 6e4, - diff, output; + /** + * default constants for group colors + */ + Groups.DEFAULT = [ + {border: "#2B7CE9", background: "#97C2FC", highlight: {border: "#2B7CE9", background: "#D2E5FF"}, hover: {border: "#2B7CE9", background: "#D2E5FF"}}, // blue + {border: "#FFA500", background: "#FFFF00", highlight: {border: "#FFA500", background: "#FFFFA3"}, hover: {border: "#FFA500", background: "#FFFFA3"}}, // yellow + {border: "#FA0A10", background: "#FB7E81", highlight: {border: "#FA0A10", background: "#FFAFB1"}, hover: {border: "#FA0A10", background: "#FFAFB1"}}, // red + {border: "#41A906", background: "#7BE141", highlight: {border: "#41A906", background: "#A1EC76"}, hover: {border: "#41A906", background: "#A1EC76"}}, // green + {border: "#E129F0", background: "#EB7DF4", highlight: {border: "#E129F0", background: "#F0B3F5"}, hover: {border: "#E129F0", background: "#F0B3F5"}}, // magenta + {border: "#7C29F0", background: "#AD85E4", highlight: {border: "#7C29F0", background: "#D3BDF0"}, hover: {border: "#7C29F0", background: "#D3BDF0"}}, // purple + {border: "#C37F00", background: "#FFA807", highlight: {border: "#C37F00", background: "#FFCA66"}, hover: {border: "#C37F00", background: "#FFCA66"}}, // orange + {border: "#4220FB", background: "#6E6EFD", highlight: {border: "#4220FB", background: "#9B9BFD"}, hover: {border: "#4220FB", background: "#9B9BFD"}}, // darkblue + {border: "#FD5A77", background: "#FFC0CB", highlight: {border: "#FD5A77", background: "#FFD1D9"}, hover: {border: "#FD5A77", background: "#FFD1D9"}}, // pink + {border: "#4AD63A", background: "#C2FABC", highlight: {border: "#4AD63A", background: "#E6FFE3"}, hover: {border: "#4AD63A", background: "#E6FFE3"}} // mint + ]; - units = normalizeUnits(units); - if (units === 'year' || units === 'month') { - // average number of days in the months in the given dates - diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2 - // difference in months - output = ((this.year() - that.year()) * 12) + (this.month() - that.month()); - // adjust by taking difference in days, average number of days - // and dst in the given months. - output += ((this - moment(this).startOf('month')) - - (that - moment(that).startOf('month'))) / diff; - // same as above but with zones, to negate all dst - output -= ((this.zone() - moment(this).startOf('month').zone()) - - (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff; - if (units === 'year') { - output = output / 12; - } - } else { - diff = (this - that); - output = units === 'second' ? diff / 1e3 : // 1000 - units === 'minute' ? diff / 6e4 : // 1000 * 60 - units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 - units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst - units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst - diff; - } - return asFloat ? output : absRound(output); - }, + /** + * Clear all groups + */ + Groups.prototype.clear = function () { + this.groups = {}; + this.groups.length = function() + { + var i = 0; + for ( var p in this ) { + if (this.hasOwnProperty(p)) { + i++; + } + } + return i; + } + }; - from : function (time, withoutSuffix) { - return moment.duration(this.diff(time)).lang(this.lang()._abbr).humanize(!withoutSuffix); - }, - fromNow : function (withoutSuffix) { - return this.from(moment(), withoutSuffix); - }, + /** + * get group properties of a groupname. If groupname is not found, a new group + * is added. + * @param {*} groupname Can be a number, string, Date, etc. + * @return {Object} group The created group, containing all group properties + */ + Groups.prototype.get = function (groupname) { + var group = this.groups[groupname]; + if (group == undefined) { + // create new group + var index = this.defaultIndex % Groups.DEFAULT.length; + this.defaultIndex++; + group = {}; + group.color = Groups.DEFAULT[index]; + this.groups[groupname] = group; + } - calendar : function (time) { - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're zone'd or not. - var now = time || moment(), - sod = makeAs(now, this).startOf('day'), - diff = this.diff(sod, 'days', true), - format = diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; - return this.format(this.lang().calendar(format, this)); - }, + return group; + }; - isLeapYear : function () { - return isLeapYear(this.year()); - }, + /** + * Add a custom group style + * @param {String} groupname + * @param {Object} style An object containing borderColor, + * backgroundColor, etc. + * @return {Object} group The created group object + */ + Groups.prototype.add = function (groupname, style) { + this.groups[groupname] = style; + if (style.color) { + style.color = util.parseColor(style.color); + } + return style; + }; - isDST : function () { - return (this.zone() < this.clone().month(0).zone() || - this.zone() < this.clone().month(5).zone()); - }, + module.exports = Groups; - day : function (input) { - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - if (input != null) { - input = parseWeekday(input, this.lang()); - return this.add({ d : input - day }); - } else { - return day; - } - }, - month : makeAccessor('Month', true), +/***/ }, +/* 48 */ +/***/ function(module, exports, __webpack_require__) { - startOf: function (units) { - units = normalizeUnits(units); - // the following switch intentionally omits break keywords - // to utilize falling through the cases. - switch (units) { - case 'year': - this.month(0); - /* falls through */ - case 'quarter': - case 'month': - this.date(1); - /* falls through */ - case 'week': - case 'isoWeek': - case 'day': - this.hours(0); - /* falls through */ - case 'hour': - this.minutes(0); - /* falls through */ - case 'minute': - this.seconds(0); - /* falls through */ - case 'second': - this.milliseconds(0); - /* falls through */ - } + /** + * @class Images + * This class loads images and keeps them stored. + */ + function Images() { + this.images = {}; - // weeks are a special case - if (units === 'week') { - this.weekday(0); - } else if (units === 'isoWeek') { - this.isoWeekday(1); - } + this.callback = undefined; + } - // quarters are also special - if (units === 'quarter') { - this.month(Math.floor(this.month() / 3) * 3); - } + /** + * Set an onload callback function. This will be called each time an image + * is loaded + * @param {function} callback + */ + Images.prototype.setOnloadCallback = function(callback) { + this.callback = callback; + }; - return this; - }, + /** + * + * @param {string} url Url of the image + * @return {Image} img The image object + */ + Images.prototype.load = function(url) { + var img = this.images[url]; + if (img == undefined) { + // create the image + var images = this; + img = new Image(); + this.images[url] = img; + img.onload = function() { + if (images.callback) { + images.callback(this); + } + }; + img.src = url; + } - endOf: function (units) { - units = normalizeUnits(units); - return this.startOf(units).add((units === 'isoWeek' ? 'week' : units), 1).subtract('ms', 1); - }, + return img; + }; - isAfter: function (input, units) { - units = typeof units !== 'undefined' ? units : 'millisecond'; - return +this.clone().startOf(units) > +moment(input).startOf(units); - }, + module.exports = Images; - isBefore: function (input, units) { - units = typeof units !== 'undefined' ? units : 'millisecond'; - return +this.clone().startOf(units) < +moment(input).startOf(units); - }, - isSame: function (input, units) { - units = units || 'ms'; - return +this.clone().startOf(units) === +makeAs(input, this).startOf(units); - }, +/***/ }, +/* 49 */ +/***/ function(module, exports, __webpack_require__) { - min: deprecate( - "moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548", - function (other) { - other = moment.apply(null, arguments); - return other < this ? this : other; - } - ), + var util = __webpack_require__(1); - max: deprecate( - "moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548", - function (other) { - other = moment.apply(null, arguments); - return other > this ? this : other; - } - ), + /** + * @class Node + * A node. A node can be connected to other nodes via one or multiple edges. + * @param {object} properties An object containing properties for the node. All + * properties are optional, except for the id. + * {number} id Id of the node. Required + * {string} label Text label for the node + * {number} x Horizontal position of the node + * {number} y Vertical position of the node + * {string} shape Node shape, available: + * "database", "circle", "ellipse", + * "box", "image", "text", "dot", + * "star", "triangle", "triangleDown", + * "square" + * {string} image An image url + * {string} title An title text, can be HTML + * {anytype} group A group name or number + * @param {Network.Images} imagelist A list with images. Only needed + * when the node has an image + * @param {Network.Groups} grouplist A list with groups. Needed for + * retrieving group properties + * @param {Object} constants An object with default values for + * example for the color + * + */ + function Node(properties, imagelist, grouplist, networkConstants) { + var constants = util.selectiveBridgeObject(['nodes'],networkConstants); + this.options = constants.nodes; - // keepTime = true means only change the timezone, without affecting - // the local hour. So 5:31:26 +0300 --[zone(2, true)]--> 5:31:26 +0200 - // It is possible that 5:31:26 doesn't exist int zone +0200, so we - // adjust the time as needed, to be valid. - // - // Keeping the time actually adds/subtracts (one hour) - // from the actual represented time. That is why we call updateOffset - // a second time. In case it wants us to change the offset again - // _changeInProgress == true case, then we have to adjust, because - // there is no such time in the given timezone. - zone : function (input, keepTime) { - var offset = this._offset || 0; - if (input != null) { - if (typeof input === "string") { - input = timezoneMinutesFromString(input); - } - if (Math.abs(input) < 16) { - input = input * 60; - } - this._offset = input; - this._isUTC = true; - if (offset !== input) { - if (!keepTime || this._changeInProgress) { - addOrSubtractDurationFromMoment(this, - moment.duration(offset - input, 'm'), 1, false); - } else if (!this._changeInProgress) { - this._changeInProgress = true; - moment.updateOffset(this, true); - this._changeInProgress = null; - } - } - } else { - return this._isUTC ? offset : this._d.getTimezoneOffset(); - } - return this; - }, + this.selected = false; + this.hover = false; - zoneAbbr : function () { - return this._isUTC ? "UTC" : ""; - }, + this.edges = []; // all edges connected to this node + this.dynamicEdges = []; + this.reroutedEdges = {}; - zoneName : function () { - return this._isUTC ? "Coordinated Universal Time" : ""; - }, + this.fontDrawThreshold = 3; - parseZone : function () { - if (this._tzm) { - this.zone(this._tzm); - } else if (typeof this._i === 'string') { - this.zone(this._i); - } - return this; - }, + // set defaults for the properties + this.id = undefined; + this.x = null; + this.y = null; + this.xFixed = false; + this.yFixed = false; + this.horizontalAlignLeft = true; // these are for the navigation controls + this.verticalAlignTop = true; // these are for the navigation controls + this.baseRadiusValue = networkConstants.nodes.radius; + this.radiusFixed = false; + this.level = -1; + this.preassignedLevel = false; - hasAlignedHourOffset : function (input) { - if (!input) { - input = 0; - } - else { - input = moment(input).zone(); - } - return (this.zone() - input) % 60 === 0; - }, + this.imagelist = imagelist; + this.grouplist = grouplist; - daysInMonth : function () { - return daysInMonth(this.year(), this.month()); - }, + // physics properties + this.fx = 0.0; // external force x + this.fy = 0.0; // external force y + this.vx = 0.0; // velocity x + this.vy = 0.0; // velocity y + this.damping = networkConstants.physics.damping; // written every time gravity is calculated + this.fixedData = {x:null,y:null}; - dayOfYear : function (input) { - var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add("d", (input - dayOfYear)); - }, - quarter : function (input) { - return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); - }, + this.setProperties(properties, constants); - weekYear : function (input) { - var year = weekOfYear(this, this.lang()._week.dow, this.lang()._week.doy).year; - return input == null ? year : this.add("y", (input - year)); - }, + // creating the variables for clustering + this.resetCluster(); + this.dynamicEdgesLength = 0; + this.clusterSession = 0; + this.clusterSizeWidthFactor = networkConstants.clustering.nodeScaling.width; + this.clusterSizeHeightFactor = networkConstants.clustering.nodeScaling.height; + this.clusterSizeRadiusFactor = networkConstants.clustering.nodeScaling.radius; + this.maxNodeSizeIncrements = networkConstants.clustering.maxNodeSizeIncrements; + this.growthIndicator = 0; - isoWeekYear : function (input) { - var year = weekOfYear(this, 1, 4).year; - return input == null ? year : this.add("y", (input - year)); - }, + // variables to tell the node about the network. + this.networkScaleInv = 1; + this.networkScale = 1; + this.canvasTopLeft = {"x": -300, "y": -300}; + this.canvasBottomRight = {"x": 300, "y": 300}; + this.parentEdgeId = null; + } - week : function (input) { - var week = this.lang().week(this); - return input == null ? week : this.add("d", (input - week) * 7); - }, + /** + * (re)setting the clustering variables and objects + */ + Node.prototype.resetCluster = function() { + // clustering variables + this.formationScale = undefined; // this is used to determine when to open the cluster + this.clusterSize = 1; // this signifies the total amount of nodes in this cluster + this.containedNodes = {}; + this.containedEdges = {}; + this.clusterSessions = []; + }; - isoWeek : function (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add("d", (input - week) * 7); - }, + /** + * Attach a edge to the node + * @param {Edge} edge + */ + Node.prototype.attachEdge = function(edge) { + if (this.edges.indexOf(edge) == -1) { + this.edges.push(edge); + } + if (this.dynamicEdges.indexOf(edge) == -1) { + this.dynamicEdges.push(edge); + } + this.dynamicEdgesLength = this.dynamicEdges.length; + }; - weekday : function (input) { - var weekday = (this.day() + 7 - this.lang()._week.dow) % 7; - return input == null ? weekday : this.add("d", input - weekday); - }, + /** + * Detach a edge from the node + * @param {Edge} edge + */ + Node.prototype.detachEdge = function(edge) { + var index = this.edges.indexOf(edge); + if (index != -1) { + this.edges.splice(index, 1); + this.dynamicEdges.splice(index, 1); + } + this.dynamicEdgesLength = this.dynamicEdges.length; + }; - isoWeekday : function (input) { - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. - return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); - }, - isoWeeksInYear : function () { - return weeksInYear(this.year(), 1, 4); - }, + /** + * Set or overwrite properties for the node + * @param {Object} properties an object with properties + * @param {Object} constants and object with default, global properties + */ + Node.prototype.setProperties = function(properties, constants) { + if (!properties) { + return; + } - weeksInYear : function () { - var weekInfo = this._lang._week; - return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); - }, + var fields = ['borderWidth','borderWidthSelected','shape','image','radius','fontColor', + 'fontSize','fontFace','group','mass' + ]; + util.selectiveDeepExtend(fields, this.options, properties); - get : function (units) { - units = normalizeUnits(units); - return this[units](); - }, + this.originalLabel = undefined; + // basic properties + if (properties.id !== undefined) {this.id = properties.id;} + if (properties.label !== undefined) {this.label = properties.label; this.originalLabel = properties.label;} + if (properties.title !== undefined) {this.title = properties.title;} + if (properties.x !== undefined) {this.x = properties.x;} + if (properties.y !== undefined) {this.y = properties.y;} + if (properties.value !== undefined) {this.value = properties.value;} + if (properties.level !== undefined) {this.level = properties.level; this.preassignedLevel = true;} - set : function (units, value) { - units = normalizeUnits(units); - if (typeof this[units] === 'function') { - this[units](value); - } - return this; - }, + // navigation controls properties + if (properties.horizontalAlignLeft !== undefined) {this.horizontalAlignLeft = properties.horizontalAlignLeft;} + if (properties.verticalAlignTop !== undefined) {this.verticalAlignTop = properties.verticalAlignTop;} + if (properties.triggerFunction !== undefined) {this.triggerFunction = properties.triggerFunction;} - // If passed a language key, it will set the language for this - // instance. Otherwise, it will return the language configuration - // variables for this instance. - lang : function (key) { - if (key === undefined) { - return this._lang; - } else { - this._lang = getLangDefinition(key); - return this; - } - } - }); + if (this.id === undefined) { + throw "Node must have an id"; + } - function rawMonthSetter(mom, value) { - var dayOfMonth; + // copy group properties + if (typeof this.options.group === 'number' || (typeof this.options.group === 'string' && this.options.group != '')) { + var groupObj = this.grouplist.get(this.options.group); + for (var prop in groupObj) { + if (groupObj.hasOwnProperty(prop)) { + this.options[prop] = groupObj[prop]; + } + } + } - // TODO: Move this out of here! - if (typeof value === 'string') { - value = mom.lang().monthsParse(value); - // TODO: Another silent failure? - if (typeof value !== 'number') { - return mom; - } - } - dayOfMonth = Math.min(mom.date(), - daysInMonth(mom.year(), value)); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); - return mom; - } + // individual shape properties + if (properties.radius !== undefined) {this.baseRadiusValue = this.options.radius;} + if (properties.color !== undefined) {this.options.color = util.parseColor(properties.color);} - function rawGetter(mom, unit) { - return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + if (this.options.image!== undefined && this.options.image!= "") { + if (this.imagelist) { + this.imageObj = this.imagelist.load(this.options.image); } - - function rawSetter(mom, unit, value) { - if (unit === 'Month') { - return rawMonthSetter(mom, value); - } else { - return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); - } + else { + throw "No imagelist provided"; } + } - function makeAccessor(unit, keepTime) { - return function (value) { - if (value != null) { - rawSetter(this, unit, value); - moment.updateOffset(this, keepTime); - return this; - } else { - return rawGetter(this, unit); - } - }; - } + this.xFixed = this.xFixed || (properties.x !== undefined && !properties.allowedToMoveX); + this.yFixed = this.yFixed || (properties.y !== undefined && !properties.allowedToMoveY); + this.radiusFixed = this.radiusFixed || (properties.radius !== undefined); - moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); - moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); - moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); - // Setting the hour should keep the time, because the user explicitly - // specified which hour he wants. So trying to maintain the same hour (in - // a new timezone) makes sense. Adding/subtracting hours does not follow - // this rule. - moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); - // moment.fn.month is defined separately - moment.fn.date = makeAccessor('Date', true); - moment.fn.dates = deprecate("dates accessor is deprecated. Use date instead.", makeAccessor('Date', true)); - moment.fn.year = makeAccessor('FullYear', true); - moment.fn.years = deprecate("years accessor is deprecated. Use year instead.", makeAccessor('FullYear', true)); + if (this.options.shape == 'image') { + this.options.radiusMin = constants.nodes.widthMin; + this.options.radiusMax = constants.nodes.widthMax; + } - // add plural methods - moment.fn.days = moment.fn.day; - moment.fn.months = moment.fn.month; - moment.fn.weeks = moment.fn.week; - moment.fn.isoWeeks = moment.fn.isoWeek; - moment.fn.quarters = moment.fn.quarter; - // add aliased format methods - moment.fn.toJSON = moment.fn.toISOString; + // choose draw method depending on the shape + switch (this.options.shape) { + case 'database': this.draw = this._drawDatabase; this.resize = this._resizeDatabase; break; + case 'box': this.draw = this._drawBox; this.resize = this._resizeBox; break; + case 'circle': this.draw = this._drawCircle; this.resize = this._resizeCircle; break; + case 'ellipse': this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; + // TODO: add diamond shape + case 'image': this.draw = this._drawImage; this.resize = this._resizeImage; break; + case 'text': this.draw = this._drawText; this.resize = this._resizeText; break; + case 'dot': this.draw = this._drawDot; this.resize = this._resizeShape; break; + case 'square': this.draw = this._drawSquare; this.resize = this._resizeShape; break; + case 'triangle': this.draw = this._drawTriangle; this.resize = this._resizeShape; break; + case 'triangleDown': this.draw = this._drawTriangleDown; this.resize = this._resizeShape; break; + case 'star': this.draw = this._drawStar; this.resize = this._resizeShape; break; + default: this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; + } + // reset the size of the node, this can be changed + this._reset(); + }; - /************************************ - Duration Prototype - ************************************/ + /** + * select this node + */ + Node.prototype.select = function() { + this.selected = true; + this._reset(); + }; + /** + * unselect this node + */ + Node.prototype.unselect = function() { + this.selected = false; + this._reset(); + }; - extend(moment.duration.fn = Duration.prototype, { - _bubble : function () { - var milliseconds = this._milliseconds, - days = this._days, - months = this._months, - data = this._data, - seconds, minutes, hours, years; + /** + * Reset the calculated size of the node, forces it to recalculate its size + */ + Node.prototype.clearSizeCache = function() { + this._reset(); + }; - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; + /** + * Reset the calculated size of the node, forces it to recalculate its size + * @private + */ + Node.prototype._reset = function() { + this.width = undefined; + this.height = undefined; + }; - seconds = absRound(milliseconds / 1000); - data.seconds = seconds % 60; + /** + * get the title of this node. + * @return {string} title The title of the node, or undefined when no title + * has been set. + */ + Node.prototype.getTitle = function() { + return typeof this.title === "function" ? this.title() : this.title; + }; - minutes = absRound(seconds / 60); - data.minutes = minutes % 60; + /** + * Calculate the distance to the border of the Node + * @param {CanvasRenderingContext2D} ctx + * @param {Number} angle Angle in radians + * @returns {number} distance Distance to the border in pixels + */ + Node.prototype.distanceToBorder = function (ctx, angle) { + var borderWidth = 1; - hours = absRound(minutes / 60); - data.hours = hours % 24; + if (!this.width) { + this.resize(ctx); + } - days += absRound(hours / 24); - data.days = days % 30; + switch (this.options.shape) { + case 'circle': + case 'dot': + return this.options.radius+ borderWidth; - months += absRound(days / 30); - data.months = months % 12; + case 'ellipse': + var a = this.width / 2; + var b = this.height / 2; + var w = (Math.sin(angle) * a); + var h = (Math.cos(angle) * b); + return a * b / Math.sqrt(w * w + h * h); - years = absRound(months / 12); - data.years = years; - }, + // TODO: implement distanceToBorder for database + // TODO: implement distanceToBorder for triangle + // TODO: implement distanceToBorder for triangleDown - weeks : function () { - return absRound(this.days() / 7); - }, + case 'box': + case 'image': + case 'text': + default: + if (this.width) { + return Math.min( + Math.abs(this.width / 2 / Math.cos(angle)), + Math.abs(this.height / 2 / Math.sin(angle))) + borderWidth; + // TODO: reckon with border radius too in case of box + } + else { + return 0; + } - valueOf : function () { - return this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6; - }, + } + // TODO: implement calculation of distance to border for all shapes + }; - humanize : function (withSuffix) { - var difference = +this, - output = relativeTime(difference, !withSuffix, this.lang()); + /** + * Set forces acting on the node + * @param {number} fx Force in horizontal direction + * @param {number} fy Force in vertical direction + */ + Node.prototype._setForce = function(fx, fy) { + this.fx = fx; + this.fy = fy; + }; - if (withSuffix) { - output = this.lang().pastFuture(difference, output); - } + /** + * Add forces acting on the node + * @param {number} fx Force in horizontal direction + * @param {number} fy Force in vertical direction + * @private + */ + Node.prototype._addForce = function(fx, fy) { + this.fx += fx; + this.fy += fy; + }; - return this.lang().postformat(output); - }, + /** + * Perform one discrete step for the node + * @param {number} interval Time interval in seconds + */ + Node.prototype.discreteStep = function(interval) { + if (!this.xFixed) { + var dx = this.damping * this.vx; // damping force + var ax = (this.fx - dx) / this.options.mass; // acceleration + this.vx += ax * interval; // velocity + this.x += this.vx * interval; // position + } - add : function (input, val) { - // supports only 2.0-style add(1, 's') or add(moment) - var dur = moment.duration(input, val); + if (!this.yFixed) { + var dy = this.damping * this.vy; // damping force + var ay = (this.fy - dy) / this.options.mass; // acceleration + this.vy += ay * interval; // velocity + this.y += this.vy * interval; // position + } + }; - this._milliseconds += dur._milliseconds; - this._days += dur._days; - this._months += dur._months; - this._bubble(); - return this; - }, + /** + * Perform one discrete step for the node + * @param {number} interval Time interval in seconds + * @param {number} maxVelocity The speed limit imposed on the velocity + */ + Node.prototype.discreteStepLimited = function(interval, maxVelocity) { + if (!this.xFixed) { + var dx = this.damping * this.vx; // damping force + var ax = (this.fx - dx) / this.options.mass; // acceleration + this.vx += ax * interval; // velocity + this.vx = (Math.abs(this.vx) > maxVelocity) ? ((this.vx > 0) ? maxVelocity : -maxVelocity) : this.vx; + this.x += this.vx * interval; // position + } + else { + this.fx = 0; + } - subtract : function (input, val) { - var dur = moment.duration(input, val); + if (!this.yFixed) { + var dy = this.damping * this.vy; // damping force + var ay = (this.fy - dy) / this.options.mass; // acceleration + this.vy += ay * interval; // velocity + this.vy = (Math.abs(this.vy) > maxVelocity) ? ((this.vy > 0) ? maxVelocity : -maxVelocity) : this.vy; + this.y += this.vy * interval; // position + } + else { + this.fy = 0; + } + }; - this._milliseconds -= dur._milliseconds; - this._days -= dur._days; - this._months -= dur._months; + /** + * Check if this node has a fixed x and y position + * @return {boolean} true if fixed, false if not + */ + Node.prototype.isFixed = function() { + return (this.xFixed && this.yFixed); + }; - this._bubble(); + /** + * Check if this node is moving + * @param {number} vmin the minimum velocity considered as "moving" + * @return {boolean} true if moving, false if it has no velocity + */ + Node.prototype.isMoving = function(vmin) { + var velocity = Math.sqrt(Math.pow(this.vx,2) + Math.pow(this.vy,2)); + // this.velocity = Math.sqrt(Math.pow(this.vx,2) + Math.pow(this.vy,2)) + return (velocity > vmin); + }; - return this; - }, + /** + * check if this node is selecte + * @return {boolean} selected True if node is selected, else false + */ + Node.prototype.isSelected = function() { + return this.selected; + }; - get : function (units) { - units = normalizeUnits(units); - return this[units.toLowerCase() + 's'](); - }, + /** + * Retrieve the value of the node. Can be undefined + * @return {Number} value + */ + Node.prototype.getValue = function() { + return this.value; + }; - as : function (units) { - units = normalizeUnits(units); - return this['as' + units.charAt(0).toUpperCase() + units.slice(1) + 's'](); - }, + /** + * Calculate the distance from the nodes location to the given location (x,y) + * @param {Number} x + * @param {Number} y + * @return {Number} value + */ + Node.prototype.getDistance = function(x, y) { + var dx = this.x - x, + dy = this.y - y; + return Math.sqrt(dx * dx + dy * dy); + }; - lang : moment.fn.lang, - toIsoString : function () { - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var years = Math.abs(this.years()), - months = Math.abs(this.months()), - days = Math.abs(this.days()), - hours = Math.abs(this.hours()), - minutes = Math.abs(this.minutes()), - seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + /** + * Adjust the value range of the node. The node will adjust it's radius + * based on its value. + * @param {Number} min + * @param {Number} max + */ + Node.prototype.setValueRange = function(min, max) { + if (!this.radiusFixed && this.value !== undefined) { + if (max == min) { + this.options.radius= (this.options.radiusMin + this.options.radiusMax) / 2; + } + else { + var scale = (this.options.radiusMax - this.options.radiusMin) / (max - min); + this.options.radius= (this.value - min) * scale + this.options.radiusMin; + } + } + this.baseRadiusValue = this.options.radius; + }; - if (!this.asSeconds()) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } + /** + * Draw this node in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + */ + Node.prototype.draw = function(ctx) { + throw "Draw method not initialized for node"; + }; - return (this.asSeconds() < 0 ? '-' : '') + - 'P' + - (years ? years + 'Y' : '') + - (months ? months + 'M' : '') + - (days ? days + 'D' : '') + - ((hours || minutes || seconds) ? 'T' : '') + - (hours ? hours + 'H' : '') + - (minutes ? minutes + 'M' : '') + - (seconds ? seconds + 'S' : ''); - } - }); + /** + * Recalculate the size of this node in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + */ + Node.prototype.resize = function(ctx) { + throw "Resize method not initialized for node"; + }; - function makeDurationGetter(name) { - moment.duration.fn[name] = function () { - return this._data[name]; - }; - } + /** + * Check if this object is overlapping with the provided object + * @param {Object} obj an object with parameters left, top, right, bottom + * @return {boolean} True if location is located on node + */ + Node.prototype.isOverlappingWith = function(obj) { + return (this.left < obj.right && + this.left + this.width > obj.left && + this.top < obj.bottom && + this.top + this.height > obj.top); + }; - function makeDurationAsGetter(name, factor) { - moment.duration.fn['as' + name] = function () { - return +this / factor; - }; - } + Node.prototype._resizeImage = function (ctx) { + // TODO: pre calculate the image size - for (i in unitMillisecondFactors) { - if (unitMillisecondFactors.hasOwnProperty(i)) { - makeDurationAsGetter(i, unitMillisecondFactors[i]); - makeDurationGetter(i.toLowerCase()); - } + if (!this.width || !this.height) { // undefined or 0 + var width, height; + if (this.value) { + this.options.radius= this.baseRadiusValue; + var scale = this.imageObj.height / this.imageObj.width; + if (scale !== undefined) { + width = this.options.radius|| this.imageObj.width; + height = this.options.radius* scale || this.imageObj.height; + } + else { + width = 0; + height = 0; + } + } + else { + width = this.imageObj.width; + height = this.imageObj.height; } + this.width = width; + this.height = height; - makeDurationAsGetter('Weeks', 6048e5); - moment.duration.fn.asMonths = function () { - return (+this - this.years() * 31536e6) / 2592e6 + this.years() * 12; - }; + this.growthIndicator = 0; + if (this.width > 0 && this.height > 0) { + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - width; + } + } + }; - /************************************ - Default Lang - ************************************/ + Node.prototype._drawImage = function (ctx) { + this._resizeImage(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - // Set default language, other languages will inherit from English. - moment.lang('en', { - ordinal : function (number) { - var b = number % 10, - output = (toInt(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); + var yLabel; + if (this.imageObj.width != 0 ) { + // draw the shade + if (this.clusterSize > 1) { + var lineWidth = ((this.clusterSize > 1) ? 10 : 0.0); + lineWidth *= this.networkScaleInv; + lineWidth = Math.min(0.2 * this.width,lineWidth); - /* EMBED_LANGUAGES */ + ctx.globalAlpha = 0.5; + ctx.drawImage(this.imageObj, this.left - lineWidth, this.top - lineWidth, this.width + 2*lineWidth, this.height + 2*lineWidth); + } - /************************************ - Exposing Moment - ************************************/ + // draw the image + ctx.globalAlpha = 1.0; + ctx.drawImage(this.imageObj, this.left, this.top, this.width, this.height); + yLabel = this.y + this.height / 2; + } + else { + // image still loading... just draw the label for now + yLabel = this.y; + } - function makeGlobal(shouldDeprecate) { - /*global ender:false */ - if (typeof ender !== 'undefined') { - return; - } - oldGlobalMoment = globalScope.moment; - if (shouldDeprecate) { - globalScope.moment = deprecate( - "Accessing Moment through the global scope is " + - "deprecated, and will be removed in an upcoming " + - "release.", - moment); - } else { - globalScope.moment = moment; - } - } + this._label(ctx, this.label, this.x, yLabel, undefined, "top"); + }; - // CommonJS module is defined - if (hasModule) { - module.exports = moment; - } else if (true) { - !(__WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, module) { - if (module.config && module.config() && module.config().noGlobal === true) { - // release the global variable - globalScope.moment = oldGlobalMoment; - } - return moment; - }.call(exports, __webpack_require__, exports, module)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - makeGlobal(true); - } else { - makeGlobal(); - } - }).call(this); - - /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(64)(module))) + Node.prototype._resizeBox = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + this.width = textSize.width + 2 * margin; + this.height = textSize.height + 2 * margin; -/***/ }, -/* 52 */ -/***/ function(module, exports, __webpack_require__) { + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; + this.growthIndicator = this.width - (textSize.width + 2 * margin); + // this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; - var __WEBPACK_AMD_DEFINE_RESULT__;/*! Hammer.JS - v1.1.3 - 2014-05-20 - * http://eightmedia.github.io/hammer.js - * - * Copyright (c) 2014 Jorik Tangelder ; - * Licensed under the MIT license */ + } + }; - (function(window, undefined) { - 'use strict'; + Node.prototype._drawBox = function (ctx) { + this._resizeBox(ctx); - /** - * @main - * @module hammer - * - * @class Hammer - * @static - */ + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - /** - * Hammer, use this to create instances - * ```` - * var hammertime = new Hammer(myElement); - * ```` - * - * @method Hammer - * @param {HTMLElement} element - * @param {Object} [options={}] - * @return {Hammer.Instance} - */ - var Hammer = function Hammer(element, options) { - return new Hammer.Instance(element, options || {}); - }; + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; - /** - * version, as defined in package.json - * the value will be set at each build - * @property VERSION - * @final - * @type {String} - */ - Hammer.VERSION = '1.1.3'; + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; - /** - * default settings. - * more settings are defined per gesture at `/gestures`. Each gesture can be disabled/enabled - * by setting it's name (like `swipe`) to false. - * You can set the defaults for all instances by changing this object before creating an instance. - * @example - * ```` - * Hammer.defaults.drag = false; - * Hammer.defaults.behavior.touchAction = 'pan-y'; - * delete Hammer.defaults.behavior.userSelect; - * ```` - * @property defaults - * @type {Object} - */ - Hammer.defaults = { - /** - * this setting object adds styles and attributes to the element to prevent the browser from doing - * its native behavior. The css properties are auto prefixed for the browsers when needed. - * @property defaults.behavior - * @type {Object} - */ - behavior: { - /** - * Disables text selection to improve the dragging gesture. When the value is `none` it also sets - * `onselectstart=false` for IE on the element. Mainly for desktop browsers. - * @property defaults.behavior.userSelect - * @type {String} - * @default 'none' - */ - userSelect: 'none', + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - /** - * Specifies whether and how a given region can be manipulated by the user (for instance, by panning or zooming). - * Used by Chrome 35> and IE10>. By default this makes the element blocking any touch event. - * @property defaults.behavior.touchAction - * @type {String} - * @default: 'pan-y' - */ - touchAction: 'pan-y', + ctx.roundRect(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth, this.options.radius); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - /** - * Disables the default callout shown when you touch and hold a touch target. - * On iOS, when you touch and hold a touch target such as a link, Safari displays - * a callout containing information about the link. This property allows you to disable that callout. - * @property defaults.behavior.touchCallout - * @type {String} - * @default 'none' - */ - touchCallout: 'none', + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.options.color.background; - /** - * Specifies whether zooming is enabled. Used by IE10> - * @property defaults.behavior.contentZooming - * @type {String} - * @default 'none' - */ - contentZooming: 'none', + ctx.roundRect(this.left, this.top, this.width, this.height, this.options.radius); + ctx.fill(); + ctx.stroke(); - /** - * Specifies that an entire element should be draggable instead of its contents. - * Mainly for desktop browsers. - * @property defaults.behavior.userDrag - * @type {String} - * @default 'none' - */ - userDrag: 'none', + this._label(ctx, this.label, this.x, this.y); + }; - /** - * Overrides the highlight color shown when the user taps a link or a JavaScript - * clickable element in Safari on iPhone. This property obeys the alpha value, if specified. - * - * If you don't specify an alpha value, Safari on iPhone applies a default alpha value - * to the color. To disable tap highlighting, set the alpha value to 0 (invisible). - * If you set the alpha value to 1.0 (opaque), the element is not visible when tapped. - * @property defaults.behavior.tapHighlightColor - * @type {String} - * @default 'rgba(0,0,0,0)' - */ - tapHighlightColor: 'rgba(0,0,0,0)' - } + + Node.prototype._resizeDatabase = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + var size = textSize.width + 2 * margin; + this.width = size; + this.height = size; + + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - size; + } }; - /** - * hammer document where the base events are added at - * @property DOCUMENT - * @type {HTMLElement} - * @default window.document - */ - Hammer.DOCUMENT = document; + Node.prototype._drawDatabase = function (ctx) { + this._resizeDatabase(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - /** - * detect support for pointer events - * @property HAS_POINTEREVENTS - * @type {Boolean} - */ - Hammer.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled; + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; - /** - * detect support for touch events - * @property HAS_TOUCHEVENTS - * @type {Boolean} - */ - Hammer.HAS_TOUCHEVENTS = ('ontouchstart' in window); + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; - /** - * detect mobile browsers - * @property IS_MOBILE - * @type {Boolean} - */ - Hammer.IS_MOBILE = /mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent); + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - /** - * detect if we want to support mouseevents at all - * @property NO_MOUSEEVENTS - * @type {Boolean} - */ - Hammer.NO_MOUSEEVENTS = (Hammer.HAS_TOUCHEVENTS && Hammer.IS_MOBILE) || Hammer.HAS_POINTEREVENTS; + ctx.database(this.x - this.width/2 - 2*ctx.lineWidth, this.y - this.height*0.5 - 2*ctx.lineWidth, this.width + 4*ctx.lineWidth, this.height + 4*ctx.lineWidth); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - /** - * interval in which Hammer recalculates current velocity/direction/angle in ms - * @property CALCULATE_INTERVAL - * @type {Number} - * @default 25 - */ - Hammer.CALCULATE_INTERVAL = 25; + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; + ctx.database(this.x - this.width/2, this.y - this.height*0.5, this.width, this.height); + ctx.fill(); + ctx.stroke(); - /** - * eventtypes per touchevent (start, move, end) are filled by `Event.determineEventTypes` on `setup` - * the object contains the DOM event names per type (`EVENT_START`, `EVENT_MOVE`, `EVENT_END`) - * @property EVENT_TYPES - * @private - * @writeOnce - * @type {Object} - */ - var EVENT_TYPES = {}; + this._label(ctx, this.label, this.x, this.y); + }; - /** - * direction strings, for safe comparisons - * @property DIRECTION_DOWN|LEFT|UP|RIGHT - * @final - * @type {String} - * @default 'down' 'left' 'up' 'right' - */ - var DIRECTION_DOWN = Hammer.DIRECTION_DOWN = 'down'; - var DIRECTION_LEFT = Hammer.DIRECTION_LEFT = 'left'; - var DIRECTION_UP = Hammer.DIRECTION_UP = 'up'; - var DIRECTION_RIGHT = Hammer.DIRECTION_RIGHT = 'right'; - /** - * pointertype strings, for safe comparisons - * @property POINTER_MOUSE|TOUCH|PEN - * @final - * @type {String} - * @default 'mouse' 'touch' 'pen' - */ - var POINTER_MOUSE = Hammer.POINTER_MOUSE = 'mouse'; - var POINTER_TOUCH = Hammer.POINTER_TOUCH = 'touch'; - var POINTER_PEN = Hammer.POINTER_PEN = 'pen'; + Node.prototype._resizeCircle = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + var diameter = Math.max(textSize.width, textSize.height) + 2 * margin; + this.options.radius = diameter / 2; - /** - * eventtypes - * @property EVENT_START|MOVE|END|RELEASE|TOUCH - * @final - * @type {String} - * @default 'start' 'change' 'move' 'end' 'release' 'touch' - */ - var EVENT_START = Hammer.EVENT_START = 'start'; - var EVENT_MOVE = Hammer.EVENT_MOVE = 'move'; - var EVENT_END = Hammer.EVENT_END = 'end'; - var EVENT_RELEASE = Hammer.EVENT_RELEASE = 'release'; - var EVENT_TOUCH = Hammer.EVENT_TOUCH = 'touch'; + this.width = diameter; + this.height = diameter; - /** - * if the window events are set... - * @property READY - * @writeOnce - * @type {Boolean} - * @default false - */ - Hammer.READY = false; + // scaling used for clustering + // this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; + // this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; + this.options.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; + this.growthIndicator = this.options.radius- 0.5*diameter; + } + }; - /** - * plugins namespace - * @property plugins - * @type {Object} - */ - Hammer.plugins = Hammer.plugins || {}; + Node.prototype._drawCircle = function (ctx) { + this._resizeCircle(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - /** - * gestures namespace - * see `/gestures` for the definitions - * @property gestures - * @type {Object} - */ - Hammer.gestures = Hammer.gestures || {}; + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; - /** - * setup events to detect gestures on the document - * this function is called when creating an new instance - * @private - */ - function setup() { - if(Hammer.READY) { - return; - } + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; - // find what eventtypes we add listeners to - Event.determineEventTypes(); + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - // Register all gestures inside Hammer.gestures - Utils.each(Hammer.gestures, function(gesture) { - Detection.register(gesture); - }); + ctx.circle(this.x, this.y, this.options.radius+2*ctx.lineWidth); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - // Add touch events on the document - Event.onTouch(Hammer.DOCUMENT, EVENT_MOVE, Detection.detect); - Event.onTouch(Hammer.DOCUMENT, EVENT_END, Detection.detect); + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; + ctx.circle(this.x, this.y, this.options.radius); + ctx.fill(); + ctx.stroke(); - // Hammer is ready...! - Hammer.READY = true; - } + this._label(ctx, this.label, this.x, this.y); + }; - /** - * @module hammer - * - * @class Utils - * @static - */ - var Utils = Hammer.utils = { - /** - * extend method, could also be used for cloning when `dest` is an empty object. - * changes the dest object - * @method extend - * @param {Object} dest - * @param {Object} src - * @param {Boolean} [merge=false] do a merge - * @return {Object} dest - */ - extend: function extend(dest, src, merge) { - for(var key in src) { - if(!src.hasOwnProperty(key) || (dest[key] !== undefined && merge)) { - continue; - } - dest[key] = src[key]; - } - return dest; - }, + Node.prototype._resizeEllipse = function (ctx) { + if (!this.width) { + var textSize = this.getTextSize(ctx); + + this.width = textSize.width * 1.5; + this.height = textSize.height * 2; + if (this.width < this.height) { + this.width = this.height; + } + var defaultSize = this.width; + + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - defaultSize; + } + }; - /** - * simple addEventListener wrapper - * @method on - * @param {HTMLElement} element - * @param {String} type - * @param {Function} handler - */ - on: function on(element, type, handler) { - element.addEventListener(type, handler, false); - }, + Node.prototype._drawEllipse = function (ctx) { + this._resizeEllipse(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - /** - * simple removeEventListener wrapper - * @method off - * @param {HTMLElement} element - * @param {String} type - * @param {Function} handler - */ - off: function off(element, type, handler) { - element.removeEventListener(type, handler, false); - }, + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; - /** - * forEach over arrays and objects - * @method each - * @param {Object|Array} obj - * @param {Function} iterator - * @param {any} iterator.item - * @param {Number} iterator.index - * @param {Object|Array} iterator.obj the source object - * @param {Object} context value to use as `this` in the iterator - */ - each: function each(obj, iterator, context) { - var i, len; + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; - // native forEach on arrays - if('forEach' in obj) { - obj.forEach(iterator, context); - // arrays - } else if(obj.length !== undefined) { - for(i = 0, len = obj.length; i < len; i++) { - if(iterator.call(context, obj[i], i, obj) === false) { - return; - } - } - // objects - } else { - for(i in obj) { - if(obj.hasOwnProperty(i) && - iterator.call(context, obj[i], i, obj) === false) { - return; - } - } - } - }, + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - /** - * find if a string contains the string using indexOf - * @method inStr - * @param {String} src - * @param {String} find - * @return {Boolean} found - */ - inStr: function inStr(src, find) { - return src.indexOf(find) > -1; - }, + ctx.ellipse(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - /** - * find if a array contains the object using indexOf or a simple polyfill - * @method inArray - * @param {String} src - * @param {String} find - * @return {Boolean|Number} false when not found, or the index - */ - inArray: function inArray(src, find) { - if(src.indexOf) { - var index = src.indexOf(find); - return (index === -1) ? false : index; - } else { - for(var i = 0, len = src.length; i < len; i++) { - if(src[i] === find) { - return i; - } - } - return false; - } - }, + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; - /** - * convert an array-like object (`arguments`, `touchlist`) to an array - * @method toArray - * @param {Object} obj - * @return {Array} - */ - toArray: function toArray(obj) { - return Array.prototype.slice.call(obj, 0); - }, + ctx.ellipse(this.left, this.top, this.width, this.height); + ctx.fill(); + ctx.stroke(); + this._label(ctx, this.label, this.x, this.y); + }; - /** - * find if a node is in the given parent - * @method hasParent - * @param {HTMLElement} node - * @param {HTMLElement} parent - * @return {Boolean} found - */ - hasParent: function hasParent(node, parent) { - while(node) { - if(node == parent) { - return true; - } - node = node.parentNode; - } - return false; - }, + Node.prototype._drawDot = function (ctx) { + this._drawShape(ctx, 'circle'); + }; - /** - * get the center of all the touches - * @method getCenter - * @param {Array} touches - * @return {Object} center contains `pageX`, `pageY`, `clientX` and `clientY` properties - */ - getCenter: function getCenter(touches) { - var pageX = [], - pageY = [], - clientX = [], - clientY = [], - min = Math.min, - max = Math.max; + Node.prototype._drawTriangle = function (ctx) { + this._drawShape(ctx, 'triangle'); + }; - // no need to loop when only one touch - if(touches.length === 1) { - return { - pageX: touches[0].pageX, - pageY: touches[0].pageY, - clientX: touches[0].clientX, - clientY: touches[0].clientY - }; - } + Node.prototype._drawTriangleDown = function (ctx) { + this._drawShape(ctx, 'triangleDown'); + }; - Utils.each(touches, function(touch) { - pageX.push(touch.pageX); - pageY.push(touch.pageY); - clientX.push(touch.clientX); - clientY.push(touch.clientY); - }); + Node.prototype._drawSquare = function (ctx) { + this._drawShape(ctx, 'square'); + }; - return { - pageX: (min.apply(Math, pageX) + max.apply(Math, pageX)) / 2, - pageY: (min.apply(Math, pageY) + max.apply(Math, pageY)) / 2, - clientX: (min.apply(Math, clientX) + max.apply(Math, clientX)) / 2, - clientY: (min.apply(Math, clientY) + max.apply(Math, clientY)) / 2 - }; - }, + Node.prototype._drawStar = function (ctx) { + this._drawShape(ctx, 'star'); + }; - /** - * calculate the velocity between two points. unit is in px per ms. - * @method getVelocity - * @param {Number} deltaTime - * @param {Number} deltaX - * @param {Number} deltaY - * @return {Object} velocity `x` and `y` - */ - getVelocity: function getVelocity(deltaTime, deltaX, deltaY) { - return { - x: Math.abs(deltaX / deltaTime) || 0, - y: Math.abs(deltaY / deltaTime) || 0 - }; - }, + Node.prototype._resizeShape = function (ctx) { + if (!this.width) { + this.options.radius= this.baseRadiusValue; + var size = 2 * this.options.radius; + this.width = size; + this.height = size; - /** - * calculate the angle between two coordinates - * @method getAngle - * @param {Touch} touch1 - * @param {Touch} touch2 - * @return {Number} angle - */ - getAngle: function getAngle(touch1, touch2) { - var x = touch2.clientX - touch1.clientX, - y = touch2.clientY - touch1.clientY; + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - size; + } + }; - return Math.atan2(y, x) * 180 / Math.PI; - }, + Node.prototype._drawShape = function (ctx, shape) { + this._resizeShape(ctx); - /** - * do a small comparision to get the direction between two touches. - * @method getDirection - * @param {Touch} touch1 - * @param {Touch} touch2 - * @return {String} direction matches `DIRECTION_LEFT|RIGHT|UP|DOWN` - */ - getDirection: function getDirection(touch1, touch2) { - var x = Math.abs(touch1.clientX - touch2.clientX), - y = Math.abs(touch1.clientY - touch2.clientY); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; + + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + var radiusMultiplier = 2; + + // choose draw method depending on the shape + switch (shape) { + case 'dot': radiusMultiplier = 2; break; + case 'square': radiusMultiplier = 2; break; + case 'triangle': radiusMultiplier = 3; break; + case 'triangleDown': radiusMultiplier = 3; break; + case 'star': radiusMultiplier = 4; break; + } + + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - if(x >= y) { - return touch1.clientX - touch2.clientX > 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; - } - return touch1.clientY - touch2.clientY > 0 ? DIRECTION_UP : DIRECTION_DOWN; - }, + ctx[shape](this.x, this.y, this.options.radius+ radiusMultiplier * ctx.lineWidth); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - /** - * calculate the distance between two touches - * @method getDistance - * @param {Touch}touch1 - * @param {Touch} touch2 - * @return {Number} distance - */ - getDistance: function getDistance(touch1, touch2) { - var x = touch2.clientX - touch1.clientX, - y = touch2.clientY - touch1.clientY; + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; + ctx[shape](this.x, this.y, this.options.radius); + ctx.fill(); + ctx.stroke(); - return Math.sqrt((x * x) + (y * y)); - }, + if (this.label) { + this._label(ctx, this.label, this.x, this.y + this.height / 2, undefined, 'top',true); + } + }; - /** - * calculate the scale factor between two touchLists - * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out - * @method getScale - * @param {Array} start array of touches - * @param {Array} end array of touches - * @return {Number} scale - */ - getScale: function getScale(start, end) { - // need two fingers... - if(start.length >= 2 && end.length >= 2) { - return this.getDistance(end[0], end[1]) / this.getDistance(start[0], start[1]); - } - return 1; - }, + Node.prototype._resizeText = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + this.width = textSize.width + 2 * margin; + this.height = textSize.height + 2 * margin; - /** - * calculate the rotation degrees between two touchLists - * @method getRotation - * @param {Array} start array of touches - * @param {Array} end array of touches - * @return {Number} rotation - */ - getRotation: function getRotation(start, end) { - // need two fingers - if(start.length >= 2 && end.length >= 2) { - return this.getAngle(end[1], end[0]) - this.getAngle(start[1], start[0]); - } - return 0; - }, + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - (textSize.width + 2 * margin); + } + }; - /** - * find out if the direction is vertical * - * @method isVertical - * @param {String} direction matches `DIRECTION_UP|DOWN` - * @return {Boolean} is_vertical - */ - isVertical: function isVertical(direction) { - return direction == DIRECTION_UP || direction == DIRECTION_DOWN; - }, + Node.prototype._drawText = function (ctx) { + this._resizeText(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - /** - * set css properties with their prefixes - * @param {HTMLElement} element - * @param {String} prop - * @param {String} value - * @param {Boolean} [toggle=true] - * @return {Boolean} - */ - setPrefixedCss: function setPrefixedCss(element, prop, value, toggle) { - var prefixes = ['', 'Webkit', 'Moz', 'O', 'ms']; - prop = Utils.toCamelCase(prop); + this._label(ctx, this.label, this.x, this.y); + }; - for(var i = 0; i < prefixes.length; i++) { - var p = prop; - // prefixes - if(prefixes[i]) { - p = prefixes[i] + p.slice(0, 1).toUpperCase() + p.slice(1); - } - // test the style - if(p in element.style) { - element.style[p] = (toggle == null || toggle) && value || ''; - break; - } - } - }, + Node.prototype._label = function (ctx, text, x, y, align, baseline, labelUnderNode) { + if (text && Number(this.options.fontSize) * this.networkScale > this.fontDrawThreshold) { + ctx.font = (this.selected ? "bold " : "") + this.options.fontSize + "px " + this.options.fontFace; + ctx.fillStyle = this.options.fontColor || "black"; + ctx.textAlign = align || "center"; + ctx.textBaseline = baseline || "middle"; - /** - * toggle browser default behavior by setting css properties. - * `userSelect='none'` also sets `element.onselectstart` to false - * `userDrag='none'` also sets `element.ondragstart` to false - * - * @method toggleBehavior - * @param {HtmlElement} element - * @param {Object} props - * @param {Boolean} [toggle=true] - */ - toggleBehavior: function toggleBehavior(element, props, toggle) { - if(!props || !element || !element.style) { - return; - } + var lines = text.split('\n'); + var lineCount = lines.length; + var fontSize = (Number(this.options.fontSize) + 4); + var yLine = y + (1 - lineCount) / 2 * fontSize; + if (labelUnderNode == true) { + yLine = y + (1 - lineCount) / (2 * fontSize); + } - // set the css properties - Utils.each(props, function(value, prop) { - Utils.setPrefixedCss(element, prop, value, toggle); - }); + for (var i = 0; i < lineCount; i++) { + ctx.fillText(lines[i], x, yLine); + yLine += fontSize; + } + } + }; - var falseFn = toggle && function() { - return false; - }; - // also the disable onselectstart - if(props.userSelect == 'none') { - element.onselectstart = falseFn; - } - // and disable ondragstart - if(props.userDrag == 'none') { - element.ondragstart = falseFn; - } - }, + Node.prototype.getTextSize = function(ctx) { + if (this.label !== undefined) { + ctx.font = (this.selected ? "bold " : "") + this.options.fontSize + "px " + this.options.fontFace; - /** - * convert a string with underscores to camelCase - * so prevent_default becomes preventDefault - * @param {String} str - * @return {String} camelCaseStr - */ - toCamelCase: function toCamelCase(str) { - return str.replace(/[_-]([a-z])/g, function(s) { - return s[1].toUpperCase(); - }); + var lines = this.label.split('\n'), + height = (Number(this.options.fontSize) + 4) * lines.length, + width = 0; + + for (var i = 0, iMax = lines.length; i < iMax; i++) { + width = Math.max(width, ctx.measureText(lines[i]).width); } + + return {"width": width, "height": height}; + } + else { + return {"width": 0, "height": 0}; + } + }; + + /** + * this is used to determine if a node is visible at all. this is used to determine when it needs to be drawn. + * there is a safety margin of 0.3 * width; + * + * @returns {boolean} + */ + Node.prototype.inArea = function() { + if (this.width !== undefined) { + return (this.x + this.width *this.networkScaleInv >= this.canvasTopLeft.x && + this.x - this.width *this.networkScaleInv < this.canvasBottomRight.x && + this.y + this.height*this.networkScaleInv >= this.canvasTopLeft.y && + this.y - this.height*this.networkScaleInv < this.canvasBottomRight.y); + } + else { + return true; + } }; + /** + * checks if the core of the node is in the display area, this is used for opening clusters around zoom + * @returns {boolean} + */ + Node.prototype.inView = function() { + return (this.x >= this.canvasTopLeft.x && + this.x < this.canvasBottomRight.x && + this.y >= this.canvasTopLeft.y && + this.y < this.canvasBottomRight.y); + }; /** - * @module hammer + * This allows the zoom level of the network to influence the rendering + * We store the inverted scale and the coordinates of the top left, and bottom right points of the canvas + * + * @param scale + * @param canvasTopLeft + * @param canvasBottomRight */ + Node.prototype.setScaleAndPos = function(scale,canvasTopLeft,canvasBottomRight) { + this.networkScaleInv = 1.0/scale; + this.networkScale = scale; + this.canvasTopLeft = canvasTopLeft; + this.canvasBottomRight = canvasBottomRight; + }; + + /** - * @class Event - * @static + * This allows the zoom level of the network to influence the rendering + * + * @param scale */ - var Event = Hammer.event = { - /** - * when touch events have been fired, this is true - * this is used to stop mouse events - * @property prevent_mouseevents - * @private - * @type {Boolean} - */ - preventMouseEvents: false, + Node.prototype.setScale = function(scale) { + this.networkScaleInv = 1.0/scale; + this.networkScale = scale; + }; + + + + /** + * set the velocity at 0. Is called when this node is contained in another during clustering + */ + Node.prototype.clearVelocity = function() { + this.vx = 0; + this.vy = 0; + }; - /** - * if EVENT_START has been fired - * @property started - * @private - * @type {Boolean} - */ - started: false, - /** - * when the mouse is hold down, this is true - * @property should_detect - * @private - * @type {Boolean} - */ - shouldDetect: false, + /** + * Basic preservation of (kinectic) energy + * + * @param massBeforeClustering + */ + Node.prototype.updateVelocity = function(massBeforeClustering) { + var energyBefore = this.vx * this.vx * massBeforeClustering; + //this.vx = (this.vx < 0) ? -Math.sqrt(energyBefore/this.options.mass) : Math.sqrt(energyBefore/this.options.mass); + this.vx = Math.sqrt(energyBefore/this.options.mass); + energyBefore = this.vy * this.vy * massBeforeClustering; + //this.vy = (this.vy < 0) ? -Math.sqrt(energyBefore/this.options.mass) : Math.sqrt(energyBefore/this.options.mass); + this.vy = Math.sqrt(energyBefore/this.options.mass); + }; - /** - * simple event binder with a hook and support for multiple types - * @method on - * @param {HTMLElement} element - * @param {String} type - * @param {Function} handler - * @param {Function} [hook] - * @param {Object} hook.type - */ - on: function on(element, type, handler, hook) { - var types = type.split(' '); - Utils.each(types, function(type) { - Utils.on(element, type, handler); - hook && hook(type); - }); - }, + module.exports = Node; - /** - * simple event unbinder with a hook and support for multiple types - * @method off - * @param {HTMLElement} element - * @param {String} type - * @param {Function} handler - * @param {Function} [hook] - * @param {Object} hook.type - */ - off: function off(element, type, handler, hook) { - var types = type.split(' '); - Utils.each(types, function(type) { - Utils.off(element, type, handler); - hook && hook(type); - }); - }, - /** - * the core touch event handler. - * this finds out if we should to detect gestures - * @method onTouch - * @param {HTMLElement} element - * @param {String} eventType matches `EVENT_START|MOVE|END` - * @param {Function} handler - * @return onTouchHandler {Function} the core event handler - */ - onTouch: function onTouch(element, eventType, handler) { - var self = this; +/***/ }, +/* 50 */ +/***/ function(module, exports, __webpack_require__) { - var onTouchHandler = function onTouchHandler(ev) { - var srcType = ev.type.toLowerCase(), - isPointer = Hammer.HAS_POINTEREVENTS, - isMouse = Utils.inStr(srcType, 'mouse'), - triggerType; + var util = __webpack_require__(1); + var Node = __webpack_require__(49); - // if we are in a mouseevent, but there has been a touchevent triggered in this session - // we want to do nothing. simply break out of the event. - if(isMouse && self.preventMouseEvents) { - return; + /** + * @class Edge + * + * A edge connects two nodes + * @param {Object} properties Object with properties. Must contain + * At least properties from and to. + * Available properties: from (number), + * to (number), label (string, color (string), + * width (number), style (string), + * length (number), title (string) + * @param {Network} network A Network object, used to find and edge to + * nodes. + * @param {Object} constants An object with default values for + * example for the color + */ + function Edge (properties, network, networkConstants) { + if (!network) { + throw "No network provided"; + } + var fields = ['edges','physics']; + var constants = util.selectiveBridgeObject(fields,networkConstants); + this.options = constants.edges; + this.physics = constants.physics; + this.options['smoothCurves'] = networkConstants['smoothCurves']; - // mousebutton must be down - } else if(isMouse && eventType == EVENT_START && ev.button === 0) { - self.preventMouseEvents = false; - self.shouldDetect = true; - } else if(isPointer && eventType == EVENT_START) { - self.shouldDetect = (ev.buttons === 1 || PointerEvent.matchType(POINTER_TOUCH, ev)); - // just a valid start event, but no mouse - } else if(!isMouse && eventType == EVENT_START) { - self.preventMouseEvents = true; - self.shouldDetect = true; - } - // update the pointer event before entering the detection - if(isPointer && eventType != EVENT_END) { - PointerEvent.updatePointer(eventType, ev); - } + this.network = network; - // we are in a touch/down state, so allowed detection of gestures - if(self.shouldDetect) { - triggerType = self.doDetect.call(self, ev, eventType, element, handler); - } + // initialize variables + this.id = undefined; + this.fromId = undefined; + this.toId = undefined; + this.title = undefined; + this.widthSelected = this.options.width * this.options.widthSelectionMultiplier; + this.value = undefined; + this.selected = false; + this.hover = false; - // ...and we are done with the detection - // so reset everything to start each detection totally fresh - if(triggerType == EVENT_END) { - self.preventMouseEvents = false; - self.shouldDetect = false; - PointerEvent.reset(); - // update the pointerevent object after the detection - } + this.from = null; // a node + this.to = null; // a node + this.via = null; // a temp node - if(isPointer && eventType == EVENT_END) { - PointerEvent.updatePointer(eventType, ev); - } - }; + // we use this to be able to reconnect the edge to a cluster if its node is put into a cluster + // by storing the original information we can revert to the original connection when the cluser is opened. + this.originalFromId = []; + this.originalToId = []; - this.on(element, EVENT_TYPES[eventType], onTouchHandler); - return onTouchHandler; - }, + this.connected = false; - /** - * the core detection method - * this finds out what hammer-touch-events to trigger - * @method doDetect - * @param {Object} ev - * @param {String} eventType matches `EVENT_START|MOVE|END` - * @param {HTMLElement} element - * @param {Function} handler - * @return {String} triggerType matches `EVENT_START|MOVE|END` - */ - doDetect: function doDetect(ev, eventType, element, handler) { - var touchList = this.getTouchList(ev, eventType); - var touchListLength = touchList.length; - var triggerType = eventType; - var triggerChange = touchList.trigger; // used by fakeMultitouch plugin - var changedLength = touchListLength; + this.widthFixed = false; + this.lengthFixed = false; - // at each touchstart-like event we want also want to trigger a TOUCH event... - if(eventType == EVENT_START) { - triggerChange = EVENT_TOUCH; - // ...the same for a touchend-like event - } else if(eventType == EVENT_END) { - triggerChange = EVENT_RELEASE; + this.setProperties(properties); - // keep track of how many touches have been removed - changedLength = touchList.length - ((ev.changedTouches) ? ev.changedTouches.length : 1); - } + this.controlNodesEnabled = false; + this.controlNodes = {from:null, to:null, positions:{}}; + this.connectedNode = null; + } - // after there are still touches on the screen, - // we just want to trigger a MOVE event. so change the START or END to a MOVE - // but only after detection has been started, the first time we actualy want a START - if(changedLength > 0 && this.started) { - triggerType = EVENT_MOVE; - } + /** + * Set or overwrite properties for the edge + * @param {Object} properties an object with properties + * @param {Object} constants and object with default, global properties + */ + Edge.prototype.setProperties = function(properties) { + if (!properties) { + return; + } - // detection has been started, we keep track of this, see above - this.started = true; + var fields = ['style','fontSize','fontFace','fontColor','fontFill','width', + 'widthSelectionMultiplier','hoverWidth','arrowScaleFactor','dash' + ]; + util.selectiveDeepExtend(fields, this.options, properties); - // generate some event data, some basic information - var evData = this.collectEventData(element, triggerType, touchList, ev); + if (properties.from !== undefined) {this.fromId = properties.from;} + if (properties.to !== undefined) {this.toId = properties.to;} - // trigger the triggerType event before the change (TOUCH, RELEASE) events - // but the END event should be at last - if(eventType != EVENT_END) { - handler.call(Detection, evData); - } + if (properties.id !== undefined) {this.id = properties.id;} + if (properties.label !== undefined) {this.label = properties.label;} - // trigger a change (TOUCH, RELEASE) event, this means the length of the touches changed - if(triggerChange) { - evData.changedLength = changedLength; - evData.eventType = triggerChange; + if (properties.title !== undefined) {this.title = properties.title;} + if (properties.value !== undefined) {this.value = properties.value;} + if (properties.length !== undefined) {this.physics.springLength = properties.length;} - handler.call(Detection, evData); + // scale the arrow + if (properties.arrowScaleFactor !== undefined) {this.options.arrowScaleFactor = properties.arrowScaleFactor;} - evData.eventType = triggerType; - delete evData.changedLength; - } + if (properties.inheritColor !== undefined) {this.options.inheritColor = properties.inheritColor;} + + if (properties.color !== undefined) { + this.options.inheritColor = false; + if (util.isString(properties.color)) { + this.options.color.color = properties.color; + this.options.color.highlight = properties.color; + } + else { + if (properties.color.color !== undefined) {this.options.color.color = properties.color.color;} + if (properties.color.highlight !== undefined) {this.options.color.highlight = properties.color.highlight;} + if (properties.color.hover !== undefined) {this.options.color.hover = properties.color.hover;} + } + } - // trigger the END event - if(triggerType == EVENT_END) { - handler.call(Detection, evData); + // A node is connected when it has a from and to node. + this.connect(); - // ...and we are done with the detection - // so reset everything to start each detection totally fresh - this.started = false; - } + this.widthFixed = this.widthFixed || (properties.width !== undefined); + this.lengthFixed = this.lengthFixed || (properties.length !== undefined); - return triggerType; - }, + this.widthSelected = this.options.width* this.options.widthSelectionMultiplier; - /** - * we have different events for each device/browser - * determine what we need and set them in the EVENT_TYPES constant - * the `onTouch` method is bind to these properties. - * @method determineEventTypes - * @return {Object} events - */ - determineEventTypes: function determineEventTypes() { - var types; - if(Hammer.HAS_POINTEREVENTS) { - if(window.PointerEvent) { - types = [ - 'pointerdown', - 'pointermove', - 'pointerup pointercancel lostpointercapture' - ]; - } else { - types = [ - 'MSPointerDown', - 'MSPointerMove', - 'MSPointerUp MSPointerCancel MSLostPointerCapture' - ]; - } - } else if(Hammer.NO_MOUSEEVENTS) { - types = [ - 'touchstart', - 'touchmove', - 'touchend touchcancel' - ]; - } else { - types = [ - 'touchstart mousedown', - 'touchmove mousemove', - 'touchend touchcancel mouseup' - ]; - } + // set draw method based on style + switch (this.options.style) { + case 'line': this.draw = this._drawLine; break; + case 'arrow': this.draw = this._drawArrow; break; + case 'arrow-center': this.draw = this._drawArrowCenter; break; + case 'dash-line': this.draw = this._drawDashLine; break; + default: this.draw = this._drawLine; break; + } + }; - EVENT_TYPES[EVENT_START] = types[0]; - EVENT_TYPES[EVENT_MOVE] = types[1]; - EVENT_TYPES[EVENT_END] = types[2]; - return EVENT_TYPES; - }, + /** + * Connect an edge to its nodes + */ + Edge.prototype.connect = function () { + this.disconnect(); - /** - * create touchList depending on the event - * @method getTouchList - * @param {Object} ev - * @param {String} eventType - * @return {Array} touches - */ - getTouchList: function getTouchList(ev, eventType) { - // get the fake pointerEvent touchlist - if(Hammer.HAS_POINTEREVENTS) { - return PointerEvent.getTouchList(); - } + this.from = this.network.nodes[this.fromId] || null; + this.to = this.network.nodes[this.toId] || null; + this.connected = (this.from && this.to); - // get the touchlist - if(ev.touches) { - if(eventType == EVENT_MOVE) { - return ev.touches; - } + if (this.connected) { + this.from.attachEdge(this); + this.to.attachEdge(this); + } + else { + if (this.from) { + this.from.detachEdge(this); + } + if (this.to) { + this.to.detachEdge(this); + } + } + }; - var identifiers = []; - var concat = [].concat(Utils.toArray(ev.touches), Utils.toArray(ev.changedTouches)); - var touchList = []; + /** + * Disconnect an edge from its nodes + */ + Edge.prototype.disconnect = function () { + if (this.from) { + this.from.detachEdge(this); + this.from = null; + } + if (this.to) { + this.to.detachEdge(this); + this.to = null; + } - Utils.each(concat, function(touch) { - if(Utils.inArray(identifiers, touch.identifier) === false) { - touchList.push(touch); - } - identifiers.push(touch.identifier); - }); + this.connected = false; + }; - return touchList; - } + /** + * get the title of this edge. + * @return {string} title The title of the edge, or undefined when no title + * has been set. + */ + Edge.prototype.getTitle = function() { + return typeof this.title === "function" ? this.title() : this.title; + }; - // make fake touchList from mouse position - ev.identifier = 1; - return [ev]; - }, - /** - * collect basic event data - * @method collectEventData - * @param {HTMLElement} element - * @param {String} eventType matches `EVENT_START|MOVE|END` - * @param {Array} touches - * @param {Object} ev - * @return {Object} ev - */ - collectEventData: function collectEventData(element, eventType, touches, ev) { - // find out pointerType - var pointerType = POINTER_TOUCH; - if(Utils.inStr(ev.type, 'mouse') || PointerEvent.matchType(POINTER_MOUSE, ev)) { - pointerType = POINTER_MOUSE; - } else if(PointerEvent.matchType(POINTER_PEN, ev)) { - pointerType = POINTER_PEN; - } + /** + * Retrieve the value of the edge. Can be undefined + * @return {Number} value + */ + Edge.prototype.getValue = function() { + return this.value; + }; - return { - center: Utils.getCenter(touches), - timeStamp: Date.now(), - target: ev.target, - touches: touches, - eventType: eventType, - pointerType: pointerType, - srcEvent: ev, + /** + * Adjust the value range of the edge. The edge will adjust it's width + * based on its value. + * @param {Number} min + * @param {Number} max + */ + Edge.prototype.setValueRange = function(min, max) { + if (!this.widthFixed && this.value !== undefined) { + var scale = (this.options.widthMax - this.options.widthMin) / (max - min); + this.options.width= (this.value - min) * scale + this.options.widthMin; + this.widthSelected = this.options.width* this.options.widthSelectionMultiplier; + } + }; - /** - * prevent the browser default actions - * mostly used to disable scrolling of the browser - */ - preventDefault: function() { - var srcEvent = this.srcEvent; - srcEvent.preventManipulation && srcEvent.preventManipulation(); - srcEvent.preventDefault && srcEvent.preventDefault(); - }, + /** + * Redraw a edge + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + */ + Edge.prototype.draw = function(ctx) { + throw "Method draw not initialized in edge"; + }; - /** - * stop bubbling the event up to its parents - */ - stopPropagation: function() { - this.srcEvent.stopPropagation(); - }, + /** + * Check if this object is overlapping with the provided object + * @param {Object} obj an object with parameters left, top + * @return {boolean} True if location is located on the edge + */ + Edge.prototype.isOverlappingWith = function(obj) { + if (this.connected) { + var distMax = 10; + var xFrom = this.from.x; + var yFrom = this.from.y; + var xTo = this.to.x; + var yTo = this.to.y; + var xObj = obj.left; + var yObj = obj.top; - /** - * immediately stop gesture detection - * might be useful after a swipe was detected - * @return {*} - */ - stopDetect: function() { - return Detection.stopDetect(); - } - }; - } + var dist = this._getDistanceToEdge(xFrom, yFrom, xTo, yTo, xObj, yObj); + + return (dist < distMax); + } + else { + return false + } }; + Edge.prototype._getColor = function() { + var colorObj = this.options.color; + if (this.options.inheritColor == "to") { + colorObj = { + highlight: this.to.options.color.highlight.border, + hover: this.to.options.color.hover.border, + color: this.to.options.color.border + }; + } + else if (this.options.inheritColor == "from" || this.options.inheritColor == true) { + colorObj = { + highlight: this.from.options.color.highlight.border, + hover: this.from.options.color.hover.border, + color: this.from.options.color.border + }; + } + + if (this.selected == true) {return colorObj.highlight;} + else if (this.hover == true) {return colorObj.hover;} + else {return colorObj.color;} + } + /** - * @module hammer - * - * @class PointerEvent - * @static + * Redraw a edge as a line + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + * @private */ - var PointerEvent = Hammer.PointerEvent = { - /** - * holds all pointers, by `identifier` - * @property pointers - * @type {Object} - */ - pointers: {}, - - /** - * get the pointers as an array - * @method getTouchList - * @return {Array} touchlist - */ - getTouchList: function getTouchList() { - var touchlist = []; - // we can use forEach since pointerEvents only is in IE10 - Utils.each(this.pointers, function(pointer) { - touchlist.push(pointer); - }); - return touchlist; - }, - - /** - * update the position of a pointer - * @method updatePointer - * @param {String} eventType matches `EVENT_START|MOVE|END` - * @param {Object} pointerEvent - */ - updatePointer: function updatePointer(eventType, pointerEvent) { - if(eventType == EVENT_END || (eventType != EVENT_END && pointerEvent.buttons !== 1)) { - delete this.pointers[pointerEvent.pointerId]; - } else { - pointerEvent.identifier = pointerEvent.pointerId; - this.pointers[pointerEvent.pointerId] = pointerEvent; - } - }, - - /** - * check if ev matches pointertype - * @method matchType - * @param {String} pointerType matches `POINTER_MOUSE|TOUCH|PEN` - * @param {PointerEvent} ev - */ - matchType: function matchType(pointerType, ev) { - if(!ev.pointerType) { - return false; - } - - var pt = ev.pointerType, - types = {}; + Edge.prototype._drawLine = function(ctx) { + // set style + ctx.strokeStyle = this._getColor(); + ctx.lineWidth = this._getLineWidth(); - types[POINTER_MOUSE] = (pt === (ev.MSPOINTER_TYPE_MOUSE || POINTER_MOUSE)); - types[POINTER_TOUCH] = (pt === (ev.MSPOINTER_TYPE_TOUCH || POINTER_TOUCH)); - types[POINTER_PEN] = (pt === (ev.MSPOINTER_TYPE_PEN || POINTER_PEN)); - return types[pointerType]; - }, + if (this.from != this.to) { + // draw line + var via = this._line(ctx); - /** - * reset the stored pointers - * @method reset - */ - reset: function resetList() { - this.pointers = {}; + // draw label + var point; + if (this.label) { + if (this.options.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; + } + else { + point = this._pointOnLine(0.5); + } + this._label(ctx, this.label, point.x, point.y); + } + } + else { + var x, y; + var radius = this.physics.springLength / 4; + var node = this.from; + if (!node.width) { + node.resize(ctx); + } + if (node.width > node.height) { + x = node.x + node.width / 2; + y = node.y - radius; + } + else { + x = node.x + radius; + y = node.y - node.height / 2; } + this._circle(ctx, x, y, radius); + point = this._pointOnCircle(x, y, radius, 0.5); + this._label(ctx, this.label, point.x, point.y); + } }; - /** - * @module hammer - * - * @class Detection - * @static + * Get the line width of the edge. Depends on width and whether one of the + * connected nodes is selected. + * @return {Number} width + * @private */ - var Detection = Hammer.detection = { - // contains all registred Hammer.gestures in the correct order - gestures: [], - - // data of the current Hammer.gesture detection session - current: null, - - // the previous Hammer.gesture session data - // is a full clone of the previous gesture.current object - previous: null, + Edge.prototype._getLineWidth = function() { + if (this.selected == true) { + return Math.min(this.widthSelected, this.options.widthMax)*this.networkScaleInv; + } + else { + if (this.hover == true) { + return Math.min(this.options.hoverWidth, this.options.widthMax)*this.networkScaleInv; + } + else { + return this.options.width*this.networkScaleInv; + } + } + }; - // when this becomes true, no gestures are fired - stopped: false, + Edge.prototype._getViaCoordinates = function () { + var xVia = null; + var yVia = null; + var factor = this.options.smoothCurves.roundness; + var type = this.options.smoothCurves.type; - /** - * start Hammer.gesture detection - * @method startDetect - * @param {Hammer.Instance} inst - * @param {Object} eventData - */ - startDetect: function startDetect(inst, eventData) { - // already busy with a Hammer.gesture detection on an element - if(this.current) { - return; + var dx = Math.abs(this.from.x - this.to.x); + var dy = Math.abs(this.from.y - this.to.y); + if (type == 'discrete' || type == 'diagonalCross') { + if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dy; + yVia = this.from.y - factor * dy; } - - this.stopped = false; - - // holds current session - this.current = { - inst: inst, // reference to HammerInstance we're working for - startEvent: Utils.extend({}, eventData), // start eventData for distances, timing etc - lastEvent: false, // last eventData - lastCalcEvent: false, // last eventData for calculations. - futureCalcEvent: false, // last eventData for calculations. - lastCalcData: {}, // last lastCalcData - name: '' // current gesture we're in/detected, can be 'tap', 'hold' etc - }; - - this.detect(eventData); - }, - - /** - * Hammer.gesture detection - * @method detect - * @param {Object} eventData - * @return {any} - */ - detect: function detect(eventData) { - if(!this.current || this.stopped) { - return; + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dy; + yVia = this.from.y - factor * dy; + } + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dy; + yVia = this.from.y + factor * dy; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dy; + yVia = this.from.y + factor * dy; + } + } + if (type == "discrete") { + xVia = dx < factor * dy ? this.from.x : xVia; + } + } + else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dx; + yVia = this.from.y - factor * dx; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dx; + yVia = this.from.y - factor * dx; + } + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dx; + yVia = this.from.y + factor * dx; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dx; + yVia = this.from.y + factor * dx; + } + } + if (type == "discrete") { + yVia = dy < factor * dx ? this.from.y : yVia; + } + } + } + else if (type == "straightCross") { + if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { // up - down + xVia = this.from.x; + if (this.from.y < this.to.y) { + yVia = this.to.y - (1-factor) * dy; + } + else { + yVia = this.to.y + (1-factor) * dy; + } + } + else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { // left - right + if (this.from.x < this.to.x) { + xVia = this.to.x - (1-factor) * dx; + } + else { + xVia = this.to.x + (1-factor) * dx; + } + yVia = this.from.y; + } + } + else if (type == 'horizontal') { + if (this.from.x < this.to.x) { + xVia = this.to.x - (1-factor) * dx; + } + else { + xVia = this.to.x + (1-factor) * dx; + } + yVia = this.from.y; + } + else if (type == 'vertical') { + xVia = this.from.x; + if (this.from.y < this.to.y) { + yVia = this.to.y - (1-factor) * dy; + } + else { + yVia = this.to.y + (1-factor) * dy; + } + } + else { // continuous + if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + // console.log(1) + xVia = this.from.x + factor * dy; + yVia = this.from.y - factor * dy; + xVia = this.to.x < xVia ? this.to.x : xVia; } - - // extend event data with calculations about scale, distance etc - eventData = this.extendEventData(eventData); - - // hammer instance and instance options - var inst = this.current.inst, - instOptions = inst.options; - - // call Hammer.gesture handlers - Utils.each(this.gestures, function triggerGesture(gesture) { - // only when the instance options have enabled this gesture - if(!this.stopped && inst.enabled && instOptions[gesture.name]) { - gesture.handler.call(gesture, eventData, inst); - } - }, this); - - // store as previous event event - if(this.current) { - this.current.lastEvent = eventData; + else if (this.from.x > this.to.x) { + // console.log(2) + xVia = this.from.x - factor * dy; + yVia = this.from.y - factor * dy; + xVia = this.to.x > xVia ? this.to.x :xVia; } - - if(eventData.eventType == EVENT_END) { - this.stopDetect(); + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + // console.log(3) + xVia = this.from.x + factor * dy; + yVia = this.from.y + factor * dy; + xVia = this.to.x < xVia ? this.to.x : xVia; } - - return eventData; - }, - - /** - * clear the Hammer.gesture vars - * this is called on endDetect, but can also be used when a final Hammer.gesture has been detected - * to stop other Hammer.gestures from being fired - * @method stopDetect - */ - stopDetect: function stopDetect() { - // clone current data to the store as the previous gesture - // used for the double tap gesture, since this is an other gesture detect session - this.previous = Utils.extend({}, this.current); - - // reset the current - this.current = null; - this.stopped = true; - }, - - /** - * calculate velocity, angle and direction - * @method getVelocityData - * @param {Object} ev - * @param {Object} center - * @param {Number} deltaTime - * @param {Number} deltaX - * @param {Number} deltaY - */ - getCalculatedData: function getCalculatedData(ev, center, deltaTime, deltaX, deltaY) { - var cur = this.current, - recalc = false, - calcEv = cur.lastCalcEvent, - calcData = cur.lastCalcData; - - if(calcEv && ev.timeStamp - calcEv.timeStamp > Hammer.CALCULATE_INTERVAL) { - center = calcEv.center; - deltaTime = ev.timeStamp - calcEv.timeStamp; - deltaX = ev.center.clientX - calcEv.center.clientX; - deltaY = ev.center.clientY - calcEv.center.clientY; - recalc = true; + else if (this.from.x > this.to.x) { + // console.log(4, this.from.x, this.to.x) + xVia = this.from.x - factor * dy; + yVia = this.from.y + factor * dy; + xVia = this.to.x > xVia ? this.to.x : xVia; } - - if(ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) { - cur.futureCalcEvent = ev; + } + } + else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + // console.log(5) + xVia = this.from.x + factor * dx; + yVia = this.from.y - factor * dx; + yVia = this.to.y > yVia ? this.to.y : yVia; } - - if(!cur.lastCalcEvent || recalc) { - calcData.velocity = Utils.getVelocity(deltaTime, deltaX, deltaY); - calcData.angle = Utils.getAngle(center, ev.center); - calcData.direction = Utils.getDirection(center, ev.center); - - cur.lastCalcEvent = cur.futureCalcEvent || ev; - cur.futureCalcEvent = ev; + else if (this.from.x > this.to.x) { + // console.log(6) + xVia = this.from.x - factor * dx; + yVia = this.from.y - factor * dx; + yVia = this.to.y > yVia ? this.to.y : yVia; } - - ev.velocityX = calcData.velocity.x; - ev.velocityY = calcData.velocity.y; - ev.interimAngle = calcData.angle; - ev.interimDirection = calcData.direction; - }, - - /** - * extend eventData for Hammer.gestures - * @method extendEventData - * @param {Object} ev - * @return {Object} ev - */ - extendEventData: function extendEventData(ev) { - var cur = this.current, - startEv = cur.startEvent, - lastEv = cur.lastEvent || startEv; - - // update the start touchlist to calculate the scale/rotation - if(ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) { - startEv.touches = []; - Utils.each(ev.touches, function(touch) { - startEv.touches.push({ - clientX: touch.clientX, - clientY: touch.clientY - }); - }); + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + // console.log(7) + xVia = this.from.x + factor * dx; + yVia = this.from.y + factor * dx; + yVia = this.to.y < yVia ? this.to.y : yVia; } - - var deltaTime = ev.timeStamp - startEv.timeStamp, - deltaX = ev.center.clientX - startEv.center.clientX, - deltaY = ev.center.clientY - startEv.center.clientY; - - this.getCalculatedData(ev, lastEv.center, deltaTime, deltaX, deltaY); - - Utils.extend(ev, { - startEvent: startEv, - - deltaTime: deltaTime, - deltaX: deltaX, - deltaY: deltaY, - - distance: Utils.getDistance(startEv.center, ev.center), - angle: Utils.getAngle(startEv.center, ev.center), - direction: Utils.getDirection(startEv.center, ev.center), - scale: Utils.getScale(startEv.touches, ev.touches), - rotation: Utils.getRotation(startEv.touches, ev.touches) - }); - - return ev; - }, - - /** - * register new gesture - * @method register - * @param {Object} gesture object, see `gestures/` for documentation - * @return {Array} gestures - */ - register: function register(gesture) { - // add an enable gesture options if there is no given - var options = gesture.defaults || {}; - if(options[gesture.name] === undefined) { - options[gesture.name] = true; + else if (this.from.x > this.to.x) { + // console.log(8) + xVia = this.from.x - factor * dx; + yVia = this.from.y + factor * dx; + yVia = this.to.y < yVia ? this.to.y : yVia; } + } + } + } - // extend Hammer default options with the Hammer.gesture options - Utils.extend(Hammer.defaults, options, true); - - // set its index - gesture.index = gesture.index || 1000; - - // add Hammer.gesture to the list - this.gestures.push(gesture); - // sort the list by index - this.gestures.sort(function(a, b) { - if(a.index < b.index) { - return -1; - } - if(a.index > b.index) { - return 1; - } - return 0; - }); + return {x:xVia, y:yVia}; + } - return this.gestures; + /** + * Draw a line between two nodes + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Edge.prototype._line = function (ctx) { + // draw a straight line + ctx.beginPath(); + ctx.moveTo(this.from.x, this.from.y); + if (this.options.smoothCurves.enabled == true) { + if (this.options.smoothCurves.dynamic == false) { + var via = this._getViaCoordinates(); + if (via.x == null) { + ctx.lineTo(this.to.x, this.to.y); + ctx.stroke(); + return null; + } + else { + // this.via.x = via.x; + // this.via.y = via.y; + ctx.quadraticCurveTo(via.x,via.y,this.to.x, this.to.y); + ctx.stroke(); + return via; + } + } + else { + ctx.quadraticCurveTo(this.via.x,this.via.y,this.to.x, this.to.y); + ctx.stroke(); + return this.via; } + } + else { + ctx.lineTo(this.to.x, this.to.y); + ctx.stroke(); + return null; + } }; - /** - * @module hammer + * Draw a line from a node to itself, a circle + * @param {CanvasRenderingContext2D} ctx + * @param {Number} x + * @param {Number} y + * @param {Number} radius + * @private */ + Edge.prototype._circle = function (ctx, x, y, radius) { + // draw a circle + ctx.beginPath(); + ctx.arc(x, y, radius, 0, 2 * Math.PI, false); + ctx.stroke(); + }; /** - * create new hammer instance - * all methods should return the instance itself, so it is chainable. - * - * @class Instance - * @constructor - * @param {HTMLElement} element - * @param {Object} [options={}] options are merged with `Hammer.defaults` - * @return {Hammer.Instance} + * Draw label with white background and with the middle at (x, y) + * @param {CanvasRenderingContext2D} ctx + * @param {String} text + * @param {Number} x + * @param {Number} y + * @private */ - Hammer.Instance = function(element, options) { - var self = this; - - // setup HammerJS window events and register all gestures - // this also sets up the default options - setup(); - - /** - * @property element - * @type {HTMLElement} - */ - this.element = element; - - /** - * @property enabled - * @type {Boolean} - * @protected - */ - this.enabled = true; - - /** - * options, merged with the defaults - * options with an _ are converted to camelCase - * @property options - * @type {Object} - */ - Utils.each(options, function(value, name) { - delete options[name]; - options[Utils.toCamelCase(name)] = value; - }); - - this.options = Utils.extend(Utils.extend({}, Hammer.defaults), options || {}); - - // add some css to the element to prevent the browser from doing its native behavoir - if(this.options.behavior) { - Utils.toggleBehavior(this.element, this.options.behavior, true); - } + Edge.prototype._label = function (ctx, text, x, y) { + if (text) { + // TODO: cache the calculated size + ctx.font = ((this.from.selected || this.to.selected) ? "bold " : "") + + this.options.fontSize + "px " + this.options.fontFace; + ctx.fillStyle = this.options.fontFill; + var width = ctx.measureText(text).width; + var height = this.options.fontSize; + var left = x - width / 2; + var top = y - height / 2; - /** - * event start handler on the element to start the detection - * @property eventStartHandler - * @type {Object} - */ - this.eventStartHandler = Event.onTouch(element, EVENT_START, function(ev) { - if(self.enabled && ev.eventType == EVENT_START) { - Detection.startDetect(self, ev); - } else if(ev.eventType == EVENT_TOUCH) { - Detection.detect(ev); - } - }); + ctx.fillRect(left, top, width, height); - /** - * keep a list of user event handlers which needs to be removed when calling 'dispose' - * @property eventHandlers - * @type {Array} - */ - this.eventHandlers = []; + // draw text + ctx.fillStyle = this.options.fontColor || "black"; + ctx.textAlign = "left"; + ctx.textBaseline = "top"; + ctx.fillText(text, left, top); + } }; - Hammer.Instance.prototype = { - /** - * bind events to the instance - * @method on - * @chainable - * @param {String} gestures multiple gestures by splitting with a space - * @param {Function} handler - * @param {Object} handler.ev event object - */ - on: function onEvent(gestures, handler) { - var self = this; - Event.on(self.element, gestures, handler, function(type) { - self.eventHandlers.push({ gesture: type, handler: handler }); - }); - return self; - }, - - /** - * unbind events to the instance - * @method off - * @chainable - * @param {String} gestures - * @param {Function} handler - */ - off: function offEvent(gestures, handler) { - var self = this; - - Event.off(self.element, gestures, handler, function(type) { - var index = Utils.inArray({ gesture: type, handler: handler }); - if(index !== false) { - self.eventHandlers.splice(index, 1); - } - }); - return self; - }, - - /** - * trigger gesture event - * @method trigger - * @chainable - * @param {String} gesture - * @param {Object} [eventData] - */ - trigger: function triggerEvent(gesture, eventData) { - // optional - if(!eventData) { - eventData = {}; - } - - // create DOM event - var event = Hammer.DOCUMENT.createEvent('Event'); - event.initEvent(gesture, true, true); - event.gesture = eventData; - - // trigger on the target if it is in the instance element, - // this is for event delegation tricks - var element = this.element; - if(Utils.hasParent(eventData.target, element)) { - element = eventData.target; - } + /** + * Redraw a edge as a dashed line + * Draw this edge in the given canvas + * @author David Jordan + * @date 2012-08-08 + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Edge.prototype._drawDashLine = function(ctx) { + // set style + if (this.selected == true) {ctx.strokeStyle = this.options.color.highlight;} + else if (this.hover == true) {ctx.strokeStyle = this.options.color.hover;} + else {ctx.strokeStyle = this.options.color.color;} - element.dispatchEvent(event); - return this; - }, + ctx.lineWidth = this._getLineWidth(); - /** - * enable of disable hammer.js detection - * @method enable - * @chainable - * @param {Boolean} state - */ - enable: function enable(state) { - this.enabled = state; - return this; - }, + var via = null; + // only firefox and chrome support this method, else we use the legacy one. + if (ctx.mozDash !== undefined || ctx.setLineDash !== undefined) { + // configure the dash pattern + var pattern = [0]; + if (this.options.dash.length !== undefined && this.options.dash.gap !== undefined) { + pattern = [this.options.dash.length,this.options.dash.gap]; + } + else { + pattern = [5,5]; + } - /** - * dispose this hammer instance - * @method dispose - * @return {Null} - */ - dispose: function dispose() { - var i, eh; + // set dash settings for chrome or firefox + if (typeof ctx.setLineDash !== 'undefined') { //Chrome + ctx.setLineDash(pattern); + ctx.lineDashOffset = 0; - // undo all changes made by stop_browser_behavior - Utils.toggleBehavior(this.element, this.options.behavior, false); + } else { //Firefox + ctx.mozDash = pattern; + ctx.mozDashOffset = 0; + } - // unbind all custom event handlers - for(i = -1; (eh = this.eventHandlers[++i]);) { - Utils.off(this.element, eh.gesture, eh.handler); - } + // draw the line + via = this._line(ctx); - this.eventHandlers = []; + // restore the dash settings. + if (typeof ctx.setLineDash !== 'undefined') { //Chrome + ctx.setLineDash([0]); + ctx.lineDashOffset = 0; - // unbind the start event listener - Event.off(this.element, EVENT_TYPES[EVENT_START], this.eventStartHandler); + } else { //Firefox + ctx.mozDash = [0]; + ctx.mozDashOffset = 0; + } + } + else { // unsupporting smooth lines + // draw dashed line + ctx.beginPath(); + ctx.lineCap = 'round'; + if (this.options.dash.altLength !== undefined) //If an alt dash value has been set add to the array this value + { + ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, + [this.options.dash.length,this.options.dash.gap,this.options.dash.altLength,this.options.dash.gap]); + } + else if (this.options.dash.length !== undefined && this.options.dash.gap !== undefined) //If a dash and gap value has been set add to the array this value + { + ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, + [this.options.dash.length,this.options.dash.gap]); + } + else //If all else fails draw a line + { + ctx.moveTo(this.from.x, this.from.y); + ctx.lineTo(this.to.x, this.to.y); + } + ctx.stroke(); + } - return null; + // draw label + if (this.label) { + var point; + if (this.options.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; + } + else { + point = this._pointOnLine(0.5); } + this._label(ctx, this.label, point.x, point.y); + } }; - - /** - * @module gestures - */ - /** - * Move with x fingers (default 1) around on the page. - * Preventing the default browser behavior is a good way to improve feel and working. - * ```` - * hammertime.on("drag", function(ev) { - * console.log(ev); - * ev.gesture.preventDefault(); - * }); - * ```` - * - * @class Drag - * @static - */ - /** - * @event drag - * @param {Object} ev - */ - /** - * @event dragstart - * @param {Object} ev - */ - /** - * @event dragend - * @param {Object} ev - */ - /** - * @event drapleft - * @param {Object} ev - */ - /** - * @event dragright - * @param {Object} ev - */ /** - * @event dragup - * @param {Object} ev + * Get a point on a line + * @param {Number} percentage. Value between 0 (line start) and 1 (line end) + * @return {Object} point + * @private */ + Edge.prototype._pointOnLine = function (percentage) { + return { + x: (1 - percentage) * this.from.x + percentage * this.to.x, + y: (1 - percentage) * this.from.y + percentage * this.to.y + } + }; + /** - * @event dragdown - * @param {Object} ev + * Get a point on a circle + * @param {Number} x + * @param {Number} y + * @param {Number} radius + * @param {Number} percentage. Value between 0 (line start) and 1 (line end) + * @return {Object} point + * @private */ + Edge.prototype._pointOnCircle = function (x, y, radius, percentage) { + var angle = (percentage - 3/8) * 2 * Math.PI; + return { + x: x + radius * Math.cos(angle), + y: y - radius * Math.sin(angle) + } + }; /** - * @param {String} name + * Redraw a edge as a line with an arrow halfway the line + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + * @private */ - (function(name) { - var triggered = false; + Edge.prototype._drawArrowCenter = function(ctx) { + var point; + // set style + if (this.selected == true) {ctx.strokeStyle = this.options.color.highlight; ctx.fillStyle = this.options.color.highlight;} + else if (this.hover == true) {ctx.strokeStyle = this.options.color.hover; ctx.fillStyle = this.options.color.hover;} + else {ctx.strokeStyle = this.options.color.color; ctx.fillStyle = this.options.color.color;} + ctx.lineWidth = this._getLineWidth(); - function dragGesture(ev, inst) { - var cur = Detection.current; + if (this.from != this.to) { + // draw line + var via = this._line(ctx); - // max touches - if(inst.options.dragMaxTouches > 0 && - ev.touches.length > inst.options.dragMaxTouches) { - return; - } + var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); + var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; + // draw an arrow halfway the line + if (this.options.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; + } + else { + point = this._pointOnLine(0.5); + } - switch(ev.eventType) { - case EVENT_START: - triggered = false; - break; + ctx.arrow(point.x, point.y, angle, length); + ctx.fill(); + ctx.stroke(); - case EVENT_MOVE: - // when the distance we moved is too small we skip this gesture - // or we can be already in dragging - if(ev.distance < inst.options.dragMinDistance && - cur.name != name) { - return; - } + // draw label + if (this.label) { + this._label(ctx, this.label, point.x, point.y); + } + } + else { + // draw circle + var x, y; + var radius = 0.25 * Math.max(100,this.physics.springLength); + var node = this.from; + if (!node.width) { + node.resize(ctx); + } + if (node.width > node.height) { + x = node.x + node.width * 0.5; + y = node.y - radius; + } + else { + x = node.x + radius; + y = node.y - node.height * 0.5; + } + this._circle(ctx, x, y, radius); - var startCenter = cur.startEvent.center; + // draw all arrows + var angle = 0.2 * Math.PI; + var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; + point = this._pointOnCircle(x, y, radius, 0.5); + ctx.arrow(point.x, point.y, angle, length); + ctx.fill(); + ctx.stroke(); - // we are dragging! - if(cur.name != name) { - cur.name = name; - if(inst.options.dragDistanceCorrection && ev.distance > 0) { - // When a drag is triggered, set the event center to dragMinDistance pixels from the original event center. - // Without this correction, the dragged distance would jumpstart at dragMinDistance pixels instead of at 0. - // It might be useful to save the original start point somewhere - var factor = Math.abs(inst.options.dragMinDistance / ev.distance); - startCenter.pageX += ev.deltaX * factor; - startCenter.pageY += ev.deltaY * factor; - startCenter.clientX += ev.deltaX * factor; - startCenter.clientY += ev.deltaY * factor; + // draw label + if (this.label) { + point = this._pointOnCircle(x, y, radius, 0.5); + this._label(ctx, this.label, point.x, point.y); + } + } + }; - // recalculate event data using new start point - ev = Detection.extendEventData(ev); - } - } - // lock drag to axis? - if(cur.lastEvent.dragLockToAxis || - ( inst.options.dragLockToAxis && - inst.options.dragLockMinDistance <= ev.distance - )) { - ev.dragLockToAxis = true; - } - // keep direction on the axis that the drag gesture started on - var lastDirection = cur.lastEvent.direction; - if(ev.dragLockToAxis && lastDirection !== ev.direction) { - if(Utils.isVertical(lastDirection)) { - ev.direction = (ev.deltaY < 0) ? DIRECTION_UP : DIRECTION_DOWN; - } else { - ev.direction = (ev.deltaX < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT; - } - } + /** + * Redraw a edge as a line with an arrow + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Edge.prototype._drawArrow = function(ctx) { + // set style + if (this.selected == true) {ctx.strokeStyle = this.options.color.highlight; ctx.fillStyle = this.options.color.highlight;} + else if (this.hover == true) {ctx.strokeStyle = this.options.color.hover; ctx.fillStyle = this.options.color.hover;} + else {ctx.strokeStyle = this.options.color.color; ctx.fillStyle = this.options.color.color;} - // first time, trigger dragstart event - if(!triggered) { - inst.trigger(name + 'start', ev); - triggered = true; - } + ctx.lineWidth = this._getLineWidth(); - // trigger events - inst.trigger(name, ev); - inst.trigger(name + ev.direction, ev); + var angle, length; + //draw a line + if (this.from != this.to) { + angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); + var dx = (this.to.x - this.from.x); + var dy = (this.to.y - this.from.y); + var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); - var isVertical = Utils.isVertical(ev.direction); + var fromBorderDist = this.from.distanceToBorder(ctx, angle + Math.PI); + var fromBorderPoint = (edgeSegmentLength - fromBorderDist) / edgeSegmentLength; + var xFrom = (fromBorderPoint) * this.from.x + (1 - fromBorderPoint) * this.to.x; + var yFrom = (fromBorderPoint) * this.from.y + (1 - fromBorderPoint) * this.to.y; - // block the browser events - if((inst.options.dragBlockVertical && isVertical) || - (inst.options.dragBlockHorizontal && !isVertical)) { - ev.preventDefault(); - } - break; + var via; + if (this.options.smoothCurves.dynamic == true && this.options.smoothCurves.enabled == true ) { + via = this.via; + } + else if (this.options.smoothCurves.enabled == true) { + via = this._getViaCoordinates(); + } - case EVENT_RELEASE: - if(triggered && ev.changedLength <= inst.options.dragMaxTouches) { - inst.trigger(name + 'end', ev); - triggered = false; - } - break; + if (this.options.smoothCurves.enabled == true && via.x != null) { + angle = Math.atan2((this.to.y - via.y), (this.to.x - via.x)); + dx = (this.to.x - via.x); + dy = (this.to.y - via.y); + edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); + } + var toBorderDist = this.to.distanceToBorder(ctx, angle); + var toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength; - case EVENT_END: - triggered = false; - break; - } + var xTo,yTo; + if (this.options.smoothCurves.enabled == true && via.x != null) { + xTo = (1 - toBorderPoint) * via.x + toBorderPoint * this.to.x; + yTo = (1 - toBorderPoint) * via.y + toBorderPoint * this.to.y; + } + else { + xTo = (1 - toBorderPoint) * this.from.x + toBorderPoint * this.to.x; + yTo = (1 - toBorderPoint) * this.from.y + toBorderPoint * this.to.y; } - Hammer.gestures.Drag = { - name: name, - index: 50, - handler: dragGesture, - defaults: { - /** - * minimal movement that have to be made before the drag event gets triggered - * @property dragMinDistance - * @type {Number} - * @default 10 - */ - dragMinDistance: 10, + ctx.beginPath(); + ctx.moveTo(xFrom,yFrom); + if (this.options.smoothCurves.enabled == true && via.x != null) { + ctx.quadraticCurveTo(via.x,via.y,xTo, yTo); + } + else { + ctx.lineTo(xTo, yTo); + } + ctx.stroke(); - /** - * Set dragDistanceCorrection to true to make the starting point of the drag - * be calculated from where the drag was triggered, not from where the touch started. - * Useful to avoid a jerk-starting drag, which can make fine-adjustments - * through dragging difficult, and be visually unappealing. - * @property dragDistanceCorrection - * @type {Boolean} - * @default true - */ - dragDistanceCorrection: true, + // draw arrow at the end of the line + length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; + ctx.arrow(xTo, yTo, angle, length); + ctx.fill(); + ctx.stroke(); - /** - * set 0 for unlimited, but this can conflict with transform - * @property dragMaxTouches - * @type {Number} - * @default 1 - */ - dragMaxTouches: 1, + // draw label + if (this.label) { + var point; + if (this.options.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; + } + else { + point = this._pointOnLine(0.5); + } + this._label(ctx, this.label, point.x, point.y); + } + } + else { + // draw circle + var node = this.from; + var x, y, arrow; + var radius = 0.25 * Math.max(100,this.physics.springLength); + if (!node.width) { + node.resize(ctx); + } + if (node.width > node.height) { + x = node.x + node.width * 0.5; + y = node.y - radius; + arrow = { + x: x, + y: node.y, + angle: 0.9 * Math.PI + }; + } + else { + x = node.x + radius; + y = node.y - node.height * 0.5; + arrow = { + x: node.x, + y: y, + angle: 0.6 * Math.PI + }; + } + ctx.beginPath(); + // TODO: similarly, for a line without arrows, draw to the border of the nodes instead of the center + ctx.arc(x, y, radius, 0, 2 * Math.PI, false); + ctx.stroke(); - /** - * prevent default browser behavior when dragging occurs - * be careful with it, it makes the element a blocking element - * when you are using the drag gesture, it is a good practice to set this true - * @property dragBlockHorizontal - * @type {Boolean} - * @default false - */ - dragBlockHorizontal: false, + // draw all arrows + var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; + ctx.arrow(arrow.x, arrow.y, arrow.angle, length); + ctx.fill(); + ctx.stroke(); - /** - * same as `dragBlockHorizontal`, but for vertical movement - * @property dragBlockVertical - * @type {Boolean} - * @default false - */ - dragBlockVertical: false, + // draw label + if (this.label) { + point = this._pointOnCircle(x, y, radius, 0.5); + this._label(ctx, this.label, point.x, point.y); + } + } + }; - /** - * dragLockToAxis keeps the drag gesture on the axis that it started on, - * It disallows vertical directions if the initial direction was horizontal, and vice versa. - * @property dragLockToAxis - * @type {Boolean} - * @default false - */ - dragLockToAxis: false, - /** - * drag lock only kicks in when distance > dragLockMinDistance - * This way, locking occurs only when the distance has become large enough to reliably determine the direction - * @property dragLockMinDistance - * @type {Number} - * @default 25 - */ - dragLockMinDistance: 25 - } - }; - })('drag'); /** - * @module gestures - */ - /** - * trigger a simple gesture event, so you can do anything in your handler. - * only usable if you know what your doing... - * - * @class Gesture - * @static - */ - /** - * @event gesture - * @param {Object} ev + * Calculate the distance between a point (x3,y3) and a line segment from + * (x1,y1) to (x2,y2). + * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @private */ - Hammer.gestures.Gesture = { - name: 'gesture', - index: 1337, - handler: function releaseGesture(ev, inst) { - inst.trigger(this.name, ev); + Edge.prototype._getDistanceToEdge = function (x1,y1, x2,y2, x3,y3) { // x3,y3 is the point + if (this.from != this.to) { + if (this.options.smoothCurves.enabled == true) { + var xVia, yVia; + if (this.options.smoothCurves.enabled == true && this.options.smoothCurves.dynamic == true) { + xVia = this.via.x; + yVia = this.via.y; + } + else { + var via = this._getViaCoordinates(); + xVia = via.x; + yVia = via.y; + } + var minDistance = 1e9; + var distance; + var i,t,x,y, lastX, lastY; + for (i = 0; i < 10; i++) { + t = 0.1*i; + x = Math.pow(1-t,2)*x1 + (2*t*(1 - t))*xVia + Math.pow(t,2)*x2; + y = Math.pow(1-t,2)*y1 + (2*t*(1 - t))*yVia + Math.pow(t,2)*y2; + if (i > 0) { + distance = this._getDistanceToLine(lastX,lastY,x,y, x3,y3); + minDistance = distance < minDistance ? distance : minDistance; + } + lastX = x; lastY = y; + } + return minDistance + } + else { + return this._getDistanceToLine(x1,y1,x2,y2,x3,y3); + } + } + else { + var x, y, dx, dy; + var radius = 0.25 * this.physics.springLength; + var node = this.from; + if (node.width > node.height) { + x = node.x + 0.5 * node.width; + y = node.y - radius; + } + else { + x = node.x + radius; + y = node.y - 0.5 * node.height; } + dx = x - x3; + dy = y - y3; + return Math.abs(Math.sqrt(dx*dx + dy*dy) - radius); + } }; - /** - * @module gestures - */ - /** - * Touch stays at the same place for x time - * - * @class Hold - * @static - */ - /** - * @event hold - * @param {Object} ev - */ + Edge.prototype._getDistanceToLine = function(x1,y1,x2,y2,x3,y3) { + var px = x2-x1, + py = y2-y1, + something = px*px + py*py, + u = ((x3 - x1) * px + (y3 - y1) * py) / something; + + if (u > 1) { + u = 1; + } + else if (u < 0) { + u = 0; + } + + var x = x1 + u * px, + y = y1 + u * py, + dx = x - x3, + dy = y - y3; + + //# Note: If the actual distance does not matter, + //# if you only want to compare what this function + //# returns to other results of this function, you + //# can just return the squared distance instead + //# (i.e. remove the sqrt) to gain a little performance + + return Math.sqrt(dx*dx + dy*dy); + } /** - * @param {String} name + * This allows the zoom level of the network to influence the rendering + * + * @param scale */ - (function(name) { - var timer; - - function holdGesture(ev, inst) { - var options = inst.options, - current = Detection.current; + Edge.prototype.setScale = function(scale) { + this.networkScaleInv = 1.0/scale; + }; - switch(ev.eventType) { - case EVENT_START: - clearTimeout(timer); - // set the gesture so we can check in the timeout if it still is - current.name = name; + Edge.prototype.select = function() { + this.selected = true; + }; - // set timer and if after the timeout it still is hold, - // we trigger the hold event - timer = setTimeout(function() { - if(current && current.name == name) { - inst.trigger(name, ev); - } - }, options.holdTimeout); - break; + Edge.prototype.unselect = function() { + this.selected = false; + }; - case EVENT_MOVE: - if(ev.distance > options.holdThreshold) { - clearTimeout(timer); - } - break; + Edge.prototype.positionBezierNode = function() { + if (this.via !== null && this.from !== null && this.to !== null) { + this.via.x = 0.5 * (this.from.x + this.to.x); + this.via.y = 0.5 * (this.from.y + this.to.y); + } + }; - case EVENT_RELEASE: - clearTimeout(timer); - break; - } + /** + * This function draws the control nodes for the manipulator. In order to enable this, only set the this.controlNodesEnabled to true. + * @param ctx + */ + Edge.prototype._drawControlNodes = function(ctx) { + if (this.controlNodesEnabled == true) { + if (this.controlNodes.from === null && this.controlNodes.to === null) { + var nodeIdFrom = "edgeIdFrom:".concat(this.id); + var nodeIdTo = "edgeIdTo:".concat(this.id); + var constants = { + nodes:{group:'', radius:8}, + physics:{damping:0}, + clustering: {maxNodeSizeIncrements: 0 ,nodeScaling: {width:0, height: 0, radius:0}} + }; + this.controlNodes.from = new Node( + {id:nodeIdFrom, + shape:'dot', + color:{background:'#ff4e00', border:'#3c3c3c', highlight: {background:'#07f968'}} + },{},{},constants); + this.controlNodes.to = new Node( + {id:nodeIdTo, + shape:'dot', + color:{background:'#ff4e00', border:'#3c3c3c', highlight: {background:'#07f968'}} + },{},{},constants); } - Hammer.gestures.Hold = { - name: name, - index: 10, - defaults: { - /** - * @property holdTimeout - * @type {Number} - * @default 500 - */ - holdTimeout: 500, + if (this.controlNodes.from.selected == false && this.controlNodes.to.selected == false) { + this.controlNodes.positions = this.getControlNodePositions(ctx); + this.controlNodes.from.x = this.controlNodes.positions.from.x; + this.controlNodes.from.y = this.controlNodes.positions.from.y; + this.controlNodes.to.x = this.controlNodes.positions.to.x; + this.controlNodes.to.y = this.controlNodes.positions.to.y; + } - /** - * movement allowed while holding - * @property holdThreshold - * @type {Number} - * @default 2 - */ - holdThreshold: 2 - }, - handler: holdGesture - }; - })('hold'); + this.controlNodes.from.draw(ctx); + this.controlNodes.to.draw(ctx); + } + else { + this.controlNodes = {from:null, to:null, positions:{}}; + } + }; /** - * @module gestures - */ - /** - * when a touch is being released from the page - * - * @class Release - * @static - */ - /** - * @event release - * @param {Object} ev + * Enable control nodes. + * @private */ - Hammer.gestures.Release = { - name: 'release', - index: Infinity, - handler: function releaseGesture(ev, inst) { - if(ev.eventType == EVENT_RELEASE) { - inst.trigger(this.name, ev); - } - } + Edge.prototype._enableControlNodes = function() { + this.controlNodesEnabled = true; }; /** - * @module gestures - */ - /** - * triggers swipe events when the end velocity is above the threshold - * for best usage, set `preventDefault` (on the drag gesture) to `true` - * ```` - * hammertime.on("dragleft swipeleft", function(ev) { - * console.log(ev); - * ev.gesture.preventDefault(); - * }); - * ```` - * - * @class Swipe - * @static - */ - /** - * @event swipe - * @param {Object} ev - */ - /** - * @event swipeleft - * @param {Object} ev - */ - /** - * @event swiperight - * @param {Object} ev - */ - /** - * @event swipeup - * @param {Object} ev + * disable control nodes + * @private */ + Edge.prototype._disableControlNodes = function() { + this.controlNodesEnabled = false; + }; + /** - * @event swipedown - * @param {Object} ev + * This checks if one of the control nodes is selected and if so, returns the control node object. Else it returns null. + * @param x + * @param y + * @returns {null} + * @private */ - Hammer.gestures.Swipe = { - name: 'swipe', - index: 40, - defaults: { - /** - * @property swipeMinTouches - * @type {Number} - * @default 1 - */ - swipeMinTouches: 1, - - /** - * @property swipeMaxTouches - * @type {Number} - * @default 1 - */ - swipeMaxTouches: 1, - - /** - * horizontal swipe velocity - * @property swipeVelocityX - * @type {Number} - * @default 0.6 - */ - swipeVelocityX: 0.6, - - /** - * vertical swipe velocity - * @property swipeVelocityY - * @type {Number} - * @default 0.6 - */ - swipeVelocityY: 0.6 - }, - - handler: function swipeGesture(ev, inst) { - if(ev.eventType == EVENT_RELEASE) { - var touches = ev.touches.length, - options = inst.options; - - // max touches - if(touches < options.swipeMinTouches || - touches > options.swipeMaxTouches) { - return; - } + Edge.prototype._getSelectedControlNode = function(x,y) { + var positions = this.controlNodes.positions; + var fromDistance = Math.sqrt(Math.pow(x - positions.from.x,2) + Math.pow(y - positions.from.y,2)); + var toDistance = Math.sqrt(Math.pow(x - positions.to.x ,2) + Math.pow(y - positions.to.y ,2)); - // when the distance we moved is too small we skip this gesture - // or we can be already in dragging - if(ev.velocityX > options.swipeVelocityX || - ev.velocityY > options.swipeVelocityY) { - // trigger swipe events - inst.trigger(this.name, ev); - inst.trigger(this.name + ev.direction, ev); - } - } - } + if (fromDistance < 15) { + this.connectedNode = this.from; + this.from = this.controlNodes.from; + return this.controlNodes.from; + } + else if (toDistance < 15) { + this.connectedNode = this.to; + this.to = this.controlNodes.to; + return this.controlNodes.to; + } + else { + return null; + } }; + /** - * @module gestures - */ - /** - * Single tap and a double tap on a place - * - * @class Tap - * @static - */ - /** - * @event tap - * @param {Object} ev - */ - /** - * @event doubletap - * @param {Object} ev + * this resets the control nodes to their original position. + * @private */ + Edge.prototype._restoreControlNodes = function() { + if (this.controlNodes.from.selected == true) { + this.from = this.connectedNode; + this.connectedNode = null; + this.controlNodes.from.unselect(); + } + if (this.controlNodes.to.selected == true) { + this.to = this.connectedNode; + this.connectedNode = null; + this.controlNodes.to.unselect(); + } + }; /** - * @param {String} name + * this calculates the position of the control nodes on the edges of the parent nodes. + * + * @param ctx + * @returns {{from: {x: number, y: number}, to: {x: *, y: *}}} */ - (function(name) { - var hasMoved = false; - - function tapGesture(ev, inst) { - var options = inst.options, - current = Detection.current, - prev = Detection.previous, - sincePrev, - didDoubleTap; - - switch(ev.eventType) { - case EVENT_START: - hasMoved = false; - break; - - case EVENT_MOVE: - hasMoved = hasMoved || (ev.distance > options.tapMaxDistance); - break; - - case EVENT_END: - if(!Utils.inStr(ev.srcEvent.type, 'cancel') && ev.deltaTime < options.tapMaxTime && !hasMoved) { - // previous gesture, for the double tap since these are two different gesture detections - sincePrev = prev && prev.lastEvent && ev.timeStamp - prev.lastEvent.timeStamp; - didDoubleTap = false; - - // check if double tap - if(prev && prev.name == name && - (sincePrev && sincePrev < options.doubleTapInterval) && - ev.distance < options.doubleTapDistance) { - inst.trigger('doubletap', ev); - didDoubleTap = true; - } + Edge.prototype.getControlNodePositions = function(ctx) { + var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); + var dx = (this.to.x - this.from.x); + var dy = (this.to.y - this.from.y); + var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); + var fromBorderDist = this.from.distanceToBorder(ctx, angle + Math.PI); + var fromBorderPoint = (edgeSegmentLength - fromBorderDist) / edgeSegmentLength; + var xFrom = (fromBorderPoint) * this.from.x + (1 - fromBorderPoint) * this.to.x; + var yFrom = (fromBorderPoint) * this.from.y + (1 - fromBorderPoint) * this.to.y; - // do a single tap - if(!didDoubleTap || options.tapAlways) { - current.name = name; - inst.trigger(current.name, ev); - } - } - break; - } - } + var via; + if (this.options.smoothCurves.dynamic == true && this.options.smoothCurves.enabled == true) { + via = this.via; + } + else if (this.options.smoothCurves.enabled == true) { + via = this._getViaCoordinates(); + } - Hammer.gestures.Tap = { - name: name, - index: 100, - handler: tapGesture, - defaults: { - /** - * max time of a tap, this is for the slow tappers - * @property tapMaxTime - * @type {Number} - * @default 250 - */ - tapMaxTime: 250, + if (this.options.smoothCurves.enabled == true && via.x != null) { + angle = Math.atan2((this.to.y - via.y), (this.to.x - via.x)); + dx = (this.to.x - via.x); + dy = (this.to.y - via.y); + edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); + } + var toBorderDist = this.to.distanceToBorder(ctx, angle); + var toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength; - /** - * max distance of movement of a tap, this is for the slow tappers - * @property tapMaxDistance - * @type {Number} - * @default 10 - */ - tapMaxDistance: 10, + var xTo,yTo; + if (this.options.smoothCurves.enabled == true && via.x != null) { + xTo = (1 - toBorderPoint) * via.x + toBorderPoint * this.to.x; + yTo = (1 - toBorderPoint) * via.y + toBorderPoint * this.to.y; + } + else { + xTo = (1 - toBorderPoint) * this.from.x + toBorderPoint * this.to.x; + yTo = (1 - toBorderPoint) * this.from.y + toBorderPoint * this.to.y; + } - /** - * always trigger the `tap` event, even while double-tapping - * @property tapAlways - * @type {Boolean} - * @default true - */ - tapAlways: true, + return {from:{x:xFrom,y:yFrom},to:{x:xTo,y:yTo}}; + }; - /** - * max distance between two taps - * @property doubleTapDistance - * @type {Number} - * @default 20 - */ - doubleTapDistance: 20, + module.exports = Edge; - /** - * max time between two taps - * @property doubleTapInterval - * @type {Number} - * @default 300 - */ - doubleTapInterval: 300 - } - }; - })('tap'); +/***/ }, +/* 51 */ +/***/ function(module, exports, __webpack_require__) { /** - * @module gestures - */ - /** - * when a touch is being touched at the page - * - * @class Touch - * @static - */ - /** - * @event touch - * @param {Object} ev + * Popup is a class to create a popup window with some text + * @param {Element} container The container object. + * @param {Number} [x] + * @param {Number} [y] + * @param {String} [text] + * @param {Object} [style] An object containing borderColor, + * backgroundColor, etc. */ - Hammer.gestures.Touch = { - name: 'touch', - index: -Infinity, - defaults: { - /** - * call preventDefault at touchstart, and makes the element blocking by disabling the scrolling of the page, - * but it improves gestures like transforming and dragging. - * be careful with using this, it can be very annoying for users to be stuck on the page - * @property preventDefault - * @type {Boolean} - * @default false - */ - preventDefault: false, + function Popup(container, x, y, text, style) { + if (container) { + this.container = container; + } + else { + this.container = document.body; + } - /** - * disable mouse events, so only touch (or pen!) input triggers events - * @property preventMouse - * @type {Boolean} - * @default false - */ - preventMouse: false - }, - handler: function touchGesture(ev, inst) { - if(inst.options.preventMouse && ev.pointerType == POINTER_MOUSE) { - ev.stopDetect(); - return; + // x, y and text are optional, see if a style object was passed in their place + if (style === undefined) { + if (typeof x === "object") { + style = x; + x = undefined; + } else if (typeof text === "object") { + style = text; + text = undefined; + } else { + // for backwards compatibility, in case clients other than Network are creating Popup directly + style = { + fontColor: 'black', + fontSize: 14, // px + fontFace: 'verdana', + color: { + border: '#666', + background: '#FFFFC6' } + } + } + } - if(inst.options.preventDefault) { - ev.preventDefault(); - } + this.x = 0; + this.y = 0; + this.padding = 5; - if(ev.eventType == EVENT_TOUCH) { - inst.trigger('touch', ev); - } - } - }; + if (x !== undefined && y !== undefined ) { + this.setPosition(x, y); + } + if (text !== undefined) { + this.setText(text); + } + + // create the frame + this.frame = document.createElement("div"); + var styleAttr = this.frame.style; + styleAttr.position = "absolute"; + styleAttr.visibility = "hidden"; + styleAttr.border = "1px solid " + style.color.border; + styleAttr.color = style.fontColor; + styleAttr.fontSize = style.fontSize + "px"; + styleAttr.fontFamily = style.fontFace; + styleAttr.padding = this.padding + "px"; + styleAttr.backgroundColor = style.color.background; + styleAttr.borderRadius = "3px"; + styleAttr.MozBorderRadius = "3px"; + styleAttr.WebkitBorderRadius = "3px"; + styleAttr.boxShadow = "3px 3px 10px rgba(128, 128, 128, 0.5)"; + styleAttr.whiteSpace = "nowrap"; + this.container.appendChild(this.frame); + } /** - * @module gestures - */ - /** - * User want to scale or rotate with 2 fingers - * Preventing the default browser behavior is a good way to improve feel and working. This can be done with the - * `preventDefault` option. - * - * @class Transform - * @static - */ - /** - * @event transform - * @param {Object} ev - */ - /** - * @event transformstart - * @param {Object} ev - */ - /** - * @event transformend - * @param {Object} ev - */ - /** - * @event pinchin - * @param {Object} ev - */ - /** - * @event pinchout - * @param {Object} ev + * @param {number} x Horizontal position of the popup window + * @param {number} y Vertical position of the popup window */ + Popup.prototype.setPosition = function(x, y) { + this.x = parseInt(x); + this.y = parseInt(y); + }; + /** - * @event rotate - * @param {Object} ev + * Set the text for the popup window. This can be HTML code + * @param {string} text */ + Popup.prototype.setText = function(text) { + this.frame.innerHTML = text; + }; /** - * @param {String} name + * Show the popup window + * @param {boolean} show Optional. Show or hide the window */ - (function(name) { - var triggered = false; + Popup.prototype.show = function (show) { + if (show === undefined) { + show = true; + } - function transformGesture(ev, inst) { - switch(ev.eventType) { - case EVENT_START: - triggered = false; - break; + if (show) { + var height = this.frame.clientHeight; + var width = this.frame.clientWidth; + var maxHeight = this.frame.parentNode.clientHeight; + var maxWidth = this.frame.parentNode.clientWidth; - case EVENT_MOVE: - // at least multitouch - if(ev.touches.length < 2) { - return; - } + var top = (this.y - height); + if (top + height + this.padding > maxHeight) { + top = maxHeight - height - this.padding; + } + if (top < this.padding) { + top = this.padding; + } - var scaleThreshold = Math.abs(1 - ev.scale); - var rotationThreshold = Math.abs(ev.rotation); + var left = this.x; + if (left + width + this.padding > maxWidth) { + left = maxWidth - width - this.padding; + } + if (left < this.padding) { + left = this.padding; + } - // when the distance we moved is too small we skip this gesture - // or we can be already in dragging - if(scaleThreshold < inst.options.transformMinScale && - rotationThreshold < inst.options.transformMinRotation) { - return; - } + this.frame.style.left = left + "px"; + this.frame.style.top = top + "px"; + this.frame.style.visibility = "visible"; + } + else { + this.hide(); + } + }; - // we are transforming! - Detection.current.name = name; + /** + * Hide the popup window + */ + Popup.prototype.hide = function () { + this.frame.style.visibility = "hidden"; + }; - // first time, trigger dragstart event - if(!triggered) { - inst.trigger(name + 'start', ev); - triggered = true; - } + module.exports = Popup; - inst.trigger(name, ev); // basic transform event - // trigger rotate event - if(rotationThreshold > inst.options.transformMinRotation) { - inst.trigger('rotate', ev); - } +/***/ }, +/* 52 */ +/***/ function(module, exports, __webpack_require__) { - // trigger pinch event - if(scaleThreshold > inst.options.transformMinScale) { - inst.trigger('pinch', ev); - inst.trigger('pinch' + (ev.scale < 1 ? 'in' : 'out'), ev); - } - break; + var PhysicsMixin = __webpack_require__(53); + var ClusterMixin = __webpack_require__(57); + var SectorsMixin = __webpack_require__(58); + var SelectionMixin = __webpack_require__(59); + var ManipulationMixin = __webpack_require__(60); + var NavigationMixin = __webpack_require__(61); + var HierarchicalLayoutMixin = __webpack_require__(62); - case EVENT_RELEASE: - if(triggered && ev.changedLength < 2) { - inst.trigger(name + 'end', ev); - triggered = false; - } - break; - } + /** + * Load a mixin into the network object + * + * @param {Object} sourceVariable | this object has to contain functions. + * @private + */ + exports._loadMixin = function (sourceVariable) { + for (var mixinFunction in sourceVariable) { + if (sourceVariable.hasOwnProperty(mixinFunction)) { + this[mixinFunction] = sourceVariable[mixinFunction]; } + } + }; - Hammer.gestures.Transform = { - name: name, - index: 45, - defaults: { - /** - * minimal scale factor, no scale is 1, zoomin is to 0 and zoomout until higher then 1 - * @property transformMinScale - * @type {Number} - * @default 0.01 - */ - transformMinScale: 0.01, - /** - * rotation in degrees - * @property transformMinRotation - * @type {Number} - * @default 1 - */ - transformMinRotation: 1 - }, + /** + * removes a mixin from the network object. + * + * @param {Object} sourceVariable | this object has to contain functions. + * @private + */ + exports._clearMixin = function (sourceVariable) { + for (var mixinFunction in sourceVariable) { + if (sourceVariable.hasOwnProperty(mixinFunction)) { + this[mixinFunction] = undefined; + } + } + }; - handler: transformGesture - }; - })('transform'); /** - * @module hammer + * Mixin the physics system and initialize the parameters required. + * + * @private */ + exports._loadPhysicsSystem = function () { + this._loadMixin(PhysicsMixin); + this._loadSelectedForceSolver(); + if (this.constants.configurePhysics == true) { + this._loadPhysicsConfiguration(); + } + }; - // AMD export - if(true) { - !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { - return Hammer; - }.call(exports, __webpack_require__, exports, module)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - // commonjs export - } else if(typeof module !== 'undefined' && module.exports) { - module.exports = Hammer; - // browser export - } else { - window.Hammer = Hammer; - } - })(window); + /** + * Mixin the cluster system and initialize the parameters required. + * + * @private + */ + exports._loadClusterSystem = function () { + this.clusterSession = 0; + this.hubThreshold = 5; + this._loadMixin(ClusterMixin); + }; -/***/ }, -/* 53 */ -/***/ function(module, exports, __webpack_require__) { /** - * Creation of the ClusterMixin var. + * Mixin the sector system and initialize the parameters required + * + * @private + */ + exports._loadSectorSystem = function () { + this.sectors = {}; + this.activeSector = ["default"]; + this.sectors["active"] = {}; + this.sectors["active"]["default"] = {"nodes": {}, + "edges": {}, + "nodeIndices": [], + "formationScale": 1.0, + "drawingNode": undefined }; + this.sectors["frozen"] = {}; + this.sectors["support"] = {"nodes": {}, + "edges": {}, + "nodeIndices": [], + "formationScale": 1.0, + "drawingNode": undefined }; + + this.nodeIndices = this.sectors["active"]["default"]["nodeIndices"]; // the node indices list is used to speed up the computation of the repulsion fields + + this._loadMixin(SectorsMixin); + }; + + + /** + * Mixin the selection system and initialize the parameters required * - * This contains all the functions the Network object can use to employ clustering + * @private */ + exports._loadSelectionSystem = function () { + this.selectionObj = {nodes: {}, edges: {}}; - /** - * This is only called in the constructor of the network object - * - */ - exports.startWithClustering = function() { - // cluster if the data set is big - this.clusterToFit(this.constants.clustering.initialMaxNodes, true); - - // updates the lables after clustering - this.updateLabels(); - - // this is called here because if clusterin is disabled, the start and stabilize are called in - // the setData function. - if (this.stabilize) { - this._stabilize(); - } - this.start(); + this._loadMixin(SelectionMixin); }; + /** - * This function clusters until the initialMaxNodes has been reached + * Mixin the navigationUI (User Interface) system and initialize the parameters required * - * @param {Number} maxNumberOfNodes - * @param {Boolean} reposition + * @private */ - exports.clusterToFit = function(maxNumberOfNodes, reposition) { - var numberOfNodes = this.nodeIndices.length; + exports._loadManipulationSystem = function () { + // reset global variables -- these are used by the selection of nodes and edges. + this.blockConnectingEdgeSelection = false; + this.forceAppendSelection = false; - var maxLevels = 50; - var level = 0; + if (this.constants.dataManipulation.enabled == true) { + // load the manipulator HTML elements. All styling done in css. + if (this.manipulationDiv === undefined) { + this.manipulationDiv = document.createElement('div'); + this.manipulationDiv.className = 'network-manipulationDiv'; + this.manipulationDiv.id = 'network-manipulationDiv'; + if (this.editMode == true) { + this.manipulationDiv.style.display = "block"; + } + else { + this.manipulationDiv.style.display = "none"; + } + this.frame.appendChild(this.manipulationDiv); + } - // we first cluster the hubs, then we pull in the outliers, repeat - while (numberOfNodes > maxNumberOfNodes && level < maxLevels) { - if (level % 3 == 0) { - this.forceAggregateHubs(true); - this.normalizeClusterLevels(); + if (this.editModeDiv === undefined) { + this.editModeDiv = document.createElement('div'); + this.editModeDiv.className = 'network-manipulation-editMode'; + this.editModeDiv.id = 'network-manipulation-editMode'; + if (this.editMode == true) { + this.editModeDiv.style.display = "none"; + } + else { + this.editModeDiv.style.display = "block"; + } + this.frame.appendChild(this.editModeDiv); } - else { - this.increaseClusterLevel(); // this also includes a cluster normalization + + if (this.closeDiv === undefined) { + this.closeDiv = document.createElement('div'); + this.closeDiv.className = 'network-manipulation-closeDiv'; + this.closeDiv.id = 'network-manipulation-closeDiv'; + this.closeDiv.style.display = this.manipulationDiv.style.display; + this.frame.appendChild(this.closeDiv); } - numberOfNodes = this.nodeIndices.length; - level += 1; + // load the manipulation functions + this._loadMixin(ManipulationMixin); + + // create the manipulator toolbar + this._createManipulatorBar(); } + else { + if (this.manipulationDiv !== undefined) { + // removes all the bindings and overloads + this._createManipulatorBar(); + // remove the manipulation divs + this.containerElement.removeChild(this.manipulationDiv); + this.containerElement.removeChild(this.editModeDiv); + this.containerElement.removeChild(this.closeDiv); - // after the clustering we reposition the nodes to reduce the initial chaos - if (level > 0 && reposition == true) { - this.repositionNodes(); + this.manipulationDiv = undefined; + this.editModeDiv = undefined; + this.closeDiv = undefined; + // remove the mixin functions + this._clearMixin(ManipulationMixin); + } } - this._updateCalculationNodes(); }; + /** - * This function can be called to open up a specific cluster. It is only called by - * It will unpack the cluster back one level. + * Mixin the navigation (User Interface) system and initialize the parameters required * - * @param node | Node object: cluster to open. + * @private */ - exports.openCluster = function(node) { - var isMovingBeforeClustering = this.moving; - if (node.clusterSize > this.constants.clustering.sectorThreshold && this._nodeInActiveArea(node) && - !(this._sector() == "default" && this.nodeIndices.length == 1)) { - // this loads a new sector, loads the nodes and edges and nodeIndices of it. - this._addSector(node); - var level = 0; - - // we decluster until we reach a decent number of nodes - while ((this.nodeIndices.length < this.constants.clustering.initialMaxNodes) && (level < 10)) { - this.decreaseClusterLevel(); - level += 1; - } - - } - else { - this._expandClusterNode(node,false,true); - - // update the index list, dynamic edges and labels - this._updateNodeIndexList(); - this._updateDynamicEdges(); - this._updateCalculationNodes(); - this.updateLabels(); - } + exports._loadNavigationControls = function () { + this._loadMixin(NavigationMixin); - // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded - if (this.moving != isMovingBeforeClustering) { - this.start(); + // the clean function removes the button divs, this is done to remove the bindings. + this._cleanNavigation(); + if (this.constants.navigation.enabled == true) { + this._loadNavigationElements(); } }; /** - * This calls the updateClustes with default arguments + * Mixin the hierarchical layout system. + * + * @private */ - exports.updateClustersDefault = function() { - if (this.constants.clustering.enabled == true) { - this.updateClusters(0,false,false); - } + exports._loadHierarchySystem = function () { + this._loadMixin(HierarchicalLayoutMixin); }; - /** - * This function can be called to increase the cluster level. This means that the nodes with only one edge connection will - * be clustered with their connected node. This can be repeated as many times as needed. - * This can be called externally (by a keybind for instance) to reduce the complexity of big datasets. - */ - exports.increaseClusterLevel = function() { - this.updateClusters(-1,false,true); - }; +/***/ }, +/* 53 */ +/***/ function(module, exports, __webpack_require__) { + var util = __webpack_require__(1); + var RepulsionMixin = __webpack_require__(54); + var HierarchialRepulsionMixin = __webpack_require__(55); + var BarnesHutMixin = __webpack_require__(56); /** - * This function can be called to decrease the cluster level. This means that the nodes with only one edge connection will - * be unpacked if they are a cluster. This can be repeated as many times as needed. - * This can be called externally (by a key-bind for instance) to look into clusters without zooming. + * Toggling barnes Hut calculation on and off. + * + * @private */ - exports.decreaseClusterLevel = function() { - this.updateClusters(1,false,true); + exports._toggleBarnesHut = function () { + this.constants.physics.barnesHut.enabled = !this.constants.physics.barnesHut.enabled; + this._loadSelectedForceSolver(); + this.moving = true; + this.start(); }; /** - * This is the main clustering function. It clusters and declusters on zoom or forced - * This function clusters on zoom, it can be called with a predefined zoom direction - * If out, check if we can form clusters, if in, check if we can open clusters. - * This function is only called from _zoom() - * - * @param {Number} zoomDirection | -1 / 0 / +1 for zoomOut / determineByZoom / zoomIn - * @param {Boolean} recursive | enabled or disable recursive calling of the opening of clusters - * @param {Boolean} force | enabled or disable forcing - * @param {Boolean} doNotStart | if true do not call start + * This loads the node force solver based on the barnes hut or repulsion algorithm * + * @private */ - exports.updateClusters = function(zoomDirection,recursive,force,doNotStart) { - var isMovingBeforeClustering = this.moving; - var amountOfNodes = this.nodeIndices.length; + exports._loadSelectedForceSolver = function () { + // this overloads the this._calculateNodeForces + if (this.constants.physics.barnesHut.enabled == true) { + this._clearMixin(RepulsionMixin); + this._clearMixin(HierarchialRepulsionMixin); - // on zoom out collapse the sector if the scale is at the level the sector was made - if (this.previousScale > this.scale && zoomDirection == 0) { - this._collapseSector(); - } + this.constants.physics.centralGravity = this.constants.physics.barnesHut.centralGravity; + this.constants.physics.springLength = this.constants.physics.barnesHut.springLength; + this.constants.physics.springConstant = this.constants.physics.barnesHut.springConstant; + this.constants.physics.damping = this.constants.physics.barnesHut.damping; - // check if we zoom in or out - if (this.previousScale > this.scale || zoomDirection == -1) { // zoom out - // forming clusters when forced pulls outliers in. When not forced, the edge length of the - // outer nodes determines if it is being clustered - this._formClusters(force); - } - else if (this.previousScale < this.scale || zoomDirection == 1) { // zoom in - if (force == true) { - // _openClusters checks for each node if the formationScale of the cluster is smaller than - // the current scale and if so, declusters. When forced, all clusters are reduced by one step - this._openClusters(recursive,force); - } - else { - // if a cluster takes up a set percentage of the active window - this._openClustersBySize(); - } + this._loadMixin(BarnesHutMixin); } - this._updateNodeIndexList(); + else if (this.constants.physics.hierarchicalRepulsion.enabled == true) { + this._clearMixin(BarnesHutMixin); + this._clearMixin(RepulsionMixin); - // if a cluster was NOT formed and the user zoomed out, we try clustering by hubs - if (this.nodeIndices.length == amountOfNodes && (this.previousScale > this.scale || zoomDirection == -1)) { - this._aggregateHubs(force); - this._updateNodeIndexList(); - } + this.constants.physics.centralGravity = this.constants.physics.hierarchicalRepulsion.centralGravity; + this.constants.physics.springLength = this.constants.physics.hierarchicalRepulsion.springLength; + this.constants.physics.springConstant = this.constants.physics.hierarchicalRepulsion.springConstant; + this.constants.physics.damping = this.constants.physics.hierarchicalRepulsion.damping; - // we now reduce chains. - if (this.previousScale > this.scale || zoomDirection == -1) { // zoom out - this.handleChains(); - this._updateNodeIndexList(); + this._loadMixin(HierarchialRepulsionMixin); } + else { + this._clearMixin(BarnesHutMixin); + this._clearMixin(HierarchialRepulsionMixin); + this.barnesHutTree = undefined; - this.previousScale = this.scale; - - // rest of the update the index list, dynamic edges and labels - this._updateDynamicEdges(); - this.updateLabels(); - - // if a cluster was formed, we increase the clusterSession - if (this.nodeIndices.length < amountOfNodes) { // this means a clustering operation has taken place - this.clusterSession += 1; - // if clusters have been made, we normalize the cluster level - this.normalizeClusterLevels(); - } + this.constants.physics.centralGravity = this.constants.physics.repulsion.centralGravity; + this.constants.physics.springLength = this.constants.physics.repulsion.springLength; + this.constants.physics.springConstant = this.constants.physics.repulsion.springConstant; + this.constants.physics.damping = this.constants.physics.repulsion.damping; - if (doNotStart == false || doNotStart === undefined) { - // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded - if (this.moving != isMovingBeforeClustering) { - this.start(); - } + this._loadMixin(RepulsionMixin); } - - this._updateCalculationNodes(); }; /** - * This function handles the chains. It is called on every updateClusters(). + * Before calculating the forces, we check if we need to cluster to keep up performance and we check + * if there is more than one node. If it is just one node, we dont calculate anything. + * + * @private */ - exports.handleChains = function() { - // after clustering we check how many chains there are - var chainPercentage = this._getChainFraction(); - if (chainPercentage > this.constants.clustering.chainThreshold) { - this._reduceAmountOfChains(1 - this.constants.clustering.chainThreshold / chainPercentage) + exports._initializeForceCalculation = function () { + // stop calculation if there is only one node + if (this.nodeIndices.length == 1) { + this.nodes[this.nodeIndices[0]]._setForce(0, 0); + } + else { + // if there are too many nodes on screen, we cluster without repositioning + if (this.nodeIndices.length > this.constants.clustering.clusterThreshold && this.constants.clustering.enabled == true) { + this.clusterToFit(this.constants.clustering.reduceToNodes, false); + } + // we now start the force calculation + this._calculateForces(); } }; + /** - * this functions starts clustering by hubs - * The minimum hub threshold is set globally - * + * Calculate the external forces acting on the nodes + * Forces are caused by: edges, repulsing forces between nodes, gravity * @private */ - exports._aggregateHubs = function(force) { - this._getHubSize(); - this._formClustersByHub(force,false); + exports._calculateForces = function () { + // Gravity is required to keep separated groups from floating off + // the forces are reset to zero in this loop by using _setForce instead + // of _addForce + + this._calculateGravitationalForces(); + this._calculateNodeForces(); + + if (this.constants.physics.springConstant > 0) { + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + this._calculateSpringForcesWithSupport(); + } + else { + if (this.constants.physics.hierarchicalRepulsion.enabled == true) { + this._calculateHierarchicalSpringForces(); + } + else { + this._calculateSpringForces(); + } + } + } }; /** - * This function is fired by keypress. It forces hubs to form. + * Smooth curves are created by adding invisible nodes in the center of the edges. These nodes are also + * handled in the calculateForces function. We then use a quadratic curve with the center node as control. + * This function joins the datanodes and invisible (called support) nodes into one object. + * We do this so we do not contaminate this.nodes with the support nodes. * + * @private */ - exports.forceAggregateHubs = function(doNotStart) { - var isMovingBeforeClustering = this.moving; - var amountOfNodes = this.nodeIndices.length; - - this._aggregateHubs(true); - - // update the index list, dynamic edges and labels - this._updateNodeIndexList(); - this._updateDynamicEdges(); - this.updateLabels(); + exports._updateCalculationNodes = function () { + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + this.calculationNodes = {}; + this.calculationNodeIndices = []; - // if a cluster was formed, we increase the clusterSession - if (this.nodeIndices.length != amountOfNodes) { - this.clusterSession += 1; - } + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + this.calculationNodes[nodeId] = this.nodes[nodeId]; + } + } + var supportNodes = this.sectors['support']['nodes']; + for (var supportNodeId in supportNodes) { + if (supportNodes.hasOwnProperty(supportNodeId)) { + if (this.edges.hasOwnProperty(supportNodes[supportNodeId].parentEdgeId)) { + this.calculationNodes[supportNodeId] = supportNodes[supportNodeId]; + } + else { + supportNodes[supportNodeId]._setForce(0, 0); + } + } + } - if (doNotStart == false || doNotStart === undefined) { - // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded - if (this.moving != isMovingBeforeClustering) { - this.start(); + for (var idx in this.calculationNodes) { + if (this.calculationNodes.hasOwnProperty(idx)) { + this.calculationNodeIndices.push(idx); + } } } + else { + this.calculationNodes = this.nodes; + this.calculationNodeIndices = this.nodeIndices; + } }; + /** - * If a cluster takes up more than a set percentage of the screen, open the cluster + * this function applies the central gravity effect to keep groups from floating off * * @private */ - exports._openClustersBySize = function() { - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - var node = this.nodes[nodeId]; - if (node.inView() == true) { - if ((node.width*this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || - (node.height*this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { - this.openCluster(node); - } - } + exports._calculateGravitationalForces = function () { + var dx, dy, distance, node, i; + var nodes = this.calculationNodes; + var gravity = this.constants.physics.centralGravity; + var gravityForce = 0; + + for (i = 0; i < this.calculationNodeIndices.length; i++) { + node = nodes[this.calculationNodeIndices[i]]; + node.damping = this.constants.physics.damping; // possibly add function to alter damping properties of clusters. + // gravity does not apply when we are in a pocket sector + if (this._sector() == "default" && gravity != 0) { + dx = -node.x; + dy = -node.y; + distance = Math.sqrt(dx * dx + dy * dy); + + gravityForce = (distance == 0) ? 0 : (gravity / distance); + node.fx = dx * gravityForce; + node.fy = dy * gravityForce; + } + else { + node.fx = 0; + node.fy = 0; } } }; + + /** - * This function loops over all nodes in the nodeIndices list. For each node it checks if it is a cluster and if it - * has to be opened based on the current zoom level. + * this function calculates the effects of the springs in the case of unsmooth curves. * * @private */ - exports._openClusters = function(recursive,force) { - for (var i = 0; i < this.nodeIndices.length; i++) { - var node = this.nodes[this.nodeIndices[i]]; - this._expandClusterNode(node,recursive,force); - this._updateCalculationNodes(); + exports._calculateSpringForces = function () { + var edgeLength, edge, edgeId; + var dx, dy, fx, fy, springForce, distance; + var edges = this.edges; + + // forces caused by the edges, modelled as springs + for (edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + edge = edges[edgeId]; + if (edge.connected) { + // only calculate forces if nodes are in the same sector + if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { + edgeLength = edge.physics.springLength; + // this implies that the edges between big clusters are longer + edgeLength += (edge.to.clusterSize + edge.from.clusterSize - 2) * this.constants.clustering.edgeGrowth; + + dx = (edge.from.x - edge.to.x); + dy = (edge.from.y - edge.to.y); + distance = Math.sqrt(dx * dx + dy * dy); + + if (distance == 0) { + distance = 0.01; + } + + // the 1/distance is so the fx and fy can be calculated without sine or cosine. + springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; + + fx = dx * springForce; + fy = dy * springForce; + + edge.from.fx += fx; + edge.from.fy += fy; + edge.to.fx -= fx; + edge.to.fy -= fy; + } + } + } } }; + + + /** - * This function checks if a node has to be opened. This is done by checking the zoom level. - * If the node contains child nodes, this function is recursively called on the child nodes as well. - * This recursive behaviour is optional and can be set by the recursive argument. + * This function calculates the springforces on the nodes, accounting for the support nodes. * - * @param {Node} parentNode | to check for cluster and expand - * @param {Boolean} recursive | enabled or disable recursive calling - * @param {Boolean} force | enabled or disable forcing - * @param {Boolean} [openAll] | This will recursively force all nodes in the parent to be released * @private */ - exports._expandClusterNode = function(parentNode, recursive, force, openAll) { - // first check if node is a cluster - if (parentNode.clusterSize > 1) { - // this means that on a double tap event or a zoom event, the cluster fully unpacks if it is smaller than 20 - if (parentNode.clusterSize < this.constants.clustering.sectorThreshold) { - openAll = true; - } - recursive = openAll ? true : recursive; + exports._calculateSpringForcesWithSupport = function () { + var edgeLength, edge, edgeId, combinedClusterSize; + var edges = this.edges; - // if the last child has been added on a smaller scale than current scale decluster - if (parentNode.formationScale < this.scale || force == true) { - // we will check if any of the contained child nodes should be removed from the cluster - for (var containedNodeId in parentNode.containedNodes) { - if (parentNode.containedNodes.hasOwnProperty(containedNodeId)) { - var childNode = parentNode.containedNodes[containedNodeId]; + // forces caused by the edges, modelled as springs + for (edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + edge = edges[edgeId]; + if (edge.connected) { + // only calculate forces if nodes are in the same sector + if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { + if (edge.via != null) { + var node1 = edge.to; + var node2 = edge.via; + var node3 = edge.from; - // force expand will expand the largest cluster size clusters. Since we cluster from outside in, we assume that - // the largest cluster is the one that comes from outside - if (force == true) { - if (childNode.clusterSession == parentNode.clusterSessions[parentNode.clusterSessions.length-1] - || openAll) { - this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); - } - } - else { - if (this._nodeInActiveArea(parentNode)) { - this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); - } + edgeLength = edge.physics.springLength; + + combinedClusterSize = node1.clusterSize + node3.clusterSize - 2; + + // this implies that the edges between big clusters are longer + edgeLength += combinedClusterSize * this.constants.clustering.edgeGrowth; + this._calculateSpringForce(node1, node2, 0.5 * edgeLength); + this._calculateSpringForce(node2, node3, 0.5 * edgeLength); } } } @@ -26773,4530 +26478,4827 @@ return /******/ (function(modules) { // webpackBootstrap } }; + /** - * ONLY CALLED FROM _expandClusterNode - * - * This function will expel a child_node from a parent_node. This is to de-cluster the node. This function will remove - * the child node from the parent contained_node object and put it back into the global nodes object. - * The same holds for the edge that was connected to the child node. It is moved back into the global edges object. + * This is the code actually performing the calculation for the function above. It is split out to avoid repetition. * - * @param {Node} parentNode | the parent node - * @param {String} containedNodeId | child_node id as it is contained in the containedNodes object of the parent node - * @param {Boolean} recursive | This will also check if the child needs to be expanded. - * With force and recursive both true, the entire cluster is unpacked - * @param {Boolean} force | This will disregard the zoom level and will expel this child from the parent - * @param {Boolean} openAll | This will recursively force all nodes in the parent to be released + * @param node1 + * @param node2 + * @param edgeLength * @private */ - exports._expelChildFromParent = function(parentNode, containedNodeId, recursive, force, openAll) { - var childNode = parentNode.containedNodes[containedNodeId]; + exports._calculateSpringForce = function (node1, node2, edgeLength) { + var dx, dy, fx, fy, springForce, distance; - // if child node has been added on smaller scale than current, kick out - if (childNode.formationScale < this.scale || force == true) { - // unselect all selected items - this._unselectAll(); + dx = (node1.x - node2.x); + dy = (node1.y - node2.y); + distance = Math.sqrt(dx * dx + dy * dy); - // put the child node back in the global nodes object - this.nodes[containedNodeId] = childNode; + if (distance == 0) { + distance = 0.01; + } - // release the contained edges from this childNode back into the global edges - this._releaseContainedEdges(parentNode,childNode); + // the 1/distance is so the fx and fy can be calculated without sine or cosine. + springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; - // reconnect rerouted edges to the childNode - this._connectEdgeBackToChild(parentNode,childNode); + fx = dx * springForce; + fy = dy * springForce; - // validate all edges in dynamicEdges - this._validateEdges(parentNode); + node1.fx += fx; + node1.fy += fy; + node2.fx -= fx; + node2.fy -= fy; + }; - // undo the changes from the clustering operation on the parent node - parentNode.options.mass -= childNode.options.mass; - parentNode.clusterSize -= childNode.clusterSize; - parentNode.options.fontSize = Math.min(this.constants.clustering.maxFontSize, this.constants.nodes.fontSize + this.constants.clustering.fontSizeMultiplier*parentNode.clusterSize); - parentNode.dynamicEdgesLength = parentNode.dynamicEdges.length; - // place the child node near the parent, not at the exact same location to avoid chaos in the system - childNode.x = parentNode.x + parentNode.growthIndicator * (0.5 - Math.random()); - childNode.y = parentNode.y + parentNode.growthIndicator * (0.5 - Math.random()); + /** + * Load the HTML for the physics config and bind it + * @private + */ + exports._loadPhysicsConfiguration = function () { + if (this.physicsConfiguration === undefined) { + this.backupConstants = {}; + util.deepExtend(this.backupConstants,this.constants); - // remove node from the list - delete parentNode.containedNodes[containedNodeId]; + var hierarchicalLayoutDirections = ["LR", "RL", "UD", "DU"]; + this.physicsConfiguration = document.createElement('div'); + this.physicsConfiguration.className = "PhysicsConfiguration"; + this.physicsConfiguration.innerHTML = '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
Simulation Mode:
Barnes HutRepulsionHierarchical
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
Options:
' + this.containerElement.parentElement.insertBefore(this.physicsConfiguration, this.containerElement); + this.optionsDiv = document.createElement("div"); + this.optionsDiv.style.fontSize = "14px"; + this.optionsDiv.style.fontFamily = "verdana"; + this.containerElement.parentElement.insertBefore(this.optionsDiv, this.containerElement); - // check if there are other childs with this clusterSession in the parent. - var othersPresent = false; - for (var childNodeId in parentNode.containedNodes) { - if (parentNode.containedNodes.hasOwnProperty(childNodeId)) { - if (parentNode.containedNodes[childNodeId].clusterSession == childNode.clusterSession) { - othersPresent = true; - break; - } - } + var rangeElement; + rangeElement = document.getElementById('graph_BH_gc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_gc', -1, "physics_barnesHut_gravitationalConstant"); + rangeElement = document.getElementById('graph_BH_cg'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_cg', 1, "physics_centralGravity"); + rangeElement = document.getElementById('graph_BH_sc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sc', 1, "physics_springConstant"); + rangeElement = document.getElementById('graph_BH_sl'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sl', 1, "physics_springLength"); + rangeElement = document.getElementById('graph_BH_damp'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_damp', 1, "physics_damping"); + + rangeElement = document.getElementById('graph_R_nd'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_nd', 1, "physics_repulsion_nodeDistance"); + rangeElement = document.getElementById('graph_R_cg'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_cg', 1, "physics_centralGravity"); + rangeElement = document.getElementById('graph_R_sc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sc', 1, "physics_springConstant"); + rangeElement = document.getElementById('graph_R_sl'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sl', 1, "physics_springLength"); + rangeElement = document.getElementById('graph_R_damp'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_damp', 1, "physics_damping"); + + rangeElement = document.getElementById('graph_H_nd'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance"); + rangeElement = document.getElementById('graph_H_cg'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_cg', 1, "physics_centralGravity"); + rangeElement = document.getElementById('graph_H_sc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sc', 1, "physics_springConstant"); + rangeElement = document.getElementById('graph_H_sl'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sl', 1, "physics_springLength"); + rangeElement = document.getElementById('graph_H_damp'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_damp', 1, "physics_damping"); + rangeElement = document.getElementById('graph_H_direction'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_direction', hierarchicalLayoutDirections, "hierarchicalLayout_direction"); + rangeElement = document.getElementById('graph_H_levsep'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_levsep', 1, "hierarchicalLayout_levelSeparation"); + rangeElement = document.getElementById('graph_H_nspac'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nspac', 1, "hierarchicalLayout_nodeSpacing"); + + var radioButton1 = document.getElementById("graph_physicsMethod1"); + var radioButton2 = document.getElementById("graph_physicsMethod2"); + var radioButton3 = document.getElementById("graph_physicsMethod3"); + radioButton2.checked = true; + if (this.constants.physics.barnesHut.enabled) { + radioButton1.checked = true; } - // if there are no others, remove the cluster session from the list - if (othersPresent == false) { - parentNode.clusterSessions.pop(); + if (this.constants.hierarchicalLayout.enabled) { + radioButton3.checked = true; } - this._repositionBezierNodes(childNode); - // this._repositionBezierNodes(parentNode); + var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); + var graph_repositionNodes = document.getElementById("graph_repositionNodes"); + var graph_generateOptions = document.getElementById("graph_generateOptions"); - // remove the clusterSession from the child node - childNode.clusterSession = 0; + graph_toggleSmooth.onclick = graphToggleSmoothCurves.bind(this); + graph_repositionNodes.onclick = graphRepositionNodes.bind(this); + graph_generateOptions.onclick = graphGenerateOptions.bind(this); + if (this.constants.smoothCurves == true && this.constants.dynamicSmoothCurves == false) { + graph_toggleSmooth.style.background = "#A4FF56"; + } + else { + graph_toggleSmooth.style.background = "#FF8532"; + } - // recalculate the size of the node on the next time the node is rendered - parentNode.clearSizeCache(); - // restart the simulation to reorganise all nodes - this.moving = true; + switchConfigurations.apply(this); + + radioButton1.onchange = switchConfigurations.bind(this); + radioButton2.onchange = switchConfigurations.bind(this); + radioButton3.onchange = switchConfigurations.bind(this); } + }; - // check if a further expansion step is possible if recursivity is enabled - if (recursive == true) { - this._expandClusterNode(childNode,recursive,force,openAll); + /** + * This overwrites the this.constants. + * + * @param constantsVariableName + * @param value + * @private + */ + exports._overWriteGraphConstants = function (constantsVariableName, value) { + var nameArray = constantsVariableName.split("_"); + if (nameArray.length == 1) { + this.constants[nameArray[0]] = value; + } + else if (nameArray.length == 2) { + this.constants[nameArray[0]][nameArray[1]] = value; + } + else if (nameArray.length == 3) { + this.constants[nameArray[0]][nameArray[1]][nameArray[2]] = value; } }; /** - * position the bezier nodes at the center of the edges - * - * @param node - * @private + * this function is bound to the toggle smooth curves button. That is also why it is not in the prototype. */ - exports._repositionBezierNodes = function(node) { - for (var i = 0; i < node.dynamicEdges.length; i++) { - node.dynamicEdges[i].positionBezierNode(); - } - }; + function graphToggleSmoothCurves () { + this.constants.smoothCurves.enabled = !this.constants.smoothCurves.enabled; + var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); + if (this.constants.smoothCurves.enabled == true) {graph_toggleSmooth.style.background = "#A4FF56";} + else {graph_toggleSmooth.style.background = "#FF8532";} + this._configureSmoothCurves(false); + } /** - * This function checks if any nodes at the end of their trees have edges below a threshold length - * This function is called only from updateClusters() - * forceLevelCollapse ignores the length of the edge and collapses one level - * This means that a node with only one edge will be clustered with its connected node + * this function is used to scramble the nodes * - * @private - * @param {Boolean} force */ - exports._formClusters = function(force) { - if (force == false) { - this._formClustersByZoom(); + function graphRepositionNodes () { + for (var nodeId in this.calculationNodes) { + if (this.calculationNodes.hasOwnProperty(nodeId)) { + this.calculationNodes[nodeId].vx = 0; this.calculationNodes[nodeId].vy = 0; + this.calculationNodes[nodeId].fx = 0; this.calculationNodes[nodeId].fy = 0; + } + } + if (this.constants.hierarchicalLayout.enabled == true) { + this._setupHierarchicalLayout(); + showValueOfRange.call(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance"); + showValueOfRange.call(this, 'graph_H_cg', 1, "physics_centralGravity"); + showValueOfRange.call(this, 'graph_H_sc', 1, "physics_springConstant"); + showValueOfRange.call(this, 'graph_H_sl', 1, "physics_springLength"); + showValueOfRange.call(this, 'graph_H_damp', 1, "physics_damping"); } else { - this._forceClustersByZoom(); + this.repositionNodes(); } - }; - + this.moving = true; + this.start(); + } /** - * This function handles the clustering by zooming out, this is based on a minimum edge distance - * - * @private + * this is used to generate an options file from the playing with physics system. */ - exports._formClustersByZoom = function() { - var dx,dy,length, - minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; - - // check if any edges are shorter than minLength and start the clustering - // the clustering favours the node with the larger mass - for (var edgeId in this.edges) { - if (this.edges.hasOwnProperty(edgeId)) { - var edge = this.edges[edgeId]; - if (edge.connected) { - if (edge.toId != edge.fromId) { - dx = (edge.to.x - edge.from.x); - dy = (edge.to.y - edge.from.y); - length = Math.sqrt(dx * dx + dy * dy); - - - if (length < minLength) { - // first check which node is larger - var parentNode = edge.from; - var childNode = edge.to; - if (edge.to.options.mass > edge.from.options.mass) { - parentNode = edge.to; - childNode = edge.from; - } - - if (childNode.dynamicEdgesLength == 1) { - this._addToCluster(parentNode,childNode,false); - } - else if (parentNode.dynamicEdgesLength == 1) { - this._addToCluster(childNode,parentNode,false); - } - } + function graphGenerateOptions () { + var options = "No options are required, default values used."; + var optionsSpecific = []; + var radioButton1 = document.getElementById("graph_physicsMethod1"); + var radioButton2 = document.getElementById("graph_physicsMethod2"); + if (radioButton1.checked == true) { + if (this.constants.physics.barnesHut.gravitationalConstant != this.backupConstants.physics.barnesHut.gravitationalConstant) {optionsSpecific.push("gravitationalConstant: " + this.constants.physics.barnesHut.gravitationalConstant);} + if (this.constants.physics.centralGravity != this.backupConstants.physics.barnesHut.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} + if (this.constants.physics.springLength != this.backupConstants.physics.barnesHut.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} + if (this.constants.physics.springConstant != this.backupConstants.physics.barnesHut.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} + if (this.constants.physics.damping != this.backupConstants.physics.barnesHut.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} + if (optionsSpecific.length != 0) { + options = "var options = {"; + options += "physics: {barnesHut: {"; + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", " } } + options += '}}' + } + if (this.constants.smoothCurves.enabled != this.backupConstants.smoothCurves.enabled) { + if (optionsSpecific.length == 0) {options = "var options = {";} + else {options += ", "} + options += "smoothCurves: " + this.constants.smoothCurves.enabled; + } + if (options != "No options are required, default values used.") { + options += '};' } } - }; + else if (radioButton2.checked == true) { + options = "var options = {"; + options += "physics: {barnesHut: {enabled: false}"; + if (this.constants.physics.repulsion.nodeDistance != this.backupConstants.physics.repulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.repulsion.nodeDistance);} + if (this.constants.physics.centralGravity != this.backupConstants.physics.repulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} + if (this.constants.physics.springLength != this.backupConstants.physics.repulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} + if (this.constants.physics.springConstant != this.backupConstants.physics.repulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} + if (this.constants.physics.damping != this.backupConstants.physics.repulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} + if (optionsSpecific.length != 0) { + options += ", repulsion: {"; + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", " + } + } + options += '}}' + } + if (optionsSpecific.length == 0) {options += "}"} + if (this.constants.smoothCurves != this.backupConstants.smoothCurves) { + options += ", smoothCurves: " + this.constants.smoothCurves; + } + options += '};' + } + else { + options = "var options = {"; + if (this.constants.physics.hierarchicalRepulsion.nodeDistance != this.backupConstants.physics.hierarchicalRepulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.hierarchicalRepulsion.nodeDistance);} + if (this.constants.physics.centralGravity != this.backupConstants.physics.hierarchicalRepulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} + if (this.constants.physics.springLength != this.backupConstants.physics.hierarchicalRepulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} + if (this.constants.physics.springConstant != this.backupConstants.physics.hierarchicalRepulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} + if (this.constants.physics.damping != this.backupConstants.physics.hierarchicalRepulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} + if (optionsSpecific.length != 0) { + options += "physics: {hierarchicalRepulsion: {"; + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", "; + } + } + options += '}},'; + } + options += 'hierarchicalLayout: {'; + optionsSpecific = []; + if (this.constants.hierarchicalLayout.direction != this.backupConstants.hierarchicalLayout.direction) {optionsSpecific.push("direction: " + this.constants.hierarchicalLayout.direction);} + if (Math.abs(this.constants.hierarchicalLayout.levelSeparation) != this.backupConstants.hierarchicalLayout.levelSeparation) {optionsSpecific.push("levelSeparation: " + this.constants.hierarchicalLayout.levelSeparation);} + if (this.constants.hierarchicalLayout.nodeSpacing != this.backupConstants.hierarchicalLayout.nodeSpacing) {optionsSpecific.push("nodeSpacing: " + this.constants.hierarchicalLayout.nodeSpacing);} + if (optionsSpecific.length != 0) { + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", " + } + } + options += '}' + } + else { + options += "enabled:true}"; + } + options += '};' + } + + + this.optionsDiv.innerHTML = options; + } /** - * This function forces the network to cluster all nodes with only one connecting edge to their - * connected node. + * this is used to switch between barnesHut, repulsion and hierarchical. * - * @private */ - exports._forceClustersByZoom = function() { - for (var nodeId in this.nodes) { - // another node could have absorbed this child. - if (this.nodes.hasOwnProperty(nodeId)) { - var childNode = this.nodes[nodeId]; + function switchConfigurations () { + var ids = ["graph_BH_table", "graph_R_table", "graph_H_table"]; + var radioButton = document.querySelector('input[name="graph_physicsMethod"]:checked').value; + var tableId = "graph_" + radioButton + "_table"; + var table = document.getElementById(tableId); + table.style.display = "block"; + for (var i = 0; i < ids.length; i++) { + if (ids[i] != tableId) { + table = document.getElementById(ids[i]); + table.style.display = "none"; + } + } + this._restoreNodes(); + if (radioButton == "R") { + this.constants.hierarchicalLayout.enabled = false; + this.constants.physics.hierarchicalRepulsion.enabled = false; + this.constants.physics.barnesHut.enabled = false; + } + else if (radioButton == "H") { + if (this.constants.hierarchicalLayout.enabled == false) { + this.constants.hierarchicalLayout.enabled = true; + this.constants.physics.hierarchicalRepulsion.enabled = true; + this.constants.physics.barnesHut.enabled = false; + this.constants.smoothCurves.enabled = false; + this._setupHierarchicalLayout(); + } + } + else { + this.constants.hierarchicalLayout.enabled = false; + this.constants.physics.hierarchicalRepulsion.enabled = false; + this.constants.physics.barnesHut.enabled = true; + } + this._loadSelectedForceSolver(); + var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); + if (this.constants.smoothCurves.enabled == true) {graph_toggleSmooth.style.background = "#A4FF56";} + else {graph_toggleSmooth.style.background = "#FF8532";} + this.moving = true; + this.start(); + } - // the edges can be swallowed by another decrease - if (childNode.dynamicEdgesLength == 1 && childNode.dynamicEdges.length != 0) { - var edge = childNode.dynamicEdges[0]; - var parentNode = (edge.toId == childNode.id) ? this.nodes[edge.fromId] : this.nodes[edge.toId]; - // group to the largest node - if (childNode.id != parentNode.id) { - if (parentNode.options.mass > childNode.options.mass) { - this._addToCluster(parentNode,childNode,true); - } - else { - this._addToCluster(childNode,parentNode,true); - } - } - } - } + /** + * this generates the ranges depending on the iniital values. + * + * @param id + * @param map + * @param constantsVariableName + */ + function showValueOfRange (id,map,constantsVariableName) { + var valueId = id + "_value"; + var rangeValue = document.getElementById(id).value; + + if (map instanceof Array) { + document.getElementById(valueId).value = map[parseInt(rangeValue)]; + this._overWriteGraphConstants(constantsVariableName,map[parseInt(rangeValue)]); + } + else { + document.getElementById(valueId).value = parseInt(map) * parseFloat(rangeValue); + this._overWriteGraphConstants(constantsVariableName, parseInt(map) * parseFloat(rangeValue)); } - }; + if (constantsVariableName == "hierarchicalLayout_direction" || + constantsVariableName == "hierarchicalLayout_levelSeparation" || + constantsVariableName == "hierarchicalLayout_nodeSpacing") { + this._setupHierarchicalLayout(); + } + this.moving = true; + this.start(); + } + + +/***/ }, +/* 54 */ +/***/ function(module, exports, __webpack_require__) { /** - * To keep the nodes of roughly equal size we normalize the cluster levels. - * This function clusters a node to its smallest connected neighbour. + * Calculate the forces the nodes apply on each other based on a repulsion field. + * This field is linearly approximated. * - * @param node * @private */ - exports._clusterToSmallestNeighbour = function(node) { - var smallestNeighbour = -1; - var smallestNeighbourNode = null; - for (var i = 0; i < node.dynamicEdges.length; i++) { - if (node.dynamicEdges[i] !== undefined) { - var neighbour = null; - if (node.dynamicEdges[i].fromId != node.id) { - neighbour = node.dynamicEdges[i].from; - } - else if (node.dynamicEdges[i].toId != node.id) { - neighbour = node.dynamicEdges[i].to; - } + exports._calculateNodeForces = function () { + var dx, dy, angle, distance, fx, fy, combinedClusterSize, + repulsingForce, node1, node2, i, j; + var nodes = this.calculationNodes; + var nodeIndices = this.calculationNodeIndices; - if (neighbour != null && smallestNeighbour > neighbour.clusterSessions.length) { - smallestNeighbour = neighbour.clusterSessions.length; - smallestNeighbourNode = neighbour; - } - } - } + // approximation constants + var a_base = -2 / 3; + var b = 4 / 3; - if (neighbour != null && this.nodes[neighbour.id] !== undefined) { - this._addToCluster(neighbour, node, true); - } - }; + // repulsing forces between nodes + var nodeDistance = this.constants.physics.repulsion.nodeDistance; + var minimumDistance = nodeDistance; + // we loop from i over all but the last entree in the array + // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j + for (i = 0; i < nodeIndices.length - 1; i++) { + node1 = nodes[nodeIndices[i]]; + for (j = i + 1; j < nodeIndices.length; j++) { + node2 = nodes[nodeIndices[j]]; + combinedClusterSize = node1.clusterSize + node2.clusterSize - 2; - /** - * This function forms clusters from hubs, it loops over all nodes - * - * @param {Boolean} force | Disregard zoom level - * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges - * @private - */ - exports._formClustersByHub = function(force, onlyEqual) { - // we loop over all nodes in the list - for (var nodeId in this.nodes) { - // we check if it is still available since it can be used by the clustering in this loop - if (this.nodes.hasOwnProperty(nodeId)) { - this._formClusterFromHub(this.nodes[nodeId],force,onlyEqual); + dx = node2.x - node1.x; + dy = node2.y - node1.y; + distance = Math.sqrt(dx * dx + dy * dy); + + minimumDistance = (combinedClusterSize == 0) ? nodeDistance : (nodeDistance * (1 + combinedClusterSize * this.constants.clustering.distanceAmplification)); + var a = a_base / minimumDistance; + if (distance < 2 * minimumDistance) { + if (distance < 0.5 * minimumDistance) { + repulsingForce = 1.0; + } + else { + repulsingForce = a * distance + b; // linear approx of 1 / (1 + Math.exp((distance / minimumDistance - 1) * steepness)) + } + + // amplify the repulsion for clusters. + repulsingForce *= (combinedClusterSize == 0) ? 1 : 1 + combinedClusterSize * this.constants.clustering.forceAmplification; + repulsingForce = repulsingForce / distance; + + fx = dx * repulsingForce; + fy = dy * repulsingForce; + + node1.fx -= fx; + node1.fy -= fy; + node2.fx += fx; + node2.fy += fy; + } } } }; + +/***/ }, +/* 55 */ +/***/ function(module, exports, __webpack_require__) { + /** - * This function forms a cluster from a specific preselected hub node + * Calculate the forces the nodes apply on eachother based on a repulsion field. + * This field is linearly approximated. * - * @param {Node} hubNode | the node we will cluster as a hub - * @param {Boolean} force | Disregard zoom level - * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges - * @param {Number} [absorptionSizeOffset] | * @private */ - exports._formClusterFromHub = function(hubNode, force, onlyEqual, absorptionSizeOffset) { - if (absorptionSizeOffset === undefined) { - absorptionSizeOffset = 0; - } - // we decide if the node is a hub - if ((hubNode.dynamicEdgesLength >= this.hubThreshold && onlyEqual == false) || - (hubNode.dynamicEdgesLength == this.hubThreshold && onlyEqual == true)) { - // initialize variables - var dx,dy,length; - var minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; - var allowCluster = false; + exports._calculateNodeForces = function () { + var dx, dy, distance, fx, fy, + repulsingForce, node1, node2, i, j; - // we create a list of edges because the dynamicEdges change over the course of this loop - var edgesIdarray = []; - var amountOfInitialEdges = hubNode.dynamicEdges.length; - for (var j = 0; j < amountOfInitialEdges; j++) { - edgesIdarray.push(hubNode.dynamicEdges[j].id); - } + var nodes = this.calculationNodes; + var nodeIndices = this.calculationNodeIndices; - // if the hub clustering is not forces, we check if one of the edges connected - // to a cluster is small enough based on the constants.clustering.clusterEdgeThreshold - if (force == false) { - allowCluster = false; - for (j = 0; j < amountOfInitialEdges; j++) { - var edge = this.edges[edgesIdarray[j]]; - if (edge !== undefined) { - if (edge.connected) { - if (edge.toId != edge.fromId) { - dx = (edge.to.x - edge.from.x); - dy = (edge.to.y - edge.from.y); - length = Math.sqrt(dx * dx + dy * dy); + // repulsing forces between nodes + var nodeDistance = this.constants.physics.hierarchicalRepulsion.nodeDistance; - if (length < minLength) { - allowCluster = true; - break; - } - } - } - } - } - } + // we loop from i over all but the last entree in the array + // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j + for (i = 0; i < nodeIndices.length - 1; i++) { + node1 = nodes[nodeIndices[i]]; + for (j = i + 1; j < nodeIndices.length; j++) { + node2 = nodes[nodeIndices[j]]; - // start the clustering if allowed - if ((!force && allowCluster) || force) { - // we loop over all edges INITIALLY connected to this hub - for (j = 0; j < amountOfInitialEdges; j++) { - edge = this.edges[edgesIdarray[j]]; - // the edge can be clustered by this function in a previous loop - if (edge !== undefined) { - var childNode = this.nodes[(edge.fromId == hubNode.id) ? edge.toId : edge.fromId]; - // we do not want hubs to merge with other hubs nor do we want to cluster itself. - if ((childNode.dynamicEdges.length <= (this.hubThreshold + absorptionSizeOffset)) && - (childNode.id != hubNode.id)) { - this._addToCluster(hubNode,childNode,force); - } + // nodes only affect nodes on their level + if (node1.level == node2.level) { + + dx = node2.x - node1.x; + dy = node2.y - node1.y; + distance = Math.sqrt(dx * dx + dy * dy); + + + var steepness = 0.05; + if (distance < nodeDistance) { + repulsingForce = -Math.pow(steepness*distance,2) + Math.pow(steepness*nodeDistance,2); + } + else { + repulsingForce = 0; } + // normalize force with + if (distance == 0) { + distance = 0.01; + } + else { + repulsingForce = repulsingForce / distance; + } + fx = dx * repulsingForce; + fy = dy * repulsingForce; + + node1.fx -= fx; + node1.fy -= fy; + node2.fx += fx; + node2.fy += fy; } } } }; - /** - * This function adds the child node to the parent node, creating a cluster if it is not already. + * this function calculates the effects of the springs in the case of unsmooth curves. * - * @param {Node} parentNode | this is the node that will house the child node - * @param {Node} childNode | this node will be deleted from the global this.nodes and stored in the parent node - * @param {Boolean} force | true will only update the remainingEdges at the very end of the clustering, ensuring single level collapse * @private */ - exports._addToCluster = function(parentNode, childNode, force) { - // join child node in the parent node - parentNode.containedNodes[childNode.id] = childNode; + exports._calculateHierarchicalSpringForces = function () { + var edgeLength, edge, edgeId; + var dx, dy, fx, fy, springForce, distance; + var edges = this.edges; - // manage all the edges connected to the child and parent nodes - for (var i = 0; i < childNode.dynamicEdges.length; i++) { - var edge = childNode.dynamicEdges[i]; - if (edge.toId == parentNode.id || edge.fromId == parentNode.id) { // edge connected to parentNode - this._addToContainedEdges(parentNode,childNode,edge); - } - else { - this._connectEdgeToCluster(parentNode,childNode,edge); - } + var nodes = this.calculationNodes; + var nodeIndices = this.calculationNodeIndices; + + + for (var i = 0; i < nodeIndices.length; i++) { + var node1 = nodes[nodeIndices[i]]; + node1.springFx = 0; + node1.springFy = 0; } - // a contained node has no dynamic edges. - childNode.dynamicEdges = []; - // remove circular edges from clusters - this._containCircularEdgesFromNode(parentNode,childNode); + // forces caused by the edges, modelled as springs + for (edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + edge = edges[edgeId]; + if (edge.connected) { + // only calculate forces if nodes are in the same sector + if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { + edgeLength = edge.physics.springLength; + // this implies that the edges between big clusters are longer + edgeLength += (edge.to.clusterSize + edge.from.clusterSize - 2) * this.constants.clustering.edgeGrowth; + + dx = (edge.from.x - edge.to.x); + dy = (edge.from.y - edge.to.y); + distance = Math.sqrt(dx * dx + dy * dy); + + if (distance == 0) { + distance = 0.01; + } + + // the 1/distance is so the fx and fy can be calculated without sine or cosine. + springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; - // remove the childNode from the global nodes object - delete this.nodes[childNode.id]; + fx = dx * springForce; + fy = dy * springForce; - // update the properties of the child and parent - var massBefore = parentNode.options.mass; - childNode.clusterSession = this.clusterSession; - parentNode.options.mass += childNode.options.mass; - parentNode.clusterSize += childNode.clusterSize; - parentNode.options.fontSize = Math.min(this.constants.clustering.maxFontSize, this.constants.nodes.fontSize + this.constants.clustering.fontSizeMultiplier*parentNode.clusterSize); - // keep track of the clustersessions so we can open the cluster up as it has been formed. - if (parentNode.clusterSessions[parentNode.clusterSessions.length - 1] != this.clusterSession) { - parentNode.clusterSessions.push(this.clusterSession); - } - // forced clusters only open from screen size and double tap - if (force == true) { - // parentNode.formationScale = Math.pow(1 - (1.0/11.0),this.clusterSession+3); - parentNode.formationScale = 0; - } - else { - parentNode.formationScale = this.scale; // The latest child has been added on this scale + if (edge.to.level != edge.from.level) { + edge.to.springFx -= fx; + edge.to.springFy -= fy; + edge.from.springFx += fx; + edge.from.springFy += fy; + } + else { + var factor = 0.5; + edge.to.fx -= factor*fx; + edge.to.fy -= factor*fy; + edge.from.fx += factor*fx; + edge.from.fy += factor*fy; + } + } + } + } } - // recalculate the size of the node on the next time the node is rendered - parentNode.clearSizeCache(); + // normalize spring forces + var springForce = 1; + var springFx, springFy; + for (i = 0; i < nodeIndices.length; i++) { + var node = nodes[nodeIndices[i]]; + springFx = Math.min(springForce,Math.max(-springForce,node.springFx)); + springFy = Math.min(springForce,Math.max(-springForce,node.springFy)); - // set the pop-out scale for the childnode - parentNode.containedNodes[childNode.id].formationScale = parentNode.formationScale; + node.fx += springFx; + node.fy += springFy; + } - // nullify the movement velocity of the child, this is to avoid hectic behaviour - childNode.clearVelocity(); + // retain energy balance + var totalFx = 0; + var totalFy = 0; + for (i = 0; i < nodeIndices.length; i++) { + var node = nodes[nodeIndices[i]]; + totalFx += node.fx; + totalFy += node.fy; + } + var correctionFx = totalFx / nodeIndices.length; + var correctionFy = totalFy / nodeIndices.length; - // the mass has altered, preservation of energy dictates the velocity to be updated - parentNode.updateVelocity(massBefore); + for (i = 0; i < nodeIndices.length; i++) { + var node = nodes[nodeIndices[i]]; + node.fx -= correctionFx; + node.fy -= correctionFy; + } - // restart the simulation to reorganise all nodes - this.moving = true; }; +/***/ }, +/* 56 */ +/***/ function(module, exports, __webpack_require__) { /** - * This function will apply the changes made to the remainingEdges during the formation of the clusters. - * This is a seperate function to allow for level-wise collapsing of the node barnesHutTree. - * It has to be called if a level is collapsed. It is called by _formClusters(). + * This function calculates the forces the nodes apply on eachother based on a gravitational model. + * The Barnes Hut method is used to speed up this N-body simulation. + * * @private */ - exports._updateDynamicEdges = function() { - for (var i = 0; i < this.nodeIndices.length; i++) { - var node = this.nodes[this.nodeIndices[i]]; - node.dynamicEdgesLength = node.dynamicEdges.length; + exports._calculateNodeForces = function() { + if (this.constants.physics.barnesHut.gravitationalConstant != 0) { + var node; + var nodes = this.calculationNodes; + var nodeIndices = this.calculationNodeIndices; + var nodeCount = nodeIndices.length; - // this corrects for multiple edges pointing at the same other node - var correction = 0; - if (node.dynamicEdgesLength > 1) { - for (var j = 0; j < node.dynamicEdgesLength - 1; j++) { - var edgeToId = node.dynamicEdges[j].toId; - var edgeFromId = node.dynamicEdges[j].fromId; - for (var k = j+1; k < node.dynamicEdgesLength; k++) { - if ((node.dynamicEdges[k].toId == edgeToId && node.dynamicEdges[k].fromId == edgeFromId) || - (node.dynamicEdges[k].fromId == edgeToId && node.dynamicEdges[k].toId == edgeFromId)) { - correction += 1; - } - } + this._formBarnesHutTree(nodes,nodeIndices); + + var barnesHutTree = this.barnesHutTree; + + // place the nodes one by one recursively + for (var i = 0; i < nodeCount; i++) { + node = nodes[nodeIndices[i]]; + if (node.options.mass > 0) { + // starting with root is irrelevant, it never passes the BarnesHut condition + this._getForceContribution(barnesHutTree.root.children.NW,node); + this._getForceContribution(barnesHutTree.root.children.NE,node); + this._getForceContribution(barnesHutTree.root.children.SW,node); + this._getForceContribution(barnesHutTree.root.children.SE,node); } } - node.dynamicEdgesLength -= correction; } }; /** - * This adds an edge from the childNode to the contained edges of the parent node + * This function traverses the barnesHutTree. It checks when it can approximate distant nodes with their center of mass. + * If a region contains a single node, we check if it is not itself, then we apply the force. * - * @param parentNode | Node object - * @param childNode | Node object - * @param edge | Edge object + * @param parentBranch + * @param node * @private */ - exports._addToContainedEdges = function(parentNode, childNode, edge) { - // create an array object if it does not yet exist for this childNode - if (!(parentNode.containedEdges.hasOwnProperty(childNode.id))) { - parentNode.containedEdges[childNode.id] = [] - } - // add this edge to the list - parentNode.containedEdges[childNode.id].push(edge); + exports._getForceContribution = function(parentBranch,node) { + // we get no force contribution from an empty region + if (parentBranch.childrenCount > 0) { + var dx,dy,distance; - // remove the edge from the global edges object - delete this.edges[edge.id]; + // get the distance from the center of mass to the node. + dx = parentBranch.centerOfMass.x - node.x; + dy = parentBranch.centerOfMass.y - node.y; + distance = Math.sqrt(dx * dx + dy * dy); - // remove the edge from the parent object - for (var i = 0; i < parentNode.dynamicEdges.length; i++) { - if (parentNode.dynamicEdges[i].id == edge.id) { - parentNode.dynamicEdges.splice(i,1); - break; + // BarnesHut condition + // original condition : s/d < theta = passed === d/s > 1/theta = passed + // calcSize = 1/s --> d * 1/s > 1/theta = passed + if (distance * parentBranch.calcSize > this.constants.physics.barnesHut.theta) { + // duplicate code to reduce function calls to speed up program + if (distance == 0) { + distance = 0.1*Math.random(); + dx = distance; + } + var gravityForce = this.constants.physics.barnesHut.gravitationalConstant * parentBranch.mass * node.options.mass / (distance * distance * distance); + var fx = dx * gravityForce; + var fy = dy * gravityForce; + node.fx += fx; + node.fy += fy; + } + else { + // Did not pass the condition, go into children if available + if (parentBranch.childrenCount == 4) { + this._getForceContribution(parentBranch.children.NW,node); + this._getForceContribution(parentBranch.children.NE,node); + this._getForceContribution(parentBranch.children.SW,node); + this._getForceContribution(parentBranch.children.SE,node); + } + else { // parentBranch must have only one node, if it was empty we wouldnt be here + if (parentBranch.children.data.id != node.id) { // if it is not self + // duplicate code to reduce function calls to speed up program + if (distance == 0) { + distance = 0.5*Math.random(); + dx = distance; + } + var gravityForce = this.constants.physics.barnesHut.gravitationalConstant * parentBranch.mass * node.options.mass / (distance * distance * distance); + var fx = dx * gravityForce; + var fy = dy * gravityForce; + node.fx += fx; + node.fy += fy; + } + } } } }; /** - * This function connects an edge that was connected to a child node to the parent node. - * It keeps track of which nodes it has been connected to with the originalId array. + * This function constructs the barnesHut tree recursively. It creates the root, splits it and starts placing the nodes. * - * @param {Node} parentNode | Node object - * @param {Node} childNode | Node object - * @param {Edge} edge | Edge object + * @param nodes + * @param nodeIndices * @private */ - exports._connectEdgeToCluster = function(parentNode, childNode, edge) { - // handle circular edges - if (edge.toId == edge.fromId) { - this._addToContainedEdges(parentNode, childNode, edge); + exports._formBarnesHutTree = function(nodes,nodeIndices) { + var node; + var nodeCount = nodeIndices.length; + + var minX = Number.MAX_VALUE, + minY = Number.MAX_VALUE, + maxX =-Number.MAX_VALUE, + maxY =-Number.MAX_VALUE; + + // get the range of the nodes + for (var i = 0; i < nodeCount; i++) { + var x = nodes[nodeIndices[i]].x; + var y = nodes[nodeIndices[i]].y; + if (nodes[nodeIndices[i]].options.mass > 0) { + if (x < minX) { minX = x; } + if (x > maxX) { maxX = x; } + if (y < minY) { minY = y; } + if (y > maxY) { maxY = y; } + } } - else { - if (edge.toId == childNode.id) { // edge connected to other node on the "to" side - edge.originalToId.push(childNode.id); - edge.to = parentNode; - edge.toId = parentNode.id; + // make the range a square + var sizeDiff = Math.abs(maxX - minX) - Math.abs(maxY - minY); // difference between X and Y + if (sizeDiff > 0) {minY -= 0.5 * sizeDiff; maxY += 0.5 * sizeDiff;} // xSize > ySize + else {minX += 0.5 * sizeDiff; maxX -= 0.5 * sizeDiff;} // xSize < ySize + + + var minimumTreeSize = 1e-5; + var rootSize = Math.max(minimumTreeSize,Math.abs(maxX - minX)); + var halfRootSize = 0.5 * rootSize; + var centerX = 0.5 * (minX + maxX), centerY = 0.5 * (minY + maxY); + + // construct the barnesHutTree + var barnesHutTree = { + root:{ + centerOfMass: {x:0, y:0}, + mass:0, + range: { + minX: centerX-halfRootSize,maxX:centerX+halfRootSize, + minY: centerY-halfRootSize,maxY:centerY+halfRootSize + }, + size: rootSize, + calcSize: 1 / rootSize, + children: { data:null}, + maxWidth: 0, + level: 0, + childrenCount: 4 } - else { // edge connected to other node with the "from" side + }; + this._splitBranch(barnesHutTree.root); - edge.originalFromId.push(childNode.id); - edge.from = parentNode; - edge.fromId = parentNode.id; + // place the nodes one by one recursively + for (i = 0; i < nodeCount; i++) { + node = nodes[nodeIndices[i]]; + if (node.options.mass > 0) { + this._placeInTree(barnesHutTree.root,node); } - - this._addToReroutedEdges(parentNode,childNode,edge); } + + // make global + this.barnesHutTree = barnesHutTree }; /** - * If a node is connected to itself, a circular edge is drawn. When clustering we want to contain - * these edges inside of the cluster. + * this updates the mass of a branch. this is increased by adding a node. * - * @param parentNode - * @param childNode + * @param parentBranch + * @param node * @private */ - exports._containCircularEdgesFromNode = function(parentNode, childNode) { - // manage all the edges connected to the child and parent nodes - for (var i = 0; i < parentNode.dynamicEdges.length; i++) { - var edge = parentNode.dynamicEdges[i]; - // handle circular edges - if (edge.toId == edge.fromId) { - this._addToContainedEdges(parentNode, childNode, edge); - } - } - }; + exports._updateBranchMass = function(parentBranch, node) { + var totalMass = parentBranch.mass + node.options.mass; + var totalMassInv = 1/totalMass; + parentBranch.centerOfMass.x = parentBranch.centerOfMass.x * parentBranch.mass + node.x * node.options.mass; + parentBranch.centerOfMass.x *= totalMassInv; - /** - * This adds an edge from the childNode to the rerouted edges of the parent node - * - * @param parentNode | Node object - * @param childNode | Node object - * @param edge | Edge object - * @private - */ - exports._addToReroutedEdges = function(parentNode, childNode, edge) { - // create an array object if it does not yet exist for this childNode - // we store the edge in the rerouted edges so we can restore it when the cluster pops open - if (!(parentNode.reroutedEdges.hasOwnProperty(childNode.id))) { - parentNode.reroutedEdges[childNode.id] = []; - } - parentNode.reroutedEdges[childNode.id].push(edge); + parentBranch.centerOfMass.y = parentBranch.centerOfMass.y * parentBranch.mass + node.y * node.options.mass; + parentBranch.centerOfMass.y *= totalMassInv; - // this edge becomes part of the dynamicEdges of the cluster node - parentNode.dynamicEdges.push(edge); - }; + parentBranch.mass = totalMass; + var biggestSize = Math.max(Math.max(node.height,node.radius),node.width); + parentBranch.maxWidth = (parentBranch.maxWidth < biggestSize) ? biggestSize : parentBranch.maxWidth; + }; /** - * This function connects an edge that was connected to a cluster node back to the child node. + * determine in which branch the node will be placed. * - * @param parentNode | Node object - * @param childNode | Node object + * @param parentBranch + * @param node + * @param skipMassUpdate * @private */ - exports._connectEdgeBackToChild = function(parentNode, childNode) { - if (parentNode.reroutedEdges.hasOwnProperty(childNode.id)) { - for (var i = 0; i < parentNode.reroutedEdges[childNode.id].length; i++) { - var edge = parentNode.reroutedEdges[childNode.id][i]; - if (edge.originalFromId[edge.originalFromId.length-1] == childNode.id) { - edge.originalFromId.pop(); - edge.fromId = childNode.id; - edge.from = childNode; - } - else { - edge.originalToId.pop(); - edge.toId = childNode.id; - edge.to = childNode; - } - - // append this edge to the list of edges connecting to the childnode - childNode.dynamicEdges.push(edge); + exports._placeInTree = function(parentBranch,node,skipMassUpdate) { + if (skipMassUpdate != true || skipMassUpdate === undefined) { + // update the mass of the branch. + this._updateBranchMass(parentBranch,node); + } - // remove the edge from the parent object - for (var j = 0; j < parentNode.dynamicEdges.length; j++) { - if (parentNode.dynamicEdges[j].id == edge.id) { - parentNode.dynamicEdges.splice(j,1); - break; - } - } + if (parentBranch.children.NW.range.maxX > node.x) { // in NW or SW + if (parentBranch.children.NW.range.maxY > node.y) { // in NW + this._placeInRegion(parentBranch,node,"NW"); + } + else { // in SW + this._placeInRegion(parentBranch,node,"SW"); + } + } + else { // in NE or SE + if (parentBranch.children.NW.range.maxY > node.y) { // in NE + this._placeInRegion(parentBranch,node,"NE"); + } + else { // in SE + this._placeInRegion(parentBranch,node,"SE"); } - // remove the entry from the rerouted edges - delete parentNode.reroutedEdges[childNode.id]; } }; /** - * When loops are clustered, an edge can be both in the rerouted array and the contained array. - * This function is called last to verify that all edges in dynamicEdges are in fact connected to the - * parentNode + * actually place the node in a region (or branch) * - * @param parentNode | Node object + * @param parentBranch + * @param node + * @param region * @private */ - exports._validateEdges = function(parentNode) { - for (var i = 0; i < parentNode.dynamicEdges.length; i++) { - var edge = parentNode.dynamicEdges[i]; - if (parentNode.id != edge.toId && parentNode.id != edge.fromId) { - parentNode.dynamicEdges.splice(i,1); - } + exports._placeInRegion = function(parentBranch,node,region) { + switch (parentBranch.children[region].childrenCount) { + case 0: // place node here + parentBranch.children[region].children.data = node; + parentBranch.children[region].childrenCount = 1; + this._updateBranchMass(parentBranch.children[region],node); + break; + case 1: // convert into children + // if there are two nodes exactly overlapping (on init, on opening of cluster etc.) + // we move one node a pixel and we do not put it in the tree. + if (parentBranch.children[region].children.data.x == node.x && + parentBranch.children[region].children.data.y == node.y) { + node.x += Math.random(); + node.y += Math.random(); + } + else { + this._splitBranch(parentBranch.children[region]); + this._placeInTree(parentBranch.children[region],node); + } + break; + case 4: // place in branch + this._placeInTree(parentBranch.children[region],node); + break; } }; /** - * This function released the contained edges back into the global domain and puts them back into the - * dynamic edges of both parent and child. + * this function splits a branch into 4 sub branches. If the branch contained a node, we place it in the subbranch + * after the split is complete. * - * @param {Node} parentNode | - * @param {Node} childNode | + * @param parentBranch * @private */ - exports._releaseContainedEdges = function(parentNode, childNode) { - for (var i = 0; i < parentNode.containedEdges[childNode.id].length; i++) { - var edge = parentNode.containedEdges[childNode.id][i]; - - // put the edge back in the global edges object - this.edges[edge.id] = edge; - - // put the edge back in the dynamic edges of the child and parent - childNode.dynamicEdges.push(edge); - parentNode.dynamicEdges.push(edge); + exports._splitBranch = function(parentBranch) { + // if the branch is shaded with a node, replace the node in the new subset. + var containedNode = null; + if (parentBranch.childrenCount == 1) { + containedNode = parentBranch.children.data; + parentBranch.mass = 0; parentBranch.centerOfMass.x = 0; parentBranch.centerOfMass.y = 0; } - // remove the entry from the contained edges - delete parentNode.containedEdges[childNode.id]; + parentBranch.childrenCount = 4; + parentBranch.children.data = null; + this._insertRegion(parentBranch,"NW"); + this._insertRegion(parentBranch,"NE"); + this._insertRegion(parentBranch,"SW"); + this._insertRegion(parentBranch,"SE"); + if (containedNode != null) { + this._placeInTree(parentBranch,containedNode); + } }; - - - // ------------------- UTILITY FUNCTIONS ---------------------------- // - - /** - * This updates the node labels for all nodes (for debugging purposes) + * This function subdivides the region into four new segments. + * Specifically, this inserts a single new segment. + * It fills the children section of the parentBranch + * + * @param parentBranch + * @param region + * @param parentRange + * @private */ - exports.updateLabels = function() { - var nodeId; - // update node labels - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - var node = this.nodes[nodeId]; - if (node.clusterSize > 1) { - node.label = "[".concat(String(node.clusterSize),"]"); - } - } - } - - // update node labels - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (node.clusterSize == 1) { - if (node.originalLabel !== undefined) { - node.label = node.originalLabel; - } - else { - node.label = String(node.id); - } - } - } + exports._insertRegion = function(parentBranch, region) { + var minX,maxX,minY,maxY; + var childSize = 0.5 * parentBranch.size; + switch (region) { + case "NW": + minX = parentBranch.range.minX; + maxX = parentBranch.range.minX + childSize; + minY = parentBranch.range.minY; + maxY = parentBranch.range.minY + childSize; + break; + case "NE": + minX = parentBranch.range.minX + childSize; + maxX = parentBranch.range.maxX; + minY = parentBranch.range.minY; + maxY = parentBranch.range.minY + childSize; + break; + case "SW": + minX = parentBranch.range.minX; + maxX = parentBranch.range.minX + childSize; + minY = parentBranch.range.minY + childSize; + maxY = parentBranch.range.maxY; + break; + case "SE": + minX = parentBranch.range.minX + childSize; + maxX = parentBranch.range.maxX; + minY = parentBranch.range.minY + childSize; + maxY = parentBranch.range.maxY; + break; } - // /* Debug Override */ - // for (nodeId in this.nodes) { - // if (this.nodes.hasOwnProperty(nodeId)) { - // node = this.nodes[nodeId]; - // node.label = String(node.level); - // } - // } + parentBranch.children[region] = { + centerOfMass:{x:0,y:0}, + mass:0, + range:{minX:minX,maxX:maxX,minY:minY,maxY:maxY}, + size: 0.5 * parentBranch.size, + calcSize: 2 * parentBranch.calcSize, + children: {data:null}, + maxWidth: 0, + level: parentBranch.level+1, + childrenCount: 0 + }; }; /** - * We want to keep the cluster level distribution rather small. This means we do not want unclustered nodes - * if the rest of the nodes are already a few cluster levels in. - * To fix this we use this function. It determines the min and max cluster level and sends nodes that have not - * clustered enough to the clusterToSmallestNeighbours function. + * This function is for debugging purposed, it draws the tree. + * + * @param ctx + * @param color + * @private */ - exports.normalizeClusterLevels = function() { - var maxLevel = 0; - var minLevel = 1e9; - var clusterLevel = 0; - var nodeId; + exports._drawTree = function(ctx,color) { + if (this.barnesHutTree !== undefined) { - // we loop over all nodes in the list - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - clusterLevel = this.nodes[nodeId].clusterSessions.length; - if (maxLevel < clusterLevel) {maxLevel = clusterLevel;} - if (minLevel > clusterLevel) {minLevel = clusterLevel;} - } - } + ctx.lineWidth = 1; - if (maxLevel - minLevel > this.constants.clustering.clusterLevelDifference) { - var amountOfNodes = this.nodeIndices.length; - var targetLevel = maxLevel - this.constants.clustering.clusterLevelDifference; - // we loop over all nodes in the list - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - if (this.nodes[nodeId].clusterSessions.length < targetLevel) { - this._clusterToSmallestNeighbour(this.nodes[nodeId]); - } - } - } - this._updateNodeIndexList(); - this._updateDynamicEdges(); - // if a cluster was formed, we increase the clusterSession - if (this.nodeIndices.length != amountOfNodes) { - this.clusterSession += 1; - } + this._drawBranch(this.barnesHutTree.root,ctx,color); } }; - /** - * This function determines if the cluster we want to decluster is in the active area - * this means around the zoom center + * This function is for debugging purposes. It draws the branches recursively. * - * @param {Node} node - * @returns {boolean} + * @param branch + * @param ctx + * @param color * @private */ - exports._nodeInActiveArea = function(node) { - return ( - Math.abs(node.x - this.areaCenter.x) <= this.constants.clustering.activeAreaBoxSize/this.scale - && - Math.abs(node.y - this.areaCenter.y) <= this.constants.clustering.activeAreaBoxSize/this.scale - ) + exports._drawBranch = function(branch,ctx,color) { + if (color === undefined) { + color = "#FF0000"; + } + + if (branch.childrenCount == 4) { + this._drawBranch(branch.children.NW,ctx); + this._drawBranch(branch.children.NE,ctx); + this._drawBranch(branch.children.SE,ctx); + this._drawBranch(branch.children.SW,ctx); + } + ctx.strokeStyle = color; + ctx.beginPath(); + ctx.moveTo(branch.range.minX,branch.range.minY); + ctx.lineTo(branch.range.maxX,branch.range.minY); + ctx.stroke(); + + ctx.beginPath(); + ctx.moveTo(branch.range.maxX,branch.range.minY); + ctx.lineTo(branch.range.maxX,branch.range.maxY); + ctx.stroke(); + + ctx.beginPath(); + ctx.moveTo(branch.range.maxX,branch.range.maxY); + ctx.lineTo(branch.range.minX,branch.range.maxY); + ctx.stroke(); + + ctx.beginPath(); + ctx.moveTo(branch.range.minX,branch.range.maxY); + ctx.lineTo(branch.range.minX,branch.range.minY); + ctx.stroke(); + + /* + if (branch.mass > 0) { + ctx.circle(branch.centerOfMass.x, branch.centerOfMass.y, 3*branch.mass); + ctx.stroke(); + } + */ }; +/***/ }, +/* 57 */ +/***/ function(module, exports, __webpack_require__) { + /** - * This is an adaptation of the original repositioning function. This is called if the system is clustered initially - * It puts large clusters away from the center and randomizes the order. + * Creation of the ClusterMixin var. * + * This contains all the functions the Network object can use to employ clustering */ - exports.repositionNodes = function() { - for (var i = 0; i < this.nodeIndices.length; i++) { - var node = this.nodes[this.nodeIndices[i]]; - if ((node.xFixed == false || node.yFixed == false)) { - var radius = 10 * 0.1*this.nodeIndices.length * Math.min(100,node.options.mass); - var angle = 2 * Math.PI * Math.random(); - if (node.xFixed == false) {node.x = radius * Math.cos(angle);} - if (node.yFixed == false) {node.y = radius * Math.sin(angle);} - this._repositionBezierNodes(node); - } - } - }; + /** + * This is only called in the constructor of the network object + * + */ + exports.startWithClustering = function() { + // cluster if the data set is big + this.clusterToFit(this.constants.clustering.initialMaxNodes, true); + + // updates the lables after clustering + this.updateLabels(); + + // this is called here because if clusterin is disabled, the start and stabilize are called in + // the setData function. + if (this.stabilize) { + this._stabilize(); + } + this.start(); + }; /** - * We determine how many connections denote an important hub. - * We take the mean + 2*std as the important hub size. (Assuming a normal distribution of data, ~2.2%) + * This function clusters until the initialMaxNodes has been reached * - * @private + * @param {Number} maxNumberOfNodes + * @param {Boolean} reposition */ - exports._getHubSize = function() { - var average = 0; - var averageSquared = 0; - var hubCounter = 0; - var largestHub = 0; + exports.clusterToFit = function(maxNumberOfNodes, reposition) { + var numberOfNodes = this.nodeIndices.length; - for (var i = 0; i < this.nodeIndices.length; i++) { + var maxLevels = 50; + var level = 0; - var node = this.nodes[this.nodeIndices[i]]; - if (node.dynamicEdgesLength > largestHub) { - largestHub = node.dynamicEdgesLength; + // we first cluster the hubs, then we pull in the outliers, repeat + while (numberOfNodes > maxNumberOfNodes && level < maxLevels) { + if (level % 3 == 0) { + this.forceAggregateHubs(true); + this.normalizeClusterLevels(); + } + else { + this.increaseClusterLevel(); // this also includes a cluster normalization } - average += node.dynamicEdgesLength; - averageSquared += Math.pow(node.dynamicEdgesLength,2); - hubCounter += 1; - } - average = average / hubCounter; - averageSquared = averageSquared / hubCounter; - - var variance = averageSquared - Math.pow(average,2); - - var standardDeviation = Math.sqrt(variance); - - this.hubThreshold = Math.floor(average + 2*standardDeviation); - // always have at least one to cluster - if (this.hubThreshold > largestHub) { - this.hubThreshold = largestHub; + numberOfNodes = this.nodeIndices.length; + level += 1; } - // console.log("average",average,"averageSQ",averageSquared,"var",variance,"std",standardDeviation); - // console.log("hubThreshold:",this.hubThreshold); + // after the clustering we reposition the nodes to reduce the initial chaos + if (level > 0 && reposition == true) { + this.repositionNodes(); + } + this._updateCalculationNodes(); }; - /** - * We reduce the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods - * with this amount we can cluster specifically on these chains. + * This function can be called to open up a specific cluster. It is only called by + * It will unpack the cluster back one level. * - * @param {Number} fraction | between 0 and 1, the percentage of chains to reduce - * @private + * @param node | Node object: cluster to open. */ - exports._reduceAmountOfChains = function(fraction) { - this.hubThreshold = 2; - var reduceAmount = Math.floor(this.nodeIndices.length * fraction); - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - if (this.nodes[nodeId].dynamicEdgesLength == 2 && this.nodes[nodeId].dynamicEdges.length >= 2) { - if (reduceAmount > 0) { - this._formClusterFromHub(this.nodes[nodeId],true,true,1); - reduceAmount -= 1; - } - } + exports.openCluster = function(node) { + var isMovingBeforeClustering = this.moving; + if (node.clusterSize > this.constants.clustering.sectorThreshold && this._nodeInActiveArea(node) && + !(this._sector() == "default" && this.nodeIndices.length == 1)) { + // this loads a new sector, loads the nodes and edges and nodeIndices of it. + this._addSector(node); + var level = 0; + + // we decluster until we reach a decent number of nodes + while ((this.nodeIndices.length < this.constants.clustering.initialMaxNodes) && (level < 10)) { + this.decreaseClusterLevel(); + level += 1; } + + } + else { + this._expandClusterNode(node,false,true); + + // update the index list, dynamic edges and labels + this._updateNodeIndexList(); + this._updateDynamicEdges(); + this._updateCalculationNodes(); + this.updateLabels(); + } + + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); } }; + /** - * We get the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods - * with this amount we can cluster specifically on these chains. - * - * @private + * This calls the updateClustes with default arguments */ - exports._getChainFraction = function() { - var chains = 0; - var total = 0; - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - if (this.nodes[nodeId].dynamicEdgesLength == 2 && this.nodes[nodeId].dynamicEdges.length >= 2) { - chains += 1; - } - total += 1; - } + exports.updateClustersDefault = function() { + if (this.constants.clustering.enabled == true) { + this.updateClusters(0,false,false); } - return chains/total; }; -/***/ }, -/* 54 */ -/***/ function(module, exports, __webpack_require__) { - - var util = __webpack_require__(1); - /** - * Creation of the SectorMixin var. - * - * This contains all the functions the Network object can use to employ the sector system. - * The sector system is always used by Network, though the benefits only apply to the use of clustering. - * If clustering is not used, there is no overhead except for a duplicate object with references to nodes and edges. + * This function can be called to increase the cluster level. This means that the nodes with only one edge connection will + * be clustered with their connected node. This can be repeated as many times as needed. + * This can be called externally (by a keybind for instance) to reduce the complexity of big datasets. */ + exports.increaseClusterLevel = function() { + this.updateClusters(-1,false,true); + }; + /** - * This function is only called by the setData function of the Network object. - * This loads the global references into the active sector. This initializes the sector. - * - * @private + * This function can be called to decrease the cluster level. This means that the nodes with only one edge connection will + * be unpacked if they are a cluster. This can be repeated as many times as needed. + * This can be called externally (by a key-bind for instance) to look into clusters without zooming. */ - exports._putDataInSector = function() { - this.sectors["active"][this._sector()].nodes = this.nodes; - this.sectors["active"][this._sector()].edges = this.edges; - this.sectors["active"][this._sector()].nodeIndices = this.nodeIndices; + exports.decreaseClusterLevel = function() { + this.updateClusters(1,false,true); }; /** - * /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the supplied (active) sector. If a type is defined, do the specific type + * This is the main clustering function. It clusters and declusters on zoom or forced + * This function clusters on zoom, it can be called with a predefined zoom direction + * If out, check if we can form clusters, if in, check if we can open clusters. + * This function is only called from _zoom() + * + * @param {Number} zoomDirection | -1 / 0 / +1 for zoomOut / determineByZoom / zoomIn + * @param {Boolean} recursive | enabled or disable recursive calling of the opening of clusters + * @param {Boolean} force | enabled or disable forcing + * @param {Boolean} doNotStart | if true do not call start * - * @param {String} sectorId - * @param {String} [sectorType] | "active" or "frozen" - * @private */ - exports._switchToSector = function(sectorId, sectorType) { - if (sectorType === undefined || sectorType == "active") { - this._switchToActiveSector(sectorId); + exports.updateClusters = function(zoomDirection,recursive,force,doNotStart) { + var isMovingBeforeClustering = this.moving; + var amountOfNodes = this.nodeIndices.length; + + // on zoom out collapse the sector if the scale is at the level the sector was made + if (this.previousScale > this.scale && zoomDirection == 0) { + this._collapseSector(); } - else { - this._switchToFrozenSector(sectorId); + + // check if we zoom in or out + if (this.previousScale > this.scale || zoomDirection == -1) { // zoom out + // forming clusters when forced pulls outliers in. When not forced, the edge length of the + // outer nodes determines if it is being clustered + this._formClusters(force); } - }; + else if (this.previousScale < this.scale || zoomDirection == 1) { // zoom in + if (force == true) { + // _openClusters checks for each node if the formationScale of the cluster is smaller than + // the current scale and if so, declusters. When forced, all clusters are reduced by one step + this._openClusters(recursive,force); + } + else { + // if a cluster takes up a set percentage of the active window + this._openClustersBySize(); + } + } + this._updateNodeIndexList(); + // if a cluster was NOT formed and the user zoomed out, we try clustering by hubs + if (this.nodeIndices.length == amountOfNodes && (this.previousScale > this.scale || zoomDirection == -1)) { + this._aggregateHubs(force); + this._updateNodeIndexList(); + } - /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the supplied active sector. - * - * @param sectorId - * @private - */ - exports._switchToActiveSector = function(sectorId) { - this.nodeIndices = this.sectors["active"][sectorId]["nodeIndices"]; - this.nodes = this.sectors["active"][sectorId]["nodes"]; - this.edges = this.sectors["active"][sectorId]["edges"]; - }; + // we now reduce chains. + if (this.previousScale > this.scale || zoomDirection == -1) { // zoom out + this.handleChains(); + this._updateNodeIndexList(); + } + + this.previousScale = this.scale; + + // rest of the update the index list, dynamic edges and labels + this._updateDynamicEdges(); + this.updateLabels(); + + // if a cluster was formed, we increase the clusterSession + if (this.nodeIndices.length < amountOfNodes) { // this means a clustering operation has taken place + this.clusterSession += 1; + // if clusters have been made, we normalize the cluster level + this.normalizeClusterLevels(); + } + + if (doNotStart == false || doNotStart === undefined) { + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); + } + } + this._updateCalculationNodes(); + }; /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the supplied active sector. - * - * @private + * This function handles the chains. It is called on every updateClusters(). */ - exports._switchToSupportSector = function() { - this.nodeIndices = this.sectors["support"]["nodeIndices"]; - this.nodes = this.sectors["support"]["nodes"]; - this.edges = this.sectors["support"]["edges"]; - }; + exports.handleChains = function() { + // after clustering we check how many chains there are + var chainPercentage = this._getChainFraction(); + if (chainPercentage > this.constants.clustering.chainThreshold) { + this._reduceAmountOfChains(1 - this.constants.clustering.chainThreshold / chainPercentage) + } + }; /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the supplied frozen sector. + * this functions starts clustering by hubs + * The minimum hub threshold is set globally * - * @param sectorId * @private */ - exports._switchToFrozenSector = function(sectorId) { - this.nodeIndices = this.sectors["frozen"][sectorId]["nodeIndices"]; - this.nodes = this.sectors["frozen"][sectorId]["nodes"]; - this.edges = this.sectors["frozen"][sectorId]["edges"]; + exports._aggregateHubs = function(force) { + this._getHubSize(); + this._formClustersByHub(force,false); }; /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the currently active sector. + * This function is fired by keypress. It forces hubs to form. * - * @private */ - exports._loadLatestSector = function() { - this._switchToSector(this._sector()); - }; + exports.forceAggregateHubs = function(doNotStart) { + var isMovingBeforeClustering = this.moving; + var amountOfNodes = this.nodeIndices.length; + + this._aggregateHubs(true); + + // update the index list, dynamic edges and labels + this._updateNodeIndexList(); + this._updateDynamicEdges(); + this.updateLabels(); + + // if a cluster was formed, we increase the clusterSession + if (this.nodeIndices.length != amountOfNodes) { + this.clusterSession += 1; + } + if (doNotStart == false || doNotStart === undefined) { + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); + } + } + }; /** - * This function returns the currently active sector Id + * If a cluster takes up more than a set percentage of the screen, open the cluster * - * @returns {String} * @private */ - exports._sector = function() { - return this.activeSector[this.activeSector.length-1]; + exports._openClustersBySize = function() { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.inView() == true) { + if ((node.width*this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || + (node.height*this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { + this.openCluster(node); + } + } + } + } }; /** - * This function returns the previously active sector Id + * This function loops over all nodes in the nodeIndices list. For each node it checks if it is a cluster and if it + * has to be opened based on the current zoom level. * - * @returns {String} * @private */ - exports._previousSector = function() { - if (this.activeSector.length > 1) { - return this.activeSector[this.activeSector.length-2]; - } - else { - throw new TypeError('there are not enough sectors in the this.activeSector array.'); + exports._openClusters = function(recursive,force) { + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + this._expandClusterNode(node,recursive,force); + this._updateCalculationNodes(); } }; - /** - * We add the active sector at the end of the this.activeSector array - * This ensures it is the currently active sector returned by _sector() and it reaches the top - * of the activeSector stack. When we reverse our steps we move from the end to the beginning of this stack. + * This function checks if a node has to be opened. This is done by checking the zoom level. + * If the node contains child nodes, this function is recursively called on the child nodes as well. + * This recursive behaviour is optional and can be set by the recursive argument. * - * @param newId + * @param {Node} parentNode | to check for cluster and expand + * @param {Boolean} recursive | enabled or disable recursive calling + * @param {Boolean} force | enabled or disable forcing + * @param {Boolean} [openAll] | This will recursively force all nodes in the parent to be released * @private */ - exports._setActiveSector = function(newId) { - this.activeSector.push(newId); + exports._expandClusterNode = function(parentNode, recursive, force, openAll) { + // first check if node is a cluster + if (parentNode.clusterSize > 1) { + // this means that on a double tap event or a zoom event, the cluster fully unpacks if it is smaller than 20 + if (parentNode.clusterSize < this.constants.clustering.sectorThreshold) { + openAll = true; + } + recursive = openAll ? true : recursive; + + // if the last child has been added on a smaller scale than current scale decluster + if (parentNode.formationScale < this.scale || force == true) { + // we will check if any of the contained child nodes should be removed from the cluster + for (var containedNodeId in parentNode.containedNodes) { + if (parentNode.containedNodes.hasOwnProperty(containedNodeId)) { + var childNode = parentNode.containedNodes[containedNodeId]; + + // force expand will expand the largest cluster size clusters. Since we cluster from outside in, we assume that + // the largest cluster is the one that comes from outside + if (force == true) { + if (childNode.clusterSession == parentNode.clusterSessions[parentNode.clusterSessions.length-1] + || openAll) { + this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); + } + } + else { + if (this._nodeInActiveArea(parentNode)) { + this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); + } + } + } + } + } + } }; - /** - * We remove the currently active sector id from the active sector stack. This happens when - * we reactivate the previously active sector + * ONLY CALLED FROM _expandClusterNode * + * This function will expel a child_node from a parent_node. This is to de-cluster the node. This function will remove + * the child node from the parent contained_node object and put it back into the global nodes object. + * The same holds for the edge that was connected to the child node. It is moved back into the global edges object. + * + * @param {Node} parentNode | the parent node + * @param {String} containedNodeId | child_node id as it is contained in the containedNodes object of the parent node + * @param {Boolean} recursive | This will also check if the child needs to be expanded. + * With force and recursive both true, the entire cluster is unpacked + * @param {Boolean} force | This will disregard the zoom level and will expel this child from the parent + * @param {Boolean} openAll | This will recursively force all nodes in the parent to be released * @private */ - exports._forgetLastSector = function() { - this.activeSector.pop(); - }; + exports._expelChildFromParent = function(parentNode, containedNodeId, recursive, force, openAll) { + var childNode = parentNode.containedNodes[containedNodeId]; + // if child node has been added on smaller scale than current, kick out + if (childNode.formationScale < this.scale || force == true) { + // unselect all selected items + this._unselectAll(); - /** - * This function creates a new active sector with the supplied newId. This newId - * is the expanding node id. - * - * @param {String} newId | Id of the new active sector - * @private - */ - exports._createNewSector = function(newId) { - // create the new sector - this.sectors["active"][newId] = {"nodes":{}, - "edges":{}, - "nodeIndices":[], - "formationScale": this.scale, - "drawingNode": undefined}; + // put the child node back in the global nodes object + this.nodes[containedNodeId] = childNode; - // create the new sector render node. This gives visual feedback that you are in a new sector. - this.sectors["active"][newId]['drawingNode'] = new Node( - {id:newId, - color: { - background: "#eaefef", - border: "495c5e" + // release the contained edges from this childNode back into the global edges + this._releaseContainedEdges(parentNode,childNode); + + // reconnect rerouted edges to the childNode + this._connectEdgeBackToChild(parentNode,childNode); + + // validate all edges in dynamicEdges + this._validateEdges(parentNode); + + // undo the changes from the clustering operation on the parent node + parentNode.options.mass -= childNode.options.mass; + parentNode.clusterSize -= childNode.clusterSize; + parentNode.options.fontSize = Math.min(this.constants.clustering.maxFontSize, this.constants.nodes.fontSize + this.constants.clustering.fontSizeMultiplier*parentNode.clusterSize); + parentNode.dynamicEdgesLength = parentNode.dynamicEdges.length; + + // place the child node near the parent, not at the exact same location to avoid chaos in the system + childNode.x = parentNode.x + parentNode.growthIndicator * (0.5 - Math.random()); + childNode.y = parentNode.y + parentNode.growthIndicator * (0.5 - Math.random()); + + // remove node from the list + delete parentNode.containedNodes[containedNodeId]; + + // check if there are other childs with this clusterSession in the parent. + var othersPresent = false; + for (var childNodeId in parentNode.containedNodes) { + if (parentNode.containedNodes.hasOwnProperty(childNodeId)) { + if (parentNode.containedNodes[childNodeId].clusterSession == childNode.clusterSession) { + othersPresent = true; + break; } - },{},{},this.constants); - this.sectors["active"][newId]['drawingNode'].clusterSize = 2; - }; + } + } + // if there are no others, remove the cluster session from the list + if (othersPresent == false) { + parentNode.clusterSessions.pop(); + } + this._repositionBezierNodes(childNode); + // this._repositionBezierNodes(parentNode); - /** - * This function removes the currently active sector. This is called when we create a new - * active sector. - * - * @param {String} sectorId | Id of the active sector that will be removed - * @private - */ - exports._deleteActiveSector = function(sectorId) { - delete this.sectors["active"][sectorId]; - }; + // remove the clusterSession from the child node + childNode.clusterSession = 0; + // recalculate the size of the node on the next time the node is rendered + parentNode.clearSizeCache(); - /** - * This function removes the currently active sector. This is called when we reactivate - * the previously active sector. - * - * @param {String} sectorId | Id of the active sector that will be removed - * @private - */ - exports._deleteFrozenSector = function(sectorId) { - delete this.sectors["frozen"][sectorId]; + // restart the simulation to reorganise all nodes + this.moving = true; + } + + // check if a further expansion step is possible if recursivity is enabled + if (recursive == true) { + this._expandClusterNode(childNode,recursive,force,openAll); + } }; /** - * Freezing an active sector means moving it from the "active" object to the "frozen" object. - * We copy the references, then delete the active entree. + * position the bezier nodes at the center of the edges * - * @param sectorId + * @param node * @private */ - exports._freezeSector = function(sectorId) { - // we move the set references from the active to the frozen stack. - this.sectors["frozen"][sectorId] = this.sectors["active"][sectorId]; - - // we have moved the sector data into the frozen set, we now remove it from the active set - this._deleteActiveSector(sectorId); + exports._repositionBezierNodes = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + node.dynamicEdges[i].positionBezierNode(); + } }; /** - * This is the reverse operation of _freezeSector. Activating means moving the sector from the "frozen" - * object to the "active" object. + * This function checks if any nodes at the end of their trees have edges below a threshold length + * This function is called only from updateClusters() + * forceLevelCollapse ignores the length of the edge and collapses one level + * This means that a node with only one edge will be clustered with its connected node * - * @param sectorId * @private + * @param {Boolean} force */ - exports._activateSector = function(sectorId) { - // we move the set references from the frozen to the active stack. - this.sectors["active"][sectorId] = this.sectors["frozen"][sectorId]; - - // we have moved the sector data into the active set, we now remove it from the frozen stack - this._deleteFrozenSector(sectorId); + exports._formClusters = function(force) { + if (force == false) { + this._formClustersByZoom(); + } + else { + this._forceClustersByZoom(); + } }; /** - * This function merges the data from the currently active sector with a frozen sector. This is used - * in the process of reverting back to the previously active sector. - * The data that is placed in the frozen (the previously active) sector is the node that has been removed from it - * upon the creation of a new active sector. + * This function handles the clustering by zooming out, this is based on a minimum edge distance * - * @param sectorId * @private */ - exports._mergeThisWithFrozen = function(sectorId) { - // copy all nodes - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - this.sectors["frozen"][sectorId]["nodes"][nodeId] = this.nodes[nodeId]; - } - } + exports._formClustersByZoom = function() { + var dx,dy,length, + minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; - // copy all edges (if not fully clustered, else there are no edges) + // check if any edges are shorter than minLength and start the clustering + // the clustering favours the node with the larger mass for (var edgeId in this.edges) { if (this.edges.hasOwnProperty(edgeId)) { - this.sectors["frozen"][sectorId]["edges"][edgeId] = this.edges[edgeId]; - } - } + var edge = this.edges[edgeId]; + if (edge.connected) { + if (edge.toId != edge.fromId) { + dx = (edge.to.x - edge.from.x); + dy = (edge.to.y - edge.from.y); + length = Math.sqrt(dx * dx + dy * dy); - // merge the nodeIndices - for (var i = 0; i < this.nodeIndices.length; i++) { - this.sectors["frozen"][sectorId]["nodeIndices"].push(this.nodeIndices[i]); - } - }; + if (length < minLength) { + // first check which node is larger + var parentNode = edge.from; + var childNode = edge.to; + if (edge.to.options.mass > edge.from.options.mass) { + parentNode = edge.to; + childNode = edge.from; + } - /** - * This clusters the sector to one cluster. It was a single cluster before this process started so - * we revert to that state. The clusterToFit function with a maximum size of 1 node does this. - * - * @private - */ - exports._collapseThisToSingleCluster = function() { - this.clusterToFit(1,false); + if (childNode.dynamicEdgesLength == 1) { + this._addToCluster(parentNode,childNode,false); + } + else if (parentNode.dynamicEdgesLength == 1) { + this._addToCluster(childNode,parentNode,false); + } + } + } + } + } + } }; - /** - * We create a new active sector from the node that we want to open. + * This function forces the network to cluster all nodes with only one connecting edge to their + * connected node. * - * @param node * @private */ - exports._addSector = function(node) { - // this is the currently active sector - var sector = this._sector(); - - // // this should allow me to select nodes from a frozen set. - // if (this.sectors['active'][sector]["nodes"].hasOwnProperty(node.id)) { - // console.log("the node is part of the active sector"); - // } - // else { - // console.log("I dont know what the fuck happened!!"); - // } - - // when we switch to a new sector, we remove the node that will be expanded from the current nodes list. - delete this.nodes[node.id]; - - var unqiueIdentifier = util.randomUUID(); - - // we fully freeze the currently active sector - this._freezeSector(sector); - - // we create a new active sector. This sector has the Id of the node to ensure uniqueness - this._createNewSector(unqiueIdentifier); - - // we add the active sector to the sectors array to be able to revert these steps later on - this._setActiveSector(unqiueIdentifier); + exports._forceClustersByZoom = function() { + for (var nodeId in this.nodes) { + // another node could have absorbed this child. + if (this.nodes.hasOwnProperty(nodeId)) { + var childNode = this.nodes[nodeId]; - // we redirect the global references to the new sector's references. this._sector() now returns unqiueIdentifier - this._switchToSector(this._sector()); + // the edges can be swallowed by another decrease + if (childNode.dynamicEdgesLength == 1 && childNode.dynamicEdges.length != 0) { + var edge = childNode.dynamicEdges[0]; + var parentNode = (edge.toId == childNode.id) ? this.nodes[edge.fromId] : this.nodes[edge.toId]; - // finally we add the node we removed from our previous active sector to the new active sector - this.nodes[node.id] = node; + // group to the largest node + if (childNode.id != parentNode.id) { + if (parentNode.options.mass > childNode.options.mass) { + this._addToCluster(parentNode,childNode,true); + } + else { + this._addToCluster(childNode,parentNode,true); + } + } + } + } + } }; /** - * We close the sector that is currently open and revert back to the one before. - * If the active sector is the "default" sector, nothing happens. + * To keep the nodes of roughly equal size we normalize the cluster levels. + * This function clusters a node to its smallest connected neighbour. * + * @param node * @private */ - exports._collapseSector = function() { - // the currently active sector - var sector = this._sector(); - - // we cannot collapse the default sector - if (sector != "default") { - if ((this.nodeIndices.length == 1) || - (this.sectors["active"][sector]["drawingNode"].width*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || - (this.sectors["active"][sector]["drawingNode"].height*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { - var previousSector = this._previousSector(); - - // we collapse the sector back to a single cluster - this._collapseThisToSingleCluster(); - - // we move the remaining nodes, edges and nodeIndices to the previous sector. - // This previous sector is the one we will reactivate - this._mergeThisWithFrozen(previousSector); - - // the previously active (frozen) sector now has all the data from the currently active sector. - // we can now delete the active sector. - this._deleteActiveSector(sector); - - // we activate the previously active (and currently frozen) sector. - this._activateSector(previousSector); - - // we load the references from the newly active sector into the global references - this._switchToSector(previousSector); - - // we forget the previously active sector because we reverted to the one before - this._forgetLastSector(); + exports._clusterToSmallestNeighbour = function(node) { + var smallestNeighbour = -1; + var smallestNeighbourNode = null; + for (var i = 0; i < node.dynamicEdges.length; i++) { + if (node.dynamicEdges[i] !== undefined) { + var neighbour = null; + if (node.dynamicEdges[i].fromId != node.id) { + neighbour = node.dynamicEdges[i].from; + } + else if (node.dynamicEdges[i].toId != node.id) { + neighbour = node.dynamicEdges[i].to; + } - // finally, we update the node index list. - this._updateNodeIndexList(); - // we refresh the list with calulation nodes and calculation node indices. - this._updateCalculationNodes(); + if (neighbour != null && smallestNeighbour > neighbour.clusterSessions.length) { + smallestNeighbour = neighbour.clusterSessions.length; + smallestNeighbourNode = neighbour; + } } } + + if (neighbour != null && this.nodes[neighbour.id] !== undefined) { + this._addToCluster(neighbour, node, true); + } }; /** - * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). + * This function forms clusters from hubs, it loops over all nodes * - * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors - * | we dont pass the function itself because then the "this" is the window object - * | instead of the Network object - * @param {*} [argument] | Optional: arguments to pass to the runFunction + * @param {Boolean} force | Disregard zoom level + * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges * @private */ - exports._doInAllActiveSectors = function(runFunction,argument) { - if (argument === undefined) { - for (var sector in this.sectors["active"]) { - if (this.sectors["active"].hasOwnProperty(sector)) { - // switch the global references to those of this sector - this._switchToActiveSector(sector); - this[runFunction](); - } - } - } - else { - for (var sector in this.sectors["active"]) { - if (this.sectors["active"].hasOwnProperty(sector)) { - // switch the global references to those of this sector - this._switchToActiveSector(sector); - var args = Array.prototype.splice.call(arguments, 1); - if (args.length > 1) { - this[runFunction](args[0],args[1]); - } - else { - this[runFunction](argument); - } - } + exports._formClustersByHub = function(force, onlyEqual) { + // we loop over all nodes in the list + for (var nodeId in this.nodes) { + // we check if it is still available since it can be used by the clustering in this loop + if (this.nodes.hasOwnProperty(nodeId)) { + this._formClusterFromHub(this.nodes[nodeId],force,onlyEqual); } } - // we revert the global references back to our active sector - this._loadLatestSector(); }; - /** - * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). + * This function forms a cluster from a specific preselected hub node * - * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors - * | we dont pass the function itself because then the "this" is the window object - * | instead of the Network object - * @param {*} [argument] | Optional: arguments to pass to the runFunction + * @param {Node} hubNode | the node we will cluster as a hub + * @param {Boolean} force | Disregard zoom level + * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges + * @param {Number} [absorptionSizeOffset] | * @private */ - exports._doInSupportSector = function(runFunction,argument) { - if (argument === undefined) { - this._switchToSupportSector(); - this[runFunction](); + exports._formClusterFromHub = function(hubNode, force, onlyEqual, absorptionSizeOffset) { + if (absorptionSizeOffset === undefined) { + absorptionSizeOffset = 0; } - else { - this._switchToSupportSector(); - var args = Array.prototype.splice.call(arguments, 1); - if (args.length > 1) { - this[runFunction](args[0],args[1]); + // we decide if the node is a hub + if ((hubNode.dynamicEdgesLength >= this.hubThreshold && onlyEqual == false) || + (hubNode.dynamicEdgesLength == this.hubThreshold && onlyEqual == true)) { + // initialize variables + var dx,dy,length; + var minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; + var allowCluster = false; + + // we create a list of edges because the dynamicEdges change over the course of this loop + var edgesIdarray = []; + var amountOfInitialEdges = hubNode.dynamicEdges.length; + for (var j = 0; j < amountOfInitialEdges; j++) { + edgesIdarray.push(hubNode.dynamicEdges[j].id); } - else { - this[runFunction](argument); + + // if the hub clustering is not forces, we check if one of the edges connected + // to a cluster is small enough based on the constants.clustering.clusterEdgeThreshold + if (force == false) { + allowCluster = false; + for (j = 0; j < amountOfInitialEdges; j++) { + var edge = this.edges[edgesIdarray[j]]; + if (edge !== undefined) { + if (edge.connected) { + if (edge.toId != edge.fromId) { + dx = (edge.to.x - edge.from.x); + dy = (edge.to.y - edge.from.y); + length = Math.sqrt(dx * dx + dy * dy); + + if (length < minLength) { + allowCluster = true; + break; + } + } + } + } + } + } + + // start the clustering if allowed + if ((!force && allowCluster) || force) { + // we loop over all edges INITIALLY connected to this hub + for (j = 0; j < amountOfInitialEdges; j++) { + edge = this.edges[edgesIdarray[j]]; + // the edge can be clustered by this function in a previous loop + if (edge !== undefined) { + var childNode = this.nodes[(edge.fromId == hubNode.id) ? edge.toId : edge.fromId]; + // we do not want hubs to merge with other hubs nor do we want to cluster itself. + if ((childNode.dynamicEdges.length <= (this.hubThreshold + absorptionSizeOffset)) && + (childNode.id != hubNode.id)) { + this._addToCluster(hubNode,childNode,force); + } + } + } } } - // we revert the global references back to our active sector - this._loadLatestSector(); }; + /** - * This runs a function in all frozen sectors. This is used in the _redraw(). + * This function adds the child node to the parent node, creating a cluster if it is not already. * - * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors - * | we don't pass the function itself because then the "this" is the window object - * | instead of the Network object - * @param {*} [argument] | Optional: arguments to pass to the runFunction + * @param {Node} parentNode | this is the node that will house the child node + * @param {Node} childNode | this node will be deleted from the global this.nodes and stored in the parent node + * @param {Boolean} force | true will only update the remainingEdges at the very end of the clustering, ensuring single level collapse * @private */ - exports._doInAllFrozenSectors = function(runFunction,argument) { - if (argument === undefined) { - for (var sector in this.sectors["frozen"]) { - if (this.sectors["frozen"].hasOwnProperty(sector)) { - // switch the global references to those of this sector - this._switchToFrozenSector(sector); - this[runFunction](); - } + exports._addToCluster = function(parentNode, childNode, force) { + // join child node in the parent node + parentNode.containedNodes[childNode.id] = childNode; + + // manage all the edges connected to the child and parent nodes + for (var i = 0; i < childNode.dynamicEdges.length; i++) { + var edge = childNode.dynamicEdges[i]; + if (edge.toId == parentNode.id || edge.fromId == parentNode.id) { // edge connected to parentNode + this._addToContainedEdges(parentNode,childNode,edge); } - } - else { - for (var sector in this.sectors["frozen"]) { - if (this.sectors["frozen"].hasOwnProperty(sector)) { - // switch the global references to those of this sector - this._switchToFrozenSector(sector); - var args = Array.prototype.splice.call(arguments, 1); - if (args.length > 1) { - this[runFunction](args[0],args[1]); - } - else { - this[runFunction](argument); - } - } + else { + this._connectEdgeToCluster(parentNode,childNode,edge); } } - this._loadLatestSector(); - }; + // a contained node has no dynamic edges. + childNode.dynamicEdges = []; + + // remove circular edges from clusters + this._containCircularEdgesFromNode(parentNode,childNode); + + + // remove the childNode from the global nodes object + delete this.nodes[childNode.id]; + + // update the properties of the child and parent + var massBefore = parentNode.options.mass; + childNode.clusterSession = this.clusterSession; + parentNode.options.mass += childNode.options.mass; + parentNode.clusterSize += childNode.clusterSize; + parentNode.options.fontSize = Math.min(this.constants.clustering.maxFontSize, this.constants.nodes.fontSize + this.constants.clustering.fontSizeMultiplier*parentNode.clusterSize); + // keep track of the clustersessions so we can open the cluster up as it has been formed. + if (parentNode.clusterSessions[parentNode.clusterSessions.length - 1] != this.clusterSession) { + parentNode.clusterSessions.push(this.clusterSession); + } - /** - * This runs a function in all sectors. This is used in the _redraw(). - * - * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors - * | we don't pass the function itself because then the "this" is the window object - * | instead of the Network object - * @param {*} [argument] | Optional: arguments to pass to the runFunction - * @private - */ - exports._doInAllSectors = function(runFunction,argument) { - var args = Array.prototype.splice.call(arguments, 1); - if (argument === undefined) { - this._doInAllActiveSectors(runFunction); - this._doInAllFrozenSectors(runFunction); + // forced clusters only open from screen size and double tap + if (force == true) { + // parentNode.formationScale = Math.pow(1 - (1.0/11.0),this.clusterSession+3); + parentNode.formationScale = 0; } else { - if (args.length > 1) { - this._doInAllActiveSectors(runFunction,args[0],args[1]); - this._doInAllFrozenSectors(runFunction,args[0],args[1]); - } - else { - this._doInAllActiveSectors(runFunction,argument); - this._doInAllFrozenSectors(runFunction,argument); - } + parentNode.formationScale = this.scale; // The latest child has been added on this scale } - }; + // recalculate the size of the node on the next time the node is rendered + parentNode.clearSizeCache(); - /** - * This clears the nodeIndices list. We cannot use this.nodeIndices = [] because we would break the link with the - * active sector. Thus we clear the nodeIndices in the active sector, then reconnect the this.nodeIndices to it. - * - * @private - */ - exports._clearNodeIndexList = function() { - var sector = this._sector(); - this.sectors["active"][sector]["nodeIndices"] = []; - this.nodeIndices = this.sectors["active"][sector]["nodeIndices"]; + // set the pop-out scale for the childnode + parentNode.containedNodes[childNode.id].formationScale = parentNode.formationScale; + + // nullify the movement velocity of the child, this is to avoid hectic behaviour + childNode.clearVelocity(); + + // the mass has altered, preservation of energy dictates the velocity to be updated + parentNode.updateVelocity(massBefore); + + // restart the simulation to reorganise all nodes + this.moving = true; }; /** - * Draw the encompassing sector node - * - * @param ctx - * @param sectorType + * This function will apply the changes made to the remainingEdges during the formation of the clusters. + * This is a seperate function to allow for level-wise collapsing of the node barnesHutTree. + * It has to be called if a level is collapsed. It is called by _formClusters(). * @private */ - exports._drawSectorNodes = function(ctx,sectorType) { - var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; - for (var sector in this.sectors[sectorType]) { - if (this.sectors[sectorType].hasOwnProperty(sector)) { - if (this.sectors[sectorType][sector]["drawingNode"] !== undefined) { - - this._switchToSector(sector,sectorType); + exports._updateDynamicEdges = function() { + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + node.dynamicEdgesLength = node.dynamicEdges.length; - minY = 1e9; maxY = -1e9; minX = 1e9; maxX = -1e9; - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - node.resize(ctx); - if (minX > node.x - 0.5 * node.width) {minX = node.x - 0.5 * node.width;} - if (maxX < node.x + 0.5 * node.width) {maxX = node.x + 0.5 * node.width;} - if (minY > node.y - 0.5 * node.height) {minY = node.y - 0.5 * node.height;} - if (maxY < node.y + 0.5 * node.height) {maxY = node.y + 0.5 * node.height;} + // this corrects for multiple edges pointing at the same other node + var correction = 0; + if (node.dynamicEdgesLength > 1) { + for (var j = 0; j < node.dynamicEdgesLength - 1; j++) { + var edgeToId = node.dynamicEdges[j].toId; + var edgeFromId = node.dynamicEdges[j].fromId; + for (var k = j+1; k < node.dynamicEdgesLength; k++) { + if ((node.dynamicEdges[k].toId == edgeToId && node.dynamicEdges[k].fromId == edgeFromId) || + (node.dynamicEdges[k].fromId == edgeToId && node.dynamicEdges[k].toId == edgeFromId)) { + correction += 1; } } - node = this.sectors[sectorType][sector]["drawingNode"]; - node.x = 0.5 * (maxX + minX); - node.y = 0.5 * (maxY + minY); - node.width = 2 * (node.x - minX); - node.height = 2 * (node.y - minY); - node.radius = Math.sqrt(Math.pow(0.5*node.width,2) + Math.pow(0.5*node.height,2)); - node.setScale(this.scale); - node._drawCircle(ctx); } } + node.dynamicEdgesLength -= correction; } }; - exports._drawAllSectorNodes = function(ctx) { - this._drawSectorNodes(ctx,"frozen"); - this._drawSectorNodes(ctx,"active"); - this._loadLatestSector(); - }; + /** + * This adds an edge from the childNode to the contained edges of the parent node + * + * @param parentNode | Node object + * @param childNode | Node object + * @param edge | Edge object + * @private + */ + exports._addToContainedEdges = function(parentNode, childNode, edge) { + // create an array object if it does not yet exist for this childNode + if (!(parentNode.containedEdges.hasOwnProperty(childNode.id))) { + parentNode.containedEdges[childNode.id] = [] + } + // add this edge to the list + parentNode.containedEdges[childNode.id].push(edge); -/***/ }, -/* 55 */ -/***/ function(module, exports, __webpack_require__) { + // remove the edge from the global edges object + delete this.edges[edge.id]; - var Node = __webpack_require__(36); + // remove the edge from the parent object + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + if (parentNode.dynamicEdges[i].id == edge.id) { + parentNode.dynamicEdges.splice(i,1); + break; + } + } + }; /** - * This function can be called from the _doInAllSectors function + * This function connects an edge that was connected to a child node to the parent node. + * It keeps track of which nodes it has been connected to with the originalId array. * - * @param object - * @param overlappingNodes + * @param {Node} parentNode | Node object + * @param {Node} childNode | Node object + * @param {Edge} edge | Edge object * @private */ - exports._getNodesOverlappingWith = function(object, overlappingNodes) { - var nodes = this.nodes; - for (var nodeId in nodes) { - if (nodes.hasOwnProperty(nodeId)) { - if (nodes[nodeId].isOverlappingWith(object)) { - overlappingNodes.push(nodeId); - } + exports._connectEdgeToCluster = function(parentNode, childNode, edge) { + // handle circular edges + if (edge.toId == edge.fromId) { + this._addToContainedEdges(parentNode, childNode, edge); + } + else { + if (edge.toId == childNode.id) { // edge connected to other node on the "to" side + edge.originalToId.push(childNode.id); + edge.to = parentNode; + edge.toId = parentNode.id; + } + else { // edge connected to other node with the "from" side + + edge.originalFromId.push(childNode.id); + edge.from = parentNode; + edge.fromId = parentNode.id; } + + this._addToReroutedEdges(parentNode,childNode,edge); } }; + /** - * retrieve all nodes overlapping with given object - * @param {Object} object An object with parameters left, top, right, bottom - * @return {Number[]} An array with id's of the overlapping nodes + * If a node is connected to itself, a circular edge is drawn. When clustering we want to contain + * these edges inside of the cluster. + * + * @param parentNode + * @param childNode * @private */ - exports._getAllNodesOverlappingWith = function (object) { - var overlappingNodes = []; - this._doInAllActiveSectors("_getNodesOverlappingWith",object,overlappingNodes); - return overlappingNodes; + exports._containCircularEdgesFromNode = function(parentNode, childNode) { + // manage all the edges connected to the child and parent nodes + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + var edge = parentNode.dynamicEdges[i]; + // handle circular edges + if (edge.toId == edge.fromId) { + this._addToContainedEdges(parentNode, childNode, edge); + } + } }; /** - * Return a position object in canvasspace from a single point in screenspace + * This adds an edge from the childNode to the rerouted edges of the parent node * - * @param pointer - * @returns {{left: number, top: number, right: number, bottom: number}} + * @param parentNode | Node object + * @param childNode | Node object + * @param edge | Edge object * @private */ - exports._pointerToPositionObject = function(pointer) { - var x = this._XconvertDOMtoCanvas(pointer.x); - var y = this._YconvertDOMtoCanvas(pointer.y); + exports._addToReroutedEdges = function(parentNode, childNode, edge) { + // create an array object if it does not yet exist for this childNode + // we store the edge in the rerouted edges so we can restore it when the cluster pops open + if (!(parentNode.reroutedEdges.hasOwnProperty(childNode.id))) { + parentNode.reroutedEdges[childNode.id] = []; + } + parentNode.reroutedEdges[childNode.id].push(edge); + + // this edge becomes part of the dynamicEdges of the cluster node + parentNode.dynamicEdges.push(edge); + }; - return { - left: x, - top: y, - right: x, - bottom: y - }; - }; /** - * Get the top node at the a specific point (like a click) + * This function connects an edge that was connected to a cluster node back to the child node. * - * @param {{x: Number, y: Number}} pointer - * @return {Node | null} node + * @param parentNode | Node object + * @param childNode | Node object * @private */ - exports._getNodeAt = function (pointer) { - // we first check if this is an navigation controls element - var positionObject = this._pointerToPositionObject(pointer); - var overlappingNodes = this._getAllNodesOverlappingWith(positionObject); + exports._connectEdgeBackToChild = function(parentNode, childNode) { + if (parentNode.reroutedEdges.hasOwnProperty(childNode.id)) { + for (var i = 0; i < parentNode.reroutedEdges[childNode.id].length; i++) { + var edge = parentNode.reroutedEdges[childNode.id][i]; + if (edge.originalFromId[edge.originalFromId.length-1] == childNode.id) { + edge.originalFromId.pop(); + edge.fromId = childNode.id; + edge.from = childNode; + } + else { + edge.originalToId.pop(); + edge.toId = childNode.id; + edge.to = childNode; + } - // if there are overlapping nodes, select the last one, this is the - // one which is drawn on top of the others - if (overlappingNodes.length > 0) { - return this.nodes[overlappingNodes[overlappingNodes.length - 1]]; - } - else { - return null; + // append this edge to the list of edges connecting to the childnode + childNode.dynamicEdges.push(edge); + + // remove the edge from the parent object + for (var j = 0; j < parentNode.dynamicEdges.length; j++) { + if (parentNode.dynamicEdges[j].id == edge.id) { + parentNode.dynamicEdges.splice(j,1); + break; + } + } + } + // remove the entry from the rerouted edges + delete parentNode.reroutedEdges[childNode.id]; } }; /** - * retrieve all edges overlapping with given object, selector is around center - * @param {Object} object An object with parameters left, top, right, bottom - * @return {Number[]} An array with id's of the overlapping nodes + * When loops are clustered, an edge can be both in the rerouted array and the contained array. + * This function is called last to verify that all edges in dynamicEdges are in fact connected to the + * parentNode + * + * @param parentNode | Node object * @private */ - exports._getEdgesOverlappingWith = function (object, overlappingEdges) { - var edges = this.edges; - for (var edgeId in edges) { - if (edges.hasOwnProperty(edgeId)) { - if (edges[edgeId].isOverlappingWith(object)) { - overlappingEdges.push(edgeId); - } + exports._validateEdges = function(parentNode) { + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + var edge = parentNode.dynamicEdges[i]; + if (parentNode.id != edge.toId && parentNode.id != edge.fromId) { + parentNode.dynamicEdges.splice(i,1); } } }; /** - * retrieve all nodes overlapping with given object - * @param {Object} object An object with parameters left, top, right, bottom - * @return {Number[]} An array with id's of the overlapping nodes - * @private - */ - exports._getAllEdgesOverlappingWith = function (object) { - var overlappingEdges = []; - this._doInAllActiveSectors("_getEdgesOverlappingWith",object,overlappingEdges); - return overlappingEdges; - }; - - /** - * Place holder. To implement change the _getNodeAt to a _getObjectAt. Have the _getObjectAt call - * _getNodeAt and _getEdgesAt, then priortize the selection to user preferences. + * This function released the contained edges back into the global domain and puts them back into the + * dynamic edges of both parent and child. * - * @param pointer - * @returns {null} + * @param {Node} parentNode | + * @param {Node} childNode | * @private */ - exports._getEdgeAt = function(pointer) { - var positionObject = this._pointerToPositionObject(pointer); - var overlappingEdges = this._getAllEdgesOverlappingWith(positionObject); + exports._releaseContainedEdges = function(parentNode, childNode) { + for (var i = 0; i < parentNode.containedEdges[childNode.id].length; i++) { + var edge = parentNode.containedEdges[childNode.id][i]; - if (overlappingEdges.length > 0) { - return this.edges[overlappingEdges[overlappingEdges.length - 1]]; - } - else { - return null; + // put the edge back in the global edges object + this.edges[edge.id] = edge; + + // put the edge back in the dynamic edges of the child and parent + childNode.dynamicEdges.push(edge); + parentNode.dynamicEdges.push(edge); } + // remove the entry from the contained edges + delete parentNode.containedEdges[childNode.id]; + }; + + + // ------------------- UTILITY FUNCTIONS ---------------------------- // + + /** - * Add object to the selection array. - * - * @param obj - * @private + * This updates the node labels for all nodes (for debugging purposes) */ - exports._addToSelection = function(obj) { - if (obj instanceof Node) { - this.selectionObj.nodes[obj.id] = obj; + exports.updateLabels = function() { + var nodeId; + // update node labels + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.clusterSize > 1) { + node.label = "[".concat(String(node.clusterSize),"]"); + } + } } - else { - this.selectionObj.edges[obj.id] = obj; + + // update node labels + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.clusterSize == 1) { + if (node.originalLabel !== undefined) { + node.label = node.originalLabel; + } + else { + node.label = String(node.id); + } + } + } } + + // /* Debug Override */ + // for (nodeId in this.nodes) { + // if (this.nodes.hasOwnProperty(nodeId)) { + // node = this.nodes[nodeId]; + // node.label = String(node.level); + // } + // } + }; + /** - * Add object to the selection array. - * - * @param obj - * @private + * We want to keep the cluster level distribution rather small. This means we do not want unclustered nodes + * if the rest of the nodes are already a few cluster levels in. + * To fix this we use this function. It determines the min and max cluster level and sends nodes that have not + * clustered enough to the clusterToSmallestNeighbours function. */ - exports._addToHover = function(obj) { - if (obj instanceof Node) { - this.hoverObj.nodes[obj.id] = obj; + exports.normalizeClusterLevels = function() { + var maxLevel = 0; + var minLevel = 1e9; + var clusterLevel = 0; + var nodeId; + + // we loop over all nodes in the list + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + clusterLevel = this.nodes[nodeId].clusterSessions.length; + if (maxLevel < clusterLevel) {maxLevel = clusterLevel;} + if (minLevel > clusterLevel) {minLevel = clusterLevel;} + } } - else { - this.hoverObj.edges[obj.id] = obj; + + if (maxLevel - minLevel > this.constants.clustering.clusterLevelDifference) { + var amountOfNodes = this.nodeIndices.length; + var targetLevel = maxLevel - this.constants.clustering.clusterLevelDifference; + // we loop over all nodes in the list + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (this.nodes[nodeId].clusterSessions.length < targetLevel) { + this._clusterToSmallestNeighbour(this.nodes[nodeId]); + } + } + } + this._updateNodeIndexList(); + this._updateDynamicEdges(); + // if a cluster was formed, we increase the clusterSession + if (this.nodeIndices.length != amountOfNodes) { + this.clusterSession += 1; + } } }; + /** - * Remove a single option from selection. + * This function determines if the cluster we want to decluster is in the active area + * this means around the zoom center * - * @param {Object} obj + * @param {Node} node + * @returns {boolean} * @private */ - exports._removeFromSelection = function(obj) { - if (obj instanceof Node) { - delete this.selectionObj.nodes[obj.id]; - } - else { - delete this.selectionObj.edges[obj.id]; - } + exports._nodeInActiveArea = function(node) { + return ( + Math.abs(node.x - this.areaCenter.x) <= this.constants.clustering.activeAreaBoxSize/this.scale + && + Math.abs(node.y - this.areaCenter.y) <= this.constants.clustering.activeAreaBoxSize/this.scale + ) }; + /** - * Unselect all. The selectionObj is useful for this. + * This is an adaptation of the original repositioning function. This is called if the system is clustered initially + * It puts large clusters away from the center and randomizes the order. * - * @param {Boolean} [doNotTrigger] | ignore trigger - * @private */ - exports._unselectAll = function(doNotTrigger) { - if (doNotTrigger === undefined) { - doNotTrigger = false; - } - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - this.selectionObj.nodes[nodeId].unselect(); - } - } - for(var edgeId in this.selectionObj.edges) { - if(this.selectionObj.edges.hasOwnProperty(edgeId)) { - this.selectionObj.edges[edgeId].unselect(); + exports.repositionNodes = function() { + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + if ((node.xFixed == false || node.yFixed == false)) { + var radius = 10 * 0.1*this.nodeIndices.length * Math.min(100,node.options.mass); + var angle = 2 * Math.PI * Math.random(); + if (node.xFixed == false) {node.x = radius * Math.cos(angle);} + if (node.yFixed == false) {node.y = radius * Math.sin(angle);} + this._repositionBezierNodes(node); } } - - this.selectionObj = {nodes:{},edges:{}}; - - if (doNotTrigger == false) { - this.emit('select', this.getSelection()); - } }; + /** - * Unselect all clusters. The selectionObj is useful for this. + * We determine how many connections denote an important hub. + * We take the mean + 2*std as the important hub size. (Assuming a normal distribution of data, ~2.2%) * - * @param {Boolean} [doNotTrigger] | ignore trigger * @private */ - exports._unselectClusters = function(doNotTrigger) { - if (doNotTrigger === undefined) { - doNotTrigger = false; - } + exports._getHubSize = function() { + var average = 0; + var averageSquared = 0; + var hubCounter = 0; + var largestHub = 0; - for (var nodeId in this.selectionObj.nodes) { - if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { - if (this.selectionObj.nodes[nodeId].clusterSize > 1) { - this.selectionObj.nodes[nodeId].unselect(); - this._removeFromSelection(this.selectionObj.nodes[nodeId]); - } + for (var i = 0; i < this.nodeIndices.length; i++) { + + var node = this.nodes[this.nodeIndices[i]]; + if (node.dynamicEdgesLength > largestHub) { + largestHub = node.dynamicEdgesLength; } + average += node.dynamicEdgesLength; + averageSquared += Math.pow(node.dynamicEdgesLength,2); + hubCounter += 1; } + average = average / hubCounter; + averageSquared = averageSquared / hubCounter; - if (doNotTrigger == false) { - this.emit('select', this.getSelection()); - } - }; + var variance = averageSquared - Math.pow(average,2); + var standardDeviation = Math.sqrt(variance); - /** - * return the number of selected nodes - * - * @returns {number} - * @private - */ - exports._getSelectedNodeCount = function() { - var count = 0; - for (var nodeId in this.selectionObj.nodes) { - if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { - count += 1; - } + this.hubThreshold = Math.floor(average + 2*standardDeviation); + + // always have at least one to cluster + if (this.hubThreshold > largestHub) { + this.hubThreshold = largestHub; } - return count; + + // console.log("average",average,"averageSQ",averageSquared,"var",variance,"std",standardDeviation); + // console.log("hubThreshold:",this.hubThreshold); }; + /** - * return the selected node + * We reduce the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods + * with this amount we can cluster specifically on these chains. * - * @returns {number} + * @param {Number} fraction | between 0 and 1, the percentage of chains to reduce * @private */ - exports._getSelectedNode = function() { - for (var nodeId in this.selectionObj.nodes) { - if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { - return this.selectionObj.nodes[nodeId]; + exports._reduceAmountOfChains = function(fraction) { + this.hubThreshold = 2; + var reduceAmount = Math.floor(this.nodeIndices.length * fraction); + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (this.nodes[nodeId].dynamicEdgesLength == 2 && this.nodes[nodeId].dynamicEdges.length >= 2) { + if (reduceAmount > 0) { + this._formClusterFromHub(this.nodes[nodeId],true,true,1); + reduceAmount -= 1; + } + } } } - return null; }; /** - * return the selected edge + * We get the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods + * with this amount we can cluster specifically on these chains. * - * @returns {number} * @private */ - exports._getSelectedEdge = function() { - for (var edgeId in this.selectionObj.edges) { - if (this.selectionObj.edges.hasOwnProperty(edgeId)) { - return this.selectionObj.edges[edgeId]; + exports._getChainFraction = function() { + var chains = 0; + var total = 0; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (this.nodes[nodeId].dynamicEdgesLength == 2 && this.nodes[nodeId].dynamicEdges.length >= 2) { + chains += 1; + } + total += 1; } } - return null; + return chains/total; }; +/***/ }, +/* 58 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + /** - * return the number of selected edges + * Creation of the SectorMixin var. * - * @returns {number} - * @private + * This contains all the functions the Network object can use to employ the sector system. + * The sector system is always used by Network, though the benefits only apply to the use of clustering. + * If clustering is not used, there is no overhead except for a duplicate object with references to nodes and edges. */ - exports._getSelectedEdgeCount = function() { - var count = 0; - for (var edgeId in this.selectionObj.edges) { - if (this.selectionObj.edges.hasOwnProperty(edgeId)) { - count += 1; - } - } - return count; - }; - /** - * return the number of selected objects. + * This function is only called by the setData function of the Network object. + * This loads the global references into the active sector. This initializes the sector. * - * @returns {number} * @private */ - exports._getSelectedObjectCount = function() { - var count = 0; - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - count += 1; - } - } - for(var edgeId in this.selectionObj.edges) { - if(this.selectionObj.edges.hasOwnProperty(edgeId)) { - count += 1; - } - } - return count; + exports._putDataInSector = function() { + this.sectors["active"][this._sector()].nodes = this.nodes; + this.sectors["active"][this._sector()].edges = this.edges; + this.sectors["active"][this._sector()].nodeIndices = this.nodeIndices; }; + /** - * Check if anything is selected + * /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied (active) sector. If a type is defined, do the specific type * - * @returns {boolean} + * @param {String} sectorId + * @param {String} [sectorType] | "active" or "frozen" * @private */ - exports._selectionIsEmpty = function() { - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - return false; - } + exports._switchToSector = function(sectorId, sectorType) { + if (sectorType === undefined || sectorType == "active") { + this._switchToActiveSector(sectorId); } - for(var edgeId in this.selectionObj.edges) { - if(this.selectionObj.edges.hasOwnProperty(edgeId)) { - return false; - } + else { + this._switchToFrozenSector(sectorId); } - return true; }; /** - * check if one of the selected nodes is a cluster. + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied active sector. * - * @returns {boolean} + * @param sectorId * @private */ - exports._clusterInSelection = function() { - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - if (this.selectionObj.nodes[nodeId].clusterSize > 1) { - return true; - } - } - } - return false; + exports._switchToActiveSector = function(sectorId) { + this.nodeIndices = this.sectors["active"][sectorId]["nodeIndices"]; + this.nodes = this.sectors["active"][sectorId]["nodes"]; + this.edges = this.sectors["active"][sectorId]["edges"]; }; + /** - * select the edges connected to the node that is being selected + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied active sector. * - * @param {Node} node * @private */ - exports._selectConnectedEdges = function(node) { - for (var i = 0; i < node.dynamicEdges.length; i++) { - var edge = node.dynamicEdges[i]; - edge.select(); - this._addToSelection(edge); - } + exports._switchToSupportSector = function() { + this.nodeIndices = this.sectors["support"]["nodeIndices"]; + this.nodes = this.sectors["support"]["nodes"]; + this.edges = this.sectors["support"]["edges"]; }; + /** - * select the edges connected to the node that is being selected + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied frozen sector. * - * @param {Node} node + * @param sectorId * @private */ - exports._hoverConnectedEdges = function(node) { - for (var i = 0; i < node.dynamicEdges.length; i++) { - var edge = node.dynamicEdges[i]; - edge.hover = true; - this._addToHover(edge); - } + exports._switchToFrozenSector = function(sectorId) { + this.nodeIndices = this.sectors["frozen"][sectorId]["nodeIndices"]; + this.nodes = this.sectors["frozen"][sectorId]["nodes"]; + this.edges = this.sectors["frozen"][sectorId]["edges"]; }; /** - * unselect the edges connected to the node that is being selected + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the currently active sector. * - * @param {Node} node * @private */ - exports._unselectConnectedEdges = function(node) { - for (var i = 0; i < node.dynamicEdges.length; i++) { - var edge = node.dynamicEdges[i]; - edge.unselect(); - this._removeFromSelection(edge); - } + exports._loadLatestSector = function() { + this._switchToSector(this._sector()); }; - - /** - * This is called when someone clicks on a node. either select or deselect it. - * If there is an existing selection and we don't want to append to it, clear the existing selection + * This function returns the currently active sector Id * - * @param {Node || Edge} object - * @param {Boolean} append - * @param {Boolean} [doNotTrigger] | ignore trigger + * @returns {String} * @private */ - exports._selectObject = function(object, append, doNotTrigger, highlightEdges) { - if (doNotTrigger === undefined) { - doNotTrigger = false; - } - if (highlightEdges === undefined) { - highlightEdges = true; - } - - if (this._selectionIsEmpty() == false && append == false && this.forceAppendSelection == false) { - this._unselectAll(true); - } - - if (object.selected == false) { - object.select(); - this._addToSelection(object); - if (object instanceof Node && this.blockConnectingEdgeSelection == false && highlightEdges == true) { - this._selectConnectedEdges(object); - } - } - else { - object.unselect(); - this._removeFromSelection(object); - } - - if (doNotTrigger == false) { - this.emit('select', this.getSelection()); - } + exports._sector = function() { + return this.activeSector[this.activeSector.length-1]; }; /** - * This is called when someone clicks on a node. either select or deselect it. - * If there is an existing selection and we don't want to append to it, clear the existing selection + * This function returns the previously active sector Id * - * @param {Node || Edge} object + * @returns {String} * @private */ - exports._blurObject = function(object) { - if (object.hover == true) { - object.hover = false; - this.emit("blurNode",{node:object.id}); + exports._previousSector = function() { + if (this.activeSector.length > 1) { + return this.activeSector[this.activeSector.length-2]; + } + else { + throw new TypeError('there are not enough sectors in the this.activeSector array.'); } }; + /** - * This is called when someone clicks on a node. either select or deselect it. - * If there is an existing selection and we don't want to append to it, clear the existing selection + * We add the active sector at the end of the this.activeSector array + * This ensures it is the currently active sector returned by _sector() and it reaches the top + * of the activeSector stack. When we reverse our steps we move from the end to the beginning of this stack. * - * @param {Node || Edge} object + * @param newId * @private */ - exports._hoverObject = function(object) { - if (object.hover == false) { - object.hover = true; - this._addToHover(object); - if (object instanceof Node) { - this.emit("hoverNode",{node:object.id}); - } - } - if (object instanceof Node) { - this._hoverConnectedEdges(object); - } + exports._setActiveSector = function(newId) { + this.activeSector.push(newId); }; /** - * handles the selection part of the touch, only for navigation controls elements; - * Touch is triggered before tap, also before hold. Hold triggers after a while. - * This is the most responsive solution + * We remove the currently active sector id from the active sector stack. This happens when + * we reactivate the previously active sector * - * @param {Object} pointer * @private */ - exports._handleTouch = function(pointer) { + exports._forgetLastSector = function() { + this.activeSector.pop(); }; /** - * handles the selection part of the tap; + * This function creates a new active sector with the supplied newId. This newId + * is the expanding node id. * - * @param {Object} pointer + * @param {String} newId | Id of the new active sector * @private */ - exports._handleTap = function(pointer) { - var node = this._getNodeAt(pointer); - if (node != null) { - this._selectObject(node,false); - } - else { - var edge = this._getEdgeAt(pointer); - if (edge != null) { - this._selectObject(edge,false); - } - else { - this._unselectAll(); - } - } - this.emit("click", this.getSelection()); - this._redraw(); + exports._createNewSector = function(newId) { + // create the new sector + this.sectors["active"][newId] = {"nodes":{}, + "edges":{}, + "nodeIndices":[], + "formationScale": this.scale, + "drawingNode": undefined}; + + // create the new sector render node. This gives visual feedback that you are in a new sector. + this.sectors["active"][newId]['drawingNode'] = new Node( + {id:newId, + color: { + background: "#eaefef", + border: "495c5e" + } + },{},{},this.constants); + this.sectors["active"][newId]['drawingNode'].clusterSize = 2; }; /** - * handles the selection part of the double tap and opens a cluster if needed + * This function removes the currently active sector. This is called when we create a new + * active sector. * - * @param {Object} pointer + * @param {String} sectorId | Id of the active sector that will be removed * @private */ - exports._handleDoubleTap = function(pointer) { - var node = this._getNodeAt(pointer); - if (node != null && node !== undefined) { - // we reset the areaCenter here so the opening of the node will occur - this.areaCenter = {"x" : this._XconvertDOMtoCanvas(pointer.x), - "y" : this._YconvertDOMtoCanvas(pointer.y)}; - this.openCluster(node); - } - this.emit("doubleClick", this.getSelection()); + exports._deleteActiveSector = function(sectorId) { + delete this.sectors["active"][sectorId]; }; /** - * Handle the onHold selection part + * This function removes the currently active sector. This is called when we reactivate + * the previously active sector. * - * @param pointer + * @param {String} sectorId | Id of the active sector that will be removed * @private */ - exports._handleOnHold = function(pointer) { - var node = this._getNodeAt(pointer); - if (node != null) { - this._selectObject(node,true); - } - else { - var edge = this._getEdgeAt(pointer); - if (edge != null) { - this._selectObject(edge,true); - } - } - this._redraw(); + exports._deleteFrozenSector = function(sectorId) { + delete this.sectors["frozen"][sectorId]; }; /** - * handle the onRelease event. These functions are here for the navigation controls module. + * Freezing an active sector means moving it from the "active" object to the "frozen" object. + * We copy the references, then delete the active entree. * - * @private + * @param sectorId + * @private */ - exports._handleOnRelease = function(pointer) { + exports._freezeSector = function(sectorId) { + // we move the set references from the active to the frozen stack. + this.sectors["frozen"][sectorId] = this.sectors["active"][sectorId]; + // we have moved the sector data into the frozen set, we now remove it from the active set + this._deleteActiveSector(sectorId); }; - /** + * This is the reverse operation of _freezeSector. Activating means moving the sector from the "frozen" + * object to the "active" object. * - * retrieve the currently selected objects - * @return {{nodes: Array., edges: Array.}} selection + * @param sectorId + * @private */ - exports.getSelection = function() { - var nodeIds = this.getSelectedNodes(); - var edgeIds = this.getSelectedEdges(); - return {nodes:nodeIds, edges:edgeIds}; + exports._activateSector = function(sectorId) { + // we move the set references from the frozen to the active stack. + this.sectors["active"][sectorId] = this.sectors["frozen"][sectorId]; + + // we have moved the sector data into the active set, we now remove it from the frozen stack + this._deleteFrozenSector(sectorId); }; + /** + * This function merges the data from the currently active sector with a frozen sector. This is used + * in the process of reverting back to the previously active sector. + * The data that is placed in the frozen (the previously active) sector is the node that has been removed from it + * upon the creation of a new active sector. * - * retrieve the currently selected nodes - * @return {String[]} selection An array with the ids of the - * selected nodes. + * @param sectorId + * @private */ - exports.getSelectedNodes = function() { - var idArray = []; - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - idArray.push(nodeId); + exports._mergeThisWithFrozen = function(sectorId) { + // copy all nodes + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + this.sectors["frozen"][sectorId]["nodes"][nodeId] = this.nodes[nodeId]; } } - return idArray + + // copy all edges (if not fully clustered, else there are no edges) + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + this.sectors["frozen"][sectorId]["edges"][edgeId] = this.edges[edgeId]; + } + } + + // merge the nodeIndices + for (var i = 0; i < this.nodeIndices.length; i++) { + this.sectors["frozen"][sectorId]["nodeIndices"].push(this.nodeIndices[i]); + } }; + /** + * This clusters the sector to one cluster. It was a single cluster before this process started so + * we revert to that state. The clusterToFit function with a maximum size of 1 node does this. * - * retrieve the currently selected edges - * @return {Array} selection An array with the ids of the - * selected nodes. + * @private */ - exports.getSelectedEdges = function() { - var idArray = []; - for(var edgeId in this.selectionObj.edges) { - if(this.selectionObj.edges.hasOwnProperty(edgeId)) { - idArray.push(edgeId); - } - } - return idArray; + exports._collapseThisToSingleCluster = function() { + this.clusterToFit(1,false); }; /** - * select zero or more nodes - * @param {Number[] | String[]} selection An array with the ids of the - * selected nodes. + * We create a new active sector from the node that we want to open. + * + * @param node + * @private */ - exports.setSelection = function(selection) { - var i, iMax, id; + exports._addSector = function(node) { + // this is the currently active sector + var sector = this._sector(); - if (!selection || (selection.length == undefined)) - throw 'Selection must be an array with ids'; + // // this should allow me to select nodes from a frozen set. + // if (this.sectors['active'][sector]["nodes"].hasOwnProperty(node.id)) { + // console.log("the node is part of the active sector"); + // } + // else { + // console.log("I dont know what the fuck happened!!"); + // } - // first unselect any selected node - this._unselectAll(true); + // when we switch to a new sector, we remove the node that will be expanded from the current nodes list. + delete this.nodes[node.id]; - for (i = 0, iMax = selection.length; i < iMax; i++) { - id = selection[i]; + var unqiueIdentifier = util.randomUUID(); - var node = this.nodes[id]; - if (!node) { - throw new RangeError('Node with id "' + id + '" not found'); - } - this._selectObject(node,true,true); - } + // we fully freeze the currently active sector + this._freezeSector(sector); - console.log("setSelection is deprecated. Please use selectNodes instead.") + // we create a new active sector. This sector has the Id of the node to ensure uniqueness + this._createNewSector(unqiueIdentifier); - this.redraw(); + // we add the active sector to the sectors array to be able to revert these steps later on + this._setActiveSector(unqiueIdentifier); + + // we redirect the global references to the new sector's references. this._sector() now returns unqiueIdentifier + this._switchToSector(this._sector()); + + // finally we add the node we removed from our previous active sector to the new active sector + this.nodes[node.id] = node; }; /** - * select zero or more nodes with the option to highlight edges - * @param {Number[] | String[]} selection An array with the ids of the - * selected nodes. - * @param {boolean} [highlightEdges] + * We close the sector that is currently open and revert back to the one before. + * If the active sector is the "default" sector, nothing happens. + * + * @private */ - exports.selectNodes = function(selection, highlightEdges) { - var i, iMax, id; - - if (!selection || (selection.length == undefined)) - throw 'Selection must be an array with ids'; + exports._collapseSector = function() { + // the currently active sector + var sector = this._sector(); - // first unselect any selected node - this._unselectAll(true); + // we cannot collapse the default sector + if (sector != "default") { + if ((this.nodeIndices.length == 1) || + (this.sectors["active"][sector]["drawingNode"].width*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || + (this.sectors["active"][sector]["drawingNode"].height*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { + var previousSector = this._previousSector(); - for (i = 0, iMax = selection.length; i < iMax; i++) { - id = selection[i]; + // we collapse the sector back to a single cluster + this._collapseThisToSingleCluster(); - var node = this.nodes[id]; - if (!node) { - throw new RangeError('Node with id "' + id + '" not found'); - } - this._selectObject(node,true,true,highlightEdges); - } - this.redraw(); - }; + // we move the remaining nodes, edges and nodeIndices to the previous sector. + // This previous sector is the one we will reactivate + this._mergeThisWithFrozen(previousSector); + // the previously active (frozen) sector now has all the data from the currently active sector. + // we can now delete the active sector. + this._deleteActiveSector(sector); - /** - * select zero or more edges - * @param {Number[] | String[]} selection An array with the ids of the - * selected nodes. - */ - exports.selectEdges = function(selection) { - var i, iMax, id; + // we activate the previously active (and currently frozen) sector. + this._activateSector(previousSector); - if (!selection || (selection.length == undefined)) - throw 'Selection must be an array with ids'; + // we load the references from the newly active sector into the global references + this._switchToSector(previousSector); - // first unselect any selected node - this._unselectAll(true); + // we forget the previously active sector because we reverted to the one before + this._forgetLastSector(); - for (i = 0, iMax = selection.length; i < iMax; i++) { - id = selection[i]; + // finally, we update the node index list. + this._updateNodeIndexList(); - var edge = this.edges[id]; - if (!edge) { - throw new RangeError('Edge with id "' + id + '" not found'); + // we refresh the list with calulation nodes and calculation node indices. + this._updateCalculationNodes(); } - this._selectObject(edge,true,true,highlightEdges); } - this.redraw(); }; + /** - * Validate the selection: remove ids of nodes which no longer exist + * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). + * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we dont pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction * @private */ - exports._updateSelection = function () { - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - if (!this.nodes.hasOwnProperty(nodeId)) { - delete this.selectionObj.nodes[nodeId]; + exports._doInAllActiveSectors = function(runFunction,argument) { + if (argument === undefined) { + for (var sector in this.sectors["active"]) { + if (this.sectors["active"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToActiveSector(sector); + this[runFunction](); } } } - for(var edgeId in this.selectionObj.edges) { - if(this.selectionObj.edges.hasOwnProperty(edgeId)) { - if (!this.edges.hasOwnProperty(edgeId)) { - delete this.selectionObj.edges[edgeId]; + else { + for (var sector in this.sectors["active"]) { + if (this.sectors["active"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToActiveSector(sector); + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + this[runFunction](args[0],args[1]); + } + else { + this[runFunction](argument); + } } } } + // we revert the global references back to our active sector + this._loadLatestSector(); }; -/***/ }, -/* 56 */ -/***/ function(module, exports, __webpack_require__) { - - var util = __webpack_require__(1); - var Node = __webpack_require__(36); - var Edge = __webpack_require__(33); - /** - * clears the toolbar div element of children + * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we dont pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction * @private */ - exports._clearManipulatorBar = function() { - while (this.manipulationDiv.hasChildNodes()) { - this.manipulationDiv.removeChild(this.manipulationDiv.firstChild); + exports._doInSupportSector = function(runFunction,argument) { + if (argument === undefined) { + this._switchToSupportSector(); + this[runFunction](); + } + else { + this._switchToSupportSector(); + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + this[runFunction](args[0],args[1]); + } + else { + this[runFunction](argument); + } } + // we revert the global references back to our active sector + this._loadLatestSector(); }; + /** - * Manipulation UI temporarily overloads certain functions to extend or replace them. To be able to restore - * these functions to their original functionality, we saved them in this.cachedFunctions. - * This function restores these functions to their original function. + * This runs a function in all frozen sectors. This is used in the _redraw(). * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we don't pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction * @private */ - exports._restoreOverloadedFunctions = function() { - for (var functionName in this.cachedFunctions) { - if (this.cachedFunctions.hasOwnProperty(functionName)) { - this[functionName] = this.cachedFunctions[functionName]; + exports._doInAllFrozenSectors = function(runFunction,argument) { + if (argument === undefined) { + for (var sector in this.sectors["frozen"]) { + if (this.sectors["frozen"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToFrozenSector(sector); + this[runFunction](); + } + } + } + else { + for (var sector in this.sectors["frozen"]) { + if (this.sectors["frozen"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToFrozenSector(sector); + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + this[runFunction](args[0],args[1]); + } + else { + this[runFunction](argument); + } + } } } + this._loadLatestSector(); }; + /** - * Enable or disable edit-mode. + * This runs a function in all sectors. This is used in the _redraw(). * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we don't pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction * @private */ - exports._toggleEditMode = function() { - this.editMode = !this.editMode; - var toolbar = document.getElementById("network-manipulationDiv"); - var closeDiv = document.getElementById("network-manipulation-closeDiv"); - var editModeDiv = document.getElementById("network-manipulation-editMode"); - if (this.editMode == true) { - toolbar.style.display="block"; - closeDiv.style.display="block"; - editModeDiv.style.display="none"; - closeDiv.onclick = this._toggleEditMode.bind(this); + exports._doInAllSectors = function(runFunction,argument) { + var args = Array.prototype.splice.call(arguments, 1); + if (argument === undefined) { + this._doInAllActiveSectors(runFunction); + this._doInAllFrozenSectors(runFunction); } else { - toolbar.style.display="none"; - closeDiv.style.display="none"; - editModeDiv.style.display="block"; - closeDiv.onclick = null; + if (args.length > 1) { + this._doInAllActiveSectors(runFunction,args[0],args[1]); + this._doInAllFrozenSectors(runFunction,args[0],args[1]); + } + else { + this._doInAllActiveSectors(runFunction,argument); + this._doInAllFrozenSectors(runFunction,argument); + } } - this._createManipulatorBar() }; + /** - * main function, creates the main toolbar. Removes functions bound to the select event. Binds all the buttons of the toolbar. + * This clears the nodeIndices list. We cannot use this.nodeIndices = [] because we would break the link with the + * active sector. Thus we clear the nodeIndices in the active sector, then reconnect the this.nodeIndices to it. * * @private */ - exports._createManipulatorBar = function() { - // remove bound functions - if (this.boundFunction) { - this.off('select', this.boundFunction); - } - - var locale = this.constants.locales[this.constants.locale]; - - if (this.edgeBeingEdited !== undefined) { - this.edgeBeingEdited._disableControlNodes(); - this.edgeBeingEdited = undefined; - this.selectedControlNode = null; - this.controlNodesActive = false; - } - - // restore overloaded functions - this._restoreOverloadedFunctions(); - - // resume calculation - this.freezeSimulation = false; - - // reset global variables - this.blockConnectingEdgeSelection = false; - this.forceAppendSelection = false; + exports._clearNodeIndexList = function() { + var sector = this._sector(); + this.sectors["active"][sector]["nodeIndices"] = []; + this.nodeIndices = this.sectors["active"][sector]["nodeIndices"]; + }; - if (this.editMode == true) { - while (this.manipulationDiv.hasChildNodes()) { - this.manipulationDiv.removeChild(this.manipulationDiv.firstChild); - } - // add the icons to the manipulator div - this.manipulationDiv.innerHTML = "" + - "" + - ""+locale['addNode'] +"" + - "
" + - "" + - ""+locale['addEdge'] +""; - if (this._getSelectedNodeCount() == 1 && this.triggerFunctions.edit) { - this.manipulationDiv.innerHTML += "" + - "
" + - "" + - ""+locale['editNode'] +""; - } - else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { - this.manipulationDiv.innerHTML += "" + - "
" + - "" + - ""+locale['editEdge'] +""; - } - if (this._selectionIsEmpty() == false) { - this.manipulationDiv.innerHTML += "" + - "
" + - "" + - ""+locale['del'] +""; - } + /** + * Draw the encompassing sector node + * + * @param ctx + * @param sectorType + * @private + */ + exports._drawSectorNodes = function(ctx,sectorType) { + var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; + for (var sector in this.sectors[sectorType]) { + if (this.sectors[sectorType].hasOwnProperty(sector)) { + if (this.sectors[sectorType][sector]["drawingNode"] !== undefined) { + this._switchToSector(sector,sectorType); - // bind the icons - var addNodeButton = document.getElementById("network-manipulate-addNode"); - addNodeButton.onclick = this._createAddNodeToolbar.bind(this); - var addEdgeButton = document.getElementById("network-manipulate-connectNode"); - addEdgeButton.onclick = this._createAddEdgeToolbar.bind(this); - if (this._getSelectedNodeCount() == 1 && this.triggerFunctions.edit) { - var editButton = document.getElementById("network-manipulate-editNode"); - editButton.onclick = this._editNode.bind(this); - } - else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { - var editButton = document.getElementById("network-manipulate-editEdge"); - editButton.onclick = this._createEditEdgeToolbar.bind(this); - } - if (this._selectionIsEmpty() == false) { - var deleteButton = document.getElementById("network-manipulate-delete"); - deleteButton.onclick = this._deleteSelected.bind(this); + minY = 1e9; maxY = -1e9; minX = 1e9; maxX = -1e9; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + node.resize(ctx); + if (minX > node.x - 0.5 * node.width) {minX = node.x - 0.5 * node.width;} + if (maxX < node.x + 0.5 * node.width) {maxX = node.x + 0.5 * node.width;} + if (minY > node.y - 0.5 * node.height) {minY = node.y - 0.5 * node.height;} + if (maxY < node.y + 0.5 * node.height) {maxY = node.y + 0.5 * node.height;} + } + } + node = this.sectors[sectorType][sector]["drawingNode"]; + node.x = 0.5 * (maxX + minX); + node.y = 0.5 * (maxY + minY); + node.width = 2 * (node.x - minX); + node.height = 2 * (node.y - minY); + node.radius = Math.sqrt(Math.pow(0.5*node.width,2) + Math.pow(0.5*node.height,2)); + node.setScale(this.scale); + node._drawCircle(ctx); + } } - var closeDiv = document.getElementById("network-manipulation-closeDiv"); - closeDiv.onclick = this._toggleEditMode.bind(this); - - this.boundFunction = this._createManipulatorBar.bind(this); - this.on('select', this.boundFunction); - } - else { - this.editModeDiv.innerHTML = "" + - "" + - "" + locale['edit'] + ""; - var editModeButton = document.getElementById("network-manipulate-editModeButton"); - editModeButton.onclick = this._toggleEditMode.bind(this); } }; + exports._drawAllSectorNodes = function(ctx) { + this._drawSectorNodes(ctx,"frozen"); + this._drawSectorNodes(ctx,"active"); + this._loadLatestSector(); + }; + + +/***/ }, +/* 59 */ +/***/ function(module, exports, __webpack_require__) { + var Node = __webpack_require__(49); /** - * Create the toolbar for adding Nodes + * This function can be called from the _doInAllSectors function * + * @param object + * @param overlappingNodes * @private */ - exports._createAddNodeToolbar = function() { - // clear the toolbar - this._clearManipulatorBar(); - if (this.boundFunction) { - this.off('select', this.boundFunction); + exports._getNodesOverlappingWith = function(object, overlappingNodes) { + var nodes = this.nodes; + for (var nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + if (nodes[nodeId].isOverlappingWith(object)) { + overlappingNodes.push(nodeId); + } + } } + }; - var locale = this.constants.locales[this.constants.locale]; + /** + * retrieve all nodes overlapping with given object + * @param {Object} object An object with parameters left, top, right, bottom + * @return {Number[]} An array with id's of the overlapping nodes + * @private + */ + exports._getAllNodesOverlappingWith = function (object) { + var overlappingNodes = []; + this._doInAllActiveSectors("_getNodesOverlappingWith",object,overlappingNodes); + return overlappingNodes; + }; - // create the toolbar contents - this.manipulationDiv.innerHTML = "" + - "" + - "" + locale['back'] + " " + - "
" + - "" + - "" + locale['addDescription'] + ""; - // bind the icon - var backButton = document.getElementById("network-manipulate-back"); - backButton.onclick = this._createManipulatorBar.bind(this); + /** + * Return a position object in canvasspace from a single point in screenspace + * + * @param pointer + * @returns {{left: number, top: number, right: number, bottom: number}} + * @private + */ + exports._pointerToPositionObject = function(pointer) { + var x = this._XconvertDOMtoCanvas(pointer.x); + var y = this._YconvertDOMtoCanvas(pointer.y); - // we use the boundFunction so we can reference it when we unbind it from the "select" event. - this.boundFunction = this._addNode.bind(this); - this.on('select', this.boundFunction); + return { + left: x, + top: y, + right: x, + bottom: y + }; }; /** - * create the toolbar to connect nodes + * Get the top node at the a specific point (like a click) * + * @param {{x: Number, y: Number}} pointer + * @return {Node | null} node * @private */ - exports._createAddEdgeToolbar = function() { - // clear the toolbar - this._clearManipulatorBar(); - this._unselectAll(true); - this.freezeSimulation = true; - - var locale = this.constants.locales[this.constants.locale]; + exports._getNodeAt = function (pointer) { + // we first check if this is an navigation controls element + var positionObject = this._pointerToPositionObject(pointer); + var overlappingNodes = this._getAllNodesOverlappingWith(positionObject); - if (this.boundFunction) { - this.off('select', this.boundFunction); + // if there are overlapping nodes, select the last one, this is the + // one which is drawn on top of the others + if (overlappingNodes.length > 0) { + return this.nodes[overlappingNodes[overlappingNodes.length - 1]]; } + else { + return null; + } + }; - this._unselectAll(); - this.forceAppendSelection = false; - this.blockConnectingEdgeSelection = true; - - this.manipulationDiv.innerHTML = "" + - "" + - "" + locale['back'] + " " + - "
" + - "" + - "" + locale['edgeDescription'] + ""; - - // bind the icon - var backButton = document.getElementById("network-manipulate-back"); - backButton.onclick = this._createManipulatorBar.bind(this); - // we use the boundFunction so we can reference it when we unbind it from the "select" event. - this.boundFunction = this._handleConnect.bind(this); - this.on('select', this.boundFunction); + /** + * retrieve all edges overlapping with given object, selector is around center + * @param {Object} object An object with parameters left, top, right, bottom + * @return {Number[]} An array with id's of the overlapping nodes + * @private + */ + exports._getEdgesOverlappingWith = function (object, overlappingEdges) { + var edges = this.edges; + for (var edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + if (edges[edgeId].isOverlappingWith(object)) { + overlappingEdges.push(edgeId); + } + } + } + }; - // temporarily overload functions - this.cachedFunctions["_handleTouch"] = this._handleTouch; - this.cachedFunctions["_handleOnRelease"] = this._handleOnRelease; - this._handleTouch = this._handleConnect; - this._handleOnRelease = this._finishConnect; - // redraw to show the unselect - this._redraw(); + /** + * retrieve all nodes overlapping with given object + * @param {Object} object An object with parameters left, top, right, bottom + * @return {Number[]} An array with id's of the overlapping nodes + * @private + */ + exports._getAllEdgesOverlappingWith = function (object) { + var overlappingEdges = []; + this._doInAllActiveSectors("_getEdgesOverlappingWith",object,overlappingEdges); + return overlappingEdges; }; /** - * create the toolbar to edit edges + * Place holder. To implement change the _getNodeAt to a _getObjectAt. Have the _getObjectAt call + * _getNodeAt and _getEdgesAt, then priortize the selection to user preferences. * + * @param pointer + * @returns {null} * @private */ - exports._createEditEdgeToolbar = function() { - // clear the toolbar - this._clearManipulatorBar(); - this.controlNodesActive = true; + exports._getEdgeAt = function(pointer) { + var positionObject = this._pointerToPositionObject(pointer); + var overlappingEdges = this._getAllEdgesOverlappingWith(positionObject); - if (this.boundFunction) { - this.off('select', this.boundFunction); + if (overlappingEdges.length > 0) { + return this.edges[overlappingEdges[overlappingEdges.length - 1]]; + } + else { + return null; } - - this.edgeBeingEdited = this._getSelectedEdge(); - this.edgeBeingEdited._enableControlNodes(); - - var locale = this.constants.locales[this.constants.locale]; - - this.manipulationDiv.innerHTML = "" + - "" + - "" + locale['back'] + " " + - "
" + - "" + - "" + locale['editEdgeDescription'] + ""; - - // bind the icon - var backButton = document.getElementById("network-manipulate-back"); - backButton.onclick = this._createManipulatorBar.bind(this); - - // temporarily overload functions - this.cachedFunctions["_handleTouch"] = this._handleTouch; - this.cachedFunctions["_handleOnRelease"] = this._handleOnRelease; - this.cachedFunctions["_handleTap"] = this._handleTap; - this.cachedFunctions["_handleDragStart"] = this._handleDragStart; - this.cachedFunctions["_handleOnDrag"] = this._handleOnDrag; - this._handleTouch = this._selectControlNode; - this._handleTap = function () {}; - this._handleOnDrag = this._controlNodeDrag; - this._handleDragStart = function () {} - this._handleOnRelease = this._releaseControlNode; - - // redraw to show the unselect - this._redraw(); }; - - + /** + * Add object to the selection array. + * + * @param obj + * @private + */ + exports._addToSelection = function(obj) { + if (obj instanceof Node) { + this.selectionObj.nodes[obj.id] = obj; + } + else { + this.selectionObj.edges[obj.id] = obj; + } + }; /** - * the function bound to the selection event. It checks if you want to connect a cluster and changes the description - * to walk the user through the process. + * Add object to the selection array. * + * @param obj * @private */ - exports._selectControlNode = function(pointer) { - this.edgeBeingEdited.controlNodes.from.unselect(); - this.edgeBeingEdited.controlNodes.to.unselect(); - this.selectedControlNode = this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(pointer.x),this._YconvertDOMtoCanvas(pointer.y)); - if (this.selectedControlNode !== null) { - this.selectedControlNode.select(); - this.freezeSimulation = true; + exports._addToHover = function(obj) { + if (obj instanceof Node) { + this.hoverObj.nodes[obj.id] = obj; + } + else { + this.hoverObj.edges[obj.id] = obj; } - this._redraw(); }; + /** - * the function bound to the selection event. It checks if you want to connect a cluster and changes the description - * to walk the user through the process. + * Remove a single option from selection. * + * @param {Object} obj * @private */ - exports._controlNodeDrag = function(event) { - var pointer = this._getPointer(event.gesture.center); - if (this.selectedControlNode !== null && this.selectedControlNode !== undefined) { - this.selectedControlNode.x = this._XconvertDOMtoCanvas(pointer.x); - this.selectedControlNode.y = this._YconvertDOMtoCanvas(pointer.y); + exports._removeFromSelection = function(obj) { + if (obj instanceof Node) { + delete this.selectionObj.nodes[obj.id]; + } + else { + delete this.selectionObj.edges[obj.id]; } - this._redraw(); }; - exports._releaseControlNode = function(pointer) { - var newNode = this._getNodeAt(pointer); - if (newNode != null) { - if (this.edgeBeingEdited.controlNodes.from.selected == true) { - this._editEdge(newNode.id, this.edgeBeingEdited.to.id); - this.edgeBeingEdited.controlNodes.from.unselect(); + /** + * Unselect all. The selectionObj is useful for this. + * + * @param {Boolean} [doNotTrigger] | ignore trigger + * @private + */ + exports._unselectAll = function(doNotTrigger) { + if (doNotTrigger === undefined) { + doNotTrigger = false; + } + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + this.selectionObj.nodes[nodeId].unselect(); } - if (this.edgeBeingEdited.controlNodes.to.selected == true) { - this._editEdge(this.edgeBeingEdited.from.id, newNode.id); - this.edgeBeingEdited.controlNodes.to.unselect(); + } + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + this.selectionObj.edges[edgeId].unselect(); } } - else { - this.edgeBeingEdited._restoreControlNodes(); + + this.selectionObj = {nodes:{},edges:{}}; + + if (doNotTrigger == false) { + this.emit('select', this.getSelection()); } - this.freezeSimulation = false; - this._redraw(); }; /** - * the function bound to the selection event. It checks if you want to connect a cluster and changes the description - * to walk the user through the process. + * Unselect all clusters. The selectionObj is useful for this. * + * @param {Boolean} [doNotTrigger] | ignore trigger * @private */ - exports._handleConnect = function(pointer) { - if (this._getSelectedNodeCount() == 0) { - var node = this._getNodeAt(pointer); + exports._unselectClusters = function(doNotTrigger) { + if (doNotTrigger === undefined) { + doNotTrigger = false; + } - if (node != null) { - if (node.clusterSize > 1) { - alert(this.constants.locales[this.constants.locale]['createEdgeError']) + for (var nodeId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { + if (this.selectionObj.nodes[nodeId].clusterSize > 1) { + this.selectionObj.nodes[nodeId].unselect(); + this._removeFromSelection(this.selectionObj.nodes[nodeId]); } - else { - this._selectObject(node,false); - // create a node the temporary line can look at - this.sectors['support']['nodes']['targetNode'] = new Node({id:'targetNode'},{},{},this.constants); - this.sectors['support']['nodes']['targetNode'].x = node.x; - this.sectors['support']['nodes']['targetNode'].y = node.y; - this.sectors['support']['nodes']['targetViaNode'] = new Node({id:'targetViaNode'},{},{},this.constants); - this.sectors['support']['nodes']['targetViaNode'].x = node.x; - this.sectors['support']['nodes']['targetViaNode'].y = node.y; - this.sectors['support']['nodes']['targetViaNode'].parentEdgeId = "connectionEdge"; + } + } - // create a temporary edge - this.edges['connectionEdge'] = new Edge({id:"connectionEdge",from:node.id,to:this.sectors['support']['nodes']['targetNode'].id}, this, this.constants); - this.edges['connectionEdge'].from = node; - this.edges['connectionEdge'].connected = true; - this.edges['connectionEdge'].smooth = true; - this.edges['connectionEdge'].selected = true; - this.edges['connectionEdge'].to = this.sectors['support']['nodes']['targetNode']; - this.edges['connectionEdge'].via = this.sectors['support']['nodes']['targetViaNode']; + if (doNotTrigger == false) { + this.emit('select', this.getSelection()); + } + }; - this.cachedFunctions["_handleOnDrag"] = this._handleOnDrag; - this._handleOnDrag = function(event) { - var pointer = this._getPointer(event.gesture.center); - this.sectors['support']['nodes']['targetNode'].x = this._XconvertDOMtoCanvas(pointer.x); - this.sectors['support']['nodes']['targetNode'].y = this._YconvertDOMtoCanvas(pointer.y); - this.sectors['support']['nodes']['targetViaNode'].x = 0.5 * (this._XconvertDOMtoCanvas(pointer.x) + this.edges['connectionEdge'].from.x); - this.sectors['support']['nodes']['targetViaNode'].y = this._YconvertDOMtoCanvas(pointer.y); - }; - this.moving = true; - this.start(); - } + /** + * return the number of selected nodes + * + * @returns {number} + * @private + */ + exports._getSelectedNodeCount = function() { + var count = 0; + for (var nodeId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { + count += 1; } } + return count; }; - exports._finishConnect = function(pointer) { - if (this._getSelectedNodeCount() == 1) { - - // restore the drag function - this._handleOnDrag = this.cachedFunctions["_handleOnDrag"]; - delete this.cachedFunctions["_handleOnDrag"]; - - // remember the edge id - var connectFromId = this.edges['connectionEdge'].fromId; - - // remove the temporary nodes and edge - delete this.edges['connectionEdge']; - delete this.sectors['support']['nodes']['targetNode']; - delete this.sectors['support']['nodes']['targetViaNode']; - - var node = this._getNodeAt(pointer); - if (node != null) { - if (node.clusterSize > 1) { - alert(this.constants.locales[this.constants.locale]["createEdgeError"]) - } - else { - this._createEdge(connectFromId,node.id); - this._createManipulatorBar(); - } + /** + * return the selected node + * + * @returns {number} + * @private + */ + exports._getSelectedNode = function() { + for (var nodeId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { + return this.selectionObj.nodes[nodeId]; } - this._unselectAll(); } + return null; }; - /** - * Adds a node on the specified location + * return the selected edge + * + * @returns {number} + * @private */ - exports._addNode = function() { - if (this._selectionIsEmpty() && this.editMode == true) { - var positionObject = this._pointerToPositionObject(this.pointerPosition); - var defaultData = {id:util.randomUUID(),x:positionObject.left,y:positionObject.top,label:"new",allowedToMoveX:true,allowedToMoveY:true}; - if (this.triggerFunctions.add) { - if (this.triggerFunctions.add.length == 2) { - var me = this; - this.triggerFunctions.add(defaultData, function(finalizedData) { - me.nodesData.add(finalizedData); - me._createManipulatorBar(); - me.moving = true; - me.start(); - }); - } - else { - throw new Error('The function for add does not support two arguments (data,callback)'); - this._createManipulatorBar(); - this.moving = true; - this.start(); - } - } - else { - this.nodesData.add(defaultData); - this._createManipulatorBar(); - this.moving = true; - this.start(); + exports._getSelectedEdge = function() { + for (var edgeId in this.selectionObj.edges) { + if (this.selectionObj.edges.hasOwnProperty(edgeId)) { + return this.selectionObj.edges[edgeId]; } } + return null; }; /** - * connect two nodes with a new edge. + * return the number of selected edges * + * @returns {number} * @private */ - exports._createEdge = function(sourceNodeId,targetNodeId) { - if (this.editMode == true) { - var defaultData = {from:sourceNodeId, to:targetNodeId}; - if (this.triggerFunctions.connect) { - if (this.triggerFunctions.connect.length == 2) { - var me = this; - this.triggerFunctions.connect(defaultData, function(finalizedData) { - me.edgesData.add(finalizedData); - me.moving = true; - me.start(); - }); - } - else { - throw new Error('The function for connect does not support two arguments (data,callback)'); - this.moving = true; - this.start(); - } - } - else { - this.edgesData.add(defaultData); - this.moving = true; - this.start(); + exports._getSelectedEdgeCount = function() { + var count = 0; + for (var edgeId in this.selectionObj.edges) { + if (this.selectionObj.edges.hasOwnProperty(edgeId)) { + count += 1; } } + return count; }; + /** - * connect two nodes with a new edge. + * return the number of selected objects. * + * @returns {number} * @private */ - exports._editEdge = function(sourceNodeId,targetNodeId) { - if (this.editMode == true) { - var defaultData = {id: this.edgeBeingEdited.id, from:sourceNodeId, to:targetNodeId}; - if (this.triggerFunctions.editEdge) { - if (this.triggerFunctions.editEdge.length == 2) { - var me = this; - this.triggerFunctions.editEdge(defaultData, function(finalizedData) { - me.edgesData.update(finalizedData); - me.moving = true; - me.start(); - }); - } - else { - throw new Error('The function for edit does not support two arguments (data, callback)'); - this.moving = true; - this.start(); - } + exports._getSelectedObjectCount = function() { + var count = 0; + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + count += 1; } - else { - this.edgesData.update(defaultData); - this.moving = true; - this.start(); + } + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + count += 1; } } + return count; }; /** - * Create the toolbar to edit the selected node. The label and the color can be changed. Other colors are derived from the chosen color. + * Check if anything is selected * + * @returns {boolean} * @private */ - exports._editNode = function() { - if (this.triggerFunctions.edit && this.editMode == true) { - var node = this._getSelectedNode(); - var data = {id:node.id, - label: node.label, - group: node.options.group, - shape: node.options.shape, - color: { - background:node.options.color.background, - border:node.options.color.border, - highlight: { - background:node.options.color.highlight.background, - border:node.options.color.highlight.border - } - }}; - if (this.triggerFunctions.edit.length == 2) { - var me = this; - this.triggerFunctions.edit(data, function (finalizedData) { - me.nodesData.update(finalizedData); - me._createManipulatorBar(); - me.moving = true; - me.start(); - }); - } - else { - throw new Error('The function for edit does not support two arguments (data, callback)'); + exports._selectionIsEmpty = function() { + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + return false; } } - else { - throw new Error('No edit function has been bound to this button'); + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + return false; + } } + return true; }; - - /** - * delete everything in the selection + * check if one of the selected nodes is a cluster. * + * @returns {boolean} * @private */ - exports._deleteSelected = function() { - if (!this._selectionIsEmpty() && this.editMode == true) { - if (!this._clusterInSelection()) { - var selectedNodes = this.getSelectedNodes(); - var selectedEdges = this.getSelectedEdges(); - if (this.triggerFunctions.del) { - var me = this; - var data = {nodes: selectedNodes, edges: selectedEdges}; - if (this.triggerFunctions.del.length = 2) { - this.triggerFunctions.del(data, function (finalizedData) { - me.edgesData.remove(finalizedData.edges); - me.nodesData.remove(finalizedData.nodes); - me._unselectAll(); - me.moving = true; - me.start(); - }); - } - else { - throw new Error('The function for delete does not support two arguments (data, callback)') - } - } - else { - this.edgesData.remove(selectedEdges); - this.nodesData.remove(selectedNodes); - this._unselectAll(); - this.moving = true; - this.start(); + exports._clusterInSelection = function() { + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + if (this.selectionObj.nodes[nodeId].clusterSize > 1) { + return true; } } - else { - alert(this.constants.locales[this.constants.locale]["deleteClusterError"]); - } } - }; - - -/***/ }, -/* 57 */ -/***/ function(module, exports, __webpack_require__) { - - var util = __webpack_require__(1); - var Hammer = __webpack_require__(41); - - exports._cleanNavigation = function() { - // clean up previous navigation items - var wrapper = document.getElementById('network-navigation_wrapper'); - if (wrapper && wrapper.parentNode) { - wrapper.parentNode.removeChild(wrapper); - } - document.onmouseup = null; + return false; }; /** - * Creation of the navigation controls nodes. They are drawn over the rest of the nodes and are not affected by scale and translation - * they have a triggerFunction which is called on click. If the position of the navigation controls is dependent - * on this.frame.canvas.clientWidth or this.frame.canvas.clientHeight, we flag horizontalAlignLeft and verticalAlignTop false. - * This means that the location will be corrected by the _relocateNavigation function on a size change of the canvas. + * select the edges connected to the node that is being selected * + * @param {Node} node * @private */ - exports._loadNavigationElements = function() { - this._cleanNavigation(); - - this.navigationDivs = {}; - var navigationDivs = ['up','down','left','right','zoomIn','zoomOut','zoomExtends']; - var navigationDivActions = ['_moveUp','_moveDown','_moveLeft','_moveRight','_zoomIn','_zoomOut','zoomExtent']; - - this.navigationDivs['wrapper'] = document.createElement('div'); - this.navigationDivs['wrapper'].id = 'network-navigation_wrapper'; - this.frame.appendChild(this.navigationDivs['wrapper']); - - var me = this; - for (var i = 0; i < navigationDivs.length; i++) { - this.navigationDivs[navigationDivs[i]] = document.createElement('div'); - this.navigationDivs[navigationDivs[i]].id = 'network-navigation_' + navigationDivs[i]; - this.navigationDivs[navigationDivs[i]].className = 'network-navigation ' + navigationDivs[i]; - this.navigationDivs['wrapper'].appendChild(this.navigationDivs[navigationDivs[i]]); - var hammer = Hammer(this.navigationDivs[navigationDivs[i]], {prevent_default: true}); - hammer.on('touch', me[navigationDivActions[i]].bind(me)); + exports._selectConnectedEdges = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + var edge = node.dynamicEdges[i]; + edge.select(); + this._addToSelection(edge); } - var hammer = Hammer(document, {prevent_default: false}); - hammer.on('release', me._stopMovement.bind(me)); }; /** - * this stops all movement induced by the navigation buttons + * select the edges connected to the node that is being selected * + * @param {Node} node * @private */ - exports._stopMovement = function() { - this._xStopMoving(); - this._yStopMoving(); - this._stopZoom(); + exports._hoverConnectedEdges = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + var edge = node.dynamicEdges[i]; + edge.hover = true; + this._addToHover(edge); + } }; /** - * move the screen up - * By using the increments, instead of adding a fixed number to the translation, we keep fluent and - * instant movement. The onKeypress event triggers immediately, then pauses, then triggers frequently - * To avoid this behaviour, we do the translation in the start loop. + * unselect the edges connected to the node that is being selected * + * @param {Node} node * @private */ - exports._moveUp = function(event) { - this.yIncrement = this.constants.keyboard.speed.y; - this.start(); // if there is no node movement, the calculation wont be done - event.preventDefault(); + exports._unselectConnectedEdges = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + var edge = node.dynamicEdges[i]; + edge.unselect(); + this._removeFromSelection(edge); + } }; - /** - * move the screen down - * @private - */ - exports._moveDown = function(event) { - this.yIncrement = -this.constants.keyboard.speed.y; - this.start(); // if there is no node movement, the calculation wont be done - event.preventDefault(); - }; /** - * move the screen left + * This is called when someone clicks on a node. either select or deselect it. + * If there is an existing selection and we don't want to append to it, clear the existing selection + * + * @param {Node || Edge} object + * @param {Boolean} append + * @param {Boolean} [doNotTrigger] | ignore trigger * @private */ - exports._moveLeft = function(event) { - this.xIncrement = this.constants.keyboard.speed.x; - this.start(); // if there is no node movement, the calculation wont be done - event.preventDefault(); - }; + exports._selectObject = function(object, append, doNotTrigger, highlightEdges) { + if (doNotTrigger === undefined) { + doNotTrigger = false; + } + if (highlightEdges === undefined) { + highlightEdges = true; + } + if (this._selectionIsEmpty() == false && append == false && this.forceAppendSelection == false) { + this._unselectAll(true); + } - /** - * move the screen right - * @private - */ - exports._moveRight = function(event) { - this.xIncrement = -this.constants.keyboard.speed.y; - this.start(); // if there is no node movement, the calculation wont be done - event.preventDefault(); + if (object.selected == false) { + object.select(); + this._addToSelection(object); + if (object instanceof Node && this.blockConnectingEdgeSelection == false && highlightEdges == true) { + this._selectConnectedEdges(object); + } + } + else { + object.unselect(); + this._removeFromSelection(object); + } + + if (doNotTrigger == false) { + this.emit('select', this.getSelection()); + } }; /** - * Zoom in, using the same method as the movement. + * This is called when someone clicks on a node. either select or deselect it. + * If there is an existing selection and we don't want to append to it, clear the existing selection + * + * @param {Node || Edge} object * @private */ - exports._zoomIn = function(event) { - this.zoomIncrement = this.constants.keyboard.speed.zoom; - this.start(); // if there is no node movement, the calculation wont be done - event.preventDefault(); + exports._blurObject = function(object) { + if (object.hover == true) { + object.hover = false; + this.emit("blurNode",{node:object.id}); + } }; - /** - * Zoom out + * This is called when someone clicks on a node. either select or deselect it. + * If there is an existing selection and we don't want to append to it, clear the existing selection + * + * @param {Node || Edge} object * @private */ - exports._zoomOut = function(event) { - this.zoomIncrement = -this.constants.keyboard.speed.zoom; - this.start(); // if there is no node movement, the calculation wont be done - event.preventDefault(); + exports._hoverObject = function(object) { + if (object.hover == false) { + object.hover = true; + this._addToHover(object); + if (object instanceof Node) { + this.emit("hoverNode",{node:object.id}); + } + } + if (object instanceof Node) { + this._hoverConnectedEdges(object); + } }; /** - * Stop zooming and unhighlight the zoom controls + * handles the selection part of the touch, only for navigation controls elements; + * Touch is triggered before tap, also before hold. Hold triggers after a while. + * This is the most responsive solution + * + * @param {Object} pointer * @private */ - exports._stopZoom = function(event) { - this.zoomIncrement = 0; - event && event.preventDefault(); + exports._handleTouch = function(pointer) { }; /** - * Stop moving in the Y direction and unHighlight the up and down + * handles the selection part of the tap; + * + * @param {Object} pointer * @private */ - exports._yStopMoving = function(event) { - this.yIncrement = 0; - event && event.preventDefault(); + exports._handleTap = function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null) { + this._selectObject(node,false); + } + else { + var edge = this._getEdgeAt(pointer); + if (edge != null) { + this._selectObject(edge,false); + } + else { + this._unselectAll(); + } + } + this.emit("click", this.getSelection()); + this._redraw(); }; /** - * Stop moving in the X direction and unHighlight left and right. + * handles the selection part of the double tap and opens a cluster if needed + * + * @param {Object} pointer * @private */ - exports._xStopMoving = function(event) { - this.xIncrement = 0; - event && event.preventDefault(); + exports._handleDoubleTap = function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null && node !== undefined) { + // we reset the areaCenter here so the opening of the node will occur + this.areaCenter = {"x" : this._XconvertDOMtoCanvas(pointer.x), + "y" : this._YconvertDOMtoCanvas(pointer.y)}; + this.openCluster(node); + } + this.emit("doubleClick", this.getSelection()); }; -/***/ }, -/* 58 */ -/***/ function(module, exports, __webpack_require__) { - - exports._resetLevels = function() { - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - var node = this.nodes[nodeId]; - if (node.preassignedLevel == false) { - node.level = -1; - } + /** + * Handle the onHold selection part + * + * @param pointer + * @private + */ + exports._handleOnHold = function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null) { + this._selectObject(node,true); + } + else { + var edge = this._getEdgeAt(pointer); + if (edge != null) { + this._selectObject(edge,true); } } + this._redraw(); }; + /** - * This is the main function to layout the nodes in a hierarchical way. - * It checks if the node details are supplied correctly + * handle the onRelease event. These functions are here for the navigation controls module. * - * @private + * @private */ - exports._setupHierarchicalLayout = function() { - if (this.constants.hierarchicalLayout.enabled == true && this.nodeIndices.length > 0) { - if (this.constants.hierarchicalLayout.direction == "RL" || this.constants.hierarchicalLayout.direction == "DU") { - this.constants.hierarchicalLayout.levelSeparation *= -1; - } - else { - this.constants.hierarchicalLayout.levelSeparation = Math.abs(this.constants.hierarchicalLayout.levelSeparation); - } - - if (this.constants.hierarchicalLayout.direction == "RL" || this.constants.hierarchicalLayout.direction == "LR") { - if (this.constants.smoothCurves.enabled == true) { - this.constants.smoothCurves.type = "vertical"; - } - } - else { - if (this.constants.smoothCurves.enabled == true) { - this.constants.smoothCurves.type = "horizontal"; - } - } - // get the size of the largest hubs and check if the user has defined a level for a node. - var hubsize = 0; - var node, nodeId; - var definedLevel = false; - var undefinedLevel = false; + exports._handleOnRelease = function(pointer) { - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (node.level != -1) { - definedLevel = true; - } - else { - undefinedLevel = true; - } - if (hubsize < node.edges.length) { - hubsize = node.edges.length; - } - } - } + }; - // if the user defined some levels but not all, alert and run without hierarchical layout - if (undefinedLevel == true && definedLevel == true) { - throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes."); - this.zoomExtent(true,this.constants.clustering.enabled); - if (!this.constants.clustering.enabled) { - this.start(); - } - } - else { - // setup the system to use hierarchical method. - this._changeConstants(); - // define levels if undefined by the users. Based on hubsize - if (undefinedLevel == true) { - this._determineLevels(hubsize); - } - // check the distribution of the nodes per level. - var distribution = this._getDistribution(); - // place the nodes on the canvas. This also stablilizes the system. - this._placeNodesByHierarchy(distribution); + /** + * + * retrieve the currently selected objects + * @return {{nodes: Array., edges: Array.}} selection + */ + exports.getSelection = function() { + var nodeIds = this.getSelectedNodes(); + var edgeIds = this.getSelectedEdges(); + return {nodes:nodeIds, edges:edgeIds}; + }; - // start the simulation. - this.start(); + /** + * + * retrieve the currently selected nodes + * @return {String[]} selection An array with the ids of the + * selected nodes. + */ + exports.getSelectedNodes = function() { + var idArray = []; + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + idArray.push(nodeId); } } + return idArray }; - /** - * This function places the nodes on the canvas based on the hierarchial distribution. * - * @param {Object} distribution | obtained by the function this._getDistribution() - * @private + * retrieve the currently selected edges + * @return {Array} selection An array with the ids of the + * selected nodes. */ - exports._placeNodesByHierarchy = function(distribution) { - var nodeId, node; - - // start placing all the level 0 nodes first. Then recursively position their branches. - for (var level in distribution) { - if (distribution.hasOwnProperty(level)) { - - for (nodeId in distribution[level].nodes) { - if (distribution[level].nodes.hasOwnProperty(nodeId)) { - node = distribution[level].nodes[nodeId]; - if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { - if (node.xFixed) { - node.x = distribution[level].minPos; - node.xFixed = false; - - distribution[level].minPos += distribution[level].nodeSpacing; - } - } - else { - if (node.yFixed) { - node.y = distribution[level].minPos; - node.yFixed = false; - - distribution[level].minPos += distribution[level].nodeSpacing; - } - } - this._placeBranchNodes(node.edges,node.id,distribution,node.level); - } - } + exports.getSelectedEdges = function() { + var idArray = []; + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + idArray.push(edgeId); } } - - // stabilize the system after positioning. This function calls zoomExtent. - this._stabilize(); + return idArray; }; /** - * This function get the distribution of levels based on hubsize - * - * @returns {Object} - * @private + * select zero or more nodes + * @param {Number[] | String[]} selection An array with the ids of the + * selected nodes. */ - exports._getDistribution = function() { - var distribution = {}; - var nodeId, node, level; + exports.setSelection = function(selection) { + var i, iMax, id; - // we fix Y because the hierarchy is vertical, we fix X so we do not give a node an x position for a second time. - // the fix of X is removed after the x value has been set. - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - node.xFixed = true; - node.yFixed = true; - if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { - node.y = this.constants.hierarchicalLayout.levelSeparation*node.level; - } - else { - node.x = this.constants.hierarchicalLayout.levelSeparation*node.level; - } - if (distribution[node.level] === undefined) { - distribution[node.level] = {amount: 0, nodes: {}, minPos:0, nodeSpacing:0}; - } - distribution[node.level].amount += 1; - distribution[node.level].nodes[nodeId] = node; - } - } + if (!selection || (selection.length == undefined)) + throw 'Selection must be an array with ids'; - // determine the largest amount of nodes of all levels - var maxCount = 0; - for (level in distribution) { - if (distribution.hasOwnProperty(level)) { - if (maxCount < distribution[level].amount) { - maxCount = distribution[level].amount; - } - } - } + // first unselect any selected node + this._unselectAll(true); - // set the initial position and spacing of each nodes accordingly - for (level in distribution) { - if (distribution.hasOwnProperty(level)) { - distribution[level].nodeSpacing = (maxCount + 1) * this.constants.hierarchicalLayout.nodeSpacing; - distribution[level].nodeSpacing /= (distribution[level].amount + 1); - distribution[level].minPos = distribution[level].nodeSpacing - (0.5 * (distribution[level].amount + 1) * distribution[level].nodeSpacing); + for (i = 0, iMax = selection.length; i < iMax; i++) { + id = selection[i]; + + var node = this.nodes[id]; + if (!node) { + throw new RangeError('Node with id "' + id + '" not found'); } + this._selectObject(node,true,true); } - return distribution; + console.log("setSelection is deprecated. Please use selectNodes instead.") + + this.redraw(); }; /** - * this function allocates nodes in levels based on the recursive branching from the largest hubs. - * - * @param hubsize - * @private + * select zero or more nodes with the option to highlight edges + * @param {Number[] | String[]} selection An array with the ids of the + * selected nodes. + * @param {boolean} [highlightEdges] */ - exports._determineLevels = function(hubsize) { - var nodeId, node; + exports.selectNodes = function(selection, highlightEdges) { + var i, iMax, id; - // determine hubs - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (node.edges.length == hubsize) { - node.level = 0; - } - } - } + if (!selection || (selection.length == undefined)) + throw 'Selection must be an array with ids'; - // branch from hubs - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (node.level == 0) { - this._setLevel(1,node.edges,node.id); - } + // first unselect any selected node + this._unselectAll(true); + + for (i = 0, iMax = selection.length; i < iMax; i++) { + id = selection[i]; + + var node = this.nodes[id]; + if (!node) { + throw new RangeError('Node with id "' + id + '" not found'); } + this._selectObject(node,true,true,highlightEdges); } + this.redraw(); }; /** - * Since hierarchical layout does not support: - * - smooth curves (based on the physics), - * - clustering (based on dynamic node counts) - * - * We disable both features so there will be no problems. - * - * @private + * select zero or more edges + * @param {Number[] | String[]} selection An array with the ids of the + * selected nodes. */ - exports._changeConstants = function() { - this.constants.clustering.enabled = false; - this.constants.physics.barnesHut.enabled = false; - this.constants.physics.hierarchicalRepulsion.enabled = true; - this._loadSelectedForceSolver(); - if (this.constants.smoothCurves.enabled == true) { - this.constants.smoothCurves.dynamic = false; - } - this._configureSmoothCurves(); - }; + exports.selectEdges = function(selection) { + var i, iMax, id; + if (!selection || (selection.length == undefined)) + throw 'Selection must be an array with ids'; - /** - * This is a recursively called function to enumerate the branches from the largest hubs and place the nodes - * on a X position that ensures there will be no overlap. - * - * @param edges - * @param parentId - * @param distribution - * @param parentLevel - * @private - */ - exports._placeBranchNodes = function(edges, parentId, distribution, parentLevel) { - for (var i = 0; i < edges.length; i++) { - var childNode = null; - if (edges[i].toId == parentId) { - childNode = edges[i].from; - } - else { - childNode = edges[i].to; - } + // first unselect any selected node + this._unselectAll(true); - // if a node is conneceted to another node on the same level (or higher (means lower level))!, this is not handled here. - var nodeMoved = false; - if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { - if (childNode.xFixed && childNode.level > parentLevel) { - childNode.xFixed = false; - childNode.x = distribution[childNode.level].minPos; - nodeMoved = true; - } - } - else { - if (childNode.yFixed && childNode.level > parentLevel) { - childNode.yFixed = false; - childNode.y = distribution[childNode.level].minPos; - nodeMoved = true; - } - } + for (i = 0, iMax = selection.length; i < iMax; i++) { + id = selection[i]; - if (nodeMoved == true) { - distribution[childNode.level].minPos += distribution[childNode.level].nodeSpacing; - if (childNode.edges.length > 1) { - this._placeBranchNodes(childNode.edges,childNode.id,distribution,childNode.level); - } + var edge = this.edges[id]; + if (!edge) { + throw new RangeError('Edge with id "' + id + '" not found'); } + this._selectObject(edge,true,true,highlightEdges); } + this.redraw(); }; - /** - * this function is called recursively to enumerate the barnches of the largest hubs and give each node a level. - * - * @param level - * @param edges - * @param parentId + * Validate the selection: remove ids of nodes which no longer exist * @private */ - exports._setLevel = function(level, edges, parentId) { - for (var i = 0; i < edges.length; i++) { - var childNode = null; - if (edges[i].toId == parentId) { - childNode = edges[i].from; - } - else { - childNode = edges[i].to; - } - if (childNode.level == -1 || childNode.level > level) { - childNode.level = level; - if (edges.length > 1) { - this._setLevel(level+1, childNode.edges, childNode.id); + exports._updateSelection = function () { + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + if (!this.nodes.hasOwnProperty(nodeId)) { + delete this.selectionObj.nodes[nodeId]; } } } - }; - - - /** - * Unfix nodes - * - * @private - */ - exports._restoreNodes = function() { - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - this.nodes[nodeId].xFixed = false; - this.nodes[nodeId].yFixed = false; + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + if (!this.edges.hasOwnProperty(edgeId)) { + delete this.selectionObj.edges[edgeId]; + } } } }; /***/ }, -/* 59 */ +/* 60 */ /***/ function(module, exports, __webpack_require__) { var util = __webpack_require__(1); - var RepulsionMixin = __webpack_require__(61); - var HierarchialRepulsionMixin = __webpack_require__(62); - var BarnesHutMixin = __webpack_require__(63); + var Node = __webpack_require__(49); + var Edge = __webpack_require__(50); /** - * Toggling barnes Hut calculation on and off. + * clears the toolbar div element of children * * @private */ - exports._toggleBarnesHut = function () { - this.constants.physics.barnesHut.enabled = !this.constants.physics.barnesHut.enabled; - this._loadSelectedForceSolver(); - this.moving = true; - this.start(); + exports._clearManipulatorBar = function() { + while (this.manipulationDiv.hasChildNodes()) { + this.manipulationDiv.removeChild(this.manipulationDiv.firstChild); + } }; - /** - * This loads the node force solver based on the barnes hut or repulsion algorithm + * Manipulation UI temporarily overloads certain functions to extend or replace them. To be able to restore + * these functions to their original functionality, we saved them in this.cachedFunctions. + * This function restores these functions to their original function. * * @private */ - exports._loadSelectedForceSolver = function () { - // this overloads the this._calculateNodeForces - if (this.constants.physics.barnesHut.enabled == true) { - this._clearMixin(RepulsionMixin); - this._clearMixin(HierarchialRepulsionMixin); - - this.constants.physics.centralGravity = this.constants.physics.barnesHut.centralGravity; - this.constants.physics.springLength = this.constants.physics.barnesHut.springLength; - this.constants.physics.springConstant = this.constants.physics.barnesHut.springConstant; - this.constants.physics.damping = this.constants.physics.barnesHut.damping; - - this._loadMixin(BarnesHutMixin); + exports._restoreOverloadedFunctions = function() { + for (var functionName in this.cachedFunctions) { + if (this.cachedFunctions.hasOwnProperty(functionName)) { + this[functionName] = this.cachedFunctions[functionName]; + } } - else if (this.constants.physics.hierarchicalRepulsion.enabled == true) { - this._clearMixin(BarnesHutMixin); - this._clearMixin(RepulsionMixin); - - this.constants.physics.centralGravity = this.constants.physics.hierarchicalRepulsion.centralGravity; - this.constants.physics.springLength = this.constants.physics.hierarchicalRepulsion.springLength; - this.constants.physics.springConstant = this.constants.physics.hierarchicalRepulsion.springConstant; - this.constants.physics.damping = this.constants.physics.hierarchicalRepulsion.damping; + }; - this._loadMixin(HierarchialRepulsionMixin); + /** + * Enable or disable edit-mode. + * + * @private + */ + exports._toggleEditMode = function() { + this.editMode = !this.editMode; + var toolbar = document.getElementById("network-manipulationDiv"); + var closeDiv = document.getElementById("network-manipulation-closeDiv"); + var editModeDiv = document.getElementById("network-manipulation-editMode"); + if (this.editMode == true) { + toolbar.style.display="block"; + closeDiv.style.display="block"; + editModeDiv.style.display="none"; + closeDiv.onclick = this._toggleEditMode.bind(this); } else { - this._clearMixin(BarnesHutMixin); - this._clearMixin(HierarchialRepulsionMixin); - this.barnesHutTree = undefined; - - this.constants.physics.centralGravity = this.constants.physics.repulsion.centralGravity; - this.constants.physics.springLength = this.constants.physics.repulsion.springLength; - this.constants.physics.springConstant = this.constants.physics.repulsion.springConstant; - this.constants.physics.damping = this.constants.physics.repulsion.damping; - - this._loadMixin(RepulsionMixin); + toolbar.style.display="none"; + closeDiv.style.display="none"; + editModeDiv.style.display="block"; + closeDiv.onclick = null; } + this._createManipulatorBar() }; /** - * Before calculating the forces, we check if we need to cluster to keep up performance and we check - * if there is more than one node. If it is just one node, we dont calculate anything. + * main function, creates the main toolbar. Removes functions bound to the select event. Binds all the buttons of the toolbar. * * @private */ - exports._initializeForceCalculation = function () { - // stop calculation if there is only one node - if (this.nodeIndices.length == 1) { - this.nodes[this.nodeIndices[0]]._setForce(0, 0); + exports._createManipulatorBar = function() { + // remove bound functions + if (this.boundFunction) { + this.off('select', this.boundFunction); } - else { - // if there are too many nodes on screen, we cluster without repositioning - if (this.nodeIndices.length > this.constants.clustering.clusterThreshold && this.constants.clustering.enabled == true) { - this.clusterToFit(this.constants.clustering.reduceToNodes, false); - } - // we now start the force calculation - this._calculateForces(); + var locale = this.constants.locales[this.constants.locale]; + + if (this.edgeBeingEdited !== undefined) { + this.edgeBeingEdited._disableControlNodes(); + this.edgeBeingEdited = undefined; + this.selectedControlNode = null; + this.controlNodesActive = false; } - }; + // restore overloaded functions + this._restoreOverloadedFunctions(); - /** - * Calculate the external forces acting on the nodes - * Forces are caused by: edges, repulsing forces between nodes, gravity - * @private - */ - exports._calculateForces = function () { - // Gravity is required to keep separated groups from floating off - // the forces are reset to zero in this loop by using _setForce instead - // of _addForce + // resume calculation + this.freezeSimulation = false; - this._calculateGravitationalForces(); - this._calculateNodeForces(); + // reset global variables + this.blockConnectingEdgeSelection = false; + this.forceAppendSelection = false; - if (this.constants.physics.springConstant > 0) { - if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { - this._calculateSpringForcesWithSupport(); - } - else { - if (this.constants.physics.hierarchicalRepulsion.enabled == true) { - this._calculateHierarchicalSpringForces(); - } - else { - this._calculateSpringForces(); - } + if (this.editMode == true) { + while (this.manipulationDiv.hasChildNodes()) { + this.manipulationDiv.removeChild(this.manipulationDiv.firstChild); } - } - }; + // add the icons to the manipulator div + this.manipulationDiv.innerHTML = "" + + "" + + ""+locale['addNode'] +"" + + "
" + + "" + + ""+locale['addEdge'] +""; + if (this._getSelectedNodeCount() == 1 && this.triggerFunctions.edit) { + this.manipulationDiv.innerHTML += "" + + "
" + + "" + + ""+locale['editNode'] +""; + } + else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { + this.manipulationDiv.innerHTML += "" + + "
" + + "" + + ""+locale['editEdge'] +""; + } + if (this._selectionIsEmpty() == false) { + this.manipulationDiv.innerHTML += "" + + "
" + + "" + + ""+locale['del'] +""; + } - /** - * Smooth curves are created by adding invisible nodes in the center of the edges. These nodes are also - * handled in the calculateForces function. We then use a quadratic curve with the center node as control. - * This function joins the datanodes and invisible (called support) nodes into one object. - * We do this so we do not contaminate this.nodes with the support nodes. - * - * @private - */ - exports._updateCalculationNodes = function () { - if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { - this.calculationNodes = {}; - this.calculationNodeIndices = []; - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - this.calculationNodes[nodeId] = this.nodes[nodeId]; - } + // bind the icons + var addNodeButton = document.getElementById("network-manipulate-addNode"); + addNodeButton.onclick = this._createAddNodeToolbar.bind(this); + var addEdgeButton = document.getElementById("network-manipulate-connectNode"); + addEdgeButton.onclick = this._createAddEdgeToolbar.bind(this); + if (this._getSelectedNodeCount() == 1 && this.triggerFunctions.edit) { + var editButton = document.getElementById("network-manipulate-editNode"); + editButton.onclick = this._editNode.bind(this); } - var supportNodes = this.sectors['support']['nodes']; - for (var supportNodeId in supportNodes) { - if (supportNodes.hasOwnProperty(supportNodeId)) { - if (this.edges.hasOwnProperty(supportNodes[supportNodeId].parentEdgeId)) { - this.calculationNodes[supportNodeId] = supportNodes[supportNodeId]; - } - else { - supportNodes[supportNodeId]._setForce(0, 0); - } - } + else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { + var editButton = document.getElementById("network-manipulate-editEdge"); + editButton.onclick = this._createEditEdgeToolbar.bind(this); } - - for (var idx in this.calculationNodes) { - if (this.calculationNodes.hasOwnProperty(idx)) { - this.calculationNodeIndices.push(idx); - } + if (this._selectionIsEmpty() == false) { + var deleteButton = document.getElementById("network-manipulate-delete"); + deleteButton.onclick = this._deleteSelected.bind(this); } + var closeDiv = document.getElementById("network-manipulation-closeDiv"); + closeDiv.onclick = this._toggleEditMode.bind(this); + + this.boundFunction = this._createManipulatorBar.bind(this); + this.on('select', this.boundFunction); } else { - this.calculationNodes = this.nodes; - this.calculationNodeIndices = this.nodeIndices; + this.editModeDiv.innerHTML = "" + + "" + + "" + locale['edit'] + ""; + var editModeButton = document.getElementById("network-manipulate-editModeButton"); + editModeButton.onclick = this._toggleEditMode.bind(this); } }; + /** - * this function applies the central gravity effect to keep groups from floating off + * Create the toolbar for adding Nodes * * @private */ - exports._calculateGravitationalForces = function () { - var dx, dy, distance, node, i; - var nodes = this.calculationNodes; - var gravity = this.constants.physics.centralGravity; - var gravityForce = 0; + exports._createAddNodeToolbar = function() { + // clear the toolbar + this._clearManipulatorBar(); + if (this.boundFunction) { + this.off('select', this.boundFunction); + } - for (i = 0; i < this.calculationNodeIndices.length; i++) { - node = nodes[this.calculationNodeIndices[i]]; - node.damping = this.constants.physics.damping; // possibly add function to alter damping properties of clusters. - // gravity does not apply when we are in a pocket sector - if (this._sector() == "default" && gravity != 0) { - dx = -node.x; - dy = -node.y; - distance = Math.sqrt(dx * dx + dy * dy); + var locale = this.constants.locales[this.constants.locale]; - gravityForce = (distance == 0) ? 0 : (gravity / distance); - node.fx = dx * gravityForce; - node.fy = dy * gravityForce; - } - else { - node.fx = 0; - node.fy = 0; - } - } - }; + // create the toolbar contents + this.manipulationDiv.innerHTML = "" + + "" + + "" + locale['back'] + " " + + "
" + + "" + + "" + locale['addDescription'] + ""; + // bind the icon + var backButton = document.getElementById("network-manipulate-back"); + backButton.onclick = this._createManipulatorBar.bind(this); + // we use the boundFunction so we can reference it when we unbind it from the "select" event. + this.boundFunction = this._addNode.bind(this); + this.on('select', this.boundFunction); + }; /** - * this function calculates the effects of the springs in the case of unsmooth curves. + * create the toolbar to connect nodes * * @private */ - exports._calculateSpringForces = function () { - var edgeLength, edge, edgeId; - var dx, dy, fx, fy, springForce, distance; - var edges = this.edges; - - // forces caused by the edges, modelled as springs - for (edgeId in edges) { - if (edges.hasOwnProperty(edgeId)) { - edge = edges[edgeId]; - if (edge.connected) { - // only calculate forces if nodes are in the same sector - if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { - edgeLength = edge.physics.springLength; - // this implies that the edges between big clusters are longer - edgeLength += (edge.to.clusterSize + edge.from.clusterSize - 2) * this.constants.clustering.edgeGrowth; - - dx = (edge.from.x - edge.to.x); - dy = (edge.from.y - edge.to.y); - distance = Math.sqrt(dx * dx + dy * dy); - - if (distance == 0) { - distance = 0.01; - } - - // the 1/distance is so the fx and fy can be calculated without sine or cosine. - springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; + exports._createAddEdgeToolbar = function() { + // clear the toolbar + this._clearManipulatorBar(); + this._unselectAll(true); + this.freezeSimulation = true; - fx = dx * springForce; - fy = dy * springForce; + var locale = this.constants.locales[this.constants.locale]; - edge.from.fx += fx; - edge.from.fy += fy; - edge.to.fx -= fx; - edge.to.fy -= fy; - } - } - } + if (this.boundFunction) { + this.off('select', this.boundFunction); } - }; - - + this._unselectAll(); + this.forceAppendSelection = false; + this.blockConnectingEdgeSelection = true; - /** - * This function calculates the springforces on the nodes, accounting for the support nodes. - * - * @private - */ - exports._calculateSpringForcesWithSupport = function () { - var edgeLength, edge, edgeId, combinedClusterSize; - var edges = this.edges; + this.manipulationDiv.innerHTML = "" + + "" + + "" + locale['back'] + " " + + "
" + + "" + + "" + locale['edgeDescription'] + ""; - // forces caused by the edges, modelled as springs - for (edgeId in edges) { - if (edges.hasOwnProperty(edgeId)) { - edge = edges[edgeId]; - if (edge.connected) { - // only calculate forces if nodes are in the same sector - if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { - if (edge.via != null) { - var node1 = edge.to; - var node2 = edge.via; - var node3 = edge.from; + // bind the icon + var backButton = document.getElementById("network-manipulate-back"); + backButton.onclick = this._createManipulatorBar.bind(this); - edgeLength = edge.physics.springLength; + // we use the boundFunction so we can reference it when we unbind it from the "select" event. + this.boundFunction = this._handleConnect.bind(this); + this.on('select', this.boundFunction); - combinedClusterSize = node1.clusterSize + node3.clusterSize - 2; + // temporarily overload functions + this.cachedFunctions["_handleTouch"] = this._handleTouch; + this.cachedFunctions["_handleOnRelease"] = this._handleOnRelease; + this._handleTouch = this._handleConnect; + this._handleOnRelease = this._finishConnect; - // this implies that the edges between big clusters are longer - edgeLength += combinedClusterSize * this.constants.clustering.edgeGrowth; - this._calculateSpringForce(node1, node2, 0.5 * edgeLength); - this._calculateSpringForce(node2, node3, 0.5 * edgeLength); - } - } - } - } - } + // redraw to show the unselect + this._redraw(); }; - /** - * This is the code actually performing the calculation for the function above. It is split out to avoid repetition. + * create the toolbar to edit edges * - * @param node1 - * @param node2 - * @param edgeLength * @private */ - exports._calculateSpringForce = function (node1, node2, edgeLength) { - var dx, dy, fx, fy, springForce, distance; - - dx = (node1.x - node2.x); - dy = (node1.y - node2.y); - distance = Math.sqrt(dx * dx + dy * dy); + exports._createEditEdgeToolbar = function() { + // clear the toolbar + this._clearManipulatorBar(); + this.controlNodesActive = true; - if (distance == 0) { - distance = 0.01; + if (this.boundFunction) { + this.off('select', this.boundFunction); } - // the 1/distance is so the fx and fy can be calculated without sine or cosine. - springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; + this.edgeBeingEdited = this._getSelectedEdge(); + this.edgeBeingEdited._enableControlNodes(); - fx = dx * springForce; - fy = dy * springForce; + var locale = this.constants.locales[this.constants.locale]; - node1.fx += fx; - node1.fy += fy; - node2.fx -= fx; - node2.fy -= fy; - }; + this.manipulationDiv.innerHTML = "" + + "" + + "" + locale['back'] + " " + + "
" + + "" + + "" + locale['editEdgeDescription'] + ""; + // bind the icon + var backButton = document.getElementById("network-manipulate-back"); + backButton.onclick = this._createManipulatorBar.bind(this); - /** - * Load the HTML for the physics config and bind it - * @private - */ - exports._loadPhysicsConfiguration = function () { - if (this.physicsConfiguration === undefined) { - this.backupConstants = {}; - util.deepExtend(this.backupConstants,this.constants); + // temporarily overload functions + this.cachedFunctions["_handleTouch"] = this._handleTouch; + this.cachedFunctions["_handleOnRelease"] = this._handleOnRelease; + this.cachedFunctions["_handleTap"] = this._handleTap; + this.cachedFunctions["_handleDragStart"] = this._handleDragStart; + this.cachedFunctions["_handleOnDrag"] = this._handleOnDrag; + this._handleTouch = this._selectControlNode; + this._handleTap = function () {}; + this._handleOnDrag = this._controlNodeDrag; + this._handleDragStart = function () {} + this._handleOnRelease = this._releaseControlNode; - var hierarchicalLayoutDirections = ["LR", "RL", "UD", "DU"]; - this.physicsConfiguration = document.createElement('div'); - this.physicsConfiguration.className = "PhysicsConfiguration"; - this.physicsConfiguration.innerHTML = '' + - '' + - '' + - '' + - '' + - '' + - '' + - '
Simulation Mode:
Barnes HutRepulsionHierarchical
' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '
Options:
' - this.containerElement.parentElement.insertBefore(this.physicsConfiguration, this.containerElement); - this.optionsDiv = document.createElement("div"); - this.optionsDiv.style.fontSize = "14px"; - this.optionsDiv.style.fontFamily = "verdana"; - this.containerElement.parentElement.insertBefore(this.optionsDiv, this.containerElement); + // redraw to show the unselect + this._redraw(); + }; - var rangeElement; - rangeElement = document.getElementById('graph_BH_gc'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_gc', -1, "physics_barnesHut_gravitationalConstant"); - rangeElement = document.getElementById('graph_BH_cg'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_cg', 1, "physics_centralGravity"); - rangeElement = document.getElementById('graph_BH_sc'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sc', 1, "physics_springConstant"); - rangeElement = document.getElementById('graph_BH_sl'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sl', 1, "physics_springLength"); - rangeElement = document.getElementById('graph_BH_damp'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_damp', 1, "physics_damping"); - rangeElement = document.getElementById('graph_R_nd'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_nd', 1, "physics_repulsion_nodeDistance"); - rangeElement = document.getElementById('graph_R_cg'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_cg', 1, "physics_centralGravity"); - rangeElement = document.getElementById('graph_R_sc'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sc', 1, "physics_springConstant"); - rangeElement = document.getElementById('graph_R_sl'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sl', 1, "physics_springLength"); - rangeElement = document.getElementById('graph_R_damp'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_damp', 1, "physics_damping"); - rangeElement = document.getElementById('graph_H_nd'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance"); - rangeElement = document.getElementById('graph_H_cg'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_cg', 1, "physics_centralGravity"); - rangeElement = document.getElementById('graph_H_sc'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sc', 1, "physics_springConstant"); - rangeElement = document.getElementById('graph_H_sl'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sl', 1, "physics_springLength"); - rangeElement = document.getElementById('graph_H_damp'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_damp', 1, "physics_damping"); - rangeElement = document.getElementById('graph_H_direction'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_direction', hierarchicalLayoutDirections, "hierarchicalLayout_direction"); - rangeElement = document.getElementById('graph_H_levsep'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_levsep', 1, "hierarchicalLayout_levelSeparation"); - rangeElement = document.getElementById('graph_H_nspac'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nspac', 1, "hierarchicalLayout_nodeSpacing"); - var radioButton1 = document.getElementById("graph_physicsMethod1"); - var radioButton2 = document.getElementById("graph_physicsMethod2"); - var radioButton3 = document.getElementById("graph_physicsMethod3"); - radioButton2.checked = true; - if (this.constants.physics.barnesHut.enabled) { - radioButton1.checked = true; - } - if (this.constants.hierarchicalLayout.enabled) { - radioButton3.checked = true; - } - var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); - var graph_repositionNodes = document.getElementById("graph_repositionNodes"); - var graph_generateOptions = document.getElementById("graph_generateOptions"); + /** + * the function bound to the selection event. It checks if you want to connect a cluster and changes the description + * to walk the user through the process. + * + * @private + */ + exports._selectControlNode = function(pointer) { + this.edgeBeingEdited.controlNodes.from.unselect(); + this.edgeBeingEdited.controlNodes.to.unselect(); + this.selectedControlNode = this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(pointer.x),this._YconvertDOMtoCanvas(pointer.y)); + if (this.selectedControlNode !== null) { + this.selectedControlNode.select(); + this.freezeSimulation = true; + } + this._redraw(); + }; - graph_toggleSmooth.onclick = graphToggleSmoothCurves.bind(this); - graph_repositionNodes.onclick = graphRepositionNodes.bind(this); - graph_generateOptions.onclick = graphGenerateOptions.bind(this); - if (this.constants.smoothCurves == true && this.constants.dynamicSmoothCurves == false) { - graph_toggleSmooth.style.background = "#A4FF56"; + /** + * the function bound to the selection event. It checks if you want to connect a cluster and changes the description + * to walk the user through the process. + * + * @private + */ + exports._controlNodeDrag = function(event) { + var pointer = this._getPointer(event.gesture.center); + if (this.selectedControlNode !== null && this.selectedControlNode !== undefined) { + this.selectedControlNode.x = this._XconvertDOMtoCanvas(pointer.x); + this.selectedControlNode.y = this._YconvertDOMtoCanvas(pointer.y); + } + this._redraw(); + }; + + exports._releaseControlNode = function(pointer) { + var newNode = this._getNodeAt(pointer); + if (newNode != null) { + if (this.edgeBeingEdited.controlNodes.from.selected == true) { + this._editEdge(newNode.id, this.edgeBeingEdited.to.id); + this.edgeBeingEdited.controlNodes.from.unselect(); } - else { - graph_toggleSmooth.style.background = "#FF8532"; + if (this.edgeBeingEdited.controlNodes.to.selected == true) { + this._editEdge(this.edgeBeingEdited.from.id, newNode.id); + this.edgeBeingEdited.controlNodes.to.unselect(); } - - - switchConfigurations.apply(this); - - radioButton1.onchange = switchConfigurations.bind(this); - radioButton2.onchange = switchConfigurations.bind(this); - radioButton3.onchange = switchConfigurations.bind(this); } + else { + this.edgeBeingEdited._restoreControlNodes(); + } + this.freezeSimulation = false; + this._redraw(); }; /** - * This overwrites the this.constants. + * the function bound to the selection event. It checks if you want to connect a cluster and changes the description + * to walk the user through the process. * - * @param constantsVariableName - * @param value * @private */ - exports._overWriteGraphConstants = function (constantsVariableName, value) { - var nameArray = constantsVariableName.split("_"); - if (nameArray.length == 1) { - this.constants[nameArray[0]] = value; - } - else if (nameArray.length == 2) { - this.constants[nameArray[0]][nameArray[1]] = value; - } - else if (nameArray.length == 3) { - this.constants[nameArray[0]][nameArray[1]][nameArray[2]] = value; + exports._handleConnect = function(pointer) { + if (this._getSelectedNodeCount() == 0) { + var node = this._getNodeAt(pointer); + + if (node != null) { + if (node.clusterSize > 1) { + alert(this.constants.locales[this.constants.locale]['createEdgeError']) + } + else { + this._selectObject(node,false); + // create a node the temporary line can look at + this.sectors['support']['nodes']['targetNode'] = new Node({id:'targetNode'},{},{},this.constants); + this.sectors['support']['nodes']['targetNode'].x = node.x; + this.sectors['support']['nodes']['targetNode'].y = node.y; + this.sectors['support']['nodes']['targetViaNode'] = new Node({id:'targetViaNode'},{},{},this.constants); + this.sectors['support']['nodes']['targetViaNode'].x = node.x; + this.sectors['support']['nodes']['targetViaNode'].y = node.y; + this.sectors['support']['nodes']['targetViaNode'].parentEdgeId = "connectionEdge"; + + // create a temporary edge + this.edges['connectionEdge'] = new Edge({id:"connectionEdge",from:node.id,to:this.sectors['support']['nodes']['targetNode'].id}, this, this.constants); + this.edges['connectionEdge'].from = node; + this.edges['connectionEdge'].connected = true; + this.edges['connectionEdge'].smooth = true; + this.edges['connectionEdge'].selected = true; + this.edges['connectionEdge'].to = this.sectors['support']['nodes']['targetNode']; + this.edges['connectionEdge'].via = this.sectors['support']['nodes']['targetViaNode']; + + this.cachedFunctions["_handleOnDrag"] = this._handleOnDrag; + this._handleOnDrag = function(event) { + var pointer = this._getPointer(event.gesture.center); + this.sectors['support']['nodes']['targetNode'].x = this._XconvertDOMtoCanvas(pointer.x); + this.sectors['support']['nodes']['targetNode'].y = this._YconvertDOMtoCanvas(pointer.y); + this.sectors['support']['nodes']['targetViaNode'].x = 0.5 * (this._XconvertDOMtoCanvas(pointer.x) + this.edges['connectionEdge'].from.x); + this.sectors['support']['nodes']['targetViaNode'].y = this._YconvertDOMtoCanvas(pointer.y); + }; + + this.moving = true; + this.start(); + } + } } }; + exports._finishConnect = function(pointer) { + if (this._getSelectedNodeCount() == 1) { - /** - * this function is bound to the toggle smooth curves button. That is also why it is not in the prototype. - */ - function graphToggleSmoothCurves () { - this.constants.smoothCurves.enabled = !this.constants.smoothCurves.enabled; - var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); - if (this.constants.smoothCurves.enabled == true) {graph_toggleSmooth.style.background = "#A4FF56";} - else {graph_toggleSmooth.style.background = "#FF8532";} + // restore the drag function + this._handleOnDrag = this.cachedFunctions["_handleOnDrag"]; + delete this.cachedFunctions["_handleOnDrag"]; - this._configureSmoothCurves(false); - } + // remember the edge id + var connectFromId = this.edges['connectionEdge'].fromId; - /** - * this function is used to scramble the nodes - * - */ - function graphRepositionNodes () { - for (var nodeId in this.calculationNodes) { - if (this.calculationNodes.hasOwnProperty(nodeId)) { - this.calculationNodes[nodeId].vx = 0; this.calculationNodes[nodeId].vy = 0; - this.calculationNodes[nodeId].fx = 0; this.calculationNodes[nodeId].fy = 0; + // remove the temporary nodes and edge + delete this.edges['connectionEdge']; + delete this.sectors['support']['nodes']['targetNode']; + delete this.sectors['support']['nodes']['targetViaNode']; + + var node = this._getNodeAt(pointer); + if (node != null) { + if (node.clusterSize > 1) { + alert(this.constants.locales[this.constants.locale]["createEdgeError"]) + } + else { + this._createEdge(connectFromId,node.id); + this._createManipulatorBar(); + } } + this._unselectAll(); } - if (this.constants.hierarchicalLayout.enabled == true) { - this._setupHierarchicalLayout(); - showValueOfRange.call(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance"); - showValueOfRange.call(this, 'graph_H_cg', 1, "physics_centralGravity"); - showValueOfRange.call(this, 'graph_H_sc', 1, "physics_springConstant"); - showValueOfRange.call(this, 'graph_H_sl', 1, "physics_springLength"); - showValueOfRange.call(this, 'graph_H_damp', 1, "physics_damping"); - } - else { - this.repositionNodes(); - } - this.moving = true; - this.start(); - } + }; + /** - * this is used to generate an options file from the playing with physics system. + * Adds a node on the specified location */ - function graphGenerateOptions () { - var options = "No options are required, default values used."; - var optionsSpecific = []; - var radioButton1 = document.getElementById("graph_physicsMethod1"); - var radioButton2 = document.getElementById("graph_physicsMethod2"); - if (radioButton1.checked == true) { - if (this.constants.physics.barnesHut.gravitationalConstant != this.backupConstants.physics.barnesHut.gravitationalConstant) {optionsSpecific.push("gravitationalConstant: " + this.constants.physics.barnesHut.gravitationalConstant);} - if (this.constants.physics.centralGravity != this.backupConstants.physics.barnesHut.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} - if (this.constants.physics.springLength != this.backupConstants.physics.barnesHut.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} - if (this.constants.physics.springConstant != this.backupConstants.physics.barnesHut.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} - if (this.constants.physics.damping != this.backupConstants.physics.barnesHut.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} - if (optionsSpecific.length != 0) { - options = "var options = {"; - options += "physics: {barnesHut: {"; - for (var i = 0; i < optionsSpecific.length; i++) { - options += optionsSpecific[i]; - if (i < optionsSpecific.length - 1) { - options += ", " - } + exports._addNode = function() { + if (this._selectionIsEmpty() && this.editMode == true) { + var positionObject = this._pointerToPositionObject(this.pointerPosition); + var defaultData = {id:util.randomUUID(),x:positionObject.left,y:positionObject.top,label:"new",allowedToMoveX:true,allowedToMoveY:true}; + if (this.triggerFunctions.add) { + if (this.triggerFunctions.add.length == 2) { + var me = this; + this.triggerFunctions.add(defaultData, function(finalizedData) { + me.nodesData.add(finalizedData); + me._createManipulatorBar(); + me.moving = true; + me.start(); + }); } - options += '}}' - } - if (this.constants.smoothCurves.enabled != this.backupConstants.smoothCurves.enabled) { - if (optionsSpecific.length == 0) {options = "var options = {";} - else {options += ", "} - options += "smoothCurves: " + this.constants.smoothCurves.enabled; - } - if (options != "No options are required, default values used.") { - options += '};' - } - } - else if (radioButton2.checked == true) { - options = "var options = {"; - options += "physics: {barnesHut: {enabled: false}"; - if (this.constants.physics.repulsion.nodeDistance != this.backupConstants.physics.repulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.repulsion.nodeDistance);} - if (this.constants.physics.centralGravity != this.backupConstants.physics.repulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} - if (this.constants.physics.springLength != this.backupConstants.physics.repulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} - if (this.constants.physics.springConstant != this.backupConstants.physics.repulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} - if (this.constants.physics.damping != this.backupConstants.physics.repulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} - if (optionsSpecific.length != 0) { - options += ", repulsion: {"; - for (var i = 0; i < optionsSpecific.length; i++) { - options += optionsSpecific[i]; - if (i < optionsSpecific.length - 1) { - options += ", " - } + else { + throw new Error('The function for add does not support two arguments (data,callback)'); + this._createManipulatorBar(); + this.moving = true; + this.start(); } - options += '}}' } - if (optionsSpecific.length == 0) {options += "}"} - if (this.constants.smoothCurves != this.backupConstants.smoothCurves) { - options += ", smoothCurves: " + this.constants.smoothCurves; + else { + this.nodesData.add(defaultData); + this._createManipulatorBar(); + this.moving = true; + this.start(); } - options += '};' } - else { - options = "var options = {"; - if (this.constants.physics.hierarchicalRepulsion.nodeDistance != this.backupConstants.physics.hierarchicalRepulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.hierarchicalRepulsion.nodeDistance);} - if (this.constants.physics.centralGravity != this.backupConstants.physics.hierarchicalRepulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} - if (this.constants.physics.springLength != this.backupConstants.physics.hierarchicalRepulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} - if (this.constants.physics.springConstant != this.backupConstants.physics.hierarchicalRepulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} - if (this.constants.physics.damping != this.backupConstants.physics.hierarchicalRepulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} - if (optionsSpecific.length != 0) { - options += "physics: {hierarchicalRepulsion: {"; - for (var i = 0; i < optionsSpecific.length; i++) { - options += optionsSpecific[i]; - if (i < optionsSpecific.length - 1) { - options += ", "; - } + }; + + + /** + * connect two nodes with a new edge. + * + * @private + */ + exports._createEdge = function(sourceNodeId,targetNodeId) { + if (this.editMode == true) { + var defaultData = {from:sourceNodeId, to:targetNodeId}; + if (this.triggerFunctions.connect) { + if (this.triggerFunctions.connect.length == 2) { + var me = this; + this.triggerFunctions.connect(defaultData, function(finalizedData) { + me.edgesData.add(finalizedData); + me.moving = true; + me.start(); + }); } - options += '}},'; - } - options += 'hierarchicalLayout: {'; - optionsSpecific = []; - if (this.constants.hierarchicalLayout.direction != this.backupConstants.hierarchicalLayout.direction) {optionsSpecific.push("direction: " + this.constants.hierarchicalLayout.direction);} - if (Math.abs(this.constants.hierarchicalLayout.levelSeparation) != this.backupConstants.hierarchicalLayout.levelSeparation) {optionsSpecific.push("levelSeparation: " + this.constants.hierarchicalLayout.levelSeparation);} - if (this.constants.hierarchicalLayout.nodeSpacing != this.backupConstants.hierarchicalLayout.nodeSpacing) {optionsSpecific.push("nodeSpacing: " + this.constants.hierarchicalLayout.nodeSpacing);} - if (optionsSpecific.length != 0) { - for (var i = 0; i < optionsSpecific.length; i++) { - options += optionsSpecific[i]; - if (i < optionsSpecific.length - 1) { - options += ", " - } + else { + throw new Error('The function for connect does not support two arguments (data,callback)'); + this.moving = true; + this.start(); } - options += '}' } else { - options += "enabled:true}"; + this.edgesData.add(defaultData); + this.moving = true; + this.start(); } - options += '};' } - - - this.optionsDiv.innerHTML = options; - } + }; /** - * this is used to switch between barnesHut, repulsion and hierarchical. + * connect two nodes with a new edge. * + * @private */ - function switchConfigurations () { - var ids = ["graph_BH_table", "graph_R_table", "graph_H_table"]; - var radioButton = document.querySelector('input[name="graph_physicsMethod"]:checked').value; - var tableId = "graph_" + radioButton + "_table"; - var table = document.getElementById(tableId); - table.style.display = "block"; - for (var i = 0; i < ids.length; i++) { - if (ids[i] != tableId) { - table = document.getElementById(ids[i]); - table.style.display = "none"; + exports._editEdge = function(sourceNodeId,targetNodeId) { + if (this.editMode == true) { + var defaultData = {id: this.edgeBeingEdited.id, from:sourceNodeId, to:targetNodeId}; + if (this.triggerFunctions.editEdge) { + if (this.triggerFunctions.editEdge.length == 2) { + var me = this; + this.triggerFunctions.editEdge(defaultData, function(finalizedData) { + me.edgesData.update(finalizedData); + me.moving = true; + me.start(); + }); + } + else { + throw new Error('The function for edit does not support two arguments (data, callback)'); + this.moving = true; + this.start(); + } } - } - this._restoreNodes(); - if (radioButton == "R") { - this.constants.hierarchicalLayout.enabled = false; - this.constants.physics.hierarchicalRepulsion.enabled = false; - this.constants.physics.barnesHut.enabled = false; - } - else if (radioButton == "H") { - if (this.constants.hierarchicalLayout.enabled == false) { - this.constants.hierarchicalLayout.enabled = true; - this.constants.physics.hierarchicalRepulsion.enabled = true; - this.constants.physics.barnesHut.enabled = false; - this.constants.smoothCurves.enabled = false; - this._setupHierarchicalLayout(); + else { + this.edgesData.update(defaultData); + this.moving = true; + this.start(); } } - else { - this.constants.hierarchicalLayout.enabled = false; - this.constants.physics.hierarchicalRepulsion.enabled = false; - this.constants.physics.barnesHut.enabled = true; - } - this._loadSelectedForceSolver(); - var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); - if (this.constants.smoothCurves.enabled == true) {graph_toggleSmooth.style.background = "#A4FF56";} - else {graph_toggleSmooth.style.background = "#FF8532";} - this.moving = true; - this.start(); - } - + }; /** - * this generates the ranges depending on the iniital values. + * Create the toolbar to edit the selected node. The label and the color can be changed. Other colors are derived from the chosen color. * - * @param id - * @param map - * @param constantsVariableName + * @private */ - function showValueOfRange (id,map,constantsVariableName) { - var valueId = id + "_value"; - var rangeValue = document.getElementById(id).value; - - if (map instanceof Array) { - document.getElementById(valueId).value = map[parseInt(rangeValue)]; - this._overWriteGraphConstants(constantsVariableName,map[parseInt(rangeValue)]); + exports._editNode = function() { + if (this.triggerFunctions.edit && this.editMode == true) { + var node = this._getSelectedNode(); + var data = {id:node.id, + label: node.label, + group: node.options.group, + shape: node.options.shape, + color: { + background:node.options.color.background, + border:node.options.color.border, + highlight: { + background:node.options.color.highlight.background, + border:node.options.color.highlight.border + } + }}; + if (this.triggerFunctions.edit.length == 2) { + var me = this; + this.triggerFunctions.edit(data, function (finalizedData) { + me.nodesData.update(finalizedData); + me._createManipulatorBar(); + me.moving = true; + me.start(); + }); + } + else { + throw new Error('The function for edit does not support two arguments (data, callback)'); + } } else { - document.getElementById(valueId).value = parseInt(map) * parseFloat(rangeValue); - this._overWriteGraphConstants(constantsVariableName, parseInt(map) * parseFloat(rangeValue)); + throw new Error('No edit function has been bound to this button'); } + }; - if (constantsVariableName == "hierarchicalLayout_direction" || - constantsVariableName == "hierarchicalLayout_levelSeparation" || - constantsVariableName == "hierarchicalLayout_nodeSpacing") { - this._setupHierarchicalLayout(); - } - this.moving = true; - this.start(); - } -/***/ }, -/* 60 */ -/***/ function(module, exports, __webpack_require__) { - var map = {}; - function webpackContext(req) { - return __webpack_require__(webpackContextResolve(req)); - }; - function webpackContextResolve(req) { - return map[req] || (function() { throw new Error("Cannot find module '" + req + "'.") }()); - }; - webpackContext.keys = function webpackContextKeys() { - return Object.keys(map); + /** + * delete everything in the selection + * + * @private + */ + exports._deleteSelected = function() { + if (!this._selectionIsEmpty() && this.editMode == true) { + if (!this._clusterInSelection()) { + var selectedNodes = this.getSelectedNodes(); + var selectedEdges = this.getSelectedEdges(); + if (this.triggerFunctions.del) { + var me = this; + var data = {nodes: selectedNodes, edges: selectedEdges}; + if (this.triggerFunctions.del.length = 2) { + this.triggerFunctions.del(data, function (finalizedData) { + me.edgesData.remove(finalizedData.edges); + me.nodesData.remove(finalizedData.nodes); + me._unselectAll(); + me.moving = true; + me.start(); + }); + } + else { + throw new Error('The function for delete does not support two arguments (data, callback)') + } + } + else { + this.edgesData.remove(selectedEdges); + this.nodesData.remove(selectedNodes); + this._unselectAll(); + this.moving = true; + this.start(); + } + } + else { + alert(this.constants.locales[this.constants.locale]["deleteClusterError"]); + } + } }; - webpackContext.resolve = webpackContextResolve; - module.exports = webpackContext; /***/ }, /* 61 */ /***/ function(module, exports, __webpack_require__) { + var util = __webpack_require__(1); + var Hammer = __webpack_require__(18); + + exports._cleanNavigation = function() { + // clean up previous navigation items + var wrapper = document.getElementById('network-navigation_wrapper'); + if (wrapper && wrapper.parentNode) { + wrapper.parentNode.removeChild(wrapper); + } + document.onmouseup = null; + }; + /** - * Calculate the forces the nodes apply on each other based on a repulsion field. - * This field is linearly approximated. + * Creation of the navigation controls nodes. They are drawn over the rest of the nodes and are not affected by scale and translation + * they have a triggerFunction which is called on click. If the position of the navigation controls is dependent + * on this.frame.canvas.clientWidth or this.frame.canvas.clientHeight, we flag horizontalAlignLeft and verticalAlignTop false. + * This means that the location will be corrected by the _relocateNavigation function on a size change of the canvas. * * @private */ - exports._calculateNodeForces = function () { - var dx, dy, angle, distance, fx, fy, combinedClusterSize, - repulsingForce, node1, node2, i, j; - - var nodes = this.calculationNodes; - var nodeIndices = this.calculationNodeIndices; - - // approximation constants - var a_base = -2 / 3; - var b = 4 / 3; - - // repulsing forces between nodes - var nodeDistance = this.constants.physics.repulsion.nodeDistance; - var minimumDistance = nodeDistance; - - // we loop from i over all but the last entree in the array - // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j - for (i = 0; i < nodeIndices.length - 1; i++) { - node1 = nodes[nodeIndices[i]]; - for (j = i + 1; j < nodeIndices.length; j++) { - node2 = nodes[nodeIndices[j]]; - combinedClusterSize = node1.clusterSize + node2.clusterSize - 2; - - dx = node2.x - node1.x; - dy = node2.y - node1.y; - distance = Math.sqrt(dx * dx + dy * dy); - - minimumDistance = (combinedClusterSize == 0) ? nodeDistance : (nodeDistance * (1 + combinedClusterSize * this.constants.clustering.distanceAmplification)); - var a = a_base / minimumDistance; - if (distance < 2 * minimumDistance) { - if (distance < 0.5 * minimumDistance) { - repulsingForce = 1.0; - } - else { - repulsingForce = a * distance + b; // linear approx of 1 / (1 + Math.exp((distance / minimumDistance - 1) * steepness)) - } + exports._loadNavigationElements = function() { + this._cleanNavigation(); - // amplify the repulsion for clusters. - repulsingForce *= (combinedClusterSize == 0) ? 1 : 1 + combinedClusterSize * this.constants.clustering.forceAmplification; - repulsingForce = repulsingForce / distance; + this.navigationDivs = {}; + var navigationDivs = ['up','down','left','right','zoomIn','zoomOut','zoomExtends']; + var navigationDivActions = ['_moveUp','_moveDown','_moveLeft','_moveRight','_zoomIn','_zoomOut','zoomExtent']; - fx = dx * repulsingForce; - fy = dy * repulsingForce; + this.navigationDivs['wrapper'] = document.createElement('div'); + this.navigationDivs['wrapper'].id = 'network-navigation_wrapper'; + this.frame.appendChild(this.navigationDivs['wrapper']); - node1.fx -= fx; - node1.fy -= fy; - node2.fx += fx; - node2.fy += fy; - } - } + var me = this; + for (var i = 0; i < navigationDivs.length; i++) { + this.navigationDivs[navigationDivs[i]] = document.createElement('div'); + this.navigationDivs[navigationDivs[i]].id = 'network-navigation_' + navigationDivs[i]; + this.navigationDivs[navigationDivs[i]].className = 'network-navigation ' + navigationDivs[i]; + this.navigationDivs['wrapper'].appendChild(this.navigationDivs[navigationDivs[i]]); + var hammer = Hammer(this.navigationDivs[navigationDivs[i]], {prevent_default: true}); + hammer.on('touch', me[navigationDivActions[i]].bind(me)); } + var hammer = Hammer(document, {prevent_default: false}); + hammer.on('release', me._stopMovement.bind(me)); }; + /** + * this stops all movement induced by the navigation buttons + * + * @private + */ + exports._stopMovement = function() { + this._xStopMoving(); + this._yStopMoving(); + this._stopZoom(); + }; -/***/ }, -/* 62 */ -/***/ function(module, exports, __webpack_require__) { /** - * Calculate the forces the nodes apply on eachother based on a repulsion field. - * This field is linearly approximated. + * move the screen up + * By using the increments, instead of adding a fixed number to the translation, we keep fluent and + * instant movement. The onKeypress event triggers immediately, then pauses, then triggers frequently + * To avoid this behaviour, we do the translation in the start loop. * * @private */ - exports._calculateNodeForces = function () { - var dx, dy, distance, fx, fy, - repulsingForce, node1, node2, i, j; + exports._moveUp = function(event) { + this.yIncrement = this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); + }; - var nodes = this.calculationNodes; - var nodeIndices = this.calculationNodeIndices; - // repulsing forces between nodes - var nodeDistance = this.constants.physics.hierarchicalRepulsion.nodeDistance; + /** + * move the screen down + * @private + */ + exports._moveDown = function(event) { + this.yIncrement = -this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); + }; - // we loop from i over all but the last entree in the array - // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j - for (i = 0; i < nodeIndices.length - 1; i++) { - node1 = nodes[nodeIndices[i]]; - for (j = i + 1; j < nodeIndices.length; j++) { - node2 = nodes[nodeIndices[j]]; - // nodes only affect nodes on their level - if (node1.level == node2.level) { + /** + * move the screen left + * @private + */ + exports._moveLeft = function(event) { + this.xIncrement = this.constants.keyboard.speed.x; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); + }; - dx = node2.x - node1.x; - dy = node2.y - node1.y; - distance = Math.sqrt(dx * dx + dy * dy); + /** + * move the screen right + * @private + */ + exports._moveRight = function(event) { + this.xIncrement = -this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); + }; - var steepness = 0.05; - if (distance < nodeDistance) { - repulsingForce = -Math.pow(steepness*distance,2) + Math.pow(steepness*nodeDistance,2); - } - else { - repulsingForce = 0; - } - // normalize force with - if (distance == 0) { - distance = 0.01; - } - else { - repulsingForce = repulsingForce / distance; - } - fx = dx * repulsingForce; - fy = dy * repulsingForce; - node1.fx -= fx; - node1.fy -= fy; - node2.fx += fx; - node2.fy += fy; - } - } - } + /** + * Zoom in, using the same method as the movement. + * @private + */ + exports._zoomIn = function(event) { + this.zoomIncrement = this.constants.keyboard.speed.zoom; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); }; /** - * this function calculates the effects of the springs in the case of unsmooth curves. - * + * Zoom out * @private */ - exports._calculateHierarchicalSpringForces = function () { - var edgeLength, edge, edgeId; - var dx, dy, fx, fy, springForce, distance; - var edges = this.edges; + exports._zoomOut = function(event) { + this.zoomIncrement = -this.constants.keyboard.speed.zoom; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); + }; - var nodes = this.calculationNodes; - var nodeIndices = this.calculationNodeIndices; + /** + * Stop zooming and unhighlight the zoom controls + * @private + */ + exports._stopZoom = function(event) { + this.zoomIncrement = 0; + event && event.preventDefault(); + }; - for (var i = 0; i < nodeIndices.length; i++) { - var node1 = nodes[nodeIndices[i]]; - node1.springFx = 0; - node1.springFy = 0; - } + /** + * Stop moving in the Y direction and unHighlight the up and down + * @private + */ + exports._yStopMoving = function(event) { + this.yIncrement = 0; + event && event.preventDefault(); + }; - // forces caused by the edges, modelled as springs - for (edgeId in edges) { - if (edges.hasOwnProperty(edgeId)) { - edge = edges[edgeId]; - if (edge.connected) { - // only calculate forces if nodes are in the same sector - if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { - edgeLength = edge.physics.springLength; - // this implies that the edges between big clusters are longer - edgeLength += (edge.to.clusterSize + edge.from.clusterSize - 2) * this.constants.clustering.edgeGrowth; - dx = (edge.from.x - edge.to.x); - dy = (edge.from.y - edge.to.y); - distance = Math.sqrt(dx * dx + dy * dy); + /** + * Stop moving in the X direction and unHighlight left and right. + * @private + */ + exports._xStopMoving = function(event) { + this.xIncrement = 0; + event && event.preventDefault(); + }; - if (distance == 0) { - distance = 0.01; - } - // the 1/distance is so the fx and fy can be calculated without sine or cosine. - springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; +/***/ }, +/* 62 */ +/***/ function(module, exports, __webpack_require__) { - fx = dx * springForce; - fy = dy * springForce; + exports._resetLevels = function() { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.preassignedLevel == false) { + node.level = -1; + } + } + } + }; + /** + * This is the main function to layout the nodes in a hierarchical way. + * It checks if the node details are supplied correctly + * + * @private + */ + exports._setupHierarchicalLayout = function() { + if (this.constants.hierarchicalLayout.enabled == true && this.nodeIndices.length > 0) { + if (this.constants.hierarchicalLayout.direction == "RL" || this.constants.hierarchicalLayout.direction == "DU") { + this.constants.hierarchicalLayout.levelSeparation *= -1; + } + else { + this.constants.hierarchicalLayout.levelSeparation = Math.abs(this.constants.hierarchicalLayout.levelSeparation); + } + if (this.constants.hierarchicalLayout.direction == "RL" || this.constants.hierarchicalLayout.direction == "LR") { + if (this.constants.smoothCurves.enabled == true) { + this.constants.smoothCurves.type = "vertical"; + } + } + else { + if (this.constants.smoothCurves.enabled == true) { + this.constants.smoothCurves.type = "horizontal"; + } + } + // get the size of the largest hubs and check if the user has defined a level for a node. + var hubsize = 0; + var node, nodeId; + var definedLevel = false; + var undefinedLevel = false; - if (edge.to.level != edge.from.level) { - edge.to.springFx -= fx; - edge.to.springFy -= fy; - edge.from.springFx += fx; - edge.from.springFy += fy; - } - else { - var factor = 0.5; - edge.to.fx -= factor*fx; - edge.to.fy -= factor*fy; - edge.from.fx += factor*fx; - edge.from.fy += factor*fy; - } + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.level != -1) { + definedLevel = true; + } + else { + undefinedLevel = true; + } + if (hubsize < node.edges.length) { + hubsize = node.edges.length; } } } - } - // normalize spring forces - var springForce = 1; - var springFx, springFy; - for (i = 0; i < nodeIndices.length; i++) { - var node = nodes[nodeIndices[i]]; - springFx = Math.min(springForce,Math.max(-springForce,node.springFx)); - springFy = Math.min(springForce,Math.max(-springForce,node.springFy)); + // if the user defined some levels but not all, alert and run without hierarchical layout + if (undefinedLevel == true && definedLevel == true) { + throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes."); + this.zoomExtent(true,this.constants.clustering.enabled); + if (!this.constants.clustering.enabled) { + this.start(); + } + } + else { + // setup the system to use hierarchical method. + this._changeConstants(); - node.fx += springFx; - node.fy += springFy; - } + // define levels if undefined by the users. Based on hubsize + if (undefinedLevel == true) { + this._determineLevels(hubsize); + } + // check the distribution of the nodes per level. + var distribution = this._getDistribution(); - // retain energy balance - var totalFx = 0; - var totalFy = 0; - for (i = 0; i < nodeIndices.length; i++) { - var node = nodes[nodeIndices[i]]; - totalFx += node.fx; - totalFy += node.fy; - } - var correctionFx = totalFx / nodeIndices.length; - var correctionFy = totalFy / nodeIndices.length; + // place the nodes on the canvas. This also stablilizes the system. + this._placeNodesByHierarchy(distribution); - for (i = 0; i < nodeIndices.length; i++) { - var node = nodes[nodeIndices[i]]; - node.fx -= correctionFx; - node.fy -= correctionFy; + // start the simulation. + this.start(); + } } - }; -/***/ }, -/* 63 */ -/***/ function(module, exports, __webpack_require__) { /** - * This function calculates the forces the nodes apply on eachother based on a gravitational model. - * The Barnes Hut method is used to speed up this N-body simulation. + * This function places the nodes on the canvas based on the hierarchial distribution. * + * @param {Object} distribution | obtained by the function this._getDistribution() * @private */ - exports._calculateNodeForces = function() { - if (this.constants.physics.barnesHut.gravitationalConstant != 0) { - var node; - var nodes = this.calculationNodes; - var nodeIndices = this.calculationNodeIndices; - var nodeCount = nodeIndices.length; + exports._placeNodesByHierarchy = function(distribution) { + var nodeId, node; - this._formBarnesHutTree(nodes,nodeIndices); + // start placing all the level 0 nodes first. Then recursively position their branches. + for (var level in distribution) { + if (distribution.hasOwnProperty(level)) { - var barnesHutTree = this.barnesHutTree; + for (nodeId in distribution[level].nodes) { + if (distribution[level].nodes.hasOwnProperty(nodeId)) { + node = distribution[level].nodes[nodeId]; + if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { + if (node.xFixed) { + node.x = distribution[level].minPos; + node.xFixed = false; - // place the nodes one by one recursively - for (var i = 0; i < nodeCount; i++) { - node = nodes[nodeIndices[i]]; - if (node.options.mass > 0) { - // starting with root is irrelevant, it never passes the BarnesHut condition - this._getForceContribution(barnesHutTree.root.children.NW,node); - this._getForceContribution(barnesHutTree.root.children.NE,node); - this._getForceContribution(barnesHutTree.root.children.SW,node); - this._getForceContribution(barnesHutTree.root.children.SE,node); + distribution[level].minPos += distribution[level].nodeSpacing; + } + } + else { + if (node.yFixed) { + node.y = distribution[level].minPos; + node.yFixed = false; + + distribution[level].minPos += distribution[level].nodeSpacing; + } + } + this._placeBranchNodes(node.edges,node.id,distribution,node.level); + } } } } + + // stabilize the system after positioning. This function calls zoomExtent. + this._stabilize(); }; /** - * This function traverses the barnesHutTree. It checks when it can approximate distant nodes with their center of mass. - * If a region contains a single node, we check if it is not itself, then we apply the force. + * This function get the distribution of levels based on hubsize * - * @param parentBranch - * @param node + * @returns {Object} * @private */ - exports._getForceContribution = function(parentBranch,node) { - // we get no force contribution from an empty region - if (parentBranch.childrenCount > 0) { - var dx,dy,distance; - - // get the distance from the center of mass to the node. - dx = parentBranch.centerOfMass.x - node.x; - dy = parentBranch.centerOfMass.y - node.y; - distance = Math.sqrt(dx * dx + dy * dy); + exports._getDistribution = function() { + var distribution = {}; + var nodeId, node, level; - // BarnesHut condition - // original condition : s/d < theta = passed === d/s > 1/theta = passed - // calcSize = 1/s --> d * 1/s > 1/theta = passed - if (distance * parentBranch.calcSize > this.constants.physics.barnesHut.theta) { - // duplicate code to reduce function calls to speed up program - if (distance == 0) { - distance = 0.1*Math.random(); - dx = distance; + // we fix Y because the hierarchy is vertical, we fix X so we do not give a node an x position for a second time. + // the fix of X is removed after the x value has been set. + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + node.xFixed = true; + node.yFixed = true; + if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { + node.y = this.constants.hierarchicalLayout.levelSeparation*node.level; } - var gravityForce = this.constants.physics.barnesHut.gravitationalConstant * parentBranch.mass * node.options.mass / (distance * distance * distance); - var fx = dx * gravityForce; - var fy = dy * gravityForce; - node.fx += fx; - node.fy += fy; - } - else { - // Did not pass the condition, go into children if available - if (parentBranch.childrenCount == 4) { - this._getForceContribution(parentBranch.children.NW,node); - this._getForceContribution(parentBranch.children.NE,node); - this._getForceContribution(parentBranch.children.SW,node); - this._getForceContribution(parentBranch.children.SE,node); + else { + node.x = this.constants.hierarchicalLayout.levelSeparation*node.level; } - else { // parentBranch must have only one node, if it was empty we wouldnt be here - if (parentBranch.children.data.id != node.id) { // if it is not self - // duplicate code to reduce function calls to speed up program - if (distance == 0) { - distance = 0.5*Math.random(); - dx = distance; - } - var gravityForce = this.constants.physics.barnesHut.gravitationalConstant * parentBranch.mass * node.options.mass / (distance * distance * distance); - var fx = dx * gravityForce; - var fy = dy * gravityForce; - node.fx += fx; - node.fy += fy; - } + if (distribution[node.level] === undefined) { + distribution[node.level] = {amount: 0, nodes: {}, minPos:0, nodeSpacing:0}; + } + distribution[node.level].amount += 1; + distribution[node.level].nodes[nodeId] = node; + } + } + + // determine the largest amount of nodes of all levels + var maxCount = 0; + for (level in distribution) { + if (distribution.hasOwnProperty(level)) { + if (maxCount < distribution[level].amount) { + maxCount = distribution[level].amount; } } } + + // set the initial position and spacing of each nodes accordingly + for (level in distribution) { + if (distribution.hasOwnProperty(level)) { + distribution[level].nodeSpacing = (maxCount + 1) * this.constants.hierarchicalLayout.nodeSpacing; + distribution[level].nodeSpacing /= (distribution[level].amount + 1); + distribution[level].minPos = distribution[level].nodeSpacing - (0.5 * (distribution[level].amount + 1) * distribution[level].nodeSpacing); + } + } + + return distribution; }; + /** - * This function constructs the barnesHut tree recursively. It creates the root, splits it and starts placing the nodes. + * this function allocates nodes in levels based on the recursive branching from the largest hubs. * - * @param nodes - * @param nodeIndices + * @param hubsize * @private */ - exports._formBarnesHutTree = function(nodes,nodeIndices) { - var node; - var nodeCount = nodeIndices.length; - - var minX = Number.MAX_VALUE, - minY = Number.MAX_VALUE, - maxX =-Number.MAX_VALUE, - maxY =-Number.MAX_VALUE; + exports._determineLevels = function(hubsize) { + var nodeId, node; - // get the range of the nodes - for (var i = 0; i < nodeCount; i++) { - var x = nodes[nodeIndices[i]].x; - var y = nodes[nodeIndices[i]].y; - if (nodes[nodeIndices[i]].options.mass > 0) { - if (x < minX) { minX = x; } - if (x > maxX) { maxX = x; } - if (y < minY) { minY = y; } - if (y > maxY) { maxY = y; } + // determine hubs + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.edges.length == hubsize) { + node.level = 0; + } } } - // make the range a square - var sizeDiff = Math.abs(maxX - minX) - Math.abs(maxY - minY); // difference between X and Y - if (sizeDiff > 0) {minY -= 0.5 * sizeDiff; maxY += 0.5 * sizeDiff;} // xSize > ySize - else {minX += 0.5 * sizeDiff; maxX -= 0.5 * sizeDiff;} // xSize < ySize - - - var minimumTreeSize = 1e-5; - var rootSize = Math.max(minimumTreeSize,Math.abs(maxX - minX)); - var halfRootSize = 0.5 * rootSize; - var centerX = 0.5 * (minX + maxX), centerY = 0.5 * (minY + maxY); - - // construct the barnesHutTree - var barnesHutTree = { - root:{ - centerOfMass: {x:0, y:0}, - mass:0, - range: { - minX: centerX-halfRootSize,maxX:centerX+halfRootSize, - minY: centerY-halfRootSize,maxY:centerY+halfRootSize - }, - size: rootSize, - calcSize: 1 / rootSize, - children: { data:null}, - maxWidth: 0, - level: 0, - childrenCount: 4 - } - }; - this._splitBranch(barnesHutTree.root); - // place the nodes one by one recursively - for (i = 0; i < nodeCount; i++) { - node = nodes[nodeIndices[i]]; - if (node.options.mass > 0) { - this._placeInTree(barnesHutTree.root,node); + // branch from hubs + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.level == 0) { + this._setLevel(1,node.edges,node.id); + } } } + }; - // make global - this.barnesHutTree = barnesHutTree + + /** + * Since hierarchical layout does not support: + * - smooth curves (based on the physics), + * - clustering (based on dynamic node counts) + * + * We disable both features so there will be no problems. + * + * @private + */ + exports._changeConstants = function() { + this.constants.clustering.enabled = false; + this.constants.physics.barnesHut.enabled = false; + this.constants.physics.hierarchicalRepulsion.enabled = true; + this._loadSelectedForceSolver(); + if (this.constants.smoothCurves.enabled == true) { + this.constants.smoothCurves.dynamic = false; + } + this._configureSmoothCurves(); }; /** - * this updates the mass of a branch. this is increased by adding a node. + * This is a recursively called function to enumerate the branches from the largest hubs and place the nodes + * on a X position that ensures there will be no overlap. * - * @param parentBranch - * @param node + * @param edges + * @param parentId + * @param distribution + * @param parentLevel * @private */ - exports._updateBranchMass = function(parentBranch, node) { - var totalMass = parentBranch.mass + node.options.mass; - var totalMassInv = 1/totalMass; - - parentBranch.centerOfMass.x = parentBranch.centerOfMass.x * parentBranch.mass + node.x * node.options.mass; - parentBranch.centerOfMass.x *= totalMassInv; - - parentBranch.centerOfMass.y = parentBranch.centerOfMass.y * parentBranch.mass + node.y * node.options.mass; - parentBranch.centerOfMass.y *= totalMassInv; + exports._placeBranchNodes = function(edges, parentId, distribution, parentLevel) { + for (var i = 0; i < edges.length; i++) { + var childNode = null; + if (edges[i].toId == parentId) { + childNode = edges[i].from; + } + else { + childNode = edges[i].to; + } - parentBranch.mass = totalMass; - var biggestSize = Math.max(Math.max(node.height,node.radius),node.width); - parentBranch.maxWidth = (parentBranch.maxWidth < biggestSize) ? biggestSize : parentBranch.maxWidth; + // if a node is conneceted to another node on the same level (or higher (means lower level))!, this is not handled here. + var nodeMoved = false; + if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { + if (childNode.xFixed && childNode.level > parentLevel) { + childNode.xFixed = false; + childNode.x = distribution[childNode.level].minPos; + nodeMoved = true; + } + } + else { + if (childNode.yFixed && childNode.level > parentLevel) { + childNode.yFixed = false; + childNode.y = distribution[childNode.level].minPos; + nodeMoved = true; + } + } + if (nodeMoved == true) { + distribution[childNode.level].minPos += distribution[childNode.level].nodeSpacing; + if (childNode.edges.length > 1) { + this._placeBranchNodes(childNode.edges,childNode.id,distribution,childNode.level); + } + } + } }; /** - * determine in which branch the node will be placed. + * this function is called recursively to enumerate the barnches of the largest hubs and give each node a level. * - * @param parentBranch - * @param node - * @param skipMassUpdate + * @param level + * @param edges + * @param parentId * @private */ - exports._placeInTree = function(parentBranch,node,skipMassUpdate) { - if (skipMassUpdate != true || skipMassUpdate === undefined) { - // update the mass of the branch. - this._updateBranchMass(parentBranch,node); - } - - if (parentBranch.children.NW.range.maxX > node.x) { // in NW or SW - if (parentBranch.children.NW.range.maxY > node.y) { // in NW - this._placeInRegion(parentBranch,node,"NW"); - } - else { // in SW - this._placeInRegion(parentBranch,node,"SW"); + exports._setLevel = function(level, edges, parentId) { + for (var i = 0; i < edges.length; i++) { + var childNode = null; + if (edges[i].toId == parentId) { + childNode = edges[i].from; } - } - else { // in NE or SE - if (parentBranch.children.NW.range.maxY > node.y) { // in NE - this._placeInRegion(parentBranch,node,"NE"); + else { + childNode = edges[i].to; } - else { // in SE - this._placeInRegion(parentBranch,node,"SE"); + if (childNode.level == -1 || childNode.level > level) { + childNode.level = level; + if (edges.length > 1) { + this._setLevel(level+1, childNode.edges, childNode.id); + } } } }; /** - * actually place the node in a region (or branch) + * Unfix nodes * - * @param parentBranch - * @param node - * @param region * @private */ - exports._placeInRegion = function(parentBranch,node,region) { - switch (parentBranch.children[region].childrenCount) { - case 0: // place node here - parentBranch.children[region].children.data = node; - parentBranch.children[region].childrenCount = 1; - this._updateBranchMass(parentBranch.children[region],node); - break; - case 1: // convert into children - // if there are two nodes exactly overlapping (on init, on opening of cluster etc.) - // we move one node a pixel and we do not put it in the tree. - if (parentBranch.children[region].children.data.x == node.x && - parentBranch.children[region].children.data.y == node.y) { - node.x += Math.random(); - node.y += Math.random(); - } - else { - this._splitBranch(parentBranch.children[region]); - this._placeInTree(parentBranch.children[region],node); - } - break; - case 4: // place in branch - this._placeInTree(parentBranch.children[region],node); - break; + exports._restoreNodes = function() { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + this.nodes[nodeId].xFixed = false; + this.nodes[nodeId].yFixed = false; + } } }; +/***/ }, +/* 63 */ +/***/ function(module, exports, __webpack_require__) { + + // English + exports['en'] = { + edit: 'Edit', + del: 'Delete selected', + back: 'Back', + addNode: 'Add Node', + addEdge: 'Add Edge', + editNode: 'Edit Node', + editEdge: 'Edit Edge', + addDescription: 'Click in an empty space to place a new node.', + edgeDescription: 'Click on a node and drag the edge to another node to connect them.', + editEdgeDescription: 'Click on the control points and drag them to a node to connect to it.', + createEdgeError: 'Cannot link edges to a cluster.', + deleteClusterError: 'Clusters cannot be deleted.' + }; + exports['en_EN'] = exports['en']; + exports['en_US'] = exports['en']; + + // Dutch + exports['nl'] = { + edit: 'Wijzigen', + del: 'Selectie verwijderen', + back: 'Terug', + addNode: 'Node toevoegen', + addEdge: 'Link toevoegen', + editNode: 'Node wijzigen', + editEdge: 'Link wijzigen', + addDescription: 'Klik op een leeg gebied om een nieuwe node te maken.', + edgeDescription: 'Klik op een node en sleep de link naar een andere node om ze te verbinden.', + editEdgeDescription: 'Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.', + createEdgeError: 'Kan geen link maken naar een cluster.', + deleteClusterError: 'Clusters kunnen niet worden verwijderd.' + }; + exports['nl_NL'] = exports['nl']; + exports['nl_BE'] = exports['nl']; + + +/***/ }, +/* 64 */ +/***/ function(module, exports, __webpack_require__) { + /** - * this function splits a branch into 4 sub branches. If the branch contained a node, we place it in the subbranch - * after the split is complete. - * - * @param parentBranch - * @private + * Canvas shapes used by Network */ - exports._splitBranch = function(parentBranch) { - // if the branch is shaded with a node, replace the node in the new subset. - var containedNode = null; - if (parentBranch.childrenCount == 1) { - containedNode = parentBranch.children.data; - parentBranch.mass = 0; parentBranch.centerOfMass.x = 0; parentBranch.centerOfMass.y = 0; - } - parentBranch.childrenCount = 4; - parentBranch.children.data = null; - this._insertRegion(parentBranch,"NW"); - this._insertRegion(parentBranch,"NE"); - this._insertRegion(parentBranch,"SW"); - this._insertRegion(parentBranch,"SE"); + if (typeof CanvasRenderingContext2D !== 'undefined') { + + /** + * Draw a circle shape + */ + CanvasRenderingContext2D.prototype.circle = function(x, y, r) { + this.beginPath(); + this.arc(x, y, r, 0, 2*Math.PI, false); + }; + + /** + * Draw a square shape + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r size, width and height of the square + */ + CanvasRenderingContext2D.prototype.square = function(x, y, r) { + this.beginPath(); + this.rect(x - r, y - r, r * 2, r * 2); + }; + + /** + * Draw a triangle shape + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r radius, half the length of the sides of the triangle + */ + CanvasRenderingContext2D.prototype.triangle = function(x, y, r) { + // http://en.wikipedia.org/wiki/Equilateral_triangle + this.beginPath(); + + var s = r * 2; + var s2 = s / 2; + var ir = Math.sqrt(3) / 6 * s; // radius of inner circle + var h = Math.sqrt(s * s - s2 * s2); // height + + this.moveTo(x, y - (h - ir)); + this.lineTo(x + s2, y + ir); + this.lineTo(x - s2, y + ir); + this.lineTo(x, y - (h - ir)); + this.closePath(); + }; + + /** + * Draw a triangle shape in downward orientation + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r radius + */ + CanvasRenderingContext2D.prototype.triangleDown = function(x, y, r) { + // http://en.wikipedia.org/wiki/Equilateral_triangle + this.beginPath(); + + var s = r * 2; + var s2 = s / 2; + var ir = Math.sqrt(3) / 6 * s; // radius of inner circle + var h = Math.sqrt(s * s - s2 * s2); // height + + this.moveTo(x, y + (h - ir)); + this.lineTo(x + s2, y - ir); + this.lineTo(x - s2, y - ir); + this.lineTo(x, y + (h - ir)); + this.closePath(); + }; - if (containedNode != null) { - this._placeInTree(parentBranch,containedNode); - } - }; + /** + * Draw a star shape, a star with 5 points + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r radius, half the length of the sides of the triangle + */ + CanvasRenderingContext2D.prototype.star = function(x, y, r) { + // http://www.html5canvastutorials.com/labs/html5-canvas-star-spinner/ + this.beginPath(); + for (var n = 0; n < 10; n++) { + var radius = (n % 2 === 0) ? r * 1.3 : r * 0.5; + this.lineTo( + x + radius * Math.sin(n * 2 * Math.PI / 10), + y - radius * Math.cos(n * 2 * Math.PI / 10) + ); + } - /** - * This function subdivides the region into four new segments. - * Specifically, this inserts a single new segment. - * It fills the children section of the parentBranch - * - * @param parentBranch - * @param region - * @param parentRange - * @private - */ - exports._insertRegion = function(parentBranch, region) { - var minX,maxX,minY,maxY; - var childSize = 0.5 * parentBranch.size; - switch (region) { - case "NW": - minX = parentBranch.range.minX; - maxX = parentBranch.range.minX + childSize; - minY = parentBranch.range.minY; - maxY = parentBranch.range.minY + childSize; - break; - case "NE": - minX = parentBranch.range.minX + childSize; - maxX = parentBranch.range.maxX; - minY = parentBranch.range.minY; - maxY = parentBranch.range.minY + childSize; - break; - case "SW": - minX = parentBranch.range.minX; - maxX = parentBranch.range.minX + childSize; - minY = parentBranch.range.minY + childSize; - maxY = parentBranch.range.maxY; - break; - case "SE": - minX = parentBranch.range.minX + childSize; - maxX = parentBranch.range.maxX; - minY = parentBranch.range.minY + childSize; - maxY = parentBranch.range.maxY; - break; - } + this.closePath(); + }; + + /** + * http://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-on-html-canvas + */ + CanvasRenderingContext2D.prototype.roundRect = function(x, y, w, h, r) { + var r2d = Math.PI/180; + if( w - ( 2 * r ) < 0 ) { r = ( w / 2 ); } //ensure that the radius isn't too large for x + if( h - ( 2 * r ) < 0 ) { r = ( h / 2 ); } //ensure that the radius isn't too large for y + this.beginPath(); + this.moveTo(x+r,y); + this.lineTo(x+w-r,y); + this.arc(x+w-r,y+r,r,r2d*270,r2d*360,false); + this.lineTo(x+w,y+h-r); + this.arc(x+w-r,y+h-r,r,0,r2d*90,false); + this.lineTo(x+r,y+h); + this.arc(x+r,y+h-r,r,r2d*90,r2d*180,false); + this.lineTo(x,y+r); + this.arc(x+r,y+r,r,r2d*180,r2d*270,false); + }; + /** + * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + */ + CanvasRenderingContext2D.prototype.ellipse = function(x, y, w, h) { + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle - parentBranch.children[region] = { - centerOfMass:{x:0,y:0}, - mass:0, - range:{minX:minX,maxX:maxX,minY:minY,maxY:maxY}, - size: 0.5 * parentBranch.size, - calcSize: 2 * parentBranch.calcSize, - children: {data:null}, - maxWidth: 0, - level: parentBranch.level+1, - childrenCount: 0 + this.beginPath(); + this.moveTo(x, ym); + this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); }; - }; - /** - * This function is for debugging purposed, it draws the tree. - * - * @param ctx - * @param color - * @private - */ - exports._drawTree = function(ctx,color) { - if (this.barnesHutTree !== undefined) { - ctx.lineWidth = 1; + /** + * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + */ + CanvasRenderingContext2D.prototype.database = function(x, y, w, h) { + var f = 1/3; + var wEllipse = w; + var hEllipse = h * f; - this._drawBranch(this.barnesHutTree.root,ctx,color); - } - }; + var kappa = .5522848, + ox = (wEllipse / 2) * kappa, // control point offset horizontal + oy = (hEllipse / 2) * kappa, // control point offset vertical + xe = x + wEllipse, // x-end + ye = y + hEllipse, // y-end + xm = x + wEllipse / 2, // x-middle + ym = y + hEllipse / 2, // y-middle + ymb = y + (h - hEllipse/2), // y-midlle, bottom ellipse + yeb = y + h; // y-end, bottom ellipse + this.beginPath(); + this.moveTo(xe, ym); - /** - * This function is for debugging purposes. It draws the branches recursively. - * - * @param branch - * @param ctx - * @param color - * @private - */ - exports._drawBranch = function(branch,ctx,color) { - if (color === undefined) { - color = "#FF0000"; - } + this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); - if (branch.childrenCount == 4) { - this._drawBranch(branch.children.NW,ctx); - this._drawBranch(branch.children.NE,ctx); - this._drawBranch(branch.children.SE,ctx); - this._drawBranch(branch.children.SW,ctx); - } - ctx.strokeStyle = color; - ctx.beginPath(); - ctx.moveTo(branch.range.minX,branch.range.minY); - ctx.lineTo(branch.range.maxX,branch.range.minY); - ctx.stroke(); + this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); - ctx.beginPath(); - ctx.moveTo(branch.range.maxX,branch.range.minY); - ctx.lineTo(branch.range.maxX,branch.range.maxY); - ctx.stroke(); + this.lineTo(xe, ymb); - ctx.beginPath(); - ctx.moveTo(branch.range.maxX,branch.range.maxY); - ctx.lineTo(branch.range.minX,branch.range.maxY); - ctx.stroke(); + this.bezierCurveTo(xe, ymb + oy, xm + ox, yeb, xm, yeb); + this.bezierCurveTo(xm - ox, yeb, x, ymb + oy, x, ymb); - ctx.beginPath(); - ctx.moveTo(branch.range.minX,branch.range.maxY); - ctx.lineTo(branch.range.minX,branch.range.minY); - ctx.stroke(); + this.lineTo(x, ym); + }; - /* - if (branch.mass > 0) { - ctx.circle(branch.centerOfMass.x, branch.centerOfMass.y, 3*branch.mass); - ctx.stroke(); - } + + /** + * Draw an arrow point (no line) */ - }; + CanvasRenderingContext2D.prototype.arrow = function(x, y, angle, length) { + // tail + var xt = x - length * Math.cos(angle); + var yt = y - length * Math.sin(angle); + // inner tail + // TODO: allow to customize different shapes + var xi = x - length * 0.9 * Math.cos(angle); + var yi = y - length * 0.9 * Math.sin(angle); -/***/ }, -/* 64 */ -/***/ function(module, exports, __webpack_require__) { + // left + var xl = xt + length / 3 * Math.cos(angle + 0.5 * Math.PI); + var yl = yt + length / 3 * Math.sin(angle + 0.5 * Math.PI); - module.exports = function(module) { - if(!module.webpackPolyfill) { - module.deprecate = function() {}; - module.paths = []; - // module.parent = undefined by default - module.children = []; - module.webpackPolyfill = 1; - } - return module; + // right + var xr = xt + length / 3 * Math.cos(angle - 0.5 * Math.PI); + var yr = yt + length / 3 * Math.sin(angle - 0.5 * Math.PI); + + this.beginPath(); + this.moveTo(x, y); + this.lineTo(xl, yl); + this.lineTo(xi, yi); + this.lineTo(xr, yr); + this.closePath(); + }; + + /** + * Sets up the dashedLine functionality for drawing + * Original code came from http://stackoverflow.com/questions/4576724/dotted-stroke-in-canvas + * @author David Jordan + * @date 2012-08-08 + */ + CanvasRenderingContext2D.prototype.dashedLine = function(x,y,x2,y2,dashArray){ + if (!dashArray) dashArray=[10,5]; + if (dashLength==0) dashLength = 0.001; // Hack for Safari + var dashCount = dashArray.length; + this.moveTo(x, y); + var dx = (x2-x), dy = (y2-y); + var slope = dy/dx; + var distRemaining = Math.sqrt( dx*dx + dy*dy ); + var dashIndex=0, draw=true; + while (distRemaining>=0.1){ + var dashLength = dashArray[dashIndex++%dashCount]; + if (dashLength > distRemaining) dashLength = distRemaining; + var xStep = Math.sqrt( dashLength*dashLength / (1 + slope*slope) ); + if (dx<0) xStep = -xStep; + x += xStep; + y += slope*xStep; + this[draw ? 'lineTo' : 'moveTo'](x,y); + distRemaining -= dashLength; + draw = !draw; + } + }; + + // TODO: add diamond shape } diff --git a/dist/vis.map b/dist/vis.map index 2b4d59f2..e49d38fa 100644 --- a/dist/vis.map +++ b/dist/vis.map @@ -1 +1 @@ -{"version":3,"file":"vis.map","sources":["./dist/vis.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","util","DOMutil","DataSet","DataView","Graph3d","graph3d","Camera","Filter","Point2d","Point3d","Slider","StepNumber","Timeline","Graph2d","timeline","DataStep","Range","stack","TimeStep","components","items","Item","ItemBox","ItemPoint","ItemRange","Component","CurrentTime","CustomTime","DataAxis","GraphGroup","Group","ItemSet","Legend","LineGraph","TimeAxis","Network","network","Edge","Groups","Images","Node","Popup","dotparser","gephiParser","Graph","Error","moment","hammer","isNumber","object","Number","isString","String","isDate","Date","match","ASPDateRegex","exec","isNaN","parse","isDataTable","google","visualization","DataTable","randomUUID","S4","Math","floor","random","toString","extend","a","i","len","arguments","length","other","prop","hasOwnProperty","selectiveExtend","props","Array","isArray","selectiveDeepExtend","b","TypeError","constructor","Object","undefined","deepExtend","selectiveNotDeepExtend","indexOf","equalArray","convert","type","Boolean","valueOf","isMoment","toDate","getType","toISOString","value","getAbsoluteLeft","elem","getBoundingClientRect","left","window","pageXOffset","getAbsoluteTop","top","pageYOffset","addClassName","className","classes","split","push","join","removeClassName","index","splice","forEach","callback","toArray","array","updateProperty","key","addEventListener","element","action","listener","useCapture","navigator","userAgent","attachEvent","removeEventListener","detachEvent","preventDefault","event","returnValue","getTarget","target","srcElement","nodeType","parentNode","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","GiveDec","Hex","Value","eval","GiveHex","Dec","parseColor","color","isValidRGB","rgb","substr","RGBToHex","isValidHex","hsv","hexToHSV","lighterColorHSV","h","s","v","min","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","hexToRGB","hex","replace","toUpperCase","substring","d","e","f","r","g","red","green","blue","RGBToHSV","minRGB","maxRGB","max","hue","saturation","HSVToRGB","q","t","isOk","test","selectiveBridgeObject","fields","referenceObject","objectTo","create","bridgeObject","mergeOptions","mergeTarget","options","enabled","binarySearch","orderedItems","range","field","field2","maxIterations","iteration","found","low","high","newLow","newHigh","guess","isVisible","start","console","log","binarySearchGeneric","sidePreference","newGuess","prevValue","nextValue","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","removeChild","getSVGElement","svgContainer","shift","document","createElementNS","appendChild","getDOMElement","DOMContainer","createElement","drawPoint","x","y","group","point","drawPoints","style","setAttributeNS","size","drawBar","width","height","rect","data","_options","_data","_fieldId","fieldId","_type","_subscribers","add","prototype","on","subscribers","subscribe","off","filter","unsubscribe","_trigger","params","senderId","concat","subscriber","addedIds","me","_addItem","columns","_getColumnNames","row","rows","getNumberOfRows","item","col","cols","getValue","update","updatedIds","addOrUpdate","_updateItem","get","ids","firstType","returnType","allowedValues","itemId","_getItem","order","_sort","_filterFields","_appendRow","result","getIds","getDataSet","map","mappedItems","filteredItem","name","sort","av","bv","remove","removedId","removedIds","_remove","clear","keys","maxField","itemField","minField","distinct","values","fieldType","count","exists","types","raw","converted","JSON","stringify","dataTable","getNumberOfColumns","getColumnId","getColumnLabel","addRow","setValue","_ids","_onEvent","apply","setData","viewOptions","getArguments","defaultFilter","dataSet","added","updated","removed","container","SyntaxError","containerElement","margin","defaultXCenter","defaultYCenter","xLabel","yLabel","zLabel","filterLabel","legendLabel","STYLE","DOT","showPerspective","showGrid","keepAspectRatio","showShadow","showGrayBottom","showTooltip","verticalRatio","animationInterval","animationPreload","camera","eye","dataPoints","colX","colY","colZ","colValue","colFilter","xMin","xStep","xMax","yMin","yStep","yMax","zMin","zStep","zMax","valueMin","valueMax","xBarWidth","yBarWidth","colorAxis","colorGrid","colorDot","colorDotBorder","setOptions","Emitter","_setScale","scale","z","xCenter","yCenter","zCenter","setArmLocation","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","ax","ay","az","cx","getCameraLocation","cy","cz","sinTx","sin","getCameraRotation","cosTx","cos","sinTy","cosTy","sinTz","cosTz","dx","dy","dz","bx","by","ex","ey","ez","getArmLength","xcenter","frame","canvas","clientWidth","ycenter","_setBackgroundColor","backgroundColor","fill","stroke","strokeWidth","borderColor","borderWidth","borderStyle","BAR","BARCOLOR","BARSIZE","DOTLINE","DOTCOLOR","DOTSIZE","GRID","LINE","SURFACE","_getStyleNumber","styleName","_determineColumnIndexes","counter","column","getDistinctValues","distinctValues","getColumnRange","minMax","_dataInitialize","rawData","_onChange","dataFilter","setOnLoadCallback","redraw","withBars","defaultXBarWidth","dataX","defaultYBarWidth","dataY","xRange","defaultXMin","defaultXMax","defaultXStep","yRange","defaultYMin","defaultYMax","defaultYStep","zRange","defaultZMin","defaultZMax","defaultZStep","valueRange","defaultValueMin","defaultValueMax","_getDataPoints","sortNumber","obj","dataMatrix","xIndex","yIndex","trans","screen","bottom","pointRight","pointTop","pointCross","hasChildNodes","firstChild","position","overflow","noCanvas","fontWeight","padding","innerHTML","onmousedown","_onMouseDown","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","onkeydown","setSize","_resizeCanvas","clientHeight","animationStart","slider","play","animationStop","stop","_resizeCenter","charAt","parseFloat","setCameraPosition","pos","horizontal","vertical","setArmRotation","distance","setArmLength","getCameraPosition","getArmRotation","_readData","_redrawFilter","animationAutoStart","cameraPosition","styleNumber","tooltip","showAnimationControls","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGrid","_redrawDataLine","_redrawDataBar","_redrawDataDot","_redrawInfo","_redrawLegend","ctx","getContext","clearRect","widthMin","widthMax","dotSize","right","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","fillStyle","closePath","gridLineLen","step","getCurrent","next","end","textAlign","textBaseline","fillText","label","visible","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","from","to","prettyStep","text","xText","yText","zText","offset","xOffset","yOffset","xMin2d","xMax2d","gridLenX","gridLenY","textMargin","armAngle","H","S","V","R","G","B","C","Hi","X","abs","parseInt","cross","topSideVisible","zAvg","transBottom","dist","sortDepth","aDiff","subtract","bDiff","crossproduct","crossProduct","radius","arc","PI","j","surface","corners","xWidth","yWidth","surfaces","center","avg","transCenter","diff","leftButtonDown","_onMouseUp","which","button","touchDown","startMouseX","getMouseX","startMouseY","getMouseY","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","diffX","diffY","horizontalNew","verticalNew","snapAngle","snapValue","round","parameters","emit","delay","mouseX","mouseY","tooltipTimeout","clearTimeout","_hideTooltip","dataPoint","_dataPointFromXY","_showTooltip","setTimeout","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","delta","wheelDelta","detail","oldLength","newLength","_insideTriangle","triangle","sign","as","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","sqrt","content","line","dot","dom","borderRadius","boxShadow","borderLeft","contentWidth","offsetWidth","contentHeight","offsetHeight","lineHeight","dotWidth","dotHeight","clientX","targetTouches","clientY","armLocation","armRotation","armLength","cameraLocation","cameraRotation","calculateCameraOrientation","rot","graph","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","dataView","progress","sub","sum","prev","bar","MozBorderRadius","slide","onclick","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","setIndex","playNext","interval","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","_start","_end","_step","precision","_current","setRange","setStep","calculatePrettyStep","log10","LN10","step1","pow","step2","step5","toPrecision","getStep","defaultOptions","autoResize","orientation","maxHeight","minHeight","_create","body","domProps","emitter","bind","snap","toScreen","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","timeAxis","currentTime","customTime","itemSet","itemsData","groupsData","setItems","Core","newDataSet","initialLoad","fit","setWindow","setGroups","groups","setSelection","focus","getSelection","itemData","middle","getItemRange","dataset","minItem","maxStartItem","maxEndItem","linegraph","getLegend","groupId","isGroupVisible","visibility","minimumStep","containerHeight","customRange","current","autoScale","stepIndex","marginStart","marginEnd","deadSpace","majorSteps","minorSteps","setMinimumStep","setFirst","safeSize","minimumStepValue","orderOfMagnitude","minorStepIdx","magnitudefactor","solutionFound","stepSize","niceStart","niceEnd","roundToMinor","marginRange","rounded","hasNext","previous","slice","isMajor","now","hours","minutes","seconds","milliseconds","clone","direction","moveable","zoomable","zoomMin","zoomMax","touch","_onDragStart","_onDrag","_onDragEnd","_onHold","_onMouseWheel","_onTouch","_onPinch","validateDirection","getPointer","pageX","pageY","hammerUtil","changed","_applyRange","newStart","newEnd","getRange","conversion","allowDragging","gesture","deltaX","deltaY","diffRange","fakeGesture","pointer","pointerDate","_pointerToDate","zoom","touches","initDate","move","EPSILON","orderByStart","orderByEnd","aTime","bTime","force","iMax","axis","collidingItem","jj","collision","nostack","SCALE","DAY","MILLISECOND","SECOND","MINUTE","HOUR","WEEKDAY","MONTH","YEAR","first","setFullYear","getFullYear","setMonth","setDate","setHours","setMinutes","setSeconds","setMilliseconds","getMilliseconds","getSeconds","getMinutes","getHours","getDate","getMonth","setScale","newScale","newStep","setAutoScale","enable","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","date","year","getLabelMinor","format","getLabelMajor","destroy","_isResized","resized","_previousWidth","_previousHeight","showCurrentTime","locales","locale","parent","backgroundVertical","title","time","currentTimeTimer","showCustomTime","eventParams","Hammer","drag","prevent_default","setCustomTime","getCustomTime","dragging","stopPropagation","svg","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","linegraphSVG","DOMelements","lines","labels","conversionFactor","minWidth","stepPixels","stepPixelsForced","lineOffset","master","svgElements","amountOfGroups","addGroup","graphOptions","updateGroup","removeGroup","hide","show","lineContainer","display","_redrawGroupIcons","iconHeight","iconOffset","drawIcon","backgroundHorizontal","changeCalled","activeGroups","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineWidth","minorLineHeight","majorLineWidth","majorLineHeight","_redrawLabels","amountOfSteps","stepDifference","valueAtZero","marginStartPos","maxLabelSize","_redrawLabel","_redrawLine","convertValue","invertedValue","convertedValue","characterHeight","largestWidth","majorCharWidth","minorCharWidth","textMinor","createTextNode","measureCharMinor","textMajor","measureCharMajor","groupsUsingDefaultStyles","usingDefaultStyle","zeroPosition","setZeroPosition","catmullRom","parametrization","alpha","SVGcontainer","path","fillPath","fillHeight","outline","shaded","barWidth","bar1Height","bar2Height","icon","yAxisOrientation","visibleItems","byStart","byEnd","inner","foreground","marker","Element","getLabelWidth","restack","_updateVisibleItems","markerHeight","lastMarkerHeight","dirty","displayed","offsetTop","offsetLeft","ii","repositionY","labelSet","setParent","_checkIfVisible","removeFromDataSet","removeItem","_constructByEndArray","endArray","initialPosByStart","newVisibleItems","initialPosByEnd","_checkIfInvisible","repositionX","align","groupOrder","selectable","editable","updateTime","onAdd","onUpdate","onMove","onRemove","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","selection","stackDirty","touchParams","_moveToGroup","oldGroup","UNGROUPED","box","_updateUngrouped","centerContainer","_onSelectItem","_onMultiSelectItem","_onAddItem","addCallback","fn","Function","markDirty","unselect","select","getVisibleItems","rawVisibleItems","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","lastWidth","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","firstGroupIndex","firstGroupId","ungrouped","getLabelSet","oldItemsData","getItems","_order","getGroups","_removeItem","groupData","groupOptions","oldGroupId","itemFromTarget","selected","dragLeftItem","dragRightItem","itemProps","groupFromTarget","changes","ctrlKey","srcEvent","shiftKey","oldSelection","newSelection","xAbs","newItem","itemSetFromTarget","side","iconSize","iconSpacing","textArea","drawLegendIcons","getComputedStyle","paddingTop","defaultGroup","sampling","graphHeight","barChart","handleOverlap","dataAxis","legend","abortedGraphUpdate","lastStart","rangePerPixelInv","_updateGraph","yAxisLeft","yAxisRight","legendLeft","legendRight","_updateAllGroupData","_updateGroup","groupsContent","ungroupedCounter","preprocessedGroupData","processedGroupData","groupRanges","minDate","maxDate","_getRelevantData","_convertXcoordinates","_getYRanges","_updateYAxis","_convertYcoordinates","_drawLineGraph","_drawBarGraphs","dataContainer","_applySampling","increment","amountOfPoints","xDistance","pointsPerPixel","ceil","sampledData","barCombinedData","barCombinedDataLeft","barCombinedDataRight","ignore","intersections","_getDataIntersections","_getStackedBarYRange","combinedData","accumulated","xpos","minVal","maxVal","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","_toggleAxisVisiblity","drawIcons","axisUsed","coreDistance","drawData","barPoints","heightOffset","_getSafeDrawData","nextKey","amount","resolved","prevKey","svgHeight","_catmullRom","_linear","dFill","_drawPoints","datapoints","xValue","yValue","extractedData","_catmullRomUniform","p0","p1","p2","p3","bp1","bp2","normalization","d1","d2","d3","A","N","M","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","majorLines","majorTexts","minorLines","minorTexts","lineTop","lang","parentChanged","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","insertBefore","xFirstMajorLabel","cur","_repaintMinorText","_repaintMajorText","_repaintMajorLine","_repaintMinorLine","leftTime","leftText","widthText","arr","pop","childNodes","nodeValue","_repaintDeleteButton","anchor","deleteButton","itemSetHeight","marginLeft","baseClassName","_repaintDragLeft","_repaintDragRight","contentLeft","parentWidth","boxWidth","dragLeft","dragRight","_initializeMixinLoaders","renderRefreshRate","renderTimestep","renderTime","maxPhysicsTicksPerRender","physicsDiscreteStepsize","initializing","triggerFunctions","edit","editEdge","connect","del","nodes","mass","radiusMin","radiusMax","shape","image","fixed","fontColor","fontSize","fontFace","level","highlightColor","edges","widthSelectionMultiplier","hoverWidth","fontFill","arrowScaleFactor","dash","gap","altLength","inheritColor","configurePhysics","physics","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","repulsion","nodeDistance","hierarchicalRepulsion","clustering","initialMaxNodes","clusterThreshold","reduceToNodes","chainThreshold","clusterEdgeThreshold","sectorThreshold","screenSizeThreshold","fontSizeMultiplier","maxFontSize","forceAmplification","distanceAmplification","edgeGrowth","nodeScaling","maxNodeSizeIncrements","activeAreaBoxSize","clusterLevelDifference","navigation","keyboard","speed","dataManipulation","initiallyVisible","hierarchicalLayout","levelSeparation","nodeSpacing","freezeForStabilization","smoothCurves","dynamic","roundness","dynamicSmoothCurves","maxVelocity","minVelocity","stabilize","stabilizationIterations","dragNetwork","dragNodes","hideEdgesOnDrag","hideNodesOnDrag","constants","hoverObj","controlNodesActive","images","setOnloadCallback","_redraw","xIncrement","yIncrement","zoomIncrement","_loadPhysicsSystem","_loadSectorSystem","_loadClusterSystem","_loadSelectionSystem","_loadHierarchySystem","_setTranslation","freezeSimulation","cachedFunctions","calculationNodes","calculationNodeIndices","nodeIndices","canvasTopLeft","canvasBottomRight","pointerPosition","areaCenter","previousScale","nodesData","edgesData","nodesListeners","_addNodes","_updateNodes","_removeNodes","edgesListeners","_addEdges","_updateEdges","_removeEdges","moving","timer","_setupHierarchicalLayout","zoomExtent","startWithClustering","mousetrap","MixinLoader","Activator","_getScriptPath","scripts","getElementsByTagName","src","_getRange","node","minY","maxY","minX","maxX","nodeId","_findCenter","_centerNetwork","initialZoom","disableStart","zoomLevel","numberOfNodes","factor","yDistance","xZoomLevel","yZoomLevel","_updateNodeIndexList","_clearNodeIndexList","idx","dotData","DOTToGraph","gephi","gephiData","parseGephi","_setNodes","_setEdges","_putDataInSector","_stabilize","onEdit","onEditEdge","onConnect","onDelete","editMode","newColorObj","groupname","clickToUse","activator","_createKeyBinds","_loadNavigationControls","_loadManipulationSystem","_configureSmoothCurves","pinch","_onTap","_onDoubleTap","_onRelease","_onMouseMoveTitle","reset","isActive","_moveUp","_yStopMoving","_moveDown","_moveLeft","_xStopMoving","_moveRight","_zoomIn","_stopZoom","_zoomOut","_createManipulatorBar","_deleteSelected","_getPointer","pinched","_getScale","_handleTouch","_handleDragStart","_getNodeAt","_getTranslation","isSelected","_selectObject","objectId","selectionObj","xFixed","yFixed","_handleOnDrag","_XconvertDOMtoCanvas","_XconvertCanvasToDOM","_YconvertDOMtoCanvas","_YconvertCanvasToDOM","_handleTap","_handleDoubleTap","_handleOnHold","_handleOnRelease","_zoom","scaleOld","preScaleDragPointer","DOMtoCanvas","scaleFrac","tx","ty","updateClustersDefault","postScaleDragPointer","canvasToDOM","popupObj","_checkHidePopup","checkShow","_checkShowPopup","popupTimer","edgeId","_getEdgeAt","_hoverObject","_blurObject","lastPopupNode","getTitle","isOverlappingWith","edge","connected","popup","setPosition","setText","oldNodesData","_updateSelection","angle","_resetLevels","_updateCalculationNodes","_reconnectEdges","_updateValueRange","updateLabels","setProperties","properties","oldEdgesData","oldEdge","disconnect","showInternalIds","_createBezierNodes","via","sectors","setValueRange","w","save","translate","_doInAllSectors","restore","offsetX","offsetY","_drawNodes","alwaysShow","setScaleAndPos","inArea","draw","sMax","_drawEdges","_drawControlNodes","_freezeDefinedNodes","_physicsTick","_restoreFrozenNodes","iterations","fixedData","_isMoving","vmin","isMoving","_discreteStepNodes","checkMovement","nodesPresent","discreteStepLimited","discreteStep","vminCorrected","_doInAllActiveSectors","_doInSupportSector","_animationStep","_handleNavigation","calculationTime","maxSteps","timeRequired","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","ua","toLowerCase","requiresTimeout","toggleFreeze","parentEdgeId","internalMultiplier","positionBezierNode","mixin","storePosition","dataArray","allowedToMoveX","allowedToMoveY","focusOnNode","nodePosition","requiredScale","canvasCenter","distanceFromCenter","active","networkConstants","fromId","toId","widthSelected","originalFromId","originalToId","widthFixed","lengthFixed","controlNodesEnabled","controlNodes","positions","connectedNode","_drawLine","_drawArrow","_drawArrowCenter","_drawDashLine","attachEdge","detachEdge","xFrom","yFrom","xTo","yTo","xObj","yObj","_getDistanceToEdge","_getColor","colorObj","_getLineWidth","_line","midpointX","midpointY","_pointOnLine","_label","resize","_circle","_pointOnCircle","networkScaleInv","_getViaCoordinates","xVia","yVia","quadraticCurveTo","measureText","fillRect","mozDash","setLineDash","pattern","lineDashOffset","mozDashOffset","lineCap","dashedLine","percentage","atan2","arrow","edgeSegmentLength","fromBorderDist","distanceToBorder","fromBorderPoint","toBorderDist","toBorderPoint","x1","y1","x2","y2","x3","y3","lastX","lastY","minDistance","_getDistanceToLine","px","py","something","u","nodeIdFrom","nodeIdTo","getControlNodePositions","_enableControlNodes","_disableControlNodes","_getSelectedControlNode","fromDistance","toDistance","_restoreControlNodes","defaultIndex","DEFAULT","load","url","img","Image","onload","imagelist","grouplist","dynamicEdges","reroutedEdges","fontDrawThreshold","horizontalAlignLeft","verticalAlignTop","baseRadiusValue","radiusFixed","preassignedLevel","fx","fy","vx","vy","resetCluster","dynamicEdgesLength","clusterSession","clusterSizeWidthFactor","clusterSizeHeightFactor","clusterSizeRadiusFactor","growthIndicator","networkScale","formationScale","clusterSize","containedNodes","containedEdges","clusterSessions","originalLabel","triggerFunction","groupObj","imageObj","_drawDatabase","_resizeDatabase","_drawBox","_resizeBox","_drawCircle","_resizeCircle","_drawEllipse","_resizeEllipse","_drawImage","_resizeImage","_drawText","_resizeText","_drawDot","_resizeShape","_drawSquare","_drawTriangle","_drawTriangleDown","_drawStar","_reset","clearSizeCache","_setForce","_addForce","isFixed","velocity","getDistance","globalAlpha","drawImage","textSize","getTextSize","clusterLineWidth","selectionLineWidth","borderWidthSelected","roundRect","database","diameter","circle","defaultSize","ellipse","_drawShape","radiusMultiplier","baseline","labelUnderNode","lineCount","yLine","inView","clearVelocity","updateVelocity","massBeforeClustering","energyBefore","styleAttr","fontFamily","WebkitBorderRadius","whiteSpace","maxWidth","parseDOT","parseGraph","nextPreview","isAlphaNumeric","regexAlphaNumeric","merge","o","addNode","graphs","attr","addEdge","createEdge","getToken","tokenType","TOKENTYPE","NULL","token","isComment","DELIMITER","c2","DELIMITERS","IDENTIFIER","newSyntaxError","UNKNOWN","chop","strict","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","message","maxLength","forEach2","array1","array2","elem1","elem2","convertEdge","dotEdge","graphEdge","graphData","dotNode","graphNode","subEdge","{","}","[","]",";","=",",","->","--","gephiJSON","allowedToMove","gEdges","gNodes","gEdge","source","attributes","gNode","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","listeners","events","args","scrollTop","scrollTopMin","_initAutoResize","component","_stopAutoResize","what","dataRange","getWindow","borderRootHeight","borderRootWidth","autoHeight","centerWidth","_updateScrollTop","visibilityTop","visibilityBottom","repaint","_startAutoResize","_onResize","lastHeight","watchTimer","setInterval","initialScrollTop","oldScrollTop","_getScrollTop","newScrollTop","_setScrollTop","eventType","getTouchList","collectEventData","custom","back","editNode","addDescription","edgeDescription","editEdgeDescription","createEdgeError","deleteClusterError","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","n","r2d","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","wEllipse","hEllipse","ymb","yeb","xt","yt","xi","yi","xl","yl","xr","yr","dashArray","dashLength","dashCount","slope","distRemaining","dashIndex","PhysicsMixin","ClusterMixin","SectorsMixin","SelectionMixin","ManipulationMixin","NavigationMixin","HierarchicalLayoutMixin","_loadMixin","sourceVariable","mixinFunction","_clearMixin","_loadSelectedForceSolver","_loadPhysicsConfiguration","hubThreshold","activeSector","drawingNode","blockConnectingEdgeSelection","forceAppendSelection","manipulationDiv","editModeDiv","closeDiv","_cleanNavigation","_loadNavigationElements","overlay","_onTapOverlay","windowHammer","_hasParent","deactivate","escListener","activate","unbind","_callbacks","once","self","removeListener","removeAllListeners","callbacks","cb","hasListeners","_addEvent","_characterFromEvent","fromCharCode","_MAP","_KEYCODE_MAP","_stop","tag_name","tagName","contentEditable","_modifiersMatch","modifiers1","modifiers2","_resetSequences","do_not_reset","active_sequences","_sequence_levels","_inside_sequence","_getMatches","character","modifiers","combination","matches","_isModifier","seq","combo","_eventModifiers","altKey","metaKey","_fireCallback","cancelBubble","_handleCharacter","processed_sequence_callback","_handleKey","keyCode","_ignore_next_keyup","_resetSequenceTimer","_reset_timer","_getReverseMap","_REVERSE_MAP","_pickBestAction","_bindSequence","_increaseSequence","_callbackAndReset","_bindSingle","sequence_name","sequence","_SPECIAL_ALIASES","_SHIFT_MAP","_bindMultiple","combinations",8,9,13,16,17,18,20,27,32,33,34,35,36,37,38,39,40,45,46,91,93,224,106,107,109,110,111,186,187,188,189,190,191,192,219,220,221,222,"~","!","@","#","$","%","^","&","*","(",")","_","+",":","\"","<",">","?","|","command","return","escape","_direct_map","trigger","__WEBPACK_AMD_DEFINE_RESULT__","global","dfl","defaultParsingFlags","empty","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","deprecate","msg","printMsg","suppressDeprecationWarnings","warn","firstTime","padToken","func","leftZeroFill","ordinalizeToken","period","ordinal","Language","Moment","config","checkOverflow","Duration","duration","normalizedInput","normalizeObjectUnits","years","quarters","quarter","months","month","weeks","week","days","day","hour","minute","second","millisecond","_milliseconds","_days","_months","_bubble","cloneMoment","momentProperties","absRound","number","targetLength","forceSign","output","addOrSubtractDurationFromMoment","mom","isAdding","updateOffset","_d","setTime","rawSetter","rawGetter","rawMonthSetter","input","compareArrays","dontConvert","lengthDiff","diffs","toInt","normalizeUnits","units","lowered","unitAliases","camelFunctions","inputObject","normalizedProp","makeList","setter","getter","method","_lang","results","utc","set","argumentForCoercion","coercedNumber","isFinite","daysInMonth","UTC","getUTCDate","weeksInYear","dow","doy","weekOfYear","daysInYear","isLeapYear","_a","_pf","DATE","_overflowDayOfYear","isValid","_isValid","getTime","_strict","normalizeLanguage","makeAs","model","_isUTC","zone","_offset","local","loadLang","abbr","languages","unloadLang","getLangDefinition","k","hasModule","removeFormattingTokens","makeFormatFunction","formattingTokens","formatTokenFunctions","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","lastIndex","getParseRegexForToken","parseTokenOneDigit","parseTokenThreeDigits","parseTokenFourDigits","parseTokenOneToFourDigits","parseTokenSignedNumber","parseTokenSixDigits","parseTokenOneToSixDigits","parseTokenTwoDigits","parseTokenOneToThreeDigits","parseTokenWord","_l","_meridiemParse","parseTokenTimestampMs","parseTokenTimezone","parseTokenT","parseTokenDigits","parseTokenOneOrTwoDigits","parseTokenOrdinal","RegExp","regexpEscape","unescapeFormat","timezoneMinutesFromString","string","possibleTzMatches","tzChunk","parts","parseTimezoneChunker","addTimeToArrayFromToken","datePartArray","monthsParse","_dayOfYear","parseTwoDigitYear","_isPm","isPM","_useUTC","_tzm","weekdaysParse","_w","invalidWeekday","dayOfYearFromWeekInfo","weekYear","weekday","temp","GG","W","E","_week","gg","dayOfYearFromWeeks","dayOfYear","dateFromConfig","currentDate","yearToUse","currentDateArray","makeUTCDate","getUTCMonth","makeDate","setUTCMinutes","getUTCMinutes","dateFromObject","_i","getUTCFullYear","makeDateFromStringAndFormat","_f","ISO_8601","parseISO","parsedInput","tokens","skipped","stringLength","totalParsedInputLength","matched","p4","makeDateFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","NaN","score","l","isoRegex","isoDates","isoTimes","makeDateFromString","createFromInputFallback","makeDateFromInput","aspNetJsonRegex","ms","setUTCFullYear","parseWeekday","language","substituteTimeAgo","withoutSuffix","isFuture","relativeTime","relativeTimeThresholds","dd","dm","firstDayOfWeek","firstDayOfWeekOfYear","adjustedMoment","daysToDayOfWeek","daysToAdd","getUTCDay","makeMoment","invalid","preparse","pickBy","moments","res","dayOfMonth","unit","makeAccessor","keepTime","makeDurationGetter","makeDurationAsGetter","makeGlobal","shouldDeprecate","ender","oldGlobalMoment","globalScope","VERSION","_isAMomentObject","aspNetTimeSpanJsonRegex","isoDurationRegex","isoFormat","unitMillisecondFactors","Milliseconds","Seconds","Minutes","Hours","Days","Months","Years","D","Q","DDD","dayofyear","isoweekday","isoweek","weekyear","isoweekyear","ordinalizeTokens","paddedTokens","MMM","monthsShort","MMMM","weekdaysMin","ddd","weekdaysShort","dddd","weekdays","isoWeek","YY","YYYY","YYYYY","YYYYYY","gggg","ggggg","isoWeekYear","GGGG","GGGGG","isoWeekday","meridiem","SS","SSS","SSSS","Z","ZZ","zoneAbbr","zz","zoneName","unix","lists","DDDD","_monthsShort","monthName","regex","_monthsParse","_weekdays","_weekdaysShort","_weekdaysMin","weekdayName","_weekdaysParse","_longDateFormat","LT","L","LL","LLL","LLLL","val","isLower","_calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","_relativeTime","future","past","mm","hh","MM","yy","pastFuture","_ordinal","postformat","_invalidDate","ret","parseIso","isDuration","inp","version","defaultFormat","relativeTimeThreshold","threshold","limit","_abbr","langData","flags","parseZone","isDSTShifted","parsingFlags","invalidAt","inputString","dur","asFloat","that","zoneDiff","startOf","humanize","fromNow","sod","isDST","getDay","endOf","isAfter","isBefore","isSame","getTimezoneOffset","_changeInProgress","hasAlignedHourOffset","isoWeeksInYear","weekInfo","dates","isoWeeks","toJSON","withSuffix","difference","toIsoString","asSeconds","asMonths","require","noGlobal","setup","READY","Event","determineEventTypes","Utils","each","gestures","Detection","register","onTouch","DOCUMENT","EVENT_MOVE","detect","EVENT_END","Instance","defaults","behavior","userSelect","touchAction","touchCallout","contentZooming","userDrag","tapHighlightColor","HAS_POINTEREVENTS","pointerEnabled","msPointerEnabled","HAS_TOUCHEVENTS","IS_MOBILE","NO_MOUSEEVENTS","CALCULATE_INTERVAL","EVENT_TYPES","DIRECTION_DOWN","DIRECTION_LEFT","DIRECTION_UP","DIRECTION_RIGHT","POINTER_MOUSE","POINTER_TOUCH","POINTER_PEN","EVENT_START","EVENT_RELEASE","EVENT_TOUCH","plugins","utils","dest","handler","iterator","context","inStr","find","inArray","hasParent","getCenter","getVelocity","deltaTime","getAngle","touch1","touch2","getDirection","getScale","getRotation","isVertical","setPrefixedCss","toggle","prefixes","toCamelCase","toggleBehavior","falseFn","onselectstart","ondragstart","str","preventMouseEvents","started","shouldDetect","hook","onTouchHandler","ev","triggerType","srcType","isPointer","isMouse","buttons","PointerEvent","matchType","updatePointer","doDetect","touchList","touchListLength","triggerChange","changedLength","changedTouches","evData","identifiers","identifier","pointerType","timeStamp","preventManipulation","stopDetect","pointers","touchlist","pointerEvent","pointerId","pt","MSPOINTER_TYPE_MOUSE","MSPOINTER_TYPE_TOUCH","MSPOINTER_TYPE_PEN","detection","stopped","startDetect","inst","eventData","startEvent","lastEvent","lastCalcEvent","futureCalcEvent","lastCalcData","extendEventData","instOptions","getCalculatedData","recalc","calcEv","calcData","velocityX","velocityY","interimAngle","interimDirection","startEv","lastEv","rotation","eventStartHandler","eventHandlers","createEvent","initEvent","dispatchEvent","state","dispose","eh","dragGesture","dragMaxTouches","triggered","dragMinDistance","startCenter","dragDistanceCorrection","dragLockToAxis","dragLockMinDistance","lastDirection","dragBlockVertical","dragBlockHorizontal","Drag","Gesture","holdGesture","holdTimeout","holdThreshold","Hold","Release","Infinity","Swipe","swipeMinTouches","swipeMaxTouches","swipeVelocityX","swipeVelocityY","tapGesture","sincePrev","didDoubleTap","hasMoved","tapMaxDistance","tapMaxTime","doubleTapInterval","doubleTapDistance","tapAlways","Tap","Touch","preventMouse","transformGesture","scaleThreshold","rotationThreshold","transformMinScale","transformMinRotation","Transform","clusterToFit","maxNumberOfNodes","reposition","maxLevels","forceAggregateHubs","normalizeClusterLevels","increaseClusterLevel","repositionNodes","openCluster","isMovingBeforeClustering","_nodeInActiveArea","_sector","_addSector","decreaseClusterLevel","_expandClusterNode","_updateDynamicEdges","updateClusters","zoomDirection","recursive","doNotStart","amountOfNodes","_collapseSector","_formClusters","_openClusters","_openClustersBySize","_aggregateHubs","handleChains","chainPercentage","_getChainFraction","_reduceAmountOfChains","_getHubSize","_formClustersByHub","openAll","containedNodeId","childNode","_expelChildFromParent","_unselectAll","_releaseContainedEdges","_connectEdgeBackToChild","_validateEdges","othersPresent","childNodeId","_repositionBezierNodes","_formClustersByZoom","_forceClustersByZoom","minLength","_addToCluster","_clusterToSmallestNeighbour","smallestNeighbour","smallestNeighbourNode","neighbour","onlyEqual","_formClusterFromHub","hubNode","absorptionSizeOffset","allowCluster","edgesIdarray","amountOfInitialEdges","_addToContainedEdges","_connectEdgeToCluster","_containCircularEdgesFromNode","massBefore","correction","edgeToId","edgeFromId","_addToReroutedEdges","maxLevel","minLevel","clusterLevel","targetLevel","average","averageSquared","hubCounter","largestHub","variance","standardDeviation","fraction","reduceAmount","chains","total","_switchToSector","sectorId","sectorType","_switchToActiveSector","_switchToFrozenSector","_switchToSupportSector","_loadLatestSector","_previousSector","_setActiveSector","newId","_forgetLastSector","_createNewSector","_deleteActiveSector","_deleteFrozenSector","_freezeSector","_activateSector","_mergeThisWithFrozen","_collapseThisToSingleCluster","sector","unqiueIdentifier","previousSector","runFunction","argument","_doInAllFrozenSectors","_drawSectorNodes","_drawAllSectorNodes","_getNodesOverlappingWith","overlappingNodes","_getAllNodesOverlappingWith","_pointerToPositionObject","positionObject","_getEdgesOverlappingWith","overlappingEdges","_getAllEdgesOverlappingWith","_addToSelection","_addToHover","_removeFromSelection","doNotTrigger","_unselectClusters","_getSelectedNodeCount","_getSelectedNode","_getSelectedEdge","_getSelectedEdgeCount","_getSelectedObjectCount","_selectionIsEmpty","_clusterInSelection","_selectConnectedEdges","_hoverConnectedEdges","_unselectConnectedEdges","append","highlightEdges","nodeIds","getSelectedNodes","edgeIds","getSelectedEdges","idArray","RangeError","selectNodes","selectEdges","_clearManipulatorBar","_restoreOverloadedFunctions","functionName","_toggleEditMode","toolbar","getElementById","boundFunction","edgeBeingEdited","selectedControlNode","addNodeButton","_createAddNodeToolbar","addEdgeButton","_createAddEdgeToolbar","editButton","_editNode","_createEditEdgeToolbar","editModeButton","backButton","_addNode","_handleConnect","_finishConnect","_selectControlNode","_controlNodeDrag","_releaseControlNode","newNode","_editEdge","alert","smooth","connectFromId","_createEdge","defaultData","finalizedData","sourceNodeId","targetNodeId","selectedNodes","selectedEdges","wrapper","navigationDivs","navigationDivActions","_stopMovement","hubsize","definedLevel","undefinedLevel","_changeConstants","_determineLevels","distribution","_getDistribution","_placeNodesByHierarchy","minPos","_placeBranchNodes","maxCount","_setLevel","parentId","parentLevel","nodeMoved","_restoreNodes","graphToggleSmoothCurves","graph_toggleSmooth","graphRepositionNodes","showValueOfRange","graphGenerateOptions","optionsSpecific","radioButton1","radioButton2","checked","backupConstants","optionsDiv","switchConfigurations","radioButton","querySelector","tableId","table","constantsVariableName","valueId","rangeValue","_overWriteGraphConstants","RepulsionMixin","HierarchialRepulsionMixin","BarnesHutMixin","_toggleBarnesHut","barnesHutTree","_initializeForceCalculation","_calculateForces","_calculateGravitationalForces","_calculateNodeForces","_calculateSpringForcesWithSupport","_calculateHierarchicalSpringForces","_calculateSpringForces","supportNodes","supportNodeId","gravity","gravityForce","edgeLength","springForce","combinedClusterSize","node1","node2","node3","_calculateSpringForce","physicsConfiguration","hierarchicalLayoutDirections","parentElement","rangeElement","radioButton3","graph_repositionNodes","graph_generateOptions","nameArray","webpackContext","req","webpackContextResolve","resolve","repulsingForce","a_base","minimumDistance","steepness","springFx","springFy","totalFx","totalFy","correctionFx","correctionFy","nodeCount","_formBarnesHutTree","_getForceContribution","children","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","MAX_VALUE","sizeDiff","minimumTreeSize","rootSize","halfRootSize","centerX","centerY","_splitBranch","_placeInTree","_updateBranchMass","totalMass","totalMassInv","biggestSize","skipMassUpdate","_placeInRegion","region","containedNode","_insertRegion","childSize","_drawTree","_drawBranch","branch","webpackPolyfill","paths"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"vis.map","sources":["./dist/vis.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","util","DOMutil","DataSet","DataView","Graph3d","graph3d","Camera","Filter","Point2d","Point3d","Slider","StepNumber","Timeline","Graph2d","timeline","DataStep","Range","stack","TimeStep","components","items","Item","ItemBox","ItemPoint","ItemRange","Component","CurrentTime","CustomTime","DataAxis","GraphGroup","Group","ItemSet","Legend","LineGraph","TimeAxis","Network","network","Edge","Groups","Images","Node","Popup","dotparser","gephiParser","Graph","Error","moment","hammer","isNumber","object","Number","isString","String","isDate","Date","match","ASPDateRegex","exec","isNaN","parse","isDataTable","google","visualization","DataTable","randomUUID","S4","Math","floor","random","toString","extend","a","i","len","arguments","length","other","prop","hasOwnProperty","selectiveExtend","props","Array","isArray","selectiveDeepExtend","b","TypeError","constructor","Object","undefined","deepExtend","selectiveNotDeepExtend","indexOf","equalArray","convert","type","Boolean","valueOf","isMoment","toDate","getType","toISOString","value","getAbsoluteLeft","elem","getBoundingClientRect","left","window","pageXOffset","getAbsoluteTop","top","pageYOffset","addClassName","className","classes","split","push","join","removeClassName","index","splice","forEach","callback","toArray","array","updateProperty","key","addEventListener","element","action","listener","useCapture","navigator","userAgent","attachEvent","removeEventListener","detachEvent","preventDefault","event","returnValue","getTarget","target","srcElement","nodeType","parentNode","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","GiveDec","Hex","Value","eval","GiveHex","Dec","parseColor","color","isValidRGB","rgb","substr","RGBToHex","isValidHex","hsv","hexToHSV","lighterColorHSV","h","s","v","min","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","hexToRGB","hex","replace","toUpperCase","substring","d","e","f","r","g","red","green","blue","RGBToHSV","minRGB","maxRGB","max","hue","saturation","HSVToRGB","q","t","isOk","test","selectiveBridgeObject","fields","referenceObject","objectTo","create","bridgeObject","mergeOptions","mergeTarget","options","enabled","binarySearch","orderedItems","range","field","field2","maxIterations","iteration","found","low","high","newLow","newHigh","guess","isVisible","start","console","log","binarySearchGeneric","sidePreference","newGuess","prevValue","nextValue","__WEBPACK_AMD_DEFINE_RESULT__","global","dfl","defaultParsingFlags","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","deprecate","msg","fn","printMsg","suppressDeprecationWarnings","warn","firstTime","apply","padToken","func","count","leftZeroFill","ordinalizeToken","period","lang","ordinal","Language","Moment","config","checkOverflow","Duration","duration","normalizedInput","normalizeObjectUnits","years","year","quarters","quarter","months","month","weeks","week","days","day","hours","hour","minutes","minute","seconds","second","milliseconds","millisecond","_milliseconds","_days","_months","_data","_bubble","cloneMoment","result","momentProperties","absRound","number","ceil","targetLength","forceSign","output","abs","sign","addOrSubtractDurationFromMoment","mom","isAdding","updateOffset","_d","setTime","rawSetter","rawGetter","rawMonthSetter","input","prototype","compareArrays","array1","array2","dontConvert","lengthDiff","diffs","toInt","normalizeUnits","units","lowered","toLowerCase","unitAliases","camelFunctions","inputObject","normalizedProp","makeList","setter","format","getter","method","_lang","results","utc","set","argumentForCoercion","coercedNumber","isFinite","daysInMonth","UTC","getUTCDate","weeksInYear","dow","doy","weekOfYear","daysInYear","isLeapYear","_a","_pf","MONTH","DATE","YEAR","HOUR","MINUTE","SECOND","MILLISECOND","_overflowDayOfYear","isValid","_isValid","getTime","_strict","normalizeLanguage","makeAs","model","_isUTC","zone","_offset","local","loadLang","values","abbr","languages","unloadLang","getLangDefinition","j","next","get","k","hasModule","slice","removeFormattingTokens","makeFormatFunction","formattingTokens","formatTokenFunctions","Function","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","lastIndex","getParseRegexForToken","token","strict","parseTokenOneDigit","parseTokenThreeDigits","parseTokenFourDigits","parseTokenOneToFourDigits","parseTokenSignedNumber","parseTokenSixDigits","parseTokenOneToSixDigits","parseTokenTwoDigits","parseTokenOneToThreeDigits","parseTokenWord","_l","_meridiemParse","parseTokenTimestampMs","parseTokenTimezone","parseTokenT","parseTokenDigits","parseTokenOneOrTwoDigits","parseTokenOrdinal","RegExp","regexpEscape","unescapeFormat","timezoneMinutesFromString","string","possibleTzMatches","tzChunk","parts","parseTimezoneChunker","addTimeToArrayFromToken","datePartArray","monthsParse","parseInt","_dayOfYear","parseTwoDigitYear","_isPm","isPM","parseFloat","_useUTC","_tzm","weekdaysParse","_w","invalidWeekday","dayOfYearFromWeekInfo","w","weekYear","weekday","temp","GG","W","E","_week","gg","dayOfYearFromWeeks","dayOfYear","dateFromConfig","date","currentDate","yearToUse","currentDateArray","makeUTCDate","getUTCMonth","makeDate","setUTCMinutes","getUTCMinutes","dateFromObject","_i","now","getUTCFullYear","getFullYear","getMonth","getDate","makeDateFromStringAndFormat","_f","ISO_8601","parseISO","parsedInput","tokens","skipped","stringLength","totalParsedInputLength","matched","p1","p2","p3","p4","makeDateFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","NaN","score","l","isoRegex","isoDates","isoTimes","makeDateFromString","createFromInputFallback","makeDateFromInput","aspNetJsonRegex","y","M","ms","setFullYear","setUTCFullYear","parseWeekday","language","substituteTimeAgo","withoutSuffix","isFuture","relativeTime","round","args","relativeTimeThresholds","dd","dm","dy","firstDayOfWeek","firstDayOfWeekOfYear","adjustedMoment","end","daysToDayOfWeek","add","daysToAdd","getUTCDay","makeMoment","invalid","preparse","pickBy","moments","res","dayOfMonth","unit","makeAccessor","keepTime","makeDurationGetter","name","makeDurationAsGetter","factor","makeGlobal","shouldDeprecate","ender","oldGlobalMoment","globalScope","VERSION","_isAMomentObject","aspNetTimeSpanJsonRegex","isoDurationRegex","isoFormat","unitMillisecondFactors","Milliseconds","Seconds","Minutes","Hours","Days","Months","Years","D","Q","DDD","dayofyear","isoweekday","isoweek","weekyear","isoweekyear","ordinalizeTokens","paddedTokens","MMM","monthsShort","MMMM","weekdaysMin","ddd","weekdaysShort","dddd","weekdays","isoWeek","YY","YYYY","YYYYY","YYYYYY","gggg","ggggg","isoWeekYear","GGGG","GGGGG","isoWeekday","meridiem","A","H","S","SS","SSS","SSSS","Z","ZZ","z","zoneAbbr","zz","zoneName","X","unix","lists","pop","DDDD","_monthsShort","monthName","regex","_monthsParse","_weekdays","_weekdaysShort","_weekdaysMin","weekdayName","_weekdaysParse","_longDateFormat","LT","L","LL","LLL","LLLL","val","charAt","isLower","_calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","_relativeTime","future","past","mm","hh","MM","yy","pastFuture","diff","_ordinal","postformat","_invalidDate","ret","parseIso","isDuration","inp","version","defaultFormat","relativeTimeThreshold","threshold","limit","_abbr","langData","obj","flags","parseZone","clone","isDSTShifted","parsingFlags","invalidAt","inputString","dur","subtract","asFloat","that","zoneDiff","startOf","from","time","humanize","fromNow","sod","isDST","getDay","endOf","isAfter","isBefore","isSame","offset","getTimezoneOffset","_changeInProgress","hasAlignedHourOffset","isoWeeksInYear","weekInfo","dates","isoWeeks","toJSON","data","withSuffix","difference","as","toIsoString","asSeconds","asMonths","require","noGlobal","webpackContext","req","webpackContextResolve","map","keys","resolve","webpackPolyfill","paths","children","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","removeChild","getSVGElement","svgContainer","shift","document","createElementNS","appendChild","getDOMElement","DOMContainer","createElement","drawPoint","x","group","point","drawPoints","style","setAttributeNS","size","drawBar","width","height","rect","_options","_fieldId","fieldId","_type","_subscribers","on","subscribers","subscribe","off","filter","unsubscribe","_trigger","params","senderId","concat","subscriber","addedIds","me","_addItem","columns","_getColumnNames","row","rows","getNumberOfRows","item","col","cols","getValue","update","updatedIds","addOrUpdate","_updateItem","ids","firstType","returnType","allowedValues","itemId","_getItem","order","_sort","_filterFields","_appendRow","getIds","getDataSet","mappedItems","filteredItem","sort","av","bv","remove","removedId","removedIds","_remove","clear","maxField","itemField","minField","distinct","fieldType","exists","types","raw","converted","JSON","stringify","dataTable","getNumberOfColumns","getColumnId","getColumnLabel","addRow","setValue","_ids","_onEvent","setData","viewOptions","getArguments","defaultFilter","dataSet","added","updated","removed","container","SyntaxError","containerElement","margin","defaultXCenter","defaultYCenter","xLabel","yLabel","zLabel","filterLabel","legendLabel","STYLE","DOT","showPerspective","showGrid","keepAspectRatio","showShadow","showGrayBottom","showTooltip","verticalRatio","animationInterval","animationPreload","camera","eye","dataPoints","colX","colY","colZ","colValue","colFilter","xMin","xStep","xMax","yMin","yStep","yMax","zMin","zStep","zMax","valueMin","valueMax","xBarWidth","yBarWidth","colorAxis","colorGrid","colorDot","colorDotBorder","setOptions","Emitter","_setScale","scale","xCenter","yCenter","zCenter","setArmLocation","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","ax","ay","az","cx","getCameraLocation","cy","cz","sinTx","sin","getCameraRotation","cosTx","cos","sinTy","cosTy","sinTz","cosTz","dx","dz","bx","by","ex","ey","ez","getArmLength","xcenter","frame","canvas","clientWidth","ycenter","_setBackgroundColor","backgroundColor","fill","stroke","strokeWidth","borderColor","borderWidth","borderStyle","BAR","BARCOLOR","BARSIZE","DOTLINE","DOTCOLOR","DOTSIZE","GRID","LINE","SURFACE","_getStyleNumber","styleName","_determineColumnIndexes","counter","column","getDistinctValues","distinctValues","getColumnRange","minMax","_dataInitialize","rawData","_onChange","dataFilter","setOnLoadCallback","redraw","withBars","defaultXBarWidth","dataX","defaultYBarWidth","dataY","xRange","defaultXMin","defaultXMax","defaultXStep","yRange","defaultYMin","defaultYMax","defaultYStep","zRange","defaultZMin","defaultZMax","defaultZStep","valueRange","defaultValueMin","defaultValueMax","_getDataPoints","sortNumber","dataMatrix","xIndex","yIndex","trans","screen","bottom","pointRight","pointTop","pointCross","hasChildNodes","firstChild","position","noCanvas","fontWeight","padding","innerHTML","onmousedown","_onMouseDown","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","onkeydown","setSize","_resizeCanvas","clientHeight","animationStart","slider","play","animationStop","stop","_resizeCenter","setCameraPosition","pos","horizontal","vertical","setArmRotation","distance","setArmLength","getCameraPosition","getArmRotation","_readData","_redrawFilter","animationAutoStart","cameraPosition","styleNumber","tooltip","showAnimationControls","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGrid","_redrawDataLine","_redrawDataBar","_redrawDataDot","_redrawInfo","_redrawLegend","ctx","getContext","clearRect","widthMin","widthMax","dotSize","right","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","fillStyle","closePath","gridLineLen","step","getCurrent","textAlign","textBaseline","fillText","label","visible","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","to","prettyStep","text","xText","yText","zText","xOffset","yOffset","xMin2d","xMax2d","gridLenX","gridLenY","textMargin","armAngle","V","R","G","B","C","Hi","cross","topSideVisible","zAvg","transBottom","dist","sortDepth","aDiff","bDiff","crossproduct","crossProduct","radius","arc","PI","surface","corners","xWidth","yWidth","surfaces","center","avg","transCenter","leftButtonDown","_onMouseUp","which","button","touchDown","startMouseX","getMouseX","startMouseY","getMouseY","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","diffX","diffY","horizontalNew","verticalNew","snapAngle","snapValue","parameters","emit","delay","mouseX","mouseY","tooltipTimeout","clearTimeout","_hideTooltip","dataPoint","_dataPointFromXY","_showTooltip","setTimeout","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","delta","wheelDelta","detail","oldLength","newLength","_insideTriangle","triangle","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","sqrt","content","line","dot","dom","borderRadius","boxShadow","borderLeft","contentWidth","offsetWidth","contentHeight","offsetHeight","lineHeight","dotWidth","dotHeight","clientX","targetTouches","clientY","mixin","_callbacks","once","self","removeListener","removeAllListeners","callbacks","cb","listeners","hasListeners","sub","sum","armLocation","armRotation","armLength","cameraLocation","cameraRotation","calculateCameraOrientation","rot","graph","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","dataView","progress","prev","bar","MozBorderRadius","slide","onclick","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","setIndex","playNext","interval","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","_start","_end","_step","precision","_current","setRange","setStep","calculatePrettyStep","log10","LN10","step1","pow","step2","step5","toPrecision","getStep","defaultOptions","autoResize","orientation","maxHeight","minHeight","_create","body","domProps","emitter","bind","snap","toScreen","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","timeAxis","currentTime","customTime","itemSet","itemsData","groupsData","setItems","Core","newDataSet","initialLoad","fit","setWindow","setGroups","groups","setSelection","focus","getSelection","itemData","middle","getItemRange","dataset","minItem","maxStartItem","maxEndItem","setup","Hammer","READY","Event","determineEventTypes","Utils","each","gestures","gesture","Detection","register","onTouch","DOCUMENT","EVENT_MOVE","detect","EVENT_END","Instance","defaults","behavior","userSelect","touchAction","touchCallout","contentZooming","userDrag","tapHighlightColor","HAS_POINTEREVENTS","pointerEnabled","msPointerEnabled","HAS_TOUCHEVENTS","IS_MOBILE","NO_MOUSEEVENTS","CALCULATE_INTERVAL","EVENT_TYPES","DIRECTION_DOWN","DIRECTION_LEFT","DIRECTION_UP","DIRECTION_RIGHT","POINTER_MOUSE","POINTER_TOUCH","POINTER_PEN","EVENT_START","EVENT_RELEASE","EVENT_TOUCH","plugins","utils","dest","src","merge","handler","iterator","context","inStr","find","inArray","hasParent","node","parent","getCenter","touches","pageX","pageY","touch","getVelocity","deltaTime","deltaX","deltaY","getAngle","touch1","touch2","atan2","getDirection","getDistance","getScale","getRotation","isVertical","direction","setPrefixedCss","toggle","prefixes","toCamelCase","toggleBehavior","falseFn","onselectstart","ondragstart","str","preventMouseEvents","started","shouldDetect","hook","eventType","onTouchHandler","ev","triggerType","srcType","isPointer","isMouse","buttons","PointerEvent","matchType","updatePointer","doDetect","reset","touchList","getTouchList","touchListLength","triggerChange","trigger","changedLength","changedTouches","evData","collectEventData","identifiers","identifier","pointerType","timeStamp","srcEvent","preventManipulation","stopPropagation","stopDetect","pointers","touchlist","pointer","pointerEvent","pointerId","pt","MSPOINTER_TYPE_MOUSE","MSPOINTER_TYPE_TOUCH","MSPOINTER_TYPE_PEN","detection","current","previous","stopped","startDetect","inst","eventData","startEvent","lastEvent","lastCalcEvent","futureCalcEvent","lastCalcData","extendEventData","instOptions","getCalculatedData","cur","recalc","calcEv","calcData","velocity","angle","velocityX","velocityY","interimAngle","interimDirection","startEv","lastEv","rotation","eventStartHandler","eventHandlers","createEvent","initEvent","dispatchEvent","enable","state","dispose","eh","dragGesture","dragMaxTouches","triggered","dragMinDistance","startCenter","dragDistanceCorrection","dragLockToAxis","dragLockMinDistance","lastDirection","dragBlockVertical","dragBlockHorizontal","Drag","Gesture","holdGesture","timer","holdTimeout","holdThreshold","Hold","Release","Infinity","Swipe","swipeMinTouches","swipeMaxTouches","swipeVelocityX","swipeVelocityY","tapGesture","sincePrev","didDoubleTap","hasMoved","tapMaxDistance","tapMaxTime","doubleTapInterval","doubleTapDistance","tapAlways","Tap","Touch","preventMouse","transformGesture","scaleThreshold","rotationThreshold","transformMinScale","transformMinRotation","Transform","moveable","zoomable","zoomMin","zoomMax","_onDragStart","_onDrag","_onDragEnd","_onHold","_onMouseWheel","_onTouch","_onPinch","validateDirection","getPointer","hammerUtil","changed","_applyRange","newStart","newEnd","getRange","conversion","allowDragging","diffRange","fakeGesture","pointerDate","_pointerToDate","zoom","initDate","move","destroy","_isResized","resized","_previousWidth","_previousHeight","Activator","backgroundVertical","backgroundHorizontal","centerContainer","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","prevent_default","events","isActive","scrollTop","scrollTopMin","clickToUse","activator","_initAutoResize","component","active","_stopAutoResize","setCustomTime","getCustomTime","getVisibleItems","what","dataRange","getWindow","borderRootHeight","borderRootWidth","autoHeight","containerHeight","centerWidth","_updateScrollTop","visibilityTop","visibilityBottom","visibility","repaint","_startAutoResize","_onResize","lastWidth","lastHeight","watchTimer","setInterval","initialScrollTop","oldScrollTop","_getScrollTop","newScrollTop","_setScrollTop","foreground","majorLines","majorTexts","minorLines","minorTexts","minimumStep","lineTop","showMinorLabels","showMajorLabels","locale","parentChanged","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineHeight","minorLineWidth","majorLineHeight","majorLineWidth","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","insertBefore","minorCharWidth","first","xFirstMajorLabel","hasNext","isMajor","_repaintMinorText","getLabelMinor","_repaintMajorText","getLabelMajor","_repaintMajorLine","_repaintMinorLine","leftTime","leftText","widthText","majorCharWidth","arr","createTextNode","childNodes","nodeValue","measureCharMinor","measureCharMajor","autoScale","SCALE","DAY","WEEKDAY","setMinimumStep","roundToMinor","setMonth","setDate","setHours","setMinutes","setSeconds","setMilliseconds","getMilliseconds","getSeconds","getMinutes","getHours","setScale","newScale","newStep","setAutoScale","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","showCurrentTime","locales","title","currentTimeTimer","custom","showCustomTime","eventParams","drag","dragging","align","groupOrder","selectable","editable","updateTime","updateGroup","onAdd","onUpdate","onMove","onRemove","axis","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","selection","stackDirty","touchParams","_moveToGroup","groupId","oldGroup","UNGROUPED","box","labelSet","_updateUngrouped","_onSelectItem","_onMultiSelectItem","_onAddItem","show","addCallback","markDirty","hide","ii","unselect","select","rawVisibleItems","visibleItems","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","restack","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","offsetTop","offsetLeft","firstGroupIndex","firstGroupId","ungrouped","getLabelSet","oldItemsData","getItems","_order","getGroups","removeItem","_removeItem","groupData","groupOptions","oldGroupId","displayed","_constructByEndArray","endArray","itemFromTarget","selected","dragLeftItem","dragRightItem","itemProps","groupFromTarget","changes","ctrlKey","shiftKey","oldSelection","newSelection","xAbs","newItem","itemSetFromTarget","byStart","byEnd","inner","marker","Element","getLabelWidth","_updateVisibleItems","markerHeight","lastMarkerHeight","dirty","nostack","repositionY","setParent","_checkIfVisible","removeFromDataSet","orderByStart","orderByEnd","initialPosByStart","newVisibleItems","initialPosByEnd","_checkIfInvisible","repositionX","EPSILON","aTime","bTime","force","iMax","collidingItem","jj","collision","baseClassName","getComputedStyle","_repaintDeleteButton","_repaintDragLeft","_repaintDragRight","contentLeft","parentWidth","boxWidth","dragLeft","dragRight","anchor","deleteButton","itemSetHeight","marginLeft","overlay","_onTapOverlay","windowHammer","_hasParent","deactivate","escListener","mousetrap","activate","display","unbind","_addEvent","_characterFromEvent","fromCharCode","_MAP","_KEYCODE_MAP","_stop","tag_name","tagName","contentEditable","_modifiersMatch","modifiers1","modifiers2","_resetSequences","do_not_reset","active_sequences","_sequence_levels","_inside_sequence","_getMatches","character","modifiers","combination","matches","_isModifier","seq","level","combo","_eventModifiers","altKey","metaKey","_fireCallback","cancelBubble","_handleCharacter","processed_sequence_callback","_handleKey","keyCode","_ignore_next_keyup","_resetSequenceTimer","_reset_timer","_getReverseMap","_REVERSE_MAP","_pickBestAction","_bindSequence","_increaseSequence","_callbackAndReset","_bindSingle","sequence_name","sequence","_SPECIAL_ALIASES","_SHIFT_MAP","_bindMultiple","combinations",8,9,13,16,17,18,20,27,32,33,34,35,36,37,38,39,40,45,46,91,93,224,106,107,109,110,111,186,187,188,189,190,191,192,219,220,221,222,"~","!","@","#","$","%","^","&","*","(",")","_","+",":","\"","<",">","?","|","command","return","escape","_direct_map","linegraph","getLegend","isGroupVisible","yAxisOrientation","defaultGroup","sampling","graphHeight","shaded","barChart","handleOverlap","catmullRom","parametrization","alpha","dataAxis","icons","customRange","legend","abortedGraphUpdate","lastStart","svgElements","groupsUsingDefaultStyles","rangePerPixelInv","svg","_updateGraph","yAxisLeft","yAxisRight","legendLeft","legendRight","_updateAllGroupData","_updateGroup","removeGroup","addGroup","groupsContent","ungroupedCounter","preprocessedGroupData","processedGroupData","groupRanges","changeCalled","minDate","maxDate","_getRelevantData","_convertXcoordinates","_getYRanges","_updateYAxis","_convertYcoordinates","_drawLineGraph","_drawBarGraphs","dataContainer","_applySampling","increment","amountOfPoints","xDistance","pointsPerPixel","sampledData","barCombinedData","barCombinedDataLeft","barCombinedDataRight","ignore","intersections","_getDataIntersections","_getStackedBarYRange","combinedData","accumulated","xpos","minVal","maxVal","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","_toggleAxisVisiblity","drawIcons","master","lineOffset","stepPixelsForced","stepPixels","axisUsed","coreDistance","drawData","barPoints","minWidth","heightOffset","_getSafeDrawData","nextKey","amount","resolved","prevKey","zeroPosition","path","svgHeight","_catmullRom","_linear","dFill","fillPath","_drawPoints","datapoints","xValue","yValue","extractedData","convertValue","setZeroPosition","_catmullRomUniform","p0","bp1","bp2","normalization","d1","d2","d3","N","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","linegraphOptions","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","linegraphSVG","DOMelements","lines","labels","conversionFactor","amountOfGroups","graphOptions","lineContainer","_redrawGroupIcons","iconHeight","iconOffset","drawIcon","activeGroups","_redrawLabels","deadSpace","marginRange","amountOfSteps","stepDifference","valueAtZero","marginEnd","marginStartPos","maxLabelSize","_redrawLabel","_redrawLine","invertedValue","convertedValue","characterHeight","largestWidth","textMinor","textMajor","stepIndex","marginStart","majorSteps","minorSteps","setFirst","safeSize","minimumStepValue","orderOfMagnitude","minorStepIdx","magnitudefactor","solutionFound","stepSize","niceStart","niceEnd","rounded","usingDefaultStyle","SVGcontainer","fillHeight","outline","barWidth","bar1Height","bar2Height","icon","side","iconSize","iconSpacing","textArea","drawLegendIcons","paddingTop","_initializeMixinLoaders","renderRefreshRate","renderTimestep","renderTime","maxPhysicsTicksPerRender","physicsDiscreteStepsize","initializing","triggerFunctions","edit","editEdge","connect","del","nodes","mass","radiusMin","radiusMax","shape","image","fixed","fontColor","fontSize","fontFace","highlightColor","edges","widthSelectionMultiplier","hoverWidth","fontFill","arrowScaleFactor","dash","gap","altLength","inheritColor","configurePhysics","physics","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","repulsion","nodeDistance","hierarchicalRepulsion","clustering","initialMaxNodes","clusterThreshold","reduceToNodes","chainThreshold","clusterEdgeThreshold","sectorThreshold","screenSizeThreshold","fontSizeMultiplier","maxFontSize","forceAmplification","distanceAmplification","edgeGrowth","nodeScaling","maxNodeSizeIncrements","activeAreaBoxSize","clusterLevelDifference","navigation","keyboard","speed","dataManipulation","initiallyVisible","hierarchicalLayout","levelSeparation","nodeSpacing","freezeForStabilization","smoothCurves","dynamic","roundness","dynamicSmoothCurves","maxVelocity","minVelocity","stabilize","stabilizationIterations","dragNetwork","dragNodes","hideEdgesOnDrag","hideNodesOnDrag","constants","hoverObj","controlNodesActive","images","setOnloadCallback","_redraw","xIncrement","yIncrement","zoomIncrement","_loadPhysicsSystem","_loadSectorSystem","_loadClusterSystem","_loadSelectionSystem","_loadHierarchySystem","_setTranslation","freezeSimulation","cachedFunctions","calculationNodes","calculationNodeIndices","nodeIndices","canvasTopLeft","canvasBottomRight","pointerPosition","areaCenter","previousScale","nodesData","edgesData","nodesListeners","_addNodes","_updateNodes","_removeNodes","edgesListeners","_addEdges","_updateEdges","_removeEdges","moving","_setupHierarchicalLayout","zoomExtent","startWithClustering","MixinLoader","_getScriptPath","scripts","getElementsByTagName","_getRange","minY","maxY","minX","maxX","nodeId","_findCenter","_centerNetwork","initialZoom","disableStart","zoomLevel","numberOfNodes","yDistance","xZoomLevel","yZoomLevel","_updateNodeIndexList","_clearNodeIndexList","idx","dotData","DOTToGraph","gephi","gephiData","parseGephi","_setNodes","_setEdges","_putDataInSector","_stabilize","onEdit","onEditEdge","onConnect","onDelete","editMode","newColorObj","groupname","_createKeyBinds","_loadNavigationControls","_loadManipulationSystem","_configureSmoothCurves","pinch","_onTap","_onDoubleTap","_onRelease","_onMouseMoveTitle","_moveUp","_yStopMoving","_moveDown","_moveLeft","_xStopMoving","_moveRight","_zoomIn","_stopZoom","_zoomOut","_createManipulatorBar","_deleteSelected","_getPointer","pinched","_getScale","_handleTouch","_handleDragStart","_getNodeAt","_getTranslation","isSelected","_selectObject","objectId","selectionObj","xFixed","yFixed","_handleOnDrag","_XconvertDOMtoCanvas","_XconvertCanvasToDOM","_YconvertDOMtoCanvas","_YconvertCanvasToDOM","_handleTap","_handleDoubleTap","_handleOnHold","_handleOnRelease","_zoom","scaleOld","preScaleDragPointer","DOMtoCanvas","scaleFrac","tx","ty","updateClustersDefault","postScaleDragPointer","canvasToDOM","popupObj","_checkHidePopup","checkShow","_checkShowPopup","popupTimer","edgeId","_getEdgeAt","_hoverObject","_blurObject","lastPopupNode","getTitle","isOverlappingWith","edge","connected","popup","setPosition","setText","oldNodesData","_updateSelection","_resetLevels","_updateCalculationNodes","_reconnectEdges","_updateValueRange","updateLabels","setProperties","properties","oldEdgesData","oldEdge","disconnect","showInternalIds","_createBezierNodes","via","sectors","setValueRange","save","translate","_doInAllSectors","restore","offsetX","offsetY","_drawNodes","alwaysShow","setScaleAndPos","inArea","draw","sMax","_drawEdges","_drawControlNodes","_freezeDefinedNodes","_physicsTick","_restoreFrozenNodes","iterations","fixedData","_isMoving","vmin","isMoving","_discreteStepNodes","checkMovement","nodesPresent","discreteStepLimited","discreteStep","vminCorrected","_doInAllActiveSectors","_doInSupportSector","_animationStep","_handleNavigation","calculationTime","maxSteps","timeRequired","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","ua","requiresTimeout","toggleFreeze","parentEdgeId","internalMultiplier","positionBezierNode","storePosition","dataArray","allowedToMoveX","allowedToMoveY","focusOnNode","nodePosition","requiredScale","canvasCenter","distanceFromCenter","parseDOT","parseGraph","nextPreview","isAlphaNumeric","regexAlphaNumeric","o","addNode","graphs","attr","addEdge","createEdge","getToken","tokenType","TOKENTYPE","NULL","isComment","DELIMITER","c2","DELIMITERS","IDENTIFIER","newSyntaxError","UNKNOWN","chop","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","message","maxLength","forEach2","elem1","elem2","convertEdge","dotEdge","graphEdge","graphData","dotNode","graphNode","subEdge","{","}","[","]",";","=",",","->","--","gephiJSON","allowedToMove","gEdges","gNodes","gEdge","source","attributes","gNode","defaultIndex","DEFAULT","load","url","img","Image","onload","imagelist","grouplist","networkConstants","dynamicEdges","reroutedEdges","fontDrawThreshold","horizontalAlignLeft","verticalAlignTop","baseRadiusValue","radiusFixed","preassignedLevel","fx","fy","vx","vy","resetCluster","dynamicEdgesLength","clusterSession","clusterSizeWidthFactor","clusterSizeHeightFactor","clusterSizeRadiusFactor","growthIndicator","networkScaleInv","networkScale","formationScale","clusterSize","containedNodes","containedEdges","clusterSessions","attachEdge","detachEdge","originalLabel","triggerFunction","groupObj","imageObj","_drawDatabase","resize","_resizeDatabase","_drawBox","_resizeBox","_drawCircle","_resizeCircle","_drawEllipse","_resizeEllipse","_drawImage","_resizeImage","_drawText","_resizeText","_drawDot","_resizeShape","_drawSquare","_drawTriangle","_drawTriangleDown","_drawStar","_reset","clearSizeCache","distanceToBorder","_setForce","_addForce","isFixed","globalAlpha","drawImage","_label","textSize","getTextSize","clusterLineWidth","selectionLineWidth","borderWidthSelected","roundRect","database","diameter","circle","defaultSize","ellipse","_drawShape","radiusMultiplier","baseline","labelUnderNode","lineCount","yLine","measureText","inView","clearVelocity","updateVelocity","massBeforeClustering","energyBefore","fromId","toId","widthSelected","originalFromId","originalToId","widthFixed","lengthFixed","controlNodesEnabled","controlNodes","positions","connectedNode","_drawLine","_drawArrow","_drawArrowCenter","_drawDashLine","xFrom","yFrom","xTo","yTo","xObj","yObj","_getDistanceToEdge","_getColor","colorObj","_getLineWidth","_line","midpointX","midpointY","_pointOnLine","_circle","_pointOnCircle","_getViaCoordinates","xVia","yVia","quadraticCurveTo","fillRect","mozDash","setLineDash","pattern","lineDashOffset","mozDashOffset","lineCap","dashedLine","percentage","arrow","edgeSegmentLength","fromBorderDist","fromBorderPoint","toBorderDist","toBorderPoint","x1","y1","x2","y2","x3","y3","lastX","lastY","minDistance","_getDistanceToLine","px","py","something","u","nodeIdFrom","nodeIdTo","getControlNodePositions","_enableControlNodes","_disableControlNodes","_getSelectedControlNode","fromDistance","toDistance","_restoreControlNodes","styleAttr","fontFamily","WebkitBorderRadius","whiteSpace","maxWidth","PhysicsMixin","ClusterMixin","SectorsMixin","SelectionMixin","ManipulationMixin","NavigationMixin","HierarchicalLayoutMixin","_loadMixin","sourceVariable","mixinFunction","_clearMixin","_loadSelectedForceSolver","_loadPhysicsConfiguration","hubThreshold","activeSector","drawingNode","blockConnectingEdgeSelection","forceAppendSelection","manipulationDiv","editModeDiv","closeDiv","_cleanNavigation","_loadNavigationElements","graphToggleSmoothCurves","graph_toggleSmooth","getElementById","graphRepositionNodes","showValueOfRange","repositionNodes","graphGenerateOptions","optionsSpecific","radioButton1","radioButton2","checked","backupConstants","optionsDiv","switchConfigurations","radioButton","querySelector","tableId","table","_restoreNodes","constantsVariableName","valueId","rangeValue","_overWriteGraphConstants","RepulsionMixin","HierarchialRepulsionMixin","BarnesHutMixin","_toggleBarnesHut","barnesHutTree","_initializeForceCalculation","clusterToFit","_calculateForces","_calculateGravitationalForces","_calculateNodeForces","_calculateSpringForcesWithSupport","_calculateHierarchicalSpringForces","_calculateSpringForces","supportNodes","supportNodeId","gravity","gravityForce","_sector","edgeLength","springForce","combinedClusterSize","node1","node2","node3","_calculateSpringForce","physicsConfiguration","hierarchicalLayoutDirections","parentElement","rangeElement","radioButton3","graph_repositionNodes","graph_generateOptions","nameArray","repulsingForce","a_base","minimumDistance","steepness","springFx","springFy","totalFx","totalFy","correctionFx","correctionFy","nodeCount","_formBarnesHutTree","_getForceContribution","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","MAX_VALUE","sizeDiff","minimumTreeSize","rootSize","halfRootSize","centerX","centerY","_splitBranch","_placeInTree","_updateBranchMass","totalMass","totalMassInv","biggestSize","skipMassUpdate","_placeInRegion","region","containedNode","_insertRegion","childSize","_drawTree","_drawBranch","branch","maxNumberOfNodes","reposition","maxLevels","forceAggregateHubs","normalizeClusterLevels","increaseClusterLevel","openCluster","isMovingBeforeClustering","_nodeInActiveArea","_addSector","decreaseClusterLevel","_expandClusterNode","_updateDynamicEdges","updateClusters","zoomDirection","recursive","doNotStart","amountOfNodes","_collapseSector","_formClusters","_openClusters","_openClustersBySize","_aggregateHubs","handleChains","chainPercentage","_getChainFraction","_reduceAmountOfChains","_getHubSize","_formClustersByHub","openAll","containedNodeId","childNode","_expelChildFromParent","_unselectAll","_releaseContainedEdges","_connectEdgeBackToChild","_validateEdges","othersPresent","childNodeId","_repositionBezierNodes","_formClustersByZoom","_forceClustersByZoom","minLength","_addToCluster","_clusterToSmallestNeighbour","smallestNeighbour","smallestNeighbourNode","neighbour","onlyEqual","_formClusterFromHub","hubNode","absorptionSizeOffset","allowCluster","edgesIdarray","amountOfInitialEdges","_addToContainedEdges","_connectEdgeToCluster","_containCircularEdgesFromNode","massBefore","correction","edgeToId","edgeFromId","_addToReroutedEdges","maxLevel","minLevel","clusterLevel","targetLevel","average","averageSquared","hubCounter","largestHub","variance","standardDeviation","fraction","reduceAmount","chains","total","_switchToSector","sectorId","sectorType","_switchToActiveSector","_switchToFrozenSector","_switchToSupportSector","_loadLatestSector","_previousSector","_setActiveSector","newId","_forgetLastSector","_createNewSector","_deleteActiveSector","_deleteFrozenSector","_freezeSector","_activateSector","_mergeThisWithFrozen","_collapseThisToSingleCluster","sector","unqiueIdentifier","previousSector","runFunction","argument","_doInAllFrozenSectors","_drawSectorNodes","_drawAllSectorNodes","_getNodesOverlappingWith","overlappingNodes","_getAllNodesOverlappingWith","_pointerToPositionObject","positionObject","_getEdgesOverlappingWith","overlappingEdges","_getAllEdgesOverlappingWith","_addToSelection","_addToHover","_removeFromSelection","doNotTrigger","_unselectClusters","_getSelectedNodeCount","_getSelectedNode","_getSelectedEdge","_getSelectedEdgeCount","_getSelectedObjectCount","_selectionIsEmpty","_clusterInSelection","_selectConnectedEdges","_hoverConnectedEdges","_unselectConnectedEdges","append","highlightEdges","nodeIds","getSelectedNodes","edgeIds","getSelectedEdges","idArray","RangeError","selectNodes","selectEdges","_clearManipulatorBar","_restoreOverloadedFunctions","functionName","_toggleEditMode","toolbar","boundFunction","edgeBeingEdited","selectedControlNode","addNodeButton","_createAddNodeToolbar","addEdgeButton","_createAddEdgeToolbar","editButton","_editNode","_createEditEdgeToolbar","editModeButton","backButton","_addNode","_handleConnect","_finishConnect","_selectControlNode","_controlNodeDrag","_releaseControlNode","newNode","_editEdge","alert","smooth","connectFromId","_createEdge","defaultData","finalizedData","sourceNodeId","targetNodeId","selectedNodes","selectedEdges","wrapper","navigationDivs","navigationDivActions","_stopMovement","hubsize","definedLevel","undefinedLevel","_changeConstants","_determineLevels","distribution","_getDistribution","_placeNodesByHierarchy","minPos","_placeBranchNodes","maxCount","_setLevel","parentId","parentLevel","nodeMoved","back","editNode","addDescription","edgeDescription","editEdgeDescription","createEdgeError","deleteClusterError","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","n","r2d","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","wEllipse","hEllipse","ymb","yeb","xt","yt","xi","yi","xl","yl","xr","yr","dashArray","dashLength","dashCount","slope","distRemaining","dashIndex"],"mappings":"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"} \ No newline at end of file diff --git a/dist/vis.min.js b/dist/vis.min.js index e3a1bfa4..537200c0 100644 --- a/dist/vis.min.js +++ b/dist/vis.min.js @@ -22,16 +22,16 @@ * License for the specific language governing permissions and limitations under * the License. */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):"object"==typeof exports?exports.vis=e():t.vis=e()}(this,function(){return function(t){function e(s){if(i[s])return i[s].exports;var o=i[s]={exports:{},id:s,loaded:!1};return t[s].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){e.util=i(1),e.DOMutil=i(2),e.DataSet=i(3),e.DataView=i(4),e.Graph3d=i(5),e.graph3d={Camera:i(6),Filter:i(7),Point2d:i(8),Point3d:i(9),Slider:i(10),StepNumber:i(11)},e.Timeline=i(12),e.Graph2d=i(13),e.timeline={DataStep:i(14),Range:i(15),stack:i(16),TimeStep:i(17),components:{items:{Item:i(28),ItemBox:i(29),ItemPoint:i(30),ItemRange:i(31)},Component:i(18),CurrentTime:i(19),CustomTime:i(20),DataAxis:i(21),GraphGroup:i(22),Group:i(23),ItemSet:i(24),Legend:i(25),LineGraph:i(26),TimeAxis:i(27)}},e.Network=i(32),e.network={Edge:i(33),Groups:i(34),Images:i(35),Node:i(36),Popup:i(37),dotparser:i(38),gephiParser:i(39)},e.Graph=function(){throw new Error("Graph is renamed to Network. Please create a graph as new vis.Network(...)")},e.moment=i(40),e.hammer=i(41)},function(module,exports,__webpack_require__){var moment=__webpack_require__(40);exports.isNumber=function(t){return t instanceof Number||"number"==typeof t},exports.isString=function(t){return t instanceof String||"string"==typeof t},exports.isDate=function(t){if(t instanceof Date)return!0;if(exports.isString(t)){var e=ASPDateRegex.exec(t);if(e)return!0;if(!isNaN(Date.parse(t)))return!0}return!1},exports.isDataTable=function(t){return"undefined"!=typeof google&&google.visualization&&google.visualization.DataTable&&t instanceof google.visualization.DataTable},exports.randomUUID=function(){var t=function(){return Math.floor(65536*Math.random()).toString(16)};return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},exports.extend=function(t){for(var e=1,i=arguments.length;i>e;e++){var s=arguments[e];for(var o in s)s.hasOwnProperty(o)&&(t[o]=s[o])}return t},exports.selectiveExtend=function(t,e){if(!Array.isArray(t))throw new Error("Array with property names expected as first argument");for(var i=2;ii;i++)if(t[i]!=e[i])return!1;return!0},exports.convert=function(t,e){var i;if(void 0===t)return void 0;if(null===t)return null;if(!e)return t;if("string"!=typeof e&&!(e instanceof String))throw new Error("Type must be a string");switch(e){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(moment.isMoment(t))return new Date(t.valueOf());if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])):moment(t).toDate();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"Moment":if(exports.isNumber(t))return moment(t);if(t instanceof Date)return moment(t.valueOf());if(moment.isMoment(t))return moment(t);if(exports.isString(t))return i=ASPDateRegex.exec(t),moment(i?Number(i[1]):t);throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"ISODate":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(moment.isMoment(t))return t.toDate().toISOString();if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])).toISOString():new Date(t).toISOString();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ISODate");case"ASPDate":if(exports.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(exports.isString(t)){i=ASPDateRegex.exec(t);var s;return s=i?new Date(Number(i[1])).valueOf():new Date(t).valueOf(),"/Date("+s+")/"}throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ASPDate");default:throw new Error('Unknown type "'+e+'"')}};var ASPDateRegex=/^\/?Date\((\-?\d+)/i;exports.getType=function(t){var e=typeof t;return"object"==e?null==t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":t instanceof Array?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":e},exports.getAbsoluteLeft=function(t){return t.getBoundingClientRect().left+window.pageXOffset},exports.getAbsoluteTop=function(t){return t.getBoundingClientRect().top+window.pageYOffset},exports.addClassName=function(t,e){var i=t.className.split(" ");-1==i.indexOf(e)&&(i.push(e),t.className=i.join(" "))},exports.removeClassName=function(t,e){var i=t.className.split(" "),s=i.indexOf(e);-1!=s&&(i.splice(s,1),t.className=i.join(" "))},exports.forEach=function(t,e){var i,s;if(t instanceof Array)for(i=0,s=t.length;s>i;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},exports.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e},exports.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},exports.addEventListener=function(t,e,i,s){t.addEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,s)):t.attachEvent("on"+e,i)},exports.removeEventListener=function(t,e,i,s){t.removeEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,s)):t.detachEvent("on"+e,i)},exports.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},exports.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},exports.option={},exports.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},exports.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},exports.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},exports.option.asSize=function(t,e){return"function"==typeof t&&(t=t()),exports.isString(t)?t:exports.isNumber(t)?t+"px":e||null},exports.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},exports.GiveDec=function(Hex){var Value;return Value="A"==Hex?10:"B"==Hex?11:"C"==Hex?12:"D"==Hex?13:"E"==Hex?14:"F"==Hex?15:eval(Hex)},exports.GiveHex=function(t){var e;return e=10==t?"A":11==t?"B":12==t?"C":13==t?"D":14==t?"E":15==t?"F":""+t},exports.parseColor=function(t){var e;if(exports.isString(t)){if(exports.isValidRGB(t)){var i=t.substr(4).substr(0,t.length-5).split(",");t=exports.RGBToHex(i[0],i[1],i[2])}if(exports.isValidHex(t)){var s=exports.hexToHSV(t),o={h:s.h,s:.45*s.s,v:Math.min(1,1.05*s.v)},n={h:s.h,s:Math.min(1,1.25*s.v),v:.6*s.v},r=exports.HSVToHex(n.h,n.h,n.v),a=exports.HSVToHex(o.h,o.s,o.v);e={background:t,border:r,highlight:{background:a,border:r},hover:{background:a,border:r}}}else e={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else e={},e.background=t.background||"white",e.border=t.border||e.background,exports.isString(t.highlight)?e.highlight={border:t.highlight,background:t.highlight}:(e.highlight={},e.highlight.background=t.highlight&&t.highlight.background||e.background,e.highlight.border=t.highlight&&t.highlight.border||e.border),exports.isString(t.hover)?e.hover={border:t.hover,background:t.hover}:(e.hover={},e.hover.background=t.hover&&t.hover.background||e.background,e.hover.border=t.hover&&t.hover.border||e.border);return e},exports.hexToRGB=function(t){t=t.replace("#","").toUpperCase();var e=exports.GiveDec(t.substring(0,1)),i=exports.GiveDec(t.substring(1,2)),s=exports.GiveDec(t.substring(2,3)),o=exports.GiveDec(t.substring(3,4)),n=exports.GiveDec(t.substring(4,5)),r=exports.GiveDec(t.substring(5,6)),a=16*e+i,h=16*s+o,i=16*n+r;return{r:a,g:h,b:i}},exports.RGBToHex=function(t,e,i){var s=exports.GiveHex(Math.floor(t/16)),o=exports.GiveHex(t%16),n=exports.GiveHex(Math.floor(e/16)),r=exports.GiveHex(e%16),a=exports.GiveHex(Math.floor(i/16)),h=exports.GiveHex(i%16),d=s+o+n+r+a+h;return"#"+d},exports.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var s=Math.min(t,Math.min(e,i)),o=Math.max(t,Math.max(e,i));if(s==o)return{h:0,s:0,v:s};var n=t==s?e-i:i==s?t-e:i-t,r=t==s?3:i==s?1:5,a=60*(r-n/(o-s))/360,h=(o-s)/o,d=o;return{h:a,s:h,v:d}},exports.HSVToRGB=function(t,e,i){var s,o,n,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:s=i,o=l,n=h;break;case 1:s=d,o=i,n=h;break;case 2:s=h,o=i,n=l;break;case 3:s=h,o=d,n=i;break;case 4:s=l,o=h,n=i;break;case 5:s=i,o=h,n=d}return{r:Math.floor(255*s),g:Math.floor(255*o),b:Math.floor(255*n)}},exports.HSVToHex=function(t,e,i){var s=exports.HSVToRGB(t,e,i);return exports.RGBToHex(s.r,s.g,s.b)},exports.hexToHSV=function(t){var e=exports.hexToRGB(t);return exports.RGBToHSV(e.r,e.g,e.b)},exports.isValidHex=function(t){var e=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t);return e},exports.isValidRGB=function(t){t=t.replace(" ","");var e=/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t);return e},exports.selectiveBridgeObject=function(t,e){if("object"==typeof e){for(var i=Object.create(e),s=0;sa;)o=void 0===s?n[u][i]:n[u][i][s],n[u].isVisible(e)?h=!0:(o=r&&console.log("BinarySearch too many iterations. Aborting.")}return u},exports.binarySearchGeneric=function(t,e,i,s){var o,n,r,a,h=1e4,d=0,l=t,c=!1,p=0,u=l.length,f=p,m=u,g=Math.floor(.5*(u+p));if(0==u)g=-1;else if(1==u)r=l[g][i],g=r==e?0:-1;else{for(u-=1;0==c&&h>d;)n=l[Math.max(0,g-1)][i],r=l[g][i],a=l[Math.min(l.length-1,g+1)][i],r==e||e>n&&r>e||e>r&&a>e?(c=!0,r!=e&&("before"==s?e>n&&r>e&&(g=Math.max(0,g-1)):e>r&&a>e&&(g=Math.min(l.length-1,g+1)))):(e>r?f=Math.floor(.5*(u+p)):m=Math.floor(.5*(u+p)),o=Math.floor(.5*(u+p)),p==f&&u==m?(g=-1,c=!0):(u=m,p=f,g=Math.floor(.5*(u+p)))),d++;d>=h&&console.log("BinarySearch too many iterations. Aborting.")}return g}},function(t,e){e.prepareElements=function(t){for(var e in t)t.hasOwnProperty(e)&&(t[e].redundant=t[e].used,t[e].used=[])},e.cleanupElements=function(t){for(var e in t)if(t.hasOwnProperty(e)&&t[e].redundant){for(var i=0;i0?(s=e[t].redundant[0],e[t].redundant.shift()):(s=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(s)):(s=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(s)),e[t].used.push(s),s},e.getDOMElement=function(t,e,i){var s;return e.hasOwnProperty(t)?e[t].redundant.length>0?(s=e[t].redundant[0],e[t].redundant.shift()):(s=document.createElement(t),i.appendChild(s)):(s=document.createElement(t),e[t]={used:[],redundant:[]},i.appendChild(s)),e[t].used.push(s),s},e.drawPoint=function(t,i,s,o,n){var r;return"circle"==s.options.drawPoints.style?(r=e.getSVGElement("circle",o,n),r.setAttributeNS(null,"cx",t),r.setAttributeNS(null,"cy",i),r.setAttributeNS(null,"r",.5*s.options.drawPoints.size),r.setAttributeNS(null,"class",s.className+" point")):(r=e.getSVGElement("rect",o,n),r.setAttributeNS(null,"x",t-.5*s.options.drawPoints.size),r.setAttributeNS(null,"y",i-.5*s.options.drawPoints.size),r.setAttributeNS(null,"width",s.options.drawPoints.size),r.setAttributeNS(null,"height",s.options.drawPoints.size),r.setAttributeNS(null,"class",s.className+" point")),r},e.drawBar=function(t,i,s,o,n,r,a){var h=e.getSVGElement("rect",r,a);h.setAttributeNS(null,"x",t-.5*s),h.setAttributeNS(null,"y",i),h.setAttributeNS(null,"width",s),h.setAttributeNS(null,"height",o),h.setAttributeNS(null,"class",n)}},function(t,e,i){function s(t,e){if(!t||Array.isArray(t)||o.isDataTable(t)||(e=t,t=null),this._options=e||{},this._data={},this._fieldId=this._options.fieldId||"id",this._type={},this._options.type)for(var i in this._options.type)if(this._options.type.hasOwnProperty(i)){var s=this._options.type[i];this._type[i]="Date"==s||"ISODate"==s||"ASPDate"==s?"Date":s}if(this._options.convert)throw new Error('Option "convert" is deprecated. Use "type" instead.');this._subscribers={},t&&this.add(t)}var o=i(1);s.prototype.on=function(t,e){var i=this._subscribers[t];i||(i=[],this._subscribers[t]=i),i.push({callback:e})},s.prototype.subscribe=s.prototype.on,s.prototype.off=function(t,e){var i=this._subscribers[t];i&&(this._subscribers[t]=i.filter(function(t){return t.callback!=e}))},s.prototype.unsubscribe=s.prototype.off,s.prototype._trigger=function(t,e,i){if("*"==t)throw new Error("Cannot trigger event *");var s=[];t in this._subscribers&&(s=s.concat(this._subscribers[t])),"*"in this._subscribers&&(s=s.concat(this._subscribers["*"]));for(var o=0;or;r++)i=n._addItem(t[r]),s.push(i);else if(o.isDataTable(t))for(var h=this._getColumnNames(t),d=0,l=t.getNumberOfRows();l>d;d++){for(var c={},p=0,u=h.length;u>p;p++){var f=h[p];c[f]=t.getValue(d,p)}i=n._addItem(c),s.push(i)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");i=n._addItem(t),s.push(i)}return s.length&&this._trigger("add",{items:s},e),s},s.prototype.update=function(t,e){var i=[],s=[],n=this,r=n._fieldId,a=function(t){var e=t[r];n._data[e]?(e=n._updateItem(t),s.push(e)):(e=n._addItem(t),i.push(e))};if(Array.isArray(t))for(var h=0,d=t.length;d>h;h++)a(t[h]);else if(o.isDataTable(t))for(var l=this._getColumnNames(t),c=0,p=t.getNumberOfRows();p>c;c++){for(var u={},f=0,m=l.length;m>f;f++){var g=l[f];u[g]=t.getValue(c,f)}a(u)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");a(t)}return i.length&&this._trigger("add",{items:i},e),s.length&&this._trigger("update",{items:s},e),i.concat(s)},s.prototype.get=function(){var t,e,i,s,n=this,r=o.getType(arguments[0]);"String"==r||"Number"==r?(t=arguments[0],i=arguments[1],s=arguments[2]):"Array"==r?(e=arguments[0],i=arguments[1],s=arguments[2]):(i=arguments[0],s=arguments[1]);var a;if(i&&i.returnType){var h=["DataTable","Array","Object"];if(a=-1==h.indexOf(i.returnType)?"Array":i.returnType,s&&a!=o.getType(s))throw new Error('Type of parameter "data" ('+o.getType(s)+") does not correspond with specified options.type ("+i.type+")");if("DataTable"==a&&!o.isDataTable(s))throw new Error('Parameter "data" must be a DataTable when options.type is "DataTable"')}else a=s&&"DataTable"==o.getType(s)?"DataTable":"Array";var d,l,c,p,u=i&&i.type||this._options.type,f=i&&i.filter,m=[];if(void 0!=t)d=n._getItem(t,u),f&&!f(d)&&(d=null);else if(void 0!=e)for(c=0,p=e.length;p>c;c++)d=n._getItem(e[c],u),(!f||f(d))&&m.push(d);else for(l in this._data)this._data.hasOwnProperty(l)&&(d=n._getItem(l,u),(!f||f(d))&&m.push(d));if(i&&i.order&&void 0==t&&this._sort(m,i.order),i&&i.fields){var g=i.fields;if(void 0!=t)d=this._filterFields(d,g);else for(c=0,p=m.length;p>c;c++)m[c]=this._filterFields(m[c],g)}if("DataTable"==a){var v=this._getColumnNames(s);if(void 0!=t)n._appendRow(s,v,d);else for(c=0;cc;c++)s.push(m[c]);return s}return m},s.prototype.getIds=function(t){var e,i,s,o,n,r=this._data,a=t&&t.filter,h=t&&t.order,d=t&&t.type||this._options.type,l=[];if(a)if(h){n=[];for(s in r)r.hasOwnProperty(s)&&(o=this._getItem(s,d),a(o)&&n.push(o));for(this._sort(n,h),e=0,i=n.length;i>e;e++)l[e]=n[e][this._fieldId]}else for(s in r)r.hasOwnProperty(s)&&(o=this._getItem(s,d),a(o)&&l.push(o[this._fieldId]));else if(h){n=[];for(s in r)r.hasOwnProperty(s)&&n.push(r[s]);for(this._sort(n,h),e=0,i=n.length;i>e;e++)l[e]=n[e][this._fieldId]}else for(s in r)r.hasOwnProperty(s)&&(o=r[s],l.push(o[this._fieldId]));return l},s.prototype.getDataSet=function(){return this},s.prototype.forEach=function(t,e){var i,s,o=e&&e.filter,n=e&&e.type||this._options.type,r=this._data;if(e&&e.order)for(var a=this.get(e),h=0,d=a.length;d>h;h++)i=a[h],s=i[this._fieldId],t(i,s);else for(s in r)r.hasOwnProperty(s)&&(i=this._getItem(s,n),(!o||o(i))&&t(i,s))},s.prototype.map=function(t,e){var i,s=e&&e.filter,o=e&&e.type||this._options.type,n=[],r=this._data;for(var a in r)r.hasOwnProperty(a)&&(i=this._getItem(a,o),(!s||s(i))&&n.push(t(i,a)));return e&&e.order&&this._sort(n,e.order),n},s.prototype._filterFields=function(t,e){var i={};for(var s in t)t.hasOwnProperty(s)&&-1!=e.indexOf(s)&&(i[s]=t[s]);return i},s.prototype._sort=function(t,e){if(o.isString(e)){var i=e;t.sort(function(t,e){var s=t[i],o=e[i];return s>o?1:o>s?-1:0})}else{if("function"!=typeof e)throw new TypeError("Order must be a function or a string");t.sort(e)}},s.prototype.remove=function(t,e){var i,s,o,n=[];if(Array.isArray(t))for(i=0,s=t.length;s>i;i++)o=this._remove(t[i]),null!=o&&n.push(o);else o=this._remove(t),null!=o&&n.push(o);return n.length&&this._trigger("remove",{items:n},e),n},s.prototype._remove=function(t){if(o.isNumber(t)||o.isString(t)){if(this._data[t])return delete this._data[t],t}else if(t instanceof Object){var e=t[this._fieldId];if(e&&this._data[e])return delete this._data[e],e}return null},s.prototype.clear=function(t){var e=Object.keys(this._data);return this._data={},this._trigger("remove",{items:e},t),e},s.prototype.max=function(t){var e=this._data,i=null,s=null;for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],r=n[t];null!=r&&(!i||r>s)&&(i=n,s=r)}return i},s.prototype.min=function(t){var e=this._data,i=null,s=null;for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],r=n[t];null!=r&&(!i||s>r)&&(i=n,s=r)}return i},s.prototype.distinct=function(t){var e,i=this._data,s=[],n=this._options.type&&this._options.type[t]||null,r=0;for(var a in i)if(i.hasOwnProperty(a)){var h=i[a],d=h[t],l=!1;for(e=0;r>e;e++)if(s[e]==d){l=!0;break}l||void 0===d||(s[r]=d,r++)}if(n)for(e=0;ei;i++)e[i]=t.getColumnId(i)||t.getColumnLabel(i);return e},s.prototype._appendRow=function(t,e,i){for(var s=t.addRow(),o=0,n=e.length;n>o;o++){var r=e[o];t.setValue(s,o,i[r])}},t.exports=s},function(t,e,i){function s(t,e){this._data=null,this._ids={},this._options=e||{},this._fieldId="id",this._subscribers={};var i=this;this.listener=function(){i._onEvent.apply(i,arguments)},this.setData(t)}var o=i(1),n=i(3);s.prototype.setData=function(t){var e,i,s;if(this._data){this._data.unsubscribe&&this._data.unsubscribe("*",this.listener),e=[];for(var o in this._ids)this._ids.hasOwnProperty(o)&&e.push(o);this._ids={},this._trigger("remove",{items:e})}if(this._data=t,this._data){for(this._fieldId=this._options.fieldId||this._data&&this._data.options&&this._data.options.fieldId||"id",e=this._data.getIds({filter:this._options&&this._options.filter}),i=0,s=e.length;s>i;i++)o=e[i],this._ids[o]=!0;this._trigger("add",{items:e}),this._data.on&&this._data.on("*",this.listener)}},s.prototype.get=function(){var t,e,i,s=this,n=o.getType(arguments[0]);"String"==n||"Number"==n||"Array"==n?(t=arguments[0],e=arguments[1],i=arguments[2]):(e=arguments[0],i=arguments[1]);var r=o.extend({},this._options,e);this._options.filter&&e&&e.filter&&(r.filter=function(t){return s._options.filter(t)&&e.filter(t)});var a=[];return void 0!=t&&a.push(t),a.push(r),a.push(i),this._data&&this._data.get.apply(this._data,a)},s.prototype.getIds=function(t){var e;if(this._data){var i,s=this._options.filter;i=t&&t.filter?s?function(e){return s(e)&&t.filter(e)}:t.filter:s,e=this._data.getIds({filter:i,order:t&&t.order})}else e=[];return e},s.prototype.getDataSet=function(){for(var t=this;t instanceof s;)t=t._data;return t||null},s.prototype._onEvent=function(t,e,i){var s,o,n,r,a=e&&e.items,h=this._data,d=[],l=[],c=[];if(a&&h){switch(t){case"add":for(s=0,o=a.length;o>s;s++)n=a[s],r=this.get(n),r&&(this._ids[n]=!0,d.push(n));break;case"update":for(s=0,o=a.length;o>s;s++)n=a[s],r=this.get(n),r?this._ids[n]?l.push(n):(this._ids[n]=!0,d.push(n)):this._ids[n]&&(delete this._ids[n],c.push(n));break;case"remove":for(s=0,o=a.length;o>s;s++)n=a[s],this._ids[n]&&(delete this._ids[n],c.push(n))}d.length&&this._trigger("add",{items:d},i),l.length&&this._trigger("update",{items:l},i),c.length&&this._trigger("remove",{items:c},i)}},s.prototype.on=n.prototype.on,s.prototype.off=n.prototype.off,s.prototype._trigger=n.prototype._trigger,s.prototype.subscribe=s.prototype.on,s.prototype.unsubscribe=s.prototype.off,t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.width="400px",this.height="400px",this.margin=10,this.defaultXCenter="55%",this.defaultYCenter="50%",this.xLabel="x",this.yLabel="y",this.zLabel="z",this.filterLabel="time",this.legendLabel="value",this.style=s.STYLE.DOT,this.showPerspective=!0,this.showGrid=!0,this.keepAspectRatio=!0,this.showShadow=!1,this.showGrayBottom=!1,this.showTooltip=!1,this.verticalRatio=.5,this.animationInterval=1e3,this.animationPreload=!1,this.camera=new l,this.eye=new h(0,0,-1),this.dataTable=null,this.dataPoints=null,this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.colFilter=void 0,this.xMin=0,this.xStep=void 0,this.xMax=1,this.yMin=0,this.yStep=void 0,this.yMax=1,this.zMin=0,this.zStep=void 0,this.zMax=1,this.valueMin=0,this.valueMax=1,this.xBarWidth=1,this.yBarWidth=1,this.colorAxis="#4D4D4D",this.colorGrid="#D3D3D3",this.colorDot="#7DC1FF",this.colorDotBorder="#3267D2",this.create(),this.setOptions(i),e&&this.setData(e)}var o=i(49),n=i(3),r=i(4),a=i(1),h=i(9),d=i(8),l=i(6),c=i(7),p=i(10),u=i(11);o(s.prototype),s.prototype._setScale=function(){this.scale=new h(1/(this.xMax-this.xMin),1/(this.yMax-this.yMin),1/(this.zMax-this.zMin)),this.keepAspectRatio&&(this.scale.x3&&(this.colFilter=3);else{if(this.style!==s.STYLE.DOTCOLOR&&this.style!==s.STYLE.DOTSIZE&&this.style!==s.STYLE.BARCOLOR&&this.style!==s.STYLE.BARSIZE)throw'Unknown style "'+this.style+'"';this.colX=0,this.colY=1,this.colZ=2,this.colValue=3,t.getNumberOfColumns()>4&&(this.colFilter=4)}},s.prototype.getNumberOfRows=function(t){return t.length},s.prototype.getNumberOfColumns=function(t){var e=0;for(var i in t[0])t[0].hasOwnProperty(i)&&e++;return e},s.prototype.getDistinctValues=function(t,e){for(var i=[],s=0;st[s][e]&&(i.min=t[s][e]),i.maxt;t++){var m=(t-p)/(f-p),g=240*m,v=this._hsv2rgb(g,1,1);c.strokeStyle=v,c.beginPath(),c.moveTo(h,r+t),c.lineTo(a,r+t),c.stroke()}c.strokeStyle=this.colorAxis,c.strokeRect(h,r,i,n)}if(this.style===s.STYLE.DOTSIZE&&(c.strokeStyle=this.colorAxis,c.fillStyle=this.colorDot,c.beginPath(),c.moveTo(h,r),c.lineTo(a,r),c.lineTo(a-i+e,d),c.lineTo(h,d),c.closePath(),c.fill(),c.stroke()),this.style===s.STYLE.DOTCOLOR||this.style===s.STYLE.DOTSIZE){var y=5,b=new u(this.valueMin,this.valueMax,(this.valueMax-this.valueMin)/5,!0);for(b.start(),b.getCurrent()0?this.yMin:this.yMax,o=this._convert3Dto2D(new h(x,r,this.zMin)),Math.cos(2*_)>0?(g.textAlign="center",g.textBaseline="top",o.y+=b):Math.sin(2*_)<0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(" "+i.getCurrent()+" ",o.x,o.y),i.next()}for(g.lineWidth=1,s=void 0===this.defaultYStep,i=new u(this.yMin,this.yMax,this.yStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,o=this._convert3Dto2D(new h(n,i.getCurrent(),this.zMin)),Math.cos(2*_)<0?(g.textAlign="center",g.textBaseline="top",o.y+=b):Math.sin(2*_)>0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(" "+i.getCurrent()+" ",o.x,o.y),i.next();for(g.lineWidth=1,s=void 0===this.defaultZStep,i=new u(this.zMin,this.zMax,this.zStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax;!i.end();)t=this._convert3Dto2D(new h(n,r,i.getCurrent())),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(t.x-b,t.y),g.stroke(),g.textAlign="right",g.textBaseline="middle",g.fillStyle=this.colorAxis,g.fillText(i.getCurrent()+" ",t.x-5,t.y),i.next();g.lineWidth=1,t=this._convert3Dto2D(new h(n,r,this.zMin)),e=this._convert3Dto2D(new h(n,r,this.zMax)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke(),g.lineWidth=1,p=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),f=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(p.x,p.y),g.lineTo(f.x,f.y),g.stroke(),p=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),f=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(p.x,p.y),g.lineTo(f.x,f.y),g.stroke(),g.lineWidth=1,t=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke(),t=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke();var w=this.xLabel;w.length>0&&(c=.1/this.scale.y,n=(this.xMin+this.xMax)/2,r=Math.cos(_)>0?this.yMin-c:this.yMax+c,o=this._convert3Dto2D(new h(n,r,this.zMin)),Math.cos(2*_)>0?(g.textAlign="center",g.textBaseline="top"):Math.sin(2*_)<0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(w,o.x,o.y));var S=this.yLabel;S.length>0&&(l=.1/this.scale.x,n=Math.sin(_)>0?this.xMin-l:this.xMax+l,r=(this.yMin+this.yMax)/2,o=this._convert3Dto2D(new h(n,r,this.zMin)),Math.cos(2*_)<0?(g.textAlign="center",g.textBaseline="top"):Math.sin(2*_)>0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(S,o.x,o.y));var M=this.zLabel;M.length>0&&(d=30,n=Math.cos(_)>0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax,a=(this.zMin+this.zMax)/2,o=this._convert3Dto2D(new h(n,r,a)),g.textAlign="right",g.textBaseline="middle",g.fillStyle=this.colorAxis,g.fillText(M,o.x-d,o.y))},s.prototype._hsv2rgb=function(t,e,i){var s,o,n,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:s=r,o=h,n=0;break;case 1:s=h,o=r,n=0;break;case 2:s=0,o=r,n=h;break;case 3:s=0,o=h,n=r;break;case 4:s=h,o=0,n=r;break;case 5:s=r,o=0,n=h;break;default:s=0,o=0,n=0}return"RGB("+parseInt(255*s)+","+parseInt(255*o)+","+parseInt(255*n)+")"},s.prototype._redrawDataGrid=function(){var t,e,i,o,n,r,a,d,l,c,p,u,f,m=this.frame.canvas,g=m.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(n=0;n0}else r=!0;r?(f=(t.point.z+e.point.z+i.point.z+o.point.z)/4,c=240*(1-(f-this.zMin)*this.scale.z/this.verticalRatio),p=1,this.showShadow?(u=Math.min(1+S.x/M/2,1),a=this._hsv2rgb(c,p,u),d=a):(u=1,a=this._hsv2rgb(c,p,u),d=this.colorAxis)):(a="gray",d=this.colorAxis),l=.5,g.lineWidth=l,g.fillStyle=a,g.strokeStyle=d,g.beginPath(),g.moveTo(t.screen.x,t.screen.y),g.lineTo(e.screen.x,e.screen.y),g.lineTo(o.screen.x,o.screen.y),g.lineTo(i.screen.x,i.screen.y),g.closePath(),g.fill(),g.stroke()}}else for(n=0;np&&(p=0);var u,f,m;this.style===s.STYLE.DOTCOLOR?(u=240*(1-(d.point.value-this.valueMin)*this.scale.value),f=this._hsv2rgb(u,1,1),m=this._hsv2rgb(u,1,.8)):this.style===s.STYLE.DOTSIZE?(f=this.colorDot,m=this.colorDotBorder):(u=240*(1-(d.point.z-this.zMin)*this.scale.z/this.verticalRatio),f=this._hsv2rgb(u,1,1),m=this._hsv2rgb(u,1,.8)),i.lineWidth=1,i.strokeStyle=m,i.fillStyle=f,i.beginPath(),i.arc(d.screen.x,d.screen.y,p,0,2*Math.PI,!0),i.fill(),i.stroke()}}},s.prototype._redrawDataBar=function(){var t,e,i,o,n=this.frame.canvas,r=n.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(t=0;t0&&(t=this.dataPoints[0],s.lineWidth=1,s.strokeStyle="blue",s.beginPath(),s.moveTo(t.screen.x,t.screen.y)),e=1;e0&&s.stroke()}},s.prototype._onMouseDown=function(t){if(t=t||window.event,this.leftButtonDown&&this._onMouseUp(t),this.leftButtonDown=t.which?1===t.which:1===t.button,this.leftButtonDown||this.touchDown){this.startMouseX=getMouseX(t),this.startMouseY=getMouseY(t),this.startStart=new Date(this.start),this.startEnd=new Date(this.end),this.startArmRotation=this.camera.getArmRotation(),this.frame.style.cursor="move";var e=this;this.onmousemove=function(t){e._onMouseMove(t)},this.onmouseup=function(t){e._onMouseUp(t)},a.addEventListener(document,"mousemove",e.onmousemove),a.addEventListener(document,"mouseup",e.onmouseup),a.preventDefault(t)}},s.prototype._onMouseMove=function(t){t=t||window.event;var e=parseFloat(getMouseX(t))-this.startMouseX,i=parseFloat(getMouseY(t))-this.startMouseY,s=this.startArmRotation.horizontal+e/200,o=this.startArmRotation.vertical+i/200,n=4,r=Math.sin(n/360*2*Math.PI);Math.abs(Math.sin(s))0?1:0>t?-1:0}var s=e[0],o=e[1],n=e[2],r=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x)),a=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),h=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},s.prototype._dataPointFromXY=function(t,e){var i,o=100,n=null,r=null,a=null,h=new d(t,e);if(this.style===s.STYLE.BAR||this.style===s.STYLE.BARCOLOR||this.style===s.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var l=n.surfaces;if(l)for(var c=l.length-1;c>=0;c--){var p=l[c],u=p.corners,f=[u[0].screen,u[1].screen,u[2].screen],m=[u[2].screen,u[3].screen,u[0].screen];if(this._insideTriangle(h,f)||this._insideTriangle(h,m))return n}}else for(i=0;ib)&&o>b&&(a=b,r=n)}}return r},s.prototype._showTooltip=function(t){var e,i,s;this.tooltip?(e=this.tooltip.dom.content,i=this.tooltip.dom.line,s=this.tooltip.dom.dot):(e=document.createElement("div"),e.style.position="absolute",e.style.padding="10px",e.style.border="1px solid #4d4d4d",e.style.color="#1a1a1a",e.style.background="rgba(255,255,255,0.7)",e.style.borderRadius="2px",e.style.boxShadow="5px 5px 10px rgba(128,128,128,0.5)",i=document.createElement("div"),i.style.position="absolute",i.style.height="40px",i.style.width="0",i.style.borderLeft="1px solid #4d4d4d",s=document.createElement("div"),s.style.position="absolute",s.style.height="0",s.style.width="0",s.style.border="5px solid #4d4d4d",s.style.borderRadius="5px",this.tooltip={dataPoint:null,dom:{content:e,line:i,dot:s}}),this._hideTooltip(),this.tooltip.dataPoint=t,e.innerHTML="function"==typeof this.showTooltip?this.showTooltip(t.point):"
x:"+t.point.x+"
y:"+t.point.y+"
z:"+t.point.z+"
",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(s);var o=e.offsetWidth,n=e.offsetHeight,r=i.offsetHeight,a=s.offsetWidth,h=s.offsetHeight,d=t.screen.x-o/2;d=Math.min(Math.max(d,10),this.frame.clientWidth-10-o),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=d+"px",e.style.top=t.screen.y-r-n+"px",s.style.left=t.screen.x-a/2+"px",s.style.top=t.screen.y-h/2+"px"},s.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},getMouseX=function(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0},getMouseY=function(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0},t.exports=s},function(t,e,i){var s=i(9);Camera=function(){this.armLocation=new s,this.armRotation={},this.armRotation.horizontal=0,this.armRotation.vertical=0,this.armLength=1.7,this.cameraLocation=new s,this.cameraRotation=new s(.5*Math.PI,0,0),this.calculateCameraOrientation()},Camera.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},Camera.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),(void 0!==t||void 0!==e)&&this.calculateCameraOrientation()},Camera.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},Camera.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.calculateCameraOrientation())},Camera.prototype.getArmLength=function(){return this.armLength},Camera.prototype.getCameraLocation=function(){return this.cameraLocation},Camera.prototype.getCameraRotation=function(){return this.cameraRotation},Camera.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal},t.exports=Camera},function(t,e,i){function s(t,e,i){this.data=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=i.getDistinctValues(t.get(),this.column),this.values.sort(function(t,e){return t>e?1:e>t?-1:0}),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var o=i(4);s.prototype.isLoaded=function(){return this.loaded},s.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},s.prototype.getLabel=function(){return this.graph.filterLabel},s.prototype.getColumn=function(){return this.column},s.prototype.getSelectedValue=function(){return void 0===this.index?void 0:this.values[this.index]},s.prototype.getValues=function(){return this.values},s.prototype.getValue=function(t){if(t>=this.values.length)throw"Error: index out of range";return this.values[t]},s.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var s=new o(this.data,{filter:function(t){return t[i.column]==i.value}}).get();e=this.graph._getDataPoints(s),this.dataPoints[t]=e}return e},s.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},s.prototype.selectValue=function(t){if(t>=this.values.length)throw"Error: index out of range";this.index=t,this.value=this.values[t]},s.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t0&&(t--,this.setIndex(t))},s.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},s.prototype.setIndex=function(t){if(!(ts&&(s=0),s>this.values.length-1&&(s=this.values.length-1),s},s.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10,i=t/(this.values.length-1)*e,s=i+3;return s},s.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,s=this.leftToIndex(i);this.setIndex(s),o.preventDefault()},s.prototype._onMouseUp=function(){this.frame.style.cursor="auto",o.removeEventListener(document,"mousemove",this.onmousemove),o.removeEventListener(document,"mouseup",this.onmouseup),o.preventDefault()},t.exports=s},function(t){function e(t,e,i,s){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,s)}e.prototype.setRange=function(t,e,i,s){this._start=t?t:0,this._end=e?e:0,this.setStep(i,s)},e.prototype.setStep=function(t,i){void 0===t||0>=t||(void 0!==i&&(this.prettyStep=i),this._step=this.prettyStep===!0?e.calculatePrettyStep(t):t)},e.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),s=2*Math.pow(10,Math.round(e(t/2))),o=5*Math.pow(10,Math.round(e(t/5))),n=i;return Math.abs(s-t)<=Math.abs(n-t)&&(n=s),Math.abs(o-t)<=Math.abs(n-t)&&(n=o),0>=n&&(n=1),n},e.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},e.prototype.getStep=function(){return this._step},e.prototype.start=function(){this._current=this._start-this._start%this._step},e.prototype.next=function(){this._current+=this._step},e.prototype.end=function(){return this._current>this._end},t.exports=e},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");var n=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},util:{snap:null,toScreen:n._toScreen.bind(n),toGlobalScreen:n._toGlobalScreen.bind(n),toTime:n._toTime.bind(n),toGlobalTime:n._toGlobalTime.bind(n)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.itemSet=new p(this.body),this.components.push(this.itemSet),this.itemsData=null,this.groupsData=null,i&&this.setOptions(i),e?this.setItems(e):this.redraw()}var o=(i(49),i(41),i(1)),n=i(3),r=i(4),a=i(15),h=i(42),d=i(27),l=i(19),c=i(20),p=i(24);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e),i&&("start"in this.options||"end"in this.options)){this.fit();var s="start"in this.options?o.convert(this.options.start,"Date"):null,a="end"in this.options?o.convert(this.options.end,"Date"):null;this.setWindow(s,a)}},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.itemSet.setGroups(e)},s.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t)},s.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},s.prototype.focus=function(t){if(this.itemsData&&void 0!=t){var e=Array.isArray(t)?t:[t],i=this.itemsData.getDataSet().get(e,{type:{start:"Date",end:"Date"}}),s=null,o=null;i.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===s||s>e)&&(s=e),(null===o||i>o)&&(o=i)});var n=(s+o)/2,r=Math.max(this.range.end-this.range.start,1.1*(o-s));this.range.setRange(n-r/2,n+r/2)}},s.prototype.getItemRange=function(){var t=this.itemsData.getDataSet(),e=null,i=null;if(t){var s=t.min("start");e=s?o.convert(s.start,"Date").valueOf():null;var n=t.max("start");n&&(i=o.convert(n.start,"Date").valueOf());var r=t.max("end");r&&(i=null==i?o.convert(r.end,"Date").valueOf():Math.max(i,o.convert(r.end,"Date").valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},t.exports=s},function(t,e,i){function s(t,e,i,s){var n=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},util:{snap:null,toScreen:n._toScreen.bind(n),toGlobalScreen:n._toGlobalScreen.bind(n),toTime:n._toTime.bind(n),toGlobalTime:n._toGlobalTime.bind(n)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.linegraph=new p(this.body),this.components.push(this.linegraph),this.itemsData=null,this.groupsData=null,i&&this.setOptions(i),s&&this.setGroups(s),e?this.setItems(e):this.redraw()}var o=(i(49),i(41),i(1)),n=i(3),r=i(4),a=i(15),h=i(42),d=i(27),l=i(19),c=i(20),p=i(26);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.linegraph&&this.linegraph.setItems(e),i&&("start"in this.options||"end"in this.options)){this.fit();var s="start"in this.options?o.convert(this.options.start,"Date"):null,a="end"in this.options?o.convert(this.options.end,"Date"):null;this.setWindow(s,a)}},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.linegraph.setGroups(e)},s.prototype.getLegend=function(t,e,i){return void 0===e&&(e=15),void 0===i&&(i=15),void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].getLegend(e,i):"cannot find group:"+t},s.prototype.isGroupVisible=function(t){return void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].visible&&(void 0===this.options.groups.visibility[t]||1==this.options.groups.visibility[t]):!1},s.prototype.getItemRange=function(){var t=null,e=null;for(var i in this.linegraph.groups)if(this.linegraph.groups.hasOwnProperty(i)&&1==this.linegraph.groups[i].visible)for(var s=0;sr?r:t,e=null==e?r:r>e?r:e}return{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},t.exports=s},function(t){function e(t,e,i,s,o){this.current=0,this.autoScale=!0,this.stepIndex=0,this.step=1,this.scale=1,this.marginStart,this.marginEnd,this.deadSpace=0,this.majorSteps=[1,2,5,10],this.minorSteps=[.25,.5,1,2],this.setRange(t,e,i,s,o)}e.prototype.setRange=function(t,e,i,s,o){this._start=void 0===o.min?t:o.min,this._end=void 0===o.max?e:o.max,t==e&&(this._start=t-.75,this._end=e+1),this.autoScale&&this.setMinimumStep(i,s),this.setFirst(o)},e.prototype.setMinimumStep=function(t,e){var i=this._end-this._start,s=1.2*i,o=t*(s/e),n=Math.round(Math.log(s)/Math.LN10),r=-1,a=Math.pow(10,n),h=0;0>n&&(h=n);for(var d=!1,l=h;Math.abs(l)<=Math.abs(n);l++){a=Math.pow(10,l);for(var c=0;c=o){d=!0,r=c;break}}if(1==d)break}this.stepIndex=r,this.scale=a,this.step=a*this.minorSteps[r]},e.prototype.setFirst=function(t){void 0===t&&(t={});var e=void 0===t.min?this._start-2*this.scale*this.minorSteps[this.stepIndex]:t.min,i=void 0===t.max?this._end+this.scale*this.minorSteps[this.stepIndex]:t.max;this.marginEnd=void 0===t.max?this.roundToMinor(i):t.max,this.marginStart=void 0===t.min?this.roundToMinor(e):t.min,this.deadSpace=this.roundToMinor(i)-i+this.roundToMinor(e)-e,this.marginRange=this.marginEnd-this.marginStart,this.current=this.marginEnd},e.prototype.roundToMinor=function(t){var e=t-t%(this.scale*this.minorSteps[this.stepIndex]);return t%(this.scale*this.minorSteps[this.stepIndex])>.5*this.scale*this.minorSteps[this.stepIndex]?e+this.scale*this.minorSteps[this.stepIndex]:e},e.prototype.hasNext=function(){return this.current>=this.marginStart},e.prototype.next=function(){var t=this.current;this.current-=this.step,this.current==t&&(this.current=this._end)},e.prototype.previous=function(){this.current+=this.step,this.marginEnd+=this.step,this.marginRange=this.marginEnd-this.marginStart},e.prototype.getCurrent=function(){for(var t=""+Number(this.current).toPrecision(5),e=t.length-1;e>0;e--){if("0"!=t[e]){if("."==t[e]||","==t[e]){t=t.slice(0,e);break}break}t=t.slice(0,e)}return t},e.prototype.snap=function(){},e.prototype.isMajor=function(){return this.current%(this.scale*this.majorSteps[this.stepIndex])==0},t.exports=e},function(t,e,i){function s(t,e){var i=h().hours(0).minutes(0).seconds(0).milliseconds(0);this.start=i.clone().add("days",-3).valueOf(),this.end=i.clone().add("days",4).valueOf(),this.body=t,this.defaultOptions={start:null,end:null,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10},this.options=r.extend({},this.defaultOptions),this.props={touch:{}},this.body.emitter.on("dragstart",this._onDragStart.bind(this)),this.body.emitter.on("drag",this._onDrag.bind(this)),this.body.emitter.on("dragend",this._onDragEnd.bind(this)),this.body.emitter.on("hold",this._onHold.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("DOMMouseScroll",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.setOptions(e)}function o(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}function n(t,e){return{x:t.pageX-r.getAbsoluteLeft(e),y:t.pageY-r.getAbsoluteTop(e)}}var r=i(1),a=i(43),h=i(40),d=i(18);s.prototype=new d,s.prototype.setOptions=function(t){if(t){var e=["direction","min","max","zoomMin","zoomMax","moveable","zoomable"];r.selectiveExtend(e,this.options,t),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},s.prototype.setRange=function(t,e){var i=this._applyRange(t,e);if(i){var s={start:new Date(this.start),end:new Date(this.end)};this.body.emitter.emit("rangechange",s),this.body.emitter.emit("rangechanged",s)}},s.prototype._applyRange=function(t,e){var i,s=null!=t?r.convert(t,"Date").valueOf():this.start,o=null!=e?r.convert(e,"Date").valueOf():this.end,n=null!=this.options.max?r.convert(this.options.max,"Date").valueOf():null,a=null!=this.options.min?r.convert(this.options.min,"Date").valueOf():null;if(isNaN(s)||null===s)throw new Error('Invalid start "'+t+'"');if(isNaN(o)||null===o)throw new Error('Invalid end "'+e+'"');if(s>o&&(o=s),null!==a&&a>s&&(i=a-s,s+=i,o+=i,null!=n&&o>n&&(o=n)),null!==n&&o>n&&(i=o-n,s-=i,o-=i,null!=a&&a>s&&(s=a)),null!==this.options.zoomMin){var h=parseFloat(this.options.zoomMin);0>h&&(h=0),h>o-s&&(this.end-this.start===h?(s=this.start,o=this.end):(i=h-(o-s),s-=i/2,o+=i/2))}if(null!==this.options.zoomMax){var d=parseFloat(this.options.zoomMax);0>d&&(d=0),o-s>d&&(this.end-this.start===d?(s=this.start,o=this.end):(i=o-s-d,s+=i/2,o-=i/2))}var l=this.start!=s||this.end!=o;return this.start=s,this.end=o,l},s.prototype.getRange=function(){return{start:this.start,end:this.end}},s.prototype.conversion=function(t){return s.conversion(this.start,this.end,t)},s.conversion=function(t,e,i){return 0!=i&&e-t!=0?{offset:t,scale:i/(e-t)}:{offset:0,scale:1}},s.prototype._onDragStart=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.start=this.start,this.props.touch.end=this.end,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},s.prototype._onDrag=function(t){if(this.options.moveable){var e=this.options.direction;if(o(e),this.props.touch.allowDragging){var i="horizontal"==e?t.gesture.deltaX:t.gesture.deltaY,s=this.props.touch.end-this.props.touch.start,n="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height,r=-i/n*s;this._applyRange(this.props.touch.start+r,this.props.touch.end+r),this.body.emitter.emit("rangechange",{start:new Date(this.start),end:new Date(this.end)})}}},s.prototype._onDragEnd=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end)}))},s.prototype._onMouseWheel=function(t){if(this.options.zoomable&&this.options.moveable){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i;i=0>e?1-e/5:1/(1+e/5);var s=a.fakeGesture(this,t),o=n(s.center,this.body.dom.center),r=this._pointerToDate(o);this.zoom(i,r)}t.preventDefault()}},s.prototype._onTouch=function(){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null},s.prototype._onHold=function(){this.props.touch.allowDragging=!1},s.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable&&(this.props.touch.allowDragging=!1,t.gesture.touches.length>1)){this.props.touch.center||(this.props.touch.center=n(t.gesture.center,this.body.dom.center));var e=1/t.gesture.scale,i=this._pointerToDate(this.props.touch.center),s=parseInt(i+(this.props.touch.start-i)*e),o=parseInt(i+(this.props.touch.end-i)*e);this.setRange(s,o)}},s.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(o(i),"horizontal"==i){var s=this.body.domProps.center.width;return e=this.conversion(s),t.x/e.scale+e.offset}var n=this.body.domProps.center.height;return e=this.conversion(n),t.y/e.scale+e.offset},s.prototype.zoom=function(t,e){null==e&&(e=(this.start+this.end)/2);var i=e+(this.start-e)*t,s=e+(this.end-e)*t;this.setRange(i,s)},s.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,s=this.end+e*t;this.start=i,this.end=s},s.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,s=this.start-i,o=this.end-i;this.setRange(s,o)},t.exports=s},function(t,e){var i=.001;e.orderByStart=function(t){t.sort(function(t,e){return t.data.start-e.data.start})},e.orderByEnd=function(t){t.sort(function(t,e){var i="end"in t.data?t.data.end:t.data.start,s="end"in e.data?e.data.end:e.data.start;return i-s})},e.stack=function(t,i,s){var o,n;if(s)for(o=0,n=t.length;n>o;o++)t[o].top=null;for(o=0,n=t.length;n>o;o++){var r=t[o];if(null===r.top){r.top=i.axis;do{for(var a=null,h=0,d=t.length;d>h;h++){var l=t[h];if(null!==l.top&&l!==r&&e.collision(r,l,i.item)){a=l;break}}null!=a&&(r.top=a.top+a.height+i.item.vertical)}while(a)}}},e.nostack=function(t,e){var i,s;for(i=0,s=t.length;s>i;i++)t[i].top=e.axis},e.collision=function(t,e,s){return t.left-s.horizontal+ie.left&&t.top-s.vertical+ie.top}},function(t,e,i){function s(t,e,i){this.current=new Date,this._start=new Date,this._end=new Date,this.autoScale=!0,this.scale=s.SCALE.DAY,this.step=1,this.setRange(t,e,i)}var o=i(40);s.SCALE={MILLISECOND:1,SECOND:2,MINUTE:3,HOUR:4,DAY:5,WEEKDAY:6,MONTH:7,YEAR:8},s.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?new Date(t.valueOf()):new Date,this._end=void 0!=e?new Date(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},s.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},s.prototype.roundToMinor=function(){switch(this.scale){case s.SCALE.YEAR:this.current.setFullYear(this.step*Math.floor(this.current.getFullYear()/this.step)),this.current.setMonth(0);case s.SCALE.MONTH:this.current.setDate(1);case s.SCALE.DAY:case s.SCALE.WEEKDAY:this.current.setHours(0);case s.SCALE.HOUR:this.current.setMinutes(0);case s.SCALE.MINUTE:this.current.setSeconds(0);case s.SCALE.SECOND:this.current.setMilliseconds(0)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.setMilliseconds(this.current.getMilliseconds()-this.current.getMilliseconds()%this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()-this.current.getSeconds()%this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()-this.current.getMinutes()%this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()-this.current.getHours()%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()-1-(this.current.getDate()-1)%this.step+1);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()-this.current.getMonth()%this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()-this.current.getFullYear()%this.step)}},s.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},s.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current=new Date(this.current.valueOf()+1e3*this.step);break;case s.SCALE.MINUTE:this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case s.SCALE.HOUR:this.current=new Date(this.current.valueOf()+1e3*this.step*60*60);var e=this.current.getHours();this.current.setHours(e-e%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}else switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()+this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()+this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()+this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.getMilliseconds()0&&(this.step=e),this.autoScale=!1},s.prototype.setAutoScale=function(t){this.autoScale=t},s.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,o=864e5,n=36e5,r=6e4,a=1e3,h=1;1e3*e>t&&(this.scale=s.SCALE.YEAR,this.step=1e3),500*e>t&&(this.scale=s.SCALE.YEAR,this.step=500),100*e>t&&(this.scale=s.SCALE.YEAR,this.step=100),50*e>t&&(this.scale=s.SCALE.YEAR,this.step=50),10*e>t&&(this.scale=s.SCALE.YEAR,this.step=10),5*e>t&&(this.scale=s.SCALE.YEAR,this.step=5),e>t&&(this.scale=s.SCALE.YEAR,this.step=1),3*i>t&&(this.scale=s.SCALE.MONTH,this.step=3),i>t&&(this.scale=s.SCALE.MONTH,this.step=1),5*o>t&&(this.scale=s.SCALE.DAY,this.step=5),2*o>t&&(this.scale=s.SCALE.DAY,this.step=2),o>t&&(this.scale=s.SCALE.DAY,this.step=1),o/2>t&&(this.scale=s.SCALE.WEEKDAY,this.step=1),4*n>t&&(this.scale=s.SCALE.HOUR,this.step=4),n>t&&(this.scale=s.SCALE.HOUR,this.step=1),15*r>t&&(this.scale=s.SCALE.MINUTE,this.step=15),10*r>t&&(this.scale=s.SCALE.MINUTE,this.step=10),5*r>t&&(this.scale=s.SCALE.MINUTE,this.step=5),r>t&&(this.scale=s.SCALE.MINUTE,this.step=1),15*a>t&&(this.scale=s.SCALE.SECOND,this.step=15),10*a>t&&(this.scale=s.SCALE.SECOND,this.step=10),5*a>t&&(this.scale=s.SCALE.SECOND,this.step=5),a>t&&(this.scale=s.SCALE.SECOND,this.step=1),200*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=200),100*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=100),50*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=50),10*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=10),5*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=5),h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=1)}},s.prototype.snap=function(t){var e=new Date(t.valueOf());if(this.scale==s.SCALE.YEAR){var i=e.getFullYear()+Math.round(e.getMonth()/12);e.setFullYear(Math.round(i/this.step)*this.step),e.setMonth(0),e.setDate(0),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MONTH)e.getDate()>15?(e.setDate(1),e.setMonth(e.getMonth()+1)):e.setDate(1),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0);else if(this.scale==s.SCALE.DAY){switch(this.step){case 5:case 2:e.setHours(24*Math.round(e.getHours()/24));break;default:e.setHours(12*Math.round(e.getHours()/12))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.WEEKDAY){switch(this.step){case 5:case 2:e.setHours(12*Math.round(e.getHours()/12));break;default:e.setHours(6*Math.round(e.getHours()/6))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.HOUR){switch(this.step){case 4:e.setMinutes(60*Math.round(e.getMinutes()/60));break;default:e.setMinutes(30*Math.round(e.getMinutes()/30))}e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MINUTE){switch(this.step){case 15:case 10:e.setMinutes(5*Math.round(e.getMinutes()/5)),e.setSeconds(0);break;case 5:e.setSeconds(60*Math.round(e.getSeconds()/60));break;default:e.setSeconds(30*Math.round(e.getSeconds()/30))}e.setMilliseconds(0)}else if(this.scale==s.SCALE.SECOND)switch(this.step){case 15:case 10:e.setSeconds(5*Math.round(e.getSeconds()/5)),e.setMilliseconds(0);break;case 5:e.setMilliseconds(1e3*Math.round(e.getMilliseconds()/1e3));break;default:e.setMilliseconds(500*Math.round(e.getMilliseconds()/500))}else if(this.scale==s.SCALE.MILLISECOND){var o=this.step>5?this.step/2:1;e.setMilliseconds(Math.round(e.getMilliseconds()/o)*o)}return e},s.prototype.isMajor=function(){switch(this.scale){case s.SCALE.MILLISECOND:return 0==this.current.getMilliseconds();case s.SCALE.SECOND:return 0==this.current.getSeconds();case s.SCALE.MINUTE:return 0==this.current.getHours()&&0==this.current.getMinutes();case s.SCALE.HOUR:return 0==this.current.getHours();case s.SCALE.WEEKDAY:case s.SCALE.DAY:return 1==this.current.getDate();case s.SCALE.MONTH:return 0==this.current.getMonth();case s.SCALE.YEAR:return!1;default:return!1}},s.prototype.getLabelMinor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("SSS");case s.SCALE.SECOND:return o(t).format("s");case s.SCALE.MINUTE:return o(t).format("HH:mm");case s.SCALE.HOUR:return o(t).format("HH:mm");case s.SCALE.WEEKDAY:return o(t).format("ddd D");case s.SCALE.DAY:return o(t).format("D");case s.SCALE.MONTH:return o(t).format("MMM");case s.SCALE.YEAR:return o(t).format("YYYY");default:return""}},s.prototype.getLabelMajor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("HH:mm:ss");case s.SCALE.SECOND:return o(t).format("D MMMM HH:mm");case s.SCALE.MINUTE:case s.SCALE.HOUR:return o(t).format("ddd D MMMM");case s.SCALE.WEEKDAY:case s.SCALE.DAY:return o(t).format("MMMM YYYY");case s.SCALE.MONTH:return o(t).format("YYYY");case s.SCALE.YEAR:return"";default:return""}},t.exports=s},function(t){function e(){this.options=null,this.props=null}e.prototype.setOptions=function(t){t&&util.extend(this.options,t)},e.prototype.redraw=function(){return!1},e.prototype.destroy=function(){},e.prototype._isResized=function(){var t=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;return this.props._previousWidth=this.props.width,this.props._previousHeight=this.props.height,t},t.exports=e},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCurrentTime:!0,locales:a,locale:"en"},this.options=o.extend({},this.defaultOptions),this._create(),this.setOptions(e)}var o=i(1),n=i(18),r=i(40),a=i(44);s.prototype=new n,s.prototype._create=function(){var t=document.createElement("div");t.className="currenttime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},s.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},s.prototype.setOptions=function(t){t&&o.selectiveExtend(["showCurrentTime","locale","locales"],this.options,t)},s.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=new Date,i=this.body.util.toScreen(e),s=this.options.locales[this.options.locale],o=s.current+" "+s.time+": "+r(e).format("dddd, MMMM Do YYYY, H:mm:ss");o=o.charAt(0).toUpperCase()+o.substring(1),this.bar.style.left=i+"px",this.bar.title=o}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},s.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,s=1/i/10;30>s&&(s=30),s>1e3&&(s=1e3),e.redraw(),e.currentTimeTimer=setTimeout(t,s)}var e=this;t()},s.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCustomTime:!1,locales:h,locale:"en"},this.options=n.extend({},this.defaultOptions),this.customTime=new Date,this.eventParams={},this._create(),this.setOptions(e)}var o=i(41),n=i(1),r=i(18),a=i(40),h=i(44);s.prototype=new r,s.prototype.setOptions=function(t){t&&n.selectiveExtend(["showCustomTime","locale","locales"],this.options,t)},s.prototype._create=function(){var t=document.createElement("div");t.className="customtime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t;var e=document.createElement("div");e.style.position="relative",e.style.top="0px",e.style.left="-10px",e.style.height="100%",e.style.width="20px",t.appendChild(e),this.hammer=o(t,{prevent_default:!0}),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this))},s.prototype.destroy=function(){this.options.showCustomTime=!1,this.redraw(),this.hammer.enable(!1),this.hammer=null,this.body=null},s.prototype.redraw=function(){if(this.options.showCustomTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar));var e=this.body.util.toScreen(this.customTime),i=this.options.locales[this.options.locale],s=i.time+": "+a(this.customTime).format("dddd, MMMM Do YYYY, H:mm:ss");s=s.charAt(0).toUpperCase()+s.substring(1),this.bar.style.left=e+"px",this.bar.title=s}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar);return!1},s.prototype.setCustomTime=function(t){this.customTime=new Date(t.valueOf()),this.redraw()},s.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())},s.prototype._onDragStart=function(t){this.eventParams.dragging=!0,this.eventParams.customTime=this.customTime,t.stopPropagation(),t.preventDefault()},s.prototype._onDrag=function(t){if(this.eventParams.dragging){var e=t.gesture.deltaX,i=this.body.util.toScreen(this.eventParams.customTime)+e,s=this.body.util.toTime(i);this.setCustomTime(s),this.body.emitter.emit("timechange",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault()}},s.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.body.emitter.emit("timechanged",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault())},t.exports=s},function(t,e,i){function s(t,e,i){this.id=o.randomUUID(),this.body=t,this.defaultOptions={orientation:"left",showMinorLabels:!0,showMajorLabels:!0,icons:!0,majorLinesOffset:7,minorLinesOffset:4,labelOffsetX:10,labelOffsetY:2,iconWidth:20,width:"40px",visible:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}}},this.linegraphSVG=i,this.props={},this.DOMelements={lines:{},labels:{}},this.dom={},this.range={start:0,end:0},this.options=o.extend({},this.defaultOptions),this.conversionFactor=1,this.setOptions(e),this.width=Number((""+this.options.width).replace("px","")),this.minWidth=this.width,this.height=this.linegraphSVG.offsetHeight,this.stepPixels=25,this.stepPixelsForced=25,this.lineOffset=0,this.master=!0,this.svgElements={},this.groups={},this.amountOfGroups=0,this._create() -}var o=i(1),n=i(2),r=i(18),a=i(14);s.prototype=new r,s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype.setOptions=function(t){if(t){var e=!1;this.options.orientation!=t.orientation&&void 0!==t.orientation&&(e=!0);var i=["orientation","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","width","visible","customRange"];o.selectiveExtend(i,this.options,t),this.minWidth=Number((""+this.options.width).replace("px","")),1==e&&this.dom.frame&&(this.hide(),this.show())}},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.style.width=this.options.width,this.dom.frame.style.height=this.height,this.dom.lineContainer=document.createElement("div"),this.dom.lineContainer.style.width="100%",this.dom.lineContainer.style.height=this.height,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.height="100%",this.svg.style.width="100%",this.svg.style.display="block",this.dom.frame.appendChild(this.svg)},s.prototype._redrawGroupIcons=function(){n.prepareElements(this.svgElements);var t,e=this.options.iconWidth,i=15,s=4,o=s+.5*i;t="left"==this.options.orientation?s:this.width-e-s;for(var r in this.groups)this.groups.hasOwnProperty(r)&&1==this.groups[r].visible&&(this.groups[r].drawIcon(t,o,this.svgElements,this.svg,e,i),o+=i+s);n.cleanupElements(this.svgElements)},s.prototype.show=function(){this.dom.frame.parentNode||("left"==this.options.orientation?this.body.dom.left.appendChild(this.dom.frame):this.body.dom.right.appendChild(this.dom.frame)),this.dom.lineContainer.parentNode||this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.lineContainer.parentNode&&this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer)},s.prototype.setRange=function(t,e){this.range.start=t,this.range.end=e},s.prototype.redraw=function(){var t=!1,e=0;for(var i in this.groups)this.groups.hasOwnProperty(i)&&1==this.groups[i].visible&&e++;if(0==this.amountOfGroups||0==e)this.hide();else{this.show(),this.height=Number(this.linegraphSVG.style.height.replace("px","")),this.dom.lineContainer.style.height=this.height+"px",this.width=1==this.options.visible?Number((""+this.options.width).replace("px","")):0;var s=this.props,o=this.dom.frame;o.className="dataaxis",this._calculateCharSize();var n=this.options.orientation,r=this.options.showMinorLabels,a=this.options.showMajorLabels;s.minorLabelHeight=r?s.minorCharHeight:0,s.majorLabelHeight=a?s.majorCharHeight:0,s.minorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.minorLinesOffset,s.minorLineHeight=1,s.majorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.majorLinesOffset,s.majorLineHeight=1,"left"==n?(o.style.top="0",o.style.left="0",o.style.bottom="",o.style.width=this.width+"px",o.style.height=this.height+"px"):(o.style.top="",o.style.bottom="0",o.style.left="0",o.style.width=this.width+"px",o.style.height=this.height+"px"),t=this._redrawLabels(),1==this.options.icons&&this._redrawGroupIcons()}return t},s.prototype._redrawLabels=function(){n.prepareElements(this.DOMelements.lines),n.prepareElements(this.DOMelements.labels);var t=this.options.orientation,e=this.master?this.props.majorCharHeight||10:this.stepPixelsForced,i=new a(this.range.start,this.range.end,e,this.dom.frame.offsetHeight,this.options.customRange[this.options.orientation]);this.step=i;var s=(this.dom.frame.offsetHeight-i.deadSpace*(this.dom.frame.offsetHeight/i.marginRange))/((i.marginRange-i.deadSpace)/i.step);this.stepPixels=s;var o=this.height/s,r=0;if(0==this.master){s=this.stepPixelsForced,r=Math.round(this.dom.frame.offsetHeight/s-o);for(var h=0;.5*r>h;h++)i.previous();o=this.height/s}else o+=.25;this.valueAtZero=i.marginEnd;var d=0,l=1;this.maxLabelSize=0;for(var c=0;l=0&&this._redrawLabel(c-2,i.getCurrent(),t,"yAxis major",this.props.majorCharHeight),this._redrawLine(c,t,"grid horizontal major",this.options.majorLinesOffset,this.props.majorLineWidth)):this._redrawLine(c,t,"grid horizontal minor",this.options.minorLinesOffset,this.props.minorLineWidth),l++}this.conversionFactor=0==this.master?c/(this.valueAtZero-i.current):this.dom.frame.offsetHeight/i.marginRange;var u=1==this.options.icons?this.options.iconWidth+this.options.labelOffsetX+15:this.options.labelOffsetX+15;return this.maxLabelSize>this.width-u&&1==this.options.visible?(this.width=this.maxLabelSize+u,this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+u),this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):(n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),!1)},s.prototype.convertValue=function(t){var e=this.valueAtZero-t,i=e*this.conversionFactor;return i},s.prototype._redrawLabel=function(t,e,i,s,o){var r=n.getDOMElement("div",this.DOMelements.labels,this.dom.frame);r.className=s,r.innerHTML=e,"left"==i?(r.style.left="-"+this.options.labelOffsetX+"px",r.style.textAlign="right"):(r.style.right="-"+this.options.labelOffsetX+"px",r.style.textAlign="left"),r.style.top=t-.5*o+this.options.labelOffsetY+"px",e+="";var a=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSizee.axis){var c=d-e.axis;l-=c,o.forEach(h,function(t){t.top-=c})}a=l+e.item.vertical/2}else a=e.axis+e.item.vertical;a=Math.max(a,this.props.label.height);var p=this.dom.foreground;this.top=p.offsetTop,this.left=p.offsetLeft,this.width=p.offsetWidth,s=o.updateProperty(this,"height",a)||s,s=o.updateProperty(this.props.label,"width",this.dom.inner.clientWidth)||s,s=o.updateProperty(this.props.label,"height",this.dom.inner.clientHeight)||s,this.dom.background.style.height=a+"px",this.dom.foreground.style.height=a+"px",this.dom.label.style.height=a+"px";for(var u=0,f=this.visibleItems.length;f>u;u++){var m=this.visibleItems[u];m.repositionY()}return s},s.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},s.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var s=this.dom.axis;s.parentNode&&s.parentNode.removeChild(s)},s.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},s.prototype.remove=function(t){delete this.items[t.id],t.setParent(this.itemSet);var e=this.visibleItems.indexOf(t);-1!=e&&this.visibleItems.splice(e,1)},s.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},s.prototype.order=function(){var t=o.toArray(this.items);this.orderedItems.byStart=t,this.orderedItems.byEnd=this._constructByEndArray(t),n.orderByStart(this.orderedItems.byStart),n.orderByEnd(this.orderedItems.byEnd)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0)for(n=0;n=0&&!this._checkIfInvisible(t.byStart[n],r,i);n--);for(n=s+1;n=0&&!this._checkIfInvisible(t.byEnd[n],r,i);n--);for(n=a+1;ne;e++)s=this.selection[e],o=this.items[s],o&&o.unselect();for(this.selection=[],e=0,i=t.length;i>e;e++)s=t[e],o=this.items[s],o&&(this.selection.push(s),o.select())},s.prototype.getSelection=function(){return this.selection.concat([])},s.prototype.getVisibleItems=function(){var t=this.body.range.getRange(),e=this.body.util.toScreen(t.start),i=this.body.util.toScreen(t.end),s=[];for(var o in this.groups)if(this.groups.hasOwnProperty(o))for(var n=this.groups[o],r=n.visibleItems,a=0;ae&&s.push(h.id)}return s},s.prototype._deselect=function(t){for(var e=this.selection,i=0,s=e.length;s>i;i++)if(e[i]==t){e.splice(i,1);break}},s.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=r.option.asSize,s=this.options,o=s.orientation,n=!1,a=this.dom.frame,h=s.editable.updateTime||s.editable.updateGroup;a.className="itemset"+(h?" editable":""),n=this._orderGroups()||n;var d=e.end-e.start,l=d!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;l&&(this.stackDirty=!0),this.lastVisibleInterval=d,this.props.lastWidth=this.props.width;var c=this.stackDirty,p=this._firstGroup(),u={item:t.item,axis:t.axis},f={item:t.item,axis:t.item.vertical/2},m=0,g=t.axis+t.item.vertical;return r.forEach(this.groups,function(t){var i=t==p?u:f,s=t.redraw(e,i,c);n=s||n,m+=t.height}),m=Math.max(m,g),this.stackDirty=!1,a.style.height=i(m),this.props.top=a.offsetTop,this.props.left=a.offsetLeft,this.props.width=a.offsetWidth,this.props.height=m,this.dom.axis.style.top=i("top"==o?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.dom.axis.style.left="0",n=this._isResized()||n},s.prototype._firstGroup=function(){var t="top"==this.options.orientation?0:this.groupIds.length-1,e=this.groupIds[t],i=this.groups[e]||this.groups[f];return i||null},s.prototype._updateUngrouped=function(){var t=this.groups[f];if(this.groupsData)t&&(t.hide(),delete this.groups[f]);else if(!t){var e=null,i=null;t=new l(e,i,this),this.groups[f]=t;for(var s in this.items)this.items.hasOwnProperty(s)&&t.add(this.items[s]);t.show()}},s.prototype.getLabelSet=function(){return this.dom.labelSet},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof a||t instanceof h))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(r.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var o=this.id;r.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,o)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}},s.prototype.getItems=function(){return this.itemsData},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(r.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof a||t instanceof h))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;r.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("change")},s.prototype.getGroups=function(){return this.groupsData},s.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},s.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i=e.itemsData.get(t,e.itemOptions),o=e.items[t],n=i.type||e.options.type||(i.end?"range":"box"),r=s.types[n];if(o&&(r&&o instanceof r?e._updateItem(o,i):(e._removeItem(o),o=null)),!o){if(!r)throw new TypeError("rangeoverflow"==n?'Item type "rangeoverflow" is deprecated. Use css styling instead: .vis.timeline .item.range .content {overflow: visible;}':'Unknown item type "'+n+'"');o=new r(i,e.conversion,e.options),o.id=t,e._addItem(o)}}),this._order(),this.stackDirty=!0,this.body.emitter.emit("change")},s.prototype._onAdd=s.prototype._onUpdate,s.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var s=i.items[t];s&&(e++,i._removeItem(s))}),e&&(this._order(),this.stackDirty=!0,this.body.emitter.emit("change"))},s.prototype._order=function(){r.forEach(this.groups,function(t){t.order()})},s.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},s.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),s=e.groups[t];if(s)s.setData(i);else{if(t==f)throw new Error("Illegal group id. "+t+" is a reserved id.");var o=Object.create(e.options);r.extend(o,{height:null}),s=new l(t,i,e),e.groups[t]=s;for(var n in e.items)if(e.items.hasOwnProperty(n)){var a=e.items[n];a.data.group==t&&s.add(a)}s.order(),s.show()}}),this.body.emitter.emit("change")},s.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("change")},s.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder}),e=!r.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},s.prototype._addItem=function(t){this.items[t.id]=t;var e=this.groupsData?t.data.group:f,i=this.groups[e];i&&i.add(t)},s.prototype._updateItem=function(t,e){var i=t.data.group;if(t.data=e,t.displayed&&t.redraw(),i!=t.data.group){var s=this.groups[i];s&&s.remove(t);var o=this.groupsData?t.data.group:f,n=this.groups[o];n&&n.add(t)}},s.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1);var i=this.groupsData?t.data.group:f,s=this.groups[i];s&&s.remove(t)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0||o.length>0)&&this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}},s.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=this.body.util.snap||null,o=s.itemFromTarget(t);if(o){var n=e.itemsData.get(o.id);this.options.onUpdate(n,function(t){t&&e.itemsData.update(t)})}else{var a=r.getAbsoluteLeft(this.dom.frame),h=t.gesture.center.pageX-a,d=this.body.util.toTime(h),l={start:i?i(d):d,content:"new item"};if("range"===this.options.type){var c=this.body.util.toTime(h+this.props.width/5);l.end=i?i(c):c}l[this.itemsData.fieldId]=r.randomUUID();var p=s.groupFromTarget(t);p&&(l.group=p.groupId),this.options.onAdd(l,function(t){t&&e.itemsData.add(l)})}}},s.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e,i=s.itemFromTarget(t);if(i){e=this.getSelection();var o=e.indexOf(i.id);-1==o?e.push(i.id):e.splice(o,1),this.setSelection(e),this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}}},s.itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},s.groupFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-group"))return e["timeline-group"];e=e.parentNode}return null},s.itemSetFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-itemset"))return e["timeline-itemset"];e=e.parentNode}return null},t.exports=s},function(t,e,i){function s(t,e,i){this.body=t,this.defaultOptions={enabled:!0,icons:!0,iconSize:20,iconSpacing:6,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-left"}},this.side=i,this.options=o.extend({},this.defaultOptions),this.svgElements={},this.dom={},this.groups={},this.amountOfGroups=0,this._create(),this.setOptions(e)}var o=i(1),n=i(2),r=i(18);s.prototype=new r,s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.className="legend",this.dom.frame.style.position="absolute",this.dom.frame.style.top="10px",this.dom.frame.style.display="block",this.dom.textArea=document.createElement("div"),this.dom.textArea.className="legendText",this.dom.textArea.style.position="relative",this.dom.textArea.style.top="0px",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.width=this.options.iconSize+5+"px",this.dom.frame.appendChild(this.svg),this.dom.frame.appendChild(this.dom.textArea)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setOptions=function(t){var e=["enabled","orientation","icons","left","right"];o.selectiveDeepExtend(e,this.options,t)},s.prototype.redraw=function(){var t=0;for(var e in this.groups)this.groups.hasOwnProperty(e)&&1==this.groups[e].visible&&t++;if(0==this.options[this.side].visible||0==this.amountOfGroups||0==this.options.enabled||0==t)this.hide();else{this.show(),"top-left"==this.options[this.side].position||"bottom-left"==this.options[this.side].position?(this.dom.frame.style.left="4px",this.dom.frame.style.textAlign="left",this.dom.textArea.style.textAlign="left",this.dom.textArea.style.left=this.options.iconSize+15+"px",this.dom.textArea.style.right="",this.svg.style.left="0px",this.svg.style.right=""):(this.dom.frame.style.right="4px",this.dom.frame.style.textAlign="right",this.dom.textArea.style.textAlign="right",this.dom.textArea.style.right=this.options.iconSize+15+"px",this.dom.textArea.style.left="",this.svg.style.right="0px",this.svg.style.left=""),"top-left"==this.options[this.side].position||"top-right"==this.options[this.side].position?(this.dom.frame.style.top=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.bottom=""):(this.dom.frame.style.bottom=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.top=""),0==this.options.icons?(this.dom.frame.style.width=this.dom.textArea.offsetWidth+10+"px",this.dom.textArea.style.right="",this.dom.textArea.style.left="",this.svg.style.width="0px"):(this.dom.frame.style.width=this.options.iconSize+15+this.dom.textArea.offsetWidth+10+"px",this.drawLegendIcons()); -var i="";for(var e in this.groups)this.groups.hasOwnProperty(e)&&1==this.groups[e].visible&&(i+=this.groups[e].content+"
");this.dom.textArea.innerHTML=i,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},s.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){n.prepareElements(this.svgElements);var t=window.getComputedStyle(this.dom.frame).paddingTop,e=Number(t.replace("px","")),i=e,s=this.options.iconSize,o=.75*this.options.iconSize,r=e+.5*o+3;this.svg.style.width=s+5+e+"px";for(var a in this.groups)this.groups.hasOwnProperty(a)&&1==this.groups[a].visible&&(this.groups[a].drawIcon(i,r,this.svgElements,this.svg,s,o),r+=o+this.options.iconSpacing);n.cleanupElements(this.svgElements)}},t.exports=s},function(t,e,i){function s(t,e){this.id=o.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,handleOverlap:"overlap",align:"center"},catmullRom:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:"40px",visible:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}}},legend:{enabled:!1,icons:!0,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}},groups:{visibility:{}}},this.options=o.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={},this.abortedGraphUpdate=!1;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechange",function(){if(0!=i.lastStart){var t=i.body.range.start-i.lastStart,e=i.body.range.end-i.body.range.start;if(0!=i.width){var s=i.width/e,o=t*s;i.svg.style.left=-i.width-o+"px"}}}),this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=o.option.asSize(-i.width),i._updateGraph.apply(i)}),this._create(),this.body.emitter.emit("change")}var o=i(1),n=i(2),r=i(3),a=i(4),h=i(18),d=i(21),l=i(22),c=i(25),p="__ungrouped__";s.prototype=new h,s.prototype._create=function(){var t=document.createElement("div");t.className="LineGraph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new d(this.body,this.options.dataAxis,this.svg),this.options.dataAxis.orientation="right",this.yAxisRight=new d(this.body,this.options.dataAxis,this.svg),delete this.options.dataAxis.orientation,this.legendLeft=new c(this.body,this.options.legend,"left"),this.legendRight=new c(this.body,this.options.legend,"right"),this.show()},s.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort","groups"];o.selectiveDeepExtend(e,this.options,t),o.mergeOptions(this.options,t,"catmullRom"),o.mergeOptions(this.options,t,"drawPoints"),o.mergeOptions(this.options,t,"shaded"),o.mergeOptions(this.options,t,"legend"),t.catmullRom&&"object"==typeof t.catmullRom&&t.catmullRom.parametrization&&("uniform"==t.catmullRom.parametrization?this.options.catmullRom.alpha=0:"chordal"==t.catmullRom.parametrization?this.options.catmullRom.alpha=1:(this.options.catmullRom.parametrization="centripetal",this.options.catmullRom.alpha=.5)),this.yAxisLeft&&void 0!==t.dataAxis&&(this.yAxisLeft.setOptions(this.options.dataAxis),this.yAxisRight.setOptions(this.options.dataAxis)),this.legendLeft&&void 0!==t.legend&&(this.legendLeft.setOptions(this.options.legend),this.legendRight.setOptions(this.options.legend)),this.groups.hasOwnProperty(p)&&this.groups[p].setOptions(t)}this.dom.frame&&this._updateGraph()},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(o.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;o.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e)}this._updateUngrouped(),this._updateGraph(),this.redraw()},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(o.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;o.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._onUpdate()},s.prototype._onUpdate=function(){this._updateUngrouped(),this._updateAllGroupData(),this._updateGraph(),this.redraw()},s.prototype._onAdd=function(t){this._onUpdate(t)},s.prototype._onRemove=function(t){this._onUpdate(t)},s.prototype._onUpdateGroups=function(t){for(var e=0;e0){var d=this.body.util.toGlobalTime(-this.body.domProps.root.width),l=this.body.util.toGlobalTime(2*this.body.domProps.root.width),c={};for(this._getRelevantData(a,c,d,l),e=0;e0)for(r=0;rs){d.push(h);break}d.push(h)}}else for(a=0;ai&&h.x0)for(var s=0;s0){var n=1,r=o.length,a=this.body.util.toGlobalScreen(o[o.length-1].x)-this.body.util.toGlobalScreen(o[0].x),h=r/a;n=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=[],l=0;r>l;l+=n)d.push(o[l]);e[t[s]]=d}}},s.prototype._getYRanges=function(t,e,i){var s,o,n,r,a,h=[],d=[];if(t.length>0){for(n=0;n0)if(o=this.groups[t[n]],"line"==o.options.style||"stack"!=o.options.barChart.handleOverlap){var l=s[0].y,c=s[0].y;for(r=0;rs[r].y?s[r].y:l,c=c0&&(h.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x}),p={},this._getDataIntersections(p,h),i.__barchartLeft=this._getStackedBarYRange(p,h),i.__barchartLeft.yAxisOrientation="left",t.push("__barchartLeft")),d.length>0&&(d.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x}),p={},this._getDataIntersections(p,d),i.__barchartRight=this._getStackedBarYRange(p,d),i.__barchartRight.yAxisOrientation="right",t.push("__barchartRight"))}},s.prototype._getStackedBarYRange=function(t,e){for(var i,s=e[0].y,o=e[0].y,n=0;ne[n].y?e[n].y:s,o=ot[r].accumulated?t[r].accumulated:s,o=o0){for(var c=0;ci?i:a,d=s>d?s:d):(r=!0,h=h>i?i:h,l=s>l?s:l));1==n&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}return o=this._toggleAxisVisiblity(n,this.yAxisLeft)||o,o=this._toggleAxisVisiblity(r,this.yAxisRight)||o,1==r&&1==n?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!n,0==this.yAxisRight.master?(this.yAxisLeft.lineOffset=1==r?this.yAxisRight.width:0,o=this.yAxisLeft.redraw()||o,this.yAxisRight.stepPixelsForced=this.yAxisLeft.stepPixels,o=this.yAxisRight.redraw()||o):o=this.yAxisRight.redraw()||o,-1!=t.indexOf("__barchartLeft")&&t.splice(t.indexOf("__barchartLeft"),1),-1!=t.indexOf("__barchartRight")&&t.splice(t.indexOf("__barchartRight"),1),o},s.prototype._toggleAxisVisiblity=function(t,e){var i=!1;return 0==t?e.dom.frame.parentNode&&(e.hide(),i=!0):e.dom.frame.parentNode||(e.show(),i=!0),i},s.prototype._drawBarGraphs=function(t,e){var i,s,o,r,a,h,d=[],l={},c=0;for(a=0;a0&&(i=Math.min(i,Math.abs(d[a-1].x-s))),o=this._getSafeDrawData(i,r,p);else{var f=a+(l[s].amount-l[s].resolved),m=a-(l[s].resolved+1);f0&&(i=Math.min(i,Math.abs(d[m].x-s))),o=this._getSafeDrawData(i,r,p),l[s].resolved+=1,"stack"==r.options.barChart.handleOverlap?(u=l[s].accumulated,l[s].accumulated+=r.zeroPosition-d[a].y):"sideBySide"==r.options.barChart.handleOverlap&&(o.width=o.width/l[s].amount,o.offset+=l[s].resolved*o.width-.5*o.width*(l[s].amount+1),"left"==r.options.barChart.align?o.offset-=.5*o.width:"right"==r.options.barChart.align&&(o.offset+=.5*o.width))}n.drawBar(d[a].x+o.offset,d[a].y-u,o.width,r.zeroPosition-d[a].y,r.className+" bar",this.svgElements,this.svg),1==r.options.drawPoints.enabled&&n.drawPoint(d[a].x+o.offset,d[a].y-u,r,this.svgElements,this.svg)}},s.prototype._getDataIntersections=function(t,e){for(var i,s=0;s0&&(i=Math.min(i,Math.abs(e[s-1].x-e[s].x))),0==i&&(void 0===t[e[s].x]&&(t[e[s].x]={amount:0,resolved:0,accumulated:0}),t[e[s].x].amount+=1)},s.prototype._getSafeDrawData=function(t,e,i){var s,o;return t0?(s=i>t?i:t,o=0,"left"==e.options.barChart.align?o-=.5*t:"right"==e.options.barChart.align&&(o+=.5*t)):(s=e.options.barChart.width,o=0,"left"==e.options.barChart.align?o-=.5*e.options.barChart.width:"right"==e.options.barChart.align&&(o+=.5*e.options.barChart.width)),{width:s,offset:o}},s.prototype._drawLineGraph=function(t,e){if(null!=t&&t.length>0){var i,s,o=Number(this.svg.style.height.replace("px",""));if(i=n.getSVGElement("path",this.svgElements,this.svg),i.setAttributeNS(null,"class",e.className),s=1==e.options.catmullRom.enabled?this._catmullRom(t,e):this._linear(t),1==e.options.shaded.enabled){var r,a=n.getSVGElement("path",this.svgElements,this.svg);r="top"==e.options.shaded.orientation?"M"+t[0].x+",0 "+s+"L"+t[t.length-1].x+",0":"M"+t[0].x+","+o+" "+s+"L"+t[t.length-1].x+","+o,a.setAttributeNS(null,"class",e.className+" fill"),a.setAttributeNS(null,"d",r)}i.setAttributeNS(null,"d","M"+s),1==e.options.drawPoints.enabled&&this._drawPoints(t,e,this.svgElements,this.svg)}},s.prototype._drawPoints=function(t,e,i,s,o){void 0===o&&(o=0);for(var r=0;rl;l++)e=0==l?t[0]:t[l-1],i=t[l],s=t[l+1],o=d>l+2?t[l+2]:s,n={x:(-e.x+6*i.x+s.x)*h,y:(-e.y+6*i.y+s.y)*h},r={x:(i.x+6*s.x-o.x)*h,y:(i.y+6*s.y-o.y)*h},a+="C"+n.x+","+n.y+" "+r.x+","+r.y+" "+s.x+","+s.y+" ";return a},s.prototype._catmullRom=function(t,e){var i=e.options.catmullRom.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);for(var s,o,n,r,a,h,d,l,c,p,u,f,m,g,v,y,b,_,x,w=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",S=t.length,M=0;S-1>M;M++)s=0==M?t[0]:t[M-1],o=t[M],n=t[M+1],r=S>M+2?t[M+2]:n,d=Math.sqrt(Math.pow(s.x-o.x,2)+Math.pow(s.y-o.y,2)),l=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),c=Math.sqrt(Math.pow(n.x-r.x,2)+Math.pow(n.y-r.y,2)),g=Math.pow(c,i),y=Math.pow(c,2*i),v=Math.pow(l,i),b=Math.pow(l,2*i),x=Math.pow(d,i),_=Math.pow(d,2*i),p=2*_+3*x*v+b,u=2*y+3*g*v+b,f=3*x*(x+v),f>0&&(f=1/f),m=3*g*(g+v),m>0&&(m=1/m),a={x:(-b*s.x+p*o.x+_*n.x)*f,y:(-b*s.y+p*o.y+_*n.y)*f},h={x:(y*o.x+u*n.x-b*r.x)*m,y:(y*o.y+u*n.y-b*r.y)*m},0==a.x&&0==a.y&&(a=o),0==h.x&&0==h.y&&(h=n),w+="C"+a.x+","+a.y+" "+h.x+","+h.y+" "+n.x+","+n.y+" ";return w},s.prototype._linear=function(t){for(var e="",i=0;id;){d++;var l=n.getCurrent(),c=this.body.util.toScreen(l),p=n.isMajor();this.options.showMinorLabels&&this._repaintMinorText(c,n.getLabelMinor(),t),p&&this.options.showMajorLabels?(c>0&&(void 0==h&&(h=c),this._repaintMajorText(c,n.getLabelMajor(),t)),this._repaintMajorLine(c,t)):this._repaintMinorLine(c,t),n.next()}if(this.options.showMajorLabels){var u=this.body.util.toTime(0),f=n.getLabelMajor(u),m=f.length*(this.props.majorCharWidth||10)+10;(void 0==h||h>m)&&this._repaintMajorText(0,f,t)}o.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},s.prototype._repaintMinorText=function(t,e,i){var s=this.dom.redundant.minorTexts.shift();if(!s){var o=document.createTextNode("");s=document.createElement("div"),s.appendChild(o),s.className="text minor",this.dom.foreground.appendChild(s)}this.dom.minorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?this.props.majorLabelHeight+"px":"0",s.style.left=t+"px"},s.prototype._repaintMajorText=function(t,e,i){var s=this.dom.redundant.majorTexts.shift();if(!s){var o=document.createTextNode(e);s=document.createElement("div"),s.className="text major",s.appendChild(o),this.dom.foreground.appendChild(s)}this.dom.majorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?"0":this.props.minorLabelHeight+"px",s.style.left=t+"px"},s.prototype._repaintMinorLine=function(t,e){var i=this.dom.redundant.minorLines.shift();i||(i=document.createElement("div"),i.className="grid vertical minor",this.dom.background.appendChild(i)),this.dom.minorLines.push(i);var s=this.props;i.style.top="top"==e?s.majorLabelHeight+"px":this.body.domProps.top.height+"px",i.style.height=s.minorLineHeight+"px",i.style.left=t-s.minorLineWidth/2+"px"},s.prototype._repaintMajorLine=function(t,e){var i=this.dom.redundant.majorLines.shift();i||(i=document.createElement("DIV"),i.className="grid vertical major",this.dom.background.appendChild(i)),this.dom.majorLines.push(i);var s=this.props;i.style.top="top"==e?"0":this.body.domProps.top.height+"px",i.style.left=t-s.majorLineWidth/2+"px",i.style.height=s.majorLineHeight+"px"},s.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="text minor measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="text minor measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth},s.prototype.snap=function(t){return this.step.snap(t)},t.exports=s},function(t,e,i){function s(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.dirty=!0,this.top=null,this.left=null,this.width=null,this.height=null}var o=i(41);s.prototype.select=function(){this.selected=!0,this.displayed&&this.redraw()},s.prototype.unselect=function(){this.selected=!1,this.displayed&&this.redraw()},s.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},s.prototype.isVisible=function(){return!1},s.prototype.show=function(){return!1},s.prototype.hide=function(){return!1},s.prototype.redraw=function(){},s.prototype.repositionX=function(){},s.prototype.repositionY=function(){},s.prototype._repaintDeleteButton=function(t){if(this.selected&&this.options.editable.remove&&!this.dom.deleteButton){var e=this,i=document.createElement("div");i.className="delete",i.title="Delete this item",o(i,{preventDefault:!0}).on("tap",function(t){e.parent.removeFromDataSet(e),t.stopPropagation()}),t.appendChild(i),this.dom.deleteButton=i}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);o.call(this,t,e,i)}var o=i(28);s.prototype=new o(null,null,null),s.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.startt.start-e&&this.data.startt.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),t.box["timeline-item"]=this),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.foreground;if(!e)throw new Error("Cannot redraw time axis: parent has no foreground container element"); -e.appendChild(t.box)}if(this.displayed=!0,this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)t.content.innerHTML="",t.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);t.content.innerHTML=this.content}this.dirty=!0}this.data.title!=this.title&&(t.box.title=this.data.title,this.title=this.data.title);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");this.className!=i&&(this.className=i,t.box.className=this.baseClassName+i,this.dirty=!0),this.dirty&&(this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dirty=!1),this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},s.prototype.show=function(){this.displayed||this.redraw()},s.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.top=null,this.left=null,this.displayed=!1}},s.prototype.repositionX=function(){var t,e=this.props,i=this.parent.width,s=this.conversion.toScreen(this.data.start),o=this.conversion.toScreen(this.data.end),n=this.options.padding;-i>s&&(s=-i),o>2*i&&(o=2*i);var r=Math.max(o-s,1);this.overflow?(t=Math.max(-s,0),this.left=s,this.width=r+this.props.content.width):(t=0>s?Math.min(-s,o-s-e.content.width-2*n):0,this.left=s,this.width=r),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=r+"px",this.dom.content.style.left=t+"px"},s.prototype.repositionY=function(){var t=this.options.orientation,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},s.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="drag-left",t.dragLeftItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragLeft=t}else!this.selected&&this.dom.dragLeft&&(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},s.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="drag-right",t.dragRightItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragRight=t}else!this.selected&&this.dom.dragRight&&(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this._initializeMixinLoaders(),this.containerElement=t,this.renderRefreshRate=60,this.renderTimestep=1e3/this.renderRefreshRate,this.renderTime=.5*this.renderTimestep,this.maxPhysicsTicksPerRender=3,this.physicsDiscreteStepsize=.5,this.initializing=!0,this.triggerFunctions={add:null,edit:null,editEdge:null,connect:null,del:null},this.defaultOptions={nodes:{mass:1,radiusMin:10,radiusMax:30,radius:10,shape:"ellipse",image:void 0,widthMin:16,widthMax:64,fixed:!1,fontColor:"black",fontSize:14,fontFace:"verdana",level:-1,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},borderColor:"#2B7CE9",backgroundColor:"#97C2FC",highlightColor:"#D2E5FF",group:void 0,borderWidth:1},edges:{widthMin:1,widthMax:15,width:1,widthSelectionMultiplier:2,hoverWidth:1.5,style:"line",color:{color:"#848484",highlight:"#848484",hover:"#848484"},fontColor:"#343434",fontSize:14,fontFace:"arial",fontFill:"white",arrowScaleFactor:1,dash:{length:10,gap:5,altLength:void 0},inheritColor:"from"},configurePhysics:!1,physics:{barnesHut:{enabled:!0,theta:1/.6,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09},repulsion:{centralGravity:0,springLength:200,springConstant:.05,nodeDistance:100,damping:.09},hierarchicalRepulsion:{enabled:!1,centralGravity:0,springLength:100,springConstant:.01,nodeDistance:150,damping:.09},damping:null,centralGravity:null,springLength:null,springConstant:null},clustering:{enabled:!1,initialMaxNodes:100,clusterThreshold:500,reduceToNodes:300,chainThreshold:.4,clusterEdgeThreshold:20,sectorThreshold:100,screenSizeThreshold:.2,fontSizeMultiplier:4,maxFontSize:1e3,forceAmplification:.1,distanceAmplification:.1,edgeGrowth:20,nodeScaling:{width:1,height:1,radius:1},maxNodeSizeIncrements:600,activeAreaBoxSize:80,clusterLevelDifference:2},navigation:{enabled:!1},keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02}},dataManipulation:{enabled:!1,initiallyVisible:!1},hierarchicalLayout:{enabled:!1,levelSeparation:150,nodeSpacing:100,direction:"UD"},freezeForStabilization:!1,smoothCurves:{enabled:!0,dynamic:!0,type:"continuous",roundness:.5},dynamicSmoothCurves:!0,maxVelocity:30,minVelocity:.1,stabilize:!0,stabilizationIterations:1e3,locale:"en",locales:_,tooltip:{delay:300,fontColor:"black",fontSize:14,fontFace:"verdana",color:{border:"#666",background:"#FFFFC6"}},dragNetwork:!0,dragNodes:!0,zoomable:!0,hover:!1,hideEdgesOnDrag:!1,hideNodesOnDrag:!1,width:"100%",height:"100%",selectable:!0},this.constants=a.extend({},this.defaultOptions),this.hoverObj={nodes:{},edges:{}},this.controlNodesActive=!1;var o=this;this.groups=new u,this.images=new f,this.images.setOnloadCallback(function(){o._redraw()}),this.xIncrement=0,this.yIncrement=0,this.zoomIncrement=0,this._loadPhysicsSystem(),this._create(),this._loadSectorSystem(),this._loadClusterSystem(),this._loadSelectionSystem(),this._loadHierarchySystem(),this._setTranslation(this.frame.clientWidth/2,this.frame.clientHeight/2),this._setScale(1),this.setOptions(i),this.freezeSimulation=!1,this.cachedFunctions={},this.calculationNodes={},this.calculationNodeIndices=[],this.nodeIndices=[],this.nodes={},this.edges={},this.canvasTopLeft={x:0,y:0},this.canvasBottomRight={x:0,y:0},this.pointerPosition={x:0,y:0},this.areaCenter={},this.scale=1,this.previousScale=this.scale,this.nodesData=null,this.edgesData=null,this.nodesListeners={add:function(t,e){o._addNodes(e.items),o.start()},update:function(t,e){o._updateNodes(e.items),o.start()},remove:function(t,e){o._removeNodes(e.items),o.start()}},this.edgesListeners={add:function(t,e){o._addEdges(e.items),o.start()},update:function(t,e){o._updateEdges(e.items),o.start()},remove:function(t,e){o._removeEdges(e.items),o.start()}},this.moving=!0,this.timer=void 0,this.setData(e,this.constants.clustering.enabled||this.constants.hierarchicalLayout.enabled),this.initializing=!1,1==this.constants.hierarchicalLayout.enabled?this._setupHierarchicalLayout():0==this.constants.stabilize&&this.zoomExtent(!0,this.constants.clustering.enabled),this.constants.clustering.enabled&&this.startWithClustering()}var o=i(49),n=i(41),r=i(50),a=i(1),h=i(43),d=i(3),l=i(4),c=i(38),p=i(39),u=i(34),f=i(35),m=i(36),g=i(33),v=i(37),y=i(47),b=i(48),_=i(45);i(46),o(s.prototype),s.prototype._getScriptPath=function(){for(var t=document.getElementsByTagName("script"),e=0;et.x&&(s=t.x),ot.y&&(e=t.y),i=this.constants.clustering.initialMaxNodes?49.07548/(o+142.05338)+91444e-8:12.662/(o+7.4147)+.0964822:1==this.constants.clustering.enabled&&o>=this.constants.clustering.initialMaxNodes?77.5271985/(o+187.266146)+476710517e-13:30.5062972/(o+19.93597763)+.08413486;var n=Math.min(this.frame.canvas.clientWidth/600,this.frame.canvas.clientHeight/600);i*=n}else{var r=1.1*(Math.abs(s.minX)+Math.abs(s.maxX)),a=1.1*(Math.abs(s.minY)+Math.abs(s.maxY)),h=this.frame.canvas.clientWidth/r,d=this.frame.canvas.clientHeight/a;i=d>=h?h:d}i>1&&(i=1),this._setScale(i),this._centerNetwork(s),0==e&&(this.moving=!0,this.start())},s.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},s.prototype.setData=function(t,e){if(void 0===e&&(e=!1),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){if(t&&t.dot){var i=c.DOTToGraph(t.dot);return void this.setData(i)}}else if(t&&t.gephi){if(t&&t.gephi){var s=p.parseGephi(t.gephi);return void this.setData(s)}}else this._setNodes(t&&t.nodes),this._setEdges(t&&t.edges);if(this._putDataInSector(),!e)if(this.constants.stabilize){var o=this;setTimeout(function(){o._stabilize(),o.start()},0)}else this.start()},s.prototype.setOptions=function(t){if(t){var e,i=["nodes","edges","smoothCurves","hierarchicalLayout","clustering","navigation","keyboard","dataManipulation","onAdd","onEdit","onEditEdge","onConnect","onDelete","clickToUse"];if(a.selectiveNotDeepExtend(i,this.constants,t),a.selectiveNotDeepExtend(["color"],this.constants.nodes,t.nodes),a.selectiveNotDeepExtend(["color","length"],this.constants.edges,t.edges),t.physics&&(a.mergeOptions(this.constants.physics,t.physics,"barnesHut"),a.mergeOptions(this.constants.physics,t.physics,"repulsion"),t.physics.hierarchicalRepulsion)){this.constants.hierarchicalLayout.enabled=!0,this.constants.physics.hierarchicalRepulsion.enabled=!0,this.constants.physics.barnesHut.enabled=!1;for(e in t.physics.hierarchicalRepulsion)t.physics.hierarchicalRepulsion.hasOwnProperty(e)&&(this.constants.physics.hierarchicalRepulsion[e]=t.physics.hierarchicalRepulsion[e])}if(t.onAdd&&(this.triggerFunctions.add=t.onAdd),t.onEdit&&(this.triggerFunctions.edit=t.onEdit),t.onEditEdge&&(this.triggerFunctions.editEdge=t.onEditEdge),t.onConnect&&(this.triggerFunctions.connect=t.onConnect),t.onDelete&&(this.triggerFunctions.del=t.onDelete),a.mergeOptions(this.constants,t,"smoothCurves"),a.mergeOptions(this.constants,t,"hierarchicalLayout"),a.mergeOptions(this.constants,t,"clustering"),a.mergeOptions(this.constants,t,"navigation"),a.mergeOptions(this.constants,t,"keyboard"),a.mergeOptions(this.constants,t,"dataManipulation"),t.dataManipulation&&(this.editMode=this.constants.dataManipulation.initiallyVisible),t.edges&&(void 0!==t.edges.color&&(a.isString(t.edges.color)?(this.constants.edges.color={},this.constants.edges.color.color=t.edges.color,this.constants.edges.color.highlight=t.edges.color,this.constants.edges.color.hover=t.edges.color):(void 0!==t.edges.color.color&&(this.constants.edges.color.color=t.edges.color.color),void 0!==t.edges.color.highlight&&(this.constants.edges.color.highlight=t.edges.color.highlight),void 0!==t.edges.color.hover&&(this.constants.edges.color.hover=t.edges.color.hover))),t.edges.fontColor||void 0!==t.edges.color&&(a.isString(t.edges.color)?this.constants.edges.fontColor=t.edges.color:void 0!==t.edges.color.color&&(this.constants.edges.fontColor=t.edges.color.color))),t.nodes&&t.nodes.color){var s=a.parseColor(t.nodes.color);this.constants.nodes.color.background=s.background,this.constants.nodes.color.border=s.border,this.constants.nodes.color.highlight.background=s.highlight.background,this.constants.nodes.color.highlight.border=s.highlight.border,this.constants.nodes.color.hover.background=s.hover.background,this.constants.nodes.color.hover.border=s.hover.border}if(t.groups)for(var o in t.groups)if(t.groups.hasOwnProperty(o)){var n=t.groups[o];this.groups.add(o,n)}if(t.tooltip){for(e in t.tooltip)t.tooltip.hasOwnProperty(e)&&(this.constants.tooltip[e]=t.tooltip[e]);t.tooltip.color&&(this.constants.tooltip.color=a.parseColor(t.tooltip.color))}if("clickToUse"in t&&(t.clickToUse?(this.activator=new b(this.frame),this.activator.on("change",this._createKeyBinds.bind(this))):this.activator&&(this.activator.destroy(),delete this.activator)),t.labels)throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.')}this._loadPhysicsSystem(),this._loadNavigationControls(),this._loadManipulationSystem(),this._configureSmoothCurves(),this._createKeyBinds(),this.setSize(this.constants.width,this.constants.height),this.moving=!0,this.start()},s.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis network-frame",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),!this.frame.canvas.getContext){var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}var e=this;this.drag={},this.pinch={},this.hammer=n(this.frame.canvas,{prevent_default:!0}),this.hammer.on("tap",e._onTap.bind(e)),this.hammer.on("doubletap",e._onDoubleTap.bind(e)),this.hammer.on("hold",e._onHold.bind(e)),this.hammer.on("pinch",e._onPinch.bind(e)),this.hammer.on("touch",e._onTouch.bind(e)),this.hammer.on("dragstart",e._onDragStart.bind(e)),this.hammer.on("drag",e._onDrag.bind(e)),this.hammer.on("dragend",e._onDragEnd.bind(e)),this.hammer.on("release",e._onRelease.bind(e)),this.hammer.on("mousewheel",e._onMouseWheel.bind(e)),this.hammer.on("DOMMouseScroll",e._onMouseWheel.bind(e)),this.hammer.on("mousemove",e._onMouseMoveTitle.bind(e)),this.containerElement.appendChild(this.frame)},s.prototype._createKeyBinds=function(){var t=this;this.mousetrap=r,this.mousetrap.reset(),this.constants.keyboard.enabled&&this.isActive()&&(this.mousetrap.bind("up",this._moveUp.bind(t),"keydown"),this.mousetrap.bind("up",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("down",this._moveDown.bind(t),"keydown"),this.mousetrap.bind("down",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("left",this._moveLeft.bind(t),"keydown"),this.mousetrap.bind("left",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("right",this._moveRight.bind(t),"keydown"),this.mousetrap.bind("right",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("=",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("=",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("-",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("-",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("[",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("[",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("]",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("]",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pageup",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("pageup",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pagedown",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("pagedown",this._stopZoom.bind(t),"keyup")),1==this.constants.dataManipulation.enabled&&(this.mousetrap.bind("escape",this._createManipulatorBar.bind(t)),this.mousetrap.bind("del",this._deleteSelected.bind(t)))},s.prototype._getPointer=function(t){return{x:t.pageX-a.getAbsoluteLeft(this.frame.canvas),y:t.pageY-a.getAbsoluteTop(this.frame.canvas)}},s.prototype._onTouch=function(t){this.drag.pointer=this._getPointer(t.gesture.center),this.drag.pinched=!1,this.pinch.scale=this._getScale(),this._handleTouch(this.drag.pointer)},s.prototype._onDragStart=function(){this._handleDragStart()},s.prototype._handleDragStart=function(){var t=this.drag,e=this._getNodeAt(t.pointer);if(t.dragging=!0,t.selection=[],t.translation=this._getTranslation(),t.nodeId=null,null!=e){t.nodeId=e.id,e.isSelected()||this._selectObject(e,!1);for(var i in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(i)){var s=this.selectionObj.nodes[i],o={id:s.id,node:s,x:s.x,y:s.y,xFixed:s.xFixed,yFixed:s.yFixed};s.xFixed=!0,s.yFixed=!0,t.selection.push(o)}}},s.prototype._onDrag=function(t){this._handleOnDrag(t)},s.prototype._handleOnDrag=function(t){if(!this.drag.pinched){var e=this._getPointer(t.gesture.center),i=this,s=this.drag,o=s.selection;if(o&&o.length&&1==this.constants.dragNodes){var n=e.x-s.pointer.x,r=e.y-s.pointer.y;o.forEach(function(t){var e=t.node;t.xFixed||(e.x=i._XconvertDOMtoCanvas(i._XconvertCanvasToDOM(t.x)+n)),t.yFixed||(e.y=i._YconvertDOMtoCanvas(i._YconvertCanvasToDOM(t.y)+r))}),this.moving||(this.moving=!0,this.start())}else if(1==this.constants.dragNetwork){var a=e.x-this.drag.pointer.x,h=e.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+a,this.drag.translation.y+h),this._redraw()}}},s.prototype._onDragEnd=function(){this.drag.dragging=!1;var t=this.drag.selection;t&&t.length?(t.forEach(function(t){t.node.xFixed=t.xFixed,t.node.yFixed=t.yFixed}),this.moving=!0,this.start()):this._redraw()},s.prototype._onTap=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleTap(e)},s.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.center);this._handleDoubleTap(e)},s.prototype._onHold=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleOnHold(e)},s.prototype._onRelease=function(t){var e=this._getPointer(t.gesture.center);this._handleOnRelease(e)},s.prototype._onPinch=function(t){var e=this._getPointer(t.gesture.center);this.drag.pinched=!0,"scale"in this.pinch||(this.pinch.scale=1);var i=this.pinch.scale*t.gesture.scale;this._zoom(i,e)},s.prototype._zoom=function(t,e){if(1==this.constants.zoomable){var i=this._getScale();1e-5>t&&(t=1e-5),t>10&&(t=10);var s=null;void 0!==this.drag&&1==this.drag.dragging&&(s=this.DOMtoCanvas(this.drag.pointer));var o=this._getTranslation(),n=t/i,r=(1-n)*e.x+o.x*n,a=(1-n)*e.y+o.y*n;if(this.areaCenter={x:this._XconvertDOMtoCanvas(e.x),y:this._YconvertDOMtoCanvas(e.y)},this._setScale(t),this._setTranslation(r,a),this.updateClustersDefault(),null!=s){var h=this.canvasToDOM(s);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}return this._redraw(),t>i?this.emit("zoom",{direction:"+"}):this.emit("zoom",{direction:"-"}),t}},s.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i=this._getScale(),s=e/10;0>e&&(s/=1-s),i*=1+s;var o=h.fakeGesture(this,t),n=this._getPointer(o.center);this._zoom(i,n)}t.preventDefault()},s.prototype._onMouseMoveTitle=function(t){var e=h.fakeGesture(this,t),i=this._getPointer(e.center);this.popupObj&&this._checkHidePopup(i);var s=this,o=function(){s._checkShowPopup(i)};if(this.popupTimer&&clearInterval(this.popupTimer),this.drag.dragging||(this.popupTimer=setTimeout(o,this.constants.tooltip.delay)),1==this.constants.hover){for(var n in this.hoverObj.edges)this.hoverObj.edges.hasOwnProperty(n)&&(this.hoverObj.edges[n].hover=!1,delete this.hoverObj.edges[n]);var r=this._getNodeAt(i);null==r&&(r=this._getEdgeAt(i)),null!=r&&this._hoverObject(r);for(var a in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(a)&&(r instanceof m&&r.id!=a||r instanceof g||null==r)&&(this._blurObject(this.hoverObj.nodes[a]),delete this.hoverObj.nodes[a]);this.redraw()}},s.prototype._checkShowPopup=function(t){var e,i={left:this._XconvertDOMtoCanvas(t.x),top:this._YconvertDOMtoCanvas(t.y),right:this._XconvertDOMtoCanvas(t.x),bottom:this._YconvertDOMtoCanvas(t.y)},s=this.popupObj;if(void 0==this.popupObj){var o=this.nodes;for(e in o)if(o.hasOwnProperty(e)){var n=o[e];if(void 0!==n.getTitle()&&n.isOverlappingWith(i)){this.popupObj=n;break}}}if(void 0===this.popupObj){var r=this.edges;for(e in r)if(r.hasOwnProperty(e)){var a=r[e];if(a.connected&&void 0!==a.getTitle()&&a.isOverlappingWith(i)){this.popupObj=a;break}}}if(this.popupObj){if(this.popupObj!=s){var h=this;h.popup||(h.popup=new v(h.frame,h.constants.tooltip)),h.popup.setPosition(t.x-3,t.y-3),h.popup.setText(h.popupObj.getTitle()),h.popup.show()}}else this.popup&&this.popup.hide()},s.prototype._checkHidePopup=function(t){this.popupObj&&this._getNodeAt(t)||(this.popupObj=void 0,this.popup&&this.popup.hide())},s.prototype.setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,this.emit("resize",{width:this.frame.canvas.width,height:this.frame.canvas.height})},s.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof d||t instanceof l)this.nodesData=t;else if(t instanceof Array)this.nodesData=new d,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new d}if(e&&a.forEach(this.nodesListeners,function(t,i){e.off(i,t)}),this.nodes={},this.nodesData){var i=this;a.forEach(this.nodesListeners,function(t,e){i.nodesData.on(e,t)});var s=this.nodesData.getIds();this._addNodes(s)}this._updateSelection()},s.prototype._addNodes=function(t){for(var e,i=0,s=t.length;s>i;i++){e=t[i];var o=this.nodesData.get(e),n=new m(o,this.images,this.groups,this.constants);if(this.nodes[e]=n,!(0!=n.xFixed&&0!=n.yFixed||null!==n.x&&null!==n.y)){var r=1*t.length+10,a=2*Math.PI*Math.random();0==n.xFixed&&(n.x=r*Math.cos(a)),0==n.yFixed&&(n.y=r*Math.sin(a))}this.moving=!0}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateValueRange(this.nodes),this.updateLabels()},s.prototype._updateNodes=function(t){for(var e=this.nodes,i=this.nodesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n],a=i.get(n);r?r.setProperties(a,this.constants):(r=new m(properties,this.images,this.groups,this.constants),e[n]=r)}this.moving=!0,1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateNodeIndexList(),this._reconnectEdges(),this._updateValueRange(e)},s.prototype._removeNodes=function(t){for(var e=this.nodes,i=0,s=t.length;s>i;i++){var o=t[i];delete e[o]}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateSelection(),this._updateValueRange(e)},s.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof d||t instanceof l)this.edgesData=t;else if(t instanceof Array)this.edgesData=new d,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new d}if(e&&a.forEach(this.edgesListeners,function(t,i){e.off(i,t)}),this.edges={},this.edgesData){var i=this;a.forEach(this.edgesListeners,function(t,e){i.edgesData.on(e,t)});var s=this.edgesData.getIds();this._addEdges(s)}this._reconnectEdges()},s.prototype._addEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n];r&&r.disconnect();var a=i.get(n,{showInternalIds:!0});e[n]=new g(a,this,this.constants)}this.moving=!0,this._updateValueRange(e),this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._updateEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=i.get(n),a=e[n];a?(a.disconnect(),a.setProperties(r,this.constants),a.connect()):(a=new g(r,this,this.constants),this.edges[n]=a)}this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this.moving=!0,this._updateValueRange(e)},s.prototype._removeEdges=function(t){for(var e=this.edges,i=0,s=t.length;s>i;i++){var o=t[i],n=e[o];n&&(null!=n.via&&delete this.sectors.support.nodes[n.via.id],n.disconnect(),delete e[o])}this.moving=!0,this._updateValueRange(e),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._reconnectEdges=function(){var t,e=this.nodes,i=this.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var s=i[t];s.from=null,s.to=null,s.connect()}},s.prototype._updateValueRange=function(t){var e,i=void 0,s=void 0;for(e in t)if(t.hasOwnProperty(e)){var o=t[e].getValue();void 0!==o&&(i=void 0===i?o:Math.min(o,i),s=void 0===s?o:Math.max(o,s))}if(void 0!==i&&void 0!==s)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,s)},s.prototype.redraw=function(){this.setSize(this.constants.width,this.constants.height),this._redraw()},s.prototype._redraw=function(){var t=this.frame.canvas.getContext("2d"),e=this.frame.canvas.width,i=this.frame.canvas.height;t.clearRect(0,0,e,i),t.save(),t.translate(this.translation.x,this.translation.y),t.scale(this.scale,this.scale),this.canvasTopLeft={x:this._XconvertDOMtoCanvas(0),y:this._YconvertDOMtoCanvas(0)},this.canvasBottomRight={x:this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth),y:this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight)},this._doInAllSectors("_drawAllSectorNodes",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideEdgesOnDrag)&&this._doInAllSectors("_drawEdges",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideNodesOnDrag)&&this._doInAllSectors("_drawNodes",t,!1),1==this.controlNodesActive&&this._doInAllSectors("_drawControlNodes",t),t.restore()},s.prototype._setTranslation=function(t,e){void 0===this.translation&&(this.translation={x:0,y:0}),void 0!==t&&(this.translation.x=t),void 0!==e&&(this.translation.y=e),this.emit("viewChanged")},s.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},s.prototype._setScale=function(t){this.scale=t},s.prototype._getScale=function(){return this.scale},s.prototype._XconvertDOMtoCanvas=function(t){return(t-this.translation.x)/this.scale},s.prototype._XconvertCanvasToDOM=function(t){return t*this.scale+this.translation.x},s.prototype._YconvertDOMtoCanvas=function(t){return(t-this.translation.y)/this.scale},s.prototype._YconvertCanvasToDOM=function(t){return t*this.scale+this.translation.y},s.prototype.canvasToDOM=function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}},s.prototype.DOMtoCanvas=function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}},s.prototype._drawNodes=function(t,e){void 0===e&&(e=!1);var i=this.nodes,s=[];for(var o in i)i.hasOwnProperty(o)&&(i[o].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight),i[o].isSelected()?s.push(o):(i[o].inArea()||e)&&i[o].draw(t));for(var n=0,r=s.length;r>n;n++)(i[s[n]].inArea()||e)&&i[s[n]].draw(t)},s.prototype._drawEdges=function(t){var e=this.edges;for(var i in e)if(e.hasOwnProperty(i)){var s=e[i];s.setScale(this.scale),s.connected&&e[i].draw(t)}},s.prototype._drawControlNodes=function(t){var e=this.edges;for(var i in e)e.hasOwnProperty(i)&&e[i]._drawControlNodes(t)},s.prototype._stabilize=function(){1==this.constants.freezeForStabilization&&this._freezeDefinedNodes();for(var t=0;this.moving&&t0)for(e in s)s.hasOwnProperty(e)&&(s[e].discreteStepLimited(i,this.constants.maxVelocity),o=!0);else for(e in s)s.hasOwnProperty(e)&&(s[e].discreteStep(i),o=!0);if(1==o&&(void 0===t||1==t)){var n=this.constants.minVelocity/Math.max(this.scale,.05);n>.5*this.constants.maxVelocity?this.moving=!0:(this.moving=this._isMoving(n),0==this.moving&&this.emit("stabilized",{iterations:null}),this.moving=this.moving||this.configurePhysics)}},s.prototype._physicsTick=function(){this.freezeSimulation||1==this.moving&&(this._doInAllActiveSectors("_initializeForceCalculation"),this._doInAllActiveSectors("_discreteStepNodes"),1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic&&this._doInSupportSector("_discreteStepNodes",!1),this._findCenter(this._getRange()))},s.prototype._animationStep=function(){this.timer=void 0,this._handleNavigation(),this.start();var t=Date.now(),e=1;this._physicsTick();for(var i=Date.now()-t;i<.9*(this.renderTimestep-this.renderTime)&&eh}return!1},s.prototype._getColor=function(){var t=this.options.color;return"to"==this.options.inheritColor?t={highlight:this.to.options.color.highlight.border,hover:this.to.options.color.hover.border,color:this.to.options.color.border}:("from"==this.options.inheritColor||1==this.options.inheritColor)&&(t={highlight:this.from.options.color.highlight.border,hover:this.from.options.color.hover.border,color:this.from.options.color.border}),1==this.selected?t.highlight:1==this.hover?t.hover:t.color},s.prototype._drawLine=function(t){if(t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth(),this.from!=this.to){var e,i=this._line(t);if(this.label){if(1==this.options.smoothCurves.enabled&&null!=i){var s=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),o=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y));e={x:s,y:o}}else e=this._pointOnLine(.5);this._label(t,this.label,e.x,e.y)}}else{var n,r,a=this.physics.springLength/4,h=this.from;h.width||h.resize(t),h.width>h.height?(n=h.x+h.width/2,r=h.y-a):(n=h.x+a,r=h.y-h.height/2),this._circle(t,n,r,a),e=this._pointOnCircle(n,r,a,.5),this._label(t,this.label,e.x,e.y)}},s.prototype._getLineWidth=function(){return 1==this.selected?Math.min(this.widthSelected,this.options.widthMax)*this.networkScaleInv:1==this.hover?Math.min(this.options.hoverWidth,this.options.widthMax)*this.networkScaleInv:this.options.width*this.networkScaleInv},s.prototype._getViaCoordinates=function(){var t=null,e=null,i=this.options.smoothCurves.roundness,s=this.options.smoothCurves.type,o=Math.abs(this.from.x-this.to.x),n=Math.abs(this.from.y-this.to.y);return"discrete"==s||"diagonalCross"==s?Math.abs(this.from.x-this.to.x)this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n)),"discrete"==s&&(t=i*n>o?this.from.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o)),"discrete"==s&&(e=i*o>n?this.from.y:e)):"straightCross"==s?Math.abs(this.from.x-this.to.x)Math.abs(this.from.y-this.to.y)&&(t=this.from.xthis.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n,t=this.to.x>t?this.to.x:t):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n,t=this.to.x>t?this.to.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xe?this.to.y:e):this.from.x>this.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o,e=this.to.y>e?this.to.y:e):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o,e=this.to.yl.height?(a=l.x+.5*l.width,h=l.y-d):(a=l.x+d,h=l.y-.5*l.height),this._circle(t,a,h,d);var s=.2*Math.PI,o=(10+5*this.options.width)*this.options.arrowScaleFactor;e=this._pointOnCircle(a,h,d,.5),t.arrow(e.x,e.y,s,o),t.fill(),t.stroke(),this.label&&(e=this._pointOnCircle(a,h,d,.5),this._label(t,this.label,e.x,e.y))}},s.prototype._drawArrow=function(t){1==this.selected?(t.strokeStyle=this.options.color.highlight,t.fillStyle=this.options.color.highlight):1==this.hover?(t.strokeStyle=this.options.color.hover,t.fillStyle=this.options.color.hover):(t.strokeStyle=this.options.color.color,t.fillStyle=this.options.color.color),t.lineWidth=this._getLineWidth();var e,i;if(this.from!=this.to){e=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var s,o=this.to.x-this.from.x,n=this.to.y-this.from.y,r=Math.sqrt(o*o+n*n),a=this.from.distanceToBorder(t,e+Math.PI),h=(r-a)/r,d=h*this.from.x+(1-h)*this.to.x,l=h*this.from.y+(1-h)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?s=this.via:1==this.options.smoothCurves.enabled&&(s=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=s.x&&(e=Math.atan2(this.to.y-s.y,this.to.x-s.x),o=this.to.x-s.x,n=this.to.y-s.y,r=Math.sqrt(o*o+n*n));var c,p,u=this.to.distanceToBorder(t,e),f=(r-u)/r;if(1==this.options.smoothCurves.enabled&&null!=s.x?(c=(1-f)*s.x+f*this.to.x,p=(1-f)*s.y+f*this.to.y):(c=(1-f)*this.from.x+f*this.to.x,p=(1-f)*this.from.y+f*this.to.y),t.beginPath(),t.moveTo(d,l),1==this.options.smoothCurves.enabled&&null!=s.x?t.quadraticCurveTo(s.x,s.y,c,p):t.lineTo(c,p),t.stroke(),i=(10+5*this.options.width)*this.options.arrowScaleFactor,t.arrow(c,p,e,i),t.fill(),t.stroke(),this.label){var m;if(1==this.options.smoothCurves.enabled&&null!=s){var g=.5*(.5*(this.from.x+s.x)+.5*(this.to.x+s.x)),v=.5*(.5*(this.from.y+s.y)+.5*(this.to.y+s.y));m={x:g,y:v}}else m=this._pointOnLine(.5);this._label(t,this.label,m.x,m.y)}}else{var y,b,_,x=this.from,w=.25*Math.max(100,this.physics.springLength);x.width||x.resize(t),x.width>x.height?(y=x.x+.5*x.width,b=x.y-w,_={x:y,y:x.y,angle:.9*Math.PI}):(y=x.x+w,b=x.y-.5*x.height,_={x:x.x,y:b,angle:.6*Math.PI}),t.beginPath(),t.arc(y,b,w,0,2*Math.PI,!1),t.stroke();var i=(10+5*this.options.width)*this.options.arrowScaleFactor;t.arrow(_.x,_.y,_.angle,i),t.fill(),t.stroke(),this.label&&(m=this._pointOnCircle(y,b,w,.5),this._label(t,this.label,m.x,m.y))}},s.prototype._getDistanceToEdge=function(t,e,i,s,o,n){if(this.from!=this.to){if(1==this.options.smoothCurves.enabled){var r,a;if(1==this.options.smoothCurves.enabled&&1==this.options.smoothCurves.dynamic)r=this.via.x,a=this.via.y;else{var h=this._getViaCoordinates();r=h.x,a=h.y}var d,l,c,p,u,f,m,g=1e9;for(l=0;10>l;l++)c=.1*l,p=Math.pow(1-c,2)*t+2*c*(1-c)*r+Math.pow(c,2)*i,u=Math.pow(1-c,2)*e+2*c*(1-c)*a+Math.pow(c,2)*s,l>0&&(d=this._getDistanceToLine(f,m,p,u,o,n),g=g>d?d:g),f=p,m=u;return g}return this._getDistanceToLine(t,e,i,s,o,n)}var p,u,v,y,b=.25*this.physics.springLength,_=this.from;return _.width>_.height?(p=_.x+.5*_.width,u=_.y-b):(p=_.x+b,u=_.y-.5*_.height),v=p-o,y=u-n,Math.abs(Math.sqrt(v*v+y*y)-b)},s.prototype._getDistanceToLine=function(t,e,i,s,o,n){var r=i-t,a=s-e,h=r*r+a*a,d=((o-t)*r+(n-e)*a)/h;d>1?d=1:0>d&&(d=0);var l=t+d*r,c=e+d*a,p=l-o,u=c-n;return Math.sqrt(p*p+u*u)},s.prototype.setScale=function(t){this.networkScaleInv=1/t},s.prototype.select=function(){this.selected=!0},s.prototype.unselect=function(){this.selected=!1},s.prototype.positionBezierNode=function(){null!==this.via&&null!==this.from&&null!==this.to&&(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y))},s.prototype._drawControlNodes=function(t){if(1==this.controlNodesEnabled){if(null===this.controlNodes.from&&null===this.controlNodes.to){var e="edgeIdFrom:".concat(this.id),i="edgeIdTo:".concat(this.id),s={nodes:{group:"",radius:8},physics:{damping:0},clustering:{maxNodeSizeIncrements:0,nodeScaling:{width:0,height:0,radius:0}}};this.controlNodes.from=new n({id:e,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s),this.controlNodes.to=new n({id:i,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s)}0==this.controlNodes.from.selected&&0==this.controlNodes.to.selected&&(this.controlNodes.positions=this.getControlNodePositions(t),this.controlNodes.from.x=this.controlNodes.positions.from.x,this.controlNodes.from.y=this.controlNodes.positions.from.y,this.controlNodes.to.x=this.controlNodes.positions.to.x,this.controlNodes.to.y=this.controlNodes.positions.to.y),this.controlNodes.from.draw(t),this.controlNodes.to.draw(t)}else this.controlNodes={from:null,to:null,positions:{}}},s.prototype._enableControlNodes=function(){this.controlNodesEnabled=!0},s.prototype._disableControlNodes=function(){this.controlNodesEnabled=!1},s.prototype._getSelectedControlNode=function(t,e){var i=this.controlNodes.positions,s=Math.sqrt(Math.pow(t-i.from.x,2)+Math.pow(e-i.from.y,2)),o=Math.sqrt(Math.pow(t-i.to.x,2)+Math.pow(e-i.to.y,2));return 15>s?(this.connectedNode=this.from,this.from=this.controlNodes.from,this.controlNodes.from):15>o?(this.connectedNode=this.to,this.to=this.controlNodes.to,this.controlNodes.to):null},s.prototype._restoreControlNodes=function(){1==this.controlNodes.from.selected&&(this.from=this.connectedNode,this.connectedNode=null,this.controlNodes.from.unselect()),1==this.controlNodes.to.selected&&(this.to=this.connectedNode,this.connectedNode=null,this.controlNodes.to.unselect())},s.prototype.getControlNodePositions=function(t){var e,i=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),s=this.to.x-this.from.x,o=this.to.y-this.from.y,n=Math.sqrt(s*s+o*o),r=this.from.distanceToBorder(t,i+Math.PI),a=(n-r)/n,h=a*this.from.x+(1-a)*this.to.x,d=a*this.from.y+(1-a)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?e=this.via:1==this.options.smoothCurves.enabled&&(e=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=e.x&&(i=Math.atan2(this.to.y-e.y,this.to.x-e.x),s=this.to.x-e.x,o=this.to.y-e.y,n=Math.sqrt(s*s+o*o));var l,c,p=this.to.distanceToBorder(t,i),u=(n-p)/n;return 1==this.options.smoothCurves.enabled&&null!=e.x?(l=(1-u)*e.x+u*this.to.x,c=(1-u)*e.y+u*this.to.y):(l=(1-u)*this.from.x+u*this.to.x,c=(1-u)*this.from.y+u*this.to.y),{from:{x:h,y:d},to:{x:l,y:c}}},t.exports=s},function(t,e,i){function s(){this.clear(),this.defaultIndex=0}var o=i(1);s.DEFAULT=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}}],s.prototype.clear=function(){this.groups={},this.groups.length=function(){var t=0;for(var e in this)this.hasOwnProperty(e)&&t++;return t}},s.prototype.get=function(t){var e=this.groups[t];if(void 0==e){var i=this.defaultIndex%s.DEFAULT.length;this.defaultIndex++,e={},e.color=s.DEFAULT[i],this.groups[t]=e}return e},s.prototype.add=function(t,e){return this.groups[t]=e,e.color&&(e.color=o.parseColor(e.color)),e},t.exports=s},function(t){function e(){this.images={},this.callback=void 0}e.prototype.setOnloadCallback=function(t){this.callback=t},e.prototype.load=function(t){var e=this.images[t];if(void 0==e){var i=this;e=new Image,this.images[t]=e,e.onload=function(){i.callback&&i.callback(this)},e.src=t}return e},t.exports=e},function(t,e,i){function s(t,e,i,s){var n=o.selectiveBridgeObject(["nodes"],s);this.options=n.nodes,this.selected=!1,this.hover=!1,this.edges=[],this.dynamicEdges=[],this.reroutedEdges={},this.fontDrawThreshold=3,this.id=void 0,this.x=null,this.y=null,this.xFixed=!1,this.yFixed=!1,this.horizontalAlignLeft=!0,this.verticalAlignTop=!0,this.baseRadiusValue=s.nodes.radius,this.radiusFixed=!1,this.level=-1,this.preassignedLevel=!1,this.imagelist=e,this.grouplist=i,this.fx=0,this.fy=0,this.vx=0,this.vy=0,this.damping=s.physics.damping,this.fixedData={x:null,y:null},this.setProperties(t,n),this.resetCluster(),this.dynamicEdgesLength=0,this.clusterSession=0,this.clusterSizeWidthFactor=s.clustering.nodeScaling.width,this.clusterSizeHeightFactor=s.clustering.nodeScaling.height,this.clusterSizeRadiusFactor=s.clustering.nodeScaling.radius,this.maxNodeSizeIncrements=s.clustering.maxNodeSizeIncrements,this.growthIndicator=0,this.networkScaleInv=1,this.networkScale=1,this.canvasTopLeft={x:-300,y:-300},this.canvasBottomRight={x:300,y:300},this.parentEdgeId=null}var o=i(1);s.prototype.resetCluster=function(){this.formationScale=void 0,this.clusterSize=1,this.containedNodes={},this.containedEdges={},this.clusterSessions=[]},s.prototype.attachEdge=function(t){-1==this.edges.indexOf(t)&&this.edges.push(t),-1==this.dynamicEdges.indexOf(t)&&this.dynamicEdges.push(t),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.detachEdge=function(t){var e=this.edges.indexOf(t);-1!=e&&(this.edges.splice(e,1),this.dynamicEdges.splice(e,1)),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.setProperties=function(t,e){if(t){var i=["borderWidth","borderWidthSelected","shape","image","radius","fontColor","fontSize","fontFace","group","mass"];if(o.selectiveDeepExtend(i,this.options,t),this.originalLabel=void 0,void 0!==t.id&&(this.id=t.id),void 0!==t.label&&(this.label=t.label,this.originalLabel=t.label),void 0!==t.title&&(this.title=t.title),void 0!==t.x&&(this.x=t.x),void 0!==t.y&&(this.y=t.y),void 0!==t.value&&(this.value=t.value),void 0!==t.level&&(this.level=t.level,this.preassignedLevel=!0),void 0!==t.horizontalAlignLeft&&(this.horizontalAlignLeft=t.horizontalAlignLeft),void 0!==t.verticalAlignTop&&(this.verticalAlignTop=t.verticalAlignTop),void 0!==t.triggerFunction&&(this.triggerFunction=t.triggerFunction),void 0===this.id)throw"Node must have an id";if("number"==typeof this.options.group||"string"==typeof this.options.group&&""!=this.options.group){var s=this.grouplist.get(this.options.group);for(var n in s)s.hasOwnProperty(n)&&(this.options[n]=s[n])}if(void 0!==t.radius&&(this.baseRadiusValue=this.options.radius),void 0!==t.color&&(this.options.color=o.parseColor(t.color)),void 0!==this.options.image&&""!=this.options.image){if(!this.imagelist)throw"No imagelist provided";this.imageObj=this.imagelist.load(this.options.image)}switch(this.xFixed=this.xFixed||void 0!==t.x&&!t.allowedToMoveX,this.yFixed=this.yFixed||void 0!==t.y&&!t.allowedToMoveY,this.radiusFixed=this.radiusFixed||void 0!==t.radius,"image"==this.options.shape&&(this.options.radiusMin=e.nodes.widthMin,this.options.radiusMax=e.nodes.widthMax),this.options.shape){case"database":this.draw=this._drawDatabase,this.resize=this._resizeDatabase;break;case"box":this.draw=this._drawBox,this.resize=this._resizeBox;break;case"circle":this.draw=this._drawCircle,this.resize=this._resizeCircle;break;case"ellipse":this.draw=this._drawEllipse,this.resize=this._resizeEllipse;break;case"image":this.draw=this._drawImage,this.resize=this._resizeImage;break;case"text":this.draw=this._drawText,this.resize=this._resizeText;break;case"dot":this.draw=this._drawDot,this.resize=this._resizeShape;break;case"square":this.draw=this._drawSquare,this.resize=this._resizeShape;break;case"triangle":this.draw=this._drawTriangle,this.resize=this._resizeShape;break;case"triangleDown":this.draw=this._drawTriangleDown,this.resize=this._resizeShape;break;case"star":this.draw=this._drawStar,this.resize=this._resizeShape;break;default:this.draw=this._drawEllipse,this.resize=this._resizeEllipse}this._reset()}},s.prototype.select=function(){this.selected=!0,this._reset()},s.prototype.unselect=function(){this.selected=!1,this._reset()},s.prototype.clearSizeCache=function(){this._reset()},s.prototype._reset=function(){this.width=void 0,this.height=void 0},s.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},s.prototype.distanceToBorder=function(t,e){var i=1;switch(this.width||this.resize(t),this.options.shape){case"circle":case"dot":return this.options.radius+i;case"ellipse":var s=this.width/2,o=this.height/2,n=Math.sin(e)*s,r=Math.cos(e)*o;return s*o/Math.sqrt(n*n+r*r);case"box":case"image":case"text":default:return this.width?Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i:0}},s.prototype._setForce=function(t,e){this.fx=t,this.fy=e},s.prototype._addForce=function(t,e){this.fx+=t,this.fy+=e},s.prototype.discreteStep=function(t){if(!this.xFixed){var e=this.damping*this.vx,i=(this.fx-e)/this.options.mass;this.vx+=i*t,this.x+=this.vx*t}if(!this.yFixed){var s=this.damping*this.vy,o=(this.fy-s)/this.options.mass;this.vy+=o*t,this.y+=this.vy*t}},s.prototype.discreteStepLimited=function(t,e){if(this.xFixed)this.fx=0;else{var i=this.damping*this.vx,s=(this.fx-i)/this.options.mass;this.vx+=s*t,this.vx=Math.abs(this.vx)>e?this.vx>0?e:-e:this.vx,this.x+=this.vx*t}if(this.yFixed)this.fy=0;else{var o=this.damping*this.vy,n=(this.fy-o)/this.options.mass;this.vy+=n*t,this.vy=Math.abs(this.vy)>e?this.vy>0?e:-e:this.vy,this.y+=this.vy*t}},s.prototype.isFixed=function(){return this.xFixed&&this.yFixed},s.prototype.isMoving=function(t){var e=Math.sqrt(Math.pow(this.vx,2)+Math.pow(this.vy,2));return e>t},s.prototype.isSelected=function(){return this.selected},s.prototype.getValue=function(){return this.value},s.prototype.getDistance=function(t,e){var i=this.x-t,s=this.y-e;return Math.sqrt(i*i+s*s)},s.prototype.setValueRange=function(t,e){if(!this.radiusFixed&&void 0!==this.value)if(e==t)this.options.radius=(this.options.radiusMin+this.options.radiusMax)/2;else{var i=(this.options.radiusMax-this.options.radiusMin)/(e-t);this.options.radius=(this.value-t)*i+this.options.radiusMin}this.baseRadiusValue=this.options.radius},s.prototype.draw=function(){throw"Draw method not initialized for node"},s.prototype.resize=function(){throw"Resize method not initialized for node"},s.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},s.prototype._resizeImage=function(){if(!this.width||!this.height){var t,e;if(this.value){this.options.radius=this.baseRadiusValue;var i=this.imageObj.height/this.imageObj.width;void 0!==i?(t=this.options.radius||this.imageObj.width,e=this.options.radius*i||this.imageObj.height):(t=0,e=0)}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.growthIndicator=0,this.width>0&&this.height>0&&(this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t)}},s.prototype._drawImage=function(t){this._resizeImage(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e;if(0!=this.imageObj.width){if(this.clusterSize>1){var i=this.clusterSize>1?10:0;i*=this.networkScaleInv,i=Math.min(.2*this.width,i),t.globalAlpha=.5,t.drawImage(this.imageObj,this.left-i,this.top-i,this.width+2*i,this.height+2*i)}t.globalAlpha=1,t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),e=this.y+this.height/2}else e=this.y;this._label(t,this.label,this.x,e,void 0,"top")},s.prototype._resizeBox=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawBox=function(t){this._resizeBox(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.roundRect(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth,this.options.radius),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.options.color.background,t.roundRect(this.left,this.top,this.width,this.height,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeDatabase=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=i.width+2*e;this.width=s,this.height=s,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-s}},s.prototype._drawDatabase=function(t){this._resizeDatabase(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.database(this.x-this.width/2-2*t.lineWidth,this.y-.5*this.height-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.database(this.x-this.width/2,this.y-.5*this.height,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeCircle=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=Math.max(i.width,i.height)+2*e;this.options.radius=s/2,this.width=s,this.height=s,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.options.radius-.5*s}},s.prototype._drawCircle=function(t){this._resizeCircle(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.circle(this.x,this.y,this.options.radius+2*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.circle(this.x,this.y,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y) -},s.prototype._resizeEllipse=function(t){if(!this.width){var e=this.getTextSize(t);this.width=1.5*e.width,this.height=2*e.height,this.width1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.ellipse(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.ellipse(this.left,this.top,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._drawDot=function(t){this._drawShape(t,"circle")},s.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},s.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},s.prototype._drawSquare=function(t){this._drawShape(t,"square")},s.prototype._drawStar=function(t){this._drawShape(t,"star")},s.prototype._resizeShape=function(){if(!this.width){this.options.radius=this.baseRadiusValue;var t=2*this.options.radius;this.width=t,this.height=t,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t}},s.prototype._drawShape=function(t,e){this._resizeShape(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var i=2.5,s=this.options.borderWidth,o=this.options.borderWidthSelected||2*this.options.borderWidth,n=2;switch(e){case"dot":n=2;break;case"square":n=2;break;case"triangle":n=3;break;case"triangleDown":n=3;break;case"star":n=4}t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t[e](this.x,this.y,this.options.radius+n*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t[e](this.x,this.y,this.options.radius),t.fill(),t.stroke(),this.label&&this._label(t,this.label,this.x,this.y+this.height/2,void 0,"top",!0)},s.prototype._resizeText=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawText=function(t){this._resizeText(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,this._label(t,this.label,this.x,this.y)},s.prototype._label=function(t,e,i,s,o,n,r){if(e&&Number(this.options.fontSize)*this.networkScale>this.fontDrawThreshold){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace,t.fillStyle=this.options.fontColor||"black",t.textAlign=o||"center",t.textBaseline=n||"middle";var a=e.split("\n"),h=a.length,d=Number(this.options.fontSize)+4,l=s+(1-h)/2*d;1==r&&(l=s+(1-h)/(2*d));for(var c=0;h>c;c++)t.fillText(a[c],i,l),l+=d}},s.prototype.getTextSize=function(t){if(void 0!==this.label){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace;for(var e=this.label.split("\n"),i=(Number(this.options.fontSize)+4)*e.length,s=0,o=0,n=e.length;n>o;o++)s=Math.max(s,t.measureText(e[o]).width);return{width:s,height:i}}return{width:0,height:0}},s.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.networkScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.networkScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.networkScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.ys&&(n=s-e-this.padding),no&&(r=o-i-this.padding),ri;i++)if(e.id===r.nodes[i].id){o=r.nodes[i];break}for(o||(o={id:e.id},t.node&&(o.attr=a(o.attr,t.node))),i=n.length-1;i>=0;i--){var h=n[i];h.nodes||(h.nodes=[]),-1==h.nodes.indexOf(o)&&h.nodes.push(o)}e.attr&&(o.attr=a(o.attr,e.attr))}function l(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=a({},t.edge);e.attr=a(i,e.attr)}}function c(t,e,i,s,o){var n={from:e,to:i,type:s};return t.edge&&(n.attr=a({},t.edge)),n.attr=a(n.attr||{},o),n}function p(){for(k=C.NULL,L="";" "==O||" "==O||"\n"==O||"\r"==O;)o();do{var t=!1;if("#"==O){for(var e=T-1;" "==D.charAt(e)||" "==D.charAt(e);)e--;if("\n"==D.charAt(e)||""==D.charAt(e)){for(;""!=O&&"\n"!=O;)o();t=!0}}if("/"==O&&"/"==n()){for(;""!=O&&"\n"!=O;)o();t=!0}if("/"==O&&"*"==n()){for(;""!=O;){if("*"==O&&"/"==n()){o(),o();break}o()}t=!0}for(;" "==O||" "==O||"\n"==O||"\r"==O;)o()}while(t);if(""==O)return void(k=C.DELIMITER);var i=O+n();if(E[i])return k=C.DELIMITER,L=i,o(),void o();if(E[O])return k=C.DELIMITER,L=O,void o();if(r(O)||"-"==O){for(L+=O,o();r(O);)L+=O,o();return"false"==L?L=!1:"true"==L?L=!0:isNaN(Number(L))||(L=Number(L)),void(k=C.IDENTIFIER)}if('"'==O){for(o();""!=O&&('"'!=O||'"'==O&&'"'==n());)L+=O,'"'==O&&o(),o();if('"'!=O)throw x('End of string " expected');return o(),void(k=C.IDENTIFIER)}for(k=C.UNKNOWN;""!=O;)L+=O,o();throw new SyntaxError('Syntax error in part "'+w(L,30)+'"')}function u(){var t={};if(s(),p(),"strict"==L&&(t.strict=!0,p()),("graph"==L||"digraph"==L)&&(t.type=L,p()),k==C.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),f(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function f(t){for(;""!==L&&"}"!=L;)m(t),";"==L&&p()}function m(t){var e=g(t);if(e)return void b(t,e);var i=v(t);if(!i){if(k!=C.IDENTIFIER)throw x("Identifier expected");var s=L;if(p(),"="==L){if(p(),k!=C.IDENTIFIER)throw x("Identifier expected");t[s]=L,p()}else y(t,s)}}function g(t){var e=null;if("subgraph"==L&&(e={},e.type="subgraph",p(),k==C.IDENTIFIER&&(e.id=L,p())),"{"==L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,f(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function v(t){return"node"==L?(p(),t.node=_(),"node"):"edge"==L?(p(),t.edge=_(),"edge"):"graph"==L?(p(),t.graph=_(),"graph"):null}function y(t,e){var i={id:e},s=_();s&&(i.attr=s),d(t,i),b(t,e)}function b(t,e){for(;"->"==L||"--"==L;){var i,s=L;p();var o=g(t);if(o)i=o;else{if(k!=C.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,d(t,{id:i}),p()}var n=_(),r=c(t,e,i,s,n);l(t,r),e=i}}function _(){for(var t=null;"["==L;){for(p(),t={};""!==L&&"]"!=L;){if(k!=C.IDENTIFIER)throw x("Attribute name expected");var e=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),k!=C.IDENTIFIER)throw x("Attribute value expected");var i=L;h(t,e,i),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+w(L,30)+'" (char '+T+")")}function w(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){t instanceof Array?t.forEach(function(t){e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}):e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}function M(t){function e(t){var e={from:t.from,to:t.to};return a(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var s=i(t),o={nodes:[],edges:[],options:{}};return s.nodes&&s.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};a(e,t.attr),e.image&&(e.shape="image"),o.nodes.push(e)}),s.edges&&s.edges.forEach(function(t){var i,s;i=t.from instanceof Object?t.from.nodes:{id:t.from},s=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var i=e(t);o.edges.push(i)}),S(i,s,function(i,s){var n=c(o,i.id,s.id,t.type,t.attr),r=e(n);o.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var i=e(t);o.edges.push(i)})}),s.attr&&(o.options=s.attr),o}var C={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},E={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},D="",T=0,O="",L="",k=C.NULL,N=/[a-zA-Z_0-9.:#]/;e.parseDOT=i,e.DOTToGraph=M},function(t,e){function i(t,e){var i=[],s=[];this.options={edges:{inheritColor:!0},nodes:{allowedToMove:!1,parseColor:!1}},void 0!==e&&(this.options.nodes.allowedToMove=e.allowedToMove|!1,this.options.nodes.parseColor=e.parseColor|!1,this.options.edges.inheritColor=e.inheritColor|!0);for(var o=t.edges,n=t.nodes,r=0;r=s&&(s=864e5),e=new Date(e.valueOf()-.05*s),i=new Date(i.valueOf()+.05*s)}(null!==e||null!==i)&&this.range.setRange(e,i)},s.prototype.setWindow=function(t,e){if(1==arguments.length){var i=arguments[0];this.range.setRange(i.start,i.end)}else this.range.setRange(t,e)},s.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},s.prototype.redraw=function(){var t=!1,e=this.options,i=this.props,s=this.dom;if(s){"top"==e.orientation?(r.addClassName(s.root,"top"),r.removeClassName(s.root,"bottom")):(r.removeClassName(s.root,"top"),r.addClassName(s.root,"bottom")),s.root.style.maxHeight=r.option.asSize(e.maxHeight,""),s.root.style.minHeight=r.option.asSize(e.minHeight,""),s.root.style.width=r.option.asSize(e.width,""),i.border.left=(s.centerContainer.offsetWidth-s.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(s.centerContainer.offsetHeight-s.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var o=s.root.offsetHeight-s.root.clientHeight,n=s.root.offsetWidth-s.root.clientWidth;i.center.height=s.center.offsetHeight,i.left.height=s.left.offsetHeight,i.right.height=s.right.offsetHeight,i.top.height=s.top.clientHeight||-i.border.top,i.bottom.height=s.bottom.clientHeight||-i.border.bottom;var a=Math.max(i.left.height,i.center.height,i.right.height),h=i.top.height+a+i.bottom.height+o+i.border.top+i.border.bottom;s.root.style.height=r.option.asSize(e.height,h+"px"),i.root.height=s.root.offsetHeight,i.background.height=i.root.height-o;var d=i.root.height-i.top.height-i.bottom.height-o;i.centerContainer.height=d,i.leftContainer.height=d,i.rightContainer.height=i.leftContainer.height,i.root.width=s.root.offsetWidth,i.background.width=i.root.width-n,i.left.width=s.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=s.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var l=i.root.width-i.left.width-i.right.width-n;i.center.width=l,i.centerContainer.width=l,i.top.width=l,i.bottom.width=l,s.background.style.height=i.background.height+"px",s.backgroundVertical.style.height=i.background.height+"px",s.backgroundHorizontal.style.height=i.centerContainer.height+"px",s.centerContainer.style.height=i.centerContainer.height+"px",s.leftContainer.style.height=i.leftContainer.height+"px",s.rightContainer.style.height=i.rightContainer.height+"px",s.background.style.width=i.background.width+"px",s.backgroundVertical.style.width=i.centerContainer.width+"px",s.backgroundHorizontal.style.width=i.background.width+"px",s.centerContainer.style.width=i.center.width+"px",s.top.style.width=i.top.width+"px",s.bottom.style.width=i.bottom.width+"px",s.background.style.left="0",s.background.style.top="0",s.backgroundVertical.style.left=i.left.width+"px",s.backgroundVertical.style.top="0",s.backgroundHorizontal.style.left="0",s.backgroundHorizontal.style.top=i.top.height+"px",s.centerContainer.style.left=i.left.width+"px",s.centerContainer.style.top=i.top.height+"px",s.leftContainer.style.left="0",s.leftContainer.style.top=i.top.height+"px",s.rightContainer.style.left=i.left.width+i.center.width+"px",s.rightContainer.style.top=i.top.height+"px",s.top.style.left=i.left.width+"px",s.top.style.top="0",s.bottom.style.left=i.left.width+"px",s.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var c=this.props.scrollTop;"bottom"==e.orientation&&(c+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),s.center.style.left="0",s.center.style.top=c+"px",s.left.style.left="0",s.left.style.top=c+"px",s.right.style.left="0",s.right.style.top=c+"px";var p=0==this.props.scrollTop?"hidden":"",u=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";s.shadowTop.style.visibility=p,s.shadowBottom.style.visibility=u,s.shadowTopLeft.style.visibility=p,s.shadowBottomLeft.style.visibility=u,s.shadowTopRight.style.visibility=p,s.shadowBottomRight.style.visibility=u,this.components.forEach(function(e){t=e.redraw()||t}),t&&this.redraw()}},s.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},s.prototype._toTime=function(t){var e=this.range.conversion(this.props.center.width);return new Date(t/e.scale+e.offset)},s.prototype._toGlobalTime=function(t){var e=this.range.conversion(this.props.root.width);return new Date(t/e.scale+e.offset)},s.prototype._toScreen=function(t){var e=this.range.conversion(this.props.center.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._toGlobalScreen=function(t){var e=this.range.conversion(this.props.root.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},s.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){return 1!=t.options.autoResize?void t._stopAutoResize():void(t.dom.root&&(t.dom.root.clientWidth!=t.props.lastWidth||t.dom.root.clientHeight!=t.props.lastHeight)&&(t.props.lastWidth=t.dom.root.clientWidth,t.props.lastHeight=t.dom.root.clientHeight,t.emit("change")))},r.addEventListener(window,"resize",this._onResize),this.watchTimer=setInterval(this._onResize,1e3)},s.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),r.removeEventListener(window,"resize",this._onResize),this._onResize=null},s.prototype._onTouch=function(){this.touch.allowDragging=!0},s.prototype._onPinch=function(){this.touch.allowDragging=!1},s.prototype._onDragStart=function(){this.touch.initialScrollTop=this.props.scrollTop},s.prototype._onDrag=function(t){if(this.touch.allowDragging){var e=t.gesture.deltaY,i=this._getScrollTop(),s=this._setScrollTop(this.touch.initialScrollTop+e);s!=i&&this.redraw()}},s.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},s.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("bottom"==this.options.orientation&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTops;s++){var o=s%2===0?1.3*i:.5*i;this.lineTo(t+o*Math.sin(2*s*Math.PI/10),e-o*Math.cos(2*s*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,s,o){var n=Math.PI/180;0>i-2*o&&(o=i/2),0>s-2*o&&(o=s/2),this.beginPath(),this.moveTo(t+o,e),this.lineTo(t+i-o,e),this.arc(t+i-o,e+o,o,270*n,360*n,!1),this.lineTo(t+i,e+s-o),this.arc(t+i-o,e+s-o,o,0,90*n,!1),this.lineTo(t+o,e+s),this.arc(t+o,e+s-o,o,90*n,180*n,!1),this.lineTo(t,e+o),this.arc(t+o,e+o,o,180*n,270*n,!1)},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,s){var o=.5522848,n=i/2*o,r=s/2*o,a=t+i,h=e+s,d=t+i/2,l=e+s/2;this.beginPath(),this.moveTo(t,l),this.bezierCurveTo(t,l-r,d-n,e,d,e),this.bezierCurveTo(d+n,e,a,l-r,a,l),this.bezierCurveTo(a,l+r,d+n,h,d,h),this.bezierCurveTo(d-n,h,t,l+r,t,l)},CanvasRenderingContext2D.prototype.database=function(t,e,i,s){var o=1/3,n=i,r=s*o,a=.5522848,h=n/2*a,d=r/2*a,l=t+n,c=e+r,p=t+n/2,u=e+r/2,f=e+(s-r/2),m=e+s;this.beginPath(),this.moveTo(l,u),this.bezierCurveTo(l,u+d,p+h,c,p,c),this.bezierCurveTo(p-h,c,t,u+d,t,u),this.bezierCurveTo(t,u-d,p-h,e,p,e),this.bezierCurveTo(p+h,e,l,u-d,l,u),this.lineTo(l,f),this.bezierCurveTo(l,f+d,p+h,m,p,m),this.bezierCurveTo(p-h,m,t,f+d,t,f),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,s){var o=t-s*Math.cos(i),n=e-s*Math.sin(i),r=t-.9*s*Math.cos(i),a=e-.9*s*Math.sin(i),h=o+s/3*Math.cos(i+.5*Math.PI),d=n+s/3*Math.sin(i+.5*Math.PI),l=o+s/3*Math.cos(i-.5*Math.PI),c=n+s/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(r,a),this.lineTo(l,c),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,s,o){o||(o=[10,5]),0==p&&(p=.001);var n=o.length;this.moveTo(t,e);for(var r=i-t,a=s-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,c=!0;d>=.1;){var p=o[l++%n];p>d&&(p=d);var u=Math.sqrt(p*p/(1+h*h));0>r&&(u=-u),t+=u,e+=h*u,this[c?"lineTo":"moveTo"](t,e),d-=p,c=!c}})},function(t,e,i){var s=i(59),o=i(53),n=i(54),r=i(55),a=i(56),h=i(57),d=i(58);e._loadMixin=function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},e._clearMixin=function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=void 0)},e._loadPhysicsSystem=function(){this._loadMixin(s),this._loadSelectedForceSolver(),1==this.constants.configurePhysics&&this._loadPhysicsConfiguration()},e._loadClusterSystem=function(){this.clusterSession=0,this.hubThreshold=5,this._loadMixin(o)},e._loadSectorSystem=function(){this.sectors={},this.activeSector=["default"],this.sectors.active={},this.sectors.active["default"]={nodes:{},edges:{},nodeIndices:[],formationScale:1,drawingNode:void 0},this.sectors.frozen={},this.sectors.support={nodes:{},edges:{},nodeIndices:[],formationScale:1,drawingNode:void 0},this.nodeIndices=this.sectors.active["default"].nodeIndices,this._loadMixin(n)},e._loadSelectionSystem=function(){this.selectionObj={nodes:{},edges:{}},this._loadMixin(r)},e._loadManipulationSystem=function(){this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,1==this.constants.dataManipulation.enabled?(void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="network-manipulationDiv",this.manipulationDiv.id="network-manipulationDiv",this.manipulationDiv.style.display=1==this.editMode?"block":"none",this.frame.appendChild(this.manipulationDiv)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="network-manipulation-editMode",this.editModeDiv.id="network-manipulation-editMode",this.editModeDiv.style.display=1==this.editMode?"none":"block",this.frame.appendChild(this.editModeDiv)),void 0===this.closeDiv&&(this.closeDiv=document.createElement("div"),this.closeDiv.className="network-manipulation-closeDiv",this.closeDiv.id="network-manipulation-closeDiv",this.closeDiv.style.display=this.manipulationDiv.style.display,this.frame.appendChild(this.closeDiv)),this._loadMixin(a),this._createManipulatorBar()):void 0!==this.manipulationDiv&&(this._createManipulatorBar(),this.containerElement.removeChild(this.manipulationDiv),this.containerElement.removeChild(this.editModeDiv),this.containerElement.removeChild(this.closeDiv),this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0,this._clearMixin(a))},e._loadNavigationControls=function(){this._loadMixin(h),this._cleanNavigation(),1==this.constants.navigation.enabled&&this._loadNavigationElements()},e._loadHierarchySystem=function(){this._loadMixin(d) -}},function(t,e,i){function s(t){this.active=!1,this.dom={container:t},this.dom.overlay=document.createElement("div"),this.dom.overlay.className="overlay",this.dom.container.appendChild(this.dom.overlay),this.hammer=a(this.dom.overlay,{prevent_default:!1}),this.hammer.on("tap",this._onTapOverlay.bind(this));var e=this,i=["touch","pinch","doubletap","hold","dragstart","drag","dragend","mousewheel","DOMMouseScroll"];i.forEach(function(t){e.hammer.on(t,function(t){t.stopPropagation()})}),this.windowHammer=a(window,{prevent_default:!1}),this.windowHammer.on("tap",function(i){o(i.target,t)||e.deactivate()}),this.escListener=this.deactivate.bind(this)}function o(t,e){for(;t;){if(t===e)return!0;t=t.parentNode}return!1}var n=i(50),r=i(49),a=i(41),h=i(1);r(s.prototype),s.current=null,s.prototype.destroy=function(){this.deactivate(),this.dom.overlay.parentNode.removeChild(this.dom.overlay),this.hammer=null,this.windowHammer=null},s.prototype.activate=function(){s.current&&s.current.deactivate(),s.current=this,this.active=!0,this.dom.overlay.style.display="none",h.addClassName(this.dom.container,"vis-active"),this.emit("change"),this.emit("activate"),n.bind("esc",this.escListener)},s.prototype.deactivate=function(){this.active=!1,this.dom.overlay.style.display="",h.removeClassName(this.dom.container,"vis-active"),n.unbind("esc",this.escListener),this.emit("change"),this.emit("deactivate")},s.prototype._onTapOverlay=function(t){this.activate(),t.stopPropagation()},t.exports=s},function(t){function e(t){return t?i(t):void 0}function i(t){for(var i in e.prototype)t[i]=e.prototype[i];return t}t.exports=e,e.prototype.on=e.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},e.prototype.once=function(t,e){function i(){s.off(t,i),e.apply(this,arguments)}var s=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},e.prototype.off=e.prototype.removeListener=e.prototype.removeAllListeners=e.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var s,o=0;os;++s)i[s].apply(this,e)}return this},e.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},e.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t){function e(t,e,i){return t.addEventListener?t.addEventListener(e,i,!1):void t.attachEvent("on"+e,i)}function i(t){return"keypress"==t.type?String.fromCharCode(t.which):_[t.which]?_[t.which]:x[t.which]?x[t.which]:String.fromCharCode(t.which).toLowerCase()}function s(t){var e=t.target||t.srcElement,i=e.tagName;return(" "+e.className+" ").indexOf(" mousetrap ")>-1?!1:"INPUT"==i||"SELECT"==i||"TEXTAREA"==i||e.contentEditable&&"true"==e.contentEditable}function o(t,e){return t.sort().join(",")===e.sort().join(",")}function n(t){t=t||{};var e,i=!1;for(e in E)t[e]?i=!0:E[e]=0;i||(T=!1)}function r(t,e,i,s,n){var r,a,h=[];if(!M[t])return[];for("keyup"==i&&c(t)&&(e=[t]),r=0;r95&&112>t||_.hasOwnProperty(t)&&(y[_[t]]=t)}return y}function f(t,e,i){return i||(i=u()[t]?"keydown":"keypress"),"keypress"==i&&e.length&&(i="keydown"),i}function m(t,e,s,o){E[t]=0,o||(o=f(e[0],[]));var r,a=function(){T=o,++E[t],p()},d=function(t){h(s,t),"keyup"!==o&&(D=i(t)),setTimeout(n,10)};for(r=0;r1)return m(t,d,e,i);for(h="+"===t?["+"]:t.split("+"),n=0;n":".","?":"/","|":"\\"},S={option:"alt",command:"meta","return":"enter",escape:"esc"},M={},C={},E={},D=!1,T=!1,O=1;20>O;++O)_[111+O]="f"+O;for(O=0;9>=O;++O)_[O+96]=O;e(document,"keypress",l),e(document,"keydown",l),e(document,"keyup",l);var L={bind:function(t,e,i){return v(t instanceof Array?t:[t],e,i),C[t+":"+i]=e,this},unbind:function(t,e){return C[t+":"+e]&&(delete C[t+":"+e],this.bind(t,function(){},e)),this},trigger:function(t,e){return C[t+":"+e](),this},reset:function(){return M={},C={},this}};t.exports=L},function(t,e,i){var s;(function(t,o){(function(n){function r(t,e,i){switch(arguments.length){case 2:return null!=t?t:e;case 3:return null!=t?t:null!=e?e:i;default:throw new Error("Implement me")}}function a(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function h(t,e){function i(){ve.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}var s=!0;return f(function(){return s&&(i(),s=!1),e.apply(this,arguments)},e)}function d(t,e){return function(i){return v(t.call(this,i),e)}}function l(t,e){return function(i){return this.lang().ordinal(t.call(this,i),e)}}function c(){}function p(t){L(t),f(this,t)}function u(t){var e=S(t),i=e.year||0,s=e.quarter||0,o=e.month||0,n=e.week||0,r=e.day||0,a=e.hour||0,h=e.minute||0,d=e.second||0,l=e.millisecond||0;this._milliseconds=+l+1e3*d+6e4*h+36e5*a,this._days=+r+7*n,this._months=+o+3*s+12*i,this._data={},this._bubble()}function f(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return e.hasOwnProperty("toString")&&(t.toString=e.toString),e.hasOwnProperty("valueOf")&&(t.valueOf=e.valueOf),t}function m(t){var e,i={};for(e in t)t.hasOwnProperty(e)&&ke.hasOwnProperty(e)&&(i[e]=t[e]);return i}function g(t){return 0>t?Math.ceil(t):Math.floor(t)}function v(t,e,i){for(var s=""+Math.abs(t),o=t>=0;s.lengths;s++)(i&&t[s]!==e[s]||!i&&C(t[s])!==C(e[s]))&&r++;return r+n}function w(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=ri[t]||ai[e]||e}return t}function S(t){var e,i,s={};for(i in t)t.hasOwnProperty(i)&&(e=w(i),e&&(s[e]=t[i]));return s}function M(t){var e,i;if(0===t.indexOf("week"))e=7,i="day";else{if(0!==t.indexOf("month"))return;e=12,i="month"}ve[t]=function(s,o){var r,a,h=ve.fn._lang[t],d=[];if("number"==typeof s&&(o=s,s=n),a=function(t){var e=ve().utc().set(i,t);return h.call(ve.fn._lang,e,s||"")},null!=o)return a(o);for(r=0;e>r;r++)d.push(a(r));return d}}function C(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function E(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function D(t,e,i){return re(ve([t,11,31+e-i]),e,i).week}function T(t){return O(t)?366:365}function O(t){return t%4===0&&t%100!==0||t%400===0}function L(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[Me]<0||t._a[Me]>11?Me:t._a[Ce]<1||t._a[Ce]>E(t._a[Se],t._a[Me])?Ce:t._a[Ee]<0||t._a[Ee]>23?Ee:t._a[De]<0||t._a[De]>59?De:t._a[Te]<0||t._a[Te]>59?Te:t._a[Oe]<0||t._a[Oe]>999?Oe:-1,t._pf._overflowDayOfYear&&(Se>e||e>Ce)&&(e=Ce),t._pf.overflow=e)}function k(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length)),t._isValid}function N(t){return t?t.toLowerCase().replace("_","-"):t}function I(t,e){return e._isUTC?ve(t).zone(e._offset||0):ve(t).local()}function A(t,e){return e.abbr=t,Le[t]||(Le[t]=new c),Le[t].set(e),Le[t]}function z(t){delete Le[t]}function P(t){var e,s,o,n,r=0,a=function(t){if(!Le[t]&&Ne)try{i(60)("./"+t)}catch(e){}return Le[t]};if(!t)return ve.fn._lang;if(!b(t)){if(s=a(t))return s;t=[t]}for(;r0;){if(s=a(n.slice(0,e).join("-")))return s;if(o&&o.length>=e&&x(n,o,!0)>=e-1)break;e--}r++}return ve.fn._lang}function R(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function F(t){var e,i,s=t.match(Pe);for(e=0,i=s.length;i>e;e++)s[e]=pi[s[e]]?pi[s[e]]:R(s[e]);return function(o){var n="";for(e=0;i>e;e++)n+=s[e]instanceof Function?s[e].call(o,t):s[e];return n}}function H(t,e){return t.isValid()?(e=Y(e,t.lang()),hi[e]||(hi[e]=F(e)),hi[e](t)):t.lang().invalidDate()}function Y(t,e){function i(t){return e.longDateFormat(t)||t}var s=5;for(Re.lastIndex=0;s>=0&&Re.test(t);)t=t.replace(Re,i),Re.lastIndex=0,s-=1;return t}function B(t,e){var i,s=e._strict;switch(t){case"Q":return Ze;case"DDDD":return Ke;case"YYYY":case"GGGG":case"gggg":return s?$e:Ye;case"Y":case"G":case"g":return Qe;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return s?Je:Be;case"S":if(s)return Ze;case"SS":if(s)return qe;case"SSS":if(s)return Ke;case"DDD":return He;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Ge;case"a":case"A":return P(e._l)._meridiemParse;case"X":return Ve;case"Z":case"ZZ":return je;case"T":return Ue;case"SSSS":return We;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return s?qe:Fe;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Fe;case"Do":return Xe;default:return i=new RegExp(K(q(t.replace("\\","")),"i"))}}function W(t){t=t||"";var e=t.match(je)||[],i=e[e.length-1]||[],s=(i+"").match(oi)||["-",0,0],o=+(60*s[1])+C(s[2]);return"+"===s[0]?-o:o}function G(t,e,i){var s,o=i._a;switch(t){case"Q":null!=e&&(o[Me]=3*(C(e)-1));break;case"M":case"MM":null!=e&&(o[Me]=C(e)-1);break;case"MMM":case"MMMM":s=P(i._l).monthsParse(e),null!=s?o[Me]=s:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(o[Ce]=C(e));break;case"Do":null!=e&&(o[Ce]=C(parseInt(e,10)));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=C(e));break;case"YY":o[Se]=ve.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":o[Se]=C(e);break;case"a":case"A":i._isPm=P(i._l).isPM(e);break;case"H":case"HH":case"h":case"hh":o[Ee]=C(e);break;case"m":case"mm":o[De]=C(e);break;case"s":case"ss":o[Te]=C(e);break;case"S":case"SS":case"SSS":case"SSSS":o[Oe]=C(1e3*("0."+e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=W(e);break;case"dd":case"ddd":case"dddd":s=P(i._l).weekdaysParse(e),null!=s?(i._w=i._w||{},i._w.d=s):i._pf.invalidWeekday=e;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":t=t.substr(0,1);case"gggg":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=C(e));break;case"gg":case"GG":i._w=i._w||{},i._w[t]=ve.parseTwoDigitYear(e)}}function j(t){var e,i,s,o,n,a,h,d;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(n=1,a=4,i=r(e.GG,t._a[Se],re(ve(),1,4).year),s=r(e.W,1),o=r(e.E,1)):(d=P(t._l),n=d._week.dow,a=d._week.doy,i=r(e.gg,t._a[Se],re(ve(),n,a).year),s=r(e.w,1),null!=e.d?(o=e.d,n>o&&++s):o=null!=e.e?e.e+n:n),h=ae(i,s,o,a,n),t._a[Se]=h.year,t._dayOfYear=h.dayOfYear}function U(t){var e,i,s,o,n=[];if(!t._d){for(s=X(t),t._w&&null==t._a[Ce]&&null==t._a[Me]&&j(t),t._dayOfYear&&(o=r(t._a[Se],s[Se]),t._dayOfYear>T(o)&&(t._pf._overflowDayOfYear=!0),i=ie(o,0,t._dayOfYear),t._a[Me]=i.getUTCMonth(),t._a[Ce]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=n[e]=s[e];for(;7>e;e++)t._a[e]=n[e]=null==t._a[e]?2===e?1:0:t._a[e];t._d=(t._useUTC?ie:ee).apply(null,n),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()+t._tzm)}}function V(t){var e;t._d||(e=S(t._i),t._a=[e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond],U(t))}function X(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function Z(t){if(t._f===ve.ISO_8601)return void J(t);t._a=[],t._pf.empty=!0;var e,i,s,o,n,r=P(t._l),a=""+t._i,h=a.length,d=0;for(s=Y(t._f,r).match(Pe)||[],e=0;e0&&t._pf.unusedInput.push(n),a=a.slice(a.indexOf(i)+i.length),d+=i.length),pi[o]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(o),G(o,i,t)):t._strict&&!i&&t._pf.unusedTokens.push(o);t._pf.charsLeftOver=h-d,a.length>0&&t._pf.unusedInput.push(a),t._isPm&&t._a[Ee]<12&&(t._a[Ee]+=12),t._isPm===!1&&12===t._a[Ee]&&(t._a[Ee]=0),U(t),L(t)}function q(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,s,o){return e||i||s||o})}function K(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function $(t){var e,i,s,o,n;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(o=0;on)&&(s=n,i=e));f(t,i||e)}function J(t){var e,i,s=t._i,o=ti.exec(s);if(o){for(t._pf.iso=!0,e=0,i=ii.length;i>e;e++)if(ii[e][1].exec(s)){t._f=ii[e][0]+(o[6]||" ");break}for(e=0,i=si.length;i>e;e++)if(si[e][1].exec(s)){t._f+=si[e][0];break}s.match(je)&&(t._f+="Z"),Z(t)}else t._isValid=!1}function Q(t){J(t),t._isValid===!1&&(delete t._isValid,ve.createFromInputFallback(t))}function te(t){var e=t._i,i=Ie.exec(e);e===n?t._d=new Date:i?t._d=new Date(+i[1]):"string"==typeof e?Q(t):b(e)?(t._a=e.slice(0),U(t)):_(e)?t._d=new Date(+e):"object"==typeof e?V(t):"number"==typeof e?t._d=new Date(e):ve.createFromInputFallback(t)}function ee(t,e,i,s,o,n,r){var a=new Date(t,e,i,s,o,n,r);return 1970>t&&a.setFullYear(t),a}function ie(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function se(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function oe(t,e,i,s,o){return o.relativeTime(e||1,!!i,t,s)}function ne(t,e,i){var s=we(Math.abs(t)/1e3),o=we(s/60),n=we(o/60),r=we(n/24),a=we(r/365),h=s0,h[4]=i,oe.apply({},h)}function re(t,e,i){var s,o=i-e,n=i-t.day();return n>o&&(n-=7),o-7>n&&(n+=7),s=ve(t).add("d",n),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function ae(t,e,i,s,o){var n,r,a=ie(t,0,1).getUTCDay();return a=0===a?7:a,i=null!=i?i:o,n=o-a+(a>s?7:0)-(o>a?7:0),r=7*(e-1)+(i-o)+n+1,{year:r>0?t:t-1,dayOfYear:r>0?r:T(t-1)+r}}function he(t){var e=t._i,i=t._f;return null===e||i===n&&""===e?ve.invalid({nullInput:!0}):("string"==typeof e&&(t._i=e=P().preparse(e)),ve.isMoment(e)?(t=m(e),t._d=new Date(+e._d)):i?b(i)?$(t):Z(t):te(t),new p(t))}function de(t,e){var i,s;if(1===e.length&&b(e[0])&&(e=e[0]),!e.length)return ve();for(i=e[0],s=1;s=0?"+":"-";return e+v(Math.abs(t),6)},gg:function(){return v(this.weekYear()%100,2)},gggg:function(){return v(this.weekYear(),4)},ggggg:function(){return v(this.weekYear(),5)},GG:function(){return v(this.isoWeekYear()%100,2)},GGGG:function(){return v(this.isoWeekYear(),4)},GGGGG:function(){return v(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return C(this.milliseconds()/100)},SS:function(){return v(C(this.milliseconds()/10),2)},SSS:function(){return v(this.milliseconds(),3)},SSSS:function(){return v(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+v(C(t/60),2)+":"+v(C(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+v(C(t/60),2)+v(C(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},ui=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];li.length;)be=li.pop(),pi[be+"o"]=l(pi[be],be);for(;ci.length;)be=ci.pop(),pi[be+be]=d(pi[be],2);for(pi.DDDD=d(pi.DDD,3),f(c.prototype,{set:function(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t){var e,i,s;for(this._monthsParse||(this._monthsParse=[]),e=0;12>e;e++)if(this._monthsParse[e]||(i=ve.utc([2e3,e]),s="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[e]=new RegExp(s.replace(".",""),"i")),this._monthsParse[e].test(t))return e},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,i,s;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(i=ve([2e3,1]).day(e),s="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(s.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e){var i=this._calendar[t];return"function"==typeof i?i.apply(e):i},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,i,s){var o=this._relativeTime[i];return"function"==typeof o?o(t,e,i,s):o.replace(/%d/i,t)},pastFuture:function(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",preparse:function(t){return t},postformat:function(t){return t},week:function(t){return re(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),ve=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._i=t,o._f=e,o._l=i,o._strict=s,o._isUTC=!1,o._pf=a(),he(o)},ve.suppressDeprecationWarnings=!1,ve.createFromInputFallback=h("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i)}),ve.min=function(){var t=[].slice.call(arguments,0);return de("isBefore",t)},ve.max=function(){var t=[].slice.call(arguments,0);return de("isAfter",t)},ve.utc=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._useUTC=!0,o._isUTC=!0,o._l=i,o._i=t,o._f=e,o._strict=s,o._pf=a(),he(o).utc()},ve.unix=function(t){return ve(1e3*t)},ve.duration=function(t,e){var i,s,o,n=t,r=null;return ve.isDuration(t)?n={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(n={},e?n[e]=t:n.milliseconds=t):(r=Ae.exec(t))?(i="-"===r[1]?-1:1,n={y:0,d:C(r[Ce])*i,h:C(r[Ee])*i,m:C(r[De])*i,s:C(r[Te])*i,ms:C(r[Oe])*i}):(r=ze.exec(t))&&(i="-"===r[1]?-1:1,o=function(t){var e=t&&parseFloat(t.replace(",","."));return(isNaN(e)?0:e)*i},n={y:o(r[2]),M:o(r[3]),d:o(r[4]),h:o(r[5]),m:o(r[6]),s:o(r[7]),w:o(r[8])}),s=new u(n),ve.isDuration(t)&&t.hasOwnProperty("_lang")&&(s._lang=t._lang),s},ve.version=_e,ve.defaultFormat=ei,ve.ISO_8601=function(){},ve.momentProperties=ke,ve.updateOffset=function(){},ve.relativeTimeThreshold=function(t,e){return di[t]===n?!1:(di[t]=e,!0)},ve.lang=function(t,e){var i;return t?(e?A(N(t),e):null===e?(z(t),t="en"):Le[t]||P(t),i=ve.duration.fn._lang=ve.fn._lang=P(t),i._abbr):ve.fn._lang._abbr},ve.langData=function(t){return t&&t._lang&&t._lang._abbr&&(t=t._lang._abbr),P(t)},ve.isMoment=function(t){return t instanceof p||null!=t&&t.hasOwnProperty("_isAMomentObject")},ve.isDuration=function(t){return t instanceof u},be=ui.length-1;be>=0;--be)M(ui[be]);ve.normalizeUnits=function(t){return w(t)},ve.invalid=function(t){var e=ve.utc(0/0);return null!=t?f(e._pf,t):e._pf.userInvalidated=!0,e},ve.parseZone=function(){return ve.apply(null,arguments).parseZone()},ve.parseTwoDigitYear=function(t){return C(t)+(C(t)>68?1900:2e3)},f(ve.fn=p.prototype,{clone:function(){return ve(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var t=ve(this).utc();return 00:!1},parsingFlags:function(){return f({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(t){var e=H(this,t||ve.defaultFormat);return this.lang().postformat(e)},add:function(t,e){var i;return i="string"==typeof t&&"string"==typeof e?ve.duration(isNaN(+e)?+t:+e,isNaN(+e)?e:t):"string"==typeof t?ve.duration(+e,t):ve.duration(t,e),y(this,i,1),this},subtract:function(t,e){var i;return i="string"==typeof t&&"string"==typeof e?ve.duration(isNaN(+e)?+t:+e,isNaN(+e)?e:t):"string"==typeof t?ve.duration(+e,t):ve.duration(t,e),y(this,i,-1),this},diff:function(t,e,i){var s,o,n=I(t,this),r=6e4*(this.zone()-n.zone());return e=w(e),"year"===e||"month"===e?(s=432e5*(this.daysInMonth()+n.daysInMonth()),o=12*(this.year()-n.year())+(this.month()-n.month()),o+=(this-ve(this).startOf("month")-(n-ve(n).startOf("month")))/s,o-=6e4*(this.zone()-ve(this).startOf("month").zone()-(n.zone()-ve(n).startOf("month").zone()))/s,"year"===e&&(o/=12)):(s=this-n,o="second"===e?s/1e3:"minute"===e?s/6e4:"hour"===e?s/36e5:"day"===e?(s-r)/864e5:"week"===e?(s-r)/6048e5:s),i?o:g(o)},from:function(t,e){return ve.duration(this.diff(t)).lang(this.lang()._abbr).humanize(!e)},fromNow:function(t){return this.from(ve(),t)},calendar:function(t){var e=t||ve(),i=I(e,this).startOf("day"),s=this.diff(i,"days",!0),o=-6>s?"sameElse":-1>s?"lastWeek":0>s?"lastDay":1>s?"sameDay":2>s?"nextDay":7>s?"nextWeek":"sameElse";return this.format(this.lang().calendar(o,this))},isLeapYear:function(){return O(this.year())},isDST:function(){return this.zone()+ve(t).startOf(e)},isBefore:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)<+ve(t).startOf(e)},isSame:function(t,e){return e=e||"ms",+this.clone().startOf(e)===+I(t,this).startOf(e)},min:h("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(t){return t=ve.apply(null,arguments),this>t?this:t}),max:h("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(t){return t=ve.apply(null,arguments),t>this?this:t}),zone:function(t,e){var i=this._offset||0;return null==t?this._isUTC?i:this._d.getTimezoneOffset():("string"==typeof t&&(t=W(t)),Math.abs(t)<16&&(t=60*t),this._offset=t,this._isUTC=!0,i!==t&&(!e||this._changeInProgress?y(this,ve.duration(i-t,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,ve.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(t){return t=t?ve(t).zone():0,(this.zone()-t)%60===0},daysInMonth:function(){return E(this.year(),this.month())},dayOfYear:function(t){var e=we((ve(this).startOf("day")-ve(this).startOf("year"))/864e5)+1;return null==t?e:this.add("d",t-e)},quarter:function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},weekYear:function(t){var e=re(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==t?e:this.add("y",t-e)},isoWeekYear:function(t){var e=re(this,1,4).year;return null==t?e:this.add("y",t-e)},week:function(t){var e=this.lang().week(this);return null==t?e:this.add("d",7*(t-e))},isoWeek:function(t){var e=re(this,1,4).week;return null==t?e:this.add("d",7*(t-e))},weekday:function(t){var e=(this.day()+7-this.lang()._week.dow)%7;return null==t?e:this.add("d",t-e)},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},isoWeeksInYear:function(){return D(this.year(),1,4)},weeksInYear:function(){var t=this._lang._week; -return D(this.year(),t.dow,t.doy)},get:function(t){return t=w(t),this[t]()},set:function(t,e){return t=w(t),"function"==typeof this[t]&&this[t](e),this},lang:function(t){return t===n?this._lang:(this._lang=P(t),this)}}),ve.fn.millisecond=ve.fn.milliseconds=ue("Milliseconds",!1),ve.fn.second=ve.fn.seconds=ue("Seconds",!1),ve.fn.minute=ve.fn.minutes=ue("Minutes",!1),ve.fn.hour=ve.fn.hours=ue("Hours",!0),ve.fn.date=ue("Date",!0),ve.fn.dates=h("dates accessor is deprecated. Use date instead.",ue("Date",!0)),ve.fn.year=ue("FullYear",!0),ve.fn.years=h("years accessor is deprecated. Use year instead.",ue("FullYear",!0)),ve.fn.days=ve.fn.day,ve.fn.months=ve.fn.month,ve.fn.weeks=ve.fn.week,ve.fn.isoWeeks=ve.fn.isoWeek,ve.fn.quarters=ve.fn.quarter,ve.fn.toJSON=ve.fn.toISOString,f(ve.duration.fn=u.prototype,{_bubble:function(){var t,e,i,s,o=this._milliseconds,n=this._days,r=this._months,a=this._data;a.milliseconds=o%1e3,t=g(o/1e3),a.seconds=t%60,e=g(t/60),a.minutes=e%60,i=g(e/60),a.hours=i%24,n+=g(i/24),a.days=n%30,r+=g(n/30),a.months=r%12,s=g(r/12),a.years=s},weeks:function(){return g(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*C(this._months/12)},humanize:function(t){var e=+this,i=ne(e,!t,this.lang());return t&&(i=this.lang().pastFuture(e,i)),this.lang().postformat(i)},add:function(t,e){var i=ve.duration(t,e);return this._milliseconds+=i._milliseconds,this._days+=i._days,this._months+=i._months,this._bubble(),this},subtract:function(t,e){var i=ve.duration(t,e);return this._milliseconds-=i._milliseconds,this._days-=i._days,this._months-=i._months,this._bubble(),this},get:function(t){return t=w(t),this[t.toLowerCase()+"s"]()},as:function(t){return t=w(t),this["as"+t.charAt(0).toUpperCase()+t.slice(1)+"s"]()},lang:ve.fn.lang,toIsoString:function(){var t=Math.abs(this.years()),e=Math.abs(this.months()),i=Math.abs(this.days()),s=Math.abs(this.hours()),o=Math.abs(this.minutes()),n=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(t?t+"Y":"")+(e?e+"M":"")+(i?i+"D":"")+(s||o||n?"T":"")+(s?s+"H":"")+(o?o+"M":"")+(n?n+"S":""):"P0D"}});for(be in ni)ni.hasOwnProperty(be)&&(me(be,ni[be]),fe(be.toLowerCase()));me("Weeks",6048e5),ve.duration.fn.asMonths=function(){return(+this-31536e6*this.years())/2592e6+12*this.years()},ve.lang("en",{ordinal:function(t){var e=t%10,i=1===C(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),Ne?o.exports=ve:(s=function(t,e,i){return i.config&&i.config()&&i.config().noGlobal===!0&&(xe.moment=ye),ve}.call(e,i,e,o),!(s!==n&&(o.exports=s)),ge(!0))}).call(this)}).call(e,function(){return this}(),i(64)(t))},function(t,e,i){var s;!function(o,n){"use strict";function r(){a.READY||(w.determineEventTypes(),x.each(a.gestures,function(t){M.register(t)}),w.onTouch(a.DOCUMENT,v,M.detect),w.onTouch(a.DOCUMENT,y,M.detect),a.READY=!0)}var a=function C(t,e){return new C.Instance(t,e||{})};a.VERSION="1.1.3",a.defaults={behavior:{userSelect:"none",touchAction:"pan-y",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},a.DOCUMENT=document,a.HAS_POINTEREVENTS=navigator.pointerEnabled||navigator.msPointerEnabled,a.HAS_TOUCHEVENTS="ontouchstart"in o,a.IS_MOBILE=/mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent),a.NO_MOUSEEVENTS=a.HAS_TOUCHEVENTS&&a.IS_MOBILE||a.HAS_POINTEREVENTS,a.CALCULATE_INTERVAL=25;var h={},d=a.DIRECTION_DOWN="down",l=a.DIRECTION_LEFT="left",c=a.DIRECTION_UP="up",p=a.DIRECTION_RIGHT="right",u=a.POINTER_MOUSE="mouse",f=a.POINTER_TOUCH="touch",m=a.POINTER_PEN="pen",g=a.EVENT_START="start",v=a.EVENT_MOVE="move",y=a.EVENT_END="end",b=a.EVENT_RELEASE="release",_=a.EVENT_TOUCH="touch";a.READY=!1,a.plugins=a.plugins||{},a.gestures=a.gestures||{};var x=a.utils={extend:function(t,e,i){for(var s in e)!e.hasOwnProperty(s)||t[s]!==n&&i||(t[s]=e[s]);return t},on:function(t,e,i){t.addEventListener(e,i,!1)},off:function(t,e,i){t.removeEventListener(e,i,!1)},each:function(t,e,i){var s,o;if("forEach"in t)t.forEach(e,i);else if(t.length!==n){for(s=0,o=t.length;o>s;s++)if(e.call(i,t[s],s,t)===!1)return}else for(s in t)if(t.hasOwnProperty(s)&&e.call(i,t[s],s,t)===!1)return},inStr:function(t,e){return t.indexOf(e)>-1},inArray:function(t,e){if(t.indexOf){var i=t.indexOf(e);return-1===i?!1:i}for(var s=0,o=t.length;o>s;s++)if(t[s]===e)return s;return!1},toArray:function(t){return Array.prototype.slice.call(t,0)},hasParent:function(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1},getCenter:function(t){var e=[],i=[],s=[],o=[],n=Math.min,r=Math.max;return 1===t.length?{pageX:t[0].pageX,pageY:t[0].pageY,clientX:t[0].clientX,clientY:t[0].clientY}:(x.each(t,function(t){e.push(t.pageX),i.push(t.pageY),s.push(t.clientX),o.push(t.clientY)}),{pageX:(n.apply(Math,e)+r.apply(Math,e))/2,pageY:(n.apply(Math,i)+r.apply(Math,i))/2,clientX:(n.apply(Math,s)+r.apply(Math,s))/2,clientY:(n.apply(Math,o)+r.apply(Math,o))/2})},getVelocity:function(t,e,i){return{x:Math.abs(e/t)||0,y:Math.abs(i/t)||0}},getAngle:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return 180*Math.atan2(s,i)/Math.PI},getDirection:function(t,e){var i=Math.abs(t.clientX-e.clientX),s=Math.abs(t.clientY-e.clientY);return i>=s?t.clientX-e.clientX>0?l:p:t.clientY-e.clientY>0?c:d},getDistance:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return Math.sqrt(i*i+s*s)},getScale:function(t,e){return t.length>=2&&e.length>=2?this.getDistance(e[0],e[1])/this.getDistance(t[0],t[1]):1},getRotation:function(t,e){return t.length>=2&&e.length>=2?this.getAngle(e[1],e[0])-this.getAngle(t[1],t[0]):0},isVertical:function(t){return t==c||t==d},setPrefixedCss:function(t,e,i,s){var o=["","Webkit","Moz","O","ms"];e=x.toCamelCase(e);for(var n=0;n0&&this.started&&(r=v),this.started=!0;var d=this.collectEventData(i,r,o,t);return e!=y&&s.call(M,d),a&&(d.changedLength=h,d.eventType=a,s.call(M,d),d.eventType=r,delete d.changedLength),r==y&&(s.call(M,d),this.started=!1),r},determineEventTypes:function(){var t;return t=a.HAS_POINTEREVENTS?o.PointerEvent?["pointerdown","pointermove","pointerup pointercancel lostpointercapture"]:["MSPointerDown","MSPointerMove","MSPointerUp MSPointerCancel MSLostPointerCapture"]:a.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],h[g]=t[0],h[v]=t[1],h[y]=t[2],h},getTouchList:function(t,e){if(a.HAS_POINTEREVENTS)return S.getTouchList();if(t.touches){if(e==v)return t.touches;var i=[],s=[].concat(x.toArray(t.touches),x.toArray(t.changedTouches)),o=[];return x.each(s,function(t){x.inArray(i,t.identifier)===!1&&o.push(t),i.push(t.identifier)}),o}return t.identifier=1,[t]},collectEventData:function(t,e,i,s){var o=f;return x.inStr(s.type,"mouse")||S.matchType(u,s)?o=u:S.matchType(m,s)&&(o=m),{center:x.getCenter(i),timeStamp:Date.now(),target:s.target,touches:i,eventType:e,pointerType:o,srcEvent:s,preventDefault:function(){var t=this.srcEvent;t.preventManipulation&&t.preventManipulation(),t.preventDefault&&t.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return M.stopDetect()}}}},S=a.PointerEvent={pointers:{},getTouchList:function(){var t=[];return x.each(this.pointers,function(e){t.push(e)}),t},updatePointer:function(t,e){t==y||t!=y&&1!==e.buttons?delete this.pointers[e.pointerId]:(e.identifier=e.pointerId,this.pointers[e.pointerId]=e)},matchType:function(t,e){if(!e.pointerType)return!1;var i=e.pointerType,s={};return s[u]=i===(e.MSPOINTER_TYPE_MOUSE||u),s[f]=i===(e.MSPOINTER_TYPE_TOUCH||f),s[m]=i===(e.MSPOINTER_TYPE_PEN||m),s[t]},reset:function(){this.pointers={}}},M=a.detection={gestures:[],current:null,previous:null,stopped:!1,startDetect:function(t,e){this.current||(this.stopped=!1,this.current={inst:t,startEvent:x.extend({},e),lastEvent:!1,lastCalcEvent:!1,futureCalcEvent:!1,lastCalcData:{},name:""},this.detect(e))},detect:function(t){if(this.current&&!this.stopped){t=this.extendEventData(t);var e=this.current.inst,i=e.options;return x.each(this.gestures,function(s){!this.stopped&&e.enabled&&i[s.name]&&s.handler.call(s,t,e)},this),this.current&&(this.current.lastEvent=t),t.eventType==y&&this.stopDetect(),t}},stopDetect:function(){this.previous=x.extend({},this.current),this.current=null,this.stopped=!0},getCalculatedData:function(t,e,i,s,o){var n=this.current,r=!1,h=n.lastCalcEvent,d=n.lastCalcData;h&&t.timeStamp-h.timeStamp>a.CALCULATE_INTERVAL&&(e=h.center,i=t.timeStamp-h.timeStamp,s=t.center.clientX-h.center.clientX,o=t.center.clientY-h.center.clientY,r=!0),(t.eventType==_||t.eventType==b)&&(n.futureCalcEvent=t),(!n.lastCalcEvent||r)&&(d.velocity=x.getVelocity(i,s,o),d.angle=x.getAngle(e,t.center),d.direction=x.getDirection(e,t.center),n.lastCalcEvent=n.futureCalcEvent||t,n.futureCalcEvent=t),t.velocityX=d.velocity.x,t.velocityY=d.velocity.y,t.interimAngle=d.angle,t.interimDirection=d.direction},extendEventData:function(t){var e=this.current,i=e.startEvent,s=e.lastEvent||i;(t.eventType==_||t.eventType==b)&&(i.touches=[],x.each(t.touches,function(t){i.touches.push({clientX:t.clientX,clientY:t.clientY})}));var o=t.timeStamp-i.timeStamp,n=t.center.clientX-i.center.clientX,r=t.center.clientY-i.center.clientY;return this.getCalculatedData(t,s.center,o,n,r),x.extend(t,{startEvent:i,deltaTime:o,deltaX:n,deltaY:r,distance:x.getDistance(i.center,t.center),angle:x.getAngle(i.center,t.center),direction:x.getDirection(i.center,t.center),scale:x.getScale(i.touches,t.touches),rotation:x.getRotation(i.touches,t.touches)}),t},register:function(t){var e=t.defaults||{};return e[t.name]===n&&(e[t.name]=!0),x.extend(a.defaults,e,!0),t.index=t.index||1e3,this.gestures.push(t),this.gestures.sort(function(t,e){return t.indexe.index?1:0}),this.gestures}};a.Instance=function(t,e){var i=this;r(),this.element=t,this.enabled=!0,x.each(e,function(t,i){delete e[i],e[x.toCamelCase(i)]=t}),this.options=x.extend(x.extend({},a.defaults),e||{}),this.options.behavior&&x.toggleBehavior(this.element,this.options.behavior,!0),this.eventStartHandler=w.onTouch(t,g,function(t){i.enabled&&t.eventType==g?M.startDetect(i,t):t.eventType==_&&M.detect(t)}),this.eventHandlers=[]},a.Instance.prototype={on:function(t,e){var i=this;return w.on(i.element,t,e,function(t){i.eventHandlers.push({gesture:t,handler:e})}),i},off:function(t,e){var i=this;return w.off(i.element,t,e,function(t){var s=x.inArray({gesture:t,handler:e});s!==!1&&i.eventHandlers.splice(s,1)}),i},trigger:function(t,e){e||(e={});var i=a.DOCUMENT.createEvent("Event");i.initEvent(t,!0,!0),i.gesture=e;var s=this.element;return x.hasParent(e.target,s)&&(s=e.target),s.dispatchEvent(i),this},enable:function(t){return this.enabled=t,this},dispose:function(){var t,e;for(x.toggleBehavior(this.element,this.options.behavior,!1),t=-1;e=this.eventHandlers[++t];)x.off(this.element,e.gesture,e.handler);return this.eventHandlers=[],w.off(this.element,h[g],this.eventStartHandler),null}},function(t){function e(e,s){var o=M.current;if(!(s.options.dragMaxTouches>0&&e.touches.length>s.options.dragMaxTouches))switch(e.eventType){case g:i=!1;break;case v:if(e.distance0)){var r=Math.abs(s.options.dragMinDistance/e.distance);n.pageX+=e.deltaX*r,n.pageY+=e.deltaY*r,n.clientX+=e.deltaX*r,n.clientY+=e.deltaY*r,e=M.extendEventData(e)}(o.lastEvent.dragLockToAxis||s.options.dragLockToAxis&&s.options.dragLockMinDistance<=e.distance)&&(e.dragLockToAxis=!0);var a=o.lastEvent.direction;e.dragLockToAxis&&a!==e.direction&&(e.direction=x.isVertical(a)?e.deltaY<0?c:d:e.deltaX<0?l:p),i||(s.trigger(t+"start",e),i=!0),s.trigger(t,e),s.trigger(t+e.direction,e);var h=x.isVertical(e.direction);(s.options.dragBlockVertical&&h||s.options.dragBlockHorizontal&&!h)&&e.preventDefault();break;case b:i&&e.changedLength<=s.options.dragMaxTouches&&(s.trigger(t+"end",e),i=!1);break;case y:i=!1}}var i=!1;a.gestures.Drag={name:t,index:50,handler:e,defaults:{dragMinDistance:10,dragDistanceCorrection:!0,dragMaxTouches:1,dragBlockHorizontal:!1,dragBlockVertical:!1,dragLockToAxis:!1,dragLockMinDistance:25}}}("drag"),a.gestures.Gesture={name:"gesture",index:1337,handler:function(t,e){e.trigger(this.name,t)}},function(t){function e(e,s){var o=s.options,n=M.current;switch(e.eventType){case g:clearTimeout(i),n.name=t,i=setTimeout(function(){n&&n.name==t&&s.trigger(t,e)},o.holdTimeout);break;case v:e.distance>o.holdThreshold&&clearTimeout(i);break;case b:clearTimeout(i)}}var i;a.gestures.Hold={name:t,index:10,defaults:{holdTimeout:500,holdThreshold:2},handler:e}}("hold"),a.gestures.Release={name:"release",index:1/0,handler:function(t,e){t.eventType==b&&e.trigger(this.name,t)}},a.gestures.Swipe={name:"swipe",index:40,defaults:{swipeMinTouches:1,swipeMaxTouches:1,swipeVelocityX:.6,swipeVelocityY:.6},handler:function(t,e){if(t.eventType==b){var i=t.touches.length,s=e.options;if(is.swipeMaxTouches)return;(t.velocityX>s.swipeVelocityX||t.velocityY>s.swipeVelocityY)&&(e.trigger(this.name,t),e.trigger(this.name+t.direction,t))}}},function(t){function e(e,s){var o,n,r=s.options,a=M.current,h=M.previous;switch(e.eventType){case g:i=!1;break;case v:i=i||e.distance>r.tapMaxDistance;break;case y:!x.inStr(e.srcEvent.type,"cancel")&&e.deltaTimes.options.transformMinRotation&&s.trigger("rotate",e),o>s.options.transformMinScale&&(s.trigger("pinch",e),s.trigger("pinch"+(e.scale<1?"in":"out"),e));break;case b:i&&e.changedLength<2&&(s.trigger(t+"end",e),i=!1)}}var i=!1;a.gestures.Transform={name:t,index:45,defaults:{transformMinScale:.01,transformMinRotation:1},handler:e}}("transform"),s=function(){return a}.call(e,i,e,t),!(s!==n&&(t.exports=s))}(window)},function(t,e){e.startWithClustering=function(){this.clusterToFit(this.constants.clustering.initialMaxNodes,!0),this.updateLabels(),this.stabilize&&this._stabilize(),this.start()},e.clusterToFit=function(t,e){for(var i=this.nodeIndices.length,s=50,o=0;i>t&&s>o;)o%3==0?(this.forceAggregateHubs(!0),this.normalizeClusterLevels()):this.increaseClusterLevel(),i=this.nodeIndices.length,o+=1;o>0&&1==e&&this.repositionNodes(),this._updateCalculationNodes()},e.openCluster=function(t){var e=this.moving;if(t.clusterSize>this.constants.clustering.sectorThreshold&&this._nodeInActiveArea(t)&&("default"!=this._sector()||1!=this.nodeIndices.length)){this._addSector(t);for(var i=0;this.nodeIndices.lengthi;)this.decreaseClusterLevel(),i+=1}else this._expandClusterNode(t,!1,!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this._updateCalculationNodes(),this.updateLabels();this.moving!=e&&this.start()},e.updateClustersDefault=function(){1==this.constants.clustering.enabled&&this.updateClusters(0,!1,!1)},e.increaseClusterLevel=function(){this.updateClusters(-1,!1,!0)},e.decreaseClusterLevel=function(){this.updateClusters(1,!1,!0)},e.updateClusters=function(t,e,i,s){var o=this.moving,n=this.nodeIndices.length;this.previousScale>this.scale&&0==t&&this._collapseSector(),this.previousScale>this.scale||-1==t?this._formClusters(i):(this.previousScalethis.scale||-1==t)&&(this._aggregateHubs(i),this._updateNodeIndexList()),(this.previousScale>this.scale||-1==t)&&(this.handleChains(),this._updateNodeIndexList()),this.previousScale=this.scale,this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.lengththis.constants.clustering.chainThreshold&&this._reduceAmountOfChains(1-this.constants.clustering.chainThreshold/t)},e._aggregateHubs=function(t){this._getHubSize(),this._formClustersByHub(t,!1)},e.forceAggregateHubs=function(t){var e=this.moving,i=this.nodeIndices.length;this._aggregateHubs(!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.length!=i&&(this.clusterSession+=1),(0==t||void 0===t)&&this.moving!=e&&this.start()},e._openClustersBySize=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];1==e.inView()&&(e.width*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientWidth||e.height*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientHeight)&&this.openCluster(e)}},e._openClusters=function(t,e){for(var i=0;i1&&(t.clusterSizei)){var r=n.from,a=n.to;n.to.options.mass>n.from.options.mass&&(r=n.to,a=n.from),1==a.dynamicEdgesLength?this._addToCluster(r,a,!1):1==r.dynamicEdgesLength&&this._addToCluster(a,r,!1)}}},e._forceClustersByZoom=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];if(1==e.dynamicEdgesLength&&0!=e.dynamicEdges.length){var i=e.dynamicEdges[0],s=i.toId==e.id?this.nodes[i.fromId]:this.nodes[i.toId];e.id!=s.id&&(s.options.mass>e.options.mass?this._addToCluster(s,e,!0):this._addToCluster(e,s,!0))}}},e._clusterToSmallestNeighbour=function(t){for(var e=-1,i=null,s=0;so.clusterSessions.length&&(e=o.clusterSessions.length,i=o)}null!=o&&void 0!==this.nodes[o.id]&&this._addToCluster(o,t,!0)},e._formClustersByHub=function(t,e){for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&this._formClusterFromHub(this.nodes[i],t,e)},e._formClusterFromHub=function(t,e,i,s){if(void 0===s&&(s=0),t.dynamicEdgesLength>=this.hubThreshold&&0==i||t.dynamicEdgesLength==this.hubThreshold&&1==i){for(var o,n,r,a=this.constants.clustering.clusterEdgeThreshold/this.scale,h=!1,d=[],l=t.dynamicEdges.length,c=0;l>c;c++)d.push(t.dynamicEdges[c].id);if(0==e)for(h=!1,c=0;l>c;c++){var p=this.edges[d[c]];if(void 0!==p&&p.connected&&p.toId!=p.fromId&&(o=p.to.x-p.from.x,n=p.to.y-p.from.y,r=Math.sqrt(o*o+n*n),a>r)){h=!0;break}}if(!e&&h||e)for(c=0;l>c;c++)if(p=this.edges[d[c]],void 0!==p){var u=this.nodes[p.fromId==t.id?p.toId:p.fromId];u.dynamicEdges.length<=this.hubThreshold+s&&u.id!=t.id&&this._addToCluster(t,u,e)}}},e._addToCluster=function(t,e,i){t.containedNodes[e.id]=e;for(var s=0;s1)for(var s=0;s1&&(e.label="[".concat(String(e.clusterSize),"]"))}for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(e=this.nodes[t],1==e.clusterSize&&(e.label=void 0!==e.originalLabel?e.originalLabel:String(e.id)))},e.normalizeClusterLevels=function(){var t,e=0,i=1e9,s=0;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(s=this.nodes[t].clusterSessions.length,s>e&&(e=s),i>s&&(i=s));if(e-i>this.constants.clustering.clusterLevelDifference){var o=this.nodeIndices.length,n=e-this.constants.clustering.clusterLevelDifference;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodes[t].clusterSessions.lengths&&(s=n.dynamicEdgesLength),t+=n.dynamicEdgesLength,e+=Math.pow(n.dynamicEdgesLength,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r);this.hubThreshold=Math.floor(t+2*a),this.hubThreshold>s&&(this.hubThreshold=s)},e._reduceAmountOfChains=function(t){this.hubThreshold=2;var e=Math.floor(this.nodeIndices.length*t);for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&e>0&&(this._formClusterFromHub(this.nodes[i],!0,!0,1),e-=1)},e._getChainFraction=function(){var t=0,e=0;for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&(2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&(t+=1),e+=1);return t/e}},function(t,e,i){var s=i(1);e._putDataInSector=function(){this.sectors.active[this._sector()].nodes=this.nodes,this.sectors.active[this._sector()].edges=this.edges,this.sectors.active[this._sector()].nodeIndices=this.nodeIndices},e._switchToSector=function(t,e){void 0===e||"active"==e?this._switchToActiveSector(t):this._switchToFrozenSector(t)},e._switchToActiveSector=function(t){this.nodeIndices=this.sectors.active[t].nodeIndices,this.nodes=this.sectors.active[t].nodes,this.edges=this.sectors.active[t].edges},e._switchToSupportSector=function(){this.nodeIndices=this.sectors.support.nodeIndices,this.nodes=this.sectors.support.nodes,this.edges=this.sectors.support.edges},e._switchToFrozenSector=function(t){this.nodeIndices=this.sectors.frozen[t].nodeIndices,this.nodes=this.sectors.frozen[t].nodes,this.edges=this.sectors.frozen[t].edges},e._loadLatestSector=function(){this._switchToSector(this._sector())},e._sector=function(){return this.activeSector[this.activeSector.length-1]},e._previousSector=function(){if(this.activeSector.length>1)return this.activeSector[this.activeSector.length-2];throw new TypeError("there are not enough sectors in the this.activeSector array.")},e._setActiveSector=function(t){this.activeSector.push(t)},e._forgetLastSector=function(){this.activeSector.pop()},e._createNewSector=function(t){this.sectors.active[t]={nodes:{},edges:{},nodeIndices:[],formationScale:this.scale,drawingNode:void 0},this.sectors.active[t].drawingNode=new Node({id:t,color:{background:"#eaefef",border:"495c5e"}},{},{},this.constants),this.sectors.active[t].drawingNode.clusterSize=2},e._deleteActiveSector=function(t){delete this.sectors.active[t]},e._deleteFrozenSector=function(t){delete this.sectors.frozen[t]},e._freezeSector=function(t){this.sectors.frozen[t]=this.sectors.active[t],this._deleteActiveSector(t)},e._activateSector=function(t){this.sectors.active[t]=this.sectors.frozen[t],this._deleteFrozenSector(t)},e._mergeThisWithFrozen=function(t){for(var e in this.nodes)this.nodes.hasOwnProperty(e)&&(this.sectors.frozen[t].nodes[e]=this.nodes[e]);for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.sectors.frozen[t].edges[i]=this.edges[i]);for(var s=0;s1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInSupportSector=function(t,e){if(void 0===e)this._switchToSupportSector(),this[t]();else{this._switchToSupportSector();var i=Array.prototype.splice.call(arguments,1);i.length>1?this[t](i[0],i[1]):this[t](e)}this._loadLatestSector()},e._doInAllFrozenSectors=function(t,e){if(void 0===e)for(var i in this.sectors.frozen)this.sectors.frozen.hasOwnProperty(i)&&(this._switchToFrozenSector(i),this[t]());else for(var i in this.sectors.frozen)if(this.sectors.frozen.hasOwnProperty(i)){this._switchToFrozenSector(i); -var s=Array.prototype.splice.call(arguments,1);s.length>1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInAllSectors=function(t,e){var i=Array.prototype.splice.call(arguments,1);void 0===e?(this._doInAllActiveSectors(t),this._doInAllFrozenSectors(t)):i.length>1?(this._doInAllActiveSectors(t,i[0],i[1]),this._doInAllFrozenSectors(t,i[0],i[1])):(this._doInAllActiveSectors(t,e),this._doInAllFrozenSectors(t,e))},e._clearNodeIndexList=function(){var t=this._sector();this.sectors.active[t].nodeIndices=[],this.nodeIndices=this.sectors.active[t].nodeIndices},e._drawSectorNodes=function(t,e){var i,s=1e9,o=-1e9,n=1e9,r=-1e9;for(var a in this.sectors[e])if(this.sectors[e].hasOwnProperty(a)&&void 0!==this.sectors[e][a].drawingNode){this._switchToSector(a,e),s=1e9,o=-1e9,n=1e9,r=-1e9;for(var h in this.nodes)this.nodes.hasOwnProperty(h)&&(i=this.nodes[h],i.resize(t),n>i.x-.5*i.width&&(n=i.x-.5*i.width),ri.y-.5*i.height&&(s=i.y-.5*i.height),o0?this.nodes[i[i.length-1]]:null},e._getEdgesOverlappingWith=function(t,e){var i=this.edges;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},e._getAllEdgesOverlappingWith=function(t){var e=[];return this._doInAllActiveSectors("_getEdgesOverlappingWith",t,e),e},e._getEdgeAt=function(t){var e=this._pointerToPositionObject(t),i=this._getAllEdgesOverlappingWith(e);return i.length>0?this.edges[i[i.length-1]]:null},e._addToSelection=function(t){t instanceof s?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t},e._addToHover=function(t){t instanceof s?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t},e._removeFromSelection=function(t){t instanceof s?delete this.selectionObj.nodes[t.id]:delete this.selectionObj.edges[t.id]},e._unselectAll=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].unselect();for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&this.selectionObj.edges[i].unselect();this.selectionObj={nodes:{},edges:{}},0==t&&this.emit("select",this.getSelection())},e._unselectClusters=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].clusterSize>1&&(this.selectionObj.nodes[e].unselect(),this._removeFromSelection(this.selectionObj.nodes[e]));0==t&&this.emit("select",this.getSelection())},e._getSelectedNodeCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedNode=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t];return null},e._getSelectedEdge=function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t];return null},e._getSelectedEdgeCount=function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedObjectCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t},e._selectionIsEmpty=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0},e._clusterInSelection=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1},e._selectConnectedEdges=function(t){for(var e=0;ee;e++){s=t[e];var o=this.nodes[s];if(!o)throw new RangeError('Node with id "'+s+'" not found');this._selectObject(o,!0,!0)}console.log("setSelection is deprecated. Please use selectNodes instead."),this.redraw()},e.selectNodes=function(t,e){var i,s,o;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),i=0,s=t.length;s>i;i++){o=t[i];var n=this.nodes[o];if(!n)throw new RangeError('Node with id "'+o+'" not found');this._selectObject(n,!0,!0,e)}this.redraw()},e.selectEdges=function(t){var e,i,s;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),e=0,i=t.length;i>e;e++){s=t[e];var o=this.edges[s];if(!o)throw new RangeError('Edge with id "'+s+'" not found');this._selectObject(o,!0,!0,highlightEdges)}this.redraw()},e._updateSelection=function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},function(t,e,i){var s=i(1),o=i(36),n=i(33);e._clearManipulatorBar=function(){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild)},e._restoreOverloadedFunctions=function(){for(var t in this.cachedFunctions)this.cachedFunctions.hasOwnProperty(t)&&(this[t]=this.cachedFunctions[t])},e._toggleEditMode=function(){this.editMode=!this.editMode;var t=document.getElementById("network-manipulationDiv"),e=document.getElementById("network-manipulation-closeDiv"),i=document.getElementById("network-manipulation-editMode");1==this.editMode?(t.style.display="block",e.style.display="block",i.style.display="none",e.onclick=this._toggleEditMode.bind(this)):(t.style.display="none",e.style.display="none",i.style.display="block",e.onclick=null),this._createManipulatorBar()},e._createManipulatorBar=function(){this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];if(void 0!==this.edgeBeingEdited&&(this.edgeBeingEdited._disableControlNodes(),this.edgeBeingEdited=void 0,this.selectedControlNode=null,this.controlNodesActive=!1),this._restoreOverloadedFunctions(),this.freezeSimulation=!1,this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,1==this.editMode){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDiv.innerHTML=""+t.addNode+"
"+t.addEdge+"",1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?this.manipulationDiv.innerHTML+="
"+t.editNode+"":1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDiv.innerHTML+="
"+t.editEdge+""),0==this._selectionIsEmpty()&&(this.manipulationDiv.innerHTML+="
"+t.del+"");var e=document.getElementById("network-manipulate-addNode");e.onclick=this._createAddNodeToolbar.bind(this);var i=document.getElementById("network-manipulate-connectNode");if(i.onclick=this._createAddEdgeToolbar.bind(this),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit){var s=document.getElementById("network-manipulate-editNode");s.onclick=this._editNode.bind(this)}else if(1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()){var s=document.getElementById("network-manipulate-editEdge");s.onclick=this._createEditEdgeToolbar.bind(this)}if(0==this._selectionIsEmpty()){var o=document.getElementById("network-manipulate-delete");o.onclick=this._deleteSelected.bind(this)}var n=document.getElementById("network-manipulation-closeDiv");n.onclick=this._toggleEditMode.bind(this),this.boundFunction=this._createManipulatorBar.bind(this),this.on("select",this.boundFunction)}else{this.editModeDiv.innerHTML=""+t.edit+"";var r=document.getElementById("network-manipulate-editModeButton");r.onclick=this._toggleEditMode.bind(this)}},e._createAddNodeToolbar=function(){this._clearManipulatorBar(),this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];this.manipulationDiv.innerHTML=""+t.back+"
"+t.addDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._addNode.bind(this),this.on("select",this.boundFunction)},e._createAddEdgeToolbar=function(){this._clearManipulatorBar(),this._unselectAll(!0),this.freezeSimulation=!0;var t=this.constants.locales[this.constants.locale];this.boundFunction&&this.off("select",this.boundFunction),this._unselectAll(),this.forceAppendSelection=!1,this.blockConnectingEdgeSelection=!0,this.manipulationDiv.innerHTML=""+t.back+"
"+t.edgeDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._handleConnect.bind(this),this.on("select",this.boundFunction),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._handleOnRelease=this._handleOnRelease,this._handleTouch=this._handleConnect,this._handleOnRelease=this._finishConnect,this._redraw()},e._createEditEdgeToolbar=function(){this._clearManipulatorBar(),this.controlNodesActive=!0,this.boundFunction&&this.off("select",this.boundFunction),this.edgeBeingEdited=this._getSelectedEdge(),this.edgeBeingEdited._enableControlNodes();var t=this.constants.locales[this.constants.locale];this.manipulationDiv.innerHTML=""+t.back+"
"+t.editEdgeDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._handleOnRelease=this._handleOnRelease,this.cachedFunctions._handleTap=this._handleTap,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleTouch=this._selectControlNode,this._handleTap=function(){},this._handleOnDrag=this._controlNodeDrag,this._handleDragStart=function(){},this._handleOnRelease=this._releaseControlNode,this._redraw()},e._selectControlNode=function(t){this.edgeBeingEdited.controlNodes.from.unselect(),this.edgeBeingEdited.controlNodes.to.unselect(),this.selectedControlNode=this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(t.x),this._YconvertDOMtoCanvas(t.y)),null!==this.selectedControlNode&&(this.selectedControlNode.select(),this.freezeSimulation=!0),this._redraw()},e._controlNodeDrag=function(t){var e=this._getPointer(t.gesture.center);null!==this.selectedControlNode&&void 0!==this.selectedControlNode&&(this.selectedControlNode.x=this._XconvertDOMtoCanvas(e.x),this.selectedControlNode.y=this._YconvertDOMtoCanvas(e.y)),this._redraw()},e._releaseControlNode=function(t){var e=this._getNodeAt(t);null!=e?(1==this.edgeBeingEdited.controlNodes.from.selected&&(this._editEdge(e.id,this.edgeBeingEdited.to.id),this.edgeBeingEdited.controlNodes.from.unselect()),1==this.edgeBeingEdited.controlNodes.to.selected&&(this._editEdge(this.edgeBeingEdited.from.id,e.id),this.edgeBeingEdited.controlNodes.to.unselect())):this.edgeBeingEdited._restoreControlNodes(),this.freezeSimulation=!1,this._redraw()},e._handleConnect=function(t){if(0==this._getSelectedNodeCount()){var e=this._getNodeAt(t);null!=e&&(e.clusterSize>1?alert(this.constants.locales[this.constants.locale].createEdgeError):(this._selectObject(e,!1),this.sectors.support.nodes.targetNode=new o({id:"targetNode"},{},{},this.constants),this.sectors.support.nodes.targetNode.x=e.x,this.sectors.support.nodes.targetNode.y=e.y,this.sectors.support.nodes.targetViaNode=new o({id:"targetViaNode"},{},{},this.constants),this.sectors.support.nodes.targetViaNode.x=e.x,this.sectors.support.nodes.targetViaNode.y=e.y,this.sectors.support.nodes.targetViaNode.parentEdgeId="connectionEdge",this.edges.connectionEdge=new n({id:"connectionEdge",from:e.id,to:this.sectors.support.nodes.targetNode.id},this,this.constants),this.edges.connectionEdge.from=e,this.edges.connectionEdge.connected=!0,this.edges.connectionEdge.smooth=!0,this.edges.connectionEdge.selected=!0,this.edges.connectionEdge.to=this.sectors.support.nodes.targetNode,this.edges.connectionEdge.via=this.sectors.support.nodes.targetViaNode,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleOnDrag=function(t){var e=this._getPointer(t.gesture.center);this.sectors.support.nodes.targetNode.x=this._XconvertDOMtoCanvas(e.x),this.sectors.support.nodes.targetNode.y=this._YconvertDOMtoCanvas(e.y),this.sectors.support.nodes.targetViaNode.x=.5*(this._XconvertDOMtoCanvas(e.x)+this.edges.connectionEdge.from.x),this.sectors.support.nodes.targetViaNode.y=this._YconvertDOMtoCanvas(e.y)},this.moving=!0,this.start()))}},e._finishConnect=function(t){if(1==this._getSelectedNodeCount()){this._handleOnDrag=this.cachedFunctions._handleOnDrag,delete this.cachedFunctions._handleOnDrag;var e=this.edges.connectionEdge.fromId;delete this.edges.connectionEdge,delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode;var i=this._getNodeAt(t);null!=i&&(i.clusterSize>1?alert(this.constants.locales[this.constants.locale].createEdgeError):(this._createEdge(e,i.id),this._createManipulatorBar())),this._unselectAll()}},e._addNode=function(){if(this._selectionIsEmpty()&&1==this.editMode){var t=this._pointerToPositionObject(this.pointerPosition),e={id:s.randomUUID(),x:t.left,y:t.top,label:"new",allowedToMoveX:!0,allowedToMoveY:!0};if(this.triggerFunctions.add){if(2!=this.triggerFunctions.add.length)throw new Error("The function for add does not support two arguments (data,callback)");var i=this;this.triggerFunctions.add(e,function(t){i.nodesData.add(t),i._createManipulatorBar(),i.moving=!0,i.start()})}else this.nodesData.add(e),this._createManipulatorBar(),this.moving=!0,this.start()}},e._createEdge=function(t,e){if(1==this.editMode){var i={from:t,to:e};if(this.triggerFunctions.connect){if(2!=this.triggerFunctions.connect.length)throw new Error("The function for connect does not support two arguments (data,callback)");var s=this;this.triggerFunctions.connect(i,function(t){s.edgesData.add(t),s.moving=!0,s.start()})}else this.edgesData.add(i),this.moving=!0,this.start()}},e._editEdge=function(t,e){if(1==this.editMode){var i={id:this.edgeBeingEdited.id,from:t,to:e};if(this.triggerFunctions.editEdge){if(2!=this.triggerFunctions.editEdge.length)throw new Error("The function for edit does not support two arguments (data, callback)");var s=this;this.triggerFunctions.editEdge(i,function(t){s.edgesData.update(t),s.moving=!0,s.start()})}else this.edgesData.update(i),this.moving=!0,this.start()}},e._editNode=function(){if(!this.triggerFunctions.edit||1!=this.editMode)throw new Error("No edit function has been bound to this button");var t=this._getSelectedNode(),e={id:t.id,label:t.label,group:t.options.group,shape:t.options.shape,color:{background:t.options.color.background,border:t.options.color.border,highlight:{background:t.options.color.highlight.background,border:t.options.color.highlight.border}}};if(2!=this.triggerFunctions.edit.length)throw new Error("The function for edit does not support two arguments (data, callback)");var i=this;this.triggerFunctions.edit(e,function(t){i.nodesData.update(t),i._createManipulatorBar(),i.moving=!0,i.start()})},e._deleteSelected=function(){if(!this._selectionIsEmpty()&&1==this.editMode)if(this._clusterInSelection())alert(this.constants.locales[this.constants.locale].deleteClusterError);else{var t=this.getSelectedNodes(),e=this.getSelectedEdges();if(this.triggerFunctions.del){var i=this,s={nodes:t,edges:e};if(!(this.triggerFunctions.del.length=2))throw new Error("The function for delete does not support two arguments (data, callback)");this.triggerFunctions.del(s,function(t){i.edgesData.remove(t.edges),i.nodesData.remove(t.nodes),i._unselectAll(),i.moving=!0,i.start()})}else this.edgesData.remove(e),this.nodesData.remove(t),this._unselectAll(),this.moving=!0,this.start()}}},function(t,e,i){var s=(i(1),i(41));e._cleanNavigation=function(){var t=document.getElementById("network-navigation_wrapper");t&&t.parentNode&&t.parentNode.removeChild(t),document.onmouseup=null},e._loadNavigationElements=function(){this._cleanNavigation(),this.navigationDivs={};var t=["up","down","left","right","zoomIn","zoomOut","zoomExtends"],e=["_moveUp","_moveDown","_moveLeft","_moveRight","_zoomIn","_zoomOut","zoomExtent"];this.navigationDivs.wrapper=document.createElement("div"),this.navigationDivs.wrapper.id="network-navigation_wrapper",this.frame.appendChild(this.navigationDivs.wrapper);for(var i=this,o=0;o0){"RL"==this.constants.hierarchicalLayout.direction||"DU"==this.constants.hierarchicalLayout.direction?this.constants.hierarchicalLayout.levelSeparation*=-1:this.constants.hierarchicalLayout.levelSeparation=Math.abs(this.constants.hierarchicalLayout.levelSeparation),"RL"==this.constants.hierarchicalLayout.direction||"LR"==this.constants.hierarchicalLayout.direction?1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="vertical"):1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="horizontal");var t,e,i=0,s=!1,o=!1;for(e in this.nodes)this.nodes.hasOwnProperty(e)&&(t=this.nodes[e],-1!=t.level?s=!0:o=!0,is&&(n.xFixed=!1,n.x=i[n.level].minPos,r=!0):n.yFixed&&n.level>s&&(n.yFixed=!1,n.y=i[n.level].minPos,r=!0),1==r&&(i[n.level].minPos+=i[n.level].nodeSpacing,n.edges.length>1&&this._placeBranchNodes(n.edges,n.id,i,n.level))}},e._setLevel=function(t,e,i){for(var s=0;st)&&(o.level=t,e.length>1&&this._setLevel(t+1,o.edges,o.id))}},e._restoreNodes=function(){for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.nodes[t].xFixed=!1,this.nodes[t].yFixed=!1)}},function(t,e,i){function s(){this.constants.smoothCurves.enabled=!this.constants.smoothCurves.enabled;var t=document.getElementById("graph_toggleSmooth");t.style.background=1==this.constants.smoothCurves.enabled?"#A4FF56":"#FF8532",this._configureSmoothCurves(!1)}function o(){for(var t in this.calculationNodes)this.calculationNodes.hasOwnProperty(t)&&(this.calculationNodes[t].vx=0,this.calculationNodes[t].vy=0,this.calculationNodes[t].fx=0,this.calculationNodes[t].fy=0);1==this.constants.hierarchicalLayout.enabled?(this._setupHierarchicalLayout(),a.call(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),a.call(this,"graph_H_cg",1,"physics_centralGravity"),a.call(this,"graph_H_sc",1,"physics_springConstant"),a.call(this,"graph_H_sl",1,"physics_springLength"),a.call(this,"graph_H_damp",1,"physics_damping")):this.repositionNodes(),this.moving=!0,this.start()}function n(){var t="No options are required, default values used.",e=[],i=document.getElementById("graph_physicsMethod1"),s=document.getElementById("graph_physicsMethod2");if(1==i.checked){if(this.constants.physics.barnesHut.gravitationalConstant!=this.backupConstants.physics.barnesHut.gravitationalConstant&&e.push("gravitationalConstant: "+this.constants.physics.barnesHut.gravitationalConstant),this.constants.physics.centralGravity!=this.backupConstants.physics.barnesHut.centralGravity&&e.push("centralGravity: "+this.constants.physics.centralGravity),this.constants.physics.springLength!=this.backupConstants.physics.barnesHut.springLength&&e.push("springLength: "+this.constants.physics.springLength),this.constants.physics.springConstant!=this.backupConstants.physics.barnesHut.springConstant&&e.push("springConstant: "+this.constants.physics.springConstant),this.constants.physics.damping!=this.backupConstants.physics.barnesHut.damping&&e.push("damping: "+this.constants.physics.damping),0!=e.length){t="var options = {",t+="physics: {barnesHut: {";for(var o=0;othis.constants.clustering.clusterThreshold&&1==this.constants.clustering.enabled&&this.clusterToFit(this.constants.clustering.reduceToNodes,!1),this._calculateForces())},e._calculateForces=function(){this._calculateGravitationalForces(),this._calculateNodeForces(),this.constants.physics.springConstant>0&&(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic?this._calculateSpringForcesWithSupport():1==this.constants.physics.hierarchicalRepulsion.enabled?this._calculateHierarchicalSpringForces():this._calculateSpringForces())},e._updateCalculationNodes=function(){if(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic){this.calculationNodes={},this.calculationNodeIndices=[];for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.calculationNodes[t]=this.nodes[t]);var e=this.sectors.support.nodes;for(var i in e)e.hasOwnProperty(i)&&(this.edges.hasOwnProperty(e[i].parentEdgeId)?this.calculationNodes[i]=e[i]:e[i]._setForce(0,0));for(var s in this.calculationNodes)this.calculationNodes.hasOwnProperty(s)&&this.calculationNodeIndices.push(s)}else this.calculationNodes=this.nodes,this.calculationNodeIndices=this.nodeIndices},e._calculateGravitationalForces=function(){var t,e,i,s,o,n=this.calculationNodes,r=this.constants.physics.centralGravity,a=0;for(o=0;oSimulation Mode:Barnes HutRepulsionHierarchical
Options:
',this.containerElement.parentElement.insertBefore(this.physicsConfiguration,this.containerElement),this.optionsDiv=document.createElement("div"),this.optionsDiv.style.fontSize="14px",this.optionsDiv.style.fontFamily="verdana",this.containerElement.parentElement.insertBefore(this.optionsDiv,this.containerElement);var e;e=document.getElementById("graph_BH_gc"),e.onchange=a.bind(this,"graph_BH_gc",-1,"physics_barnesHut_gravitationalConstant"),e=document.getElementById("graph_BH_cg"),e.onchange=a.bind(this,"graph_BH_cg",1,"physics_centralGravity"),e=document.getElementById("graph_BH_sc"),e.onchange=a.bind(this,"graph_BH_sc",1,"physics_springConstant"),e=document.getElementById("graph_BH_sl"),e.onchange=a.bind(this,"graph_BH_sl",1,"physics_springLength"),e=document.getElementById("graph_BH_damp"),e.onchange=a.bind(this,"graph_BH_damp",1,"physics_damping"),e=document.getElementById("graph_R_nd"),e.onchange=a.bind(this,"graph_R_nd",1,"physics_repulsion_nodeDistance"),e=document.getElementById("graph_R_cg"),e.onchange=a.bind(this,"graph_R_cg",1,"physics_centralGravity"),e=document.getElementById("graph_R_sc"),e.onchange=a.bind(this,"graph_R_sc",1,"physics_springConstant"),e=document.getElementById("graph_R_sl"),e.onchange=a.bind(this,"graph_R_sl",1,"physics_springLength"),e=document.getElementById("graph_R_damp"),e.onchange=a.bind(this,"graph_R_damp",1,"physics_damping"),e=document.getElementById("graph_H_nd"),e.onchange=a.bind(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),e=document.getElementById("graph_H_cg"),e.onchange=a.bind(this,"graph_H_cg",1,"physics_centralGravity"),e=document.getElementById("graph_H_sc"),e.onchange=a.bind(this,"graph_H_sc",1,"physics_springConstant"),e=document.getElementById("graph_H_sl"),e.onchange=a.bind(this,"graph_H_sl",1,"physics_springLength"),e=document.getElementById("graph_H_damp"),e.onchange=a.bind(this,"graph_H_damp",1,"physics_damping"),e=document.getElementById("graph_H_direction"),e.onchange=a.bind(this,"graph_H_direction",t,"hierarchicalLayout_direction"),e=document.getElementById("graph_H_levsep"),e.onchange=a.bind(this,"graph_H_levsep",1,"hierarchicalLayout_levelSeparation"),e=document.getElementById("graph_H_nspac"),e.onchange=a.bind(this,"graph_H_nspac",1,"hierarchicalLayout_nodeSpacing");var i=document.getElementById("graph_physicsMethod1"),d=document.getElementById("graph_physicsMethod2"),l=document.getElementById("graph_physicsMethod3");d.checked=!0,this.constants.physics.barnesHut.enabled&&(i.checked=!0),this.constants.hierarchicalLayout.enabled&&(l.checked=!0);var c=document.getElementById("graph_toggleSmooth"),p=document.getElementById("graph_repositionNodes"),u=document.getElementById("graph_generateOptions");c.onclick=s.bind(this),p.onclick=o.bind(this),u.onclick=n.bind(this),c.style.background=1==this.constants.smoothCurves&&0==this.constants.dynamicSmoothCurves?"#A4FF56":"#FF8532",r.apply(this),i.onchange=r.bind(this),d.onchange=r.bind(this),l.onchange=r.bind(this)}},e._overWriteGraphConstants=function(t,e){var i=t.split("_");1==i.length?this.constants[i[0]]=e:2==i.length?this.constants[i[0]][i[1]]=e:3==i.length&&(this.constants[i[0]][i[1]][i[2]]=e)}},function(t,e,i){function s(t){return i(o(t))}function o(t){return n[t]||function(){throw new Error("Cannot find module '"+t+"'.")}()}var n={};s.keys=function(){return Object.keys(n)},s.resolve=o,t.exports=s},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l,c=this.calculationNodes,p=this.calculationNodeIndices,u=-2/3,f=4/3,m=this.constants.physics.repulsion.nodeDistance,g=m;for(d=0;di&&(r=.5*g>i?1:v*i+f,r*=0==n?1:1+n*this.constants.clustering.forceAmplification,r/=i,s=t*r,o=e*r,a.fx-=s,a.fy-=o,h.fx+=s,h.fy+=o)}}},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l=this.calculationNodes,c=this.calculationNodeIndices,p=this.constants.physics.hierarchicalRepulsion.nodeDistance;for(h=0;hi?-Math.pow(u*i,2)+Math.pow(u*p,2):0,0==i?i=.01:n/=i,s=t*n,o=e*n,r.fx-=s,r.fy-=o,a.fx+=s,a.fy+=o}},e._calculateHierarchicalSpringForces=function(){for(var t,e,i,s,o,n,r,a,h,d=this.edges,l=this.calculationNodes,c=this.calculationNodeIndices,p=0;pn;n++)t=e[i[n]],t.options.mass>0&&(this._getForceContribution(o.root.children.NW,t),this._getForceContribution(o.root.children.NE,t),this._getForceContribution(o.root.children.SW,t),this._getForceContribution(o.root.children.SE,t))}},e._getForceContribution=function(t,e){if(t.childrenCount>0){var i,s,o;if(i=t.centerOfMass.x-e.x,s=t.centerOfMass.y-e.y,o=Math.sqrt(i*i+s*s),o*t.calcSize>this.constants.physics.barnesHut.theta){0==o&&(o=.1*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}else if(4==t.childrenCount)this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e);else if(t.children.data.id!=e.id){0==o&&(o=.5*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}}},e._formBarnesHutTree=function(t,e){for(var i,s=e.length,o=Number.MAX_VALUE,n=Number.MAX_VALUE,r=-Number.MAX_VALUE,a=-Number.MAX_VALUE,h=0;s>h;h++){var d=t[e[h]].x,l=t[e[h]].y;t[e[h]].options.mass>0&&(o>d&&(o=d),d>r&&(r=d),n>l&&(n=l),l>a&&(a=l))}var c=Math.abs(r-o)-Math.abs(a-n);c>0?(n-=.5*c,a+=.5*c):(o+=.5*c,r-=.5*c);var p=1e-5,u=Math.max(p,Math.abs(r-o)),f=.5*u,m=.5*(o+r),g=.5*(n+a),v={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:m-f,maxX:m+f,minY:g-f,maxY:g+f},size:u,calcSize:1/u,children:{data:null},maxWidth:0,level:0,childrenCount:4}};for(this._splitBranch(v.root),h=0;s>h;h++)i=t[e[h]],i.options.mass>0&&this._placeInTree(v.root,i);this.barnesHutTree=v},e._updateBranchMass=function(t,e){var i=t.mass+e.options.mass,s=1/i;t.centerOfMass.x=t.centerOfMass.x*t.mass+e.x*e.options.mass,t.centerOfMass.x*=s,t.centerOfMass.y=t.centerOfMass.y*t.mass+e.y*e.options.mass,t.centerOfMass.y*=s,t.mass=i;var o=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NW"):this._placeInRegion(t,e,"SW"):t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NE"):this._placeInRegion(t,e,"SE")},e._placeInRegion=function(t,e,i){switch(t.children[i].childrenCount){case 0:t.children[i].children.data=e,t.children[i].childrenCount=1,this._updateBranchMass(t.children[i],e);break;case 1:t.children[i].children.data.x==e.x&&t.children[i].children.data.y==e.y?(e.x+=Math.random(),e.y+=Math.random()):(this._splitBranch(t.children[i]),this._placeInTree(t.children[i],e));break;case 4:this._placeInTree(t.children[i],e)}},e._splitBranch=function(t){var e=null;1==t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)},e._insertRegion=function(t,e){var i,s,o,n,r=.5*t.size;switch(e){case"NW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY,n=t.range.minY+r;break;case"NE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY,n=t.range.minY+r;break;case"SW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY+r,n=t.range.maxY;break;case"SE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY+r,n=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:s,minY:o,maxY:n},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}},e._drawTree=function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))},e._drawBranch=function(t,e,i){void 0===i&&(i="#FF0000"),4==t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}},function(t){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}}])}); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):"object"==typeof exports?exports.vis=e():t.vis=e()}(this,function(){return function(t){function e(s){if(i[s])return i[s].exports;var o=i[s]={exports:{},id:s,loaded:!1};return t[s].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){e.util=i(1),e.DOMutil=i(6),e.DataSet=i(7),e.DataView=i(8),e.Graph3d=i(9),e.graph3d={Camera:i(13),Filter:i(14),Point2d:i(12),Point3d:i(11),Slider:i(15),StepNumber:i(16)},e.Timeline=i(17),e.Graph2d=i(38),e.timeline={DataStep:i(41),Range:i(20),stack:i(31),TimeStep:i(25),components:{items:{Item:i(33),ItemBox:i(34),ItemPoint:i(35),ItemRange:i(32)},Component:i(22),CurrentTime:i(26),CustomTime:i(28),DataAxis:i(40),GraphGroup:i(42),Group:i(30),ItemSet:i(29),Legend:i(43),LineGraph:i(39),TimeAxis:i(24)}},e.Network=i(44),e.network={Edge:i(50),Groups:i(47),Images:i(48),Node:i(49),Popup:i(51),dotparser:i(45),gephiParser:i(46)},e.Graph=function(){throw new Error("Graph is renamed to Network. Please create a graph as new vis.Network(...)")},e.moment=i(2),e.hammer=i(18)},function(module,exports,__webpack_require__){var moment=__webpack_require__(2);exports.isNumber=function(t){return t instanceof Number||"number"==typeof t},exports.isString=function(t){return t instanceof String||"string"==typeof t},exports.isDate=function(t){if(t instanceof Date)return!0;if(exports.isString(t)){var e=ASPDateRegex.exec(t);if(e)return!0;if(!isNaN(Date.parse(t)))return!0}return!1},exports.isDataTable=function(t){return"undefined"!=typeof google&&google.visualization&&google.visualization.DataTable&&t instanceof google.visualization.DataTable},exports.randomUUID=function(){var t=function(){return Math.floor(65536*Math.random()).toString(16)};return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},exports.extend=function(t){for(var e=1,i=arguments.length;i>e;e++){var s=arguments[e];for(var o in s)s.hasOwnProperty(o)&&(t[o]=s[o])}return t},exports.selectiveExtend=function(t,e){if(!Array.isArray(t))throw new Error("Array with property names expected as first argument");for(var i=2;ii;i++)if(t[i]!=e[i])return!1;return!0},exports.convert=function(t,e){var i;if(void 0===t)return void 0;if(null===t)return null;if(!e)return t;if("string"!=typeof e&&!(e instanceof String))throw new Error("Type must be a string");switch(e){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(moment.isMoment(t))return new Date(t.valueOf());if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])):moment(t).toDate();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"Moment":if(exports.isNumber(t))return moment(t);if(t instanceof Date)return moment(t.valueOf());if(moment.isMoment(t))return moment(t);if(exports.isString(t))return i=ASPDateRegex.exec(t),moment(i?Number(i[1]):t);throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"ISODate":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(moment.isMoment(t))return t.toDate().toISOString();if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])).toISOString():new Date(t).toISOString();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ISODate");case"ASPDate":if(exports.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(exports.isString(t)){i=ASPDateRegex.exec(t);var s;return s=i?new Date(Number(i[1])).valueOf():new Date(t).valueOf(),"/Date("+s+")/"}throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ASPDate");default:throw new Error('Unknown type "'+e+'"')}};var ASPDateRegex=/^\/?Date\((\-?\d+)/i;exports.getType=function(t){var e=typeof t;return"object"==e?null==t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":t instanceof Array?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":e},exports.getAbsoluteLeft=function(t){return t.getBoundingClientRect().left+window.pageXOffset},exports.getAbsoluteTop=function(t){return t.getBoundingClientRect().top+window.pageYOffset},exports.addClassName=function(t,e){var i=t.className.split(" ");-1==i.indexOf(e)&&(i.push(e),t.className=i.join(" "))},exports.removeClassName=function(t,e){var i=t.className.split(" "),s=i.indexOf(e);-1!=s&&(i.splice(s,1),t.className=i.join(" "))},exports.forEach=function(t,e){var i,s;if(t instanceof Array)for(i=0,s=t.length;s>i;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},exports.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e},exports.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},exports.addEventListener=function(t,e,i,s){t.addEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,s)):t.attachEvent("on"+e,i)},exports.removeEventListener=function(t,e,i,s){t.removeEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,s)):t.detachEvent("on"+e,i)},exports.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},exports.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},exports.option={},exports.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},exports.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},exports.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},exports.option.asSize=function(t,e){return"function"==typeof t&&(t=t()),exports.isString(t)?t:exports.isNumber(t)?t+"px":e||null},exports.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},exports.GiveDec=function(Hex){var Value;return Value="A"==Hex?10:"B"==Hex?11:"C"==Hex?12:"D"==Hex?13:"E"==Hex?14:"F"==Hex?15:eval(Hex)},exports.GiveHex=function(t){var e;return e=10==t?"A":11==t?"B":12==t?"C":13==t?"D":14==t?"E":15==t?"F":""+t},exports.parseColor=function(t){var e;if(exports.isString(t)){if(exports.isValidRGB(t)){var i=t.substr(4).substr(0,t.length-5).split(",");t=exports.RGBToHex(i[0],i[1],i[2])}if(exports.isValidHex(t)){var s=exports.hexToHSV(t),o={h:s.h,s:.45*s.s,v:Math.min(1,1.05*s.v)},n={h:s.h,s:Math.min(1,1.25*s.v),v:.6*s.v},r=exports.HSVToHex(n.h,n.h,n.v),a=exports.HSVToHex(o.h,o.s,o.v);e={background:t,border:r,highlight:{background:a,border:r},hover:{background:a,border:r}}}else e={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else e={},e.background=t.background||"white",e.border=t.border||e.background,exports.isString(t.highlight)?e.highlight={border:t.highlight,background:t.highlight}:(e.highlight={},e.highlight.background=t.highlight&&t.highlight.background||e.background,e.highlight.border=t.highlight&&t.highlight.border||e.border),exports.isString(t.hover)?e.hover={border:t.hover,background:t.hover}:(e.hover={},e.hover.background=t.hover&&t.hover.background||e.background,e.hover.border=t.hover&&t.hover.border||e.border);return e},exports.hexToRGB=function(t){t=t.replace("#","").toUpperCase();var e=exports.GiveDec(t.substring(0,1)),i=exports.GiveDec(t.substring(1,2)),s=exports.GiveDec(t.substring(2,3)),o=exports.GiveDec(t.substring(3,4)),n=exports.GiveDec(t.substring(4,5)),r=exports.GiveDec(t.substring(5,6)),a=16*e+i,h=16*s+o,i=16*n+r;return{r:a,g:h,b:i}},exports.RGBToHex=function(t,e,i){var s=exports.GiveHex(Math.floor(t/16)),o=exports.GiveHex(t%16),n=exports.GiveHex(Math.floor(e/16)),r=exports.GiveHex(e%16),a=exports.GiveHex(Math.floor(i/16)),h=exports.GiveHex(i%16),d=s+o+n+r+a+h;return"#"+d},exports.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var s=Math.min(t,Math.min(e,i)),o=Math.max(t,Math.max(e,i));if(s==o)return{h:0,s:0,v:s};var n=t==s?e-i:i==s?t-e:i-t,r=t==s?3:i==s?1:5,a=60*(r-n/(o-s))/360,h=(o-s)/o,d=o;return{h:a,s:h,v:d}},exports.HSVToRGB=function(t,e,i){var s,o,n,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:s=i,o=l,n=h;break;case 1:s=d,o=i,n=h;break;case 2:s=h,o=i,n=l;break;case 3:s=h,o=d,n=i;break;case 4:s=l,o=h,n=i;break;case 5:s=i,o=h,n=d}return{r:Math.floor(255*s),g:Math.floor(255*o),b:Math.floor(255*n)}},exports.HSVToHex=function(t,e,i){var s=exports.HSVToRGB(t,e,i);return exports.RGBToHex(s.r,s.g,s.b)},exports.hexToHSV=function(t){var e=exports.hexToRGB(t);return exports.RGBToHSV(e.r,e.g,e.b)},exports.isValidHex=function(t){var e=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t);return e},exports.isValidRGB=function(t){t=t.replace(" ","");var e=/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t);return e},exports.selectiveBridgeObject=function(t,e){if("object"==typeof e){for(var i=Object.create(e),s=0;sa;)o=void 0===s?n[u][i]:n[u][i][s],n[u].isVisible(e)?h=!0:(o=r&&console.log("BinarySearch too many iterations. Aborting.")}return u},exports.binarySearchGeneric=function(t,e,i,s){var o,n,r,a,h=1e4,d=0,l=t,c=!1,p=0,u=l.length,f=p,g=u,m=Math.floor(.5*(u+p));if(0==u)m=-1;else if(1==u)r=l[m][i],m=r==e?0:-1;else{for(u-=1;0==c&&h>d;)n=l[Math.max(0,m-1)][i],r=l[m][i],a=l[Math.min(l.length-1,m+1)][i],r==e||e>n&&r>e||e>r&&a>e?(c=!0,r!=e&&("before"==s?e>n&&r>e&&(m=Math.max(0,m-1)):e>r&&a>e&&(m=Math.min(l.length-1,m+1)))):(e>r?f=Math.floor(.5*(u+p)):g=Math.floor(.5*(u+p)),o=Math.floor(.5*(u+p)),p==f&&u==g?(m=-1,c=!0):(u=g,p=f,m=Math.floor(.5*(u+p)))),d++;d>=h&&console.log("BinarySearch too many iterations. Aborting.")}return m}},function(t,e,i){t.exports="undefined"!=typeof window&&window.moment||i(3)},function(t,e,i){var s;(function(t,o){(function(n){function r(t,e,i){switch(arguments.length){case 2:return null!=t?t:e;case 3:return null!=t?t:null!=e?e:i;default:throw new Error("Implement me")}}function a(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function h(t,e){function i(){ve.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}var s=!0;return f(function(){return s&&(i(),s=!1),e.apply(this,arguments)},e)}function d(t,e){return function(i){return v(t.call(this,i),e)}}function l(t,e){return function(i){return this.lang().ordinal(t.call(this,i),e)}}function c(){}function p(t){L(t),f(this,t)}function u(t){var e=S(t),i=e.year||0,s=e.quarter||0,o=e.month||0,n=e.week||0,r=e.day||0,a=e.hour||0,h=e.minute||0,d=e.second||0,l=e.millisecond||0;this._milliseconds=+l+1e3*d+6e4*h+36e5*a,this._days=+r+7*n,this._months=+o+3*s+12*i,this._data={},this._bubble()}function f(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return e.hasOwnProperty("toString")&&(t.toString=e.toString),e.hasOwnProperty("valueOf")&&(t.valueOf=e.valueOf),t}function g(t){var e,i={};for(e in t)t.hasOwnProperty(e)&&ke.hasOwnProperty(e)&&(i[e]=t[e]);return i}function m(t){return 0>t?Math.ceil(t):Math.floor(t)}function v(t,e,i){for(var s=""+Math.abs(t),o=t>=0;s.lengths;s++)(i&&t[s]!==e[s]||!i&&C(t[s])!==C(e[s]))&&r++;return r+n}function w(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=ri[t]||ai[e]||e}return t}function S(t){var e,i,s={};for(i in t)t.hasOwnProperty(i)&&(e=w(i),e&&(s[e]=t[i]));return s}function M(t){var e,i;if(0===t.indexOf("week"))e=7,i="day";else{if(0!==t.indexOf("month"))return;e=12,i="month"}ve[t]=function(s,o){var r,a,h=ve.fn._lang[t],d=[];if("number"==typeof s&&(o=s,s=n),a=function(t){var e=ve().utc().set(i,t);return h.call(ve.fn._lang,e,s||"")},null!=o)return a(o);for(r=0;e>r;r++)d.push(a(r));return d}}function C(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function E(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function D(t,e,i){return re(ve([t,11,31+e-i]),e,i).week}function T(t){return O(t)?366:365}function O(t){return t%4===0&&t%100!==0||t%400===0}function L(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[Me]<0||t._a[Me]>11?Me:t._a[Ce]<1||t._a[Ce]>E(t._a[Se],t._a[Me])?Ce:t._a[Ee]<0||t._a[Ee]>23?Ee:t._a[De]<0||t._a[De]>59?De:t._a[Te]<0||t._a[Te]>59?Te:t._a[Oe]<0||t._a[Oe]>999?Oe:-1,t._pf._overflowDayOfYear&&(Se>e||e>Ce)&&(e=Ce),t._pf.overflow=e)}function k(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length)),t._isValid}function N(t){return t?t.toLowerCase().replace("_","-"):t}function I(t,e){return e._isUTC?ve(t).zone(e._offset||0):ve(t).local()}function A(t,e){return e.abbr=t,Le[t]||(Le[t]=new c),Le[t].set(e),Le[t]}function z(t){delete Le[t]}function P(t){var e,s,o,n,r=0,a=function(t){if(!Le[t]&&Ne)try{i(4)("./"+t)}catch(e){}return Le[t]};if(!t)return ve.fn._lang;if(!b(t)){if(s=a(t))return s;t=[t]}for(;r0;){if(s=a(n.slice(0,e).join("-")))return s;if(o&&o.length>=e&&x(n,o,!0)>=e-1)break;e--}r++}return ve.fn._lang}function R(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function F(t){var e,i,s=t.match(Pe);for(e=0,i=s.length;i>e;e++)s[e]=pi[s[e]]?pi[s[e]]:R(s[e]);return function(o){var n="";for(e=0;i>e;e++)n+=s[e]instanceof Function?s[e].call(o,t):s[e];return n}}function H(t,e){return t.isValid()?(e=Y(e,t.lang()),hi[e]||(hi[e]=F(e)),hi[e](t)):t.lang().invalidDate()}function Y(t,e){function i(t){return e.longDateFormat(t)||t}var s=5;for(Re.lastIndex=0;s>=0&&Re.test(t);)t=t.replace(Re,i),Re.lastIndex=0,s-=1;return t}function B(t,e){var i,s=e._strict;switch(t){case"Q":return Ze;case"DDDD":return Ke;case"YYYY":case"GGGG":case"gggg":return s?$e:Ye;case"Y":case"G":case"g":return Qe;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return s?Je:Be;case"S":if(s)return Ze;case"SS":if(s)return qe;case"SSS":if(s)return Ke;case"DDD":return He;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Ge;case"a":case"A":return P(e._l)._meridiemParse;case"X":return Ve;case"Z":case"ZZ":return je;case"T":return Ue;case"SSSS":return We;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return s?qe:Fe;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Fe;case"Do":return Xe;default:return i=new RegExp(K(q(t.replace("\\","")),"i"))}}function W(t){t=t||"";var e=t.match(je)||[],i=e[e.length-1]||[],s=(i+"").match(oi)||["-",0,0],o=+(60*s[1])+C(s[2]);return"+"===s[0]?-o:o}function G(t,e,i){var s,o=i._a;switch(t){case"Q":null!=e&&(o[Me]=3*(C(e)-1));break;case"M":case"MM":null!=e&&(o[Me]=C(e)-1);break;case"MMM":case"MMMM":s=P(i._l).monthsParse(e),null!=s?o[Me]=s:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(o[Ce]=C(e));break;case"Do":null!=e&&(o[Ce]=C(parseInt(e,10)));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=C(e));break;case"YY":o[Se]=ve.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":o[Se]=C(e);break;case"a":case"A":i._isPm=P(i._l).isPM(e);break;case"H":case"HH":case"h":case"hh":o[Ee]=C(e);break;case"m":case"mm":o[De]=C(e);break;case"s":case"ss":o[Te]=C(e);break;case"S":case"SS":case"SSS":case"SSSS":o[Oe]=C(1e3*("0."+e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=W(e);break;case"dd":case"ddd":case"dddd":s=P(i._l).weekdaysParse(e),null!=s?(i._w=i._w||{},i._w.d=s):i._pf.invalidWeekday=e;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":t=t.substr(0,1);case"gggg":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=C(e));break;case"gg":case"GG":i._w=i._w||{},i._w[t]=ve.parseTwoDigitYear(e)}}function j(t){var e,i,s,o,n,a,h,d;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(n=1,a=4,i=r(e.GG,t._a[Se],re(ve(),1,4).year),s=r(e.W,1),o=r(e.E,1)):(d=P(t._l),n=d._week.dow,a=d._week.doy,i=r(e.gg,t._a[Se],re(ve(),n,a).year),s=r(e.w,1),null!=e.d?(o=e.d,n>o&&++s):o=null!=e.e?e.e+n:n),h=ae(i,s,o,a,n),t._a[Se]=h.year,t._dayOfYear=h.dayOfYear}function U(t){var e,i,s,o,n=[];if(!t._d){for(s=X(t),t._w&&null==t._a[Ce]&&null==t._a[Me]&&j(t),t._dayOfYear&&(o=r(t._a[Se],s[Se]),t._dayOfYear>T(o)&&(t._pf._overflowDayOfYear=!0),i=ie(o,0,t._dayOfYear),t._a[Me]=i.getUTCMonth(),t._a[Ce]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=n[e]=s[e];for(;7>e;e++)t._a[e]=n[e]=null==t._a[e]?2===e?1:0:t._a[e];t._d=(t._useUTC?ie:ee).apply(null,n),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()+t._tzm)}}function V(t){var e;t._d||(e=S(t._i),t._a=[e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond],U(t))}function X(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function Z(t){if(t._f===ve.ISO_8601)return void J(t);t._a=[],t._pf.empty=!0;var e,i,s,o,n,r=P(t._l),a=""+t._i,h=a.length,d=0;for(s=Y(t._f,r).match(Pe)||[],e=0;e0&&t._pf.unusedInput.push(n),a=a.slice(a.indexOf(i)+i.length),d+=i.length),pi[o]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(o),G(o,i,t)):t._strict&&!i&&t._pf.unusedTokens.push(o);t._pf.charsLeftOver=h-d,a.length>0&&t._pf.unusedInput.push(a),t._isPm&&t._a[Ee]<12&&(t._a[Ee]+=12),t._isPm===!1&&12===t._a[Ee]&&(t._a[Ee]=0),U(t),L(t)}function q(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,s,o){return e||i||s||o})}function K(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function $(t){var e,i,s,o,n;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(o=0;on)&&(s=n,i=e));f(t,i||e)}function J(t){var e,i,s=t._i,o=ti.exec(s);if(o){for(t._pf.iso=!0,e=0,i=ii.length;i>e;e++)if(ii[e][1].exec(s)){t._f=ii[e][0]+(o[6]||" ");break}for(e=0,i=si.length;i>e;e++)if(si[e][1].exec(s)){t._f+=si[e][0];break}s.match(je)&&(t._f+="Z"),Z(t)}else t._isValid=!1}function Q(t){J(t),t._isValid===!1&&(delete t._isValid,ve.createFromInputFallback(t))}function te(t){var e=t._i,i=Ie.exec(e);e===n?t._d=new Date:i?t._d=new Date(+i[1]):"string"==typeof e?Q(t):b(e)?(t._a=e.slice(0),U(t)):_(e)?t._d=new Date(+e):"object"==typeof e?V(t):"number"==typeof e?t._d=new Date(e):ve.createFromInputFallback(t)}function ee(t,e,i,s,o,n,r){var a=new Date(t,e,i,s,o,n,r);return 1970>t&&a.setFullYear(t),a}function ie(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function se(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function oe(t,e,i,s,o){return o.relativeTime(e||1,!!i,t,s)}function ne(t,e,i){var s=we(Math.abs(t)/1e3),o=we(s/60),n=we(o/60),r=we(n/24),a=we(r/365),h=s0,h[4]=i,oe.apply({},h)}function re(t,e,i){var s,o=i-e,n=i-t.day();return n>o&&(n-=7),o-7>n&&(n+=7),s=ve(t).add("d",n),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function ae(t,e,i,s,o){var n,r,a=ie(t,0,1).getUTCDay();return a=0===a?7:a,i=null!=i?i:o,n=o-a+(a>s?7:0)-(o>a?7:0),r=7*(e-1)+(i-o)+n+1,{year:r>0?t:t-1,dayOfYear:r>0?r:T(t-1)+r}}function he(t){var e=t._i,i=t._f;return null===e||i===n&&""===e?ve.invalid({nullInput:!0}):("string"==typeof e&&(t._i=e=P().preparse(e)),ve.isMoment(e)?(t=g(e),t._d=new Date(+e._d)):i?b(i)?$(t):Z(t):te(t),new p(t))}function de(t,e){var i,s;if(1===e.length&&b(e[0])&&(e=e[0]),!e.length)return ve();for(i=e[0],s=1;s=0?"+":"-";return e+v(Math.abs(t),6)},gg:function(){return v(this.weekYear()%100,2)},gggg:function(){return v(this.weekYear(),4)},ggggg:function(){return v(this.weekYear(),5)},GG:function(){return v(this.isoWeekYear()%100,2)},GGGG:function(){return v(this.isoWeekYear(),4)},GGGGG:function(){return v(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return C(this.milliseconds()/100)},SS:function(){return v(C(this.milliseconds()/10),2)},SSS:function(){return v(this.milliseconds(),3)},SSSS:function(){return v(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+v(C(t/60),2)+":"+v(C(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+v(C(t/60),2)+v(C(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},ui=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];li.length;)be=li.pop(),pi[be+"o"]=l(pi[be],be);for(;ci.length;)be=ci.pop(),pi[be+be]=d(pi[be],2);for(pi.DDDD=d(pi.DDD,3),f(c.prototype,{set:function(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t){var e,i,s;for(this._monthsParse||(this._monthsParse=[]),e=0;12>e;e++)if(this._monthsParse[e]||(i=ve.utc([2e3,e]),s="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[e]=new RegExp(s.replace(".",""),"i")),this._monthsParse[e].test(t))return e},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,i,s;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(i=ve([2e3,1]).day(e),s="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(s.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e){var i=this._calendar[t];return"function"==typeof i?i.apply(e):i},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,i,s){var o=this._relativeTime[i];return"function"==typeof o?o(t,e,i,s):o.replace(/%d/i,t)},pastFuture:function(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",preparse:function(t){return t},postformat:function(t){return t},week:function(t){return re(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),ve=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._i=t,o._f=e,o._l=i,o._strict=s,o._isUTC=!1,o._pf=a(),he(o)},ve.suppressDeprecationWarnings=!1,ve.createFromInputFallback=h("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i)}),ve.min=function(){var t=[].slice.call(arguments,0);return de("isBefore",t)},ve.max=function(){var t=[].slice.call(arguments,0);return de("isAfter",t)},ve.utc=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._useUTC=!0,o._isUTC=!0,o._l=i,o._i=t,o._f=e,o._strict=s,o._pf=a(),he(o).utc()},ve.unix=function(t){return ve(1e3*t)},ve.duration=function(t,e){var i,s,o,n=t,r=null;return ve.isDuration(t)?n={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(n={},e?n[e]=t:n.milliseconds=t):(r=Ae.exec(t))?(i="-"===r[1]?-1:1,n={y:0,d:C(r[Ce])*i,h:C(r[Ee])*i,m:C(r[De])*i,s:C(r[Te])*i,ms:C(r[Oe])*i}):(r=ze.exec(t))&&(i="-"===r[1]?-1:1,o=function(t){var e=t&&parseFloat(t.replace(",",".")); +return(isNaN(e)?0:e)*i},n={y:o(r[2]),M:o(r[3]),d:o(r[4]),h:o(r[5]),m:o(r[6]),s:o(r[7]),w:o(r[8])}),s=new u(n),ve.isDuration(t)&&t.hasOwnProperty("_lang")&&(s._lang=t._lang),s},ve.version=_e,ve.defaultFormat=ei,ve.ISO_8601=function(){},ve.momentProperties=ke,ve.updateOffset=function(){},ve.relativeTimeThreshold=function(t,e){return di[t]===n?!1:(di[t]=e,!0)},ve.lang=function(t,e){var i;return t?(e?A(N(t),e):null===e?(z(t),t="en"):Le[t]||P(t),i=ve.duration.fn._lang=ve.fn._lang=P(t),i._abbr):ve.fn._lang._abbr},ve.langData=function(t){return t&&t._lang&&t._lang._abbr&&(t=t._lang._abbr),P(t)},ve.isMoment=function(t){return t instanceof p||null!=t&&t.hasOwnProperty("_isAMomentObject")},ve.isDuration=function(t){return t instanceof u},be=ui.length-1;be>=0;--be)M(ui[be]);ve.normalizeUnits=function(t){return w(t)},ve.invalid=function(t){var e=ve.utc(0/0);return null!=t?f(e._pf,t):e._pf.userInvalidated=!0,e},ve.parseZone=function(){return ve.apply(null,arguments).parseZone()},ve.parseTwoDigitYear=function(t){return C(t)+(C(t)>68?1900:2e3)},f(ve.fn=p.prototype,{clone:function(){return ve(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var t=ve(this).utc();return 00:!1},parsingFlags:function(){return f({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(t){var e=H(this,t||ve.defaultFormat);return this.lang().postformat(e)},add:function(t,e){var i;return i="string"==typeof t&&"string"==typeof e?ve.duration(isNaN(+e)?+t:+e,isNaN(+e)?e:t):"string"==typeof t?ve.duration(+e,t):ve.duration(t,e),y(this,i,1),this},subtract:function(t,e){var i;return i="string"==typeof t&&"string"==typeof e?ve.duration(isNaN(+e)?+t:+e,isNaN(+e)?e:t):"string"==typeof t?ve.duration(+e,t):ve.duration(t,e),y(this,i,-1),this},diff:function(t,e,i){var s,o,n=I(t,this),r=6e4*(this.zone()-n.zone());return e=w(e),"year"===e||"month"===e?(s=432e5*(this.daysInMonth()+n.daysInMonth()),o=12*(this.year()-n.year())+(this.month()-n.month()),o+=(this-ve(this).startOf("month")-(n-ve(n).startOf("month")))/s,o-=6e4*(this.zone()-ve(this).startOf("month").zone()-(n.zone()-ve(n).startOf("month").zone()))/s,"year"===e&&(o/=12)):(s=this-n,o="second"===e?s/1e3:"minute"===e?s/6e4:"hour"===e?s/36e5:"day"===e?(s-r)/864e5:"week"===e?(s-r)/6048e5:s),i?o:m(o)},from:function(t,e){return ve.duration(this.diff(t)).lang(this.lang()._abbr).humanize(!e)},fromNow:function(t){return this.from(ve(),t)},calendar:function(t){var e=t||ve(),i=I(e,this).startOf("day"),s=this.diff(i,"days",!0),o=-6>s?"sameElse":-1>s?"lastWeek":0>s?"lastDay":1>s?"sameDay":2>s?"nextDay":7>s?"nextWeek":"sameElse";return this.format(this.lang().calendar(o,this))},isLeapYear:function(){return O(this.year())},isDST:function(){return this.zone()+ve(t).startOf(e)},isBefore:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)<+ve(t).startOf(e)},isSame:function(t,e){return e=e||"ms",+this.clone().startOf(e)===+I(t,this).startOf(e)},min:h("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(t){return t=ve.apply(null,arguments),this>t?this:t}),max:h("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(t){return t=ve.apply(null,arguments),t>this?this:t}),zone:function(t,e){var i=this._offset||0;return null==t?this._isUTC?i:this._d.getTimezoneOffset():("string"==typeof t&&(t=W(t)),Math.abs(t)<16&&(t=60*t),this._offset=t,this._isUTC=!0,i!==t&&(!e||this._changeInProgress?y(this,ve.duration(i-t,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,ve.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(t){return t=t?ve(t).zone():0,(this.zone()-t)%60===0},daysInMonth:function(){return E(this.year(),this.month())},dayOfYear:function(t){var e=we((ve(this).startOf("day")-ve(this).startOf("year"))/864e5)+1;return null==t?e:this.add("d",t-e)},quarter:function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},weekYear:function(t){var e=re(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==t?e:this.add("y",t-e)},isoWeekYear:function(t){var e=re(this,1,4).year;return null==t?e:this.add("y",t-e)},week:function(t){var e=this.lang().week(this);return null==t?e:this.add("d",7*(t-e))},isoWeek:function(t){var e=re(this,1,4).week;return null==t?e:this.add("d",7*(t-e))},weekday:function(t){var e=(this.day()+7-this.lang()._week.dow)%7;return null==t?e:this.add("d",t-e)},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},isoWeeksInYear:function(){return D(this.year(),1,4)},weeksInYear:function(){var t=this._lang._week;return D(this.year(),t.dow,t.doy)},get:function(t){return t=w(t),this[t]()},set:function(t,e){return t=w(t),"function"==typeof this[t]&&this[t](e),this},lang:function(t){return t===n?this._lang:(this._lang=P(t),this)}}),ve.fn.millisecond=ve.fn.milliseconds=ue("Milliseconds",!1),ve.fn.second=ve.fn.seconds=ue("Seconds",!1),ve.fn.minute=ve.fn.minutes=ue("Minutes",!1),ve.fn.hour=ve.fn.hours=ue("Hours",!0),ve.fn.date=ue("Date",!0),ve.fn.dates=h("dates accessor is deprecated. Use date instead.",ue("Date",!0)),ve.fn.year=ue("FullYear",!0),ve.fn.years=h("years accessor is deprecated. Use year instead.",ue("FullYear",!0)),ve.fn.days=ve.fn.day,ve.fn.months=ve.fn.month,ve.fn.weeks=ve.fn.week,ve.fn.isoWeeks=ve.fn.isoWeek,ve.fn.quarters=ve.fn.quarter,ve.fn.toJSON=ve.fn.toISOString,f(ve.duration.fn=u.prototype,{_bubble:function(){var t,e,i,s,o=this._milliseconds,n=this._days,r=this._months,a=this._data;a.milliseconds=o%1e3,t=m(o/1e3),a.seconds=t%60,e=m(t/60),a.minutes=e%60,i=m(e/60),a.hours=i%24,n+=m(i/24),a.days=n%30,r+=m(n/30),a.months=r%12,s=m(r/12),a.years=s},weeks:function(){return m(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*C(this._months/12)},humanize:function(t){var e=+this,i=ne(e,!t,this.lang());return t&&(i=this.lang().pastFuture(e,i)),this.lang().postformat(i)},add:function(t,e){var i=ve.duration(t,e);return this._milliseconds+=i._milliseconds,this._days+=i._days,this._months+=i._months,this._bubble(),this},subtract:function(t,e){var i=ve.duration(t,e);return this._milliseconds-=i._milliseconds,this._days-=i._days,this._months-=i._months,this._bubble(),this},get:function(t){return t=w(t),this[t.toLowerCase()+"s"]()},as:function(t){return t=w(t),this["as"+t.charAt(0).toUpperCase()+t.slice(1)+"s"]()},lang:ve.fn.lang,toIsoString:function(){var t=Math.abs(this.years()),e=Math.abs(this.months()),i=Math.abs(this.days()),s=Math.abs(this.hours()),o=Math.abs(this.minutes()),n=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(t?t+"Y":"")+(e?e+"M":"")+(i?i+"D":"")+(s||o||n?"T":"")+(s?s+"H":"")+(o?o+"M":"")+(n?n+"S":""):"P0D"}});for(be in ni)ni.hasOwnProperty(be)&&(ge(be,ni[be]),fe(be.toLowerCase()));ge("Weeks",6048e5),ve.duration.fn.asMonths=function(){return(+this-31536e6*this.years())/2592e6+12*this.years()},ve.lang("en",{ordinal:function(t){var e=t%10,i=1===C(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),Ne?o.exports=ve:(s=function(t,e,i){return i.config&&i.config()&&i.config().noGlobal===!0&&(xe.moment=ye),ve}.call(e,i,e,o),!(s!==n&&(o.exports=s)),me(!0))}).call(this)}).call(e,function(){return this}(),i(5)(t))},function(t,e,i){function s(t){return i(o(t))}function o(t){return n[t]||function(){throw new Error("Cannot find module '"+t+"'.")}()}var n={};s.keys=function(){return Object.keys(n)},s.resolve=o,t.exports=s},function(t){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}},function(t,e){e.prepareElements=function(t){for(var e in t)t.hasOwnProperty(e)&&(t[e].redundant=t[e].used,t[e].used=[])},e.cleanupElements=function(t){for(var e in t)if(t.hasOwnProperty(e)&&t[e].redundant){for(var i=0;i0?(s=e[t].redundant[0],e[t].redundant.shift()):(s=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(s)):(s=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(s)),e[t].used.push(s),s},e.getDOMElement=function(t,e,i){var s;return e.hasOwnProperty(t)?e[t].redundant.length>0?(s=e[t].redundant[0],e[t].redundant.shift()):(s=document.createElement(t),i.appendChild(s)):(s=document.createElement(t),e[t]={used:[],redundant:[]},i.appendChild(s)),e[t].used.push(s),s},e.drawPoint=function(t,i,s,o,n){var r;return"circle"==s.options.drawPoints.style?(r=e.getSVGElement("circle",o,n),r.setAttributeNS(null,"cx",t),r.setAttributeNS(null,"cy",i),r.setAttributeNS(null,"r",.5*s.options.drawPoints.size),r.setAttributeNS(null,"class",s.className+" point")):(r=e.getSVGElement("rect",o,n),r.setAttributeNS(null,"x",t-.5*s.options.drawPoints.size),r.setAttributeNS(null,"y",i-.5*s.options.drawPoints.size),r.setAttributeNS(null,"width",s.options.drawPoints.size),r.setAttributeNS(null,"height",s.options.drawPoints.size),r.setAttributeNS(null,"class",s.className+" point")),r},e.drawBar=function(t,i,s,o,n,r,a){var h=e.getSVGElement("rect",r,a);h.setAttributeNS(null,"x",t-.5*s),h.setAttributeNS(null,"y",i),h.setAttributeNS(null,"width",s),h.setAttributeNS(null,"height",o),h.setAttributeNS(null,"class",n)}},function(t,e,i){function s(t,e){if(!t||Array.isArray(t)||o.isDataTable(t)||(e=t,t=null),this._options=e||{},this._data={},this._fieldId=this._options.fieldId||"id",this._type={},this._options.type)for(var i in this._options.type)if(this._options.type.hasOwnProperty(i)){var s=this._options.type[i];this._type[i]="Date"==s||"ISODate"==s||"ASPDate"==s?"Date":s}if(this._options.convert)throw new Error('Option "convert" is deprecated. Use "type" instead.');this._subscribers={},t&&this.add(t)}var o=i(1);s.prototype.on=function(t,e){var i=this._subscribers[t];i||(i=[],this._subscribers[t]=i),i.push({callback:e})},s.prototype.subscribe=s.prototype.on,s.prototype.off=function(t,e){var i=this._subscribers[t];i&&(this._subscribers[t]=i.filter(function(t){return t.callback!=e}))},s.prototype.unsubscribe=s.prototype.off,s.prototype._trigger=function(t,e,i){if("*"==t)throw new Error("Cannot trigger event *");var s=[];t in this._subscribers&&(s=s.concat(this._subscribers[t])),"*"in this._subscribers&&(s=s.concat(this._subscribers["*"]));for(var o=0;or;r++)i=n._addItem(t[r]),s.push(i);else if(o.isDataTable(t))for(var h=this._getColumnNames(t),d=0,l=t.getNumberOfRows();l>d;d++){for(var c={},p=0,u=h.length;u>p;p++){var f=h[p];c[f]=t.getValue(d,p)}i=n._addItem(c),s.push(i)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");i=n._addItem(t),s.push(i)}return s.length&&this._trigger("add",{items:s},e),s},s.prototype.update=function(t,e){var i=[],s=[],n=this,r=n._fieldId,a=function(t){var e=t[r];n._data[e]?(e=n._updateItem(t),s.push(e)):(e=n._addItem(t),i.push(e))};if(Array.isArray(t))for(var h=0,d=t.length;d>h;h++)a(t[h]);else if(o.isDataTable(t))for(var l=this._getColumnNames(t),c=0,p=t.getNumberOfRows();p>c;c++){for(var u={},f=0,g=l.length;g>f;f++){var m=l[f];u[m]=t.getValue(c,f)}a(u)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");a(t)}return i.length&&this._trigger("add",{items:i},e),s.length&&this._trigger("update",{items:s},e),i.concat(s)},s.prototype.get=function(){var t,e,i,s,n=this,r=o.getType(arguments[0]);"String"==r||"Number"==r?(t=arguments[0],i=arguments[1],s=arguments[2]):"Array"==r?(e=arguments[0],i=arguments[1],s=arguments[2]):(i=arguments[0],s=arguments[1]);var a;if(i&&i.returnType){var h=["DataTable","Array","Object"];if(a=-1==h.indexOf(i.returnType)?"Array":i.returnType,s&&a!=o.getType(s))throw new Error('Type of parameter "data" ('+o.getType(s)+") does not correspond with specified options.type ("+i.type+")");if("DataTable"==a&&!o.isDataTable(s))throw new Error('Parameter "data" must be a DataTable when options.type is "DataTable"')}else a=s&&"DataTable"==o.getType(s)?"DataTable":"Array";var d,l,c,p,u=i&&i.type||this._options.type,f=i&&i.filter,g=[];if(void 0!=t)d=n._getItem(t,u),f&&!f(d)&&(d=null);else if(void 0!=e)for(c=0,p=e.length;p>c;c++)d=n._getItem(e[c],u),(!f||f(d))&&g.push(d);else for(l in this._data)this._data.hasOwnProperty(l)&&(d=n._getItem(l,u),(!f||f(d))&&g.push(d));if(i&&i.order&&void 0==t&&this._sort(g,i.order),i&&i.fields){var m=i.fields;if(void 0!=t)d=this._filterFields(d,m);else for(c=0,p=g.length;p>c;c++)g[c]=this._filterFields(g[c],m)}if("DataTable"==a){var v=this._getColumnNames(s);if(void 0!=t)n._appendRow(s,v,d);else for(c=0;cc;c++)s.push(g[c]);return s}return g},s.prototype.getIds=function(t){var e,i,s,o,n,r=this._data,a=t&&t.filter,h=t&&t.order,d=t&&t.type||this._options.type,l=[];if(a)if(h){n=[];for(s in r)r.hasOwnProperty(s)&&(o=this._getItem(s,d),a(o)&&n.push(o));for(this._sort(n,h),e=0,i=n.length;i>e;e++)l[e]=n[e][this._fieldId]}else for(s in r)r.hasOwnProperty(s)&&(o=this._getItem(s,d),a(o)&&l.push(o[this._fieldId]));else if(h){n=[];for(s in r)r.hasOwnProperty(s)&&n.push(r[s]);for(this._sort(n,h),e=0,i=n.length;i>e;e++)l[e]=n[e][this._fieldId]}else for(s in r)r.hasOwnProperty(s)&&(o=r[s],l.push(o[this._fieldId]));return l},s.prototype.getDataSet=function(){return this},s.prototype.forEach=function(t,e){var i,s,o=e&&e.filter,n=e&&e.type||this._options.type,r=this._data;if(e&&e.order)for(var a=this.get(e),h=0,d=a.length;d>h;h++)i=a[h],s=i[this._fieldId],t(i,s);else for(s in r)r.hasOwnProperty(s)&&(i=this._getItem(s,n),(!o||o(i))&&t(i,s))},s.prototype.map=function(t,e){var i,s=e&&e.filter,o=e&&e.type||this._options.type,n=[],r=this._data;for(var a in r)r.hasOwnProperty(a)&&(i=this._getItem(a,o),(!s||s(i))&&n.push(t(i,a)));return e&&e.order&&this._sort(n,e.order),n},s.prototype._filterFields=function(t,e){var i={};for(var s in t)t.hasOwnProperty(s)&&-1!=e.indexOf(s)&&(i[s]=t[s]);return i},s.prototype._sort=function(t,e){if(o.isString(e)){var i=e;t.sort(function(t,e){var s=t[i],o=e[i];return s>o?1:o>s?-1:0})}else{if("function"!=typeof e)throw new TypeError("Order must be a function or a string");t.sort(e)}},s.prototype.remove=function(t,e){var i,s,o,n=[];if(Array.isArray(t))for(i=0,s=t.length;s>i;i++)o=this._remove(t[i]),null!=o&&n.push(o);else o=this._remove(t),null!=o&&n.push(o);return n.length&&this._trigger("remove",{items:n},e),n},s.prototype._remove=function(t){if(o.isNumber(t)||o.isString(t)){if(this._data[t])return delete this._data[t],t}else if(t instanceof Object){var e=t[this._fieldId];if(e&&this._data[e])return delete this._data[e],e}return null},s.prototype.clear=function(t){var e=Object.keys(this._data);return this._data={},this._trigger("remove",{items:e},t),e},s.prototype.max=function(t){var e=this._data,i=null,s=null;for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],r=n[t];null!=r&&(!i||r>s)&&(i=n,s=r)}return i},s.prototype.min=function(t){var e=this._data,i=null,s=null;for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],r=n[t];null!=r&&(!i||s>r)&&(i=n,s=r)}return i},s.prototype.distinct=function(t){var e,i=this._data,s=[],n=this._options.type&&this._options.type[t]||null,r=0;for(var a in i)if(i.hasOwnProperty(a)){var h=i[a],d=h[t],l=!1;for(e=0;r>e;e++)if(s[e]==d){l=!0;break}l||void 0===d||(s[r]=d,r++)}if(n)for(e=0;ei;i++)e[i]=t.getColumnId(i)||t.getColumnLabel(i);return e},s.prototype._appendRow=function(t,e,i){for(var s=t.addRow(),o=0,n=e.length;n>o;o++){var r=e[o];t.setValue(s,o,i[r])}},t.exports=s},function(t,e,i){function s(t,e){this._data=null,this._ids={},this._options=e||{},this._fieldId="id",this._subscribers={};var i=this;this.listener=function(){i._onEvent.apply(i,arguments)},this.setData(t)}var o=i(1),n=i(7);s.prototype.setData=function(t){var e,i,s;if(this._data){this._data.unsubscribe&&this._data.unsubscribe("*",this.listener),e=[];for(var o in this._ids)this._ids.hasOwnProperty(o)&&e.push(o);this._ids={},this._trigger("remove",{items:e})}if(this._data=t,this._data){for(this._fieldId=this._options.fieldId||this._data&&this._data.options&&this._data.options.fieldId||"id",e=this._data.getIds({filter:this._options&&this._options.filter}),i=0,s=e.length;s>i;i++)o=e[i],this._ids[o]=!0;this._trigger("add",{items:e}),this._data.on&&this._data.on("*",this.listener)}},s.prototype.get=function(){var t,e,i,s=this,n=o.getType(arguments[0]);"String"==n||"Number"==n||"Array"==n?(t=arguments[0],e=arguments[1],i=arguments[2]):(e=arguments[0],i=arguments[1]);var r=o.extend({},this._options,e);this._options.filter&&e&&e.filter&&(r.filter=function(t){return s._options.filter(t)&&e.filter(t)});var a=[];return void 0!=t&&a.push(t),a.push(r),a.push(i),this._data&&this._data.get.apply(this._data,a)},s.prototype.getIds=function(t){var e;if(this._data){var i,s=this._options.filter;i=t&&t.filter?s?function(e){return s(e)&&t.filter(e)}:t.filter:s,e=this._data.getIds({filter:i,order:t&&t.order})}else e=[];return e},s.prototype.getDataSet=function(){for(var t=this;t instanceof s;)t=t._data;return t||null},s.prototype._onEvent=function(t,e,i){var s,o,n,r,a=e&&e.items,h=this._data,d=[],l=[],c=[];if(a&&h){switch(t){case"add":for(s=0,o=a.length;o>s;s++)n=a[s],r=this.get(n),r&&(this._ids[n]=!0,d.push(n));break;case"update":for(s=0,o=a.length;o>s;s++)n=a[s],r=this.get(n),r?this._ids[n]?l.push(n):(this._ids[n]=!0,d.push(n)):this._ids[n]&&(delete this._ids[n],c.push(n));break;case"remove":for(s=0,o=a.length;o>s;s++)n=a[s],this._ids[n]&&(delete this._ids[n],c.push(n))}d.length&&this._trigger("add",{items:d},i),l.length&&this._trigger("update",{items:l},i),c.length&&this._trigger("remove",{items:c},i)}},s.prototype.on=n.prototype.on,s.prototype.off=n.prototype.off,s.prototype._trigger=n.prototype._trigger,s.prototype.subscribe=s.prototype.on,s.prototype.unsubscribe=s.prototype.off,t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.width="400px",this.height="400px",this.margin=10,this.defaultXCenter="55%",this.defaultYCenter="50%",this.xLabel="x",this.yLabel="y",this.zLabel="z",this.filterLabel="time",this.legendLabel="value",this.style=s.STYLE.DOT,this.showPerspective=!0,this.showGrid=!0,this.keepAspectRatio=!0,this.showShadow=!1,this.showGrayBottom=!1,this.showTooltip=!1,this.verticalRatio=.5,this.animationInterval=1e3,this.animationPreload=!1,this.camera=new l,this.eye=new h(0,0,-1),this.dataTable=null,this.dataPoints=null,this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.colFilter=void 0,this.xMin=0,this.xStep=void 0,this.xMax=1,this.yMin=0,this.yStep=void 0,this.yMax=1,this.zMin=0,this.zStep=void 0,this.zMax=1,this.valueMin=0,this.valueMax=1,this.xBarWidth=1,this.yBarWidth=1,this.colorAxis="#4D4D4D",this.colorGrid="#D3D3D3",this.colorDot="#7DC1FF",this.colorDotBorder="#3267D2",this.create(),this.setOptions(i),e&&this.setData(e)}var o=i(10),n=i(7),r=i(8),a=i(1),h=i(11),d=i(12),l=i(13),c=i(14),p=i(15),u=i(16);o(s.prototype),s.prototype._setScale=function(){this.scale=new h(1/(this.xMax-this.xMin),1/(this.yMax-this.yMin),1/(this.zMax-this.zMin)),this.keepAspectRatio&&(this.scale.x3&&(this.colFilter=3);else{if(this.style!==s.STYLE.DOTCOLOR&&this.style!==s.STYLE.DOTSIZE&&this.style!==s.STYLE.BARCOLOR&&this.style!==s.STYLE.BARSIZE)throw'Unknown style "'+this.style+'"';this.colX=0,this.colY=1,this.colZ=2,this.colValue=3,t.getNumberOfColumns()>4&&(this.colFilter=4)}},s.prototype.getNumberOfRows=function(t){return t.length},s.prototype.getNumberOfColumns=function(t){var e=0;for(var i in t[0])t[0].hasOwnProperty(i)&&e++;return e},s.prototype.getDistinctValues=function(t,e){for(var i=[],s=0;st[s][e]&&(i.min=t[s][e]),i.maxt;t++){var g=(t-p)/(f-p),m=240*g,v=this._hsv2rgb(m,1,1);c.strokeStyle=v,c.beginPath(),c.moveTo(h,r+t),c.lineTo(a,r+t),c.stroke()}c.strokeStyle=this.colorAxis,c.strokeRect(h,r,i,n)}if(this.style===s.STYLE.DOTSIZE&&(c.strokeStyle=this.colorAxis,c.fillStyle=this.colorDot,c.beginPath(),c.moveTo(h,r),c.lineTo(a,r),c.lineTo(a-i+e,d),c.lineTo(h,d),c.closePath(),c.fill(),c.stroke()),this.style===s.STYLE.DOTCOLOR||this.style===s.STYLE.DOTSIZE){var y=5,b=new u(this.valueMin,this.valueMax,(this.valueMax-this.valueMin)/5,!0);for(b.start(),b.getCurrent()0?this.yMin:this.yMax,o=this._convert3Dto2D(new h(x,r,this.zMin)),Math.cos(2*_)>0?(m.textAlign="center",m.textBaseline="top",o.y+=b):Math.sin(2*_)<0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(" "+i.getCurrent()+" ",o.x,o.y),i.next()}for(m.lineWidth=1,s=void 0===this.defaultYStep,i=new u(this.yMin,this.yMax,this.yStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,o=this._convert3Dto2D(new h(n,i.getCurrent(),this.zMin)),Math.cos(2*_)<0?(m.textAlign="center",m.textBaseline="top",o.y+=b):Math.sin(2*_)>0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(" "+i.getCurrent()+" ",o.x,o.y),i.next();for(m.lineWidth=1,s=void 0===this.defaultZStep,i=new u(this.zMin,this.zMax,this.zStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax;!i.end();)t=this._convert3Dto2D(new h(n,r,i.getCurrent())),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(t.x-b,t.y),m.stroke(),m.textAlign="right",m.textBaseline="middle",m.fillStyle=this.colorAxis,m.fillText(i.getCurrent()+" ",t.x-5,t.y),i.next();m.lineWidth=1,t=this._convert3Dto2D(new h(n,r,this.zMin)),e=this._convert3Dto2D(new h(n,r,this.zMax)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(e.x,e.y),m.stroke(),m.lineWidth=1,p=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),f=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(p.x,p.y),m.lineTo(f.x,f.y),m.stroke(),p=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),f=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(p.x,p.y),m.lineTo(f.x,f.y),m.stroke(),m.lineWidth=1,t=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(e.x,e.y),m.stroke(),t=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(e.x,e.y),m.stroke();var w=this.xLabel;w.length>0&&(c=.1/this.scale.y,n=(this.xMin+this.xMax)/2,r=Math.cos(_)>0?this.yMin-c:this.yMax+c,o=this._convert3Dto2D(new h(n,r,this.zMin)),Math.cos(2*_)>0?(m.textAlign="center",m.textBaseline="top"):Math.sin(2*_)<0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(w,o.x,o.y));var S=this.yLabel;S.length>0&&(l=.1/this.scale.x,n=Math.sin(_)>0?this.xMin-l:this.xMax+l,r=(this.yMin+this.yMax)/2,o=this._convert3Dto2D(new h(n,r,this.zMin)),Math.cos(2*_)<0?(m.textAlign="center",m.textBaseline="top"):Math.sin(2*_)>0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(S,o.x,o.y));var M=this.zLabel;M.length>0&&(d=30,n=Math.cos(_)>0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax,a=(this.zMin+this.zMax)/2,o=this._convert3Dto2D(new h(n,r,a)),m.textAlign="right",m.textBaseline="middle",m.fillStyle=this.colorAxis,m.fillText(M,o.x-d,o.y))},s.prototype._hsv2rgb=function(t,e,i){var s,o,n,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:s=r,o=h,n=0;break;case 1:s=h,o=r,n=0;break;case 2:s=0,o=r,n=h;break;case 3:s=0,o=h,n=r;break;case 4:s=h,o=0,n=r;break;case 5:s=r,o=0,n=h;break;default:s=0,o=0,n=0}return"RGB("+parseInt(255*s)+","+parseInt(255*o)+","+parseInt(255*n)+")"},s.prototype._redrawDataGrid=function(){var t,e,i,o,n,r,a,d,l,c,p,u,f,g=this.frame.canvas,m=g.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(n=0;n0}else r=!0;r?(f=(t.point.z+e.point.z+i.point.z+o.point.z)/4,c=240*(1-(f-this.zMin)*this.scale.z/this.verticalRatio),p=1,this.showShadow?(u=Math.min(1+S.x/M/2,1),a=this._hsv2rgb(c,p,u),d=a):(u=1,a=this._hsv2rgb(c,p,u),d=this.colorAxis)):(a="gray",d=this.colorAxis),l=.5,m.lineWidth=l,m.fillStyle=a,m.strokeStyle=d,m.beginPath(),m.moveTo(t.screen.x,t.screen.y),m.lineTo(e.screen.x,e.screen.y),m.lineTo(o.screen.x,o.screen.y),m.lineTo(i.screen.x,i.screen.y),m.closePath(),m.fill(),m.stroke()}}else for(n=0;np&&(p=0);var u,f,g;this.style===s.STYLE.DOTCOLOR?(u=240*(1-(d.point.value-this.valueMin)*this.scale.value),f=this._hsv2rgb(u,1,1),g=this._hsv2rgb(u,1,.8)):this.style===s.STYLE.DOTSIZE?(f=this.colorDot,g=this.colorDotBorder):(u=240*(1-(d.point.z-this.zMin)*this.scale.z/this.verticalRatio),f=this._hsv2rgb(u,1,1),g=this._hsv2rgb(u,1,.8)),i.lineWidth=1,i.strokeStyle=g,i.fillStyle=f,i.beginPath(),i.arc(d.screen.x,d.screen.y,p,0,2*Math.PI,!0),i.fill(),i.stroke()}}},s.prototype._redrawDataBar=function(){var t,e,i,o,n=this.frame.canvas,r=n.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(t=0;t0&&(t=this.dataPoints[0],s.lineWidth=1,s.strokeStyle="blue",s.beginPath(),s.moveTo(t.screen.x,t.screen.y)),e=1;e0&&s.stroke()}},s.prototype._onMouseDown=function(t){if(t=t||window.event,this.leftButtonDown&&this._onMouseUp(t),this.leftButtonDown=t.which?1===t.which:1===t.button,this.leftButtonDown||this.touchDown){this.startMouseX=getMouseX(t),this.startMouseY=getMouseY(t),this.startStart=new Date(this.start),this.startEnd=new Date(this.end),this.startArmRotation=this.camera.getArmRotation(),this.frame.style.cursor="move";var e=this;this.onmousemove=function(t){e._onMouseMove(t)},this.onmouseup=function(t){e._onMouseUp(t)},a.addEventListener(document,"mousemove",e.onmousemove),a.addEventListener(document,"mouseup",e.onmouseup),a.preventDefault(t)}},s.prototype._onMouseMove=function(t){t=t||window.event;var e=parseFloat(getMouseX(t))-this.startMouseX,i=parseFloat(getMouseY(t))-this.startMouseY,s=this.startArmRotation.horizontal+e/200,o=this.startArmRotation.vertical+i/200,n=4,r=Math.sin(n/360*2*Math.PI);Math.abs(Math.sin(s))0?1:0>t?-1:0}var s=e[0],o=e[1],n=e[2],r=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x)),a=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),h=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},s.prototype._dataPointFromXY=function(t,e){var i,o=100,n=null,r=null,a=null,h=new d(t,e);if(this.style===s.STYLE.BAR||this.style===s.STYLE.BARCOLOR||this.style===s.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var l=n.surfaces;if(l)for(var c=l.length-1;c>=0;c--){var p=l[c],u=p.corners,f=[u[0].screen,u[1].screen,u[2].screen],g=[u[2].screen,u[3].screen,u[0].screen];if(this._insideTriangle(h,f)||this._insideTriangle(h,g))return n}}else for(i=0;ib)&&o>b&&(a=b,r=n)}}return r},s.prototype._showTooltip=function(t){var e,i,s;this.tooltip?(e=this.tooltip.dom.content,i=this.tooltip.dom.line,s=this.tooltip.dom.dot):(e=document.createElement("div"),e.style.position="absolute",e.style.padding="10px",e.style.border="1px solid #4d4d4d",e.style.color="#1a1a1a",e.style.background="rgba(255,255,255,0.7)",e.style.borderRadius="2px",e.style.boxShadow="5px 5px 10px rgba(128,128,128,0.5)",i=document.createElement("div"),i.style.position="absolute",i.style.height="40px",i.style.width="0",i.style.borderLeft="1px solid #4d4d4d",s=document.createElement("div"),s.style.position="absolute",s.style.height="0",s.style.width="0",s.style.border="5px solid #4d4d4d",s.style.borderRadius="5px",this.tooltip={dataPoint:null,dom:{content:e,line:i,dot:s}}),this._hideTooltip(),this.tooltip.dataPoint=t,e.innerHTML="function"==typeof this.showTooltip?this.showTooltip(t.point):"
x:"+t.point.x+"
y:"+t.point.y+"
z:"+t.point.z+"
",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(s);var o=e.offsetWidth,n=e.offsetHeight,r=i.offsetHeight,a=s.offsetWidth,h=s.offsetHeight,d=t.screen.x-o/2;d=Math.min(Math.max(d,10),this.frame.clientWidth-10-o),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=d+"px",e.style.top=t.screen.y-r-n+"px",s.style.left=t.screen.x-a/2+"px",s.style.top=t.screen.y-h/2+"px"},s.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},getMouseX=function(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0},getMouseY=function(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0},t.exports=s},function(t){function e(t){return t?i(t):void 0}function i(t){for(var i in e.prototype)t[i]=e.prototype[i];return t}t.exports=e,e.prototype.on=e.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},e.prototype.once=function(t,e){function i(){s.off(t,i),e.apply(this,arguments)}var s=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},e.prototype.off=e.prototype.removeListener=e.prototype.removeAllListeners=e.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var s,o=0;os;++s)i[s].apply(this,e)}return this},e.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},e.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t){function e(t,e,i){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0,this.z=void 0!==i?i:0}e.subtract=function(t,i){var s=new e;return s.x=t.x-i.x,s.y=t.y-i.y,s.z=t.z-i.z,s},e.add=function(t,i){var s=new e;return s.x=t.x+i.x,s.y=t.y+i.y,s.z=t.z+i.z,s},e.avg=function(t,i){return new e((t.x+i.x)/2,(t.y+i.y)/2,(t.z+i.z)/2)},e.crossProduct=function(t,i){var s=new e;return s.x=t.y*i.z-t.z*i.y,s.y=t.z*i.x-t.x*i.z,s.z=t.x*i.y-t.y*i.x,s},e.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},t.exports=e},function(t){Point2d=function(t,e){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0},t.exports=Point2d},function(t,e,i){var s=i(11);Camera=function(){this.armLocation=new s,this.armRotation={},this.armRotation.horizontal=0,this.armRotation.vertical=0,this.armLength=1.7,this.cameraLocation=new s,this.cameraRotation=new s(.5*Math.PI,0,0),this.calculateCameraOrientation()},Camera.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},Camera.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),(void 0!==t||void 0!==e)&&this.calculateCameraOrientation()},Camera.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},Camera.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.calculateCameraOrientation())},Camera.prototype.getArmLength=function(){return this.armLength},Camera.prototype.getCameraLocation=function(){return this.cameraLocation},Camera.prototype.getCameraRotation=function(){return this.cameraRotation},Camera.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal},t.exports=Camera},function(t,e,i){function s(t,e,i){this.data=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=i.getDistinctValues(t.get(),this.column),this.values.sort(function(t,e){return t>e?1:e>t?-1:0}),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var o=i(8);s.prototype.isLoaded=function(){return this.loaded},s.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},s.prototype.getLabel=function(){return this.graph.filterLabel},s.prototype.getColumn=function(){return this.column},s.prototype.getSelectedValue=function(){return void 0===this.index?void 0:this.values[this.index]},s.prototype.getValues=function(){return this.values},s.prototype.getValue=function(t){if(t>=this.values.length)throw"Error: index out of range";return this.values[t]},s.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var s=new o(this.data,{filter:function(t){return t[i.column]==i.value}}).get();e=this.graph._getDataPoints(s),this.dataPoints[t]=e}return e},s.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},s.prototype.selectValue=function(t){if(t>=this.values.length)throw"Error: index out of range";this.index=t,this.value=this.values[t]},s.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t0&&(t--,this.setIndex(t))},s.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},s.prototype.setIndex=function(t){if(!(ts&&(s=0),s>this.values.length-1&&(s=this.values.length-1),s},s.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10,i=t/(this.values.length-1)*e,s=i+3;return s},s.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,s=this.leftToIndex(i);this.setIndex(s),o.preventDefault()},s.prototype._onMouseUp=function(){this.frame.style.cursor="auto",o.removeEventListener(document,"mousemove",this.onmousemove),o.removeEventListener(document,"mouseup",this.onmouseup),o.preventDefault()},t.exports=s},function(t){function e(t,e,i,s){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,s)}e.prototype.setRange=function(t,e,i,s){this._start=t?t:0,this._end=e?e:0,this.setStep(i,s)},e.prototype.setStep=function(t,i){void 0===t||0>=t||(void 0!==i&&(this.prettyStep=i),this._step=this.prettyStep===!0?e.calculatePrettyStep(t):t)},e.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),s=2*Math.pow(10,Math.round(e(t/2))),o=5*Math.pow(10,Math.round(e(t/5))),n=i;return Math.abs(s-t)<=Math.abs(n-t)&&(n=s),Math.abs(o-t)<=Math.abs(n-t)&&(n=o),0>=n&&(n=1),n},e.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},e.prototype.getStep=function(){return this._step},e.prototype.start=function(){this._current=this._start-this._start%this._step},e.prototype.next=function(){this._current+=this._step},e.prototype.end=function(){return this._current>this._end},t.exports=e},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");var n=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},util:{snap:null,toScreen:n._toScreen.bind(n),toGlobalScreen:n._toGlobalScreen.bind(n),toTime:n._toTime.bind(n),toGlobalTime:n._toGlobalTime.bind(n)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.itemSet=new p(this.body),this.components.push(this.itemSet),this.itemsData=null,this.groupsData=null,i&&this.setOptions(i),e?this.setItems(e):this.redraw()}var o=(i(10),i(18),i(1)),n=i(7),r=i(8),a=i(20),h=i(23),d=i(24),l=i(26),c=i(28),p=i(29);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e),i&&("start"in this.options||"end"in this.options)){this.fit();var s="start"in this.options?o.convert(this.options.start,"Date"):null,a="end"in this.options?o.convert(this.options.end,"Date"):null;this.setWindow(s,a)}},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.itemSet.setGroups(e)},s.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t)},s.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},s.prototype.focus=function(t){if(this.itemsData&&void 0!=t){var e=Array.isArray(t)?t:[t],i=this.itemsData.getDataSet().get(e,{type:{start:"Date",end:"Date"}}),s=null,o=null;i.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===s||s>e)&&(s=e),(null===o||i>o)&&(o=i)});var n=(s+o)/2,r=Math.max(this.range.end-this.range.start,1.1*(o-s));this.range.setRange(n-r/2,n+r/2)}},s.prototype.getItemRange=function(){var t=this.itemsData.getDataSet(),e=null,i=null;if(t){var s=t.min("start");e=s?o.convert(s.start,"Date").valueOf():null;var n=t.max("start");n&&(i=o.convert(n.start,"Date").valueOf());var r=t.max("end");r&&(i=null==i?o.convert(r.end,"Date").valueOf():Math.max(i,o.convert(r.end,"Date").valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},t.exports=s},function(t,e,i){t.exports="undefined"!=typeof window?window.Hammer||i(19):function(){throw Error("hammer.js is only available in a browser, not in node.js.")}},function(t,e,i){var s;!function(o,n){"use strict";function r(){a.READY||(w.determineEventTypes(),x.each(a.gestures,function(t){M.register(t)}),w.onTouch(a.DOCUMENT,v,M.detect),w.onTouch(a.DOCUMENT,y,M.detect),a.READY=!0)}var a=function C(t,e){return new C.Instance(t,e||{})};a.VERSION="1.1.3",a.defaults={behavior:{userSelect:"none",touchAction:"pan-y",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},a.DOCUMENT=document,a.HAS_POINTEREVENTS=navigator.pointerEnabled||navigator.msPointerEnabled,a.HAS_TOUCHEVENTS="ontouchstart"in o,a.IS_MOBILE=/mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent),a.NO_MOUSEEVENTS=a.HAS_TOUCHEVENTS&&a.IS_MOBILE||a.HAS_POINTEREVENTS,a.CALCULATE_INTERVAL=25;var h={},d=a.DIRECTION_DOWN="down",l=a.DIRECTION_LEFT="left",c=a.DIRECTION_UP="up",p=a.DIRECTION_RIGHT="right",u=a.POINTER_MOUSE="mouse",f=a.POINTER_TOUCH="touch",g=a.POINTER_PEN="pen",m=a.EVENT_START="start",v=a.EVENT_MOVE="move",y=a.EVENT_END="end",b=a.EVENT_RELEASE="release",_=a.EVENT_TOUCH="touch";a.READY=!1,a.plugins=a.plugins||{},a.gestures=a.gestures||{};var x=a.utils={extend:function(t,e,i){for(var s in e)!e.hasOwnProperty(s)||t[s]!==n&&i||(t[s]=e[s]);return t},on:function(t,e,i){t.addEventListener(e,i,!1)},off:function(t,e,i){t.removeEventListener(e,i,!1)},each:function(t,e,i){var s,o;if("forEach"in t)t.forEach(e,i);else if(t.length!==n){for(s=0,o=t.length;o>s;s++)if(e.call(i,t[s],s,t)===!1)return}else for(s in t)if(t.hasOwnProperty(s)&&e.call(i,t[s],s,t)===!1)return},inStr:function(t,e){return t.indexOf(e)>-1},inArray:function(t,e){if(t.indexOf){var i=t.indexOf(e);return-1===i?!1:i}for(var s=0,o=t.length;o>s;s++)if(t[s]===e)return s;return!1},toArray:function(t){return Array.prototype.slice.call(t,0)},hasParent:function(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1},getCenter:function(t){var e=[],i=[],s=[],o=[],n=Math.min,r=Math.max;return 1===t.length?{pageX:t[0].pageX,pageY:t[0].pageY,clientX:t[0].clientX,clientY:t[0].clientY}:(x.each(t,function(t){e.push(t.pageX),i.push(t.pageY),s.push(t.clientX),o.push(t.clientY)}),{pageX:(n.apply(Math,e)+r.apply(Math,e))/2,pageY:(n.apply(Math,i)+r.apply(Math,i))/2,clientX:(n.apply(Math,s)+r.apply(Math,s))/2,clientY:(n.apply(Math,o)+r.apply(Math,o))/2})},getVelocity:function(t,e,i){return{x:Math.abs(e/t)||0,y:Math.abs(i/t)||0}},getAngle:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return 180*Math.atan2(s,i)/Math.PI},getDirection:function(t,e){var i=Math.abs(t.clientX-e.clientX),s=Math.abs(t.clientY-e.clientY);return i>=s?t.clientX-e.clientX>0?l:p:t.clientY-e.clientY>0?c:d},getDistance:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return Math.sqrt(i*i+s*s)},getScale:function(t,e){return t.length>=2&&e.length>=2?this.getDistance(e[0],e[1])/this.getDistance(t[0],t[1]):1},getRotation:function(t,e){return t.length>=2&&e.length>=2?this.getAngle(e[1],e[0])-this.getAngle(t[1],t[0]):0},isVertical:function(t){return t==c||t==d},setPrefixedCss:function(t,e,i,s){var o=["","Webkit","Moz","O","ms"];e=x.toCamelCase(e);for(var n=0;n0&&this.started&&(r=v),this.started=!0;var d=this.collectEventData(i,r,o,t);return e!=y&&s.call(M,d),a&&(d.changedLength=h,d.eventType=a,s.call(M,d),d.eventType=r,delete d.changedLength),r==y&&(s.call(M,d),this.started=!1),r},determineEventTypes:function(){var t;return t=a.HAS_POINTEREVENTS?o.PointerEvent?["pointerdown","pointermove","pointerup pointercancel lostpointercapture"]:["MSPointerDown","MSPointerMove","MSPointerUp MSPointerCancel MSLostPointerCapture"]:a.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],h[m]=t[0],h[v]=t[1],h[y]=t[2],h},getTouchList:function(t,e){if(a.HAS_POINTEREVENTS)return S.getTouchList();if(t.touches){if(e==v)return t.touches;var i=[],s=[].concat(x.toArray(t.touches),x.toArray(t.changedTouches)),o=[];return x.each(s,function(t){x.inArray(i,t.identifier)===!1&&o.push(t),i.push(t.identifier)}),o}return t.identifier=1,[t]},collectEventData:function(t,e,i,s){var o=f;return x.inStr(s.type,"mouse")||S.matchType(u,s)?o=u:S.matchType(g,s)&&(o=g),{center:x.getCenter(i),timeStamp:Date.now(),target:s.target,touches:i,eventType:e,pointerType:o,srcEvent:s,preventDefault:function(){var t=this.srcEvent;t.preventManipulation&&t.preventManipulation(),t.preventDefault&&t.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return M.stopDetect()}}}},S=a.PointerEvent={pointers:{},getTouchList:function(){var t=[];return x.each(this.pointers,function(e){t.push(e)}),t},updatePointer:function(t,e){t==y||t!=y&&1!==e.buttons?delete this.pointers[e.pointerId]:(e.identifier=e.pointerId,this.pointers[e.pointerId]=e)},matchType:function(t,e){if(!e.pointerType)return!1;var i=e.pointerType,s={};return s[u]=i===(e.MSPOINTER_TYPE_MOUSE||u),s[f]=i===(e.MSPOINTER_TYPE_TOUCH||f),s[g]=i===(e.MSPOINTER_TYPE_PEN||g),s[t]},reset:function(){this.pointers={}}},M=a.detection={gestures:[],current:null,previous:null,stopped:!1,startDetect:function(t,e){this.current||(this.stopped=!1,this.current={inst:t,startEvent:x.extend({},e),lastEvent:!1,lastCalcEvent:!1,futureCalcEvent:!1,lastCalcData:{},name:""},this.detect(e))},detect:function(t){if(this.current&&!this.stopped){t=this.extendEventData(t);var e=this.current.inst,i=e.options;return x.each(this.gestures,function(s){!this.stopped&&e.enabled&&i[s.name]&&s.handler.call(s,t,e)},this),this.current&&(this.current.lastEvent=t),t.eventType==y&&this.stopDetect(),t}},stopDetect:function(){this.previous=x.extend({},this.current),this.current=null,this.stopped=!0},getCalculatedData:function(t,e,i,s,o){var n=this.current,r=!1,h=n.lastCalcEvent,d=n.lastCalcData;h&&t.timeStamp-h.timeStamp>a.CALCULATE_INTERVAL&&(e=h.center,i=t.timeStamp-h.timeStamp,s=t.center.clientX-h.center.clientX,o=t.center.clientY-h.center.clientY,r=!0),(t.eventType==_||t.eventType==b)&&(n.futureCalcEvent=t),(!n.lastCalcEvent||r)&&(d.velocity=x.getVelocity(i,s,o),d.angle=x.getAngle(e,t.center),d.direction=x.getDirection(e,t.center),n.lastCalcEvent=n.futureCalcEvent||t,n.futureCalcEvent=t),t.velocityX=d.velocity.x,t.velocityY=d.velocity.y,t.interimAngle=d.angle,t.interimDirection=d.direction},extendEventData:function(t){var e=this.current,i=e.startEvent,s=e.lastEvent||i;(t.eventType==_||t.eventType==b)&&(i.touches=[],x.each(t.touches,function(t){i.touches.push({clientX:t.clientX,clientY:t.clientY})}));var o=t.timeStamp-i.timeStamp,n=t.center.clientX-i.center.clientX,r=t.center.clientY-i.center.clientY;return this.getCalculatedData(t,s.center,o,n,r),x.extend(t,{startEvent:i,deltaTime:o,deltaX:n,deltaY:r,distance:x.getDistance(i.center,t.center),angle:x.getAngle(i.center,t.center),direction:x.getDirection(i.center,t.center),scale:x.getScale(i.touches,t.touches),rotation:x.getRotation(i.touches,t.touches)}),t},register:function(t){var e=t.defaults||{};return e[t.name]===n&&(e[t.name]=!0),x.extend(a.defaults,e,!0),t.index=t.index||1e3,this.gestures.push(t),this.gestures.sort(function(t,e){return t.indexe.index?1:0}),this.gestures}};a.Instance=function(t,e){var i=this;r(),this.element=t,this.enabled=!0,x.each(e,function(t,i){delete e[i],e[x.toCamelCase(i)]=t}),this.options=x.extend(x.extend({},a.defaults),e||{}),this.options.behavior&&x.toggleBehavior(this.element,this.options.behavior,!0),this.eventStartHandler=w.onTouch(t,m,function(t){i.enabled&&t.eventType==m?M.startDetect(i,t):t.eventType==_&&M.detect(t)}),this.eventHandlers=[]},a.Instance.prototype={on:function(t,e){var i=this;return w.on(i.element,t,e,function(t){i.eventHandlers.push({gesture:t,handler:e})}),i},off:function(t,e){var i=this;return w.off(i.element,t,e,function(t){var s=x.inArray({gesture:t,handler:e});s!==!1&&i.eventHandlers.splice(s,1)}),i},trigger:function(t,e){e||(e={});var i=a.DOCUMENT.createEvent("Event");i.initEvent(t,!0,!0),i.gesture=e;var s=this.element;return x.hasParent(e.target,s)&&(s=e.target),s.dispatchEvent(i),this},enable:function(t){return this.enabled=t,this},dispose:function(){var t,e;for(x.toggleBehavior(this.element,this.options.behavior,!1),t=-1;e=this.eventHandlers[++t];)x.off(this.element,e.gesture,e.handler);return this.eventHandlers=[],w.off(this.element,h[m],this.eventStartHandler),null}},function(t){function e(e,s){var o=M.current;if(!(s.options.dragMaxTouches>0&&e.touches.length>s.options.dragMaxTouches))switch(e.eventType){case m:i=!1;break;case v:if(e.distance0)){var r=Math.abs(s.options.dragMinDistance/e.distance);n.pageX+=e.deltaX*r,n.pageY+=e.deltaY*r,n.clientX+=e.deltaX*r,n.clientY+=e.deltaY*r,e=M.extendEventData(e)}(o.lastEvent.dragLockToAxis||s.options.dragLockToAxis&&s.options.dragLockMinDistance<=e.distance)&&(e.dragLockToAxis=!0);var a=o.lastEvent.direction;e.dragLockToAxis&&a!==e.direction&&(e.direction=x.isVertical(a)?e.deltaY<0?c:d:e.deltaX<0?l:p),i||(s.trigger(t+"start",e),i=!0),s.trigger(t,e),s.trigger(t+e.direction,e);var h=x.isVertical(e.direction);(s.options.dragBlockVertical&&h||s.options.dragBlockHorizontal&&!h)&&e.preventDefault();break;case b:i&&e.changedLength<=s.options.dragMaxTouches&&(s.trigger(t+"end",e),i=!1);break;case y:i=!1}}var i=!1;a.gestures.Drag={name:t,index:50,handler:e,defaults:{dragMinDistance:10,dragDistanceCorrection:!0,dragMaxTouches:1,dragBlockHorizontal:!1,dragBlockVertical:!1,dragLockToAxis:!1,dragLockMinDistance:25}}}("drag"),a.gestures.Gesture={name:"gesture",index:1337,handler:function(t,e){e.trigger(this.name,t)}},function(t){function e(e,s){var o=s.options,n=M.current;switch(e.eventType){case m:clearTimeout(i),n.name=t,i=setTimeout(function(){n&&n.name==t&&s.trigger(t,e)},o.holdTimeout);break;case v:e.distance>o.holdThreshold&&clearTimeout(i);break;case b:clearTimeout(i)}}var i;a.gestures.Hold={name:t,index:10,defaults:{holdTimeout:500,holdThreshold:2},handler:e}}("hold"),a.gestures.Release={name:"release",index:1/0,handler:function(t,e){t.eventType==b&&e.trigger(this.name,t)}},a.gestures.Swipe={name:"swipe",index:40,defaults:{swipeMinTouches:1,swipeMaxTouches:1,swipeVelocityX:.6,swipeVelocityY:.6},handler:function(t,e){if(t.eventType==b){var i=t.touches.length,s=e.options;if(is.swipeMaxTouches)return;(t.velocityX>s.swipeVelocityX||t.velocityY>s.swipeVelocityY)&&(e.trigger(this.name,t),e.trigger(this.name+t.direction,t))}}},function(t){function e(e,s){var o,n,r=s.options,a=M.current,h=M.previous;switch(e.eventType){case m:i=!1;break;case v:i=i||e.distance>r.tapMaxDistance;break;case y:!x.inStr(e.srcEvent.type,"cancel")&&e.deltaTimes.options.transformMinRotation&&s.trigger("rotate",e),o>s.options.transformMinScale&&(s.trigger("pinch",e),s.trigger("pinch"+(e.scale<1?"in":"out"),e));break;case b:i&&e.changedLength<2&&(s.trigger(t+"end",e),i=!1)}}var i=!1;a.gestures.Transform={name:t,index:45,defaults:{transformMinScale:.01,transformMinRotation:1},handler:e}}("transform"),s=function(){return a}.call(e,i,e,t),!(s!==n&&(t.exports=s))}(window)},function(t,e,i){function s(t,e){var i=h().hours(0).minutes(0).seconds(0).milliseconds(0);this.start=i.clone().add("days",-3).valueOf(),this.end=i.clone().add("days",4).valueOf(),this.body=t,this.defaultOptions={start:null,end:null,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10},this.options=r.extend({},this.defaultOptions),this.props={touch:{}},this.body.emitter.on("dragstart",this._onDragStart.bind(this)),this.body.emitter.on("drag",this._onDrag.bind(this)),this.body.emitter.on("dragend",this._onDragEnd.bind(this)),this.body.emitter.on("hold",this._onHold.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("DOMMouseScroll",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.setOptions(e)}function o(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}function n(t,e){return{x:t.pageX-r.getAbsoluteLeft(e),y:t.pageY-r.getAbsoluteTop(e)}}var r=i(1),a=i(21),h=i(2),d=i(22);s.prototype=new d,s.prototype.setOptions=function(t){if(t){var e=["direction","min","max","zoomMin","zoomMax","moveable","zoomable"];r.selectiveExtend(e,this.options,t),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},s.prototype.setRange=function(t,e){var i=this._applyRange(t,e);if(i){var s={start:new Date(this.start),end:new Date(this.end)};this.body.emitter.emit("rangechange",s),this.body.emitter.emit("rangechanged",s)}},s.prototype._applyRange=function(t,e){var i,s=null!=t?r.convert(t,"Date").valueOf():this.start,o=null!=e?r.convert(e,"Date").valueOf():this.end,n=null!=this.options.max?r.convert(this.options.max,"Date").valueOf():null,a=null!=this.options.min?r.convert(this.options.min,"Date").valueOf():null;if(isNaN(s)||null===s)throw new Error('Invalid start "'+t+'"');if(isNaN(o)||null===o)throw new Error('Invalid end "'+e+'"');if(s>o&&(o=s),null!==a&&a>s&&(i=a-s,s+=i,o+=i,null!=n&&o>n&&(o=n)),null!==n&&o>n&&(i=o-n,s-=i,o-=i,null!=a&&a>s&&(s=a)),null!==this.options.zoomMin){var h=parseFloat(this.options.zoomMin);0>h&&(h=0),h>o-s&&(this.end-this.start===h?(s=this.start,o=this.end):(i=h-(o-s),s-=i/2,o+=i/2))}if(null!==this.options.zoomMax){var d=parseFloat(this.options.zoomMax);0>d&&(d=0),o-s>d&&(this.end-this.start===d?(s=this.start,o=this.end):(i=o-s-d,s+=i/2,o-=i/2))}var l=this.start!=s||this.end!=o;return this.start=s,this.end=o,l},s.prototype.getRange=function(){return{start:this.start,end:this.end}},s.prototype.conversion=function(t){return s.conversion(this.start,this.end,t)},s.conversion=function(t,e,i){return 0!=i&&e-t!=0?{offset:t,scale:i/(e-t)}:{offset:0,scale:1}},s.prototype._onDragStart=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.start=this.start,this.props.touch.end=this.end,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},s.prototype._onDrag=function(t){if(this.options.moveable){var e=this.options.direction;if(o(e),this.props.touch.allowDragging){var i="horizontal"==e?t.gesture.deltaX:t.gesture.deltaY,s=this.props.touch.end-this.props.touch.start,n="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height,r=-i/n*s;this._applyRange(this.props.touch.start+r,this.props.touch.end+r),this.body.emitter.emit("rangechange",{start:new Date(this.start),end:new Date(this.end)})}}},s.prototype._onDragEnd=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end)}))},s.prototype._onMouseWheel=function(t){if(this.options.zoomable&&this.options.moveable){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i;i=0>e?1-e/5:1/(1+e/5);var s=a.fakeGesture(this,t),o=n(s.center,this.body.dom.center),r=this._pointerToDate(o);this.zoom(i,r)}t.preventDefault()}},s.prototype._onTouch=function(){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null},s.prototype._onHold=function(){this.props.touch.allowDragging=!1},s.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable&&(this.props.touch.allowDragging=!1,t.gesture.touches.length>1)){this.props.touch.center||(this.props.touch.center=n(t.gesture.center,this.body.dom.center));var e=1/t.gesture.scale,i=this._pointerToDate(this.props.touch.center),s=parseInt(i+(this.props.touch.start-i)*e),o=parseInt(i+(this.props.touch.end-i)*e);this.setRange(s,o)}},s.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(o(i),"horizontal"==i){var s=this.body.domProps.center.width;return e=this.conversion(s),t.x/e.scale+e.offset}var n=this.body.domProps.center.height;return e=this.conversion(n),t.y/e.scale+e.offset},s.prototype.zoom=function(t,e){null==e&&(e=(this.start+this.end)/2);var i=e+(this.start-e)*t,s=e+(this.end-e)*t;this.setRange(i,s)},s.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,s=this.end+e*t;this.start=i,this.end=s},s.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,s=this.start-i,o=this.end-i;this.setRange(s,o)},t.exports=s},function(t,e,i){var s=i(18);e.fakeGesture=function(t,e){var i=null,o=s.event.getTouchList(e,i),n=s.event.collectEventData(this,i,o,e);return isNaN(n.center.pageX)&&(n.center.pageX=e.pageX),isNaN(n.center.pageY)&&(n.center.pageY=e.pageY),n}},function(t){function e(){this.options=null,this.props=null}e.prototype.setOptions=function(t){t&&util.extend(this.options,t)},e.prototype.redraw=function(){return!1},e.prototype.destroy=function(){},e.prototype._isResized=function(){var t=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;return this.props._previousWidth=this.props.width,this.props._previousHeight=this.props.height,t},t.exports=e},function(t,e,i){function s(){}var o=i(10),n=i(18),r=i(1),a=(i(7),i(8),i(20),i(24),i(26),i(28),i(29),i(36));o(s.prototype),s.prototype._create=function(t){this.dom={},this.dom.root=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.backgroundVertical=document.createElement("div"),this.dom.backgroundHorizontal=document.createElement("div"),this.dom.centerContainer=document.createElement("div"),this.dom.leftContainer=document.createElement("div"),this.dom.rightContainer=document.createElement("div"),this.dom.center=document.createElement("div"),this.dom.left=document.createElement("div"),this.dom.right=document.createElement("div"),this.dom.top=document.createElement("div"),this.dom.bottom=document.createElement("div"),this.dom.shadowTop=document.createElement("div"),this.dom.shadowBottom=document.createElement("div"),this.dom.shadowTopLeft=document.createElement("div"),this.dom.shadowBottomLeft=document.createElement("div"),this.dom.shadowTopRight=document.createElement("div"),this.dom.shadowBottomRight=document.createElement("div"),this.dom.root.className="vis timeline root",this.dom.background.className="vispanel background",this.dom.backgroundVertical.className="vispanel background vertical",this.dom.backgroundHorizontal.className="vispanel background horizontal",this.dom.centerContainer.className="vispanel center",this.dom.leftContainer.className="vispanel left",this.dom.rightContainer.className="vispanel right",this.dom.top.className="vispanel top",this.dom.bottom.className="vispanel bottom",this.dom.left.className="content",this.dom.center.className="content",this.dom.right.className="content",this.dom.shadowTop.className="shadow top",this.dom.shadowBottom.className="shadow bottom",this.dom.shadowTopLeft.className="shadow top",this.dom.shadowBottomLeft.className="shadow bottom",this.dom.shadowTopRight.className="shadow top",this.dom.shadowBottomRight.className="shadow bottom",this.dom.root.appendChild(this.dom.background),this.dom.root.appendChild(this.dom.backgroundVertical),this.dom.root.appendChild(this.dom.backgroundHorizontal),this.dom.root.appendChild(this.dom.centerContainer),this.dom.root.appendChild(this.dom.leftContainer),this.dom.root.appendChild(this.dom.rightContainer),this.dom.root.appendChild(this.dom.top),this.dom.root.appendChild(this.dom.bottom),this.dom.centerContainer.appendChild(this.dom.center),this.dom.leftContainer.appendChild(this.dom.left),this.dom.rightContainer.appendChild(this.dom.right),this.dom.centerContainer.appendChild(this.dom.shadowTop),this.dom.centerContainer.appendChild(this.dom.shadowBottom),this.dom.leftContainer.appendChild(this.dom.shadowTopLeft),this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft),this.dom.rightContainer.appendChild(this.dom.shadowTopRight),this.dom.rightContainer.appendChild(this.dom.shadowBottomRight),this.on("rangechange",this.redraw.bind(this)),this.on("change",this.redraw.bind(this)),this.on("touch",this._onTouch.bind(this)),this.on("pinch",this._onPinch.bind(this)),this.on("dragstart",this._onDragStart.bind(this)),this.on("drag",this._onDrag.bind(this)),this.hammer=n(this.dom.root,{prevent_default:!0}),this.listeners={};var e=this,i=["touch","pinch","tap","doubletap","hold","dragstart","drag","dragend","mousewheel","DOMMouseScroll"];if(i.forEach(function(t){var i=function(){var i=[t].concat(Array.prototype.slice.call(arguments,0));e.isActive()&&e.emit.apply(e,i)};e.hammer.on(t,i),e.listeners[t]=i}),this.props={root:{},background:{},centerContainer:{},leftContainer:{},rightContainer:{},center:{},left:{},right:{},top:{},bottom:{},border:{},scrollTop:0,scrollTopMin:0},this.touch={},!t)throw new Error("No container provided");t.appendChild(this.dom.root)},s.prototype.setOptions=function(t){if(t){var e=["width","height","minHeight","maxHeight","autoResize","start","end","orientation","clickToUse"];r.selectiveExtend(e,this.options,t),"clickToUse"in t&&(t.clickToUse?this.activator=new a(this.dom.root):this.activator&&(this.activator.destroy(),delete this.activator)),this._initAutoResize()}if(this.components.forEach(function(e){e.setOptions(t)}),t&&t.order)throw new Error("Option order is deprecated. There is no replacement for this feature.");this.redraw()},s.prototype.isActive=function(){return!this.activator||this.activator.active},s.prototype.destroy=function(){this.clear(),this.off(),this._stopAutoResize(),this.dom.root.parentNode&&this.dom.root.parentNode.removeChild(this.dom.root),this.dom=null,this.activator&&(this.activator.destroy(),delete this.activator);for(var t in this.listeners)this.listeners.hasOwnProperty(t)&&delete this.listeners[t];this.listeners=null,this.hammer=null,this.components.forEach(function(t){t.destroy()}),this.body=null},s.prototype.setCustomTime=function(t){if(!this.customTime)throw new Error("Cannot get custom time: Custom time bar is not enabled");this.customTime.setCustomTime(t)},s.prototype.getCustomTime=function(){if(!this.customTime)throw new Error("Cannot get custom time: Custom time bar is not enabled");return this.customTime.getCustomTime()},s.prototype.getVisibleItems=function(){return this.itemSet&&this.itemSet.getVisibleItems()||[]},s.prototype.clear=function(t){(!t||t.items)&&this.setItems(null),(!t||t.groups)&&this.setGroups(null),(!t||t.options)&&(this.components.forEach(function(t){t.setOptions(t.defaultOptions)}),this.setOptions(this.defaultOptions))},s.prototype.fit=function(){var t=this.getItemRange(),e=t.min,i=t.max;if(null!=e&&null!=i){var s=i.valueOf()-e.valueOf();0>=s&&(s=864e5),e=new Date(e.valueOf()-.05*s),i=new Date(i.valueOf()+.05*s)}(null!==e||null!==i)&&this.range.setRange(e,i)},s.prototype.setWindow=function(t,e){if(1==arguments.length){var i=arguments[0];this.range.setRange(i.start,i.end)}else this.range.setRange(t,e)},s.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},s.prototype.redraw=function(){var t=!1,e=this.options,i=this.props,s=this.dom;if(s){"top"==e.orientation?(r.addClassName(s.root,"top"),r.removeClassName(s.root,"bottom")):(r.removeClassName(s.root,"top"),r.addClassName(s.root,"bottom")),s.root.style.maxHeight=r.option.asSize(e.maxHeight,""),s.root.style.minHeight=r.option.asSize(e.minHeight,""),s.root.style.width=r.option.asSize(e.width,""),i.border.left=(s.centerContainer.offsetWidth-s.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(s.centerContainer.offsetHeight-s.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var o=s.root.offsetHeight-s.root.clientHeight,n=s.root.offsetWidth-s.root.clientWidth;i.center.height=s.center.offsetHeight,i.left.height=s.left.offsetHeight,i.right.height=s.right.offsetHeight,i.top.height=s.top.clientHeight||-i.border.top,i.bottom.height=s.bottom.clientHeight||-i.border.bottom;var a=Math.max(i.left.height,i.center.height,i.right.height),h=i.top.height+a+i.bottom.height+o+i.border.top+i.border.bottom; +s.root.style.height=r.option.asSize(e.height,h+"px"),i.root.height=s.root.offsetHeight,i.background.height=i.root.height-o;var d=i.root.height-i.top.height-i.bottom.height-o;i.centerContainer.height=d,i.leftContainer.height=d,i.rightContainer.height=i.leftContainer.height,i.root.width=s.root.offsetWidth,i.background.width=i.root.width-n,i.left.width=s.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=s.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var l=i.root.width-i.left.width-i.right.width-n;i.center.width=l,i.centerContainer.width=l,i.top.width=l,i.bottom.width=l,s.background.style.height=i.background.height+"px",s.backgroundVertical.style.height=i.background.height+"px",s.backgroundHorizontal.style.height=i.centerContainer.height+"px",s.centerContainer.style.height=i.centerContainer.height+"px",s.leftContainer.style.height=i.leftContainer.height+"px",s.rightContainer.style.height=i.rightContainer.height+"px",s.background.style.width=i.background.width+"px",s.backgroundVertical.style.width=i.centerContainer.width+"px",s.backgroundHorizontal.style.width=i.background.width+"px",s.centerContainer.style.width=i.center.width+"px",s.top.style.width=i.top.width+"px",s.bottom.style.width=i.bottom.width+"px",s.background.style.left="0",s.background.style.top="0",s.backgroundVertical.style.left=i.left.width+"px",s.backgroundVertical.style.top="0",s.backgroundHorizontal.style.left="0",s.backgroundHorizontal.style.top=i.top.height+"px",s.centerContainer.style.left=i.left.width+"px",s.centerContainer.style.top=i.top.height+"px",s.leftContainer.style.left="0",s.leftContainer.style.top=i.top.height+"px",s.rightContainer.style.left=i.left.width+i.center.width+"px",s.rightContainer.style.top=i.top.height+"px",s.top.style.left=i.left.width+"px",s.top.style.top="0",s.bottom.style.left=i.left.width+"px",s.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var c=this.props.scrollTop;"bottom"==e.orientation&&(c+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),s.center.style.left="0",s.center.style.top=c+"px",s.left.style.left="0",s.left.style.top=c+"px",s.right.style.left="0",s.right.style.top=c+"px";var p=0==this.props.scrollTop?"hidden":"",u=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";s.shadowTop.style.visibility=p,s.shadowBottom.style.visibility=u,s.shadowTopLeft.style.visibility=p,s.shadowBottomLeft.style.visibility=u,s.shadowTopRight.style.visibility=p,s.shadowBottomRight.style.visibility=u,this.components.forEach(function(e){t=e.redraw()||t}),t&&this.redraw()}},s.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},s.prototype._toTime=function(t){var e=this.range.conversion(this.props.center.width);return new Date(t/e.scale+e.offset)},s.prototype._toGlobalTime=function(t){var e=this.range.conversion(this.props.root.width);return new Date(t/e.scale+e.offset)},s.prototype._toScreen=function(t){var e=this.range.conversion(this.props.center.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._toGlobalScreen=function(t){var e=this.range.conversion(this.props.root.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},s.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){return 1!=t.options.autoResize?void t._stopAutoResize():void(t.dom.root&&(t.dom.root.clientWidth!=t.props.lastWidth||t.dom.root.clientHeight!=t.props.lastHeight)&&(t.props.lastWidth=t.dom.root.clientWidth,t.props.lastHeight=t.dom.root.clientHeight,t.emit("change")))},r.addEventListener(window,"resize",this._onResize),this.watchTimer=setInterval(this._onResize,1e3)},s.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),r.removeEventListener(window,"resize",this._onResize),this._onResize=null},s.prototype._onTouch=function(){this.touch.allowDragging=!0},s.prototype._onPinch=function(){this.touch.allowDragging=!1},s.prototype._onDragStart=function(){this.touch.initialScrollTop=this.props.scrollTop},s.prototype._onDrag=function(t){if(this.touch.allowDragging){var e=t.gesture.deltaY,i=this._getScrollTop(),s=this._setScrollTop(this.touch.initialScrollTop+e);s!=i&&this.redraw()}},s.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},s.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("bottom"==this.options.orientation&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTopd;){d++;var l=n.getCurrent(),c=this.body.util.toScreen(l),p=n.isMajor();this.options.showMinorLabels&&this._repaintMinorText(c,n.getLabelMinor(),t),p&&this.options.showMajorLabels?(c>0&&(void 0==h&&(h=c),this._repaintMajorText(c,n.getLabelMajor(),t)),this._repaintMajorLine(c,t)):this._repaintMinorLine(c,t),n.next()}if(this.options.showMajorLabels){var u=this.body.util.toTime(0),f=n.getLabelMajor(u),g=f.length*(this.props.majorCharWidth||10)+10;(void 0==h||h>g)&&this._repaintMajorText(0,f,t)}o.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},s.prototype._repaintMinorText=function(t,e,i){var s=this.dom.redundant.minorTexts.shift();if(!s){var o=document.createTextNode("");s=document.createElement("div"),s.appendChild(o),s.className="text minor",this.dom.foreground.appendChild(s)}this.dom.minorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?this.props.majorLabelHeight+"px":"0",s.style.left=t+"px"},s.prototype._repaintMajorText=function(t,e,i){var s=this.dom.redundant.majorTexts.shift();if(!s){var o=document.createTextNode(e);s=document.createElement("div"),s.className="text major",s.appendChild(o),this.dom.foreground.appendChild(s)}this.dom.majorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?"0":this.props.minorLabelHeight+"px",s.style.left=t+"px"},s.prototype._repaintMinorLine=function(t,e){var i=this.dom.redundant.minorLines.shift();i||(i=document.createElement("div"),i.className="grid vertical minor",this.dom.background.appendChild(i)),this.dom.minorLines.push(i);var s=this.props;i.style.top="top"==e?s.majorLabelHeight+"px":this.body.domProps.top.height+"px",i.style.height=s.minorLineHeight+"px",i.style.left=t-s.minorLineWidth/2+"px"},s.prototype._repaintMajorLine=function(t,e){var i=this.dom.redundant.majorLines.shift();i||(i=document.createElement("DIV"),i.className="grid vertical major",this.dom.background.appendChild(i)),this.dom.majorLines.push(i);var s=this.props;i.style.top="top"==e?"0":this.body.domProps.top.height+"px",i.style.left=t-s.majorLineWidth/2+"px",i.style.height=s.majorLineHeight+"px"},s.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="text minor measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="text minor measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth},s.prototype.snap=function(t){return this.step.snap(t)},t.exports=s},function(t,e,i){function s(t,e,i){this.current=new Date,this._start=new Date,this._end=new Date,this.autoScale=!0,this.scale=s.SCALE.DAY,this.step=1,this.setRange(t,e,i)}var o=i(2);s.SCALE={MILLISECOND:1,SECOND:2,MINUTE:3,HOUR:4,DAY:5,WEEKDAY:6,MONTH:7,YEAR:8},s.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?new Date(t.valueOf()):new Date,this._end=void 0!=e?new Date(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},s.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},s.prototype.roundToMinor=function(){switch(this.scale){case s.SCALE.YEAR:this.current.setFullYear(this.step*Math.floor(this.current.getFullYear()/this.step)),this.current.setMonth(0);case s.SCALE.MONTH:this.current.setDate(1);case s.SCALE.DAY:case s.SCALE.WEEKDAY:this.current.setHours(0);case s.SCALE.HOUR:this.current.setMinutes(0);case s.SCALE.MINUTE:this.current.setSeconds(0);case s.SCALE.SECOND:this.current.setMilliseconds(0)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.setMilliseconds(this.current.getMilliseconds()-this.current.getMilliseconds()%this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()-this.current.getSeconds()%this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()-this.current.getMinutes()%this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()-this.current.getHours()%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()-1-(this.current.getDate()-1)%this.step+1);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()-this.current.getMonth()%this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()-this.current.getFullYear()%this.step)}},s.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},s.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current=new Date(this.current.valueOf()+1e3*this.step);break;case s.SCALE.MINUTE:this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case s.SCALE.HOUR:this.current=new Date(this.current.valueOf()+1e3*this.step*60*60);var e=this.current.getHours();this.current.setHours(e-e%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}else switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()+this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()+this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()+this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.getMilliseconds()0&&(this.step=e),this.autoScale=!1},s.prototype.setAutoScale=function(t){this.autoScale=t},s.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,o=864e5,n=36e5,r=6e4,a=1e3,h=1;1e3*e>t&&(this.scale=s.SCALE.YEAR,this.step=1e3),500*e>t&&(this.scale=s.SCALE.YEAR,this.step=500),100*e>t&&(this.scale=s.SCALE.YEAR,this.step=100),50*e>t&&(this.scale=s.SCALE.YEAR,this.step=50),10*e>t&&(this.scale=s.SCALE.YEAR,this.step=10),5*e>t&&(this.scale=s.SCALE.YEAR,this.step=5),e>t&&(this.scale=s.SCALE.YEAR,this.step=1),3*i>t&&(this.scale=s.SCALE.MONTH,this.step=3),i>t&&(this.scale=s.SCALE.MONTH,this.step=1),5*o>t&&(this.scale=s.SCALE.DAY,this.step=5),2*o>t&&(this.scale=s.SCALE.DAY,this.step=2),o>t&&(this.scale=s.SCALE.DAY,this.step=1),o/2>t&&(this.scale=s.SCALE.WEEKDAY,this.step=1),4*n>t&&(this.scale=s.SCALE.HOUR,this.step=4),n>t&&(this.scale=s.SCALE.HOUR,this.step=1),15*r>t&&(this.scale=s.SCALE.MINUTE,this.step=15),10*r>t&&(this.scale=s.SCALE.MINUTE,this.step=10),5*r>t&&(this.scale=s.SCALE.MINUTE,this.step=5),r>t&&(this.scale=s.SCALE.MINUTE,this.step=1),15*a>t&&(this.scale=s.SCALE.SECOND,this.step=15),10*a>t&&(this.scale=s.SCALE.SECOND,this.step=10),5*a>t&&(this.scale=s.SCALE.SECOND,this.step=5),a>t&&(this.scale=s.SCALE.SECOND,this.step=1),200*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=200),100*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=100),50*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=50),10*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=10),5*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=5),h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=1)}},s.prototype.snap=function(t){var e=new Date(t.valueOf());if(this.scale==s.SCALE.YEAR){var i=e.getFullYear()+Math.round(e.getMonth()/12);e.setFullYear(Math.round(i/this.step)*this.step),e.setMonth(0),e.setDate(0),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MONTH)e.getDate()>15?(e.setDate(1),e.setMonth(e.getMonth()+1)):e.setDate(1),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0);else if(this.scale==s.SCALE.DAY){switch(this.step){case 5:case 2:e.setHours(24*Math.round(e.getHours()/24));break;default:e.setHours(12*Math.round(e.getHours()/12))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.WEEKDAY){switch(this.step){case 5:case 2:e.setHours(12*Math.round(e.getHours()/12));break;default:e.setHours(6*Math.round(e.getHours()/6))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.HOUR){switch(this.step){case 4:e.setMinutes(60*Math.round(e.getMinutes()/60));break;default:e.setMinutes(30*Math.round(e.getMinutes()/30))}e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MINUTE){switch(this.step){case 15:case 10:e.setMinutes(5*Math.round(e.getMinutes()/5)),e.setSeconds(0);break;case 5:e.setSeconds(60*Math.round(e.getSeconds()/60));break;default:e.setSeconds(30*Math.round(e.getSeconds()/30))}e.setMilliseconds(0)}else if(this.scale==s.SCALE.SECOND)switch(this.step){case 15:case 10:e.setSeconds(5*Math.round(e.getSeconds()/5)),e.setMilliseconds(0);break;case 5:e.setMilliseconds(1e3*Math.round(e.getMilliseconds()/1e3));break;default:e.setMilliseconds(500*Math.round(e.getMilliseconds()/500))}else if(this.scale==s.SCALE.MILLISECOND){var o=this.step>5?this.step/2:1;e.setMilliseconds(Math.round(e.getMilliseconds()/o)*o)}return e},s.prototype.isMajor=function(){switch(this.scale){case s.SCALE.MILLISECOND:return 0==this.current.getMilliseconds();case s.SCALE.SECOND:return 0==this.current.getSeconds();case s.SCALE.MINUTE:return 0==this.current.getHours()&&0==this.current.getMinutes();case s.SCALE.HOUR:return 0==this.current.getHours();case s.SCALE.WEEKDAY:case s.SCALE.DAY:return 1==this.current.getDate();case s.SCALE.MONTH:return 0==this.current.getMonth();case s.SCALE.YEAR:return!1;default:return!1}},s.prototype.getLabelMinor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("SSS");case s.SCALE.SECOND:return o(t).format("s");case s.SCALE.MINUTE:return o(t).format("HH:mm");case s.SCALE.HOUR:return o(t).format("HH:mm");case s.SCALE.WEEKDAY:return o(t).format("ddd D");case s.SCALE.DAY:return o(t).format("D");case s.SCALE.MONTH:return o(t).format("MMM");case s.SCALE.YEAR:return o(t).format("YYYY");default:return""}},s.prototype.getLabelMajor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("HH:mm:ss");case s.SCALE.SECOND:return o(t).format("D MMMM HH:mm");case s.SCALE.MINUTE:case s.SCALE.HOUR:return o(t).format("ddd D MMMM");case s.SCALE.WEEKDAY:case s.SCALE.DAY:return o(t).format("MMMM YYYY");case s.SCALE.MONTH:return o(t).format("YYYY");case s.SCALE.YEAR:return"";default:return""}},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCurrentTime:!0,locales:a,locale:"en"},this.options=o.extend({},this.defaultOptions),this._create(),this.setOptions(e)}var o=i(1),n=i(22),r=i(2),a=i(27);s.prototype=new n,s.prototype._create=function(){var t=document.createElement("div");t.className="currenttime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},s.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},s.prototype.setOptions=function(t){t&&o.selectiveExtend(["showCurrentTime","locale","locales"],this.options,t)},s.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=new Date,i=this.body.util.toScreen(e),s=this.options.locales[this.options.locale],o=s.current+" "+s.time+": "+r(e).format("dddd, MMMM Do YYYY, H:mm:ss");o=o.charAt(0).toUpperCase()+o.substring(1),this.bar.style.left=i+"px",this.bar.title=o}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},s.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,s=1/i/10;30>s&&(s=30),s>1e3&&(s=1e3),e.redraw(),e.currentTimeTimer=setTimeout(t,s)}var e=this;t()},s.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},t.exports=s},function(t,e){e.en={current:"current",time:"time"},e.en_EN=e.en,e.en_US=e.en,e.nl={custom:"aangepaste",time:"tijd"},e.nl_NL=e.nl,e.nl_BE=e.nl},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCustomTime:!1,locales:h,locale:"en"},this.options=n.extend({},this.defaultOptions),this.customTime=new Date,this.eventParams={},this._create(),this.setOptions(e)}var o=i(18),n=i(1),r=i(22),a=i(2),h=i(27);s.prototype=new r,s.prototype.setOptions=function(t){t&&n.selectiveExtend(["showCustomTime","locale","locales"],this.options,t)},s.prototype._create=function(){var t=document.createElement("div");t.className="customtime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t;var e=document.createElement("div");e.style.position="relative",e.style.top="0px",e.style.left="-10px",e.style.height="100%",e.style.width="20px",t.appendChild(e),this.hammer=o(t,{prevent_default:!0}),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this))},s.prototype.destroy=function(){this.options.showCustomTime=!1,this.redraw(),this.hammer.enable(!1),this.hammer=null,this.body=null},s.prototype.redraw=function(){if(this.options.showCustomTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar));var e=this.body.util.toScreen(this.customTime),i=this.options.locales[this.options.locale],s=i.time+": "+a(this.customTime).format("dddd, MMMM Do YYYY, H:mm:ss");s=s.charAt(0).toUpperCase()+s.substring(1),this.bar.style.left=e+"px",this.bar.title=s}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar);return!1},s.prototype.setCustomTime=function(t){this.customTime=new Date(t.valueOf()),this.redraw()},s.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())},s.prototype._onDragStart=function(t){this.eventParams.dragging=!0,this.eventParams.customTime=this.customTime,t.stopPropagation(),t.preventDefault()},s.prototype._onDrag=function(t){if(this.eventParams.dragging){var e=t.gesture.deltaX,i=this.body.util.toScreen(this.eventParams.customTime)+e,s=this.body.util.toTime(i);this.setCustomTime(s),this.body.emitter.emit("timechange",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault()}},s.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.body.emitter.emit("timechanged",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault())},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={type:null,orientation:"bottom",align:"center",stack:!0,groupOrder:null,selectable:!0,editable:{updateTime:!1,updateGroup:!1,add:!1,remove:!1},onAdd:function(t,e){e(t)},onUpdate:function(t,e){e(t)},onMove:function(t,e){e(t)},onRemove:function(t,e){e(t)},margin:{item:{horizontal:10,vertical:10},axis:20},padding:5},this.options=r.extend({},this.defaultOptions),this.itemOptions={type:{start:"Date",end:"Date"}},this.conversion={toScreen:t.util.toScreen,toTime:t.util.toTime},this.dom={},this.props={},this.hammer=null;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.groups={},this.groupIds=[],this.selection=[],this.stackDirty=!0,this.touchParams={},this._create(),this.setOptions(e)}function o(t,e){if(e&&e.groupId!=t.data.group){var i=t.parent;i.remove(t),i.order(),e.add(t),e.order(),t.data.group=e.groupId}}var n=i(18),r=i(1),a=i(7),h=i(8),d=i(22),l=i(30),c=i(34),p=i(35),u=i(32),f="__ungrouped__";s.prototype=new d,s.types={box:c,range:u,point:p},s.prototype._create=function(){var t=document.createElement("div");t.className="itemset",t["timeline-itemset"]=this,this.dom.frame=t;var e=document.createElement("div");e.className="background",t.appendChild(e),this.dom.background=e;var i=document.createElement("div");i.className="foreground",t.appendChild(i),this.dom.foreground=i;var s=document.createElement("div");s.className="axis",this.dom.axis=s;var o=document.createElement("div");o.className="labelset",this.dom.labelSet=o,this._updateUngrouped(),this.hammer=n(this.body.dom.centerContainer,{prevent_default:!0}),this.hammer.on("touch",this._onTouch.bind(this)),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this)),this.hammer.on("tap",this._onSelectItem.bind(this)),this.hammer.on("hold",this._onMultiSelectItem.bind(this)),this.hammer.on("doubletap",this._onAddItem.bind(this)),this.show()},s.prototype.setOptions=function(t){if(t){var e=["type","align","orientation","padding","stack","selectable","groupOrder"];r.selectiveExtend(e,this.options,t),"margin"in t&&("number"==typeof t.margin?(this.options.margin.axis=t.margin,this.options.margin.item.horizontal=t.margin,this.options.margin.item.vertical=t.margin):"object"==typeof t.margin&&(r.selectiveExtend(["axis"],this.options.margin,t.margin),"item"in t.margin&&("number"==typeof t.margin.item?(this.options.margin.item.horizontal=t.margin.item,this.options.margin.item.vertical=t.margin.item):"object"==typeof t.margin.item&&r.selectiveExtend(["horizontal","vertical"],this.options.margin.item,t.margin.item)))),"editable"in t&&("boolean"==typeof t.editable?(this.options.editable.updateTime=t.editable,this.options.editable.updateGroup=t.editable,this.options.editable.add=t.editable,this.options.editable.remove=t.editable):"object"==typeof t.editable&&r.selectiveExtend(["updateTime","updateGroup","add","remove"],this.options.editable,t.editable));var i=function(e){if(e in t){var i=t[e];if(!(i instanceof Function))throw new Error("option "+e+" must be a function "+e+"(item, callback)");this.options[e]=i}}.bind(this);["onAdd","onUpdate","onRemove","onMove"].forEach(i),this.markDirty()}},s.prototype.markDirty=function(){this.groupIds=[],this.stackDirty=!0},s.prototype.destroy=function(){this.hide(),this.setItems(null),this.setGroups(null),this.hammer=null,this.body=null,this.conversion=null},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.axis.parentNode&&this.dom.axis.parentNode.removeChild(this.dom.axis),this.dom.labelSet.parentNode&&this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame),this.dom.axis.parentNode||this.body.dom.top.appendChild(this.dom.axis),this.dom.labelSet.parentNode||this.body.dom.left.appendChild(this.dom.labelSet)},s.prototype.setSelection=function(t){var e,i,s,o;for(void 0==t&&(t=[]),Array.isArray(t)||(t=[t]),e=0,i=this.selection.length;i>e;e++)s=this.selection[e],o=this.items[s],o&&o.unselect();for(this.selection=[],e=0,i=t.length;i>e;e++)s=t[e],o=this.items[s],o&&(this.selection.push(s),o.select())},s.prototype.getSelection=function(){return this.selection.concat([])},s.prototype.getVisibleItems=function(){var t=this.body.range.getRange(),e=this.body.util.toScreen(t.start),i=this.body.util.toScreen(t.end),s=[];for(var o in this.groups)if(this.groups.hasOwnProperty(o))for(var n=this.groups[o],r=n.visibleItems,a=0;ae&&s.push(h.id)}return s},s.prototype._deselect=function(t){for(var e=this.selection,i=0,s=e.length;s>i;i++)if(e[i]==t){e.splice(i,1);break}},s.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=r.option.asSize,s=this.options,o=s.orientation,n=!1,a=this.dom.frame,h=s.editable.updateTime||s.editable.updateGroup;a.className="itemset"+(h?" editable":""),n=this._orderGroups()||n;var d=e.end-e.start,l=d!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;l&&(this.stackDirty=!0),this.lastVisibleInterval=d,this.props.lastWidth=this.props.width;var c=this.stackDirty,p=this._firstGroup(),u={item:t.item,axis:t.axis},f={item:t.item,axis:t.item.vertical/2},g=0,m=t.axis+t.item.vertical;return r.forEach(this.groups,function(t){var i=t==p?u:f,s=t.redraw(e,i,c);n=s||n,g+=t.height}),g=Math.max(g,m),this.stackDirty=!1,a.style.height=i(g),this.props.top=a.offsetTop,this.props.left=a.offsetLeft,this.props.width=a.offsetWidth,this.props.height=g,this.dom.axis.style.top=i("top"==o?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.dom.axis.style.left="0",n=this._isResized()||n},s.prototype._firstGroup=function(){var t="top"==this.options.orientation?0:this.groupIds.length-1,e=this.groupIds[t],i=this.groups[e]||this.groups[f];return i||null},s.prototype._updateUngrouped=function(){var t=this.groups[f];if(this.groupsData)t&&(t.hide(),delete this.groups[f]);else if(!t){var e=null,i=null;t=new l(e,i,this),this.groups[f]=t;for(var s in this.items)this.items.hasOwnProperty(s)&&t.add(this.items[s]);t.show()}},s.prototype.getLabelSet=function(){return this.dom.labelSet},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof a||t instanceof h))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(r.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var o=this.id;r.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,o)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}},s.prototype.getItems=function(){return this.itemsData},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(r.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof a||t instanceof h))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;r.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("change")},s.prototype.getGroups=function(){return this.groupsData},s.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t) +})},s.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i=e.itemsData.get(t,e.itemOptions),o=e.items[t],n=i.type||e.options.type||(i.end?"range":"box"),r=s.types[n];if(o&&(r&&o instanceof r?e._updateItem(o,i):(e._removeItem(o),o=null)),!o){if(!r)throw new TypeError("rangeoverflow"==n?'Item type "rangeoverflow" is deprecated. Use css styling instead: .vis.timeline .item.range .content {overflow: visible;}':'Unknown item type "'+n+'"');o=new r(i,e.conversion,e.options),o.id=t,e._addItem(o)}}),this._order(),this.stackDirty=!0,this.body.emitter.emit("change")},s.prototype._onAdd=s.prototype._onUpdate,s.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var s=i.items[t];s&&(e++,i._removeItem(s))}),e&&(this._order(),this.stackDirty=!0,this.body.emitter.emit("change"))},s.prototype._order=function(){r.forEach(this.groups,function(t){t.order()})},s.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},s.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),s=e.groups[t];if(s)s.setData(i);else{if(t==f)throw new Error("Illegal group id. "+t+" is a reserved id.");var o=Object.create(e.options);r.extend(o,{height:null}),s=new l(t,i,e),e.groups[t]=s;for(var n in e.items)if(e.items.hasOwnProperty(n)){var a=e.items[n];a.data.group==t&&s.add(a)}s.order(),s.show()}}),this.body.emitter.emit("change")},s.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("change")},s.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder}),e=!r.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},s.prototype._addItem=function(t){this.items[t.id]=t;var e=this.groupsData?t.data.group:f,i=this.groups[e];i&&i.add(t)},s.prototype._updateItem=function(t,e){var i=t.data.group;if(t.data=e,t.displayed&&t.redraw(),i!=t.data.group){var s=this.groups[i];s&&s.remove(t);var o=this.groupsData?t.data.group:f,n=this.groups[o];n&&n.add(t)}},s.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1);var i=this.groupsData?t.data.group:f,s=this.groups[i];s&&s.remove(t)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0||o.length>0)&&this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}},s.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=this.body.util.snap||null,o=s.itemFromTarget(t);if(o){var n=e.itemsData.get(o.id);this.options.onUpdate(n,function(t){t&&e.itemsData.update(t)})}else{var a=r.getAbsoluteLeft(this.dom.frame),h=t.gesture.center.pageX-a,d=this.body.util.toTime(h),l={start:i?i(d):d,content:"new item"};if("range"===this.options.type){var c=this.body.util.toTime(h+this.props.width/5);l.end=i?i(c):c}l[this.itemsData.fieldId]=r.randomUUID();var p=s.groupFromTarget(t);p&&(l.group=p.groupId),this.options.onAdd(l,function(t){t&&e.itemsData.add(l)})}}},s.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e,i=s.itemFromTarget(t);if(i){e=this.getSelection();var o=e.indexOf(i.id);-1==o?e.push(i.id):e.splice(o,1),this.setSelection(e),this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}}},s.itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},s.groupFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-group"))return e["timeline-group"];e=e.parentNode}return null},s.itemSetFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-itemset"))return e["timeline-itemset"];e=e.parentNode}return null},t.exports=s},function(t,e,i){function s(t,e,i){this.groupId=t,this.itemSet=i,this.dom={},this.props={label:{width:0,height:0}},this.className=null,this.items={},this.visibleItems=[],this.orderedItems={byStart:[],byEnd:[]},this._create(),this.setData(e)}var o=i(1),n=i(31),r=i(32);s.prototype._create=function(){var t=document.createElement("div");t.className="vlabel",this.dom.label=t;var e=document.createElement("div");e.className="inner",t.appendChild(e),this.dom.inner=e;var i=document.createElement("div");i.className="group",i["timeline-group"]=this,this.dom.foreground=i,this.dom.background=document.createElement("div"),this.dom.background.className="group",this.dom.axis=document.createElement("div"),this.dom.axis.className="group",this.dom.marker=document.createElement("div"),this.dom.marker.style.visibility="hidden",this.dom.marker.innerHTML="?",this.dom.background.appendChild(this.dom.marker)},s.prototype.setData=function(t){var e=t&&t.content;e instanceof Element?this.dom.inner.appendChild(e):this.dom.inner.innerHTML=void 0!==e&&null!==e?e:this.groupId||"",this.dom.label.title=t&&t.title||"",this.dom.inner.firstChild?o.removeClassName(this.dom.inner,"hidden"):o.addClassName(this.dom.inner,"hidden");var i=t&&t.className||null;i!=this.className&&(this.className&&(o.removeClassName(this.dom.label,i),o.removeClassName(this.dom.foreground,i),o.removeClassName(this.dom.background,i),o.removeClassName(this.dom.axis,i)),o.addClassName(this.dom.label,i),o.addClassName(this.dom.foreground,i),o.addClassName(this.dom.background,i),o.addClassName(this.dom.axis,i))},s.prototype.getLabelWidth=function(){return this.props.label.width},s.prototype.redraw=function(t,e,i){var s=!1;this.visibleItems=this._updateVisibleItems(this.orderedItems,this.visibleItems,t);var r=this.dom.marker.clientHeight;r!=this.lastMarkerHeight&&(this.lastMarkerHeight=r,o.forEach(this.items,function(t){t.dirty=!0,t.displayed&&t.redraw()}),i=!0),this.itemSet.options.stack?n.stack(this.visibleItems,e,i):n.nostack(this.visibleItems,e);var a,h=this.visibleItems;if(h.length){var d=h[0].top,l=h[0].top+h[0].height;if(o.forEach(h,function(t){d=Math.min(d,t.top),l=Math.max(l,t.top+t.height)}),d>e.axis){var c=d-e.axis;l-=c,o.forEach(h,function(t){t.top-=c})}a=l+e.item.vertical/2}else a=e.axis+e.item.vertical;a=Math.max(a,this.props.label.height);var p=this.dom.foreground;this.top=p.offsetTop,this.left=p.offsetLeft,this.width=p.offsetWidth,s=o.updateProperty(this,"height",a)||s,s=o.updateProperty(this.props.label,"width",this.dom.inner.clientWidth)||s,s=o.updateProperty(this.props.label,"height",this.dom.inner.clientHeight)||s,this.dom.background.style.height=a+"px",this.dom.foreground.style.height=a+"px",this.dom.label.style.height=a+"px";for(var u=0,f=this.visibleItems.length;f>u;u++){var g=this.visibleItems[u];g.repositionY()}return s},s.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},s.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var s=this.dom.axis;s.parentNode&&s.parentNode.removeChild(s)},s.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},s.prototype.remove=function(t){delete this.items[t.id],t.setParent(this.itemSet);var e=this.visibleItems.indexOf(t);-1!=e&&this.visibleItems.splice(e,1)},s.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},s.prototype.order=function(){var t=o.toArray(this.items);this.orderedItems.byStart=t,this.orderedItems.byEnd=this._constructByEndArray(t),n.orderByStart(this.orderedItems.byStart),n.orderByEnd(this.orderedItems.byEnd)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0)for(n=0;n=0&&!this._checkIfInvisible(t.byStart[n],r,i);n--);for(n=s+1;n=0&&!this._checkIfInvisible(t.byEnd[n],r,i);n--);for(n=a+1;no;o++)t[o].top=null;for(o=0,n=t.length;n>o;o++){var r=t[o];if(null===r.top){r.top=i.axis;do{for(var a=null,h=0,d=t.length;d>h;h++){var l=t[h];if(null!==l.top&&l!==r&&e.collision(r,l,i.item)){a=l;break}}null!=a&&(r.top=a.top+a.height+i.item.vertical)}while(a)}}},e.nostack=function(t,e){var i,s;for(i=0,s=t.length;s>i;i++)t[i].top=e.axis},e.collision=function(t,e,s){return t.left-s.horizontal+ie.left&&t.top-s.vertical+ie.top}},function(t,e,i){function s(t,e,i){if(this.props={content:{width:0}},this.overflow=!1,t){if(void 0==t.start)throw new Error('Property "start" missing in item '+t.id);if(void 0==t.end)throw new Error('Property "end" missing in item '+t.id)}n.call(this,t,e,i)}var o=i(18),n=i(33);s.prototype=new n(null,null,null),s.prototype.baseClassName="item range",s.prototype.isVisible=function(t){return this.data.startt.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),t.box["timeline-item"]=this),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.foreground;if(!e)throw new Error("Cannot redraw time axis: parent has no foreground container element");e.appendChild(t.box)}if(this.displayed=!0,this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)t.content.innerHTML="",t.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);t.content.innerHTML=this.content}this.dirty=!0}this.data.title!=this.title&&(t.box.title=this.data.title,this.title=this.data.title);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");this.className!=i&&(this.className=i,t.box.className=this.baseClassName+i,this.dirty=!0),this.dirty&&(this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dirty=!1),this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},s.prototype.show=function(){this.displayed||this.redraw()},s.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.top=null,this.left=null,this.displayed=!1}},s.prototype.repositionX=function(){var t,e=this.props,i=this.parent.width,s=this.conversion.toScreen(this.data.start),o=this.conversion.toScreen(this.data.end),n=this.options.padding;-i>s&&(s=-i),o>2*i&&(o=2*i);var r=Math.max(o-s,1);this.overflow?(t=Math.max(-s,0),this.left=s,this.width=r+this.props.content.width):(t=0>s?Math.min(-s,o-s-e.content.width-2*n):0,this.left=s,this.width=r),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=r+"px",this.dom.content.style.left=t+"px"},s.prototype.repositionY=function(){var t=this.options.orientation,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},s.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="drag-left",t.dragLeftItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragLeft=t}else!this.selected&&this.dom.dragLeft&&(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},s.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="drag-right",t.dragRightItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragRight=t}else!this.selected&&this.dom.dragRight&&(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=s},function(t,e,i){function s(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.dirty=!0,this.top=null,this.left=null,this.width=null,this.height=null}var o=i(18);s.prototype.select=function(){this.selected=!0,this.displayed&&this.redraw()},s.prototype.unselect=function(){this.selected=!1,this.displayed&&this.redraw()},s.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},s.prototype.isVisible=function(){return!1},s.prototype.show=function(){return!1},s.prototype.hide=function(){return!1},s.prototype.redraw=function(){},s.prototype.repositionX=function(){},s.prototype.repositionY=function(){},s.prototype._repaintDeleteButton=function(t){if(this.selected&&this.options.editable.remove&&!this.dom.deleteButton){var e=this,i=document.createElement("div");i.className="delete",i.title="Delete this item",o(i,{preventDefault:!0}).on("tap",function(t){e.parent.removeFromDataSet(e),t.stopPropagation()}),t.appendChild(i),this.dom.deleteButton=i}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);o.call(this,t,e,i)}var o=i(33);s.prototype=new o(null,null,null),s.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.startt.start-e&&this.data.start-1?!1:"INPUT"==i||"SELECT"==i||"TEXTAREA"==i||e.contentEditable&&"true"==e.contentEditable}function o(t,e){return t.sort().join(",")===e.sort().join(",")}function n(t){t=t||{};var e,i=!1;for(e in E)t[e]?i=!0:E[e]=0;i||(T=!1)}function r(t,e,i,s,n){var r,a,h=[];if(!M[t])return[];for("keyup"==i&&c(t)&&(e=[t]),r=0;r95&&112>t||_.hasOwnProperty(t)&&(y[_[t]]=t)}return y}function f(t,e,i){return i||(i=u()[t]?"keydown":"keypress"),"keypress"==i&&e.length&&(i="keydown"),i}function g(t,e,s,o){E[t]=0,o||(o=f(e[0],[]));var r,a=function(){T=o,++E[t],p()},d=function(t){h(s,t),"keyup"!==o&&(D=i(t)),setTimeout(n,10)};for(r=0;r1)return g(t,d,e,i);for(h="+"===t?["+"]:t.split("+"),n=0;n":".","?":"/","|":"\\"},S={option:"alt",command:"meta","return":"enter",escape:"esc"},M={},C={},E={},D=!1,T=!1,O=1;20>O;++O)_[111+O]="f"+O;for(O=0;9>=O;++O)_[O+96]=O;e(document,"keypress",l),e(document,"keydown",l),e(document,"keyup",l);var L={bind:function(t,e,i){return v(t instanceof Array?t:[t],e,i),C[t+":"+i]=e,this},unbind:function(t,e){return C[t+":"+e]&&(delete C[t+":"+e],this.bind(t,function(){},e)),this},trigger:function(t,e){return C[t+":"+e](),this},reset:function(){return M={},C={},this}};t.exports=L},function(t,e,i){function s(t,e,i,s){var n=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},util:{snap:null,toScreen:n._toScreen.bind(n),toGlobalScreen:n._toGlobalScreen.bind(n),toTime:n._toTime.bind(n),toGlobalTime:n._toGlobalTime.bind(n)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.linegraph=new p(this.body),this.components.push(this.linegraph),this.itemsData=null,this.groupsData=null,i&&this.setOptions(i),s&&this.setGroups(s),e?this.setItems(e):this.redraw()}var o=(i(10),i(18),i(1)),n=i(7),r=i(8),a=i(20),h=i(23),d=i(24),l=i(26),c=i(28),p=i(39);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.linegraph&&this.linegraph.setItems(e),i&&("start"in this.options||"end"in this.options)){this.fit();var s="start"in this.options?o.convert(this.options.start,"Date"):null,a="end"in this.options?o.convert(this.options.end,"Date"):null;this.setWindow(s,a)}},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.linegraph.setGroups(e)},s.prototype.getLegend=function(t,e,i){return void 0===e&&(e=15),void 0===i&&(i=15),void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].getLegend(e,i):"cannot find group:"+t},s.prototype.isGroupVisible=function(t){return void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].visible&&(void 0===this.options.groups.visibility[t]||1==this.options.groups.visibility[t]):!1},s.prototype.getItemRange=function(){var t=null,e=null;for(var i in this.linegraph.groups)if(this.linegraph.groups.hasOwnProperty(i)&&1==this.linegraph.groups[i].visible)for(var s=0;sr?r:t,e=null==e?r:r>e?r:e}return{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},t.exports=s},function(t,e,i){function s(t,e){this.id=o.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,handleOverlap:"overlap",align:"center"},catmullRom:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:"40px",visible:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}}},legend:{enabled:!1,icons:!0,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}},groups:{visibility:{}}},this.options=o.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={},this.abortedGraphUpdate=!1;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechange",function(){if(0!=i.lastStart){var t=i.body.range.start-i.lastStart,e=i.body.range.end-i.body.range.start; +if(0!=i.width){var s=i.width/e,o=t*s;i.svg.style.left=-i.width-o+"px"}}}),this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=o.option.asSize(-i.width),i._updateGraph.apply(i)}),this._create(),this.body.emitter.emit("change")}var o=i(1),n=i(6),r=i(7),a=i(8),h=i(22),d=i(40),l=i(42),c=i(43),p="__ungrouped__";s.prototype=new h,s.prototype._create=function(){var t=document.createElement("div");t.className="LineGraph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),this.options.dataAxis.orientation="right",this.yAxisRight=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),delete this.options.dataAxis.orientation,this.legendLeft=new c(this.body,this.options.legend,"left",this.options.groups),this.legendRight=new c(this.body,this.options.legend,"right",this.options.groups),this.show()},s.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort","groups"];o.selectiveDeepExtend(e,this.options,t),o.mergeOptions(this.options,t,"catmullRom"),o.mergeOptions(this.options,t,"drawPoints"),o.mergeOptions(this.options,t,"shaded"),o.mergeOptions(this.options,t,"legend"),t.catmullRom&&"object"==typeof t.catmullRom&&t.catmullRom.parametrization&&("uniform"==t.catmullRom.parametrization?this.options.catmullRom.alpha=0:"chordal"==t.catmullRom.parametrization?this.options.catmullRom.alpha=1:(this.options.catmullRom.parametrization="centripetal",this.options.catmullRom.alpha=.5)),this.yAxisLeft&&void 0!==t.dataAxis&&(this.yAxisLeft.setOptions(this.options.dataAxis),this.yAxisRight.setOptions(this.options.dataAxis)),this.legendLeft&&void 0!==t.legend&&(this.legendLeft.setOptions(this.options.legend),this.legendRight.setOptions(this.options.legend)),this.groups.hasOwnProperty(p)&&this.groups[p].setOptions(t)}this.dom.frame&&this._updateGraph()},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(o.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;o.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e)}this._updateUngrouped(),this._updateGraph(),this.redraw()},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(o.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;o.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._onUpdate()},s.prototype._onUpdate=function(){this._updateUngrouped(),this._updateAllGroupData(),this._updateGraph(),this.redraw()},s.prototype._onAdd=function(t){this._onUpdate(t)},s.prototype._onRemove=function(t){this._onUpdate(t)},s.prototype._onUpdateGroups=function(t){for(var e=0;e0){var d=this.body.util.toGlobalTime(-this.body.domProps.root.width),l=this.body.util.toGlobalTime(2*this.body.domProps.root.width),c={};for(this._getRelevantData(a,c,d,l),e=0;e0)for(r=0;rs){d.push(h);break}d.push(h)}}else for(a=0;ai&&h.x0)for(var s=0;s0){var n=1,r=o.length,a=this.body.util.toGlobalScreen(o[o.length-1].x)-this.body.util.toGlobalScreen(o[0].x),h=r/a;n=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=[],l=0;r>l;l+=n)d.push(o[l]);e[t[s]]=d}}},s.prototype._getYRanges=function(t,e,i){var s,o,n,r,a,h=[],d=[];if(t.length>0){for(n=0;n0)if(o=this.groups[t[n]],"line"==o.options.style||"stack"!=o.options.barChart.handleOverlap){var l=s[0].y,c=s[0].y;for(r=0;rs[r].y?s[r].y:l,c=c0&&(h.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x}),p={},this._getDataIntersections(p,h),i.__barchartLeft=this._getStackedBarYRange(p,h),i.__barchartLeft.yAxisOrientation="left",t.push("__barchartLeft")),d.length>0&&(d.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x}),p={},this._getDataIntersections(p,d),i.__barchartRight=this._getStackedBarYRange(p,d),i.__barchartRight.yAxisOrientation="right",t.push("__barchartRight"))}},s.prototype._getStackedBarYRange=function(t,e){for(var i,s=e[0].y,o=e[0].y,n=0;ne[n].y?e[n].y:s,o=ot[r].accumulated?t[r].accumulated:s,o=o0){for(var c=0;ci?i:a,d=s>d?s:d):(r=!0,h=h>i?i:h,l=s>l?s:l));1==n&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}return o=this._toggleAxisVisiblity(n,this.yAxisLeft)||o,o=this._toggleAxisVisiblity(r,this.yAxisRight)||o,1==r&&1==n?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!n,0==this.yAxisRight.master?(this.yAxisLeft.lineOffset=1==r?this.yAxisRight.width:0,o=this.yAxisLeft.redraw()||o,this.yAxisRight.stepPixelsForced=this.yAxisLeft.stepPixels,o=this.yAxisRight.redraw()||o):o=this.yAxisRight.redraw()||o,-1!=t.indexOf("__barchartLeft")&&t.splice(t.indexOf("__barchartLeft"),1),-1!=t.indexOf("__barchartRight")&&t.splice(t.indexOf("__barchartRight"),1),o},s.prototype._toggleAxisVisiblity=function(t,e){var i=!1;return 0==t?e.dom.frame.parentNode&&(e.hide(),i=!0):e.dom.frame.parentNode||(e.show(),i=!0),i},s.prototype._drawBarGraphs=function(t,e){var i,s,o,r,a,h,d=[],l={},c=0;for(a=0;a0&&(i=Math.min(i,Math.abs(d[a-1].x-s))),o=this._getSafeDrawData(i,r,p);else{var f=a+(l[s].amount-l[s].resolved),g=a-(l[s].resolved+1);f0&&(i=Math.min(i,Math.abs(d[g].x-s))),o=this._getSafeDrawData(i,r,p),l[s].resolved+=1,"stack"==r.options.barChart.handleOverlap?(u=l[s].accumulated,l[s].accumulated+=r.zeroPosition-d[a].y):"sideBySide"==r.options.barChart.handleOverlap&&(o.width=o.width/l[s].amount,o.offset+=l[s].resolved*o.width-.5*o.width*(l[s].amount+1),"left"==r.options.barChart.align?o.offset-=.5*o.width:"right"==r.options.barChart.align&&(o.offset+=.5*o.width))}n.drawBar(d[a].x+o.offset,d[a].y-u,o.width,r.zeroPosition-d[a].y,r.className+" bar",this.svgElements,this.svg),1==r.options.drawPoints.enabled&&n.drawPoint(d[a].x+o.offset,d[a].y-u,r,this.svgElements,this.svg)}},s.prototype._getDataIntersections=function(t,e){for(var i,s=0;s0&&(i=Math.min(i,Math.abs(e[s-1].x-e[s].x))),0==i&&(void 0===t[e[s].x]&&(t[e[s].x]={amount:0,resolved:0,accumulated:0}),t[e[s].x].amount+=1)},s.prototype._getSafeDrawData=function(t,e,i){var s,o;return t0?(s=i>t?i:t,o=0,"left"==e.options.barChart.align?o-=.5*t:"right"==e.options.barChart.align&&(o+=.5*t)):(s=e.options.barChart.width,o=0,"left"==e.options.barChart.align?o-=.5*e.options.barChart.width:"right"==e.options.barChart.align&&(o+=.5*e.options.barChart.width)),{width:s,offset:o}},s.prototype._drawLineGraph=function(t,e){if(null!=t&&t.length>0){var i,s,o=Number(this.svg.style.height.replace("px",""));if(i=n.getSVGElement("path",this.svgElements,this.svg),i.setAttributeNS(null,"class",e.className),s=1==e.options.catmullRom.enabled?this._catmullRom(t,e):this._linear(t),1==e.options.shaded.enabled){var r,a=n.getSVGElement("path",this.svgElements,this.svg);r="top"==e.options.shaded.orientation?"M"+t[0].x+",0 "+s+"L"+t[t.length-1].x+",0":"M"+t[0].x+","+o+" "+s+"L"+t[t.length-1].x+","+o,a.setAttributeNS(null,"class",e.className+" fill"),a.setAttributeNS(null,"d",r)}i.setAttributeNS(null,"d","M"+s),1==e.options.drawPoints.enabled&&this._drawPoints(t,e,this.svgElements,this.svg)}},s.prototype._drawPoints=function(t,e,i,s,o){void 0===o&&(o=0);for(var r=0;rl;l++)e=0==l?t[0]:t[l-1],i=t[l],s=t[l+1],o=d>l+2?t[l+2]:s,n={x:(-e.x+6*i.x+s.x)*h,y:(-e.y+6*i.y+s.y)*h},r={x:(i.x+6*s.x-o.x)*h,y:(i.y+6*s.y-o.y)*h},a+="C"+n.x+","+n.y+" "+r.x+","+r.y+" "+s.x+","+s.y+" ";return a},s.prototype._catmullRom=function(t,e){var i=e.options.catmullRom.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);for(var s,o,n,r,a,h,d,l,c,p,u,f,g,m,v,y,b,_,x,w=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",S=t.length,M=0;S-1>M;M++)s=0==M?t[0]:t[M-1],o=t[M],n=t[M+1],r=S>M+2?t[M+2]:n,d=Math.sqrt(Math.pow(s.x-o.x,2)+Math.pow(s.y-o.y,2)),l=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),c=Math.sqrt(Math.pow(n.x-r.x,2)+Math.pow(n.y-r.y,2)),m=Math.pow(c,i),y=Math.pow(c,2*i),v=Math.pow(l,i),b=Math.pow(l,2*i),x=Math.pow(d,i),_=Math.pow(d,2*i),p=2*_+3*x*v+b,u=2*y+3*m*v+b,f=3*x*(x+v),f>0&&(f=1/f),g=3*m*(m+v),g>0&&(g=1/g),a={x:(-b*s.x+p*o.x+_*n.x)*f,y:(-b*s.y+p*o.y+_*n.y)*f},h={x:(y*o.x+u*n.x-b*r.x)*g,y:(y*o.y+u*n.y-b*r.y)*g},0==a.x&&0==a.y&&(a=o),0==h.x&&0==h.y&&(h=n),w+="C"+a.x+","+a.y+" "+h.x+","+h.y+" "+n.x+","+n.y+" ";return w},s.prototype._linear=function(t){for(var e="",i=0;ih;h++)i.previous();o=this.height/s}else o+=.25;this.valueAtZero=i.marginEnd;var d=0,l=1;this.maxLabelSize=0;for(var c=0;l=0&&this._redrawLabel(c-2,i.getCurrent(),t,"yAxis major",this.props.majorCharHeight),this._redrawLine(c,t,"grid horizontal major",this.options.majorLinesOffset,this.props.majorLineWidth)):this._redrawLine(c,t,"grid horizontal minor",this.options.minorLinesOffset,this.props.minorLineWidth),l++}this.conversionFactor=0==this.master?c/(this.valueAtZero-i.current):this.dom.frame.offsetHeight/i.marginRange;var u=1==this.options.icons?this.options.iconWidth+this.options.labelOffsetX+15:this.options.labelOffsetX+15;return this.maxLabelSize>this.width-u&&1==this.options.visible?(this.width=this.maxLabelSize+u,this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+u),this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):(n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),!1)},s.prototype.convertValue=function(t){var e=this.valueAtZero-t,i=e*this.conversionFactor;return i},s.prototype._redrawLabel=function(t,e,i,s,o){var r=n.getDOMElement("div",this.DOMelements.labels,this.dom.frame);r.className=s,r.innerHTML=e,"left"==i?(r.style.left="-"+this.options.labelOffsetX+"px",r.style.textAlign="right"):(r.style.right="-"+this.options.labelOffsetX+"px",r.style.textAlign="left"),r.style.top=t-.5*o+this.options.labelOffsetY+"px",e+="";var a=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSizen&&(h=n);for(var d=!1,l=h;Math.abs(l)<=Math.abs(n);l++){a=Math.pow(10,l);for(var c=0;c=o){d=!0,r=c;break}}if(1==d)break}this.stepIndex=r,this.scale=a,this.step=a*this.minorSteps[r]},e.prototype.setFirst=function(t){void 0===t&&(t={});var e=void 0===t.min?this._start-2*this.scale*this.minorSteps[this.stepIndex]:t.min,i=void 0===t.max?this._end+this.scale*this.minorSteps[this.stepIndex]:t.max;this.marginEnd=void 0===t.max?this.roundToMinor(i):t.max,this.marginStart=void 0===t.min?this.roundToMinor(e):t.min,this.deadSpace=this.roundToMinor(i)-i+this.roundToMinor(e)-e,this.marginRange=this.marginEnd-this.marginStart,this.current=this.marginEnd},e.prototype.roundToMinor=function(t){var e=t-t%(this.scale*this.minorSteps[this.stepIndex]);return t%(this.scale*this.minorSteps[this.stepIndex])>.5*this.scale*this.minorSteps[this.stepIndex]?e+this.scale*this.minorSteps[this.stepIndex]:e},e.prototype.hasNext=function(){return this.current>=this.marginStart},e.prototype.next=function(){var t=this.current;this.current-=this.step,this.current==t&&(this.current=this._end)},e.prototype.previous=function(){this.current+=this.step,this.marginEnd+=this.step,this.marginRange=this.marginEnd-this.marginStart},e.prototype.getCurrent=function(){for(var t=""+Number(this.current).toPrecision(5),e=t.length-1;e>0;e--){if("0"!=t[e]){if("."==t[e]||","==t[e]){t=t.slice(0,e);break}break}t=t.slice(0,e)}return t},e.prototype.snap=function(){},e.prototype.isMajor=function(){return this.current%(this.scale*this.majorSteps[this.stepIndex])==0},t.exports=e},function(t,e,i){function s(t,e,i,s){this.id=e;var n=["sampling","style","sort","yAxisOrientation","barChart","drawPoints","shaded","catmullRom"];this.options=o.selectiveBridgeObject(n,i),this.usingDefaultStyle=void 0===t.className,this.groupsUsingDefaultStyles=s,this.zeroPosition=0,this.update(t),1==this.usingDefaultStyle&&(this.groupsUsingDefaultStyles[0]+=1),this.itemsData=[],this.visible=void 0===t.visible?!0:t.visible}var o=i(1),n=i(6);s.prototype.setItems=function(t){null!=t?(this.itemsData=t,1==this.options.sort&&this.itemsData.sort(function(t,e){return t.x-e.x})):this.itemsData=[]},s.prototype.setZeroPosition=function(t){this.zeroPosition=t},s.prototype.setOptions=function(t){if(void 0!==t){var e=["sampling","style","sort","yAxisOrientation","barChart"];o.selectiveDeepExtend(e,this.options,t),o.mergeOptions(this.options,t,"catmullRom"),o.mergeOptions(this.options,t,"drawPoints"),o.mergeOptions(this.options,t,"shaded"),t.catmullRom&&"object"==typeof t.catmullRom&&t.catmullRom.parametrization&&("uniform"==t.catmullRom.parametrization?this.options.catmullRom.alpha=0:"chordal"==t.catmullRom.parametrization?this.options.catmullRom.alpha=1:(this.options.catmullRom.parametrization="centripetal",this.options.catmullRom.alpha=.5))}},s.prototype.update=function(t){this.group=t,this.content=t.content||"graph",this.className=t.className||this.className||"graphGroup"+this.groupsUsingDefaultStyles[0]%10,this.visible=void 0===t.visible?!0:t.visible,this.setOptions(t.options)},s.prototype.drawIcon=function(t,e,i,s,o,r){var a,h,d=.5*r,l=n.getSVGElement("rect",i,s);if(l.setAttributeNS(null,"x",t),l.setAttributeNS(null,"y",e-d),l.setAttributeNS(null,"width",o),l.setAttributeNS(null,"height",2*d),l.setAttributeNS(null,"class","outline"),"line"==this.options.style)a=n.getSVGElement("path",i,s),a.setAttributeNS(null,"class",this.className),a.setAttributeNS(null,"d","M"+t+","+e+" L"+(t+o)+","+e),1==this.options.shaded.enabled&&(h=n.getSVGElement("path",i,s),"top"==this.options.shaded.orientation?h.setAttributeNS(null,"d","M"+t+", "+(e-d)+"L"+t+","+e+" L"+(t+o)+","+e+" L"+(t+o)+","+(e-d)):h.setAttributeNS(null,"d","M"+t+","+e+" L"+t+","+(e+d)+" L"+(t+o)+","+(e+d)+"L"+(t+o)+","+e),h.setAttributeNS(null,"class",this.className+" iconFill")),1==this.options.drawPoints.enabled&&n.drawPoint(t+.5*o,e,this,i,s);else{var c=Math.round(.3*o),p=Math.round(.4*r),u=Math.round(.75*r),f=Math.round((o-2*c)/3);n.drawBar(t+.5*c+f,e+d-p-1,c,p,this.className+" bar",i,s),n.drawBar(t+1.5*c+f+2,e+d-u-1,c,u,this.className+" bar",i,s)}},s.prototype.getLegend=function(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg","svg");return this.drawIcon(0,.5*e,[],i,t,e),{icon:i,label:this.content,orientation:this.options.yAxisOrientation}},t.exports=s},function(t,e,i){function s(t,e,i,s){this.body=t,this.defaultOptions={enabled:!0,icons:!0,iconSize:20,iconSpacing:6,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-left"}},this.side=i,this.options=o.extend({},this.defaultOptions),this.linegraphOptions=s,this.svgElements={},this.dom={},this.groups={},this.amountOfGroups=0,this._create(),this.setOptions(e)}var o=i(1),n=i(6),r=i(22);s.prototype=new r,s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.className="legend",this.dom.frame.style.position="absolute",this.dom.frame.style.top="10px",this.dom.frame.style.display="block",this.dom.textArea=document.createElement("div"),this.dom.textArea.className="legendText",this.dom.textArea.style.position="relative",this.dom.textArea.style.top="0px",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.width=this.options.iconSize+5+"px",this.dom.frame.appendChild(this.svg),this.dom.frame.appendChild(this.dom.textArea)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setOptions=function(t){var e=["enabled","orientation","icons","left","right"];o.selectiveDeepExtend(e,this.options,t)},s.prototype.redraw=function(){var t=0;for(var e in this.groups)this.groups.hasOwnProperty(e)&&(1!=this.groups[e].visible||void 0!==this.linegraphOptions.visibility[e]&&1!=this.linegraphOptions.visibility[e]||t++);if(0==this.options[this.side].visible||0==this.amountOfGroups||0==this.options.enabled||0==t)this.hide();else{this.show(),"top-left"==this.options[this.side].position||"bottom-left"==this.options[this.side].position?(this.dom.frame.style.left="4px",this.dom.frame.style.textAlign="left",this.dom.textArea.style.textAlign="left",this.dom.textArea.style.left=this.options.iconSize+15+"px",this.dom.textArea.style.right="",this.svg.style.left="0px",this.svg.style.right=""):(this.dom.frame.style.right="4px",this.dom.frame.style.textAlign="right",this.dom.textArea.style.textAlign="right",this.dom.textArea.style.right=this.options.iconSize+15+"px",this.dom.textArea.style.left="",this.svg.style.right="0px",this.svg.style.left=""),"top-left"==this.options[this.side].position||"top-right"==this.options[this.side].position?(this.dom.frame.style.top=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.bottom=""):(this.dom.frame.style.bottom=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.top=""),0==this.options.icons?(this.dom.frame.style.width=this.dom.textArea.offsetWidth+10+"px",this.dom.textArea.style.right="",this.dom.textArea.style.left="",this.svg.style.width="0px"):(this.dom.frame.style.width=this.options.iconSize+15+this.dom.textArea.offsetWidth+10+"px",this.drawLegendIcons()); +var i="";for(var e in this.groups)this.groups.hasOwnProperty(e)&&(1!=this.groups[e].visible||void 0!==this.linegraphOptions.visibility[e]&&1!=this.linegraphOptions.visibility[e]||(i+=this.groups[e].content+"
"));this.dom.textArea.innerHTML=i,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},s.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){n.prepareElements(this.svgElements);var t=window.getComputedStyle(this.dom.frame).paddingTop,e=Number(t.replace("px","")),i=e,s=this.options.iconSize,o=.75*this.options.iconSize,r=e+.5*o+3;this.svg.style.width=s+5+e+"px";for(var a in this.groups)this.groups.hasOwnProperty(a)&&(1!=this.groups[a].visible||void 0!==this.linegraphOptions.visibility[a]&&1!=this.linegraphOptions.visibility[a]||(this.groups[a].drawIcon(i,r,this.svgElements,this.svg,s,o),r+=o+this.options.iconSpacing));n.cleanupElements(this.svgElements)}},t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this._initializeMixinLoaders(),this.containerElement=t,this.renderRefreshRate=60,this.renderTimestep=1e3/this.renderRefreshRate,this.renderTime=.5*this.renderTimestep,this.maxPhysicsTicksPerRender=3,this.physicsDiscreteStepsize=.5,this.initializing=!0,this.triggerFunctions={add:null,edit:null,editEdge:null,connect:null,del:null},this.defaultOptions={nodes:{mass:1,radiusMin:10,radiusMax:30,radius:10,shape:"ellipse",image:void 0,widthMin:16,widthMax:64,fixed:!1,fontColor:"black",fontSize:14,fontFace:"verdana",level:-1,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},borderColor:"#2B7CE9",backgroundColor:"#97C2FC",highlightColor:"#D2E5FF",group:void 0,borderWidth:1},edges:{widthMin:1,widthMax:15,width:1,widthSelectionMultiplier:2,hoverWidth:1.5,style:"line",color:{color:"#848484",highlight:"#848484",hover:"#848484"},fontColor:"#343434",fontSize:14,fontFace:"arial",fontFill:"white",arrowScaleFactor:1,dash:{length:10,gap:5,altLength:void 0},inheritColor:"from"},configurePhysics:!1,physics:{barnesHut:{enabled:!0,theta:1/.6,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09},repulsion:{centralGravity:0,springLength:200,springConstant:.05,nodeDistance:100,damping:.09},hierarchicalRepulsion:{enabled:!1,centralGravity:0,springLength:100,springConstant:.01,nodeDistance:150,damping:.09},damping:null,centralGravity:null,springLength:null,springConstant:null},clustering:{enabled:!1,initialMaxNodes:100,clusterThreshold:500,reduceToNodes:300,chainThreshold:.4,clusterEdgeThreshold:20,sectorThreshold:100,screenSizeThreshold:.2,fontSizeMultiplier:4,maxFontSize:1e3,forceAmplification:.1,distanceAmplification:.1,edgeGrowth:20,nodeScaling:{width:1,height:1,radius:1},maxNodeSizeIncrements:600,activeAreaBoxSize:80,clusterLevelDifference:2},navigation:{enabled:!1},keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02}},dataManipulation:{enabled:!1,initiallyVisible:!1},hierarchicalLayout:{enabled:!1,levelSeparation:150,nodeSpacing:100,direction:"UD"},freezeForStabilization:!1,smoothCurves:{enabled:!0,dynamic:!0,type:"continuous",roundness:.5},dynamicSmoothCurves:!0,maxVelocity:30,minVelocity:.1,stabilize:!0,stabilizationIterations:1e3,locale:"en",locales:_,tooltip:{delay:300,fontColor:"black",fontSize:14,fontFace:"verdana",color:{border:"#666",background:"#FFFFC6"}},dragNetwork:!0,dragNodes:!0,zoomable:!0,hover:!1,hideEdgesOnDrag:!1,hideNodesOnDrag:!1,width:"100%",height:"100%",selectable:!0},this.constants=a.extend({},this.defaultOptions),this.hoverObj={nodes:{},edges:{}},this.controlNodesActive=!1;var o=this;this.groups=new u,this.images=new f,this.images.setOnloadCallback(function(){o._redraw()}),this.xIncrement=0,this.yIncrement=0,this.zoomIncrement=0,this._loadPhysicsSystem(),this._create(),this._loadSectorSystem(),this._loadClusterSystem(),this._loadSelectionSystem(),this._loadHierarchySystem(),this._setTranslation(this.frame.clientWidth/2,this.frame.clientHeight/2),this._setScale(1),this.setOptions(i),this.freezeSimulation=!1,this.cachedFunctions={},this.calculationNodes={},this.calculationNodeIndices=[],this.nodeIndices=[],this.nodes={},this.edges={},this.canvasTopLeft={x:0,y:0},this.canvasBottomRight={x:0,y:0},this.pointerPosition={x:0,y:0},this.areaCenter={},this.scale=1,this.previousScale=this.scale,this.nodesData=null,this.edgesData=null,this.nodesListeners={add:function(t,e){o._addNodes(e.items),o.start()},update:function(t,e){o._updateNodes(e.items),o.start()},remove:function(t,e){o._removeNodes(e.items),o.start()}},this.edgesListeners={add:function(t,e){o._addEdges(e.items),o.start()},update:function(t,e){o._updateEdges(e.items),o.start()},remove:function(t,e){o._removeEdges(e.items),o.start()}},this.moving=!0,this.timer=void 0,this.setData(e,this.constants.clustering.enabled||this.constants.hierarchicalLayout.enabled),this.initializing=!1,1==this.constants.hierarchicalLayout.enabled?this._setupHierarchicalLayout():0==this.constants.stabilize&&this.zoomExtent(!0,this.constants.clustering.enabled),this.constants.clustering.enabled&&this.startWithClustering()}var o=i(10),n=i(18),r=i(37),a=i(1),h=i(21),d=i(7),l=i(8),c=i(45),p=i(46),u=i(47),f=i(48),g=i(49),m=i(50),v=i(51),y=i(52),b=i(36),_=i(63);i(64),o(s.prototype),s.prototype._getScriptPath=function(){for(var t=document.getElementsByTagName("script"),e=0;et.x&&(s=t.x),ot.y&&(e=t.y),i=this.constants.clustering.initialMaxNodes?49.07548/(o+142.05338)+91444e-8:12.662/(o+7.4147)+.0964822:1==this.constants.clustering.enabled&&o>=this.constants.clustering.initialMaxNodes?77.5271985/(o+187.266146)+476710517e-13:30.5062972/(o+19.93597763)+.08413486;var n=Math.min(this.frame.canvas.clientWidth/600,this.frame.canvas.clientHeight/600);i*=n}else{var r=1.1*(Math.abs(s.minX)+Math.abs(s.maxX)),a=1.1*(Math.abs(s.minY)+Math.abs(s.maxY)),h=this.frame.canvas.clientWidth/r,d=this.frame.canvas.clientHeight/a;i=d>=h?h:d}i>1&&(i=1),this._setScale(i),this._centerNetwork(s),0==e&&(this.moving=!0,this.start())},s.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},s.prototype.setData=function(t,e){if(void 0===e&&(e=!1),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){if(t&&t.dot){var i=c.DOTToGraph(t.dot);return void this.setData(i)}}else if(t&&t.gephi){if(t&&t.gephi){var s=p.parseGephi(t.gephi);return void this.setData(s)}}else this._setNodes(t&&t.nodes),this._setEdges(t&&t.edges);if(this._putDataInSector(),!e)if(this.constants.stabilize){var o=this;setTimeout(function(){o._stabilize(),o.start()},0)}else this.start()},s.prototype.setOptions=function(t){if(t){var e,i=["nodes","edges","smoothCurves","hierarchicalLayout","clustering","navigation","keyboard","dataManipulation","onAdd","onEdit","onEditEdge","onConnect","onDelete","clickToUse"];if(a.selectiveNotDeepExtend(i,this.constants,t),a.selectiveNotDeepExtend(["color"],this.constants.nodes,t.nodes),a.selectiveNotDeepExtend(["color","length"],this.constants.edges,t.edges),t.physics&&(a.mergeOptions(this.constants.physics,t.physics,"barnesHut"),a.mergeOptions(this.constants.physics,t.physics,"repulsion"),t.physics.hierarchicalRepulsion)){this.constants.hierarchicalLayout.enabled=!0,this.constants.physics.hierarchicalRepulsion.enabled=!0,this.constants.physics.barnesHut.enabled=!1;for(e in t.physics.hierarchicalRepulsion)t.physics.hierarchicalRepulsion.hasOwnProperty(e)&&(this.constants.physics.hierarchicalRepulsion[e]=t.physics.hierarchicalRepulsion[e])}if(t.onAdd&&(this.triggerFunctions.add=t.onAdd),t.onEdit&&(this.triggerFunctions.edit=t.onEdit),t.onEditEdge&&(this.triggerFunctions.editEdge=t.onEditEdge),t.onConnect&&(this.triggerFunctions.connect=t.onConnect),t.onDelete&&(this.triggerFunctions.del=t.onDelete),a.mergeOptions(this.constants,t,"smoothCurves"),a.mergeOptions(this.constants,t,"hierarchicalLayout"),a.mergeOptions(this.constants,t,"clustering"),a.mergeOptions(this.constants,t,"navigation"),a.mergeOptions(this.constants,t,"keyboard"),a.mergeOptions(this.constants,t,"dataManipulation"),t.dataManipulation&&(this.editMode=this.constants.dataManipulation.initiallyVisible),t.edges&&(void 0!==t.edges.color&&(a.isString(t.edges.color)?(this.constants.edges.color={},this.constants.edges.color.color=t.edges.color,this.constants.edges.color.highlight=t.edges.color,this.constants.edges.color.hover=t.edges.color):(void 0!==t.edges.color.color&&(this.constants.edges.color.color=t.edges.color.color),void 0!==t.edges.color.highlight&&(this.constants.edges.color.highlight=t.edges.color.highlight),void 0!==t.edges.color.hover&&(this.constants.edges.color.hover=t.edges.color.hover))),t.edges.fontColor||void 0!==t.edges.color&&(a.isString(t.edges.color)?this.constants.edges.fontColor=t.edges.color:void 0!==t.edges.color.color&&(this.constants.edges.fontColor=t.edges.color.color))),t.nodes&&t.nodes.color){var s=a.parseColor(t.nodes.color);this.constants.nodes.color.background=s.background,this.constants.nodes.color.border=s.border,this.constants.nodes.color.highlight.background=s.highlight.background,this.constants.nodes.color.highlight.border=s.highlight.border,this.constants.nodes.color.hover.background=s.hover.background,this.constants.nodes.color.hover.border=s.hover.border}if(t.groups)for(var o in t.groups)if(t.groups.hasOwnProperty(o)){var n=t.groups[o];this.groups.add(o,n)}if(t.tooltip){for(e in t.tooltip)t.tooltip.hasOwnProperty(e)&&(this.constants.tooltip[e]=t.tooltip[e]);t.tooltip.color&&(this.constants.tooltip.color=a.parseColor(t.tooltip.color))}if("clickToUse"in t&&(t.clickToUse?(this.activator=new b(this.frame),this.activator.on("change",this._createKeyBinds.bind(this))):this.activator&&(this.activator.destroy(),delete this.activator)),t.labels)throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.')}this._loadPhysicsSystem(),this._loadNavigationControls(),this._loadManipulationSystem(),this._configureSmoothCurves(),this._createKeyBinds(),this.setSize(this.constants.width,this.constants.height),this.moving=!0,this.start()},s.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis network-frame",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),!this.frame.canvas.getContext){var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}var e=this;this.drag={},this.pinch={},this.hammer=n(this.frame.canvas,{prevent_default:!0}),this.hammer.on("tap",e._onTap.bind(e)),this.hammer.on("doubletap",e._onDoubleTap.bind(e)),this.hammer.on("hold",e._onHold.bind(e)),this.hammer.on("pinch",e._onPinch.bind(e)),this.hammer.on("touch",e._onTouch.bind(e)),this.hammer.on("dragstart",e._onDragStart.bind(e)),this.hammer.on("drag",e._onDrag.bind(e)),this.hammer.on("dragend",e._onDragEnd.bind(e)),this.hammer.on("release",e._onRelease.bind(e)),this.hammer.on("mousewheel",e._onMouseWheel.bind(e)),this.hammer.on("DOMMouseScroll",e._onMouseWheel.bind(e)),this.hammer.on("mousemove",e._onMouseMoveTitle.bind(e)),this.containerElement.appendChild(this.frame)},s.prototype._createKeyBinds=function(){var t=this;this.mousetrap=r,this.mousetrap.reset(),this.constants.keyboard.enabled&&this.isActive()&&(this.mousetrap.bind("up",this._moveUp.bind(t),"keydown"),this.mousetrap.bind("up",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("down",this._moveDown.bind(t),"keydown"),this.mousetrap.bind("down",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("left",this._moveLeft.bind(t),"keydown"),this.mousetrap.bind("left",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("right",this._moveRight.bind(t),"keydown"),this.mousetrap.bind("right",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("=",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("=",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("-",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("-",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("[",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("[",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("]",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("]",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pageup",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("pageup",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pagedown",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("pagedown",this._stopZoom.bind(t),"keyup")),1==this.constants.dataManipulation.enabled&&(this.mousetrap.bind("escape",this._createManipulatorBar.bind(t)),this.mousetrap.bind("del",this._deleteSelected.bind(t)))},s.prototype._getPointer=function(t){return{x:t.pageX-a.getAbsoluteLeft(this.frame.canvas),y:t.pageY-a.getAbsoluteTop(this.frame.canvas)}},s.prototype._onTouch=function(t){this.drag.pointer=this._getPointer(t.gesture.center),this.drag.pinched=!1,this.pinch.scale=this._getScale(),this._handleTouch(this.drag.pointer)},s.prototype._onDragStart=function(){this._handleDragStart()},s.prototype._handleDragStart=function(){var t=this.drag,e=this._getNodeAt(t.pointer);if(t.dragging=!0,t.selection=[],t.translation=this._getTranslation(),t.nodeId=null,null!=e){t.nodeId=e.id,e.isSelected()||this._selectObject(e,!1);for(var i in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(i)){var s=this.selectionObj.nodes[i],o={id:s.id,node:s,x:s.x,y:s.y,xFixed:s.xFixed,yFixed:s.yFixed};s.xFixed=!0,s.yFixed=!0,t.selection.push(o)}}},s.prototype._onDrag=function(t){this._handleOnDrag(t)},s.prototype._handleOnDrag=function(t){if(!this.drag.pinched){var e=this._getPointer(t.gesture.center),i=this,s=this.drag,o=s.selection;if(o&&o.length&&1==this.constants.dragNodes){var n=e.x-s.pointer.x,r=e.y-s.pointer.y;o.forEach(function(t){var e=t.node;t.xFixed||(e.x=i._XconvertDOMtoCanvas(i._XconvertCanvasToDOM(t.x)+n)),t.yFixed||(e.y=i._YconvertDOMtoCanvas(i._YconvertCanvasToDOM(t.y)+r))}),this.moving||(this.moving=!0,this.start())}else if(1==this.constants.dragNetwork){var a=e.x-this.drag.pointer.x,h=e.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+a,this.drag.translation.y+h),this._redraw()}}},s.prototype._onDragEnd=function(){this.drag.dragging=!1;var t=this.drag.selection;t&&t.length?(t.forEach(function(t){t.node.xFixed=t.xFixed,t.node.yFixed=t.yFixed}),this.moving=!0,this.start()):this._redraw()},s.prototype._onTap=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleTap(e)},s.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.center);this._handleDoubleTap(e)},s.prototype._onHold=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleOnHold(e)},s.prototype._onRelease=function(t){var e=this._getPointer(t.gesture.center);this._handleOnRelease(e)},s.prototype._onPinch=function(t){var e=this._getPointer(t.gesture.center);this.drag.pinched=!0,"scale"in this.pinch||(this.pinch.scale=1);var i=this.pinch.scale*t.gesture.scale;this._zoom(i,e)},s.prototype._zoom=function(t,e){if(1==this.constants.zoomable){var i=this._getScale();1e-5>t&&(t=1e-5),t>10&&(t=10);var s=null;void 0!==this.drag&&1==this.drag.dragging&&(s=this.DOMtoCanvas(this.drag.pointer));var o=this._getTranslation(),n=t/i,r=(1-n)*e.x+o.x*n,a=(1-n)*e.y+o.y*n;if(this.areaCenter={x:this._XconvertDOMtoCanvas(e.x),y:this._YconvertDOMtoCanvas(e.y)},this._setScale(t),this._setTranslation(r,a),this.updateClustersDefault(),null!=s){var h=this.canvasToDOM(s);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}return this._redraw(),t>i?this.emit("zoom",{direction:"+"}):this.emit("zoom",{direction:"-"}),t}},s.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i=this._getScale(),s=e/10;0>e&&(s/=1-s),i*=1+s;var o=h.fakeGesture(this,t),n=this._getPointer(o.center);this._zoom(i,n)}t.preventDefault()},s.prototype._onMouseMoveTitle=function(t){var e=h.fakeGesture(this,t),i=this._getPointer(e.center);this.popupObj&&this._checkHidePopup(i);var s=this,o=function(){s._checkShowPopup(i)};if(this.popupTimer&&clearInterval(this.popupTimer),this.drag.dragging||(this.popupTimer=setTimeout(o,this.constants.tooltip.delay)),1==this.constants.hover){for(var n in this.hoverObj.edges)this.hoverObj.edges.hasOwnProperty(n)&&(this.hoverObj.edges[n].hover=!1,delete this.hoverObj.edges[n]);var r=this._getNodeAt(i);null==r&&(r=this._getEdgeAt(i)),null!=r&&this._hoverObject(r);for(var a in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(a)&&(r instanceof g&&r.id!=a||r instanceof m||null==r)&&(this._blurObject(this.hoverObj.nodes[a]),delete this.hoverObj.nodes[a]);this.redraw()}},s.prototype._checkShowPopup=function(t){var e,i={left:this._XconvertDOMtoCanvas(t.x),top:this._YconvertDOMtoCanvas(t.y),right:this._XconvertDOMtoCanvas(t.x),bottom:this._YconvertDOMtoCanvas(t.y)},s=this.popupObj;if(void 0==this.popupObj){var o=this.nodes;for(e in o)if(o.hasOwnProperty(e)){var n=o[e];if(void 0!==n.getTitle()&&n.isOverlappingWith(i)){this.popupObj=n;break}}}if(void 0===this.popupObj){var r=this.edges;for(e in r)if(r.hasOwnProperty(e)){var a=r[e];if(a.connected&&void 0!==a.getTitle()&&a.isOverlappingWith(i)){this.popupObj=a;break}}}if(this.popupObj){if(this.popupObj!=s){var h=this;h.popup||(h.popup=new v(h.frame,h.constants.tooltip)),h.popup.setPosition(t.x-3,t.y-3),h.popup.setText(h.popupObj.getTitle()),h.popup.show()}}else this.popup&&this.popup.hide()},s.prototype._checkHidePopup=function(t){this.popupObj&&this._getNodeAt(t)||(this.popupObj=void 0,this.popup&&this.popup.hide())},s.prototype.setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,this.emit("resize",{width:this.frame.canvas.width,height:this.frame.canvas.height})},s.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof d||t instanceof l)this.nodesData=t;else if(t instanceof Array)this.nodesData=new d,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new d}if(e&&a.forEach(this.nodesListeners,function(t,i){e.off(i,t)}),this.nodes={},this.nodesData){var i=this;a.forEach(this.nodesListeners,function(t,e){i.nodesData.on(e,t)});var s=this.nodesData.getIds();this._addNodes(s)}this._updateSelection()},s.prototype._addNodes=function(t){for(var e,i=0,s=t.length;s>i;i++){e=t[i];var o=this.nodesData.get(e),n=new g(o,this.images,this.groups,this.constants);if(this.nodes[e]=n,!(0!=n.xFixed&&0!=n.yFixed||null!==n.x&&null!==n.y)){var r=1*t.length+10,a=2*Math.PI*Math.random();0==n.xFixed&&(n.x=r*Math.cos(a)),0==n.yFixed&&(n.y=r*Math.sin(a))}this.moving=!0}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateValueRange(this.nodes),this.updateLabels()},s.prototype._updateNodes=function(t){for(var e=this.nodes,i=this.nodesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n],a=i.get(n);r?r.setProperties(a,this.constants):(r=new g(properties,this.images,this.groups,this.constants),e[n]=r)}this.moving=!0,1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateNodeIndexList(),this._reconnectEdges(),this._updateValueRange(e)},s.prototype._removeNodes=function(t){for(var e=this.nodes,i=0,s=t.length;s>i;i++){var o=t[i];delete e[o]}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateSelection(),this._updateValueRange(e)},s.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof d||t instanceof l)this.edgesData=t;else if(t instanceof Array)this.edgesData=new d,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new d}if(e&&a.forEach(this.edgesListeners,function(t,i){e.off(i,t)}),this.edges={},this.edgesData){var i=this;a.forEach(this.edgesListeners,function(t,e){i.edgesData.on(e,t)});var s=this.edgesData.getIds();this._addEdges(s)}this._reconnectEdges()},s.prototype._addEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n];r&&r.disconnect();var a=i.get(n,{showInternalIds:!0});e[n]=new m(a,this,this.constants)}this.moving=!0,this._updateValueRange(e),this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._updateEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=i.get(n),a=e[n];a?(a.disconnect(),a.setProperties(r,this.constants),a.connect()):(a=new m(r,this,this.constants),this.edges[n]=a)}this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this.moving=!0,this._updateValueRange(e)},s.prototype._removeEdges=function(t){for(var e=this.edges,i=0,s=t.length;s>i;i++){var o=t[i],n=e[o];n&&(null!=n.via&&delete this.sectors.support.nodes[n.via.id],n.disconnect(),delete e[o])}this.moving=!0,this._updateValueRange(e),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._reconnectEdges=function(){var t,e=this.nodes,i=this.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var s=i[t];s.from=null,s.to=null,s.connect()}},s.prototype._updateValueRange=function(t){var e,i=void 0,s=void 0;for(e in t)if(t.hasOwnProperty(e)){var o=t[e].getValue();void 0!==o&&(i=void 0===i?o:Math.min(o,i),s=void 0===s?o:Math.max(o,s))}if(void 0!==i&&void 0!==s)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,s)},s.prototype.redraw=function(){this.setSize(this.constants.width,this.constants.height),this._redraw()},s.prototype._redraw=function(){var t=this.frame.canvas.getContext("2d"),e=this.frame.canvas.width,i=this.frame.canvas.height;t.clearRect(0,0,e,i),t.save(),t.translate(this.translation.x,this.translation.y),t.scale(this.scale,this.scale),this.canvasTopLeft={x:this._XconvertDOMtoCanvas(0),y:this._YconvertDOMtoCanvas(0)},this.canvasBottomRight={x:this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth),y:this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight)},this._doInAllSectors("_drawAllSectorNodes",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideEdgesOnDrag)&&this._doInAllSectors("_drawEdges",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideNodesOnDrag)&&this._doInAllSectors("_drawNodes",t,!1),1==this.controlNodesActive&&this._doInAllSectors("_drawControlNodes",t),t.restore()},s.prototype._setTranslation=function(t,e){void 0===this.translation&&(this.translation={x:0,y:0}),void 0!==t&&(this.translation.x=t),void 0!==e&&(this.translation.y=e),this.emit("viewChanged")},s.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},s.prototype._setScale=function(t){this.scale=t},s.prototype._getScale=function(){return this.scale},s.prototype._XconvertDOMtoCanvas=function(t){return(t-this.translation.x)/this.scale},s.prototype._XconvertCanvasToDOM=function(t){return t*this.scale+this.translation.x},s.prototype._YconvertDOMtoCanvas=function(t){return(t-this.translation.y)/this.scale},s.prototype._YconvertCanvasToDOM=function(t){return t*this.scale+this.translation.y},s.prototype.canvasToDOM=function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}},s.prototype.DOMtoCanvas=function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}},s.prototype._drawNodes=function(t,e){void 0===e&&(e=!1);var i=this.nodes,s=[];for(var o in i)i.hasOwnProperty(o)&&(i[o].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight),i[o].isSelected()?s.push(o):(i[o].inArea()||e)&&i[o].draw(t));for(var n=0,r=s.length;r>n;n++)(i[s[n]].inArea()||e)&&i[s[n]].draw(t)},s.prototype._drawEdges=function(t){var e=this.edges;for(var i in e)if(e.hasOwnProperty(i)){var s=e[i];s.setScale(this.scale),s.connected&&e[i].draw(t)}},s.prototype._drawControlNodes=function(t){var e=this.edges;for(var i in e)e.hasOwnProperty(i)&&e[i]._drawControlNodes(t)},s.prototype._stabilize=function(){1==this.constants.freezeForStabilization&&this._freezeDefinedNodes();for(var t=0;this.moving&&t0)for(e in s)s.hasOwnProperty(e)&&(s[e].discreteStepLimited(i,this.constants.maxVelocity),o=!0);else for(e in s)s.hasOwnProperty(e)&&(s[e].discreteStep(i),o=!0);if(1==o&&(void 0===t||1==t)){var n=this.constants.minVelocity/Math.max(this.scale,.05);n>.5*this.constants.maxVelocity?this.moving=!0:(this.moving=this._isMoving(n),0==this.moving&&this.emit("stabilized",{iterations:null}),this.moving=this.moving||this.configurePhysics)}},s.prototype._physicsTick=function(){this.freezeSimulation||1==this.moving&&(this._doInAllActiveSectors("_initializeForceCalculation"),this._doInAllActiveSectors("_discreteStepNodes"),1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic&&this._doInSupportSector("_discreteStepNodes",!1),this._findCenter(this._getRange()))},s.prototype._animationStep=function(){this.timer=void 0,this._handleNavigation(),this.start();var t=Date.now(),e=1;this._physicsTick();for(var i=Date.now()-t;i<.9*(this.renderTimestep-this.renderTime)&&ei;i++)if(e.id===r.nodes[i].id){o=r.nodes[i];break}for(o||(o={id:e.id},t.node&&(o.attr=a(o.attr,t.node))),i=n.length-1;i>=0;i--){var h=n[i];h.nodes||(h.nodes=[]),-1==h.nodes.indexOf(o)&&h.nodes.push(o)}e.attr&&(o.attr=a(o.attr,e.attr))}function l(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=a({},t.edge);e.attr=a(i,e.attr)}}function c(t,e,i,s,o){var n={from:e,to:i,type:s}; +return t.edge&&(n.attr=a({},t.edge)),n.attr=a(n.attr||{},o),n}function p(){for(k=C.NULL,L="";" "==O||" "==O||"\n"==O||"\r"==O;)o();do{var t=!1;if("#"==O){for(var e=T-1;" "==D.charAt(e)||" "==D.charAt(e);)e--;if("\n"==D.charAt(e)||""==D.charAt(e)){for(;""!=O&&"\n"!=O;)o();t=!0}}if("/"==O&&"/"==n()){for(;""!=O&&"\n"!=O;)o();t=!0}if("/"==O&&"*"==n()){for(;""!=O;){if("*"==O&&"/"==n()){o(),o();break}o()}t=!0}for(;" "==O||" "==O||"\n"==O||"\r"==O;)o()}while(t);if(""==O)return void(k=C.DELIMITER);var i=O+n();if(E[i])return k=C.DELIMITER,L=i,o(),void o();if(E[O])return k=C.DELIMITER,L=O,void o();if(r(O)||"-"==O){for(L+=O,o();r(O);)L+=O,o();return"false"==L?L=!1:"true"==L?L=!0:isNaN(Number(L))||(L=Number(L)),void(k=C.IDENTIFIER)}if('"'==O){for(o();""!=O&&('"'!=O||'"'==O&&'"'==n());)L+=O,'"'==O&&o(),o();if('"'!=O)throw x('End of string " expected');return o(),void(k=C.IDENTIFIER)}for(k=C.UNKNOWN;""!=O;)L+=O,o();throw new SyntaxError('Syntax error in part "'+w(L,30)+'"')}function u(){var t={};if(s(),p(),"strict"==L&&(t.strict=!0,p()),("graph"==L||"digraph"==L)&&(t.type=L,p()),k==C.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),f(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function f(t){for(;""!==L&&"}"!=L;)g(t),";"==L&&p()}function g(t){var e=m(t);if(e)return void b(t,e);var i=v(t);if(!i){if(k!=C.IDENTIFIER)throw x("Identifier expected");var s=L;if(p(),"="==L){if(p(),k!=C.IDENTIFIER)throw x("Identifier expected");t[s]=L,p()}else y(t,s)}}function m(t){var e=null;if("subgraph"==L&&(e={},e.type="subgraph",p(),k==C.IDENTIFIER&&(e.id=L,p())),"{"==L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,f(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function v(t){return"node"==L?(p(),t.node=_(),"node"):"edge"==L?(p(),t.edge=_(),"edge"):"graph"==L?(p(),t.graph=_(),"graph"):null}function y(t,e){var i={id:e},s=_();s&&(i.attr=s),d(t,i),b(t,e)}function b(t,e){for(;"->"==L||"--"==L;){var i,s=L;p();var o=m(t);if(o)i=o;else{if(k!=C.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,d(t,{id:i}),p()}var n=_(),r=c(t,e,i,s,n);l(t,r),e=i}}function _(){for(var t=null;"["==L;){for(p(),t={};""!==L&&"]"!=L;){if(k!=C.IDENTIFIER)throw x("Attribute name expected");var e=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),k!=C.IDENTIFIER)throw x("Attribute value expected");var i=L;h(t,e,i),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+w(L,30)+'" (char '+T+")")}function w(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){t instanceof Array?t.forEach(function(t){e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}):e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}function M(t){function e(t){var e={from:t.from,to:t.to};return a(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var s=i(t),o={nodes:[],edges:[],options:{}};return s.nodes&&s.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};a(e,t.attr),e.image&&(e.shape="image"),o.nodes.push(e)}),s.edges&&s.edges.forEach(function(t){var i,s;i=t.from instanceof Object?t.from.nodes:{id:t.from},s=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var i=e(t);o.edges.push(i)}),S(i,s,function(i,s){var n=c(o,i.id,s.id,t.type,t.attr),r=e(n);o.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var i=e(t);o.edges.push(i)})}),s.attr&&(o.options=s.attr),o}var C={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},E={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},D="",T=0,O="",L="",k=C.NULL,N=/[a-zA-Z_0-9.:#]/;e.parseDOT=i,e.DOTToGraph=M},function(t,e){function i(t,e){var i=[],s=[];this.options={edges:{inheritColor:!0},nodes:{allowedToMove:!1,parseColor:!1}},void 0!==e&&(this.options.nodes.allowedToMove=e.allowedToMove|!1,this.options.nodes.parseColor=e.parseColor|!1,this.options.edges.inheritColor=e.inheritColor|!0);for(var o=t.edges,n=t.nodes,r=0;re?this.vx>0?e:-e:this.vx,this.x+=this.vx*t}if(this.yFixed)this.fy=0;else{var o=this.damping*this.vy,n=(this.fy-o)/this.options.mass;this.vy+=n*t,this.vy=Math.abs(this.vy)>e?this.vy>0?e:-e:this.vy,this.y+=this.vy*t}},s.prototype.isFixed=function(){return this.xFixed&&this.yFixed},s.prototype.isMoving=function(t){var e=Math.sqrt(Math.pow(this.vx,2)+Math.pow(this.vy,2));return e>t},s.prototype.isSelected=function(){return this.selected},s.prototype.getValue=function(){return this.value},s.prototype.getDistance=function(t,e){var i=this.x-t,s=this.y-e;return Math.sqrt(i*i+s*s)},s.prototype.setValueRange=function(t,e){if(!this.radiusFixed&&void 0!==this.value)if(e==t)this.options.radius=(this.options.radiusMin+this.options.radiusMax)/2;else{var i=(this.options.radiusMax-this.options.radiusMin)/(e-t);this.options.radius=(this.value-t)*i+this.options.radiusMin}this.baseRadiusValue=this.options.radius},s.prototype.draw=function(){throw"Draw method not initialized for node"},s.prototype.resize=function(){throw"Resize method not initialized for node"},s.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},s.prototype._resizeImage=function(){if(!this.width||!this.height){var t,e;if(this.value){this.options.radius=this.baseRadiusValue;var i=this.imageObj.height/this.imageObj.width;void 0!==i?(t=this.options.radius||this.imageObj.width,e=this.options.radius*i||this.imageObj.height):(t=0,e=0)}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.growthIndicator=0,this.width>0&&this.height>0&&(this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t)}},s.prototype._drawImage=function(t){this._resizeImage(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e;if(0!=this.imageObj.width){if(this.clusterSize>1){var i=this.clusterSize>1?10:0;i*=this.networkScaleInv,i=Math.min(.2*this.width,i),t.globalAlpha=.5,t.drawImage(this.imageObj,this.left-i,this.top-i,this.width+2*i,this.height+2*i)}t.globalAlpha=1,t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),e=this.y+this.height/2}else e=this.y;this._label(t,this.label,this.x,e,void 0,"top")},s.prototype._resizeBox=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawBox=function(t){this._resizeBox(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.roundRect(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth,this.options.radius),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.options.color.background,t.roundRect(this.left,this.top,this.width,this.height,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeDatabase=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=i.width+2*e;this.width=s,this.height=s,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-s}},s.prototype._drawDatabase=function(t){this._resizeDatabase(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.database(this.x-this.width/2-2*t.lineWidth,this.y-.5*this.height-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.database(this.x-this.width/2,this.y-.5*this.height,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeCircle=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=Math.max(i.width,i.height)+2*e;this.options.radius=s/2,this.width=s,this.height=s,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.options.radius-.5*s}},s.prototype._drawCircle=function(t){this._resizeCircle(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.circle(this.x,this.y,this.options.radius+2*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.circle(this.x,this.y,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeEllipse=function(t){if(!this.width){var e=this.getTextSize(t);this.width=1.5*e.width,this.height=2*e.height,this.width1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.ellipse(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.ellipse(this.left,this.top,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._drawDot=function(t){this._drawShape(t,"circle")},s.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},s.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},s.prototype._drawSquare=function(t){this._drawShape(t,"square")},s.prototype._drawStar=function(t){this._drawShape(t,"star")},s.prototype._resizeShape=function(){if(!this.width){this.options.radius=this.baseRadiusValue;var t=2*this.options.radius;this.width=t,this.height=t,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t}},s.prototype._drawShape=function(t,e){this._resizeShape(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var i=2.5,s=this.options.borderWidth,o=this.options.borderWidthSelected||2*this.options.borderWidth,n=2;switch(e){case"dot":n=2;break;case"square":n=2;break;case"triangle":n=3;break;case"triangleDown":n=3;break;case"star":n=4}t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t[e](this.x,this.y,this.options.radius+n*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t[e](this.x,this.y,this.options.radius),t.fill(),t.stroke(),this.label&&this._label(t,this.label,this.x,this.y+this.height/2,void 0,"top",!0)},s.prototype._resizeText=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawText=function(t){this._resizeText(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,this._label(t,this.label,this.x,this.y)},s.prototype._label=function(t,e,i,s,o,n,r){if(e&&Number(this.options.fontSize)*this.networkScale>this.fontDrawThreshold){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace,t.fillStyle=this.options.fontColor||"black",t.textAlign=o||"center",t.textBaseline=n||"middle";var a=e.split("\n"),h=a.length,d=Number(this.options.fontSize)+4,l=s+(1-h)/2*d;1==r&&(l=s+(1-h)/(2*d));for(var c=0;h>c;c++)t.fillText(a[c],i,l),l+=d}},s.prototype.getTextSize=function(t){if(void 0!==this.label){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace;for(var e=this.label.split("\n"),i=(Number(this.options.fontSize)+4)*e.length,s=0,o=0,n=e.length;n>o;o++)s=Math.max(s,t.measureText(e[o]).width);return{width:s,height:i}}return{width:0,height:0}},s.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.networkScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.networkScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.networkScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.yh}return!1},s.prototype._getColor=function(){var t=this.options.color;return"to"==this.options.inheritColor?t={highlight:this.to.options.color.highlight.border,hover:this.to.options.color.hover.border,color:this.to.options.color.border}:("from"==this.options.inheritColor||1==this.options.inheritColor)&&(t={highlight:this.from.options.color.highlight.border,hover:this.from.options.color.hover.border,color:this.from.options.color.border}),1==this.selected?t.highlight:1==this.hover?t.hover:t.color},s.prototype._drawLine=function(t){if(t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth(),this.from!=this.to){var e,i=this._line(t);if(this.label){if(1==this.options.smoothCurves.enabled&&null!=i){var s=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),o=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y));e={x:s,y:o}}else e=this._pointOnLine(.5);this._label(t,this.label,e.x,e.y)}}else{var n,r,a=this.physics.springLength/4,h=this.from;h.width||h.resize(t),h.width>h.height?(n=h.x+h.width/2,r=h.y-a):(n=h.x+a,r=h.y-h.height/2),this._circle(t,n,r,a),e=this._pointOnCircle(n,r,a,.5),this._label(t,this.label,e.x,e.y)}},s.prototype._getLineWidth=function(){return 1==this.selected?Math.min(this.widthSelected,this.options.widthMax)*this.networkScaleInv:1==this.hover?Math.min(this.options.hoverWidth,this.options.widthMax)*this.networkScaleInv:this.options.width*this.networkScaleInv},s.prototype._getViaCoordinates=function(){var t=null,e=null,i=this.options.smoothCurves.roundness,s=this.options.smoothCurves.type,o=Math.abs(this.from.x-this.to.x),n=Math.abs(this.from.y-this.to.y);return"discrete"==s||"diagonalCross"==s?Math.abs(this.from.x-this.to.x)this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n)),"discrete"==s&&(t=i*n>o?this.from.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o)),"discrete"==s&&(e=i*o>n?this.from.y:e)):"straightCross"==s?Math.abs(this.from.x-this.to.x)Math.abs(this.from.y-this.to.y)&&(t=this.from.xthis.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n,t=this.to.x>t?this.to.x:t):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n,t=this.to.x>t?this.to.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xe?this.to.y:e):this.from.x>this.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o,e=this.to.y>e?this.to.y:e):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o,e=this.to.yl.height?(a=l.x+.5*l.width,h=l.y-d):(a=l.x+d,h=l.y-.5*l.height),this._circle(t,a,h,d);var s=.2*Math.PI,o=(10+5*this.options.width)*this.options.arrowScaleFactor;e=this._pointOnCircle(a,h,d,.5),t.arrow(e.x,e.y,s,o),t.fill(),t.stroke(),this.label&&(e=this._pointOnCircle(a,h,d,.5),this._label(t,this.label,e.x,e.y))}},s.prototype._drawArrow=function(t){1==this.selected?(t.strokeStyle=this.options.color.highlight,t.fillStyle=this.options.color.highlight):1==this.hover?(t.strokeStyle=this.options.color.hover,t.fillStyle=this.options.color.hover):(t.strokeStyle=this.options.color.color,t.fillStyle=this.options.color.color),t.lineWidth=this._getLineWidth();var e,i;if(this.from!=this.to){e=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var s,o=this.to.x-this.from.x,n=this.to.y-this.from.y,r=Math.sqrt(o*o+n*n),a=this.from.distanceToBorder(t,e+Math.PI),h=(r-a)/r,d=h*this.from.x+(1-h)*this.to.x,l=h*this.from.y+(1-h)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?s=this.via:1==this.options.smoothCurves.enabled&&(s=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=s.x&&(e=Math.atan2(this.to.y-s.y,this.to.x-s.x),o=this.to.x-s.x,n=this.to.y-s.y,r=Math.sqrt(o*o+n*n));var c,p,u=this.to.distanceToBorder(t,e),f=(r-u)/r;if(1==this.options.smoothCurves.enabled&&null!=s.x?(c=(1-f)*s.x+f*this.to.x,p=(1-f)*s.y+f*this.to.y):(c=(1-f)*this.from.x+f*this.to.x,p=(1-f)*this.from.y+f*this.to.y),t.beginPath(),t.moveTo(d,l),1==this.options.smoothCurves.enabled&&null!=s.x?t.quadraticCurveTo(s.x,s.y,c,p):t.lineTo(c,p),t.stroke(),i=(10+5*this.options.width)*this.options.arrowScaleFactor,t.arrow(c,p,e,i),t.fill(),t.stroke(),this.label){var g;if(1==this.options.smoothCurves.enabled&&null!=s){var m=.5*(.5*(this.from.x+s.x)+.5*(this.to.x+s.x)),v=.5*(.5*(this.from.y+s.y)+.5*(this.to.y+s.y));g={x:m,y:v}}else g=this._pointOnLine(.5);this._label(t,this.label,g.x,g.y)}}else{var y,b,_,x=this.from,w=.25*Math.max(100,this.physics.springLength);x.width||x.resize(t),x.width>x.height?(y=x.x+.5*x.width,b=x.y-w,_={x:y,y:x.y,angle:.9*Math.PI}):(y=x.x+w,b=x.y-.5*x.height,_={x:x.x,y:b,angle:.6*Math.PI}),t.beginPath(),t.arc(y,b,w,0,2*Math.PI,!1),t.stroke();var i=(10+5*this.options.width)*this.options.arrowScaleFactor;t.arrow(_.x,_.y,_.angle,i),t.fill(),t.stroke(),this.label&&(g=this._pointOnCircle(y,b,w,.5),this._label(t,this.label,g.x,g.y))}},s.prototype._getDistanceToEdge=function(t,e,i,s,o,n){if(this.from!=this.to){if(1==this.options.smoothCurves.enabled){var r,a;if(1==this.options.smoothCurves.enabled&&1==this.options.smoothCurves.dynamic)r=this.via.x,a=this.via.y;else{var h=this._getViaCoordinates();r=h.x,a=h.y}var d,l,c,p,u,f,g,m=1e9;for(l=0;10>l;l++)c=.1*l,p=Math.pow(1-c,2)*t+2*c*(1-c)*r+Math.pow(c,2)*i,u=Math.pow(1-c,2)*e+2*c*(1-c)*a+Math.pow(c,2)*s,l>0&&(d=this._getDistanceToLine(f,g,p,u,o,n),m=m>d?d:m),f=p,g=u;return m}return this._getDistanceToLine(t,e,i,s,o,n)}var p,u,v,y,b=.25*this.physics.springLength,_=this.from;return _.width>_.height?(p=_.x+.5*_.width,u=_.y-b):(p=_.x+b,u=_.y-.5*_.height),v=p-o,y=u-n,Math.abs(Math.sqrt(v*v+y*y)-b)},s.prototype._getDistanceToLine=function(t,e,i,s,o,n){var r=i-t,a=s-e,h=r*r+a*a,d=((o-t)*r+(n-e)*a)/h;d>1?d=1:0>d&&(d=0);var l=t+d*r,c=e+d*a,p=l-o,u=c-n;return Math.sqrt(p*p+u*u)},s.prototype.setScale=function(t){this.networkScaleInv=1/t},s.prototype.select=function(){this.selected=!0},s.prototype.unselect=function(){this.selected=!1},s.prototype.positionBezierNode=function(){null!==this.via&&null!==this.from&&null!==this.to&&(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y))},s.prototype._drawControlNodes=function(t){if(1==this.controlNodesEnabled){if(null===this.controlNodes.from&&null===this.controlNodes.to){var e="edgeIdFrom:".concat(this.id),i="edgeIdTo:".concat(this.id),s={nodes:{group:"",radius:8},physics:{damping:0},clustering:{maxNodeSizeIncrements:0,nodeScaling:{width:0,height:0,radius:0}}};this.controlNodes.from=new n({id:e,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s),this.controlNodes.to=new n({id:i,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s)}0==this.controlNodes.from.selected&&0==this.controlNodes.to.selected&&(this.controlNodes.positions=this.getControlNodePositions(t),this.controlNodes.from.x=this.controlNodes.positions.from.x,this.controlNodes.from.y=this.controlNodes.positions.from.y,this.controlNodes.to.x=this.controlNodes.positions.to.x,this.controlNodes.to.y=this.controlNodes.positions.to.y),this.controlNodes.from.draw(t),this.controlNodes.to.draw(t)}else this.controlNodes={from:null,to:null,positions:{}}},s.prototype._enableControlNodes=function(){this.controlNodesEnabled=!0},s.prototype._disableControlNodes=function(){this.controlNodesEnabled=!1},s.prototype._getSelectedControlNode=function(t,e){var i=this.controlNodes.positions,s=Math.sqrt(Math.pow(t-i.from.x,2)+Math.pow(e-i.from.y,2)),o=Math.sqrt(Math.pow(t-i.to.x,2)+Math.pow(e-i.to.y,2));return 15>s?(this.connectedNode=this.from,this.from=this.controlNodes.from,this.controlNodes.from):15>o?(this.connectedNode=this.to,this.to=this.controlNodes.to,this.controlNodes.to):null},s.prototype._restoreControlNodes=function(){1==this.controlNodes.from.selected&&(this.from=this.connectedNode,this.connectedNode=null,this.controlNodes.from.unselect()),1==this.controlNodes.to.selected&&(this.to=this.connectedNode,this.connectedNode=null,this.controlNodes.to.unselect())},s.prototype.getControlNodePositions=function(t){var e,i=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),s=this.to.x-this.from.x,o=this.to.y-this.from.y,n=Math.sqrt(s*s+o*o),r=this.from.distanceToBorder(t,i+Math.PI),a=(n-r)/n,h=a*this.from.x+(1-a)*this.to.x,d=a*this.from.y+(1-a)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?e=this.via:1==this.options.smoothCurves.enabled&&(e=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=e.x&&(i=Math.atan2(this.to.y-e.y,this.to.x-e.x),s=this.to.x-e.x,o=this.to.y-e.y,n=Math.sqrt(s*s+o*o));var l,c,p=this.to.distanceToBorder(t,i),u=(n-p)/n;return 1==this.options.smoothCurves.enabled&&null!=e.x?(l=(1-u)*e.x+u*this.to.x,c=(1-u)*e.y+u*this.to.y):(l=(1-u)*this.from.x+u*this.to.x,c=(1-u)*this.from.y+u*this.to.y),{from:{x:h,y:d},to:{x:l,y:c}}},t.exports=s},function(t){function e(t,e,i,s,o){this.container=t?t:document.body,void 0===o&&("object"==typeof e?(o=e,e=void 0):"object"==typeof s?(o=s,s=void 0):o={fontColor:"black",fontSize:14,fontFace:"verdana",color:{border:"#666",background:"#FFFFC6"}}),this.x=0,this.y=0,this.padding=5,void 0!==e&&void 0!==i&&this.setPosition(e,i),void 0!==s&&this.setText(s),this.frame=document.createElement("div");var n=this.frame.style;n.position="absolute",n.visibility="hidden",n.border="1px solid "+o.color.border,n.color=o.fontColor,n.fontSize=o.fontSize+"px",n.fontFamily=o.fontFace,n.padding=this.padding+"px",n.backgroundColor=o.color.background,n.borderRadius="3px",n.MozBorderRadius="3px",n.WebkitBorderRadius="3px",n.boxShadow="3px 3px 10px rgba(128, 128, 128, 0.5)",n.whiteSpace="nowrap",this.container.appendChild(this.frame)}e.prototype.setPosition=function(t,e){this.x=parseInt(t),this.y=parseInt(e)},e.prototype.setText=function(t){this.frame.innerHTML=t},e.prototype.show=function(t){if(void 0===t&&(t=!0),t){var e=this.frame.clientHeight,i=this.frame.clientWidth,s=this.frame.parentNode.clientHeight,o=this.frame.parentNode.clientWidth,n=this.y-e;n+e+this.padding>s&&(n=s-e-this.padding),no&&(r=o-i-this.padding),rthis.constants.clustering.clusterThreshold&&1==this.constants.clustering.enabled&&this.clusterToFit(this.constants.clustering.reduceToNodes,!1),this._calculateForces())},e._calculateForces=function(){this._calculateGravitationalForces(),this._calculateNodeForces(),this.constants.physics.springConstant>0&&(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic?this._calculateSpringForcesWithSupport():1==this.constants.physics.hierarchicalRepulsion.enabled?this._calculateHierarchicalSpringForces():this._calculateSpringForces())},e._updateCalculationNodes=function(){if(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic){this.calculationNodes={},this.calculationNodeIndices=[];for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.calculationNodes[t]=this.nodes[t]);var e=this.sectors.support.nodes;for(var i in e)e.hasOwnProperty(i)&&(this.edges.hasOwnProperty(e[i].parentEdgeId)?this.calculationNodes[i]=e[i]:e[i]._setForce(0,0));for(var s in this.calculationNodes)this.calculationNodes.hasOwnProperty(s)&&this.calculationNodeIndices.push(s)}else this.calculationNodes=this.nodes,this.calculationNodeIndices=this.nodeIndices},e._calculateGravitationalForces=function(){var t,e,i,s,o,n=this.calculationNodes,r=this.constants.physics.centralGravity,a=0;for(o=0;oSimulation Mode:Barnes HutRepulsionHierarchical
Options:
',this.containerElement.parentElement.insertBefore(this.physicsConfiguration,this.containerElement),this.optionsDiv=document.createElement("div"),this.optionsDiv.style.fontSize="14px",this.optionsDiv.style.fontFamily="verdana",this.containerElement.parentElement.insertBefore(this.optionsDiv,this.containerElement); +var e;e=document.getElementById("graph_BH_gc"),e.onchange=a.bind(this,"graph_BH_gc",-1,"physics_barnesHut_gravitationalConstant"),e=document.getElementById("graph_BH_cg"),e.onchange=a.bind(this,"graph_BH_cg",1,"physics_centralGravity"),e=document.getElementById("graph_BH_sc"),e.onchange=a.bind(this,"graph_BH_sc",1,"physics_springConstant"),e=document.getElementById("graph_BH_sl"),e.onchange=a.bind(this,"graph_BH_sl",1,"physics_springLength"),e=document.getElementById("graph_BH_damp"),e.onchange=a.bind(this,"graph_BH_damp",1,"physics_damping"),e=document.getElementById("graph_R_nd"),e.onchange=a.bind(this,"graph_R_nd",1,"physics_repulsion_nodeDistance"),e=document.getElementById("graph_R_cg"),e.onchange=a.bind(this,"graph_R_cg",1,"physics_centralGravity"),e=document.getElementById("graph_R_sc"),e.onchange=a.bind(this,"graph_R_sc",1,"physics_springConstant"),e=document.getElementById("graph_R_sl"),e.onchange=a.bind(this,"graph_R_sl",1,"physics_springLength"),e=document.getElementById("graph_R_damp"),e.onchange=a.bind(this,"graph_R_damp",1,"physics_damping"),e=document.getElementById("graph_H_nd"),e.onchange=a.bind(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),e=document.getElementById("graph_H_cg"),e.onchange=a.bind(this,"graph_H_cg",1,"physics_centralGravity"),e=document.getElementById("graph_H_sc"),e.onchange=a.bind(this,"graph_H_sc",1,"physics_springConstant"),e=document.getElementById("graph_H_sl"),e.onchange=a.bind(this,"graph_H_sl",1,"physics_springLength"),e=document.getElementById("graph_H_damp"),e.onchange=a.bind(this,"graph_H_damp",1,"physics_damping"),e=document.getElementById("graph_H_direction"),e.onchange=a.bind(this,"graph_H_direction",t,"hierarchicalLayout_direction"),e=document.getElementById("graph_H_levsep"),e.onchange=a.bind(this,"graph_H_levsep",1,"hierarchicalLayout_levelSeparation"),e=document.getElementById("graph_H_nspac"),e.onchange=a.bind(this,"graph_H_nspac",1,"hierarchicalLayout_nodeSpacing");var i=document.getElementById("graph_physicsMethod1"),d=document.getElementById("graph_physicsMethod2"),l=document.getElementById("graph_physicsMethod3");d.checked=!0,this.constants.physics.barnesHut.enabled&&(i.checked=!0),this.constants.hierarchicalLayout.enabled&&(l.checked=!0);var c=document.getElementById("graph_toggleSmooth"),p=document.getElementById("graph_repositionNodes"),u=document.getElementById("graph_generateOptions");c.onclick=s.bind(this),p.onclick=o.bind(this),u.onclick=n.bind(this),c.style.background=1==this.constants.smoothCurves&&0==this.constants.dynamicSmoothCurves?"#A4FF56":"#FF8532",r.apply(this),i.onchange=r.bind(this),d.onchange=r.bind(this),l.onchange=r.bind(this)}},e._overWriteGraphConstants=function(t,e){var i=t.split("_");1==i.length?this.constants[i[0]]=e:2==i.length?this.constants[i[0]][i[1]]=e:3==i.length&&(this.constants[i[0]][i[1]][i[2]]=e)}},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l,c=this.calculationNodes,p=this.calculationNodeIndices,u=-2/3,f=4/3,g=this.constants.physics.repulsion.nodeDistance,m=g;for(d=0;di&&(r=.5*m>i?1:v*i+f,r*=0==n?1:1+n*this.constants.clustering.forceAmplification,r/=i,s=t*r,o=e*r,a.fx-=s,a.fy-=o,h.fx+=s,h.fy+=o)}}},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l=this.calculationNodes,c=this.calculationNodeIndices,p=this.constants.physics.hierarchicalRepulsion.nodeDistance;for(h=0;hi?-Math.pow(u*i,2)+Math.pow(u*p,2):0,0==i?i=.01:n/=i,s=t*n,o=e*n,r.fx-=s,r.fy-=o,a.fx+=s,a.fy+=o}},e._calculateHierarchicalSpringForces=function(){for(var t,e,i,s,o,n,r,a,h,d=this.edges,l=this.calculationNodes,c=this.calculationNodeIndices,p=0;pn;n++)t=e[i[n]],t.options.mass>0&&(this._getForceContribution(o.root.children.NW,t),this._getForceContribution(o.root.children.NE,t),this._getForceContribution(o.root.children.SW,t),this._getForceContribution(o.root.children.SE,t))}},e._getForceContribution=function(t,e){if(t.childrenCount>0){var i,s,o;if(i=t.centerOfMass.x-e.x,s=t.centerOfMass.y-e.y,o=Math.sqrt(i*i+s*s),o*t.calcSize>this.constants.physics.barnesHut.theta){0==o&&(o=.1*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}else if(4==t.childrenCount)this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e);else if(t.children.data.id!=e.id){0==o&&(o=.5*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}}},e._formBarnesHutTree=function(t,e){for(var i,s=e.length,o=Number.MAX_VALUE,n=Number.MAX_VALUE,r=-Number.MAX_VALUE,a=-Number.MAX_VALUE,h=0;s>h;h++){var d=t[e[h]].x,l=t[e[h]].y;t[e[h]].options.mass>0&&(o>d&&(o=d),d>r&&(r=d),n>l&&(n=l),l>a&&(a=l))}var c=Math.abs(r-o)-Math.abs(a-n);c>0?(n-=.5*c,a+=.5*c):(o+=.5*c,r-=.5*c);var p=1e-5,u=Math.max(p,Math.abs(r-o)),f=.5*u,g=.5*(o+r),m=.5*(n+a),v={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:g-f,maxX:g+f,minY:m-f,maxY:m+f},size:u,calcSize:1/u,children:{data:null},maxWidth:0,level:0,childrenCount:4}};for(this._splitBranch(v.root),h=0;s>h;h++)i=t[e[h]],i.options.mass>0&&this._placeInTree(v.root,i);this.barnesHutTree=v},e._updateBranchMass=function(t,e){var i=t.mass+e.options.mass,s=1/i;t.centerOfMass.x=t.centerOfMass.x*t.mass+e.x*e.options.mass,t.centerOfMass.x*=s,t.centerOfMass.y=t.centerOfMass.y*t.mass+e.y*e.options.mass,t.centerOfMass.y*=s,t.mass=i;var o=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NW"):this._placeInRegion(t,e,"SW"):t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NE"):this._placeInRegion(t,e,"SE")},e._placeInRegion=function(t,e,i){switch(t.children[i].childrenCount){case 0:t.children[i].children.data=e,t.children[i].childrenCount=1,this._updateBranchMass(t.children[i],e);break;case 1:t.children[i].children.data.x==e.x&&t.children[i].children.data.y==e.y?(e.x+=Math.random(),e.y+=Math.random()):(this._splitBranch(t.children[i]),this._placeInTree(t.children[i],e));break;case 4:this._placeInTree(t.children[i],e)}},e._splitBranch=function(t){var e=null;1==t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)},e._insertRegion=function(t,e){var i,s,o,n,r=.5*t.size;switch(e){case"NW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY,n=t.range.minY+r;break;case"NE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY,n=t.range.minY+r;break;case"SW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY+r,n=t.range.maxY;break;case"SE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY+r,n=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:s,minY:o,maxY:n},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}},e._drawTree=function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))},e._drawBranch=function(t,e,i){void 0===i&&(i="#FF0000"),4==t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}},function(t,e){e.startWithClustering=function(){this.clusterToFit(this.constants.clustering.initialMaxNodes,!0),this.updateLabels(),this.stabilize&&this._stabilize(),this.start()},e.clusterToFit=function(t,e){for(var i=this.nodeIndices.length,s=50,o=0;i>t&&s>o;)o%3==0?(this.forceAggregateHubs(!0),this.normalizeClusterLevels()):this.increaseClusterLevel(),i=this.nodeIndices.length,o+=1;o>0&&1==e&&this.repositionNodes(),this._updateCalculationNodes()},e.openCluster=function(t){var e=this.moving;if(t.clusterSize>this.constants.clustering.sectorThreshold&&this._nodeInActiveArea(t)&&("default"!=this._sector()||1!=this.nodeIndices.length)){this._addSector(t);for(var i=0;this.nodeIndices.lengthi;)this.decreaseClusterLevel(),i+=1}else this._expandClusterNode(t,!1,!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this._updateCalculationNodes(),this.updateLabels();this.moving!=e&&this.start()},e.updateClustersDefault=function(){1==this.constants.clustering.enabled&&this.updateClusters(0,!1,!1)},e.increaseClusterLevel=function(){this.updateClusters(-1,!1,!0)},e.decreaseClusterLevel=function(){this.updateClusters(1,!1,!0)},e.updateClusters=function(t,e,i,s){var o=this.moving,n=this.nodeIndices.length;this.previousScale>this.scale&&0==t&&this._collapseSector(),this.previousScale>this.scale||-1==t?this._formClusters(i):(this.previousScalethis.scale||-1==t)&&(this._aggregateHubs(i),this._updateNodeIndexList()),(this.previousScale>this.scale||-1==t)&&(this.handleChains(),this._updateNodeIndexList()),this.previousScale=this.scale,this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.lengththis.constants.clustering.chainThreshold&&this._reduceAmountOfChains(1-this.constants.clustering.chainThreshold/t)},e._aggregateHubs=function(t){this._getHubSize(),this._formClustersByHub(t,!1)},e.forceAggregateHubs=function(t){var e=this.moving,i=this.nodeIndices.length;this._aggregateHubs(!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.length!=i&&(this.clusterSession+=1),(0==t||void 0===t)&&this.moving!=e&&this.start()},e._openClustersBySize=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];1==e.inView()&&(e.width*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientWidth||e.height*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientHeight)&&this.openCluster(e)}},e._openClusters=function(t,e){for(var i=0;i1&&(t.clusterSizei)){var r=n.from,a=n.to;n.to.options.mass>n.from.options.mass&&(r=n.to,a=n.from),1==a.dynamicEdgesLength?this._addToCluster(r,a,!1):1==r.dynamicEdgesLength&&this._addToCluster(a,r,!1)}}},e._forceClustersByZoom=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];if(1==e.dynamicEdgesLength&&0!=e.dynamicEdges.length){var i=e.dynamicEdges[0],s=i.toId==e.id?this.nodes[i.fromId]:this.nodes[i.toId];e.id!=s.id&&(s.options.mass>e.options.mass?this._addToCluster(s,e,!0):this._addToCluster(e,s,!0))}}},e._clusterToSmallestNeighbour=function(t){for(var e=-1,i=null,s=0;so.clusterSessions.length&&(e=o.clusterSessions.length,i=o)}null!=o&&void 0!==this.nodes[o.id]&&this._addToCluster(o,t,!0)},e._formClustersByHub=function(t,e){for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&this._formClusterFromHub(this.nodes[i],t,e)},e._formClusterFromHub=function(t,e,i,s){if(void 0===s&&(s=0),t.dynamicEdgesLength>=this.hubThreshold&&0==i||t.dynamicEdgesLength==this.hubThreshold&&1==i){for(var o,n,r,a=this.constants.clustering.clusterEdgeThreshold/this.scale,h=!1,d=[],l=t.dynamicEdges.length,c=0;l>c;c++)d.push(t.dynamicEdges[c].id);if(0==e)for(h=!1,c=0;l>c;c++){var p=this.edges[d[c]];if(void 0!==p&&p.connected&&p.toId!=p.fromId&&(o=p.to.x-p.from.x,n=p.to.y-p.from.y,r=Math.sqrt(o*o+n*n),a>r)){h=!0;break}}if(!e&&h||e)for(c=0;l>c;c++)if(p=this.edges[d[c]],void 0!==p){var u=this.nodes[p.fromId==t.id?p.toId:p.fromId];u.dynamicEdges.length<=this.hubThreshold+s&&u.id!=t.id&&this._addToCluster(t,u,e)}}},e._addToCluster=function(t,e,i){t.containedNodes[e.id]=e;for(var s=0;s1)for(var s=0;s1&&(e.label="[".concat(String(e.clusterSize),"]"))}for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(e=this.nodes[t],1==e.clusterSize&&(e.label=void 0!==e.originalLabel?e.originalLabel:String(e.id)))},e.normalizeClusterLevels=function(){var t,e=0,i=1e9,s=0;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(s=this.nodes[t].clusterSessions.length,s>e&&(e=s),i>s&&(i=s));if(e-i>this.constants.clustering.clusterLevelDifference){var o=this.nodeIndices.length,n=e-this.constants.clustering.clusterLevelDifference;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodes[t].clusterSessions.lengths&&(s=n.dynamicEdgesLength),t+=n.dynamicEdgesLength,e+=Math.pow(n.dynamicEdgesLength,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r);this.hubThreshold=Math.floor(t+2*a),this.hubThreshold>s&&(this.hubThreshold=s)},e._reduceAmountOfChains=function(t){this.hubThreshold=2;var e=Math.floor(this.nodeIndices.length*t);for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&e>0&&(this._formClusterFromHub(this.nodes[i],!0,!0,1),e-=1)},e._getChainFraction=function(){var t=0,e=0;for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&(2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&(t+=1),e+=1);return t/e}},function(t,e,i){var s=i(1);e._putDataInSector=function(){this.sectors.active[this._sector()].nodes=this.nodes,this.sectors.active[this._sector()].edges=this.edges,this.sectors.active[this._sector()].nodeIndices=this.nodeIndices},e._switchToSector=function(t,e){void 0===e||"active"==e?this._switchToActiveSector(t):this._switchToFrozenSector(t)},e._switchToActiveSector=function(t){this.nodeIndices=this.sectors.active[t].nodeIndices,this.nodes=this.sectors.active[t].nodes,this.edges=this.sectors.active[t].edges},e._switchToSupportSector=function(){this.nodeIndices=this.sectors.support.nodeIndices,this.nodes=this.sectors.support.nodes,this.edges=this.sectors.support.edges},e._switchToFrozenSector=function(t){this.nodeIndices=this.sectors.frozen[t].nodeIndices,this.nodes=this.sectors.frozen[t].nodes,this.edges=this.sectors.frozen[t].edges},e._loadLatestSector=function(){this._switchToSector(this._sector())},e._sector=function(){return this.activeSector[this.activeSector.length-1]},e._previousSector=function(){if(this.activeSector.length>1)return this.activeSector[this.activeSector.length-2];throw new TypeError("there are not enough sectors in the this.activeSector array.")},e._setActiveSector=function(t){this.activeSector.push(t)},e._forgetLastSector=function(){this.activeSector.pop()},e._createNewSector=function(t){this.sectors.active[t]={nodes:{},edges:{},nodeIndices:[],formationScale:this.scale,drawingNode:void 0},this.sectors.active[t].drawingNode=new Node({id:t,color:{background:"#eaefef",border:"495c5e"}},{},{},this.constants),this.sectors.active[t].drawingNode.clusterSize=2},e._deleteActiveSector=function(t){delete this.sectors.active[t]},e._deleteFrozenSector=function(t){delete this.sectors.frozen[t]},e._freezeSector=function(t){this.sectors.frozen[t]=this.sectors.active[t],this._deleteActiveSector(t)},e._activateSector=function(t){this.sectors.active[t]=this.sectors.frozen[t],this._deleteFrozenSector(t)},e._mergeThisWithFrozen=function(t){for(var e in this.nodes)this.nodes.hasOwnProperty(e)&&(this.sectors.frozen[t].nodes[e]=this.nodes[e]);for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.sectors.frozen[t].edges[i]=this.edges[i]);for(var s=0;s1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInSupportSector=function(t,e){if(void 0===e)this._switchToSupportSector(),this[t]();else{this._switchToSupportSector();var i=Array.prototype.splice.call(arguments,1);i.length>1?this[t](i[0],i[1]):this[t](e)}this._loadLatestSector()},e._doInAllFrozenSectors=function(t,e){if(void 0===e)for(var i in this.sectors.frozen)this.sectors.frozen.hasOwnProperty(i)&&(this._switchToFrozenSector(i),this[t]());else for(var i in this.sectors.frozen)if(this.sectors.frozen.hasOwnProperty(i)){this._switchToFrozenSector(i);var s=Array.prototype.splice.call(arguments,1);s.length>1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInAllSectors=function(t,e){var i=Array.prototype.splice.call(arguments,1);void 0===e?(this._doInAllActiveSectors(t),this._doInAllFrozenSectors(t)):i.length>1?(this._doInAllActiveSectors(t,i[0],i[1]),this._doInAllFrozenSectors(t,i[0],i[1])):(this._doInAllActiveSectors(t,e),this._doInAllFrozenSectors(t,e))},e._clearNodeIndexList=function(){var t=this._sector();this.sectors.active[t].nodeIndices=[],this.nodeIndices=this.sectors.active[t].nodeIndices},e._drawSectorNodes=function(t,e){var i,s=1e9,o=-1e9,n=1e9,r=-1e9;for(var a in this.sectors[e])if(this.sectors[e].hasOwnProperty(a)&&void 0!==this.sectors[e][a].drawingNode){this._switchToSector(a,e),s=1e9,o=-1e9,n=1e9,r=-1e9;for(var h in this.nodes)this.nodes.hasOwnProperty(h)&&(i=this.nodes[h],i.resize(t),n>i.x-.5*i.width&&(n=i.x-.5*i.width),ri.y-.5*i.height&&(s=i.y-.5*i.height),o0?this.nodes[i[i.length-1]]:null},e._getEdgesOverlappingWith=function(t,e){var i=this.edges;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},e._getAllEdgesOverlappingWith=function(t){var e=[];return this._doInAllActiveSectors("_getEdgesOverlappingWith",t,e),e},e._getEdgeAt=function(t){var e=this._pointerToPositionObject(t),i=this._getAllEdgesOverlappingWith(e);return i.length>0?this.edges[i[i.length-1]]:null},e._addToSelection=function(t){t instanceof s?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t},e._addToHover=function(t){t instanceof s?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t},e._removeFromSelection=function(t){t instanceof s?delete this.selectionObj.nodes[t.id]:delete this.selectionObj.edges[t.id]},e._unselectAll=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].unselect();for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&this.selectionObj.edges[i].unselect();this.selectionObj={nodes:{},edges:{}},0==t&&this.emit("select",this.getSelection())},e._unselectClusters=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].clusterSize>1&&(this.selectionObj.nodes[e].unselect(),this._removeFromSelection(this.selectionObj.nodes[e]));0==t&&this.emit("select",this.getSelection())},e._getSelectedNodeCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedNode=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t];return null},e._getSelectedEdge=function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t];return null},e._getSelectedEdgeCount=function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedObjectCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t},e._selectionIsEmpty=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0},e._clusterInSelection=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1},e._selectConnectedEdges=function(t){for(var e=0;ee;e++){s=t[e];var o=this.nodes[s];if(!o)throw new RangeError('Node with id "'+s+'" not found');this._selectObject(o,!0,!0)}console.log("setSelection is deprecated. Please use selectNodes instead."),this.redraw()},e.selectNodes=function(t,e){var i,s,o;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),i=0,s=t.length;s>i;i++){o=t[i];var n=this.nodes[o];if(!n)throw new RangeError('Node with id "'+o+'" not found');this._selectObject(n,!0,!0,e)}this.redraw()},e.selectEdges=function(t){var e,i,s;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),e=0,i=t.length;i>e;e++){s=t[e];var o=this.edges[s];if(!o)throw new RangeError('Edge with id "'+s+'" not found');this._selectObject(o,!0,!0,highlightEdges)}this.redraw()},e._updateSelection=function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},function(t,e,i){var s=i(1),o=i(49),n=i(50);e._clearManipulatorBar=function(){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild)},e._restoreOverloadedFunctions=function(){for(var t in this.cachedFunctions)this.cachedFunctions.hasOwnProperty(t)&&(this[t]=this.cachedFunctions[t])},e._toggleEditMode=function(){this.editMode=!this.editMode;var t=document.getElementById("network-manipulationDiv"),e=document.getElementById("network-manipulation-closeDiv"),i=document.getElementById("network-manipulation-editMode");1==this.editMode?(t.style.display="block",e.style.display="block",i.style.display="none",e.onclick=this._toggleEditMode.bind(this)):(t.style.display="none",e.style.display="none",i.style.display="block",e.onclick=null),this._createManipulatorBar()},e._createManipulatorBar=function(){this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];if(void 0!==this.edgeBeingEdited&&(this.edgeBeingEdited._disableControlNodes(),this.edgeBeingEdited=void 0,this.selectedControlNode=null,this.controlNodesActive=!1),this._restoreOverloadedFunctions(),this.freezeSimulation=!1,this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,1==this.editMode){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDiv.innerHTML=""+t.addNode+"
"+t.addEdge+"",1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?this.manipulationDiv.innerHTML+="
"+t.editNode+"":1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDiv.innerHTML+="
"+t.editEdge+""),0==this._selectionIsEmpty()&&(this.manipulationDiv.innerHTML+="
"+t.del+"");var e=document.getElementById("network-manipulate-addNode");e.onclick=this._createAddNodeToolbar.bind(this);var i=document.getElementById("network-manipulate-connectNode");if(i.onclick=this._createAddEdgeToolbar.bind(this),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit){var s=document.getElementById("network-manipulate-editNode");s.onclick=this._editNode.bind(this)}else if(1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()){var s=document.getElementById("network-manipulate-editEdge");s.onclick=this._createEditEdgeToolbar.bind(this)}if(0==this._selectionIsEmpty()){var o=document.getElementById("network-manipulate-delete");o.onclick=this._deleteSelected.bind(this)}var n=document.getElementById("network-manipulation-closeDiv");n.onclick=this._toggleEditMode.bind(this),this.boundFunction=this._createManipulatorBar.bind(this),this.on("select",this.boundFunction)}else{this.editModeDiv.innerHTML=""+t.edit+"";var r=document.getElementById("network-manipulate-editModeButton");r.onclick=this._toggleEditMode.bind(this)}},e._createAddNodeToolbar=function(){this._clearManipulatorBar(),this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];this.manipulationDiv.innerHTML=""+t.back+"
"+t.addDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._addNode.bind(this),this.on("select",this.boundFunction)},e._createAddEdgeToolbar=function(){this._clearManipulatorBar(),this._unselectAll(!0),this.freezeSimulation=!0;var t=this.constants.locales[this.constants.locale];this.boundFunction&&this.off("select",this.boundFunction),this._unselectAll(),this.forceAppendSelection=!1,this.blockConnectingEdgeSelection=!0,this.manipulationDiv.innerHTML=""+t.back+"
"+t.edgeDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._handleConnect.bind(this),this.on("select",this.boundFunction),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._handleOnRelease=this._handleOnRelease,this._handleTouch=this._handleConnect,this._handleOnRelease=this._finishConnect,this._redraw()},e._createEditEdgeToolbar=function(){this._clearManipulatorBar(),this.controlNodesActive=!0,this.boundFunction&&this.off("select",this.boundFunction),this.edgeBeingEdited=this._getSelectedEdge(),this.edgeBeingEdited._enableControlNodes();var t=this.constants.locales[this.constants.locale];this.manipulationDiv.innerHTML=""+t.back+"
"+t.editEdgeDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._handleOnRelease=this._handleOnRelease,this.cachedFunctions._handleTap=this._handleTap,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleTouch=this._selectControlNode,this._handleTap=function(){},this._handleOnDrag=this._controlNodeDrag,this._handleDragStart=function(){},this._handleOnRelease=this._releaseControlNode,this._redraw()},e._selectControlNode=function(t){this.edgeBeingEdited.controlNodes.from.unselect(),this.edgeBeingEdited.controlNodes.to.unselect(),this.selectedControlNode=this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(t.x),this._YconvertDOMtoCanvas(t.y)),null!==this.selectedControlNode&&(this.selectedControlNode.select(),this.freezeSimulation=!0),this._redraw()},e._controlNodeDrag=function(t){var e=this._getPointer(t.gesture.center);null!==this.selectedControlNode&&void 0!==this.selectedControlNode&&(this.selectedControlNode.x=this._XconvertDOMtoCanvas(e.x),this.selectedControlNode.y=this._YconvertDOMtoCanvas(e.y)),this._redraw()},e._releaseControlNode=function(t){var e=this._getNodeAt(t);null!=e?(1==this.edgeBeingEdited.controlNodes.from.selected&&(this._editEdge(e.id,this.edgeBeingEdited.to.id),this.edgeBeingEdited.controlNodes.from.unselect()),1==this.edgeBeingEdited.controlNodes.to.selected&&(this._editEdge(this.edgeBeingEdited.from.id,e.id),this.edgeBeingEdited.controlNodes.to.unselect())):this.edgeBeingEdited._restoreControlNodes(),this.freezeSimulation=!1,this._redraw()},e._handleConnect=function(t){if(0==this._getSelectedNodeCount()){var e=this._getNodeAt(t);null!=e&&(e.clusterSize>1?alert(this.constants.locales[this.constants.locale].createEdgeError):(this._selectObject(e,!1),this.sectors.support.nodes.targetNode=new o({id:"targetNode"},{},{},this.constants),this.sectors.support.nodes.targetNode.x=e.x,this.sectors.support.nodes.targetNode.y=e.y,this.sectors.support.nodes.targetViaNode=new o({id:"targetViaNode"},{},{},this.constants),this.sectors.support.nodes.targetViaNode.x=e.x,this.sectors.support.nodes.targetViaNode.y=e.y,this.sectors.support.nodes.targetViaNode.parentEdgeId="connectionEdge",this.edges.connectionEdge=new n({id:"connectionEdge",from:e.id,to:this.sectors.support.nodes.targetNode.id},this,this.constants),this.edges.connectionEdge.from=e,this.edges.connectionEdge.connected=!0,this.edges.connectionEdge.smooth=!0,this.edges.connectionEdge.selected=!0,this.edges.connectionEdge.to=this.sectors.support.nodes.targetNode,this.edges.connectionEdge.via=this.sectors.support.nodes.targetViaNode,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleOnDrag=function(t){var e=this._getPointer(t.gesture.center);this.sectors.support.nodes.targetNode.x=this._XconvertDOMtoCanvas(e.x),this.sectors.support.nodes.targetNode.y=this._YconvertDOMtoCanvas(e.y),this.sectors.support.nodes.targetViaNode.x=.5*(this._XconvertDOMtoCanvas(e.x)+this.edges.connectionEdge.from.x),this.sectors.support.nodes.targetViaNode.y=this._YconvertDOMtoCanvas(e.y)},this.moving=!0,this.start()))}},e._finishConnect=function(t){if(1==this._getSelectedNodeCount()){this._handleOnDrag=this.cachedFunctions._handleOnDrag,delete this.cachedFunctions._handleOnDrag;var e=this.edges.connectionEdge.fromId;delete this.edges.connectionEdge,delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode;var i=this._getNodeAt(t);null!=i&&(i.clusterSize>1?alert(this.constants.locales[this.constants.locale].createEdgeError):(this._createEdge(e,i.id),this._createManipulatorBar())),this._unselectAll()}},e._addNode=function(){if(this._selectionIsEmpty()&&1==this.editMode){var t=this._pointerToPositionObject(this.pointerPosition),e={id:s.randomUUID(),x:t.left,y:t.top,label:"new",allowedToMoveX:!0,allowedToMoveY:!0};if(this.triggerFunctions.add){if(2!=this.triggerFunctions.add.length)throw new Error("The function for add does not support two arguments (data,callback)");var i=this;this.triggerFunctions.add(e,function(t){i.nodesData.add(t),i._createManipulatorBar(),i.moving=!0,i.start()})}else this.nodesData.add(e),this._createManipulatorBar(),this.moving=!0,this.start()}},e._createEdge=function(t,e){if(1==this.editMode){var i={from:t,to:e};if(this.triggerFunctions.connect){if(2!=this.triggerFunctions.connect.length)throw new Error("The function for connect does not support two arguments (data,callback)");var s=this;this.triggerFunctions.connect(i,function(t){s.edgesData.add(t),s.moving=!0,s.start()})}else this.edgesData.add(i),this.moving=!0,this.start()}},e._editEdge=function(t,e){if(1==this.editMode){var i={id:this.edgeBeingEdited.id,from:t,to:e};if(this.triggerFunctions.editEdge){if(2!=this.triggerFunctions.editEdge.length)throw new Error("The function for edit does not support two arguments (data, callback)");var s=this;this.triggerFunctions.editEdge(i,function(t){s.edgesData.update(t),s.moving=!0,s.start()})}else this.edgesData.update(i),this.moving=!0,this.start()}},e._editNode=function(){if(!this.triggerFunctions.edit||1!=this.editMode)throw new Error("No edit function has been bound to this button");var t=this._getSelectedNode(),e={id:t.id,label:t.label,group:t.options.group,shape:t.options.shape,color:{background:t.options.color.background,border:t.options.color.border,highlight:{background:t.options.color.highlight.background,border:t.options.color.highlight.border}}};if(2!=this.triggerFunctions.edit.length)throw new Error("The function for edit does not support two arguments (data, callback)");var i=this;this.triggerFunctions.edit(e,function(t){i.nodesData.update(t),i._createManipulatorBar(),i.moving=!0,i.start()})},e._deleteSelected=function(){if(!this._selectionIsEmpty()&&1==this.editMode)if(this._clusterInSelection())alert(this.constants.locales[this.constants.locale].deleteClusterError);else{var t=this.getSelectedNodes(),e=this.getSelectedEdges();if(this.triggerFunctions.del){var i=this,s={nodes:t,edges:e};if(!(this.triggerFunctions.del.length=2))throw new Error("The function for delete does not support two arguments (data, callback)");this.triggerFunctions.del(s,function(t){i.edgesData.remove(t.edges),i.nodesData.remove(t.nodes),i._unselectAll(),i.moving=!0,i.start()})}else this.edgesData.remove(e),this.nodesData.remove(t),this._unselectAll(),this.moving=!0,this.start()}}},function(t,e,i){var s=(i(1),i(18));e._cleanNavigation=function(){var t=document.getElementById("network-navigation_wrapper");t&&t.parentNode&&t.parentNode.removeChild(t),document.onmouseup=null},e._loadNavigationElements=function(){this._cleanNavigation(),this.navigationDivs={};var t=["up","down","left","right","zoomIn","zoomOut","zoomExtends"],e=["_moveUp","_moveDown","_moveLeft","_moveRight","_zoomIn","_zoomOut","zoomExtent"];this.navigationDivs.wrapper=document.createElement("div"),this.navigationDivs.wrapper.id="network-navigation_wrapper",this.frame.appendChild(this.navigationDivs.wrapper);for(var i=this,o=0;o0){"RL"==this.constants.hierarchicalLayout.direction||"DU"==this.constants.hierarchicalLayout.direction?this.constants.hierarchicalLayout.levelSeparation*=-1:this.constants.hierarchicalLayout.levelSeparation=Math.abs(this.constants.hierarchicalLayout.levelSeparation),"RL"==this.constants.hierarchicalLayout.direction||"LR"==this.constants.hierarchicalLayout.direction?1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="vertical"):1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="horizontal");var t,e,i=0,s=!1,o=!1;for(e in this.nodes)this.nodes.hasOwnProperty(e)&&(t=this.nodes[e],-1!=t.level?s=!0:o=!0,is&&(n.xFixed=!1,n.x=i[n.level].minPos,r=!0):n.yFixed&&n.level>s&&(n.yFixed=!1,n.y=i[n.level].minPos,r=!0),1==r&&(i[n.level].minPos+=i[n.level].nodeSpacing,n.edges.length>1&&this._placeBranchNodes(n.edges,n.id,i,n.level))}},e._setLevel=function(t,e,i){for(var s=0;st)&&(o.level=t,e.length>1&&this._setLevel(t+1,o.edges,o.id))}},e._restoreNodes=function(){for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.nodes[t].xFixed=!1,this.nodes[t].yFixed=!1)}},function(t,e){e.en={edit:"Edit",del:"Delete selected",back:"Back",addNode:"Add Node",addEdge:"Add Edge",editNode:"Edit Node",editEdge:"Edit Edge",addDescription:"Click in an empty space to place a new node.",edgeDescription:"Click on a node and drag the edge to another node to connect them.",editEdgeDescription:"Click on the control points and drag them to a node to connect to it.",createEdgeError:"Cannot link edges to a cluster.",deleteClusterError:"Clusters cannot be deleted."},e.en_EN=e.en,e.en_US=e.en,e.nl={edit:"Wijzigen",del:"Selectie verwijderen",back:"Terug",addNode:"Node toevoegen",addEdge:"Link toevoegen",editNode:"Node wijzigen",editEdge:"Link wijzigen",addDescription:"Klik op een leeg gebied om een nieuwe node te maken.",edgeDescription:"Klik op een node en sleep de link naar een andere node om ze te verbinden.",editEdgeDescription:"Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.",createEdgeError:"Kan geen link maken naar een cluster.",deleteClusterError:"Clusters kunnen niet worden verwijderd."},e.nl_NL=e.nl,e.nl_BE=e.nl},function(){"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.circle=function(t,e,i){this.beginPath(),this.arc(t,e,i,0,2*Math.PI,!1)},CanvasRenderingContext2D.prototype.square=function(t,e,i){this.beginPath(),this.rect(t-i,e-i,2*i,2*i)},CanvasRenderingContext2D.prototype.triangle=function(t,e,i){this.beginPath();var s=2*i,o=s/2,n=Math.sqrt(3)/6*s,r=Math.sqrt(s*s-o*o);this.moveTo(t,e-(r-n)),this.lineTo(t+o,e+n),this.lineTo(t-o,e+n),this.lineTo(t,e-(r-n)),this.closePath()},CanvasRenderingContext2D.prototype.triangleDown=function(t,e,i){this.beginPath();var s=2*i,o=s/2,n=Math.sqrt(3)/6*s,r=Math.sqrt(s*s-o*o);this.moveTo(t,e+(r-n)),this.lineTo(t+o,e-n),this.lineTo(t-o,e-n),this.lineTo(t,e+(r-n)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath();for(var s=0;10>s;s++){var o=s%2===0?1.3*i:.5*i;this.lineTo(t+o*Math.sin(2*s*Math.PI/10),e-o*Math.cos(2*s*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,s,o){var n=Math.PI/180;0>i-2*o&&(o=i/2),0>s-2*o&&(o=s/2),this.beginPath(),this.moveTo(t+o,e),this.lineTo(t+i-o,e),this.arc(t+i-o,e+o,o,270*n,360*n,!1),this.lineTo(t+i,e+s-o),this.arc(t+i-o,e+s-o,o,0,90*n,!1),this.lineTo(t+o,e+s),this.arc(t+o,e+s-o,o,90*n,180*n,!1),this.lineTo(t,e+o),this.arc(t+o,e+o,o,180*n,270*n,!1)},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,s){var o=.5522848,n=i/2*o,r=s/2*o,a=t+i,h=e+s,d=t+i/2,l=e+s/2;this.beginPath(),this.moveTo(t,l),this.bezierCurveTo(t,l-r,d-n,e,d,e),this.bezierCurveTo(d+n,e,a,l-r,a,l),this.bezierCurveTo(a,l+r,d+n,h,d,h),this.bezierCurveTo(d-n,h,t,l+r,t,l)},CanvasRenderingContext2D.prototype.database=function(t,e,i,s){var o=1/3,n=i,r=s*o,a=.5522848,h=n/2*a,d=r/2*a,l=t+n,c=e+r,p=t+n/2,u=e+r/2,f=e+(s-r/2),g=e+s;this.beginPath(),this.moveTo(l,u),this.bezierCurveTo(l,u+d,p+h,c,p,c),this.bezierCurveTo(p-h,c,t,u+d,t,u),this.bezierCurveTo(t,u-d,p-h,e,p,e),this.bezierCurveTo(p+h,e,l,u-d,l,u),this.lineTo(l,f),this.bezierCurveTo(l,f+d,p+h,g,p,g),this.bezierCurveTo(p-h,g,t,f+d,t,f),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,s){var o=t-s*Math.cos(i),n=e-s*Math.sin(i),r=t-.9*s*Math.cos(i),a=e-.9*s*Math.sin(i),h=o+s/3*Math.cos(i+.5*Math.PI),d=n+s/3*Math.sin(i+.5*Math.PI),l=o+s/3*Math.cos(i-.5*Math.PI),c=n+s/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(r,a),this.lineTo(l,c),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,s,o){o||(o=[10,5]),0==p&&(p=.001);var n=o.length;this.moveTo(t,e);for(var r=i-t,a=s-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,c=!0;d>=.1;){var p=o[l++%n];p>d&&(p=d);var u=Math.sqrt(p*p/(1+h*h));0>r&&(u=-u),t+=u,e+=h*u,this[c?"lineTo":"moveTo"](t,e),d-=p,c=!c}})}])}); //# sourceMappingURL=vis.map \ No newline at end of file diff --git a/lib/timeline/component/DataAxis.js b/lib/timeline/component/DataAxis.js index 42b31c41..f53b00ef 100644 --- a/lib/timeline/component/DataAxis.js +++ b/lib/timeline/component/DataAxis.js @@ -11,7 +11,7 @@ var DataStep = require('../DataStep'); * @extends Component * @param body */ -function DataAxis (body, options, svg) { +function DataAxis (body, options, svg, linegraphOptions) { this.id = util.randomUUID(); this.body = body; @@ -33,6 +33,7 @@ function DataAxis (body, options, svg) { } }; + this.linegraphOptions = linegraphOptions; this.linegraphSVG = svg; this.props = {}; this.DOMelements = { // dynamic elements @@ -161,7 +162,7 @@ DataAxis.prototype._redrawGroupIcons = function () { for (var groupId in this.groups) { if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); y += iconHeight + iconOffset; } @@ -222,7 +223,7 @@ DataAxis.prototype.redraw = function () { var activeGroups = 0; for (var groupId in this.groups) { if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { activeGroups++; } } diff --git a/lib/timeline/component/Legend.js b/lib/timeline/component/Legend.js index 6fe799ef..4245ac33 100644 --- a/lib/timeline/component/Legend.js +++ b/lib/timeline/component/Legend.js @@ -5,7 +5,7 @@ var Component = require('./Component'); /** * Legend for Graph2d */ -function Legend(body, options, side) { +function Legend(body, options, side, linegraphOptions) { this.body = body; this.defaultOptions = { enabled: true, @@ -23,6 +23,7 @@ function Legend(body, options, side) { } this.side = side; this.options = util.extend({},this.defaultOptions); + this.linegraphOptions = linegraphOptions; this.svgElements = {}; this.dom = {}; @@ -105,7 +106,7 @@ Legend.prototype.redraw = function() { var activeGroups = 0; for (var groupId in this.groups) { if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { activeGroups++; } } @@ -158,7 +159,7 @@ Legend.prototype.redraw = function() { var content = ''; for (var groupId in this.groups) { if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { content += this.groups[groupId].content + '
'; } } @@ -182,7 +183,7 @@ Legend.prototype.drawLegendIcons = function() { for (var groupId in this.groups) { if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); y += iconHeight + this.options.iconSpacing; } diff --git a/lib/timeline/component/LineGraph.js b/lib/timeline/component/LineGraph.js index c8b71a5c..7a0a9fe1 100644 --- a/lib/timeline/component/LineGraph.js +++ b/lib/timeline/component/LineGraph.js @@ -162,15 +162,15 @@ LineGraph.prototype._create = function(){ // data axis this.options.dataAxis.orientation = 'left'; - this.yAxisLeft = new DataAxis(this.body, this.options.dataAxis, this.svg); + this.yAxisLeft = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); this.options.dataAxis.orientation = 'right'; - this.yAxisRight = new DataAxis(this.body, this.options.dataAxis, this.svg); + this.yAxisRight = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); delete this.options.dataAxis.orientation; // legends - this.legendLeft = new Legend(this.body, this.options.legend, 'left'); - this.legendRight = new Legend(this.body, this.options.legend, 'right'); + this.legendLeft = new Legend(this.body, this.options.legend, 'left', this.options.groups); + this.legendRight = new Legend(this.body, this.options.legend, 'right', this.options.groups); this.show(); }; From 1a9b680cd6f0fa9e0785e32b9d95560413b36d0f Mon Sep 17 00:00:00 2001 From: Alex de Mulder Date: Fri, 22 Aug 2014 18:33:55 +0200 Subject: [PATCH 4/4] bugfix --- dist/vis.js | 3828 +++++++++++++++++++-------------------- dist/vis.map | 2 +- dist/vis.min.js | 10 +- lib/timeline/Graph2d.js | 2 +- 4 files changed, 1921 insertions(+), 1921 deletions(-) diff --git a/dist/vis.js b/dist/vis.js index 17c51f2d..516411e1 100644 --- a/dist/vis.js +++ b/dist/vis.js @@ -102,7 +102,7 @@ return /******/ (function(modules) { // webpackBootstrap exports.Timeline = __webpack_require__(17); exports.Graph2d = __webpack_require__(38); exports.timeline = { - DataStep: __webpack_require__(41), + DataStep: __webpack_require__(39), Range: __webpack_require__(20), stack: __webpack_require__(31), TimeStep: __webpack_require__(25), @@ -119,11 +119,11 @@ return /******/ (function(modules) { // webpackBootstrap CurrentTime: __webpack_require__(26), CustomTime: __webpack_require__(28), DataAxis: __webpack_require__(40), - GraphGroup: __webpack_require__(42), + GraphGroup: __webpack_require__(41), Group: __webpack_require__(30), ItemSet: __webpack_require__(29), - Legend: __webpack_require__(43), - LineGraph: __webpack_require__(39), + Legend: __webpack_require__(42), + LineGraph: __webpack_require__(43), TimeAxis: __webpack_require__(24) } }; @@ -17825,7 +17825,7 @@ return /******/ (function(modules) { // webpackBootstrap var TimeAxis = __webpack_require__(24); var CurrentTime = __webpack_require__(26); var CustomTime = __webpack_require__(28); - var LineGraph = __webpack_require__(39); + var LineGraph = __webpack_require__(43); /** * Create a timeline visualization @@ -18007,7 +18007,7 @@ return /******/ (function(modules) { // webpackBootstrap */ Graph2d.prototype.isGroupVisible = function(groupId) { if (this.linegraph.groups[groupId] !== undefined) { - return (this.linegraph.groups[groupId].visible && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)); + return (this.linegraph.groups[groupId].visible && (this.linegraph.options.groups.visibility[groupId] === undefined || this.linegraph.options.groups.visibility[groupId] == true)); } else { return false; @@ -18054,2381 +18054,2381 @@ return /******/ (function(modules) { // webpackBootstrap /* 39 */ /***/ function(module, exports, __webpack_require__) { - var util = __webpack_require__(1); - var DOMutil = __webpack_require__(6); - var DataSet = __webpack_require__(7); - var DataView = __webpack_require__(8); - var Component = __webpack_require__(22); - var DataAxis = __webpack_require__(40); - var GraphGroup = __webpack_require__(42); - var Legend = __webpack_require__(43); - - var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items - /** - * This is the constructor of the LineGraph. It requires a Timeline body and options. + * @constructor DataStep + * The class DataStep is an iterator for data for the lineGraph. You provide a start data point and an + * end data point. The class itself determines the best scale (step size) based on the + * provided start Date, end Date, and minimumStep. * - * @param body - * @param options - * @constructor + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * + * Alternatively, you can set a scale by hand. + * After creation, you can initialize the class by executing first(). Then you + * can iterate from the start date to the end date via next(). You can check if + * the end date is reached with the function hasNext(). After each step, you can + * retrieve the current date via getCurrent(). + * The DataStep has scales ranging from milliseconds, seconds, minutes, hours, + * days, to years. + * + * Version: 1.2 + * + * @param {Date} [start] The start date, for example new Date(2010, 9, 21) + * or new Date(2010, 9, 21, 23, 45, 00) + * @param {Date} [end] The end date + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds */ - function LineGraph(body, options) { - this.id = util.randomUUID(); - this.body = body; - - this.defaultOptions = { - yAxisOrientation: 'left', - defaultGroup: 'default', - sort: true, - sampling: true, - graphHeight: '400px', - shaded: { - enabled: false, - orientation: 'bottom' // top, bottom - }, - style: 'line', // line, bar - barChart: { - width: 50, - handleOverlap: 'overlap', - align: 'center' // left, center, right - }, - catmullRom: { - enabled: true, - parametrization: 'centripetal', // uniform (alpha = 0.0), chordal (alpha = 1.0), centripetal (alpha = 0.5) - alpha: 0.5 - }, - drawPoints: { - enabled: true, - size: 6, - style: 'square' // square, circle - }, - dataAxis: { - showMinorLabels: true, - showMajorLabels: true, - icons: false, - width: '40px', - visible: true, - customRange: { - left: {min:undefined, max:undefined}, - right: {min:undefined, max:undefined} - } - }, - legend: { - enabled: false, - icons: true, - left: { - visible: true, - position: 'top-left' // top/bottom - left,right - }, - right: { - visible: true, - position: 'top-right' // top/bottom - left,right - } - }, - groups: { - visibility: {} - } - }; + function DataStep(start, end, minimumStep, containerHeight, customRange) { + // variables + this.current = 0; - // options is shared by this ItemSet and all its items - this.options = util.extend({}, this.defaultOptions); - this.dom = {}; - this.props = {}; - this.hammer = null; - this.groups = {}; - this.abortedGraphUpdate = false; + this.autoScale = true; + this.stepIndex = 0; + this.step = 1; + this.scale = 1; - var me = this; - this.itemsData = null; // DataSet - this.groupsData = null; // DataSet + this.marginStart; + this.marginEnd; + this.deadSpace = 0; - // listeners for the DataSet of the items - this.itemListeners = { - 'add': function (event, params, senderId) { - me._onAdd(params.items); - }, - 'update': function (event, params, senderId) { - me._onUpdate(params.items); - }, - 'remove': function (event, params, senderId) { - me._onRemove(params.items); - } - }; + this.majorSteps = [1, 2, 5, 10]; + this.minorSteps = [0.25, 0.5, 1, 2]; - // listeners for the DataSet of the groups - this.groupListeners = { - 'add': function (event, params, senderId) { - me._onAddGroups(params.items); - }, - 'update': function (event, params, senderId) { - me._onUpdateGroups(params.items); - }, - 'remove': function (event, params, senderId) { - me._onRemoveGroups(params.items); - } - }; + this.setRange(start, end, minimumStep, containerHeight, customRange); + } - this.items = {}; // object with an Item for every data item - this.selection = []; // list with the ids of all selected nodes - this.lastStart = this.body.range.start; - this.touchParams = {}; // stores properties while dragging - this.svgElements = {}; - this.setOptions(options); - this.groupsUsingDefaultStyles = [0]; - this.body.emitter.on("rangechange",function() { - if (me.lastStart != 0) { - var offset = me.body.range.start - me.lastStart; - var range = me.body.range.end - me.body.range.start; - if (me.width != 0) { - var rangePerPixelInv = me.width/range; - var xOffset = offset * rangePerPixelInv; - me.svg.style.left = (-me.width - xOffset) + "px"; - } - } - }); - this.body.emitter.on("rangechanged", function() { - me.lastStart = me.body.range.start; - me.svg.style.left = util.option.asSize(-me.width); - me._updateGraph.apply(me); - }); + /** + * Set a new range + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * @param {Number} [start] The start date and time. + * @param {Number} [end] The end date and time. + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds + */ + DataStep.prototype.setRange = function(start, end, minimumStep, containerHeight, customRange) { + this._start = customRange.min === undefined ? start : customRange.min; + this._end = customRange.max === undefined ? end : customRange.max; - // create the HTML DOM - this._create(); - this.body.emitter.emit("change"); - } + if (start == end) { + this._start = start - 0.75; + this._end = end + 1; + } - LineGraph.prototype = new Component(); + if (this.autoScale) { + this.setMinimumStep(minimumStep, containerHeight); + } + this.setFirst(customRange); + }; /** - * Create the HTML DOM for the ItemSet + * Automatically determine the scale that bests fits the provided minimum step + * @param {Number} [minimumStep] The minimum step size in milliseconds */ - LineGraph.prototype._create = function(){ - var frame = document.createElement('div'); - frame.className = 'LineGraph'; - this.dom.frame = frame; + DataStep.prototype.setMinimumStep = function(minimumStep, containerHeight) { + // round to floor + var size = this._end - this._start; + var safeSize = size * 1.2; + var minimumStepValue = minimumStep * (safeSize / containerHeight); + var orderOfMagnitude = Math.round(Math.log(safeSize)/Math.LN10); - // create svg element for graph drawing. - this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); - this.svg.style.position = "relative"; - this.svg.style.height = ('' + this.options.graphHeight).replace("px",'') + 'px'; - this.svg.style.display = "block"; - frame.appendChild(this.svg); + var minorStepIdx = -1; + var magnitudefactor = Math.pow(10,orderOfMagnitude); - // data axis - this.options.dataAxis.orientation = 'left'; - this.yAxisLeft = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); + var start = 0; + if (orderOfMagnitude < 0) { + start = orderOfMagnitude; + } - this.options.dataAxis.orientation = 'right'; - this.yAxisRight = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); - delete this.options.dataAxis.orientation; + var solutionFound = false; + for (var i = start; Math.abs(i) <= Math.abs(orderOfMagnitude); i++) { + magnitudefactor = Math.pow(10,i); + for (var j = 0; j < this.minorSteps.length; j++) { + var stepSize = magnitudefactor * this.minorSteps[j]; + if (stepSize >= minimumStepValue) { + solutionFound = true; + minorStepIdx = j; + break; + } + } + if (solutionFound == true) { + break; + } + } + this.stepIndex = minorStepIdx; + this.scale = magnitudefactor; + this.step = magnitudefactor * this.minorSteps[minorStepIdx]; + }; - // legends - this.legendLeft = new Legend(this.body, this.options.legend, 'left', this.options.groups); - this.legendRight = new Legend(this.body, this.options.legend, 'right', this.options.groups); - this.show(); - }; /** - * set the options of the LineGraph. the mergeOptions is used for subObjects that have an enabled element. - * @param options + * Round the current date to the first minor date value + * This must be executed once when the current date is set to start Date */ - LineGraph.prototype.setOptions = function(options) { - if (options) { - var fields = ['sampling','defaultGroup','graphHeight','yAxisOrientation','style','barChart','dataAxis','sort','groups']; - util.selectiveDeepExtend(fields, this.options, options); - util.mergeOptions(this.options, options,'catmullRom'); - util.mergeOptions(this.options, options,'drawPoints'); - util.mergeOptions(this.options, options,'shaded'); - util.mergeOptions(this.options, options,'legend'); + DataStep.prototype.setFirst = function(customRange) { + if (customRange === undefined) { + customRange = {}; + } + var niceStart = customRange.min === undefined ? this._start - (this.scale * 2 * this.minorSteps[this.stepIndex]) : customRange.min; + var niceEnd = customRange.max === undefined ? this._end + (this.scale * this.minorSteps[this.stepIndex]) : customRange.max; - if (options.catmullRom) { - if (typeof options.catmullRom == 'object') { - if (options.catmullRom.parametrization) { - if (options.catmullRom.parametrization == 'uniform') { - this.options.catmullRom.alpha = 0; - } - else if (options.catmullRom.parametrization == 'chordal') { - this.options.catmullRom.alpha = 1.0; - } - else { - this.options.catmullRom.parametrization = 'centripetal'; - this.options.catmullRom.alpha = 0.5; - } - } - } - } + this.marginEnd = customRange.max === undefined ? this.roundToMinor(niceEnd) : customRange.max; + this.marginStart = customRange.min === undefined ? this.roundToMinor(niceStart) : customRange.min; + this.deadSpace = this.roundToMinor(niceEnd) - niceEnd + this.roundToMinor(niceStart) - niceStart; + this.marginRange = this.marginEnd - this.marginStart; - if (this.yAxisLeft) { - if (options.dataAxis !== undefined) { - this.yAxisLeft.setOptions(this.options.dataAxis); - this.yAxisRight.setOptions(this.options.dataAxis); - } - } + this.current = this.marginEnd; - if (this.legendLeft) { - if (options.legend !== undefined) { - this.legendLeft.setOptions(this.options.legend); - this.legendRight.setOptions(this.options.legend); - } - } + }; - if (this.groups.hasOwnProperty(UNGROUPED)) { - this.groups[UNGROUPED].setOptions(options); - } + DataStep.prototype.roundToMinor = function(value) { + var rounded = value - (value % (this.scale * this.minorSteps[this.stepIndex])); + if (value % (this.scale * this.minorSteps[this.stepIndex]) > 0.5 * (this.scale * this.minorSteps[this.stepIndex])) { + return rounded + (this.scale * this.minorSteps[this.stepIndex]); } - if (this.dom.frame) { - this._updateGraph(); + else { + return rounded; } - }; + } + /** - * Hide the component from the DOM + * Check if the there is a next step + * @return {boolean} true if the current date has not passed the end date */ - LineGraph.prototype.hide = function() { - // remove the frame containing the items - if (this.dom.frame.parentNode) { - this.dom.frame.parentNode.removeChild(this.dom.frame); - } + DataStep.prototype.hasNext = function () { + return (this.current >= this.marginStart); }; /** - * Show the component in the DOM (when not already visible). - * @return {Boolean} changed + * Do the next step */ - LineGraph.prototype.show = function() { - // show frame containing the items - if (!this.dom.frame.parentNode) { - this.body.dom.center.appendChild(this.dom.frame); + DataStep.prototype.next = function() { + var prev = this.current; + this.current -= this.step; + + // safety mechanism: if current time is still unchanged, move to the end + if (this.current == prev) { + this.current = this._end; } }; - /** - * Set items - * @param {vis.DataSet | null} items + * Do the next step */ - LineGraph.prototype.setItems = function(items) { - var me = this, - ids, - oldItemsData = this.itemsData; - - // replace the dataset - if (!items) { - this.itemsData = null; - } - else if (items instanceof DataSet || items instanceof DataView) { - this.itemsData = items; - } - else { - throw new TypeError('Data must be an instance of DataSet or DataView'); - } - - if (oldItemsData) { - // unsubscribe from old dataset - util.forEach(this.itemListeners, function (callback, event) { - oldItemsData.off(event, callback); - }); - - // remove all drawn items - ids = oldItemsData.getIds(); - this._onRemove(ids); - } + DataStep.prototype.previous = function() { + this.current += this.step; + this.marginEnd += this.step; + this.marginRange = this.marginEnd - this.marginStart; + }; - if (this.itemsData) { - // subscribe to new dataset - var id = this.id; - util.forEach(this.itemListeners, function (callback, event) { - me.itemsData.on(event, callback, id); - }); - // add all new items - ids = this.itemsData.getIds(); - this._onAdd(ids); - } - this._updateUngrouped(); - this._updateGraph(); - this.redraw(); - }; /** - * Set groups - * @param {vis.DataSet} groups + * Get the current datetime + * @return {String} current The current date */ - LineGraph.prototype.setGroups = function(groups) { - var me = this, - ids; + DataStep.prototype.getCurrent = function() { + var toPrecision = '' + Number(this.current).toPrecision(5); + for (var i = toPrecision.length-1; i > 0; i--) { + if (toPrecision[i] == "0") { + toPrecision = toPrecision.slice(0,i); + } + else if (toPrecision[i] == "." || toPrecision[i] == ",") { + toPrecision = toPrecision.slice(0,i); + break; + } + else{ + break; + } + } - // unsubscribe from current dataset - if (this.groupsData) { - util.forEach(this.groupListeners, function (callback, event) { - me.groupsData.unsubscribe(event, callback); - }); + return toPrecision; + }; - // remove all drawn groups - ids = this.groupsData.getIds(); - this.groupsData = null; - this._onRemoveGroups(ids); // note: this will cause a redraw - } - // replace the dataset - if (!groups) { - this.groupsData = null; - } - else if (groups instanceof DataSet || groups instanceof DataView) { - this.groupsData = groups; - } - else { - throw new TypeError('Data must be an instance of DataSet or DataView'); - } - if (this.groupsData) { - // subscribe to new dataset - var id = this.id; - util.forEach(this.groupListeners, function (callback, event) { - me.groupsData.on(event, callback, id); - }); + /** + * Snap a date to a rounded value. + * The snap intervals are dependent on the current scale and step. + * @param {Date} date the date to be snapped. + * @return {Date} snappedDate + */ + DataStep.prototype.snap = function(date) { - // draw all ms - ids = this.groupsData.getIds(); - this._onAddGroups(ids); - } - this._onUpdate(); }; - /** - * Update the datapoints - * @param [ids] - * @private + * Check if the current value is a major value (for example when the step + * is DAY, a major value is each first day of the MONTH) + * @return {boolean} true if current date is major, else false. */ - LineGraph.prototype._onUpdate = function(ids) { - this._updateUngrouped(); - this._updateAllGroupData(); - this._updateGraph(); - this.redraw(); + DataStep.prototype.isMajor = function() { + return (this.current % (this.scale * this.majorSteps[this.stepIndex]) == 0); }; - LineGraph.prototype._onAdd = function (ids) {this._onUpdate(ids);}; - LineGraph.prototype._onRemove = function (ids) {this._onUpdate(ids);}; - LineGraph.prototype._onUpdateGroups = function (groupIds) { - for (var i = 0; i < groupIds.length; i++) { - var group = this.groupsData.get(groupIds[i]); - this._updateGroup(group, groupIds[i]); - } - this._updateGraph(); - this.redraw(); - }; - LineGraph.prototype._onAddGroups = function (groupIds) {this._onUpdateGroups(groupIds);}; + module.exports = DataStep; - LineGraph.prototype._onRemoveGroups = function (groupIds) { - for (var i = 0; i < groupIds.length; i++) { - if (!this.groups.hasOwnProperty(groupIds[i])) { - if (this.groups[groupIds[i]].options.yAxisOrientation == 'right') { - this.yAxisRight.removeGroup(groupIds[i]); - this.legendRight.removeGroup(groupIds[i]); - this.legendRight.redraw(); - } - else { - this.yAxisLeft.removeGroup(groupIds[i]); - this.legendLeft.removeGroup(groupIds[i]); - this.legendLeft.redraw(); - } - delete this.groups[groupIds[i]]; - } - } - this._updateUngrouped(); - this._updateGraph(); - this.redraw(); - }; + +/***/ }, +/* 40 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(6); + var Component = __webpack_require__(22); + var DataStep = __webpack_require__(39); /** - * update a group object - * - * @param group - * @param groupId - * @private + * A horizontal time axis + * @param {Object} [options] See DataAxis.setOptions for the available + * options. + * @constructor DataAxis + * @extends Component + * @param body */ - LineGraph.prototype._updateGroup = function (group, groupId) { - if (!this.groups.hasOwnProperty(groupId)) { - this.groups[groupId] = new GraphGroup(group, groupId, this.options, this.groupsUsingDefaultStyles); - if (this.groups[groupId].options.yAxisOrientation == 'right') { - this.yAxisRight.addGroup(groupId, this.groups[groupId]); - this.legendRight.addGroup(groupId, this.groups[groupId]); - } - else { - this.yAxisLeft.addGroup(groupId, this.groups[groupId]); - this.legendLeft.addGroup(groupId, this.groups[groupId]); - } - } - else { - this.groups[groupId].update(group); - if (this.groups[groupId].options.yAxisOrientation == 'right') { - this.yAxisRight.updateGroup(groupId, this.groups[groupId]); - this.legendRight.updateGroup(groupId, this.groups[groupId]); - } - else { - this.yAxisLeft.updateGroup(groupId, this.groups[groupId]); - this.legendLeft.updateGroup(groupId, this.groups[groupId]); + function DataAxis (body, options, svg, linegraphOptions) { + this.id = util.randomUUID(); + this.body = body; + + this.defaultOptions = { + orientation: 'left', // supported: 'left', 'right' + showMinorLabels: true, + showMajorLabels: true, + icons: true, + majorLinesOffset: 7, + minorLinesOffset: 4, + labelOffsetX: 10, + labelOffsetY: 2, + iconWidth: 20, + width: '40px', + visible: true, + customRange: { + left: {min:undefined, max:undefined}, + right: {min:undefined, max:undefined} } + }; + + this.linegraphOptions = linegraphOptions; + this.linegraphSVG = svg; + this.props = {}; + this.DOMelements = { // dynamic elements + lines: {}, + labels: {} + }; + + this.dom = {}; + + this.range = {start:0, end:0}; + + this.options = util.extend({}, this.defaultOptions); + this.conversionFactor = 1; + + this.setOptions(options); + this.width = Number(('' + this.options.width).replace("px","")); + this.minWidth = this.width; + this.height = this.linegraphSVG.offsetHeight; + + this.stepPixels = 25; + this.stepPixelsForced = 25; + this.lineOffset = 0; + this.master = true; + this.svgElements = {}; + + + this.groups = {}; + this.amountOfGroups = 0; + + // create the HTML DOM + this._create(); + } + + DataAxis.prototype = new Component(); + + + + DataAxis.prototype.addGroup = function(label, graphOptions) { + if (!this.groups.hasOwnProperty(label)) { + this.groups[label] = graphOptions; } - this.legendLeft.redraw(); - this.legendRight.redraw(); + this.amountOfGroups += 1; }; - LineGraph.prototype._updateAllGroupData = function () { - if (this.itemsData != null) { - var groupsContent = {}; - var groupId; - for (groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - groupsContent[groupId] = []; - } - } - for (var itemId in this.itemsData._data) { - if (this.itemsData._data.hasOwnProperty(itemId)) { - var item = this.itemsData._data[itemId]; - item.x = util.convert(item.x,"Date"); - groupsContent[item.group].push(item); - } - } - for (groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - this.groups[groupId].setItems(groupsContent[groupId]); - } - } + DataAxis.prototype.updateGroup = function(label, graphOptions) { + this.groups[label] = graphOptions; + }; + + DataAxis.prototype.removeGroup = function(label) { + if (this.groups.hasOwnProperty(label)) { + delete this.groups[label]; + this.amountOfGroups -= 1; } }; - /** - * Create or delete the group holding all ungrouped items. This group is used when - * there are no groups specified. This anonymous group is called 'graph'. - * @protected - */ - LineGraph.prototype._updateUngrouped = function() { - if (this.itemsData != null) { - // var t0 = new Date(); - var group = {id: UNGROUPED, content: this.options.defaultGroup}; - this._updateGroup(group, UNGROUPED); - var ungroupedCounter = 0; - if (this.itemsData) { - for (var itemId in this.itemsData._data) { - if (this.itemsData._data.hasOwnProperty(itemId)) { - var item = this.itemsData._data[itemId]; - if (item != undefined) { - if (item.hasOwnProperty('group')) { - if (item.group === undefined) { - item.group = UNGROUPED; - } - } - else { - item.group = UNGROUPED; - } - ungroupedCounter = item.group == UNGROUPED ? ungroupedCounter + 1 : ungroupedCounter; - } - } - } + + DataAxis.prototype.setOptions = function (options) { + if (options) { + var redraw = false; + if (this.options.orientation != options.orientation && options.orientation !== undefined) { + redraw = true; } + var fields = [ + 'orientation', + 'showMinorLabels', + 'showMajorLabels', + 'icons', + 'majorLinesOffset', + 'minorLinesOffset', + 'labelOffsetX', + 'labelOffsetY', + 'iconWidth', + 'width', + 'visible', + 'customRange' + ]; + util.selectiveExtend(fields, this.options, options); - if (ungroupedCounter == 0) { - delete this.groups[UNGROUPED]; - this.legendLeft.removeGroup(UNGROUPED); - this.legendRight.removeGroup(UNGROUPED); - this.yAxisLeft.removeGroup(UNGROUPED); - this.yAxisRight.removeGroup(UNGROUPED); + this.minWidth = Number(('' + this.options.width).replace("px","")); + + if (redraw == true && this.dom.frame) { + this.hide(); + this.show(); } } - else { - delete this.groups[UNGROUPED]; - this.legendLeft.removeGroup(UNGROUPED); - this.legendRight.removeGroup(UNGROUPED); - this.yAxisLeft.removeGroup(UNGROUPED); - this.yAxisRight.removeGroup(UNGROUPED); - } - - this.legendLeft.redraw(); - this.legendRight.redraw(); }; /** - * Redraw the component, mandatory function - * @return {boolean} Returns true if the component is resized + * Create the HTML DOM for the DataAxis */ - LineGraph.prototype.redraw = function() { - var resized = false; + DataAxis.prototype._create = function() { + this.dom.frame = document.createElement('div'); + this.dom.frame.style.width = this.options.width; + this.dom.frame.style.height = this.height; - this.svg.style.height = ('' + this.options.graphHeight).replace('px','') + 'px'; - if (this.lastWidth === undefined && this.width || this.lastWidth != this.width) { - resized = true; - } - // check if this component is resized - resized = this._isResized() || resized; - // check whether zoomed (in that case we need to re-stack everything) - var visibleInterval = this.body.range.end - this.body.range.start; - var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.width != this.lastWidth); - this.lastVisibleInterval = visibleInterval; - this.lastWidth = this.width; + this.dom.lineContainer = document.createElement('div'); + this.dom.lineContainer.style.width = '100%'; + this.dom.lineContainer.style.height = this.height; - // calculate actual size and position - this.width = this.dom.frame.offsetWidth; + // create svg element for graph drawing. + this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); + this.svg.style.position = "absolute"; + this.svg.style.top = '0px'; + this.svg.style.height = '100%'; + this.svg.style.width = '100%'; + this.svg.style.display = "block"; + this.dom.frame.appendChild(this.svg); + }; - // the svg element is three times as big as the width, this allows for fully dragging left and right - // without reloading the graph. the controls for this are bound to events in the constructor - if (resized == true) { - this.svg.style.width = util.option.asSize(3*this.width); - this.svg.style.left = util.option.asSize(-this.width); + DataAxis.prototype._redrawGroupIcons = function () { + DOMutil.prepareElements(this.svgElements); + + var x; + var iconWidth = this.options.iconWidth; + var iconHeight = 15; + var iconOffset = 4; + var y = iconOffset + 0.5 * iconHeight; + + if (this.options.orientation == 'left') { + x = iconOffset; } - if (zoomed == true || this.abortedGraphUpdate == true) { - this._updateGraph(); + else { + x = this.width - iconWidth - iconOffset; } - this.legendLeft.redraw(); - this.legendRight.redraw(); + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); + y += iconHeight + iconOffset; + } + } + } - return resized; + DOMutil.cleanupElements(this.svgElements); }; /** - * Update and redraw the graph. - * + * Create the HTML DOM for the DataAxis */ - LineGraph.prototype._updateGraph = function () { - // reset the svg elements - DOMutil.prepareElements(this.svgElements); - if (this.width != 0 && this.itemsData != null) { - var group, i; - var preprocessedGroupData = {}; - var processedGroupData = {}; - var groupRanges = {}; - var changeCalled = false; - - // getting group Ids - var groupIds = []; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - group = this.groups[groupId]; - if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) { - groupIds.push(groupId); - } - } + DataAxis.prototype.show = function() { + if (!this.dom.frame.parentNode) { + if (this.options.orientation == 'left') { + this.body.dom.left.appendChild(this.dom.frame); } - if (groupIds.length > 0) { - // this is the range of the SVG canvas - var minDate = this.body.util.toGlobalTime(- this.body.domProps.root.width); - var maxDate = this.body.util.toGlobalTime(2 * this.body.domProps.root.width); - var groupsData = {}; - // fill groups data - this._getRelevantData(groupIds, groupsData, minDate, maxDate); - // we transform the X coordinates to detect collisions - for (i = 0; i < groupIds.length; i++) { - preprocessedGroupData[groupIds[i]] = this._convertXcoordinates(groupsData[groupIds[i]]); - } - // now all needed data has been collected we start the processing. - this._getYRanges(groupIds, preprocessedGroupData, groupRanges); - - // update the Y axis first, we use this data to draw at the correct Y points - // changeCalled is required to clean the SVG on a change emit. - changeCalled = this._updateYAxis(groupIds, groupRanges); - if (changeCalled == true) { - DOMutil.cleanupElements(this.svgElements); - this.abortedGraphUpdate = true; - this.body.emitter.emit("change"); - return; - } - this.abortedGraphUpdate = false; - - // With the yAxis scaled correctly, use this to get the Y values of the points. - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - processedGroupData[groupIds[i]] = this._convertYcoordinates(groupsData[groupIds[i]], group); - } + else { + this.body.dom.right.appendChild(this.dom.frame); + } + } + if (!this.dom.lineContainer.parentNode) { + this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer); + } + }; - // draw the groups - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - if (group.options.style == 'line') { - this._drawLineGraph(processedGroupData[groupIds[i]], group); - } - } - this._drawBarGraphs(groupIds, processedGroupData); - } + /** + * Create the HTML DOM for the DataAxis + */ + DataAxis.prototype.hide = function() { + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); } - // cleanup unused svg elements - DOMutil.cleanupElements(this.svgElements); + if (this.dom.lineContainer.parentNode) { + this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer); + } }; + /** + * Set a range (start and end) + * @param end + * @param start + * @param end + */ + DataAxis.prototype.setRange = function (start, end) { + this.range.start = start; + this.range.end = end; + }; - LineGraph.prototype._getRelevantData = function (groupIds, groupsData, minDate, maxDate) { - // first select and preprocess the data from the datasets. - // the groups have their preselection of data, we now loop over this data to see - // what data we need to draw. Sorted data is much faster. - // more optimization is possible by doing the sampling before and using the binary search - // to find the end date to determine the increment. - var group, i, j, item; - if (groupIds.length > 0) { - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - groupsData[groupIds[i]] = []; - var dataContainer = groupsData[groupIds[i]]; - // optimization for sorted data - if (group.options.sort == true) { - var guess = Math.max(0, util.binarySearchGeneric(group.itemsData, minDate, 'x', 'before')); - for (j = guess; j < group.itemsData.length; j++) { - item = group.itemsData[j]; - if (item !== undefined) { - if (item.x > maxDate) { - dataContainer.push(item); - break; - } - else { - dataContainer.push(item); - } - } - } - } - else { - for (j = 0; j < group.itemsData.length; j++) { - item = group.itemsData[j]; - if (item !== undefined) { - if (item.x > minDate && item.x < maxDate) { - dataContainer.push(item); - } - } - } + /** + * Repaint the component + * @return {boolean} Returns true if the component is resized + */ + DataAxis.prototype.redraw = function () { + var changeCalled = false; + var activeGroups = 0; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + activeGroups++; } } } + if (this.amountOfGroups == 0 || activeGroups == 0) { + this.hide(); + } + else { + this.show(); + this.height = Number(this.linegraphSVG.style.height.replace("px","")); + // svg offsetheight did not work in firefox and explorer... - this._applySampling(groupIds, groupsData); - }; + this.dom.lineContainer.style.height = this.height + 'px'; + this.width = this.options.visible == true ? Number(('' + this.options.width).replace("px","")) : 0; - LineGraph.prototype._applySampling = function (groupIds, groupsData) { - var group; - if (groupIds.length > 0) { - for (var i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - if (group.options.sampling == true) { - var dataContainer = groupsData[groupIds[i]]; - if (dataContainer.length > 0) { - var increment = 1; - var amountOfPoints = dataContainer.length; + var props = this.props; + var frame = this.dom.frame; - // the global screen is used because changing the width of the yAxis may affect the increment, resulting in an endless loop - // of width changing of the yAxis. - var xDistance = this.body.util.toGlobalScreen(dataContainer[dataContainer.length - 1].x) - this.body.util.toGlobalScreen(dataContainer[0].x); - var pointsPerPixel = amountOfPoints / xDistance; - increment = Math.min(Math.ceil(0.2 * amountOfPoints), Math.max(1, Math.round(pointsPerPixel))); + // update classname + frame.className = 'dataaxis'; - var sampledData = []; - for (var j = 0; j < amountOfPoints; j += increment) { - sampledData.push(dataContainer[j]); + // calculate character width and height + this._calculateCharSize(); - } - groupsData[groupIds[i]] = sampledData; - } - } + var orientation = this.options.orientation; + var showMinorLabels = this.options.showMinorLabels; + var showMajorLabels = this.options.showMajorLabels; + + // determine the width and height of the elemens for the axis + props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; + props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; + + props.minorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.minorLinesOffset; + props.minorLineHeight = 1; + props.majorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.majorLinesOffset; + props.majorLineHeight = 1; + + // take frame offline while updating (is almost twice as fast) + if (orientation == 'left') { + frame.style.top = '0'; + frame.style.left = '0'; + frame.style.bottom = ''; + frame.style.width = this.width + 'px'; + frame.style.height = this.height + "px"; + } + else { // right + frame.style.top = ''; + frame.style.bottom = '0'; + frame.style.left = '0'; + frame.style.width = this.width + 'px'; + frame.style.height = this.height + "px"; + } + changeCalled = this._redrawLabels(); + if (this.options.icons == true) { + this._redrawGroupIcons(); } } + return changeCalled; }; - LineGraph.prototype._getYRanges = function (groupIds, groupsData, groupRanges) { - var groupData, group, i,j; - var barCombinedDataLeft = []; - var barCombinedDataRight = []; - var barCombinedData; - if (groupIds.length > 0) { - for (i = 0; i < groupIds.length; i++) { - groupData = groupsData[groupIds[i]]; - if (groupData.length > 0) { - group = this.groups[groupIds[i]]; - if (group.options.style == 'line' || group.options.barChart.handleOverlap != "stack") { - var yMin = groupData[0].y; - var yMax = groupData[0].y; - for (j = 0; j < groupData.length; j++) { - yMin = yMin > groupData[j].y ? groupData[j].y : yMin; - yMax = yMax < groupData[j].y ? groupData[j].y : yMax; - } - groupRanges[groupIds[i]] = {min: yMin, max: yMax, yAxisOrientation: group.options.yAxisOrientation}; - } - else if (group.options.style == 'bar') { - if (group.options.yAxisOrientation == 'left') { - barCombinedData = barCombinedDataLeft; - } - else { - barCombinedData = barCombinedDataRight; - } - - groupRanges[groupIds[i]] = {min: 0, max: 0, yAxisOrientation: group.options.yAxisOrientation, ignore: true}; + /** + * Repaint major and minor text labels and vertical grid lines + * @private + */ + DataAxis.prototype._redrawLabels = function () { + DOMutil.prepareElements(this.DOMelements.lines); + DOMutil.prepareElements(this.DOMelements.labels); - // combine data - for (j = 0; j < groupData.length; j++) { - barCombinedData.push({ - x: groupData[j].x, - y: groupData[j].y, - groupId: groupIds[i] - }); - } - } - } - } + var orientation = this.options['orientation']; - var intersections; - if (barCombinedDataLeft.length > 0) { - // sort by time and by group - barCombinedDataLeft.sort(function (a, b) { - if (a.x == b.x) { - return a.groupId - b.groupId; - } else { - return a.x - b.x; - } - }); - intersections = {}; - this._getDataIntersections(intersections, barCombinedDataLeft); - groupRanges["__barchartLeft"] = this._getStackedBarYRange(intersections, barCombinedDataLeft); - groupRanges["__barchartLeft"].yAxisOrientation = "left"; - groupIds.push("__barchartLeft"); - } - if (barCombinedDataRight.length > 0) { - // sort by time and by group - barCombinedDataRight.sort(function (a, b) { - if (a.x == b.x) { - return a.groupId - b.groupId; - } else { - return a.x - b.x; - } - }); - intersections = {}; - this._getDataIntersections(intersections, barCombinedDataRight); - groupRanges["__barchartRight"] = this._getStackedBarYRange(intersections, barCombinedDataRight); - groupRanges["__barchartRight"].yAxisOrientation = "right"; - groupIds.push("__barchartRight"); - } - } - }; + // calculate range and step (step such that we have space for 7 characters per label) + var minimumStep = this.master ? this.props.majorCharHeight || 10 : this.stepPixelsForced; + var step = new DataStep(this.range.start, this.range.end, minimumStep, this.dom.frame.offsetHeight, this.options.customRange[this.options.orientation]); + this.step = step; + // get the distance in pixels for a step + // dead space is space that is "left over" after a step + var stepPixels = (this.dom.frame.offsetHeight - (step.deadSpace * (this.dom.frame.offsetHeight / step.marginRange))) / (((step.marginRange - step.deadSpace) / step.step)); + this.stepPixels = stepPixels; - LineGraph.prototype._getStackedBarYRange = function (intersections, combinedData) { - var key; - var yMin = combinedData[0].y; - var yMax = combinedData[0].y; - for (var i = 0; i < combinedData.length; i++) { - key = combinedData[i].x; - if (intersections[key] === undefined) { - yMin = yMin > combinedData[i].y ? combinedData[i].y : yMin; - yMax = yMax < combinedData[i].y ? combinedData[i].y : yMax; - } - else { - intersections[key].accumulated += combinedData[i].y; + var amountOfSteps = this.height / stepPixels; + var stepDifference = 0; + + if (this.master == false) { + stepPixels = this.stepPixelsForced; + stepDifference = Math.round((this.dom.frame.offsetHeight / stepPixels) - amountOfSteps); + for (var i = 0; i < 0.5 * stepDifference; i++) { + step.previous(); } + amountOfSteps = this.height / stepPixels; } - for (var xpos in intersections) { - if (intersections.hasOwnProperty(xpos)) { - yMin = yMin > intersections[xpos].accumulated ? intersections[xpos].accumulated : yMin; - yMax = yMax < intersections[xpos].accumulated ? intersections[xpos].accumulated : yMax; - } + else { + amountOfSteps += 0.25; } - return {min: yMin, max: yMax}; - }; + this.valueAtZero = step.marginEnd; + var marginStartPos = 0; - /** - * this sets the Y ranges for the Y axis. It also determines which of the axis should be shown or hidden. - * @param {Array} groupIds - * @param {Object} groupRanges - * @private - */ - LineGraph.prototype._updateYAxis = function (groupIds, groupRanges) { - var changeCalled = false; - var yAxisLeftUsed = false; - var yAxisRightUsed = false; - var minLeft = 1e9, minRight = 1e9, maxLeft = -1e9, maxRight = -1e9, minVal, maxVal; - // if groups are present - if (groupIds.length > 0) { - for (var i = 0; i < groupIds.length; i++) { - if (groupRanges.hasOwnProperty(groupIds[i])) { - if (groupRanges[groupIds[i]].ignore !== true) { - minVal = groupRanges[groupIds[i]].min; - maxVal = groupRanges[groupIds[i]].max; + // do not draw the first label + var max = 1; - if (groupRanges[groupIds[i]].yAxisOrientation == 'left') { - yAxisLeftUsed = true; - minLeft = minLeft > minVal ? minVal : minLeft; - maxLeft = maxLeft < maxVal ? maxVal : maxLeft; - } - else { - yAxisRightUsed = true; - minRight = minRight > minVal ? minVal : minRight; - maxRight = maxRight < maxVal ? maxVal : maxRight; - } - } - } + this.maxLabelSize = 0; + var y = 0; + while (max < Math.round(amountOfSteps)) { + step.next(); + y = Math.round(max * stepPixels); + marginStartPos = max * stepPixels; + var isMajor = step.isMajor(); + + if (this.options['showMinorLabels'] && isMajor == false || this.master == false && this.options['showMinorLabels'] == true) { + this._redrawLabel(y - 2, step.getCurrent(), orientation, 'yAxis minor', this.props.minorCharHeight); } - if (yAxisLeftUsed == true) { - this.yAxisLeft.setRange(minLeft, maxLeft); + if (isMajor && this.options['showMajorLabels'] && this.master == true || + this.options['showMinorLabels'] == false && this.master == false && isMajor == true) { + if (y >= 0) { + this._redrawLabel(y - 2, step.getCurrent(), orientation, 'yAxis major', this.props.majorCharHeight); + } + this._redrawLine(y, orientation, 'grid horizontal major', this.options.majorLinesOffset, this.props.majorLineWidth); } - if (yAxisRightUsed == true) { - this.yAxisRight.setRange(minRight, maxRight); + else { + this._redrawLine(y, orientation, 'grid horizontal minor', this.options.minorLinesOffset, this.props.minorLineWidth); } - } - changeCalled = this._toggleAxisVisiblity(yAxisLeftUsed , this.yAxisLeft) || changeCalled; - changeCalled = this._toggleAxisVisiblity(yAxisRightUsed, this.yAxisRight) || changeCalled; + max++; + } - if (yAxisRightUsed == true && yAxisLeftUsed == true) { - this.yAxisLeft.drawIcons = true; - this.yAxisRight.drawIcons = true; + if (this.master == false) { + this.conversionFactor = y / (this.valueAtZero - step.current); } else { - this.yAxisLeft.drawIcons = false; - this.yAxisRight.drawIcons = false; + this.conversionFactor = this.dom.frame.offsetHeight / step.marginRange; } - this.yAxisRight.master = !yAxisLeftUsed; - - if (this.yAxisRight.master == false) { - if (yAxisRightUsed == true) {this.yAxisLeft.lineOffset = this.yAxisRight.width;} - else {this.yAxisLeft.lineOffset = 0;} - - changeCalled = this.yAxisLeft.redraw() || changeCalled; - this.yAxisRight.stepPixelsForced = this.yAxisLeft.stepPixels; - changeCalled = this.yAxisRight.redraw() || changeCalled; + var offset = this.options.icons == true ? this.options.iconWidth + this.options.labelOffsetX + 15 : this.options.labelOffsetX + 15; + // this will resize the yAxis to accomodate the labels. + if (this.maxLabelSize > (this.width - offset) && this.options.visible == true) { + this.width = this.maxLabelSize + offset; + this.options.width = this.width + "px"; + DOMutil.cleanupElements(this.DOMelements.lines); + DOMutil.cleanupElements(this.DOMelements.labels); + this.redraw(); + return true; + } + // this will resize the yAxis if it is too big for the labels. + else if (this.maxLabelSize < (this.width - offset) && this.options.visible == true && this.width > this.minWidth) { + this.width = Math.max(this.minWidth,this.maxLabelSize + offset); + this.options.width = this.width + "px"; + DOMutil.cleanupElements(this.DOMelements.lines); + DOMutil.cleanupElements(this.DOMelements.labels); + this.redraw(); + return true; } else { - changeCalled = this.yAxisRight.redraw() || changeCalled; + DOMutil.cleanupElements(this.DOMelements.lines); + DOMutil.cleanupElements(this.DOMelements.labels); + return false; } + }; - // clean the accumulated lists - if (groupIds.indexOf("__barchartLeft") != -1) { - groupIds.splice(groupIds.indexOf("__barchartLeft"),1); + DataAxis.prototype.convertValue = function (value) { + var invertedValue = this.valueAtZero - value; + var convertedValue = invertedValue * this.conversionFactor; + return convertedValue; + }; + + /** + * Create a label for the axis at position x + * @private + * @param y + * @param text + * @param orientation + * @param className + * @param characterHeight + */ + DataAxis.prototype._redrawLabel = function (y, text, orientation, className, characterHeight) { + // reuse redundant label + var label = DOMutil.getDOMElement('div',this.DOMelements.labels, this.dom.frame); //this.dom.redundant.labels.shift(); + label.className = className; + label.innerHTML = text; + if (orientation == 'left') { + label.style.left = '-' + this.options.labelOffsetX + 'px'; + label.style.textAlign = "right"; } - if (groupIds.indexOf("__barchartRight") != -1) { - groupIds.splice(groupIds.indexOf("__barchartRight"),1); + else { + label.style.right = '-' + this.options.labelOffsetX + 'px'; + label.style.textAlign = "left"; } - return changeCalled; + label.style.top = y - 0.5 * characterHeight + this.options.labelOffsetY + 'px'; + + text += ''; + + var largestWidth = Math.max(this.props.majorCharWidth,this.props.minorCharWidth); + if (this.maxLabelSize < text.length * largestWidth) { + this.maxLabelSize = text.length * largestWidth; + } }; /** - * This shows or hides the Y axis if needed. If there is a change, the changed event is emitted by the updateYAxis function - * - * @param {boolean} axisUsed - * @returns {boolean} - * @private - * @param axis + * Create a minor line for the axis at position y + * @param y + * @param orientation + * @param className + * @param offset + * @param width */ - LineGraph.prototype._toggleAxisVisiblity = function (axisUsed, axis) { - var changed = false; - if (axisUsed == false) { - if (axis.dom.frame.parentNode) { - axis.hide(); - changed = true; + DataAxis.prototype._redrawLine = function (y, orientation, className, offset, width) { + if (this.master == true) { + var line = DOMutil.getDOMElement('div',this.DOMelements.lines, this.dom.lineContainer);//this.dom.redundant.lines.shift(); + line.className = className; + line.innerHTML = ''; + + if (orientation == 'left') { + line.style.left = (this.width - offset) + 'px'; } - } - else { - if (!axis.dom.frame.parentNode) { - axis.show(); - changed = true; + else { + line.style.right = (this.width - offset) + 'px'; } + + line.style.width = width + 'px'; + line.style.top = y + 'px'; } - return changed; }; + + + /** - * draw a bar graph - * - * @param groupIds - * @param processedGroupData - */ - LineGraph.prototype._drawBarGraphs = function (groupIds, processedGroupData) { - var combinedData = []; - var intersections = {}; - var coreDistance; - var key, drawData; - var group; - var i,j; - var barPoints = 0; - - // combine all barchart data - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - if (group.options.style == 'bar') { - if (group.visible == true && (this.options.groups.visibility[groupIds[i]] === undefined || this.options.groups.visibility[groupIds[i]] == true)) { - for (j = 0; j < processedGroupData[groupIds[i]].length; j++) { - combinedData.push({ - x: processedGroupData[groupIds[i]][j].x, - y: processedGroupData[groupIds[i]][j].y, - groupId: groupIds[i] - }); - barPoints += 1; - } - } - } - } - - if (barPoints == 0) {return;} + * Determine the size of text on the axis (both major and minor axis). + * The size is calculated only once and then cached in this.props. + * @private + */ + DataAxis.prototype._calculateCharSize = function () { + // determine the char width and height on the minor axis + if (!('minorCharHeight' in this.props)) { + var textMinor = document.createTextNode('0'); + var measureCharMinor = document.createElement('DIV'); + measureCharMinor.className = 'yAxis minor measure'; + measureCharMinor.appendChild(textMinor); + this.dom.frame.appendChild(measureCharMinor); - // sort by time and by group - combinedData.sort(function (a, b) { - if (a.x == b.x) { - return a.groupId - b.groupId; - } else { - return a.x - b.x; - } - }); + this.props.minorCharHeight = measureCharMinor.clientHeight; + this.props.minorCharWidth = measureCharMinor.clientWidth; - // get intersections - this._getDataIntersections(intersections, combinedData); + this.dom.frame.removeChild(measureCharMinor); + } - // plot barchart - for (i = 0; i < combinedData.length; i++) { - group = this.groups[combinedData[i].groupId]; - var minWidth = 0.1 * group.options.barChart.width; + if (!('majorCharHeight' in this.props)) { + var textMajor = document.createTextNode('0'); + var measureCharMajor = document.createElement('DIV'); + measureCharMajor.className = 'yAxis major measure'; + measureCharMajor.appendChild(textMajor); + this.dom.frame.appendChild(measureCharMajor); - key = combinedData[i].x; - var heightOffset = 0; - if (intersections[key] === undefined) { - if (i+1 < combinedData.length) {coreDistance = Math.abs(combinedData[i+1].x - key);} - if (i > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[i-1].x - key));} - drawData = this._getSafeDrawData(coreDistance, group, minWidth); - } - else { - var nextKey = i + (intersections[key].amount - intersections[key].resolved); - var prevKey = i - (intersections[key].resolved + 1); - if (nextKey < combinedData.length) {coreDistance = Math.abs(combinedData[nextKey].x - key);} - if (prevKey > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[prevKey].x - key));} - drawData = this._getSafeDrawData(coreDistance, group, minWidth); - intersections[key].resolved += 1; + this.props.majorCharHeight = measureCharMajor.clientHeight; + this.props.majorCharWidth = measureCharMajor.clientWidth; - if (group.options.barChart.handleOverlap == 'stack') { - heightOffset = intersections[key].accumulated; - intersections[key].accumulated += group.zeroPosition - combinedData[i].y; - } - else if (group.options.barChart.handleOverlap == 'sideBySide') { - drawData.width = drawData.width / intersections[key].amount; - drawData.offset += (intersections[key].resolved) * drawData.width - (0.5*drawData.width * (intersections[key].amount+1)); - if (group.options.barChart.align == 'left') {drawData.offset -= 0.5*drawData.width;} - else if (group.options.barChart.align == 'right') {drawData.offset += 0.5*drawData.width;} - } - } - DOMutil.drawBar(combinedData[i].x + drawData.offset, combinedData[i].y - heightOffset, drawData.width, group.zeroPosition - combinedData[i].y, group.className + ' bar', this.svgElements, this.svg); - // draw points - if (group.options.drawPoints.enabled == true) { - DOMutil.drawPoint(combinedData[i].x + drawData.offset, combinedData[i].y - heightOffset, group, this.svgElements, this.svg); - } + this.dom.frame.removeChild(measureCharMajor); } }; /** - * Fill the intersections object with counters of how many datapoints share the same x coordinates - * @param intersections - * @param combinedData - * @private + * Snap a date to a rounded value. + * The snap intervals are dependent on the current scale and step. + * @param {Date} date the date to be snapped. + * @return {Date} snappedDate */ - LineGraph.prototype._getDataIntersections = function (intersections, combinedData) { - // get intersections - var coreDistance; - for (var i = 0; i < combinedData.length; i++) { - if (i + 1 < combinedData.length) { - coreDistance = Math.abs(combinedData[i + 1].x - combinedData[i].x); - } - if (i > 0) { - coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].x - combinedData[i].x)); - } - if (coreDistance == 0) { - if (intersections[combinedData[i].x] === undefined) { - intersections[combinedData[i].x] = {amount: 0, resolved: 0, accumulated: 0}; - } - intersections[combinedData[i].x].amount += 1; - } - } + DataAxis.prototype.snap = function(date) { + return this.step.snap(date); }; + module.exports = DataAxis; + + +/***/ }, +/* 41 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(6); + /** - * Get the width and offset for bargraphs based on the coredistance between datapoints - * - * @param coreDistance - * @param group - * @param minWidth - * @returns {{width: Number, offset: Number}} - * @private + * @constructor Group + * @param {Number | String} groupId + * @param {Object} data + * @param {ItemSet} itemSet */ - LineGraph.prototype._getSafeDrawData = function (coreDistance, group, minWidth) { - var width, offset; - if (coreDistance < group.options.barChart.width && coreDistance > 0) { - width = coreDistance < minWidth ? minWidth : coreDistance; + function GraphGroup (group, groupId, options, groupsUsingDefaultStyles) { + this.id = groupId; + var fields = ['sampling','style','sort','yAxisOrientation','barChart','drawPoints','shaded','catmullRom'] + this.options = util.selectiveBridgeObject(fields,options); + this.usingDefaultStyle = group.className === undefined; + this.groupsUsingDefaultStyles = groupsUsingDefaultStyles; + this.zeroPosition = 0; + this.update(group); + if (this.usingDefaultStyle == true) { + this.groupsUsingDefaultStyles[0] += 1; + } + this.itemsData = []; + this.visible = group.visible === undefined ? true : group.visible; + } - offset = 0; // recalculate offset with the new width; - if (group.options.barChart.align == 'left') { - offset -= 0.5 * coreDistance; - } - else if (group.options.barChart.align == 'right') { - offset += 0.5 * coreDistance; + GraphGroup.prototype.setItems = function(items) { + if (items != null) { + this.itemsData = items; + if (this.options.sort == true) { + this.itemsData.sort(function (a,b) {return a.x - b.x;}) } } else { - // default settings - width = group.options.barChart.width; - offset = 0; - if (group.options.barChart.align == 'left') { - offset -= 0.5 * group.options.barChart.width; - } - else if (group.options.barChart.align == 'right') { - offset += 0.5 * group.options.barChart.width; - } + this.itemsData = []; } - - return {width: width, offset: offset}; }; + GraphGroup.prototype.setZeroPosition = function(pos) { + this.zeroPosition = pos; + }; - /** - * draw a line graph - * - * @param dataset - * @param group - */ - LineGraph.prototype._drawLineGraph = function (dataset, group) { - if (dataset != null) { - if (dataset.length > 0) { - var path, d; - var svgHeight = Number(this.svg.style.height.replace("px","")); - path = DOMutil.getSVGElement('path', this.svgElements, this.svg); - path.setAttributeNS(null, "class", group.className); + GraphGroup.prototype.setOptions = function(options) { + if (options !== undefined) { + var fields = ['sampling','style','sort','yAxisOrientation','barChart']; + util.selectiveDeepExtend(fields, this.options, options); - // construct path from dataset - if (group.options.catmullRom.enabled == true) { - d = this._catmullRom(dataset, group); - } - else { - d = this._linear(dataset); - } + util.mergeOptions(this.options, options,'catmullRom'); + util.mergeOptions(this.options, options,'drawPoints'); + util.mergeOptions(this.options, options,'shaded'); - // append with points for fill and finalize the path - if (group.options.shaded.enabled == true) { - var fillPath = DOMutil.getSVGElement('path',this.svgElements, this.svg); - var dFill; - if (group.options.shaded.orientation == 'top') { - dFill = "M" + dataset[0].x + "," + 0 + " " + d + "L" + dataset[dataset.length - 1].x + "," + 0; - } - else { - dFill = "M" + dataset[0].x + "," + svgHeight + " " + d + "L" + dataset[dataset.length - 1].x + "," + svgHeight; + if (options.catmullRom) { + if (typeof options.catmullRom == 'object') { + if (options.catmullRom.parametrization) { + if (options.catmullRom.parametrization == 'uniform') { + this.options.catmullRom.alpha = 0; + } + else if (options.catmullRom.parametrization == 'chordal') { + this.options.catmullRom.alpha = 1.0; + } + else { + this.options.catmullRom.parametrization = 'centripetal'; + this.options.catmullRom.alpha = 0.5; + } } - fillPath.setAttributeNS(null, "class", group.className + " fill"); - fillPath.setAttributeNS(null, "d", dFill); - } - // copy properties to path for drawing. - path.setAttributeNS(null, "d", "M" + d); - - // draw points - if (group.options.drawPoints.enabled == true) { - this._drawPoints(dataset, group, this.svgElements, this.svg); } } } }; - /** - * draw the data points - * - * @param {Array} dataset - * @param {Object} JSONcontainer - * @param {Object} svg | SVG DOM element - * @param {GraphGroup} group - * @param {Number} [offset] - */ - LineGraph.prototype._drawPoints = function (dataset, group, JSONcontainer, svg, offset) { - if (offset === undefined) {offset = 0;} - for (var i = 0; i < dataset.length; i++) { - DOMutil.drawPoint(dataset[i].x + offset, dataset[i].y, group, JSONcontainer, svg); - } + GraphGroup.prototype.update = function(group) { + this.group = group; + this.content = group.content || 'graph'; + this.className = group.className || this.className || "graphGroup" + this.groupsUsingDefaultStyles[0] % 10; + this.visible = group.visible === undefined ? true : group.visible; + this.setOptions(group.options); }; + GraphGroup.prototype.drawIcon = function(x, y, JSONcontainer, SVGcontainer, iconWidth, iconHeight) { + var fillHeight = iconHeight * 0.5; + var path, fillPath; + var outline = DOMutil.getSVGElement("rect", JSONcontainer, SVGcontainer); + outline.setAttributeNS(null, "x", x); + outline.setAttributeNS(null, "y", y - fillHeight); + outline.setAttributeNS(null, "width", iconWidth); + outline.setAttributeNS(null, "height", 2*fillHeight); + outline.setAttributeNS(null, "class", "outline"); - /** - * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the - * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for - * the yAxis. - * - * @param datapoints - * @returns {Array} - * @private - */ - LineGraph.prototype._convertXcoordinates = function (datapoints) { - var extractedData = []; - var xValue, yValue; - var toScreen = this.body.util.toScreen; + if (this.options.style == 'line') { + path = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); + path.setAttributeNS(null, "class", this.className); + path.setAttributeNS(null, "d", "M" + x + ","+y+" L" + (x + iconWidth) + ","+y+""); + if (this.options.shaded.enabled == true) { + fillPath = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); + if (this.options.shaded.orientation == 'top') { + fillPath.setAttributeNS(null, "d", "M"+x+", " + (y - fillHeight) + + "L"+x+","+y+" L"+ (x + iconWidth) + ","+y+" L"+ (x + iconWidth) + "," + (y - fillHeight)); + } + else { + fillPath.setAttributeNS(null, "d", "M"+x+","+y+" " + + "L"+x+"," + (y + fillHeight) + " " + + "L"+ (x + iconWidth) + "," + (y + fillHeight) + + "L"+ (x + iconWidth) + ","+y); + } + fillPath.setAttributeNS(null, "class", this.className + " iconFill"); + } - for (var i = 0; i < datapoints.length; i++) { - xValue = toScreen(datapoints[i].x) + this.width - 1; - yValue = datapoints[i].y; - extractedData.push({x: xValue, y: yValue}); + if (this.options.drawPoints.enabled == true) { + DOMutil.drawPoint(x + 0.5 * iconWidth,y, this, JSONcontainer, SVGcontainer); + } } + else { + var barWidth = Math.round(0.3 * iconWidth); + var bar1Height = Math.round(0.4 * iconHeight); + var bar2Height = Math.round(0.75 * iconHeight); - return extractedData; - }; - + var offset = Math.round((iconWidth - (2 * barWidth))/3); + DOMutil.drawBar(x + 0.5*barWidth + offset , y + fillHeight - bar1Height - 1, barWidth, bar1Height, this.className + ' bar', JSONcontainer, SVGcontainer); + DOMutil.drawBar(x + 1.5*barWidth + offset + 2, y + fillHeight - bar2Height - 1, barWidth, bar2Height, this.className + ' bar', JSONcontainer, SVGcontainer); + } + }; /** - * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the - * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for - * the yAxis. * - * @param datapoints - * @returns {Array} - * @private + * @param iconWidth + * @param iconHeight + * @returns {{icon: HTMLElement, label: (group.content|*|string), orientation: (.options.yAxisOrientation|*)}} */ - LineGraph.prototype._convertYcoordinates = function (datapoints, group) { - var extractedData = []; - var xValue, yValue; - var toScreen = this.body.util.toScreen; - var axis = this.yAxisLeft; - var svgHeight = Number(this.svg.style.height.replace("px","")); - if (group.options.yAxisOrientation == 'right') { - axis = this.yAxisRight; - } + GraphGroup.prototype.getLegend = function(iconWidth, iconHeight) { + var svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); + this.drawIcon(0,0.5*iconHeight,[],svg,iconWidth,iconHeight); + return {icon: svg, label: this.content, orientation:this.options.yAxisOrientation}; + } - for (var i = 0; i < datapoints.length; i++) { - xValue = toScreen(datapoints[i].x) + this.width - 1; - yValue = Math.round(axis.convertValue(datapoints[i].y)); - extractedData.push({x: xValue, y: yValue}); - } + module.exports = GraphGroup; - group.setZeroPosition(Math.min(svgHeight, axis.convertValue(0))); - return extractedData; - }; +/***/ }, +/* 42 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(6); + var Component = __webpack_require__(22); /** - * This uses an uniform parametrization of the CatmullRom algorithm: - * "On the Parameterization of Catmull-Rom Curves" by Cem Yuksel et al. - * @param data - * @returns {string} - * @private + * Legend for Graph2d */ - LineGraph.prototype._catmullRomUniform = function(data) { - // catmull rom - var p0, p1, p2, p3, bp1, bp2; - var d = Math.round(data[0].x) + "," + Math.round(data[0].y) + " "; - var normalization = 1/6; - var length = data.length; - for (var i = 0; i < length - 1; i++) { + function Legend(body, options, side, linegraphOptions) { + this.body = body; + this.defaultOptions = { + enabled: true, + icons: true, + iconSize: 20, + iconSpacing: 6, + left: { + visible: true, + position: 'top-left' // top/bottom - left,center,right + }, + right: { + visible: true, + position: 'top-left' // top/bottom - left,center,right + } + } + this.side = side; + this.options = util.extend({},this.defaultOptions); + this.linegraphOptions = linegraphOptions; - p0 = (i == 0) ? data[0] : data[i-1]; - p1 = data[i]; - p2 = data[i+1]; - p3 = (i + 2 < length) ? data[i+2] : p2; + this.svgElements = {}; + this.dom = {}; + this.groups = {}; + this.amountOfGroups = 0; + this._create(); + this.setOptions(options); + } - // Catmull-Rom to Cubic Bezier conversion matrix - // 0 1 0 0 - // -1/6 1 1/6 0 - // 0 1/6 1 -1/6 - // 0 0 1 0 + Legend.prototype = new Component(); - // bp0 = { x: p1.x, y: p1.y }; - bp1 = { x: ((-p0.x + 6*p1.x + p2.x) *normalization), y: ((-p0.y + 6*p1.y + p2.y) *normalization)}; - bp2 = { x: (( p1.x + 6*p2.x - p3.x) *normalization), y: (( p1.y + 6*p2.y - p3.y) *normalization)}; - // bp0 = { x: p2.x, y: p2.y }; - d += "C" + - bp1.x + "," + - bp1.y + " " + - bp2.x + "," + - bp2.y + " " + - p2.x + "," + - p2.y + " "; + Legend.prototype.addGroup = function(label, graphOptions) { + if (!this.groups.hasOwnProperty(label)) { + this.groups[label] = graphOptions; } + this.amountOfGroups += 1; + }; - return d; + Legend.prototype.updateGroup = function(label, graphOptions) { + this.groups[label] = graphOptions; }; - /** - * This uses either the chordal or centripetal parameterization of the catmull-rom algorithm. - * By default, the centripetal parameterization is used because this gives the nicest results. - * These parameterizations are relatively heavy because the distance between 4 points have to be calculated. - * - * One optimization can be used to reuse distances since this is a sliding window approach. - * @param data - * @returns {string} - * @private - */ - LineGraph.prototype._catmullRom = function(data, group) { - var alpha = group.options.catmullRom.alpha; - if (alpha == 0 || alpha === undefined) { - return this._catmullRomUniform(data); + Legend.prototype.removeGroup = function(label) { + if (this.groups.hasOwnProperty(label)) { + delete this.groups[label]; + this.amountOfGroups -= 1; } - else { - var p0, p1, p2, p3, bp1, bp2, d1,d2,d3, A, B, N, M; - var d3powA, d2powA, d3pow2A, d2pow2A, d1pow2A, d1powA; - var d = Math.round(data[0].x) + "," + Math.round(data[0].y) + " "; - var length = data.length; - for (var i = 0; i < length - 1; i++) { + }; - p0 = (i == 0) ? data[0] : data[i-1]; - p1 = data[i]; - p2 = data[i+1]; - p3 = (i + 2 < length) ? data[i+2] : p2; + Legend.prototype._create = function() { + this.dom.frame = document.createElement('div'); + this.dom.frame.className = 'legend'; + this.dom.frame.style.position = "absolute"; + this.dom.frame.style.top = "10px"; + this.dom.frame.style.display = "block"; - d1 = Math.sqrt(Math.pow(p0.x - p1.x,2) + Math.pow(p0.y - p1.y,2)); - d2 = Math.sqrt(Math.pow(p1.x - p2.x,2) + Math.pow(p1.y - p2.y,2)); - d3 = Math.sqrt(Math.pow(p2.x - p3.x,2) + Math.pow(p2.y - p3.y,2)); + this.dom.textArea = document.createElement('div'); + this.dom.textArea.className = 'legendText'; + this.dom.textArea.style.position = "relative"; + this.dom.textArea.style.top = "0px"; - // Catmull-Rom to Cubic Bezier conversion matrix - // - // A = 2d1^2a + 3d1^a * d2^a + d3^2a - // B = 2d3^2a + 3d3^a * d2^a + d2^2a - // - // [ 0 1 0 0 ] - // [ -d2^2a/N A/N d1^2a/N 0 ] - // [ 0 d3^2a/M B/M -d2^2a/M ] - // [ 0 0 1 0 ] + this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); + this.svg.style.position = 'absolute'; + this.svg.style.top = 0 +'px'; + this.svg.style.width = this.options.iconSize + 5 + 'px'; - // [ 0 1 0 0 ] - // [ -d2pow2a/N A/N d1pow2a/N 0 ] - // [ 0 d3pow2a/M B/M -d2pow2a/M ] - // [ 0 0 1 0 ] + this.dom.frame.appendChild(this.svg); + this.dom.frame.appendChild(this.dom.textArea); + }; - d3powA = Math.pow(d3, alpha); - d3pow2A = Math.pow(d3,2*alpha); - d2powA = Math.pow(d2, alpha); - d2pow2A = Math.pow(d2,2*alpha); - d1powA = Math.pow(d1, alpha); - d1pow2A = Math.pow(d1,2*alpha); + /** + * Hide the component from the DOM + */ + Legend.prototype.hide = function() { + // remove the frame containing the items + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); + } + }; - A = 2*d1pow2A + 3*d1powA * d2powA + d2pow2A; - B = 2*d3pow2A + 3*d3powA * d2powA + d2pow2A; - N = 3*d1powA * (d1powA + d2powA); - if (N > 0) {N = 1 / N;} - M = 3*d3powA * (d3powA + d2powA); - if (M > 0) {M = 1 / M;} - - bp1 = { x: ((-d2pow2A * p0.x + A*p1.x + d1pow2A * p2.x) * N), - y: ((-d2pow2A * p0.y + A*p1.y + d1pow2A * p2.y) * N)}; + /** + * Show the component in the DOM (when not already visible). + * @return {Boolean} changed + */ + Legend.prototype.show = function() { + // show frame containing the items + if (!this.dom.frame.parentNode) { + this.body.dom.center.appendChild(this.dom.frame); + } + }; - bp2 = { x: (( d3pow2A * p1.x + B*p2.x - d2pow2A * p3.x) * M), - y: (( d3pow2A * p1.y + B*p2.y - d2pow2A * p3.y) * M)}; + Legend.prototype.setOptions = function(options) { + var fields = ['enabled','orientation','icons','left','right']; + util.selectiveDeepExtend(fields, this.options, options); + }; - if (bp1.x == 0 && bp1.y == 0) {bp1 = p1;} - if (bp2.x == 0 && bp2.y == 0) {bp2 = p2;} - d += "C" + - bp1.x + "," + - bp1.y + " " + - bp2.x + "," + - bp2.y + " " + - p2.x + "," + - p2.y + " "; + Legend.prototype.redraw = function() { + var activeGroups = 0; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + activeGroups++; + } } + } - return d; + if (this.options[this.side].visible == false || this.amountOfGroups == 0 || this.options.enabled == false || activeGroups == 0) { + this.hide(); } - }; + else { + this.show(); + if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'bottom-left') { + this.dom.frame.style.left = '4px'; + this.dom.frame.style.textAlign = "left"; + this.dom.textArea.style.textAlign = "left"; + this.dom.textArea.style.left = (this.options.iconSize + 15) + 'px'; + this.dom.textArea.style.right = ''; + this.svg.style.left = 0 +'px'; + this.svg.style.right = ''; + } + else { + this.dom.frame.style.right = '4px'; + this.dom.frame.style.textAlign = "right"; + this.dom.textArea.style.textAlign = "right"; + this.dom.textArea.style.right = (this.options.iconSize + 15) + 'px'; + this.dom.textArea.style.left = ''; + this.svg.style.right = 0 +'px'; + this.svg.style.left = ''; + } - /** - * this generates the SVG path for a linear drawing between datapoints. - * @param data - * @returns {string} - * @private - */ - LineGraph.prototype._linear = function(data) { - // linear - var d = ""; - for (var i = 0; i < data.length; i++) { - if (i == 0) { - d += data[i].x + "," + data[i].y; + if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'top-right') { + this.dom.frame.style.top = 4 - Number(this.body.dom.center.style.top.replace("px","")) + 'px'; + this.dom.frame.style.bottom = ''; } else { - d += " " + data[i].x + "," + data[i].y; + this.dom.frame.style.bottom = 4 - Number(this.body.dom.center.style.top.replace("px","")) + 'px'; + this.dom.frame.style.top = ''; + } + + if (this.options.icons == false) { + this.dom.frame.style.width = this.dom.textArea.offsetWidth + 10 + 'px'; + this.dom.textArea.style.right = ''; + this.dom.textArea.style.left = ''; + this.svg.style.width = '0px'; + } + else { + this.dom.frame.style.width = this.options.iconSize + 15 + this.dom.textArea.offsetWidth + 10 + 'px' + this.drawLegendIcons(); + } + + var content = ''; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + content += this.groups[groupId].content + '
'; + } + } } + this.dom.textArea.innerHTML = content; + this.dom.textArea.style.lineHeight = ((0.75 * this.options.iconSize) + this.options.iconSpacing) + 'px'; } - return d; }; - module.exports = LineGraph; + Legend.prototype.drawLegendIcons = function() { + if (this.dom.frame.parentNode) { + DOMutil.prepareElements(this.svgElements); + var padding = window.getComputedStyle(this.dom.frame).paddingTop; + var iconOffset = Number(padding.replace('px','')); + var x = iconOffset; + var iconWidth = this.options.iconSize; + var iconHeight = 0.75 * this.options.iconSize; + var y = iconOffset + 0.5 * iconHeight + 3; + + this.svg.style.width = iconWidth + 5 + iconOffset + 'px'; + + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); + y += iconHeight + this.options.iconSpacing; + } + } + } + + DOMutil.cleanupElements(this.svgElements); + } + }; + + module.exports = Legend; /***/ }, -/* 40 */ +/* 43 */ /***/ function(module, exports, __webpack_require__) { var util = __webpack_require__(1); var DOMutil = __webpack_require__(6); + var DataSet = __webpack_require__(7); + var DataView = __webpack_require__(8); var Component = __webpack_require__(22); - var DataStep = __webpack_require__(41); + var DataAxis = __webpack_require__(40); + var GraphGroup = __webpack_require__(41); + var Legend = __webpack_require__(42); + + var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items /** - * A horizontal time axis - * @param {Object} [options] See DataAxis.setOptions for the available - * options. - * @constructor DataAxis - * @extends Component + * This is the constructor of the LineGraph. It requires a Timeline body and options. + * * @param body + * @param options + * @constructor */ - function DataAxis (body, options, svg, linegraphOptions) { + function LineGraph(body, options) { this.id = util.randomUUID(); this.body = body; this.defaultOptions = { - orientation: 'left', // supported: 'left', 'right' - showMinorLabels: true, - showMajorLabels: true, - icons: true, - majorLinesOffset: 7, - minorLinesOffset: 4, - labelOffsetX: 10, - labelOffsetY: 2, - iconWidth: 20, - width: '40px', - visible: true, - customRange: { - left: {min:undefined, max:undefined}, - right: {min:undefined, max:undefined} + yAxisOrientation: 'left', + defaultGroup: 'default', + sort: true, + sampling: true, + graphHeight: '400px', + shaded: { + enabled: false, + orientation: 'bottom' // top, bottom + }, + style: 'line', // line, bar + barChart: { + width: 50, + handleOverlap: 'overlap', + align: 'center' // left, center, right + }, + catmullRom: { + enabled: true, + parametrization: 'centripetal', // uniform (alpha = 0.0), chordal (alpha = 1.0), centripetal (alpha = 0.5) + alpha: 0.5 + }, + drawPoints: { + enabled: true, + size: 6, + style: 'square' // square, circle + }, + dataAxis: { + showMinorLabels: true, + showMajorLabels: true, + icons: false, + width: '40px', + visible: true, + customRange: { + left: {min:undefined, max:undefined}, + right: {min:undefined, max:undefined} + } + }, + legend: { + enabled: false, + icons: true, + left: { + visible: true, + position: 'top-left' // top/bottom - left,right + }, + right: { + visible: true, + position: 'top-right' // top/bottom - left,right + } + }, + groups: { + visibility: {} } }; - this.linegraphOptions = linegraphOptions; - this.linegraphSVG = svg; + // options is shared by this ItemSet and all its items + this.options = util.extend({}, this.defaultOptions); + this.dom = {}; this.props = {}; - this.DOMelements = { // dynamic elements - lines: {}, - labels: {} - }; + this.hammer = null; + this.groups = {}; + this.abortedGraphUpdate = false; - this.dom = {}; + var me = this; + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet - this.range = {start:0, end:0}; + // listeners for the DataSet of the items + this.itemListeners = { + 'add': function (event, params, senderId) { + me._onAdd(params.items); + }, + 'update': function (event, params, senderId) { + me._onUpdate(params.items); + }, + 'remove': function (event, params, senderId) { + me._onRemove(params.items); + } + }; - this.options = util.extend({}, this.defaultOptions); - this.conversionFactor = 1; + // listeners for the DataSet of the groups + this.groupListeners = { + 'add': function (event, params, senderId) { + me._onAddGroups(params.items); + }, + 'update': function (event, params, senderId) { + me._onUpdateGroups(params.items); + }, + 'remove': function (event, params, senderId) { + me._onRemoveGroups(params.items); + } + }; - this.setOptions(options); - this.width = Number(('' + this.options.width).replace("px","")); - this.minWidth = this.width; - this.height = this.linegraphSVG.offsetHeight; + this.items = {}; // object with an Item for every data item + this.selection = []; // list with the ids of all selected nodes + this.lastStart = this.body.range.start; + this.touchParams = {}; // stores properties while dragging - this.stepPixels = 25; - this.stepPixelsForced = 25; - this.lineOffset = 0; - this.master = true; this.svgElements = {}; + this.setOptions(options); + this.groupsUsingDefaultStyles = [0]; - - this.groups = {}; - this.amountOfGroups = 0; + this.body.emitter.on("rangechange",function() { + if (me.lastStart != 0) { + var offset = me.body.range.start - me.lastStart; + var range = me.body.range.end - me.body.range.start; + if (me.width != 0) { + var rangePerPixelInv = me.width/range; + var xOffset = offset * rangePerPixelInv; + me.svg.style.left = (-me.width - xOffset) + "px"; + } + } + }); + this.body.emitter.on("rangechanged", function() { + me.lastStart = me.body.range.start; + me.svg.style.left = util.option.asSize(-me.width); + me._updateGraph.apply(me); + }); // create the HTML DOM this._create(); + this.body.emitter.emit("change"); } - DataAxis.prototype = new Component(); - - - - DataAxis.prototype.addGroup = function(label, graphOptions) { - if (!this.groups.hasOwnProperty(label)) { - this.groups[label] = graphOptions; - } - this.amountOfGroups += 1; - }; - - DataAxis.prototype.updateGroup = function(label, graphOptions) { - this.groups[label] = graphOptions; - }; - - DataAxis.prototype.removeGroup = function(label) { - if (this.groups.hasOwnProperty(label)) { - delete this.groups[label]; - this.amountOfGroups -= 1; - } - }; - - - DataAxis.prototype.setOptions = function (options) { - if (options) { - var redraw = false; - if (this.options.orientation != options.orientation && options.orientation !== undefined) { - redraw = true; - } - var fields = [ - 'orientation', - 'showMinorLabels', - 'showMajorLabels', - 'icons', - 'majorLinesOffset', - 'minorLinesOffset', - 'labelOffsetX', - 'labelOffsetY', - 'iconWidth', - 'width', - 'visible', - 'customRange' - ]; - util.selectiveExtend(fields, this.options, options); - - this.minWidth = Number(('' + this.options.width).replace("px","")); - - if (redraw == true && this.dom.frame) { - this.hide(); - this.show(); - } - } - }; - + LineGraph.prototype = new Component(); /** - * Create the HTML DOM for the DataAxis + * Create the HTML DOM for the ItemSet */ - DataAxis.prototype._create = function() { - this.dom.frame = document.createElement('div'); - this.dom.frame.style.width = this.options.width; - this.dom.frame.style.height = this.height; - - this.dom.lineContainer = document.createElement('div'); - this.dom.lineContainer.style.width = '100%'; - this.dom.lineContainer.style.height = this.height; + LineGraph.prototype._create = function(){ + var frame = document.createElement('div'); + frame.className = 'LineGraph'; + this.dom.frame = frame; // create svg element for graph drawing. this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); - this.svg.style.position = "absolute"; - this.svg.style.top = '0px'; - this.svg.style.height = '100%'; - this.svg.style.width = '100%'; + this.svg.style.position = "relative"; + this.svg.style.height = ('' + this.options.graphHeight).replace("px",'') + 'px'; this.svg.style.display = "block"; - this.dom.frame.appendChild(this.svg); - }; - - DataAxis.prototype._redrawGroupIcons = function () { - DOMutil.prepareElements(this.svgElements); + frame.appendChild(this.svg); - var x; - var iconWidth = this.options.iconWidth; - var iconHeight = 15; - var iconOffset = 4; - var y = iconOffset + 0.5 * iconHeight; + // data axis + this.options.dataAxis.orientation = 'left'; + this.yAxisLeft = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); - if (this.options.orientation == 'left') { - x = iconOffset; - } - else { - x = this.width - iconWidth - iconOffset; - } + this.options.dataAxis.orientation = 'right'; + this.yAxisRight = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); + delete this.options.dataAxis.orientation; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { - this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); - y += iconHeight + iconOffset; - } - } - } + // legends + this.legendLeft = new Legend(this.body, this.options.legend, 'left', this.options.groups); + this.legendRight = new Legend(this.body, this.options.legend, 'right', this.options.groups); - DOMutil.cleanupElements(this.svgElements); + this.show(); }; /** - * Create the HTML DOM for the DataAxis + * set the options of the LineGraph. the mergeOptions is used for subObjects that have an enabled element. + * @param options */ - DataAxis.prototype.show = function() { - if (!this.dom.frame.parentNode) { - if (this.options.orientation == 'left') { - this.body.dom.left.appendChild(this.dom.frame); + LineGraph.prototype.setOptions = function(options) { + if (options) { + var fields = ['sampling','defaultGroup','graphHeight','yAxisOrientation','style','barChart','dataAxis','sort','groups']; + util.selectiveDeepExtend(fields, this.options, options); + util.mergeOptions(this.options, options,'catmullRom'); + util.mergeOptions(this.options, options,'drawPoints'); + util.mergeOptions(this.options, options,'shaded'); + util.mergeOptions(this.options, options,'legend'); + + if (options.catmullRom) { + if (typeof options.catmullRom == 'object') { + if (options.catmullRom.parametrization) { + if (options.catmullRom.parametrization == 'uniform') { + this.options.catmullRom.alpha = 0; + } + else if (options.catmullRom.parametrization == 'chordal') { + this.options.catmullRom.alpha = 1.0; + } + else { + this.options.catmullRom.parametrization = 'centripetal'; + this.options.catmullRom.alpha = 0.5; + } + } + } } - else { - this.body.dom.right.appendChild(this.dom.frame); + + if (this.yAxisLeft) { + if (options.dataAxis !== undefined) { + this.yAxisLeft.setOptions(this.options.dataAxis); + this.yAxisRight.setOptions(this.options.dataAxis); + } } - } - if (!this.dom.lineContainer.parentNode) { - this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer); + if (this.legendLeft) { + if (options.legend !== undefined) { + this.legendLeft.setOptions(this.options.legend); + this.legendRight.setOptions(this.options.legend); + } + } + + if (this.groups.hasOwnProperty(UNGROUPED)) { + this.groups[UNGROUPED].setOptions(options); + } + } + if (this.dom.frame) { + this._updateGraph(); } }; /** - * Create the HTML DOM for the DataAxis + * Hide the component from the DOM */ - DataAxis.prototype.hide = function() { + LineGraph.prototype.hide = function() { + // remove the frame containing the items if (this.dom.frame.parentNode) { this.dom.frame.parentNode.removeChild(this.dom.frame); } - - if (this.dom.lineContainer.parentNode) { - this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer); - } }; /** - * Set a range (start and end) - * @param end - * @param start - * @param end + * Show the component in the DOM (when not already visible). + * @return {Boolean} changed */ - DataAxis.prototype.setRange = function (start, end) { - this.range.start = start; - this.range.end = end; + LineGraph.prototype.show = function() { + // show frame containing the items + if (!this.dom.frame.parentNode) { + this.body.dom.center.appendChild(this.dom.frame); + } }; + /** - * Repaint the component - * @return {boolean} Returns true if the component is resized + * Set items + * @param {vis.DataSet | null} items */ - DataAxis.prototype.redraw = function () { - var changeCalled = false; - var activeGroups = 0; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { - activeGroups++; - } - } + LineGraph.prototype.setItems = function(items) { + var me = this, + ids, + oldItemsData = this.itemsData; + + // replace the dataset + if (!items) { + this.itemsData = null; } - if (this.amountOfGroups == 0 || activeGroups == 0) { - this.hide(); + else if (items instanceof DataSet || items instanceof DataView) { + this.itemsData = items; } else { - this.show(); - this.height = Number(this.linegraphSVG.style.height.replace("px","")); - // svg offsetheight did not work in firefox and explorer... - - this.dom.lineContainer.style.height = this.height + 'px'; - this.width = this.options.visible == true ? Number(('' + this.options.width).replace("px","")) : 0; + throw new TypeError('Data must be an instance of DataSet or DataView'); + } - var props = this.props; - var frame = this.dom.frame; - - // update classname - frame.className = 'dataaxis'; - - // calculate character width and height - this._calculateCharSize(); - - var orientation = this.options.orientation; - var showMinorLabels = this.options.showMinorLabels; - var showMajorLabels = this.options.showMajorLabels; + if (oldItemsData) { + // unsubscribe from old dataset + util.forEach(this.itemListeners, function (callback, event) { + oldItemsData.off(event, callback); + }); - // determine the width and height of the elemens for the axis - props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; - props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; + // remove all drawn items + ids = oldItemsData.getIds(); + this._onRemove(ids); + } - props.minorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.minorLinesOffset; - props.minorLineHeight = 1; - props.majorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.majorLinesOffset; - props.majorLineHeight = 1; + if (this.itemsData) { + // subscribe to new dataset + var id = this.id; + util.forEach(this.itemListeners, function (callback, event) { + me.itemsData.on(event, callback, id); + }); - // take frame offline while updating (is almost twice as fast) - if (orientation == 'left') { - frame.style.top = '0'; - frame.style.left = '0'; - frame.style.bottom = ''; - frame.style.width = this.width + 'px'; - frame.style.height = this.height + "px"; - } - else { // right - frame.style.top = ''; - frame.style.bottom = '0'; - frame.style.left = '0'; - frame.style.width = this.width + 'px'; - frame.style.height = this.height + "px"; - } - changeCalled = this._redrawLabels(); - if (this.options.icons == true) { - this._redrawGroupIcons(); - } + // add all new items + ids = this.itemsData.getIds(); + this._onAdd(ids); } - return changeCalled; + this._updateUngrouped(); + this._updateGraph(); + this.redraw(); }; /** - * Repaint major and minor text labels and vertical grid lines - * @private + * Set groups + * @param {vis.DataSet} groups */ - DataAxis.prototype._redrawLabels = function () { - DOMutil.prepareElements(this.DOMelements.lines); - DOMutil.prepareElements(this.DOMelements.labels); - - var orientation = this.options['orientation']; - - // calculate range and step (step such that we have space for 7 characters per label) - var minimumStep = this.master ? this.props.majorCharHeight || 10 : this.stepPixelsForced; - var step = new DataStep(this.range.start, this.range.end, minimumStep, this.dom.frame.offsetHeight, this.options.customRange[this.options.orientation]); - this.step = step; - // get the distance in pixels for a step - // dead space is space that is "left over" after a step - var stepPixels = (this.dom.frame.offsetHeight - (step.deadSpace * (this.dom.frame.offsetHeight / step.marginRange))) / (((step.marginRange - step.deadSpace) / step.step)); - this.stepPixels = stepPixels; + LineGraph.prototype.setGroups = function(groups) { + var me = this, + ids; - var amountOfSteps = this.height / stepPixels; - var stepDifference = 0; + // unsubscribe from current dataset + if (this.groupsData) { + util.forEach(this.groupListeners, function (callback, event) { + me.groupsData.unsubscribe(event, callback); + }); - if (this.master == false) { - stepPixels = this.stepPixelsForced; - stepDifference = Math.round((this.dom.frame.offsetHeight / stepPixels) - amountOfSteps); - for (var i = 0; i < 0.5 * stepDifference; i++) { - step.previous(); - } - amountOfSteps = this.height / stepPixels; - } - else { - amountOfSteps += 0.25; + // remove all drawn groups + ids = this.groupsData.getIds(); + this.groupsData = null; + this._onRemoveGroups(ids); // note: this will cause a redraw } - - this.valueAtZero = step.marginEnd; - var marginStartPos = 0; - - // do not draw the first label - var max = 1; - - this.maxLabelSize = 0; - var y = 0; - while (max < Math.round(amountOfSteps)) { - step.next(); - y = Math.round(max * stepPixels); - marginStartPos = max * stepPixels; - var isMajor = step.isMajor(); - - if (this.options['showMinorLabels'] && isMajor == false || this.master == false && this.options['showMinorLabels'] == true) { - this._redrawLabel(y - 2, step.getCurrent(), orientation, 'yAxis minor', this.props.minorCharHeight); - } - - if (isMajor && this.options['showMajorLabels'] && this.master == true || - this.options['showMinorLabels'] == false && this.master == false && isMajor == true) { - if (y >= 0) { - this._redrawLabel(y - 2, step.getCurrent(), orientation, 'yAxis major', this.props.majorCharHeight); - } - this._redrawLine(y, orientation, 'grid horizontal major', this.options.majorLinesOffset, this.props.majorLineWidth); - } - else { - this._redrawLine(y, orientation, 'grid horizontal minor', this.options.minorLinesOffset, this.props.minorLineWidth); - } - - max++; + // replace the dataset + if (!groups) { + this.groupsData = null; } - - if (this.master == false) { - this.conversionFactor = y / (this.valueAtZero - step.current); + else if (groups instanceof DataSet || groups instanceof DataView) { + this.groupsData = groups; } else { - this.conversionFactor = this.dom.frame.offsetHeight / step.marginRange; + throw new TypeError('Data must be an instance of DataSet or DataView'); } - var offset = this.options.icons == true ? this.options.iconWidth + this.options.labelOffsetX + 15 : this.options.labelOffsetX + 15; - // this will resize the yAxis to accomodate the labels. - if (this.maxLabelSize > (this.width - offset) && this.options.visible == true) { - this.width = this.maxLabelSize + offset; - this.options.width = this.width + "px"; - DOMutil.cleanupElements(this.DOMelements.lines); - DOMutil.cleanupElements(this.DOMelements.labels); - this.redraw(); - return true; - } - // this will resize the yAxis if it is too big for the labels. - else if (this.maxLabelSize < (this.width - offset) && this.options.visible == true && this.width > this.minWidth) { - this.width = Math.max(this.minWidth,this.maxLabelSize + offset); - this.options.width = this.width + "px"; - DOMutil.cleanupElements(this.DOMelements.lines); - DOMutil.cleanupElements(this.DOMelements.labels); - this.redraw(); - return true; - } - else { - DOMutil.cleanupElements(this.DOMelements.lines); - DOMutil.cleanupElements(this.DOMelements.labels); - return false; + if (this.groupsData) { + // subscribe to new dataset + var id = this.id; + util.forEach(this.groupListeners, function (callback, event) { + me.groupsData.on(event, callback, id); + }); + + // draw all ms + ids = this.groupsData.getIds(); + this._onAddGroups(ids); } + this._onUpdate(); }; - DataAxis.prototype.convertValue = function (value) { - var invertedValue = this.valueAtZero - value; - var convertedValue = invertedValue * this.conversionFactor; - return convertedValue; - }; /** - * Create a label for the axis at position x + * Update the datapoints + * @param [ids] * @private - * @param y - * @param text - * @param orientation - * @param className - * @param characterHeight */ - DataAxis.prototype._redrawLabel = function (y, text, orientation, className, characterHeight) { - // reuse redundant label - var label = DOMutil.getDOMElement('div',this.DOMelements.labels, this.dom.frame); //this.dom.redundant.labels.shift(); - label.className = className; - label.innerHTML = text; - if (orientation == 'left') { - label.style.left = '-' + this.options.labelOffsetX + 'px'; - label.style.textAlign = "right"; - } - else { - label.style.right = '-' + this.options.labelOffsetX + 'px'; - label.style.textAlign = "left"; + LineGraph.prototype._onUpdate = function(ids) { + this._updateUngrouped(); + this._updateAllGroupData(); + this._updateGraph(); + this.redraw(); + }; + LineGraph.prototype._onAdd = function (ids) {this._onUpdate(ids);}; + LineGraph.prototype._onRemove = function (ids) {this._onUpdate(ids);}; + LineGraph.prototype._onUpdateGroups = function (groupIds) { + for (var i = 0; i < groupIds.length; i++) { + var group = this.groupsData.get(groupIds[i]); + this._updateGroup(group, groupIds[i]); } - label.style.top = y - 0.5 * characterHeight + this.options.labelOffsetY + 'px'; - - text += ''; + this._updateGraph(); + this.redraw(); + }; + LineGraph.prototype._onAddGroups = function (groupIds) {this._onUpdateGroups(groupIds);}; - var largestWidth = Math.max(this.props.majorCharWidth,this.props.minorCharWidth); - if (this.maxLabelSize < text.length * largestWidth) { - this.maxLabelSize = text.length * largestWidth; + LineGraph.prototype._onRemoveGroups = function (groupIds) { + for (var i = 0; i < groupIds.length; i++) { + if (!this.groups.hasOwnProperty(groupIds[i])) { + if (this.groups[groupIds[i]].options.yAxisOrientation == 'right') { + this.yAxisRight.removeGroup(groupIds[i]); + this.legendRight.removeGroup(groupIds[i]); + this.legendRight.redraw(); + } + else { + this.yAxisLeft.removeGroup(groupIds[i]); + this.legendLeft.removeGroup(groupIds[i]); + this.legendLeft.redraw(); + } + delete this.groups[groupIds[i]]; + } } + this._updateUngrouped(); + this._updateGraph(); + this.redraw(); }; /** - * Create a minor line for the axis at position y - * @param y - * @param orientation - * @param className - * @param offset - * @param width + * update a group object + * + * @param group + * @param groupId + * @private */ - DataAxis.prototype._redrawLine = function (y, orientation, className, offset, width) { - if (this.master == true) { - var line = DOMutil.getDOMElement('div',this.DOMelements.lines, this.dom.lineContainer);//this.dom.redundant.lines.shift(); - line.className = className; - line.innerHTML = ''; - - if (orientation == 'left') { - line.style.left = (this.width - offset) + 'px'; + LineGraph.prototype._updateGroup = function (group, groupId) { + if (!this.groups.hasOwnProperty(groupId)) { + this.groups[groupId] = new GraphGroup(group, groupId, this.options, this.groupsUsingDefaultStyles); + if (this.groups[groupId].options.yAxisOrientation == 'right') { + this.yAxisRight.addGroup(groupId, this.groups[groupId]); + this.legendRight.addGroup(groupId, this.groups[groupId]); } else { - line.style.right = (this.width - offset) + 'px'; + this.yAxisLeft.addGroup(groupId, this.groups[groupId]); + this.legendLeft.addGroup(groupId, this.groups[groupId]); } + } + else { + this.groups[groupId].update(group); + if (this.groups[groupId].options.yAxisOrientation == 'right') { + this.yAxisRight.updateGroup(groupId, this.groups[groupId]); + this.legendRight.updateGroup(groupId, this.groups[groupId]); + } + else { + this.yAxisLeft.updateGroup(groupId, this.groups[groupId]); + this.legendLeft.updateGroup(groupId, this.groups[groupId]); + } + } + this.legendLeft.redraw(); + this.legendRight.redraw(); + }; - line.style.width = width + 'px'; - line.style.top = y + 'px'; + LineGraph.prototype._updateAllGroupData = function () { + if (this.itemsData != null) { + var groupsContent = {}; + var groupId; + for (groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + groupsContent[groupId] = []; + } + } + for (var itemId in this.itemsData._data) { + if (this.itemsData._data.hasOwnProperty(itemId)) { + var item = this.itemsData._data[itemId]; + item.x = util.convert(item.x,"Date"); + groupsContent[item.group].push(item); + } + } + for (groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + this.groups[groupId].setItems(groupsContent[groupId]); + } + } } }; + /** + * Create or delete the group holding all ungrouped items. This group is used when + * there are no groups specified. This anonymous group is called 'graph'. + * @protected + */ + LineGraph.prototype._updateUngrouped = function() { + if (this.itemsData != null) { + // var t0 = new Date(); + var group = {id: UNGROUPED, content: this.options.defaultGroup}; + this._updateGroup(group, UNGROUPED); + var ungroupedCounter = 0; + if (this.itemsData) { + for (var itemId in this.itemsData._data) { + if (this.itemsData._data.hasOwnProperty(itemId)) { + var item = this.itemsData._data[itemId]; + if (item != undefined) { + if (item.hasOwnProperty('group')) { + if (item.group === undefined) { + item.group = UNGROUPED; + } + } + else { + item.group = UNGROUPED; + } + ungroupedCounter = item.group == UNGROUPED ? ungroupedCounter + 1 : ungroupedCounter; + } + } + } + } + if (ungroupedCounter == 0) { + delete this.groups[UNGROUPED]; + this.legendLeft.removeGroup(UNGROUPED); + this.legendRight.removeGroup(UNGROUPED); + this.yAxisLeft.removeGroup(UNGROUPED); + this.yAxisRight.removeGroup(UNGROUPED); + } + } + else { + delete this.groups[UNGROUPED]; + this.legendLeft.removeGroup(UNGROUPED); + this.legendRight.removeGroup(UNGROUPED); + this.yAxisLeft.removeGroup(UNGROUPED); + this.yAxisRight.removeGroup(UNGROUPED); + } + this.legendLeft.redraw(); + this.legendRight.redraw(); + }; /** - * Determine the size of text on the axis (both major and minor axis). - * The size is calculated only once and then cached in this.props. - * @private + * Redraw the component, mandatory function + * @return {boolean} Returns true if the component is resized */ - DataAxis.prototype._calculateCharSize = function () { - // determine the char width and height on the minor axis - if (!('minorCharHeight' in this.props)) { - var textMinor = document.createTextNode('0'); - var measureCharMinor = document.createElement('DIV'); - measureCharMinor.className = 'yAxis minor measure'; - measureCharMinor.appendChild(textMinor); - this.dom.frame.appendChild(measureCharMinor); - - this.props.minorCharHeight = measureCharMinor.clientHeight; - this.props.minorCharWidth = measureCharMinor.clientWidth; + LineGraph.prototype.redraw = function() { + var resized = false; - this.dom.frame.removeChild(measureCharMinor); + this.svg.style.height = ('' + this.options.graphHeight).replace('px','') + 'px'; + if (this.lastWidth === undefined && this.width || this.lastWidth != this.width) { + resized = true; } + // check if this component is resized + resized = this._isResized() || resized; + // check whether zoomed (in that case we need to re-stack everything) + var visibleInterval = this.body.range.end - this.body.range.start; + var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.width != this.lastWidth); + this.lastVisibleInterval = visibleInterval; + this.lastWidth = this.width; - if (!('majorCharHeight' in this.props)) { - var textMajor = document.createTextNode('0'); - var measureCharMajor = document.createElement('DIV'); - measureCharMajor.className = 'yAxis major measure'; - measureCharMajor.appendChild(textMajor); - this.dom.frame.appendChild(measureCharMajor); - - this.props.majorCharHeight = measureCharMajor.clientHeight; - this.props.majorCharWidth = measureCharMajor.clientWidth; + // calculate actual size and position + this.width = this.dom.frame.offsetWidth; - this.dom.frame.removeChild(measureCharMajor); + // the svg element is three times as big as the width, this allows for fully dragging left and right + // without reloading the graph. the controls for this are bound to events in the constructor + if (resized == true) { + this.svg.style.width = util.option.asSize(3*this.width); + this.svg.style.left = util.option.asSize(-this.width); + } + if (zoomed == true || this.abortedGraphUpdate == true) { + this._updateGraph(); } + + this.legendLeft.redraw(); + this.legendRight.redraw(); + + return resized; }; /** - * Snap a date to a rounded value. - * The snap intervals are dependent on the current scale and step. - * @param {Date} date the date to be snapped. - * @return {Date} snappedDate + * Update and redraw the graph. + * */ - DataAxis.prototype.snap = function(date) { - return this.step.snap(date); - }; + LineGraph.prototype._updateGraph = function () { + // reset the svg elements + DOMutil.prepareElements(this.svgElements); + if (this.width != 0 && this.itemsData != null) { + var group, i; + var preprocessedGroupData = {}; + var processedGroupData = {}; + var groupRanges = {}; + var changeCalled = false; - module.exports = DataAxis; + // getting group Ids + var groupIds = []; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + group = this.groups[groupId]; + if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) { + groupIds.push(groupId); + } + } + } + if (groupIds.length > 0) { + // this is the range of the SVG canvas + var minDate = this.body.util.toGlobalTime(- this.body.domProps.root.width); + var maxDate = this.body.util.toGlobalTime(2 * this.body.domProps.root.width); + var groupsData = {}; + // fill groups data + this._getRelevantData(groupIds, groupsData, minDate, maxDate); + // we transform the X coordinates to detect collisions + for (i = 0; i < groupIds.length; i++) { + preprocessedGroupData[groupIds[i]] = this._convertXcoordinates(groupsData[groupIds[i]]); + } + // now all needed data has been collected we start the processing. + this._getYRanges(groupIds, preprocessedGroupData, groupRanges); + // update the Y axis first, we use this data to draw at the correct Y points + // changeCalled is required to clean the SVG on a change emit. + changeCalled = this._updateYAxis(groupIds, groupRanges); + if (changeCalled == true) { + DOMutil.cleanupElements(this.svgElements); + this.abortedGraphUpdate = true; + this.body.emitter.emit("change"); + return; + } + this.abortedGraphUpdate = false; -/***/ }, -/* 41 */ -/***/ function(module, exports, __webpack_require__) { + // With the yAxis scaled correctly, use this to get the Y values of the points. + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + processedGroupData[groupIds[i]] = this._convertYcoordinates(groupsData[groupIds[i]], group); + } - /** - * @constructor DataStep - * The class DataStep is an iterator for data for the lineGraph. You provide a start data point and an - * end data point. The class itself determines the best scale (step size) based on the - * provided start Date, end Date, and minimumStep. - * - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * - * Alternatively, you can set a scale by hand. - * After creation, you can initialize the class by executing first(). Then you - * can iterate from the start date to the end date via next(). You can check if - * the end date is reached with the function hasNext(). After each step, you can - * retrieve the current date via getCurrent(). - * The DataStep has scales ranging from milliseconds, seconds, minutes, hours, - * days, to years. - * - * Version: 1.2 - * - * @param {Date} [start] The start date, for example new Date(2010, 9, 21) - * or new Date(2010, 9, 21, 23, 45, 00) - * @param {Date} [end] The end date - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds - */ - function DataStep(start, end, minimumStep, containerHeight, customRange) { - // variables - this.current = 0; - this.autoScale = true; - this.stepIndex = 0; - this.step = 1; - this.scale = 1; + // draw the groups + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (group.options.style == 'line') { + this._drawLineGraph(processedGroupData[groupIds[i]], group); + } + } + this._drawBarGraphs(groupIds, processedGroupData); + } + } - this.marginStart; - this.marginEnd; - this.deadSpace = 0; + // cleanup unused svg elements + DOMutil.cleanupElements(this.svgElements); + }; - this.majorSteps = [1, 2, 5, 10]; - this.minorSteps = [0.25, 0.5, 1, 2]; - this.setRange(start, end, minimumStep, containerHeight, customRange); - } + LineGraph.prototype._getRelevantData = function (groupIds, groupsData, minDate, maxDate) { + // first select and preprocess the data from the datasets. + // the groups have their preselection of data, we now loop over this data to see + // what data we need to draw. Sorted data is much faster. + // more optimization is possible by doing the sampling before and using the binary search + // to find the end date to determine the increment. + var group, i, j, item; + if (groupIds.length > 0) { + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + groupsData[groupIds[i]] = []; + var dataContainer = groupsData[groupIds[i]]; + // optimization for sorted data + if (group.options.sort == true) { + var guess = Math.max(0, util.binarySearchGeneric(group.itemsData, minDate, 'x', 'before')); + for (j = guess; j < group.itemsData.length; j++) { + item = group.itemsData[j]; + if (item !== undefined) { + if (item.x > maxDate) { + dataContainer.push(item); + break; + } + else { + dataContainer.push(item); + } + } + } + } + else { + for (j = 0; j < group.itemsData.length; j++) { + item = group.itemsData[j]; + if (item !== undefined) { + if (item.x > minDate && item.x < maxDate) { + dataContainer.push(item); + } + } + } + } + } + } + this._applySampling(groupIds, groupsData); + }; + LineGraph.prototype._applySampling = function (groupIds, groupsData) { + var group; + if (groupIds.length > 0) { + for (var i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (group.options.sampling == true) { + var dataContainer = groupsData[groupIds[i]]; + if (dataContainer.length > 0) { + var increment = 1; + var amountOfPoints = dataContainer.length; - /** - * Set a new range - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * @param {Number} [start] The start date and time. - * @param {Number} [end] The end date and time. - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds - */ - DataStep.prototype.setRange = function(start, end, minimumStep, containerHeight, customRange) { - this._start = customRange.min === undefined ? start : customRange.min; - this._end = customRange.max === undefined ? end : customRange.max; + // the global screen is used because changing the width of the yAxis may affect the increment, resulting in an endless loop + // of width changing of the yAxis. + var xDistance = this.body.util.toGlobalScreen(dataContainer[dataContainer.length - 1].x) - this.body.util.toGlobalScreen(dataContainer[0].x); + var pointsPerPixel = amountOfPoints / xDistance; + increment = Math.min(Math.ceil(0.2 * amountOfPoints), Math.max(1, Math.round(pointsPerPixel))); - if (start == end) { - this._start = start - 0.75; - this._end = end + 1; - } + var sampledData = []; + for (var j = 0; j < amountOfPoints; j += increment) { + sampledData.push(dataContainer[j]); - if (this.autoScale) { - this.setMinimumStep(minimumStep, containerHeight); + } + groupsData[groupIds[i]] = sampledData; + } + } + } } - this.setFirst(customRange); }; - /** - * Automatically determine the scale that bests fits the provided minimum step - * @param {Number} [minimumStep] The minimum step size in milliseconds - */ - DataStep.prototype.setMinimumStep = function(minimumStep, containerHeight) { - // round to floor - var size = this._end - this._start; - var safeSize = size * 1.2; - var minimumStepValue = minimumStep * (safeSize / containerHeight); - var orderOfMagnitude = Math.round(Math.log(safeSize)/Math.LN10); + LineGraph.prototype._getYRanges = function (groupIds, groupsData, groupRanges) { + var groupData, group, i,j; + var barCombinedDataLeft = []; + var barCombinedDataRight = []; + var barCombinedData; + if (groupIds.length > 0) { + for (i = 0; i < groupIds.length; i++) { + groupData = groupsData[groupIds[i]]; + if (groupData.length > 0) { + group = this.groups[groupIds[i]]; + if (group.options.style == 'line' || group.options.barChart.handleOverlap != "stack") { + var yMin = groupData[0].y; + var yMax = groupData[0].y; + for (j = 0; j < groupData.length; j++) { + yMin = yMin > groupData[j].y ? groupData[j].y : yMin; + yMax = yMax < groupData[j].y ? groupData[j].y : yMax; + } + groupRanges[groupIds[i]] = {min: yMin, max: yMax, yAxisOrientation: group.options.yAxisOrientation}; + } + else if (group.options.style == 'bar') { + if (group.options.yAxisOrientation == 'left') { + barCombinedData = barCombinedDataLeft; + } + else { + barCombinedData = barCombinedDataRight; + } - var minorStepIdx = -1; - var magnitudefactor = Math.pow(10,orderOfMagnitude); + groupRanges[groupIds[i]] = {min: 0, max: 0, yAxisOrientation: group.options.yAxisOrientation, ignore: true}; - var start = 0; - if (orderOfMagnitude < 0) { - start = orderOfMagnitude; + // combine data + for (j = 0; j < groupData.length; j++) { + barCombinedData.push({ + x: groupData[j].x, + y: groupData[j].y, + groupId: groupIds[i] + }); + } + } + } + } + + var intersections; + if (barCombinedDataLeft.length > 0) { + // sort by time and by group + barCombinedDataLeft.sort(function (a, b) { + if (a.x == b.x) { + return a.groupId - b.groupId; + } else { + return a.x - b.x; + } + }); + intersections = {}; + this._getDataIntersections(intersections, barCombinedDataLeft); + groupRanges["__barchartLeft"] = this._getStackedBarYRange(intersections, barCombinedDataLeft); + groupRanges["__barchartLeft"].yAxisOrientation = "left"; + groupIds.push("__barchartLeft"); + } + if (barCombinedDataRight.length > 0) { + // sort by time and by group + barCombinedDataRight.sort(function (a, b) { + if (a.x == b.x) { + return a.groupId - b.groupId; + } else { + return a.x - b.x; + } + }); + intersections = {}; + this._getDataIntersections(intersections, barCombinedDataRight); + groupRanges["__barchartRight"] = this._getStackedBarYRange(intersections, barCombinedDataRight); + groupRanges["__barchartRight"].yAxisOrientation = "right"; + groupIds.push("__barchartRight"); + } } + }; - var solutionFound = false; - for (var i = start; Math.abs(i) <= Math.abs(orderOfMagnitude); i++) { - magnitudefactor = Math.pow(10,i); - for (var j = 0; j < this.minorSteps.length; j++) { - var stepSize = magnitudefactor * this.minorSteps[j]; - if (stepSize >= minimumStepValue) { - solutionFound = true; - minorStepIdx = j; - break; + LineGraph.prototype._getStackedBarYRange = function (intersections, combinedData) { + var key; + var yMin = combinedData[0].y; + var yMax = combinedData[0].y; + for (var i = 0; i < combinedData.length; i++) { + key = combinedData[i].x; + if (intersections[key] === undefined) { + yMin = yMin > combinedData[i].y ? combinedData[i].y : yMin; + yMax = yMax < combinedData[i].y ? combinedData[i].y : yMax; + } + else { + intersections[key].accumulated += combinedData[i].y; + } + } + for (var xpos in intersections) { + if (intersections.hasOwnProperty(xpos)) { + yMin = yMin > intersections[xpos].accumulated ? intersections[xpos].accumulated : yMin; + yMax = yMax < intersections[xpos].accumulated ? intersections[xpos].accumulated : yMax; + } + } + + return {min: yMin, max: yMax}; + }; + + + /** + * this sets the Y ranges for the Y axis. It also determines which of the axis should be shown or hidden. + * @param {Array} groupIds + * @param {Object} groupRanges + * @private + */ + LineGraph.prototype._updateYAxis = function (groupIds, groupRanges) { + var changeCalled = false; + var yAxisLeftUsed = false; + var yAxisRightUsed = false; + var minLeft = 1e9, minRight = 1e9, maxLeft = -1e9, maxRight = -1e9, minVal, maxVal; + // if groups are present + if (groupIds.length > 0) { + for (var i = 0; i < groupIds.length; i++) { + if (groupRanges.hasOwnProperty(groupIds[i])) { + if (groupRanges[groupIds[i]].ignore !== true) { + minVal = groupRanges[groupIds[i]].min; + maxVal = groupRanges[groupIds[i]].max; + + if (groupRanges[groupIds[i]].yAxisOrientation == 'left') { + yAxisLeftUsed = true; + minLeft = minLeft > minVal ? minVal : minLeft; + maxLeft = maxLeft < maxVal ? maxVal : maxLeft; + } + else { + yAxisRightUsed = true; + minRight = minRight > minVal ? minVal : minRight; + maxRight = maxRight < maxVal ? maxVal : maxRight; + } + } } } - if (solutionFound == true) { - break; + + if (yAxisLeftUsed == true) { + this.yAxisLeft.setRange(minLeft, maxLeft); + } + if (yAxisRightUsed == true) { + this.yAxisRight.setRange(minRight, maxRight); } } - this.stepIndex = minorStepIdx; - this.scale = magnitudefactor; - this.step = magnitudefactor * this.minorSteps[minorStepIdx]; - }; - + changeCalled = this._toggleAxisVisiblity(yAxisLeftUsed , this.yAxisLeft) || changeCalled; + changeCalled = this._toggleAxisVisiblity(yAxisRightUsed, this.yAxisRight) || changeCalled; - /** - * Round the current date to the first minor date value - * This must be executed once when the current date is set to start Date - */ - DataStep.prototype.setFirst = function(customRange) { - if (customRange === undefined) { - customRange = {}; + if (yAxisRightUsed == true && yAxisLeftUsed == true) { + this.yAxisLeft.drawIcons = true; + this.yAxisRight.drawIcons = true; + } + else { + this.yAxisLeft.drawIcons = false; + this.yAxisRight.drawIcons = false; } - var niceStart = customRange.min === undefined ? this._start - (this.scale * 2 * this.minorSteps[this.stepIndex]) : customRange.min; - var niceEnd = customRange.max === undefined ? this._end + (this.scale * this.minorSteps[this.stepIndex]) : customRange.max; - - this.marginEnd = customRange.max === undefined ? this.roundToMinor(niceEnd) : customRange.max; - this.marginStart = customRange.min === undefined ? this.roundToMinor(niceStart) : customRange.min; - this.deadSpace = this.roundToMinor(niceEnd) - niceEnd + this.roundToMinor(niceStart) - niceStart; - this.marginRange = this.marginEnd - this.marginStart; - this.current = this.marginEnd; + this.yAxisRight.master = !yAxisLeftUsed; - }; + if (this.yAxisRight.master == false) { + if (yAxisRightUsed == true) {this.yAxisLeft.lineOffset = this.yAxisRight.width;} + else {this.yAxisLeft.lineOffset = 0;} - DataStep.prototype.roundToMinor = function(value) { - var rounded = value - (value % (this.scale * this.minorSteps[this.stepIndex])); - if (value % (this.scale * this.minorSteps[this.stepIndex]) > 0.5 * (this.scale * this.minorSteps[this.stepIndex])) { - return rounded + (this.scale * this.minorSteps[this.stepIndex]); + changeCalled = this.yAxisLeft.redraw() || changeCalled; + this.yAxisRight.stepPixelsForced = this.yAxisLeft.stepPixels; + changeCalled = this.yAxisRight.redraw() || changeCalled; } else { - return rounded; + changeCalled = this.yAxisRight.redraw() || changeCalled; } - } + // clean the accumulated lists + if (groupIds.indexOf("__barchartLeft") != -1) { + groupIds.splice(groupIds.indexOf("__barchartLeft"),1); + } + if (groupIds.indexOf("__barchartRight") != -1) { + groupIds.splice(groupIds.indexOf("__barchartRight"),1); + } - /** - * Check if the there is a next step - * @return {boolean} true if the current date has not passed the end date - */ - DataStep.prototype.hasNext = function () { - return (this.current >= this.marginStart); + return changeCalled; }; /** - * Do the next step + * This shows or hides the Y axis if needed. If there is a change, the changed event is emitted by the updateYAxis function + * + * @param {boolean} axisUsed + * @returns {boolean} + * @private + * @param axis */ - DataStep.prototype.next = function() { - var prev = this.current; - this.current -= this.step; - - // safety mechanism: if current time is still unchanged, move to the end - if (this.current == prev) { - this.current = this._end; + LineGraph.prototype._toggleAxisVisiblity = function (axisUsed, axis) { + var changed = false; + if (axisUsed == false) { + if (axis.dom.frame.parentNode) { + axis.hide(); + changed = true; + } } - }; - - /** - * Do the next step - */ - DataStep.prototype.previous = function() { - this.current += this.step; - this.marginEnd += this.step; - this.marginRange = this.marginEnd - this.marginStart; + else { + if (!axis.dom.frame.parentNode) { + axis.show(); + changed = true; + } + } + return changed; }; - /** - * Get the current datetime - * @return {String} current The current date + * draw a bar graph + * + * @param groupIds + * @param processedGroupData */ - DataStep.prototype.getCurrent = function() { - var toPrecision = '' + Number(this.current).toPrecision(5); - for (var i = toPrecision.length-1; i > 0; i--) { - if (toPrecision[i] == "0") { - toPrecision = toPrecision.slice(0,i); - } - else if (toPrecision[i] == "." || toPrecision[i] == ",") { - toPrecision = toPrecision.slice(0,i); - break; - } - else{ - break; + LineGraph.prototype._drawBarGraphs = function (groupIds, processedGroupData) { + var combinedData = []; + var intersections = {}; + var coreDistance; + var key, drawData; + var group; + var i,j; + var barPoints = 0; + + // combine all barchart data + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (group.options.style == 'bar') { + if (group.visible == true && (this.options.groups.visibility[groupIds[i]] === undefined || this.options.groups.visibility[groupIds[i]] == true)) { + for (j = 0; j < processedGroupData[groupIds[i]].length; j++) { + combinedData.push({ + x: processedGroupData[groupIds[i]][j].x, + y: processedGroupData[groupIds[i]][j].y, + groupId: groupIds[i] + }); + barPoints += 1; + } + } } } - return toPrecision; - }; + if (barPoints == 0) {return;} + + // sort by time and by group + combinedData.sort(function (a, b) { + if (a.x == b.x) { + return a.groupId - b.groupId; + } else { + return a.x - b.x; + } + }); + // get intersections + this._getDataIntersections(intersections, combinedData); + // plot barchart + for (i = 0; i < combinedData.length; i++) { + group = this.groups[combinedData[i].groupId]; + var minWidth = 0.1 * group.options.barChart.width; - /** - * Snap a date to a rounded value. - * The snap intervals are dependent on the current scale and step. - * @param {Date} date the date to be snapped. - * @return {Date} snappedDate - */ - DataStep.prototype.snap = function(date) { + key = combinedData[i].x; + var heightOffset = 0; + if (intersections[key] === undefined) { + if (i+1 < combinedData.length) {coreDistance = Math.abs(combinedData[i+1].x - key);} + if (i > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[i-1].x - key));} + drawData = this._getSafeDrawData(coreDistance, group, minWidth); + } + else { + var nextKey = i + (intersections[key].amount - intersections[key].resolved); + var prevKey = i - (intersections[key].resolved + 1); + if (nextKey < combinedData.length) {coreDistance = Math.abs(combinedData[nextKey].x - key);} + if (prevKey > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[prevKey].x - key));} + drawData = this._getSafeDrawData(coreDistance, group, minWidth); + intersections[key].resolved += 1; + if (group.options.barChart.handleOverlap == 'stack') { + heightOffset = intersections[key].accumulated; + intersections[key].accumulated += group.zeroPosition - combinedData[i].y; + } + else if (group.options.barChart.handleOverlap == 'sideBySide') { + drawData.width = drawData.width / intersections[key].amount; + drawData.offset += (intersections[key].resolved) * drawData.width - (0.5*drawData.width * (intersections[key].amount+1)); + if (group.options.barChart.align == 'left') {drawData.offset -= 0.5*drawData.width;} + else if (group.options.barChart.align == 'right') {drawData.offset += 0.5*drawData.width;} + } + } + DOMutil.drawBar(combinedData[i].x + drawData.offset, combinedData[i].y - heightOffset, drawData.width, group.zeroPosition - combinedData[i].y, group.className + ' bar', this.svgElements, this.svg); + // draw points + if (group.options.drawPoints.enabled == true) { + DOMutil.drawPoint(combinedData[i].x + drawData.offset, combinedData[i].y - heightOffset, group, this.svgElements, this.svg); + } + } }; /** - * Check if the current value is a major value (for example when the step - * is DAY, a major value is each first day of the MONTH) - * @return {boolean} true if current date is major, else false. + * Fill the intersections object with counters of how many datapoints share the same x coordinates + * @param intersections + * @param combinedData + * @private */ - DataStep.prototype.isMajor = function() { - return (this.current % (this.scale * this.majorSteps[this.stepIndex]) == 0); + LineGraph.prototype._getDataIntersections = function (intersections, combinedData) { + // get intersections + var coreDistance; + for (var i = 0; i < combinedData.length; i++) { + if (i + 1 < combinedData.length) { + coreDistance = Math.abs(combinedData[i + 1].x - combinedData[i].x); + } + if (i > 0) { + coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].x - combinedData[i].x)); + } + if (coreDistance == 0) { + if (intersections[combinedData[i].x] === undefined) { + intersections[combinedData[i].x] = {amount: 0, resolved: 0, accumulated: 0}; + } + intersections[combinedData[i].x].amount += 1; + } + } }; - module.exports = DataStep; - - -/***/ }, -/* 42 */ -/***/ function(module, exports, __webpack_require__) { - - var util = __webpack_require__(1); - var DOMutil = __webpack_require__(6); - /** - * @constructor Group - * @param {Number | String} groupId - * @param {Object} data - * @param {ItemSet} itemSet + * Get the width and offset for bargraphs based on the coredistance between datapoints + * + * @param coreDistance + * @param group + * @param minWidth + * @returns {{width: Number, offset: Number}} + * @private */ - function GraphGroup (group, groupId, options, groupsUsingDefaultStyles) { - this.id = groupId; - var fields = ['sampling','style','sort','yAxisOrientation','barChart','drawPoints','shaded','catmullRom'] - this.options = util.selectiveBridgeObject(fields,options); - this.usingDefaultStyle = group.className === undefined; - this.groupsUsingDefaultStyles = groupsUsingDefaultStyles; - this.zeroPosition = 0; - this.update(group); - if (this.usingDefaultStyle == true) { - this.groupsUsingDefaultStyles[0] += 1; - } - this.itemsData = []; - this.visible = group.visible === undefined ? true : group.visible; - } + LineGraph.prototype._getSafeDrawData = function (coreDistance, group, minWidth) { + var width, offset; + if (coreDistance < group.options.barChart.width && coreDistance > 0) { + width = coreDistance < minWidth ? minWidth : coreDistance; - GraphGroup.prototype.setItems = function(items) { - if (items != null) { - this.itemsData = items; - if (this.options.sort == true) { - this.itemsData.sort(function (a,b) {return a.x - b.x;}) + offset = 0; // recalculate offset with the new width; + if (group.options.barChart.align == 'left') { + offset -= 0.5 * coreDistance; + } + else if (group.options.barChart.align == 'right') { + offset += 0.5 * coreDistance; } } else { - this.itemsData = []; - } - }; - - GraphGroup.prototype.setZeroPosition = function(pos) { - this.zeroPosition = pos; - }; - - GraphGroup.prototype.setOptions = function(options) { - if (options !== undefined) { - var fields = ['sampling','style','sort','yAxisOrientation','barChart']; - util.selectiveDeepExtend(fields, this.options, options); - - util.mergeOptions(this.options, options,'catmullRom'); - util.mergeOptions(this.options, options,'drawPoints'); - util.mergeOptions(this.options, options,'shaded'); - - if (options.catmullRom) { - if (typeof options.catmullRom == 'object') { - if (options.catmullRom.parametrization) { - if (options.catmullRom.parametrization == 'uniform') { - this.options.catmullRom.alpha = 0; - } - else if (options.catmullRom.parametrization == 'chordal') { - this.options.catmullRom.alpha = 1.0; - } - else { - this.options.catmullRom.parametrization = 'centripetal'; - this.options.catmullRom.alpha = 0.5; - } - } - } + // default settings + width = group.options.barChart.width; + offset = 0; + if (group.options.barChart.align == 'left') { + offset -= 0.5 * group.options.barChart.width; + } + else if (group.options.barChart.align == 'right') { + offset += 0.5 * group.options.barChart.width; } } - }; - GraphGroup.prototype.update = function(group) { - this.group = group; - this.content = group.content || 'graph'; - this.className = group.className || this.className || "graphGroup" + this.groupsUsingDefaultStyles[0] % 10; - this.visible = group.visible === undefined ? true : group.visible; - this.setOptions(group.options); + return {width: width, offset: offset}; }; - GraphGroup.prototype.drawIcon = function(x, y, JSONcontainer, SVGcontainer, iconWidth, iconHeight) { - var fillHeight = iconHeight * 0.5; - var path, fillPath; - var outline = DOMutil.getSVGElement("rect", JSONcontainer, SVGcontainer); - outline.setAttributeNS(null, "x", x); - outline.setAttributeNS(null, "y", y - fillHeight); - outline.setAttributeNS(null, "width", iconWidth); - outline.setAttributeNS(null, "height", 2*fillHeight); - outline.setAttributeNS(null, "class", "outline"); + /** + * draw a line graph + * + * @param dataset + * @param group + */ + LineGraph.prototype._drawLineGraph = function (dataset, group) { + if (dataset != null) { + if (dataset.length > 0) { + var path, d; + var svgHeight = Number(this.svg.style.height.replace("px","")); + path = DOMutil.getSVGElement('path', this.svgElements, this.svg); + path.setAttributeNS(null, "class", group.className); - if (this.options.style == 'line') { - path = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); - path.setAttributeNS(null, "class", this.className); - path.setAttributeNS(null, "d", "M" + x + ","+y+" L" + (x + iconWidth) + ","+y+""); - if (this.options.shaded.enabled == true) { - fillPath = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); - if (this.options.shaded.orientation == 'top') { - fillPath.setAttributeNS(null, "d", "M"+x+", " + (y - fillHeight) + - "L"+x+","+y+" L"+ (x + iconWidth) + ","+y+" L"+ (x + iconWidth) + "," + (y - fillHeight)); + // construct path from dataset + if (group.options.catmullRom.enabled == true) { + d = this._catmullRom(dataset, group); } else { - fillPath.setAttributeNS(null, "d", "M"+x+","+y+" " + - "L"+x+"," + (y + fillHeight) + " " + - "L"+ (x + iconWidth) + "," + (y + fillHeight) + - "L"+ (x + iconWidth) + ","+y); + d = this._linear(dataset); } - fillPath.setAttributeNS(null, "class", this.className + " iconFill"); - } - - if (this.options.drawPoints.enabled == true) { - DOMutil.drawPoint(x + 0.5 * iconWidth,y, this, JSONcontainer, SVGcontainer); - } - } - else { - var barWidth = Math.round(0.3 * iconWidth); - var bar1Height = Math.round(0.4 * iconHeight); - var bar2Height = Math.round(0.75 * iconHeight); - var offset = Math.round((iconWidth - (2 * barWidth))/3); + // append with points for fill and finalize the path + if (group.options.shaded.enabled == true) { + var fillPath = DOMutil.getSVGElement('path',this.svgElements, this.svg); + var dFill; + if (group.options.shaded.orientation == 'top') { + dFill = "M" + dataset[0].x + "," + 0 + " " + d + "L" + dataset[dataset.length - 1].x + "," + 0; + } + else { + dFill = "M" + dataset[0].x + "," + svgHeight + " " + d + "L" + dataset[dataset.length - 1].x + "," + svgHeight; + } + fillPath.setAttributeNS(null, "class", group.className + " fill"); + fillPath.setAttributeNS(null, "d", dFill); + } + // copy properties to path for drawing. + path.setAttributeNS(null, "d", "M" + d); - DOMutil.drawBar(x + 0.5*barWidth + offset , y + fillHeight - bar1Height - 1, barWidth, bar1Height, this.className + ' bar', JSONcontainer, SVGcontainer); - DOMutil.drawBar(x + 1.5*barWidth + offset + 2, y + fillHeight - bar2Height - 1, barWidth, bar2Height, this.className + ' bar', JSONcontainer, SVGcontainer); + // draw points + if (group.options.drawPoints.enabled == true) { + this._drawPoints(dataset, group, this.svgElements, this.svg); + } + } } }; /** + * draw the data points * - * @param iconWidth - * @param iconHeight - * @returns {{icon: HTMLElement, label: (group.content|*|string), orientation: (.options.yAxisOrientation|*)}} + * @param {Array} dataset + * @param {Object} JSONcontainer + * @param {Object} svg | SVG DOM element + * @param {GraphGroup} group + * @param {Number} [offset] */ - GraphGroup.prototype.getLegend = function(iconWidth, iconHeight) { - var svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); - this.drawIcon(0,0.5*iconHeight,[],svg,iconWidth,iconHeight); - return {icon: svg, label: this.content, orientation:this.options.yAxisOrientation}; - } - - module.exports = GraphGroup; - + LineGraph.prototype._drawPoints = function (dataset, group, JSONcontainer, svg, offset) { + if (offset === undefined) {offset = 0;} + for (var i = 0; i < dataset.length; i++) { + DOMutil.drawPoint(dataset[i].x + offset, dataset[i].y, group, JSONcontainer, svg); + } + }; -/***/ }, -/* 43 */ -/***/ function(module, exports, __webpack_require__) { - var util = __webpack_require__(1); - var DOMutil = __webpack_require__(6); - var Component = __webpack_require__(22); /** - * Legend for Graph2d + * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the + * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for + * the yAxis. + * + * @param datapoints + * @returns {Array} + * @private */ - function Legend(body, options, side, linegraphOptions) { - this.body = body; - this.defaultOptions = { - enabled: true, - icons: true, - iconSize: 20, - iconSpacing: 6, - left: { - visible: true, - position: 'top-left' // top/bottom - left,center,right - }, - right: { - visible: true, - position: 'top-left' // top/bottom - left,center,right - } - } - this.side = side; - this.options = util.extend({},this.defaultOptions); - this.linegraphOptions = linegraphOptions; + LineGraph.prototype._convertXcoordinates = function (datapoints) { + var extractedData = []; + var xValue, yValue; + var toScreen = this.body.util.toScreen; - this.svgElements = {}; - this.dom = {}; - this.groups = {}; - this.amountOfGroups = 0; - this._create(); + for (var i = 0; i < datapoints.length; i++) { + xValue = toScreen(datapoints[i].x) + this.width - 1; + yValue = datapoints[i].y; + extractedData.push({x: xValue, y: yValue}); + } - this.setOptions(options); - } + return extractedData; + }; - Legend.prototype = new Component(); - Legend.prototype.addGroup = function(label, graphOptions) { - if (!this.groups.hasOwnProperty(label)) { - this.groups[label] = graphOptions; + /** + * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the + * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for + * the yAxis. + * + * @param datapoints + * @returns {Array} + * @private + */ + LineGraph.prototype._convertYcoordinates = function (datapoints, group) { + var extractedData = []; + var xValue, yValue; + var toScreen = this.body.util.toScreen; + var axis = this.yAxisLeft; + var svgHeight = Number(this.svg.style.height.replace("px","")); + if (group.options.yAxisOrientation == 'right') { + axis = this.yAxisRight; } - this.amountOfGroups += 1; - }; - - Legend.prototype.updateGroup = function(label, graphOptions) { - this.groups[label] = graphOptions; - }; - Legend.prototype.removeGroup = function(label) { - if (this.groups.hasOwnProperty(label)) { - delete this.groups[label]; - this.amountOfGroups -= 1; + for (var i = 0; i < datapoints.length; i++) { + xValue = toScreen(datapoints[i].x) + this.width - 1; + yValue = Math.round(axis.convertValue(datapoints[i].y)); + extractedData.push({x: xValue, y: yValue}); } - }; - - Legend.prototype._create = function() { - this.dom.frame = document.createElement('div'); - this.dom.frame.className = 'legend'; - this.dom.frame.style.position = "absolute"; - this.dom.frame.style.top = "10px"; - this.dom.frame.style.display = "block"; - - this.dom.textArea = document.createElement('div'); - this.dom.textArea.className = 'legendText'; - this.dom.textArea.style.position = "relative"; - this.dom.textArea.style.top = "0px"; - this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); - this.svg.style.position = 'absolute'; - this.svg.style.top = 0 +'px'; - this.svg.style.width = this.options.iconSize + 5 + 'px'; + group.setZeroPosition(Math.min(svgHeight, axis.convertValue(0))); - this.dom.frame.appendChild(this.svg); - this.dom.frame.appendChild(this.dom.textArea); + return extractedData; }; /** - * Hide the component from the DOM + * This uses an uniform parametrization of the CatmullRom algorithm: + * "On the Parameterization of Catmull-Rom Curves" by Cem Yuksel et al. + * @param data + * @returns {string} + * @private */ - Legend.prototype.hide = function() { - // remove the frame containing the items - if (this.dom.frame.parentNode) { - this.dom.frame.parentNode.removeChild(this.dom.frame); + LineGraph.prototype._catmullRomUniform = function(data) { + // catmull rom + var p0, p1, p2, p3, bp1, bp2; + var d = Math.round(data[0].x) + "," + Math.round(data[0].y) + " "; + var normalization = 1/6; + var length = data.length; + for (var i = 0; i < length - 1; i++) { + + p0 = (i == 0) ? data[0] : data[i-1]; + p1 = data[i]; + p2 = data[i+1]; + p3 = (i + 2 < length) ? data[i+2] : p2; + + + // Catmull-Rom to Cubic Bezier conversion matrix + // 0 1 0 0 + // -1/6 1 1/6 0 + // 0 1/6 1 -1/6 + // 0 0 1 0 + + // bp0 = { x: p1.x, y: p1.y }; + bp1 = { x: ((-p0.x + 6*p1.x + p2.x) *normalization), y: ((-p0.y + 6*p1.y + p2.y) *normalization)}; + bp2 = { x: (( p1.x + 6*p2.x - p3.x) *normalization), y: (( p1.y + 6*p2.y - p3.y) *normalization)}; + // bp0 = { x: p2.x, y: p2.y }; + + d += "C" + + bp1.x + "," + + bp1.y + " " + + bp2.x + "," + + bp2.y + " " + + p2.x + "," + + p2.y + " "; } + + return d; }; /** - * Show the component in the DOM (when not already visible). - * @return {Boolean} changed + * This uses either the chordal or centripetal parameterization of the catmull-rom algorithm. + * By default, the centripetal parameterization is used because this gives the nicest results. + * These parameterizations are relatively heavy because the distance between 4 points have to be calculated. + * + * One optimization can be used to reuse distances since this is a sliding window approach. + * @param data + * @returns {string} + * @private */ - Legend.prototype.show = function() { - // show frame containing the items - if (!this.dom.frame.parentNode) { - this.body.dom.center.appendChild(this.dom.frame); + LineGraph.prototype._catmullRom = function(data, group) { + var alpha = group.options.catmullRom.alpha; + if (alpha == 0 || alpha === undefined) { + return this._catmullRomUniform(data); } - }; + else { + var p0, p1, p2, p3, bp1, bp2, d1,d2,d3, A, B, N, M; + var d3powA, d2powA, d3pow2A, d2pow2A, d1pow2A, d1powA; + var d = Math.round(data[0].x) + "," + Math.round(data[0].y) + " "; + var length = data.length; + for (var i = 0; i < length - 1; i++) { - Legend.prototype.setOptions = function(options) { - var fields = ['enabled','orientation','icons','left','right']; - util.selectiveDeepExtend(fields, this.options, options); - }; + p0 = (i == 0) ? data[0] : data[i-1]; + p1 = data[i]; + p2 = data[i+1]; + p3 = (i + 2 < length) ? data[i+2] : p2; - Legend.prototype.redraw = function() { - var activeGroups = 0; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { - activeGroups++; - } - } - } + d1 = Math.sqrt(Math.pow(p0.x - p1.x,2) + Math.pow(p0.y - p1.y,2)); + d2 = Math.sqrt(Math.pow(p1.x - p2.x,2) + Math.pow(p1.y - p2.y,2)); + d3 = Math.sqrt(Math.pow(p2.x - p3.x,2) + Math.pow(p2.y - p3.y,2)); - if (this.options[this.side].visible == false || this.amountOfGroups == 0 || this.options.enabled == false || activeGroups == 0) { - this.hide(); - } - else { - this.show(); - if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'bottom-left') { - this.dom.frame.style.left = '4px'; - this.dom.frame.style.textAlign = "left"; - this.dom.textArea.style.textAlign = "left"; - this.dom.textArea.style.left = (this.options.iconSize + 15) + 'px'; - this.dom.textArea.style.right = ''; - this.svg.style.left = 0 +'px'; - this.svg.style.right = ''; - } - else { - this.dom.frame.style.right = '4px'; - this.dom.frame.style.textAlign = "right"; - this.dom.textArea.style.textAlign = "right"; - this.dom.textArea.style.right = (this.options.iconSize + 15) + 'px'; - this.dom.textArea.style.left = ''; - this.svg.style.right = 0 +'px'; - this.svg.style.left = ''; - } + // Catmull-Rom to Cubic Bezier conversion matrix + // + // A = 2d1^2a + 3d1^a * d2^a + d3^2a + // B = 2d3^2a + 3d3^a * d2^a + d2^2a + // + // [ 0 1 0 0 ] + // [ -d2^2a/N A/N d1^2a/N 0 ] + // [ 0 d3^2a/M B/M -d2^2a/M ] + // [ 0 0 1 0 ] - if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'top-right') { - this.dom.frame.style.top = 4 - Number(this.body.dom.center.style.top.replace("px","")) + 'px'; - this.dom.frame.style.bottom = ''; - } - else { - this.dom.frame.style.bottom = 4 - Number(this.body.dom.center.style.top.replace("px","")) + 'px'; - this.dom.frame.style.top = ''; - } + // [ 0 1 0 0 ] + // [ -d2pow2a/N A/N d1pow2a/N 0 ] + // [ 0 d3pow2a/M B/M -d2pow2a/M ] + // [ 0 0 1 0 ] - if (this.options.icons == false) { - this.dom.frame.style.width = this.dom.textArea.offsetWidth + 10 + 'px'; - this.dom.textArea.style.right = ''; - this.dom.textArea.style.left = ''; - this.svg.style.width = '0px'; - } - else { - this.dom.frame.style.width = this.options.iconSize + 15 + this.dom.textArea.offsetWidth + 10 + 'px' - this.drawLegendIcons(); - } + d3powA = Math.pow(d3, alpha); + d3pow2A = Math.pow(d3,2*alpha); + d2powA = Math.pow(d2, alpha); + d2pow2A = Math.pow(d2,2*alpha); + d1powA = Math.pow(d1, alpha); + d1pow2A = Math.pow(d1,2*alpha); - var content = ''; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { - content += this.groups[groupId].content + '
'; - } - } - } - this.dom.textArea.innerHTML = content; - this.dom.textArea.style.lineHeight = ((0.75 * this.options.iconSize) + this.options.iconSpacing) + 'px'; - } - }; + A = 2*d1pow2A + 3*d1powA * d2powA + d2pow2A; + B = 2*d3pow2A + 3*d3powA * d2powA + d2pow2A; + N = 3*d1powA * (d1powA + d2powA); + if (N > 0) {N = 1 / N;} + M = 3*d3powA * (d3powA + d2powA); + if (M > 0) {M = 1 / M;} - Legend.prototype.drawLegendIcons = function() { - if (this.dom.frame.parentNode) { - DOMutil.prepareElements(this.svgElements); - var padding = window.getComputedStyle(this.dom.frame).paddingTop; - var iconOffset = Number(padding.replace('px','')); - var x = iconOffset; - var iconWidth = this.options.iconSize; - var iconHeight = 0.75 * this.options.iconSize; - var y = iconOffset + 0.5 * iconHeight + 3; + bp1 = { x: ((-d2pow2A * p0.x + A*p1.x + d1pow2A * p2.x) * N), + y: ((-d2pow2A * p0.y + A*p1.y + d1pow2A * p2.y) * N)}; - this.svg.style.width = iconWidth + 5 + iconOffset + 'px'; + bp2 = { x: (( d3pow2A * p1.x + B*p2.x - d2pow2A * p3.x) * M), + y: (( d3pow2A * p1.y + B*p2.y - d2pow2A * p3.y) * M)}; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { - this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); - y += iconHeight + this.options.iconSpacing; - } - } + if (bp1.x == 0 && bp1.y == 0) {bp1 = p1;} + if (bp2.x == 0 && bp2.y == 0) {bp2 = p2;} + d += "C" + + bp1.x + "," + + bp1.y + " " + + bp2.x + "," + + bp2.y + " " + + p2.x + "," + + p2.y + " "; } - DOMutil.cleanupElements(this.svgElements); + return d; } }; - module.exports = Legend; + /** + * this generates the SVG path for a linear drawing between datapoints. + * @param data + * @returns {string} + * @private + */ + LineGraph.prototype._linear = function(data) { + // linear + var d = ""; + for (var i = 0; i < data.length; i++) { + if (i == 0) { + d += data[i].x + "," + data[i].y; + } + else { + d += " " + data[i].x + "," + data[i].y; + } + } + return d; + }; + + module.exports = LineGraph; /***/ }, diff --git a/dist/vis.map b/dist/vis.map index e49d38fa..2d239d3f 100644 --- a/dist/vis.map +++ b/dist/vis.map @@ -1 +1 @@ -{"version":3,"file":"vis.map","sources":["./dist/vis.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","util","DOMutil","DataSet","DataView","Graph3d","graph3d","Camera","Filter","Point2d","Point3d","Slider","StepNumber","Timeline","Graph2d","timeline","DataStep","Range","stack","TimeStep","components","items","Item","ItemBox","ItemPoint","ItemRange","Component","CurrentTime","CustomTime","DataAxis","GraphGroup","Group","ItemSet","Legend","LineGraph","TimeAxis","Network","network","Edge","Groups","Images","Node","Popup","dotparser","gephiParser","Graph","Error","moment","hammer","isNumber","object","Number","isString","String","isDate","Date","match","ASPDateRegex","exec","isNaN","parse","isDataTable","google","visualization","DataTable","randomUUID","S4","Math","floor","random","toString","extend","a","i","len","arguments","length","other","prop","hasOwnProperty","selectiveExtend","props","Array","isArray","selectiveDeepExtend","b","TypeError","constructor","Object","undefined","deepExtend","selectiveNotDeepExtend","indexOf","equalArray","convert","type","Boolean","valueOf","isMoment","toDate","getType","toISOString","value","getAbsoluteLeft","elem","getBoundingClientRect","left","window","pageXOffset","getAbsoluteTop","top","pageYOffset","addClassName","className","classes","split","push","join","removeClassName","index","splice","forEach","callback","toArray","array","updateProperty","key","addEventListener","element","action","listener","useCapture","navigator","userAgent","attachEvent","removeEventListener","detachEvent","preventDefault","event","returnValue","getTarget","target","srcElement","nodeType","parentNode","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","GiveDec","Hex","Value","eval","GiveHex","Dec","parseColor","color","isValidRGB","rgb","substr","RGBToHex","isValidHex","hsv","hexToHSV","lighterColorHSV","h","s","v","min","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","hexToRGB","hex","replace","toUpperCase","substring","d","e","f","r","g","red","green","blue","RGBToHSV","minRGB","maxRGB","max","hue","saturation","HSVToRGB","q","t","isOk","test","selectiveBridgeObject","fields","referenceObject","objectTo","create","bridgeObject","mergeOptions","mergeTarget","options","enabled","binarySearch","orderedItems","range","field","field2","maxIterations","iteration","found","low","high","newLow","newHigh","guess","isVisible","start","console","log","binarySearchGeneric","sidePreference","newGuess","prevValue","nextValue","__WEBPACK_AMD_DEFINE_RESULT__","global","dfl","defaultParsingFlags","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","deprecate","msg","fn","printMsg","suppressDeprecationWarnings","warn","firstTime","apply","padToken","func","count","leftZeroFill","ordinalizeToken","period","lang","ordinal","Language","Moment","config","checkOverflow","Duration","duration","normalizedInput","normalizeObjectUnits","years","year","quarters","quarter","months","month","weeks","week","days","day","hours","hour","minutes","minute","seconds","second","milliseconds","millisecond","_milliseconds","_days","_months","_data","_bubble","cloneMoment","result","momentProperties","absRound","number","ceil","targetLength","forceSign","output","abs","sign","addOrSubtractDurationFromMoment","mom","isAdding","updateOffset","_d","setTime","rawSetter","rawGetter","rawMonthSetter","input","prototype","compareArrays","array1","array2","dontConvert","lengthDiff","diffs","toInt","normalizeUnits","units","lowered","toLowerCase","unitAliases","camelFunctions","inputObject","normalizedProp","makeList","setter","format","getter","method","_lang","results","utc","set","argumentForCoercion","coercedNumber","isFinite","daysInMonth","UTC","getUTCDate","weeksInYear","dow","doy","weekOfYear","daysInYear","isLeapYear","_a","_pf","MONTH","DATE","YEAR","HOUR","MINUTE","SECOND","MILLISECOND","_overflowDayOfYear","isValid","_isValid","getTime","_strict","normalizeLanguage","makeAs","model","_isUTC","zone","_offset","local","loadLang","values","abbr","languages","unloadLang","getLangDefinition","j","next","get","k","hasModule","slice","removeFormattingTokens","makeFormatFunction","formattingTokens","formatTokenFunctions","Function","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","lastIndex","getParseRegexForToken","token","strict","parseTokenOneDigit","parseTokenThreeDigits","parseTokenFourDigits","parseTokenOneToFourDigits","parseTokenSignedNumber","parseTokenSixDigits","parseTokenOneToSixDigits","parseTokenTwoDigits","parseTokenOneToThreeDigits","parseTokenWord","_l","_meridiemParse","parseTokenTimestampMs","parseTokenTimezone","parseTokenT","parseTokenDigits","parseTokenOneOrTwoDigits","parseTokenOrdinal","RegExp","regexpEscape","unescapeFormat","timezoneMinutesFromString","string","possibleTzMatches","tzChunk","parts","parseTimezoneChunker","addTimeToArrayFromToken","datePartArray","monthsParse","parseInt","_dayOfYear","parseTwoDigitYear","_isPm","isPM","parseFloat","_useUTC","_tzm","weekdaysParse","_w","invalidWeekday","dayOfYearFromWeekInfo","w","weekYear","weekday","temp","GG","W","E","_week","gg","dayOfYearFromWeeks","dayOfYear","dateFromConfig","date","currentDate","yearToUse","currentDateArray","makeUTCDate","getUTCMonth","makeDate","setUTCMinutes","getUTCMinutes","dateFromObject","_i","now","getUTCFullYear","getFullYear","getMonth","getDate","makeDateFromStringAndFormat","_f","ISO_8601","parseISO","parsedInput","tokens","skipped","stringLength","totalParsedInputLength","matched","p1","p2","p3","p4","makeDateFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","NaN","score","l","isoRegex","isoDates","isoTimes","makeDateFromString","createFromInputFallback","makeDateFromInput","aspNetJsonRegex","y","M","ms","setFullYear","setUTCFullYear","parseWeekday","language","substituteTimeAgo","withoutSuffix","isFuture","relativeTime","round","args","relativeTimeThresholds","dd","dm","dy","firstDayOfWeek","firstDayOfWeekOfYear","adjustedMoment","end","daysToDayOfWeek","add","daysToAdd","getUTCDay","makeMoment","invalid","preparse","pickBy","moments","res","dayOfMonth","unit","makeAccessor","keepTime","makeDurationGetter","name","makeDurationAsGetter","factor","makeGlobal","shouldDeprecate","ender","oldGlobalMoment","globalScope","VERSION","_isAMomentObject","aspNetTimeSpanJsonRegex","isoDurationRegex","isoFormat","unitMillisecondFactors","Milliseconds","Seconds","Minutes","Hours","Days","Months","Years","D","Q","DDD","dayofyear","isoweekday","isoweek","weekyear","isoweekyear","ordinalizeTokens","paddedTokens","MMM","monthsShort","MMMM","weekdaysMin","ddd","weekdaysShort","dddd","weekdays","isoWeek","YY","YYYY","YYYYY","YYYYYY","gggg","ggggg","isoWeekYear","GGGG","GGGGG","isoWeekday","meridiem","A","H","S","SS","SSS","SSSS","Z","ZZ","z","zoneAbbr","zz","zoneName","X","unix","lists","pop","DDDD","_monthsShort","monthName","regex","_monthsParse","_weekdays","_weekdaysShort","_weekdaysMin","weekdayName","_weekdaysParse","_longDateFormat","LT","L","LL","LLL","LLLL","val","charAt","isLower","_calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","_relativeTime","future","past","mm","hh","MM","yy","pastFuture","diff","_ordinal","postformat","_invalidDate","ret","parseIso","isDuration","inp","version","defaultFormat","relativeTimeThreshold","threshold","limit","_abbr","langData","obj","flags","parseZone","clone","isDSTShifted","parsingFlags","invalidAt","inputString","dur","subtract","asFloat","that","zoneDiff","startOf","from","time","humanize","fromNow","sod","isDST","getDay","endOf","isAfter","isBefore","isSame","offset","getTimezoneOffset","_changeInProgress","hasAlignedHourOffset","isoWeeksInYear","weekInfo","dates","isoWeeks","toJSON","data","withSuffix","difference","as","toIsoString","asSeconds","asMonths","require","noGlobal","webpackContext","req","webpackContextResolve","map","keys","resolve","webpackPolyfill","paths","children","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","removeChild","getSVGElement","svgContainer","shift","document","createElementNS","appendChild","getDOMElement","DOMContainer","createElement","drawPoint","x","group","point","drawPoints","style","setAttributeNS","size","drawBar","width","height","rect","_options","_fieldId","fieldId","_type","_subscribers","on","subscribers","subscribe","off","filter","unsubscribe","_trigger","params","senderId","concat","subscriber","addedIds","me","_addItem","columns","_getColumnNames","row","rows","getNumberOfRows","item","col","cols","getValue","update","updatedIds","addOrUpdate","_updateItem","ids","firstType","returnType","allowedValues","itemId","_getItem","order","_sort","_filterFields","_appendRow","getIds","getDataSet","mappedItems","filteredItem","sort","av","bv","remove","removedId","removedIds","_remove","clear","maxField","itemField","minField","distinct","fieldType","exists","types","raw","converted","JSON","stringify","dataTable","getNumberOfColumns","getColumnId","getColumnLabel","addRow","setValue","_ids","_onEvent","setData","viewOptions","getArguments","defaultFilter","dataSet","added","updated","removed","container","SyntaxError","containerElement","margin","defaultXCenter","defaultYCenter","xLabel","yLabel","zLabel","filterLabel","legendLabel","STYLE","DOT","showPerspective","showGrid","keepAspectRatio","showShadow","showGrayBottom","showTooltip","verticalRatio","animationInterval","animationPreload","camera","eye","dataPoints","colX","colY","colZ","colValue","colFilter","xMin","xStep","xMax","yMin","yStep","yMax","zMin","zStep","zMax","valueMin","valueMax","xBarWidth","yBarWidth","colorAxis","colorGrid","colorDot","colorDotBorder","setOptions","Emitter","_setScale","scale","xCenter","yCenter","zCenter","setArmLocation","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","ax","ay","az","cx","getCameraLocation","cy","cz","sinTx","sin","getCameraRotation","cosTx","cos","sinTy","cosTy","sinTz","cosTz","dx","dz","bx","by","ex","ey","ez","getArmLength","xcenter","frame","canvas","clientWidth","ycenter","_setBackgroundColor","backgroundColor","fill","stroke","strokeWidth","borderColor","borderWidth","borderStyle","BAR","BARCOLOR","BARSIZE","DOTLINE","DOTCOLOR","DOTSIZE","GRID","LINE","SURFACE","_getStyleNumber","styleName","_determineColumnIndexes","counter","column","getDistinctValues","distinctValues","getColumnRange","minMax","_dataInitialize","rawData","_onChange","dataFilter","setOnLoadCallback","redraw","withBars","defaultXBarWidth","dataX","defaultYBarWidth","dataY","xRange","defaultXMin","defaultXMax","defaultXStep","yRange","defaultYMin","defaultYMax","defaultYStep","zRange","defaultZMin","defaultZMax","defaultZStep","valueRange","defaultValueMin","defaultValueMax","_getDataPoints","sortNumber","dataMatrix","xIndex","yIndex","trans","screen","bottom","pointRight","pointTop","pointCross","hasChildNodes","firstChild","position","noCanvas","fontWeight","padding","innerHTML","onmousedown","_onMouseDown","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","onkeydown","setSize","_resizeCanvas","clientHeight","animationStart","slider","play","animationStop","stop","_resizeCenter","setCameraPosition","pos","horizontal","vertical","setArmRotation","distance","setArmLength","getCameraPosition","getArmRotation","_readData","_redrawFilter","animationAutoStart","cameraPosition","styleNumber","tooltip","showAnimationControls","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGrid","_redrawDataLine","_redrawDataBar","_redrawDataDot","_redrawInfo","_redrawLegend","ctx","getContext","clearRect","widthMin","widthMax","dotSize","right","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","fillStyle","closePath","gridLineLen","step","getCurrent","textAlign","textBaseline","fillText","label","visible","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","to","prettyStep","text","xText","yText","zText","xOffset","yOffset","xMin2d","xMax2d","gridLenX","gridLenY","textMargin","armAngle","V","R","G","B","C","Hi","cross","topSideVisible","zAvg","transBottom","dist","sortDepth","aDiff","bDiff","crossproduct","crossProduct","radius","arc","PI","surface","corners","xWidth","yWidth","surfaces","center","avg","transCenter","leftButtonDown","_onMouseUp","which","button","touchDown","startMouseX","getMouseX","startMouseY","getMouseY","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","diffX","diffY","horizontalNew","verticalNew","snapAngle","snapValue","parameters","emit","delay","mouseX","mouseY","tooltipTimeout","clearTimeout","_hideTooltip","dataPoint","_dataPointFromXY","_showTooltip","setTimeout","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","delta","wheelDelta","detail","oldLength","newLength","_insideTriangle","triangle","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","sqrt","content","line","dot","dom","borderRadius","boxShadow","borderLeft","contentWidth","offsetWidth","contentHeight","offsetHeight","lineHeight","dotWidth","dotHeight","clientX","targetTouches","clientY","mixin","_callbacks","once","self","removeListener","removeAllListeners","callbacks","cb","listeners","hasListeners","sub","sum","armLocation","armRotation","armLength","cameraLocation","cameraRotation","calculateCameraOrientation","rot","graph","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","dataView","progress","prev","bar","MozBorderRadius","slide","onclick","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","setIndex","playNext","interval","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","_start","_end","_step","precision","_current","setRange","setStep","calculatePrettyStep","log10","LN10","step1","pow","step2","step5","toPrecision","getStep","defaultOptions","autoResize","orientation","maxHeight","minHeight","_create","body","domProps","emitter","bind","snap","toScreen","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","timeAxis","currentTime","customTime","itemSet","itemsData","groupsData","setItems","Core","newDataSet","initialLoad","fit","setWindow","setGroups","groups","setSelection","focus","getSelection","itemData","middle","getItemRange","dataset","minItem","maxStartItem","maxEndItem","setup","Hammer","READY","Event","determineEventTypes","Utils","each","gestures","gesture","Detection","register","onTouch","DOCUMENT","EVENT_MOVE","detect","EVENT_END","Instance","defaults","behavior","userSelect","touchAction","touchCallout","contentZooming","userDrag","tapHighlightColor","HAS_POINTEREVENTS","pointerEnabled","msPointerEnabled","HAS_TOUCHEVENTS","IS_MOBILE","NO_MOUSEEVENTS","CALCULATE_INTERVAL","EVENT_TYPES","DIRECTION_DOWN","DIRECTION_LEFT","DIRECTION_UP","DIRECTION_RIGHT","POINTER_MOUSE","POINTER_TOUCH","POINTER_PEN","EVENT_START","EVENT_RELEASE","EVENT_TOUCH","plugins","utils","dest","src","merge","handler","iterator","context","inStr","find","inArray","hasParent","node","parent","getCenter","touches","pageX","pageY","touch","getVelocity","deltaTime","deltaX","deltaY","getAngle","touch1","touch2","atan2","getDirection","getDistance","getScale","getRotation","isVertical","direction","setPrefixedCss","toggle","prefixes","toCamelCase","toggleBehavior","falseFn","onselectstart","ondragstart","str","preventMouseEvents","started","shouldDetect","hook","eventType","onTouchHandler","ev","triggerType","srcType","isPointer","isMouse","buttons","PointerEvent","matchType","updatePointer","doDetect","reset","touchList","getTouchList","touchListLength","triggerChange","trigger","changedLength","changedTouches","evData","collectEventData","identifiers","identifier","pointerType","timeStamp","srcEvent","preventManipulation","stopPropagation","stopDetect","pointers","touchlist","pointer","pointerEvent","pointerId","pt","MSPOINTER_TYPE_MOUSE","MSPOINTER_TYPE_TOUCH","MSPOINTER_TYPE_PEN","detection","current","previous","stopped","startDetect","inst","eventData","startEvent","lastEvent","lastCalcEvent","futureCalcEvent","lastCalcData","extendEventData","instOptions","getCalculatedData","cur","recalc","calcEv","calcData","velocity","angle","velocityX","velocityY","interimAngle","interimDirection","startEv","lastEv","rotation","eventStartHandler","eventHandlers","createEvent","initEvent","dispatchEvent","enable","state","dispose","eh","dragGesture","dragMaxTouches","triggered","dragMinDistance","startCenter","dragDistanceCorrection","dragLockToAxis","dragLockMinDistance","lastDirection","dragBlockVertical","dragBlockHorizontal","Drag","Gesture","holdGesture","timer","holdTimeout","holdThreshold","Hold","Release","Infinity","Swipe","swipeMinTouches","swipeMaxTouches","swipeVelocityX","swipeVelocityY","tapGesture","sincePrev","didDoubleTap","hasMoved","tapMaxDistance","tapMaxTime","doubleTapInterval","doubleTapDistance","tapAlways","Tap","Touch","preventMouse","transformGesture","scaleThreshold","rotationThreshold","transformMinScale","transformMinRotation","Transform","moveable","zoomable","zoomMin","zoomMax","_onDragStart","_onDrag","_onDragEnd","_onHold","_onMouseWheel","_onTouch","_onPinch","validateDirection","getPointer","hammerUtil","changed","_applyRange","newStart","newEnd","getRange","conversion","allowDragging","diffRange","fakeGesture","pointerDate","_pointerToDate","zoom","initDate","move","destroy","_isResized","resized","_previousWidth","_previousHeight","Activator","backgroundVertical","backgroundHorizontal","centerContainer","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","prevent_default","events","isActive","scrollTop","scrollTopMin","clickToUse","activator","_initAutoResize","component","active","_stopAutoResize","setCustomTime","getCustomTime","getVisibleItems","what","dataRange","getWindow","borderRootHeight","borderRootWidth","autoHeight","containerHeight","centerWidth","_updateScrollTop","visibilityTop","visibilityBottom","visibility","repaint","_startAutoResize","_onResize","lastWidth","lastHeight","watchTimer","setInterval","initialScrollTop","oldScrollTop","_getScrollTop","newScrollTop","_setScrollTop","foreground","majorLines","majorTexts","minorLines","minorTexts","minimumStep","lineTop","showMinorLabels","showMajorLabels","locale","parentChanged","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineHeight","minorLineWidth","majorLineHeight","majorLineWidth","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","insertBefore","minorCharWidth","first","xFirstMajorLabel","hasNext","isMajor","_repaintMinorText","getLabelMinor","_repaintMajorText","getLabelMajor","_repaintMajorLine","_repaintMinorLine","leftTime","leftText","widthText","majorCharWidth","arr","createTextNode","childNodes","nodeValue","measureCharMinor","measureCharMajor","autoScale","SCALE","DAY","WEEKDAY","setMinimumStep","roundToMinor","setMonth","setDate","setHours","setMinutes","setSeconds","setMilliseconds","getMilliseconds","getSeconds","getMinutes","getHours","setScale","newScale","newStep","setAutoScale","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","showCurrentTime","locales","title","currentTimeTimer","custom","showCustomTime","eventParams","drag","dragging","align","groupOrder","selectable","editable","updateTime","updateGroup","onAdd","onUpdate","onMove","onRemove","axis","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","selection","stackDirty","touchParams","_moveToGroup","groupId","oldGroup","UNGROUPED","box","labelSet","_updateUngrouped","_onSelectItem","_onMultiSelectItem","_onAddItem","show","addCallback","markDirty","hide","ii","unselect","select","rawVisibleItems","visibleItems","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","restack","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","offsetTop","offsetLeft","firstGroupIndex","firstGroupId","ungrouped","getLabelSet","oldItemsData","getItems","_order","getGroups","removeItem","_removeItem","groupData","groupOptions","oldGroupId","displayed","_constructByEndArray","endArray","itemFromTarget","selected","dragLeftItem","dragRightItem","itemProps","groupFromTarget","changes","ctrlKey","shiftKey","oldSelection","newSelection","xAbs","newItem","itemSetFromTarget","byStart","byEnd","inner","marker","Element","getLabelWidth","_updateVisibleItems","markerHeight","lastMarkerHeight","dirty","nostack","repositionY","setParent","_checkIfVisible","removeFromDataSet","orderByStart","orderByEnd","initialPosByStart","newVisibleItems","initialPosByEnd","_checkIfInvisible","repositionX","EPSILON","aTime","bTime","force","iMax","collidingItem","jj","collision","baseClassName","getComputedStyle","_repaintDeleteButton","_repaintDragLeft","_repaintDragRight","contentLeft","parentWidth","boxWidth","dragLeft","dragRight","anchor","deleteButton","itemSetHeight","marginLeft","overlay","_onTapOverlay","windowHammer","_hasParent","deactivate","escListener","mousetrap","activate","display","unbind","_addEvent","_characterFromEvent","fromCharCode","_MAP","_KEYCODE_MAP","_stop","tag_name","tagName","contentEditable","_modifiersMatch","modifiers1","modifiers2","_resetSequences","do_not_reset","active_sequences","_sequence_levels","_inside_sequence","_getMatches","character","modifiers","combination","matches","_isModifier","seq","level","combo","_eventModifiers","altKey","metaKey","_fireCallback","cancelBubble","_handleCharacter","processed_sequence_callback","_handleKey","keyCode","_ignore_next_keyup","_resetSequenceTimer","_reset_timer","_getReverseMap","_REVERSE_MAP","_pickBestAction","_bindSequence","_increaseSequence","_callbackAndReset","_bindSingle","sequence_name","sequence","_SPECIAL_ALIASES","_SHIFT_MAP","_bindMultiple","combinations",8,9,13,16,17,18,20,27,32,33,34,35,36,37,38,39,40,45,46,91,93,224,106,107,109,110,111,186,187,188,189,190,191,192,219,220,221,222,"~","!","@","#","$","%","^","&","*","(",")","_","+",":","\"","<",">","?","|","command","return","escape","_direct_map","linegraph","getLegend","isGroupVisible","yAxisOrientation","defaultGroup","sampling","graphHeight","shaded","barChart","handleOverlap","catmullRom","parametrization","alpha","dataAxis","icons","customRange","legend","abortedGraphUpdate","lastStart","svgElements","groupsUsingDefaultStyles","rangePerPixelInv","svg","_updateGraph","yAxisLeft","yAxisRight","legendLeft","legendRight","_updateAllGroupData","_updateGroup","removeGroup","addGroup","groupsContent","ungroupedCounter","preprocessedGroupData","processedGroupData","groupRanges","changeCalled","minDate","maxDate","_getRelevantData","_convertXcoordinates","_getYRanges","_updateYAxis","_convertYcoordinates","_drawLineGraph","_drawBarGraphs","dataContainer","_applySampling","increment","amountOfPoints","xDistance","pointsPerPixel","sampledData","barCombinedData","barCombinedDataLeft","barCombinedDataRight","ignore","intersections","_getDataIntersections","_getStackedBarYRange","combinedData","accumulated","xpos","minVal","maxVal","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","_toggleAxisVisiblity","drawIcons","master","lineOffset","stepPixelsForced","stepPixels","axisUsed","coreDistance","drawData","barPoints","minWidth","heightOffset","_getSafeDrawData","nextKey","amount","resolved","prevKey","zeroPosition","path","svgHeight","_catmullRom","_linear","dFill","fillPath","_drawPoints","datapoints","xValue","yValue","extractedData","convertValue","setZeroPosition","_catmullRomUniform","p0","bp1","bp2","normalization","d1","d2","d3","N","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","linegraphOptions","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","linegraphSVG","DOMelements","lines","labels","conversionFactor","amountOfGroups","graphOptions","lineContainer","_redrawGroupIcons","iconHeight","iconOffset","drawIcon","activeGroups","_redrawLabels","deadSpace","marginRange","amountOfSteps","stepDifference","valueAtZero","marginEnd","marginStartPos","maxLabelSize","_redrawLabel","_redrawLine","invertedValue","convertedValue","characterHeight","largestWidth","textMinor","textMajor","stepIndex","marginStart","majorSteps","minorSteps","setFirst","safeSize","minimumStepValue","orderOfMagnitude","minorStepIdx","magnitudefactor","solutionFound","stepSize","niceStart","niceEnd","rounded","usingDefaultStyle","SVGcontainer","fillHeight","outline","barWidth","bar1Height","bar2Height","icon","side","iconSize","iconSpacing","textArea","drawLegendIcons","paddingTop","_initializeMixinLoaders","renderRefreshRate","renderTimestep","renderTime","maxPhysicsTicksPerRender","physicsDiscreteStepsize","initializing","triggerFunctions","edit","editEdge","connect","del","nodes","mass","radiusMin","radiusMax","shape","image","fixed","fontColor","fontSize","fontFace","highlightColor","edges","widthSelectionMultiplier","hoverWidth","fontFill","arrowScaleFactor","dash","gap","altLength","inheritColor","configurePhysics","physics","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","repulsion","nodeDistance","hierarchicalRepulsion","clustering","initialMaxNodes","clusterThreshold","reduceToNodes","chainThreshold","clusterEdgeThreshold","sectorThreshold","screenSizeThreshold","fontSizeMultiplier","maxFontSize","forceAmplification","distanceAmplification","edgeGrowth","nodeScaling","maxNodeSizeIncrements","activeAreaBoxSize","clusterLevelDifference","navigation","keyboard","speed","dataManipulation","initiallyVisible","hierarchicalLayout","levelSeparation","nodeSpacing","freezeForStabilization","smoothCurves","dynamic","roundness","dynamicSmoothCurves","maxVelocity","minVelocity","stabilize","stabilizationIterations","dragNetwork","dragNodes","hideEdgesOnDrag","hideNodesOnDrag","constants","hoverObj","controlNodesActive","images","setOnloadCallback","_redraw","xIncrement","yIncrement","zoomIncrement","_loadPhysicsSystem","_loadSectorSystem","_loadClusterSystem","_loadSelectionSystem","_loadHierarchySystem","_setTranslation","freezeSimulation","cachedFunctions","calculationNodes","calculationNodeIndices","nodeIndices","canvasTopLeft","canvasBottomRight","pointerPosition","areaCenter","previousScale","nodesData","edgesData","nodesListeners","_addNodes","_updateNodes","_removeNodes","edgesListeners","_addEdges","_updateEdges","_removeEdges","moving","_setupHierarchicalLayout","zoomExtent","startWithClustering","MixinLoader","_getScriptPath","scripts","getElementsByTagName","_getRange","minY","maxY","minX","maxX","nodeId","_findCenter","_centerNetwork","initialZoom","disableStart","zoomLevel","numberOfNodes","yDistance","xZoomLevel","yZoomLevel","_updateNodeIndexList","_clearNodeIndexList","idx","dotData","DOTToGraph","gephi","gephiData","parseGephi","_setNodes","_setEdges","_putDataInSector","_stabilize","onEdit","onEditEdge","onConnect","onDelete","editMode","newColorObj","groupname","_createKeyBinds","_loadNavigationControls","_loadManipulationSystem","_configureSmoothCurves","pinch","_onTap","_onDoubleTap","_onRelease","_onMouseMoveTitle","_moveUp","_yStopMoving","_moveDown","_moveLeft","_xStopMoving","_moveRight","_zoomIn","_stopZoom","_zoomOut","_createManipulatorBar","_deleteSelected","_getPointer","pinched","_getScale","_handleTouch","_handleDragStart","_getNodeAt","_getTranslation","isSelected","_selectObject","objectId","selectionObj","xFixed","yFixed","_handleOnDrag","_XconvertDOMtoCanvas","_XconvertCanvasToDOM","_YconvertDOMtoCanvas","_YconvertCanvasToDOM","_handleTap","_handleDoubleTap","_handleOnHold","_handleOnRelease","_zoom","scaleOld","preScaleDragPointer","DOMtoCanvas","scaleFrac","tx","ty","updateClustersDefault","postScaleDragPointer","canvasToDOM","popupObj","_checkHidePopup","checkShow","_checkShowPopup","popupTimer","edgeId","_getEdgeAt","_hoverObject","_blurObject","lastPopupNode","getTitle","isOverlappingWith","edge","connected","popup","setPosition","setText","oldNodesData","_updateSelection","_resetLevels","_updateCalculationNodes","_reconnectEdges","_updateValueRange","updateLabels","setProperties","properties","oldEdgesData","oldEdge","disconnect","showInternalIds","_createBezierNodes","via","sectors","setValueRange","save","translate","_doInAllSectors","restore","offsetX","offsetY","_drawNodes","alwaysShow","setScaleAndPos","inArea","draw","sMax","_drawEdges","_drawControlNodes","_freezeDefinedNodes","_physicsTick","_restoreFrozenNodes","iterations","fixedData","_isMoving","vmin","isMoving","_discreteStepNodes","checkMovement","nodesPresent","discreteStepLimited","discreteStep","vminCorrected","_doInAllActiveSectors","_doInSupportSector","_animationStep","_handleNavigation","calculationTime","maxSteps","timeRequired","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","ua","requiresTimeout","toggleFreeze","parentEdgeId","internalMultiplier","positionBezierNode","storePosition","dataArray","allowedToMoveX","allowedToMoveY","focusOnNode","nodePosition","requiredScale","canvasCenter","distanceFromCenter","parseDOT","parseGraph","nextPreview","isAlphaNumeric","regexAlphaNumeric","o","addNode","graphs","attr","addEdge","createEdge","getToken","tokenType","TOKENTYPE","NULL","isComment","DELIMITER","c2","DELIMITERS","IDENTIFIER","newSyntaxError","UNKNOWN","chop","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","message","maxLength","forEach2","elem1","elem2","convertEdge","dotEdge","graphEdge","graphData","dotNode","graphNode","subEdge","{","}","[","]",";","=",",","->","--","gephiJSON","allowedToMove","gEdges","gNodes","gEdge","source","attributes","gNode","defaultIndex","DEFAULT","load","url","img","Image","onload","imagelist","grouplist","networkConstants","dynamicEdges","reroutedEdges","fontDrawThreshold","horizontalAlignLeft","verticalAlignTop","baseRadiusValue","radiusFixed","preassignedLevel","fx","fy","vx","vy","resetCluster","dynamicEdgesLength","clusterSession","clusterSizeWidthFactor","clusterSizeHeightFactor","clusterSizeRadiusFactor","growthIndicator","networkScaleInv","networkScale","formationScale","clusterSize","containedNodes","containedEdges","clusterSessions","attachEdge","detachEdge","originalLabel","triggerFunction","groupObj","imageObj","_drawDatabase","resize","_resizeDatabase","_drawBox","_resizeBox","_drawCircle","_resizeCircle","_drawEllipse","_resizeEllipse","_drawImage","_resizeImage","_drawText","_resizeText","_drawDot","_resizeShape","_drawSquare","_drawTriangle","_drawTriangleDown","_drawStar","_reset","clearSizeCache","distanceToBorder","_setForce","_addForce","isFixed","globalAlpha","drawImage","_label","textSize","getTextSize","clusterLineWidth","selectionLineWidth","borderWidthSelected","roundRect","database","diameter","circle","defaultSize","ellipse","_drawShape","radiusMultiplier","baseline","labelUnderNode","lineCount","yLine","measureText","inView","clearVelocity","updateVelocity","massBeforeClustering","energyBefore","fromId","toId","widthSelected","originalFromId","originalToId","widthFixed","lengthFixed","controlNodesEnabled","controlNodes","positions","connectedNode","_drawLine","_drawArrow","_drawArrowCenter","_drawDashLine","xFrom","yFrom","xTo","yTo","xObj","yObj","_getDistanceToEdge","_getColor","colorObj","_getLineWidth","_line","midpointX","midpointY","_pointOnLine","_circle","_pointOnCircle","_getViaCoordinates","xVia","yVia","quadraticCurveTo","fillRect","mozDash","setLineDash","pattern","lineDashOffset","mozDashOffset","lineCap","dashedLine","percentage","arrow","edgeSegmentLength","fromBorderDist","fromBorderPoint","toBorderDist","toBorderPoint","x1","y1","x2","y2","x3","y3","lastX","lastY","minDistance","_getDistanceToLine","px","py","something","u","nodeIdFrom","nodeIdTo","getControlNodePositions","_enableControlNodes","_disableControlNodes","_getSelectedControlNode","fromDistance","toDistance","_restoreControlNodes","styleAttr","fontFamily","WebkitBorderRadius","whiteSpace","maxWidth","PhysicsMixin","ClusterMixin","SectorsMixin","SelectionMixin","ManipulationMixin","NavigationMixin","HierarchicalLayoutMixin","_loadMixin","sourceVariable","mixinFunction","_clearMixin","_loadSelectedForceSolver","_loadPhysicsConfiguration","hubThreshold","activeSector","drawingNode","blockConnectingEdgeSelection","forceAppendSelection","manipulationDiv","editModeDiv","closeDiv","_cleanNavigation","_loadNavigationElements","graphToggleSmoothCurves","graph_toggleSmooth","getElementById","graphRepositionNodes","showValueOfRange","repositionNodes","graphGenerateOptions","optionsSpecific","radioButton1","radioButton2","checked","backupConstants","optionsDiv","switchConfigurations","radioButton","querySelector","tableId","table","_restoreNodes","constantsVariableName","valueId","rangeValue","_overWriteGraphConstants","RepulsionMixin","HierarchialRepulsionMixin","BarnesHutMixin","_toggleBarnesHut","barnesHutTree","_initializeForceCalculation","clusterToFit","_calculateForces","_calculateGravitationalForces","_calculateNodeForces","_calculateSpringForcesWithSupport","_calculateHierarchicalSpringForces","_calculateSpringForces","supportNodes","supportNodeId","gravity","gravityForce","_sector","edgeLength","springForce","combinedClusterSize","node1","node2","node3","_calculateSpringForce","physicsConfiguration","hierarchicalLayoutDirections","parentElement","rangeElement","radioButton3","graph_repositionNodes","graph_generateOptions","nameArray","repulsingForce","a_base","minimumDistance","steepness","springFx","springFy","totalFx","totalFy","correctionFx","correctionFy","nodeCount","_formBarnesHutTree","_getForceContribution","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","MAX_VALUE","sizeDiff","minimumTreeSize","rootSize","halfRootSize","centerX","centerY","_splitBranch","_placeInTree","_updateBranchMass","totalMass","totalMassInv","biggestSize","skipMassUpdate","_placeInRegion","region","containedNode","_insertRegion","childSize","_drawTree","_drawBranch","branch","maxNumberOfNodes","reposition","maxLevels","forceAggregateHubs","normalizeClusterLevels","increaseClusterLevel","openCluster","isMovingBeforeClustering","_nodeInActiveArea","_addSector","decreaseClusterLevel","_expandClusterNode","_updateDynamicEdges","updateClusters","zoomDirection","recursive","doNotStart","amountOfNodes","_collapseSector","_formClusters","_openClusters","_openClustersBySize","_aggregateHubs","handleChains","chainPercentage","_getChainFraction","_reduceAmountOfChains","_getHubSize","_formClustersByHub","openAll","containedNodeId","childNode","_expelChildFromParent","_unselectAll","_releaseContainedEdges","_connectEdgeBackToChild","_validateEdges","othersPresent","childNodeId","_repositionBezierNodes","_formClustersByZoom","_forceClustersByZoom","minLength","_addToCluster","_clusterToSmallestNeighbour","smallestNeighbour","smallestNeighbourNode","neighbour","onlyEqual","_formClusterFromHub","hubNode","absorptionSizeOffset","allowCluster","edgesIdarray","amountOfInitialEdges","_addToContainedEdges","_connectEdgeToCluster","_containCircularEdgesFromNode","massBefore","correction","edgeToId","edgeFromId","_addToReroutedEdges","maxLevel","minLevel","clusterLevel","targetLevel","average","averageSquared","hubCounter","largestHub","variance","standardDeviation","fraction","reduceAmount","chains","total","_switchToSector","sectorId","sectorType","_switchToActiveSector","_switchToFrozenSector","_switchToSupportSector","_loadLatestSector","_previousSector","_setActiveSector","newId","_forgetLastSector","_createNewSector","_deleteActiveSector","_deleteFrozenSector","_freezeSector","_activateSector","_mergeThisWithFrozen","_collapseThisToSingleCluster","sector","unqiueIdentifier","previousSector","runFunction","argument","_doInAllFrozenSectors","_drawSectorNodes","_drawAllSectorNodes","_getNodesOverlappingWith","overlappingNodes","_getAllNodesOverlappingWith","_pointerToPositionObject","positionObject","_getEdgesOverlappingWith","overlappingEdges","_getAllEdgesOverlappingWith","_addToSelection","_addToHover","_removeFromSelection","doNotTrigger","_unselectClusters","_getSelectedNodeCount","_getSelectedNode","_getSelectedEdge","_getSelectedEdgeCount","_getSelectedObjectCount","_selectionIsEmpty","_clusterInSelection","_selectConnectedEdges","_hoverConnectedEdges","_unselectConnectedEdges","append","highlightEdges","nodeIds","getSelectedNodes","edgeIds","getSelectedEdges","idArray","RangeError","selectNodes","selectEdges","_clearManipulatorBar","_restoreOverloadedFunctions","functionName","_toggleEditMode","toolbar","boundFunction","edgeBeingEdited","selectedControlNode","addNodeButton","_createAddNodeToolbar","addEdgeButton","_createAddEdgeToolbar","editButton","_editNode","_createEditEdgeToolbar","editModeButton","backButton","_addNode","_handleConnect","_finishConnect","_selectControlNode","_controlNodeDrag","_releaseControlNode","newNode","_editEdge","alert","smooth","connectFromId","_createEdge","defaultData","finalizedData","sourceNodeId","targetNodeId","selectedNodes","selectedEdges","wrapper","navigationDivs","navigationDivActions","_stopMovement","hubsize","definedLevel","undefinedLevel","_changeConstants","_determineLevels","distribution","_getDistribution","_placeNodesByHierarchy","minPos","_placeBranchNodes","maxCount","_setLevel","parentId","parentLevel","nodeMoved","back","editNode","addDescription","edgeDescription","editEdgeDescription","createEdgeError","deleteClusterError","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","n","r2d","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","wEllipse","hEllipse","ymb","yeb","xt","yt","xi","yi","xl","yl","xr","yr","dashArray","dashLength","dashCount","slope","distRemaining","dashIndex"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"vis.map","sources":["./dist/vis.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","util","DOMutil","DataSet","DataView","Graph3d","graph3d","Camera","Filter","Point2d","Point3d","Slider","StepNumber","Timeline","Graph2d","timeline","DataStep","Range","stack","TimeStep","components","items","Item","ItemBox","ItemPoint","ItemRange","Component","CurrentTime","CustomTime","DataAxis","GraphGroup","Group","ItemSet","Legend","LineGraph","TimeAxis","Network","network","Edge","Groups","Images","Node","Popup","dotparser","gephiParser","Graph","Error","moment","hammer","isNumber","object","Number","isString","String","isDate","Date","match","ASPDateRegex","exec","isNaN","parse","isDataTable","google","visualization","DataTable","randomUUID","S4","Math","floor","random","toString","extend","a","i","len","arguments","length","other","prop","hasOwnProperty","selectiveExtend","props","Array","isArray","selectiveDeepExtend","b","TypeError","constructor","Object","undefined","deepExtend","selectiveNotDeepExtend","indexOf","equalArray","convert","type","Boolean","valueOf","isMoment","toDate","getType","toISOString","value","getAbsoluteLeft","elem","getBoundingClientRect","left","window","pageXOffset","getAbsoluteTop","top","pageYOffset","addClassName","className","classes","split","push","join","removeClassName","index","splice","forEach","callback","toArray","array","updateProperty","key","addEventListener","element","action","listener","useCapture","navigator","userAgent","attachEvent","removeEventListener","detachEvent","preventDefault","event","returnValue","getTarget","target","srcElement","nodeType","parentNode","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","GiveDec","Hex","Value","eval","GiveHex","Dec","parseColor","color","isValidRGB","rgb","substr","RGBToHex","isValidHex","hsv","hexToHSV","lighterColorHSV","h","s","v","min","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","hexToRGB","hex","replace","toUpperCase","substring","d","e","f","r","g","red","green","blue","RGBToHSV","minRGB","maxRGB","max","hue","saturation","HSVToRGB","q","t","isOk","test","selectiveBridgeObject","fields","referenceObject","objectTo","create","bridgeObject","mergeOptions","mergeTarget","options","enabled","binarySearch","orderedItems","range","field","field2","maxIterations","iteration","found","low","high","newLow","newHigh","guess","isVisible","start","console","log","binarySearchGeneric","sidePreference","newGuess","prevValue","nextValue","__WEBPACK_AMD_DEFINE_RESULT__","global","dfl","defaultParsingFlags","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","deprecate","msg","fn","printMsg","suppressDeprecationWarnings","warn","firstTime","apply","padToken","func","count","leftZeroFill","ordinalizeToken","period","lang","ordinal","Language","Moment","config","checkOverflow","Duration","duration","normalizedInput","normalizeObjectUnits","years","year","quarters","quarter","months","month","weeks","week","days","day","hours","hour","minutes","minute","seconds","second","milliseconds","millisecond","_milliseconds","_days","_months","_data","_bubble","cloneMoment","result","momentProperties","absRound","number","ceil","targetLength","forceSign","output","abs","sign","addOrSubtractDurationFromMoment","mom","isAdding","updateOffset","_d","setTime","rawSetter","rawGetter","rawMonthSetter","input","prototype","compareArrays","array1","array2","dontConvert","lengthDiff","diffs","toInt","normalizeUnits","units","lowered","toLowerCase","unitAliases","camelFunctions","inputObject","normalizedProp","makeList","setter","format","getter","method","_lang","results","utc","set","argumentForCoercion","coercedNumber","isFinite","daysInMonth","UTC","getUTCDate","weeksInYear","dow","doy","weekOfYear","daysInYear","isLeapYear","_a","_pf","MONTH","DATE","YEAR","HOUR","MINUTE","SECOND","MILLISECOND","_overflowDayOfYear","isValid","_isValid","getTime","_strict","normalizeLanguage","makeAs","model","_isUTC","zone","_offset","local","loadLang","values","abbr","languages","unloadLang","getLangDefinition","j","next","get","k","hasModule","slice","removeFormattingTokens","makeFormatFunction","formattingTokens","formatTokenFunctions","Function","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","lastIndex","getParseRegexForToken","token","strict","parseTokenOneDigit","parseTokenThreeDigits","parseTokenFourDigits","parseTokenOneToFourDigits","parseTokenSignedNumber","parseTokenSixDigits","parseTokenOneToSixDigits","parseTokenTwoDigits","parseTokenOneToThreeDigits","parseTokenWord","_l","_meridiemParse","parseTokenTimestampMs","parseTokenTimezone","parseTokenT","parseTokenDigits","parseTokenOneOrTwoDigits","parseTokenOrdinal","RegExp","regexpEscape","unescapeFormat","timezoneMinutesFromString","string","possibleTzMatches","tzChunk","parts","parseTimezoneChunker","addTimeToArrayFromToken","datePartArray","monthsParse","parseInt","_dayOfYear","parseTwoDigitYear","_isPm","isPM","parseFloat","_useUTC","_tzm","weekdaysParse","_w","invalidWeekday","dayOfYearFromWeekInfo","w","weekYear","weekday","temp","GG","W","E","_week","gg","dayOfYearFromWeeks","dayOfYear","dateFromConfig","date","currentDate","yearToUse","currentDateArray","makeUTCDate","getUTCMonth","makeDate","setUTCMinutes","getUTCMinutes","dateFromObject","_i","now","getUTCFullYear","getFullYear","getMonth","getDate","makeDateFromStringAndFormat","_f","ISO_8601","parseISO","parsedInput","tokens","skipped","stringLength","totalParsedInputLength","matched","p1","p2","p3","p4","makeDateFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","NaN","score","l","isoRegex","isoDates","isoTimes","makeDateFromString","createFromInputFallback","makeDateFromInput","aspNetJsonRegex","y","M","ms","setFullYear","setUTCFullYear","parseWeekday","language","substituteTimeAgo","withoutSuffix","isFuture","relativeTime","round","args","relativeTimeThresholds","dd","dm","dy","firstDayOfWeek","firstDayOfWeekOfYear","adjustedMoment","end","daysToDayOfWeek","add","daysToAdd","getUTCDay","makeMoment","invalid","preparse","pickBy","moments","res","dayOfMonth","unit","makeAccessor","keepTime","makeDurationGetter","name","makeDurationAsGetter","factor","makeGlobal","shouldDeprecate","ender","oldGlobalMoment","globalScope","VERSION","_isAMomentObject","aspNetTimeSpanJsonRegex","isoDurationRegex","isoFormat","unitMillisecondFactors","Milliseconds","Seconds","Minutes","Hours","Days","Months","Years","D","Q","DDD","dayofyear","isoweekday","isoweek","weekyear","isoweekyear","ordinalizeTokens","paddedTokens","MMM","monthsShort","MMMM","weekdaysMin","ddd","weekdaysShort","dddd","weekdays","isoWeek","YY","YYYY","YYYYY","YYYYYY","gggg","ggggg","isoWeekYear","GGGG","GGGGG","isoWeekday","meridiem","A","H","S","SS","SSS","SSSS","Z","ZZ","z","zoneAbbr","zz","zoneName","X","unix","lists","pop","DDDD","_monthsShort","monthName","regex","_monthsParse","_weekdays","_weekdaysShort","_weekdaysMin","weekdayName","_weekdaysParse","_longDateFormat","LT","L","LL","LLL","LLLL","val","charAt","isLower","_calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","_relativeTime","future","past","mm","hh","MM","yy","pastFuture","diff","_ordinal","postformat","_invalidDate","ret","parseIso","isDuration","inp","version","defaultFormat","relativeTimeThreshold","threshold","limit","_abbr","langData","obj","flags","parseZone","clone","isDSTShifted","parsingFlags","invalidAt","inputString","dur","subtract","asFloat","that","zoneDiff","startOf","from","time","humanize","fromNow","sod","isDST","getDay","endOf","isAfter","isBefore","isSame","offset","getTimezoneOffset","_changeInProgress","hasAlignedHourOffset","isoWeeksInYear","weekInfo","dates","isoWeeks","toJSON","data","withSuffix","difference","as","toIsoString","asSeconds","asMonths","require","noGlobal","webpackContext","req","webpackContextResolve","map","keys","resolve","webpackPolyfill","paths","children","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","removeChild","getSVGElement","svgContainer","shift","document","createElementNS","appendChild","getDOMElement","DOMContainer","createElement","drawPoint","x","group","point","drawPoints","style","setAttributeNS","size","drawBar","width","height","rect","_options","_fieldId","fieldId","_type","_subscribers","on","subscribers","subscribe","off","filter","unsubscribe","_trigger","params","senderId","concat","subscriber","addedIds","me","_addItem","columns","_getColumnNames","row","rows","getNumberOfRows","item","col","cols","getValue","update","updatedIds","addOrUpdate","_updateItem","ids","firstType","returnType","allowedValues","itemId","_getItem","order","_sort","_filterFields","_appendRow","getIds","getDataSet","mappedItems","filteredItem","sort","av","bv","remove","removedId","removedIds","_remove","clear","maxField","itemField","minField","distinct","fieldType","exists","types","raw","converted","JSON","stringify","dataTable","getNumberOfColumns","getColumnId","getColumnLabel","addRow","setValue","_ids","_onEvent","setData","viewOptions","getArguments","defaultFilter","dataSet","added","updated","removed","container","SyntaxError","containerElement","margin","defaultXCenter","defaultYCenter","xLabel","yLabel","zLabel","filterLabel","legendLabel","STYLE","DOT","showPerspective","showGrid","keepAspectRatio","showShadow","showGrayBottom","showTooltip","verticalRatio","animationInterval","animationPreload","camera","eye","dataPoints","colX","colY","colZ","colValue","colFilter","xMin","xStep","xMax","yMin","yStep","yMax","zMin","zStep","zMax","valueMin","valueMax","xBarWidth","yBarWidth","colorAxis","colorGrid","colorDot","colorDotBorder","setOptions","Emitter","_setScale","scale","xCenter","yCenter","zCenter","setArmLocation","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","ax","ay","az","cx","getCameraLocation","cy","cz","sinTx","sin","getCameraRotation","cosTx","cos","sinTy","cosTy","sinTz","cosTz","dx","dz","bx","by","ex","ey","ez","getArmLength","xcenter","frame","canvas","clientWidth","ycenter","_setBackgroundColor","backgroundColor","fill","stroke","strokeWidth","borderColor","borderWidth","borderStyle","BAR","BARCOLOR","BARSIZE","DOTLINE","DOTCOLOR","DOTSIZE","GRID","LINE","SURFACE","_getStyleNumber","styleName","_determineColumnIndexes","counter","column","getDistinctValues","distinctValues","getColumnRange","minMax","_dataInitialize","rawData","_onChange","dataFilter","setOnLoadCallback","redraw","withBars","defaultXBarWidth","dataX","defaultYBarWidth","dataY","xRange","defaultXMin","defaultXMax","defaultXStep","yRange","defaultYMin","defaultYMax","defaultYStep","zRange","defaultZMin","defaultZMax","defaultZStep","valueRange","defaultValueMin","defaultValueMax","_getDataPoints","sortNumber","dataMatrix","xIndex","yIndex","trans","screen","bottom","pointRight","pointTop","pointCross","hasChildNodes","firstChild","position","noCanvas","fontWeight","padding","innerHTML","onmousedown","_onMouseDown","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","onkeydown","setSize","_resizeCanvas","clientHeight","animationStart","slider","play","animationStop","stop","_resizeCenter","setCameraPosition","pos","horizontal","vertical","setArmRotation","distance","setArmLength","getCameraPosition","getArmRotation","_readData","_redrawFilter","animationAutoStart","cameraPosition","styleNumber","tooltip","showAnimationControls","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGrid","_redrawDataLine","_redrawDataBar","_redrawDataDot","_redrawInfo","_redrawLegend","ctx","getContext","clearRect","widthMin","widthMax","dotSize","right","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","fillStyle","closePath","gridLineLen","step","getCurrent","textAlign","textBaseline","fillText","label","visible","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","to","prettyStep","text","xText","yText","zText","xOffset","yOffset","xMin2d","xMax2d","gridLenX","gridLenY","textMargin","armAngle","V","R","G","B","C","Hi","cross","topSideVisible","zAvg","transBottom","dist","sortDepth","aDiff","bDiff","crossproduct","crossProduct","radius","arc","PI","surface","corners","xWidth","yWidth","surfaces","center","avg","transCenter","leftButtonDown","_onMouseUp","which","button","touchDown","startMouseX","getMouseX","startMouseY","getMouseY","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","diffX","diffY","horizontalNew","verticalNew","snapAngle","snapValue","parameters","emit","delay","mouseX","mouseY","tooltipTimeout","clearTimeout","_hideTooltip","dataPoint","_dataPointFromXY","_showTooltip","setTimeout","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","delta","wheelDelta","detail","oldLength","newLength","_insideTriangle","triangle","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","sqrt","content","line","dot","dom","borderRadius","boxShadow","borderLeft","contentWidth","offsetWidth","contentHeight","offsetHeight","lineHeight","dotWidth","dotHeight","clientX","targetTouches","clientY","mixin","_callbacks","once","self","removeListener","removeAllListeners","callbacks","cb","listeners","hasListeners","sub","sum","armLocation","armRotation","armLength","cameraLocation","cameraRotation","calculateCameraOrientation","rot","graph","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","dataView","progress","prev","bar","MozBorderRadius","slide","onclick","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","setIndex","playNext","interval","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","_start","_end","_step","precision","_current","setRange","setStep","calculatePrettyStep","log10","LN10","step1","pow","step2","step5","toPrecision","getStep","defaultOptions","autoResize","orientation","maxHeight","minHeight","_create","body","domProps","emitter","bind","snap","toScreen","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","timeAxis","currentTime","customTime","itemSet","itemsData","groupsData","setItems","Core","newDataSet","initialLoad","fit","setWindow","setGroups","groups","setSelection","focus","getSelection","itemData","middle","getItemRange","dataset","minItem","maxStartItem","maxEndItem","setup","Hammer","READY","Event","determineEventTypes","Utils","each","gestures","gesture","Detection","register","onTouch","DOCUMENT","EVENT_MOVE","detect","EVENT_END","Instance","defaults","behavior","userSelect","touchAction","touchCallout","contentZooming","userDrag","tapHighlightColor","HAS_POINTEREVENTS","pointerEnabled","msPointerEnabled","HAS_TOUCHEVENTS","IS_MOBILE","NO_MOUSEEVENTS","CALCULATE_INTERVAL","EVENT_TYPES","DIRECTION_DOWN","DIRECTION_LEFT","DIRECTION_UP","DIRECTION_RIGHT","POINTER_MOUSE","POINTER_TOUCH","POINTER_PEN","EVENT_START","EVENT_RELEASE","EVENT_TOUCH","plugins","utils","dest","src","merge","handler","iterator","context","inStr","find","inArray","hasParent","node","parent","getCenter","touches","pageX","pageY","touch","getVelocity","deltaTime","deltaX","deltaY","getAngle","touch1","touch2","atan2","getDirection","getDistance","getScale","getRotation","isVertical","direction","setPrefixedCss","toggle","prefixes","toCamelCase","toggleBehavior","falseFn","onselectstart","ondragstart","str","preventMouseEvents","started","shouldDetect","hook","eventType","onTouchHandler","ev","triggerType","srcType","isPointer","isMouse","buttons","PointerEvent","matchType","updatePointer","doDetect","reset","touchList","getTouchList","touchListLength","triggerChange","trigger","changedLength","changedTouches","evData","collectEventData","identifiers","identifier","pointerType","timeStamp","srcEvent","preventManipulation","stopPropagation","stopDetect","pointers","touchlist","pointer","pointerEvent","pointerId","pt","MSPOINTER_TYPE_MOUSE","MSPOINTER_TYPE_TOUCH","MSPOINTER_TYPE_PEN","detection","current","previous","stopped","startDetect","inst","eventData","startEvent","lastEvent","lastCalcEvent","futureCalcEvent","lastCalcData","extendEventData","instOptions","getCalculatedData","cur","recalc","calcEv","calcData","velocity","angle","velocityX","velocityY","interimAngle","interimDirection","startEv","lastEv","rotation","eventStartHandler","eventHandlers","createEvent","initEvent","dispatchEvent","enable","state","dispose","eh","dragGesture","dragMaxTouches","triggered","dragMinDistance","startCenter","dragDistanceCorrection","dragLockToAxis","dragLockMinDistance","lastDirection","dragBlockVertical","dragBlockHorizontal","Drag","Gesture","holdGesture","timer","holdTimeout","holdThreshold","Hold","Release","Infinity","Swipe","swipeMinTouches","swipeMaxTouches","swipeVelocityX","swipeVelocityY","tapGesture","sincePrev","didDoubleTap","hasMoved","tapMaxDistance","tapMaxTime","doubleTapInterval","doubleTapDistance","tapAlways","Tap","Touch","preventMouse","transformGesture","scaleThreshold","rotationThreshold","transformMinScale","transformMinRotation","Transform","moveable","zoomable","zoomMin","zoomMax","_onDragStart","_onDrag","_onDragEnd","_onHold","_onMouseWheel","_onTouch","_onPinch","validateDirection","getPointer","hammerUtil","changed","_applyRange","newStart","newEnd","getRange","conversion","allowDragging","diffRange","fakeGesture","pointerDate","_pointerToDate","zoom","initDate","move","destroy","_isResized","resized","_previousWidth","_previousHeight","Activator","backgroundVertical","backgroundHorizontal","centerContainer","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","prevent_default","events","isActive","scrollTop","scrollTopMin","clickToUse","activator","_initAutoResize","component","active","_stopAutoResize","setCustomTime","getCustomTime","getVisibleItems","what","dataRange","getWindow","borderRootHeight","borderRootWidth","autoHeight","containerHeight","centerWidth","_updateScrollTop","visibilityTop","visibilityBottom","visibility","repaint","_startAutoResize","_onResize","lastWidth","lastHeight","watchTimer","setInterval","initialScrollTop","oldScrollTop","_getScrollTop","newScrollTop","_setScrollTop","foreground","majorLines","majorTexts","minorLines","minorTexts","minimumStep","lineTop","showMinorLabels","showMajorLabels","locale","parentChanged","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineHeight","minorLineWidth","majorLineHeight","majorLineWidth","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","insertBefore","minorCharWidth","first","xFirstMajorLabel","hasNext","isMajor","_repaintMinorText","getLabelMinor","_repaintMajorText","getLabelMajor","_repaintMajorLine","_repaintMinorLine","leftTime","leftText","widthText","majorCharWidth","arr","createTextNode","childNodes","nodeValue","measureCharMinor","measureCharMajor","autoScale","SCALE","DAY","WEEKDAY","setMinimumStep","roundToMinor","setMonth","setDate","setHours","setMinutes","setSeconds","setMilliseconds","getMilliseconds","getSeconds","getMinutes","getHours","setScale","newScale","newStep","setAutoScale","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","showCurrentTime","locales","title","currentTimeTimer","custom","showCustomTime","eventParams","drag","dragging","align","groupOrder","selectable","editable","updateTime","updateGroup","onAdd","onUpdate","onMove","onRemove","axis","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","selection","stackDirty","touchParams","_moveToGroup","groupId","oldGroup","UNGROUPED","box","labelSet","_updateUngrouped","_onSelectItem","_onMultiSelectItem","_onAddItem","show","addCallback","markDirty","hide","ii","unselect","select","rawVisibleItems","visibleItems","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","restack","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","offsetTop","offsetLeft","firstGroupIndex","firstGroupId","ungrouped","getLabelSet","oldItemsData","getItems","_order","getGroups","removeItem","_removeItem","groupData","groupOptions","oldGroupId","displayed","_constructByEndArray","endArray","itemFromTarget","selected","dragLeftItem","dragRightItem","itemProps","groupFromTarget","changes","ctrlKey","shiftKey","oldSelection","newSelection","xAbs","newItem","itemSetFromTarget","byStart","byEnd","inner","marker","Element","getLabelWidth","_updateVisibleItems","markerHeight","lastMarkerHeight","dirty","nostack","repositionY","setParent","_checkIfVisible","removeFromDataSet","orderByStart","orderByEnd","initialPosByStart","newVisibleItems","initialPosByEnd","_checkIfInvisible","repositionX","EPSILON","aTime","bTime","force","iMax","collidingItem","jj","collision","baseClassName","getComputedStyle","_repaintDeleteButton","_repaintDragLeft","_repaintDragRight","contentLeft","parentWidth","boxWidth","dragLeft","dragRight","anchor","deleteButton","itemSetHeight","marginLeft","overlay","_onTapOverlay","windowHammer","_hasParent","deactivate","escListener","mousetrap","activate","display","unbind","_addEvent","_characterFromEvent","fromCharCode","_MAP","_KEYCODE_MAP","_stop","tag_name","tagName","contentEditable","_modifiersMatch","modifiers1","modifiers2","_resetSequences","do_not_reset","active_sequences","_sequence_levels","_inside_sequence","_getMatches","character","modifiers","combination","matches","_isModifier","seq","level","combo","_eventModifiers","altKey","metaKey","_fireCallback","cancelBubble","_handleCharacter","processed_sequence_callback","_handleKey","keyCode","_ignore_next_keyup","_resetSequenceTimer","_reset_timer","_getReverseMap","_REVERSE_MAP","_pickBestAction","_bindSequence","_increaseSequence","_callbackAndReset","_bindSingle","sequence_name","sequence","_SPECIAL_ALIASES","_SHIFT_MAP","_bindMultiple","combinations",8,9,13,16,17,18,20,27,32,33,34,35,36,37,38,39,40,45,46,91,93,224,106,107,109,110,111,186,187,188,189,190,191,192,219,220,221,222,"~","!","@","#","$","%","^","&","*","(",")","_","+",":","\"","<",">","?","|","command","return","escape","_direct_map","linegraph","getLegend","isGroupVisible","customRange","stepIndex","marginStart","marginEnd","deadSpace","majorSteps","minorSteps","setFirst","safeSize","minimumStepValue","orderOfMagnitude","minorStepIdx","magnitudefactor","solutionFound","stepSize","niceStart","niceEnd","marginRange","rounded","svg","linegraphOptions","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","linegraphSVG","DOMelements","lines","labels","conversionFactor","minWidth","stepPixels","stepPixelsForced","lineOffset","master","svgElements","amountOfGroups","addGroup","graphOptions","removeGroup","lineContainer","_redrawGroupIcons","iconHeight","iconOffset","drawIcon","changeCalled","activeGroups","_redrawLabels","amountOfSteps","stepDifference","valueAtZero","marginStartPos","maxLabelSize","_redrawLabel","_redrawLine","convertValue","invertedValue","convertedValue","characterHeight","largestWidth","textMinor","textMajor","groupsUsingDefaultStyles","usingDefaultStyle","zeroPosition","setZeroPosition","catmullRom","parametrization","alpha","SVGcontainer","path","fillPath","fillHeight","outline","shaded","barWidth","bar1Height","bar2Height","icon","yAxisOrientation","side","iconSize","iconSpacing","textArea","drawLegendIcons","paddingTop","defaultGroup","sampling","graphHeight","barChart","handleOverlap","dataAxis","legend","abortedGraphUpdate","lastStart","rangePerPixelInv","_updateGraph","yAxisLeft","yAxisRight","legendLeft","legendRight","_updateAllGroupData","_updateGroup","groupsContent","ungroupedCounter","preprocessedGroupData","processedGroupData","groupRanges","minDate","maxDate","_getRelevantData","_convertXcoordinates","_getYRanges","_updateYAxis","_convertYcoordinates","_drawLineGraph","_drawBarGraphs","dataContainer","_applySampling","increment","amountOfPoints","xDistance","pointsPerPixel","sampledData","barCombinedData","barCombinedDataLeft","barCombinedDataRight","ignore","intersections","_getDataIntersections","_getStackedBarYRange","combinedData","accumulated","xpos","minVal","maxVal","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","_toggleAxisVisiblity","drawIcons","axisUsed","coreDistance","drawData","barPoints","heightOffset","_getSafeDrawData","nextKey","amount","resolved","prevKey","svgHeight","_catmullRom","_linear","dFill","_drawPoints","datapoints","xValue","yValue","extractedData","_catmullRomUniform","p0","bp1","bp2","normalization","d1","d2","d3","N","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","_initializeMixinLoaders","renderRefreshRate","renderTimestep","renderTime","maxPhysicsTicksPerRender","physicsDiscreteStepsize","initializing","triggerFunctions","edit","editEdge","connect","del","nodes","mass","radiusMin","radiusMax","shape","image","fixed","fontColor","fontSize","fontFace","highlightColor","edges","widthSelectionMultiplier","hoverWidth","fontFill","arrowScaleFactor","dash","gap","altLength","inheritColor","configurePhysics","physics","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","repulsion","nodeDistance","hierarchicalRepulsion","clustering","initialMaxNodes","clusterThreshold","reduceToNodes","chainThreshold","clusterEdgeThreshold","sectorThreshold","screenSizeThreshold","fontSizeMultiplier","maxFontSize","forceAmplification","distanceAmplification","edgeGrowth","nodeScaling","maxNodeSizeIncrements","activeAreaBoxSize","clusterLevelDifference","navigation","keyboard","speed","dataManipulation","initiallyVisible","hierarchicalLayout","levelSeparation","nodeSpacing","freezeForStabilization","smoothCurves","dynamic","roundness","dynamicSmoothCurves","maxVelocity","minVelocity","stabilize","stabilizationIterations","dragNetwork","dragNodes","hideEdgesOnDrag","hideNodesOnDrag","constants","hoverObj","controlNodesActive","images","setOnloadCallback","_redraw","xIncrement","yIncrement","zoomIncrement","_loadPhysicsSystem","_loadSectorSystem","_loadClusterSystem","_loadSelectionSystem","_loadHierarchySystem","_setTranslation","freezeSimulation","cachedFunctions","calculationNodes","calculationNodeIndices","nodeIndices","canvasTopLeft","canvasBottomRight","pointerPosition","areaCenter","previousScale","nodesData","edgesData","nodesListeners","_addNodes","_updateNodes","_removeNodes","edgesListeners","_addEdges","_updateEdges","_removeEdges","moving","_setupHierarchicalLayout","zoomExtent","startWithClustering","MixinLoader","_getScriptPath","scripts","getElementsByTagName","_getRange","minY","maxY","minX","maxX","nodeId","_findCenter","_centerNetwork","initialZoom","disableStart","zoomLevel","numberOfNodes","yDistance","xZoomLevel","yZoomLevel","_updateNodeIndexList","_clearNodeIndexList","idx","dotData","DOTToGraph","gephi","gephiData","parseGephi","_setNodes","_setEdges","_putDataInSector","_stabilize","onEdit","onEditEdge","onConnect","onDelete","editMode","newColorObj","groupname","_createKeyBinds","_loadNavigationControls","_loadManipulationSystem","_configureSmoothCurves","pinch","_onTap","_onDoubleTap","_onRelease","_onMouseMoveTitle","_moveUp","_yStopMoving","_moveDown","_moveLeft","_xStopMoving","_moveRight","_zoomIn","_stopZoom","_zoomOut","_createManipulatorBar","_deleteSelected","_getPointer","pinched","_getScale","_handleTouch","_handleDragStart","_getNodeAt","_getTranslation","isSelected","_selectObject","objectId","selectionObj","xFixed","yFixed","_handleOnDrag","_XconvertDOMtoCanvas","_XconvertCanvasToDOM","_YconvertDOMtoCanvas","_YconvertCanvasToDOM","_handleTap","_handleDoubleTap","_handleOnHold","_handleOnRelease","_zoom","scaleOld","preScaleDragPointer","DOMtoCanvas","scaleFrac","tx","ty","updateClustersDefault","postScaleDragPointer","canvasToDOM","popupObj","_checkHidePopup","checkShow","_checkShowPopup","popupTimer","edgeId","_getEdgeAt","_hoverObject","_blurObject","lastPopupNode","getTitle","isOverlappingWith","edge","connected","popup","setPosition","setText","oldNodesData","_updateSelection","_resetLevels","_updateCalculationNodes","_reconnectEdges","_updateValueRange","updateLabels","setProperties","properties","oldEdgesData","oldEdge","disconnect","showInternalIds","_createBezierNodes","via","sectors","setValueRange","save","translate","_doInAllSectors","restore","offsetX","offsetY","_drawNodes","alwaysShow","setScaleAndPos","inArea","draw","sMax","_drawEdges","_drawControlNodes","_freezeDefinedNodes","_physicsTick","_restoreFrozenNodes","iterations","fixedData","_isMoving","vmin","isMoving","_discreteStepNodes","checkMovement","nodesPresent","discreteStepLimited","discreteStep","vminCorrected","_doInAllActiveSectors","_doInSupportSector","_animationStep","_handleNavigation","calculationTime","maxSteps","timeRequired","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","ua","requiresTimeout","toggleFreeze","parentEdgeId","internalMultiplier","positionBezierNode","storePosition","dataArray","allowedToMoveX","allowedToMoveY","focusOnNode","nodePosition","requiredScale","canvasCenter","distanceFromCenter","parseDOT","parseGraph","nextPreview","isAlphaNumeric","regexAlphaNumeric","o","addNode","graphs","attr","addEdge","createEdge","getToken","tokenType","TOKENTYPE","NULL","isComment","DELIMITER","c2","DELIMITERS","IDENTIFIER","newSyntaxError","UNKNOWN","chop","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","message","maxLength","forEach2","elem1","elem2","convertEdge","dotEdge","graphEdge","graphData","dotNode","graphNode","subEdge","{","}","[","]",";","=",",","->","--","gephiJSON","allowedToMove","gEdges","gNodes","gEdge","source","attributes","gNode","defaultIndex","DEFAULT","load","url","img","Image","onload","imagelist","grouplist","networkConstants","dynamicEdges","reroutedEdges","fontDrawThreshold","horizontalAlignLeft","verticalAlignTop","baseRadiusValue","radiusFixed","preassignedLevel","fx","fy","vx","vy","resetCluster","dynamicEdgesLength","clusterSession","clusterSizeWidthFactor","clusterSizeHeightFactor","clusterSizeRadiusFactor","growthIndicator","networkScaleInv","networkScale","formationScale","clusterSize","containedNodes","containedEdges","clusterSessions","attachEdge","detachEdge","originalLabel","triggerFunction","groupObj","imageObj","_drawDatabase","resize","_resizeDatabase","_drawBox","_resizeBox","_drawCircle","_resizeCircle","_drawEllipse","_resizeEllipse","_drawImage","_resizeImage","_drawText","_resizeText","_drawDot","_resizeShape","_drawSquare","_drawTriangle","_drawTriangleDown","_drawStar","_reset","clearSizeCache","distanceToBorder","_setForce","_addForce","isFixed","globalAlpha","drawImage","_label","textSize","getTextSize","clusterLineWidth","selectionLineWidth","borderWidthSelected","roundRect","database","diameter","circle","defaultSize","ellipse","_drawShape","radiusMultiplier","baseline","labelUnderNode","lineCount","yLine","measureText","inView","clearVelocity","updateVelocity","massBeforeClustering","energyBefore","fromId","toId","widthSelected","originalFromId","originalToId","widthFixed","lengthFixed","controlNodesEnabled","controlNodes","positions","connectedNode","_drawLine","_drawArrow","_drawArrowCenter","_drawDashLine","xFrom","yFrom","xTo","yTo","xObj","yObj","_getDistanceToEdge","_getColor","colorObj","_getLineWidth","_line","midpointX","midpointY","_pointOnLine","_circle","_pointOnCircle","_getViaCoordinates","xVia","yVia","quadraticCurveTo","fillRect","mozDash","setLineDash","pattern","lineDashOffset","mozDashOffset","lineCap","dashedLine","percentage","arrow","edgeSegmentLength","fromBorderDist","fromBorderPoint","toBorderDist","toBorderPoint","x1","y1","x2","y2","x3","y3","lastX","lastY","minDistance","_getDistanceToLine","px","py","something","u","nodeIdFrom","nodeIdTo","getControlNodePositions","_enableControlNodes","_disableControlNodes","_getSelectedControlNode","fromDistance","toDistance","_restoreControlNodes","styleAttr","fontFamily","WebkitBorderRadius","whiteSpace","maxWidth","PhysicsMixin","ClusterMixin","SectorsMixin","SelectionMixin","ManipulationMixin","NavigationMixin","HierarchicalLayoutMixin","_loadMixin","sourceVariable","mixinFunction","_clearMixin","_loadSelectedForceSolver","_loadPhysicsConfiguration","hubThreshold","activeSector","drawingNode","blockConnectingEdgeSelection","forceAppendSelection","manipulationDiv","editModeDiv","closeDiv","_cleanNavigation","_loadNavigationElements","graphToggleSmoothCurves","graph_toggleSmooth","getElementById","graphRepositionNodes","showValueOfRange","repositionNodes","graphGenerateOptions","optionsSpecific","radioButton1","radioButton2","checked","backupConstants","optionsDiv","switchConfigurations","radioButton","querySelector","tableId","table","_restoreNodes","constantsVariableName","valueId","rangeValue","_overWriteGraphConstants","RepulsionMixin","HierarchialRepulsionMixin","BarnesHutMixin","_toggleBarnesHut","barnesHutTree","_initializeForceCalculation","clusterToFit","_calculateForces","_calculateGravitationalForces","_calculateNodeForces","_calculateSpringForcesWithSupport","_calculateHierarchicalSpringForces","_calculateSpringForces","supportNodes","supportNodeId","gravity","gravityForce","_sector","edgeLength","springForce","combinedClusterSize","node1","node2","node3","_calculateSpringForce","physicsConfiguration","hierarchicalLayoutDirections","parentElement","rangeElement","radioButton3","graph_repositionNodes","graph_generateOptions","nameArray","repulsingForce","a_base","minimumDistance","steepness","springFx","springFy","totalFx","totalFy","correctionFx","correctionFy","nodeCount","_formBarnesHutTree","_getForceContribution","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","MAX_VALUE","sizeDiff","minimumTreeSize","rootSize","halfRootSize","centerX","centerY","_splitBranch","_placeInTree","_updateBranchMass","totalMass","totalMassInv","biggestSize","skipMassUpdate","_placeInRegion","region","containedNode","_insertRegion","childSize","_drawTree","_drawBranch","branch","maxNumberOfNodes","reposition","maxLevels","forceAggregateHubs","normalizeClusterLevels","increaseClusterLevel","openCluster","isMovingBeforeClustering","_nodeInActiveArea","_addSector","decreaseClusterLevel","_expandClusterNode","_updateDynamicEdges","updateClusters","zoomDirection","recursive","doNotStart","amountOfNodes","_collapseSector","_formClusters","_openClusters","_openClustersBySize","_aggregateHubs","handleChains","chainPercentage","_getChainFraction","_reduceAmountOfChains","_getHubSize","_formClustersByHub","openAll","containedNodeId","childNode","_expelChildFromParent","_unselectAll","_releaseContainedEdges","_connectEdgeBackToChild","_validateEdges","othersPresent","childNodeId","_repositionBezierNodes","_formClustersByZoom","_forceClustersByZoom","minLength","_addToCluster","_clusterToSmallestNeighbour","smallestNeighbour","smallestNeighbourNode","neighbour","onlyEqual","_formClusterFromHub","hubNode","absorptionSizeOffset","allowCluster","edgesIdarray","amountOfInitialEdges","_addToContainedEdges","_connectEdgeToCluster","_containCircularEdgesFromNode","massBefore","correction","edgeToId","edgeFromId","_addToReroutedEdges","maxLevel","minLevel","clusterLevel","targetLevel","average","averageSquared","hubCounter","largestHub","variance","standardDeviation","fraction","reduceAmount","chains","total","_switchToSector","sectorId","sectorType","_switchToActiveSector","_switchToFrozenSector","_switchToSupportSector","_loadLatestSector","_previousSector","_setActiveSector","newId","_forgetLastSector","_createNewSector","_deleteActiveSector","_deleteFrozenSector","_freezeSector","_activateSector","_mergeThisWithFrozen","_collapseThisToSingleCluster","sector","unqiueIdentifier","previousSector","runFunction","argument","_doInAllFrozenSectors","_drawSectorNodes","_drawAllSectorNodes","_getNodesOverlappingWith","overlappingNodes","_getAllNodesOverlappingWith","_pointerToPositionObject","positionObject","_getEdgesOverlappingWith","overlappingEdges","_getAllEdgesOverlappingWith","_addToSelection","_addToHover","_removeFromSelection","doNotTrigger","_unselectClusters","_getSelectedNodeCount","_getSelectedNode","_getSelectedEdge","_getSelectedEdgeCount","_getSelectedObjectCount","_selectionIsEmpty","_clusterInSelection","_selectConnectedEdges","_hoverConnectedEdges","_unselectConnectedEdges","append","highlightEdges","nodeIds","getSelectedNodes","edgeIds","getSelectedEdges","idArray","RangeError","selectNodes","selectEdges","_clearManipulatorBar","_restoreOverloadedFunctions","functionName","_toggleEditMode","toolbar","boundFunction","edgeBeingEdited","selectedControlNode","addNodeButton","_createAddNodeToolbar","addEdgeButton","_createAddEdgeToolbar","editButton","_editNode","_createEditEdgeToolbar","editModeButton","backButton","_addNode","_handleConnect","_finishConnect","_selectControlNode","_controlNodeDrag","_releaseControlNode","newNode","_editEdge","alert","smooth","connectFromId","_createEdge","defaultData","finalizedData","sourceNodeId","targetNodeId","selectedNodes","selectedEdges","wrapper","navigationDivs","navigationDivActions","_stopMovement","hubsize","definedLevel","undefinedLevel","_changeConstants","_determineLevels","distribution","_getDistribution","_placeNodesByHierarchy","minPos","_placeBranchNodes","maxCount","_setLevel","parentId","parentLevel","nodeMoved","back","editNode","addDescription","edgeDescription","editEdgeDescription","createEdgeError","deleteClusterError","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","n","r2d","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","wEllipse","hEllipse","ymb","yeb","xt","yt","xi","yi","xl","yl","xr","yr","dashArray","dashLength","dashCount","slope","distRemaining","dashIndex"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;CAyBA,SAA2CA,EAAMC,GAC1B,gBAAZC,UAA0C,gBAAXC,QACxCA,OAAOD,QAAUD,IACQ,kBAAXG,SAAyBA,OAAOC,IAC9CD,OAAOH,GACmB,gBAAZC,SACdA,QAAa,IAAID,IAEjBD,EAAU,IAAIC,KACbK,KAAM,WACT,MAAgB,UAAUC,GAKhB,QAASC,GAAoBC,GAG5B,GAAGC,EAAiBD,GACnB,MAAOC,GAAiBD,GAAUP,OAGnC,IAAIC,GAASO,EAAiBD,IAC7BP,WACAS,GAAIF,EACJG,QAAQ,EAUT,OANAL,GAAQE,GAAUI,KAAKV,EAAOD,QAASC,EAAQA,EAAOD,QAASM,GAG/DL,EAAOS,QAAS,EAGTT,EAAOD,QAvBf,GAAIQ,KAqCJ,OATAF,GAAoBM,EAAIP,EAGxBC,EAAoBO,EAAIL,EAGxBF,EAAoBQ,EAAI,GAGjBR,EAAoB,KAK/B,SAASL,EAAQD,EAASM,GAG9BN,EAAQe,KAAOT,EAAoB,GACnCN,EAAQgB,QAAUV,EAAoB,GAGtCN,EAAQiB,QAAUX,EAAoB,GACtCN,EAAQkB,SAAWZ,EAAoB,GAGvCN,EAAQmB,QAAUb,EAAoB,GACtCN,EAAQoB,SACNC,OAAQf,EAAoB,IAC5BgB,OAAQhB,EAAoB,IAC5BiB,QAASjB,EAAoB,IAC7BkB,QAASlB,EAAoB,IAC7BmB,OAAQnB,EAAoB,IAC5BoB,WAAYpB,EAAoB,KAIlCN,EAAQ2B,SAAWrB,EAAoB,IACvCN,EAAQ4B,QAAUtB,EAAoB,IACtCN,EAAQ6B,UACNC,SAAUxB,EAAoB,IAC9ByB,MAAOzB,EAAoB,IAC3B0B,MAAO1B,EAAoB,IAC3B2B,SAAU3B,EAAoB,IAE9B4B,YACEC,OACEC,KAAM9B,EAAoB,IAC1B+B,QAAS/B,EAAoB,IAC7BgC,UAAWhC,EAAoB,IAC/BiC,UAAWjC,EAAoB,KAGjCkC,UAAWlC,EAAoB,IAC/BmC,YAAanC,EAAoB,IACjCoC,WAAYpC,EAAoB,IAChCqC,SAAUrC,EAAoB,IAC9BsC,WAAYtC,EAAoB,IAChCuC,MAAOvC,EAAoB,IAC3BwC,QAASxC,EAAoB,IAC7ByC,OAAQzC,EAAoB,IAC5B0C,UAAW1C,EAAoB,IAC/B2C,SAAU3C,EAAoB,MAKlCN,EAAQkD,QAAU5C,EAAoB,IACtCN,EAAQmD,SACNC,KAAM9C,EAAoB,IAC1B+C,OAAQ/C,EAAoB,IAC5BgD,OAAQhD,EAAoB,IAC5BiD,KAAMjD,EAAoB,IAC1BkD,MAAOlD,EAAoB,IAC3BmD,UAAWnD,EAAoB,IAC/BoD,YAAapD,EAAoB,KAInCN,EAAQ2D,MAAQ,WACd,KAAM,IAAIC,OAAM,+EAIlB5D,EAAQ6D,OAASvD,EAAoB,GACrCN,EAAQ8D,OAASxD,EAAoB,KAKjC,SAASL,OAAQD,QAASM,qBAM9B,GAAIuD,QAASvD,oBAAoB,EAOjCN,SAAQ+D,SAAW,SAASC,GAC1B,MAAQA,aAAkBC,SAA2B,gBAAVD,IAQ7ChE,QAAQkE,SAAW,SAASF,GAC1B,MAAQA,aAAkBG,SAA2B,gBAAVH,IAQ7ChE,QAAQoE,OAAS,SAASJ,GACxB,GAAIA,YAAkBK,MACpB,OAAO,CAEJ,IAAIrE,QAAQkE,SAASF,GAAS,CAEjC,GAAIM,GAAQC,aAAaC,KAAKR,EAC9B,IAAIM,EACF,OAAO,CAEJ,KAAKG,MAAMJ,KAAKK,MAAMV,IACzB,OAAO,EAIX,OAAO,GAQThE,QAAQ2E,YAAc,SAASX,GAC7B,MAA4B,mBAAb,SACVY,OAAoB,eACpBA,OAAOC,cAAuB,WAC9Bb,YAAkBY,QAAOC,cAAcC,WAQ9C9E,QAAQ+E,WAAa,WACnB,GAAIC,GAAK,WACP,MAAOC,MAAKC,MACQ,MAAhBD,KAAKE,UACPC,SAAS,IAGb,OACIJ,KAAOA,IAAO,IACVA,IAAO,IACPA,IAAO,IACPA,IAAO,IACPA,IAAOA,IAAOA,KAWxBhF,QAAQqF,OAAS,SAAUC,GACzB,IAAK,GAAIC,GAAI,EAAGC,EAAMC,UAAUC,OAAYF,EAAJD,EAASA,IAAK,CACpD,GAAII,GAAQF,UAAUF,EACtB,KAAK,GAAIK,KAAQD,GACXA,EAAME,eAAeD,KACvBN,EAAEM,GAAQD,EAAMC,IAKtB,MAAON,IAWTtF,QAAQ8F,gBAAkB,SAAUC,EAAOT,GACzC,IAAKU,MAAMC,QAAQF,GACjB,KAAM,IAAInC,OAAM,uDAGlB,KAAK,GAAI2B,GAAI,EAAGA,EAAIE,UAAUC,OAAQH,IAGpC,IAAK,GAFDI,GAAQF,UAAUF,GAEbzE,EAAI,EAAGA,EAAIiF,EAAML,OAAQ5E,IAAK,CACrC,GAAI8E,GAAOG,EAAMjF,EACb6E,GAAME,eAAeD,KACvBN,EAAEM,GAAQD,EAAMC,IAItB,MAAON,IAWTtF,QAAQkG,oBAAsB,SAAUH,EAAOT,EAAGa,GAEhD,GAAIH,MAAMC,QAAQE,GAChB,KAAM,IAAIC,WAAU,yCAEtB,KAAK,GAAIb,GAAI,EAAGA,EAAIE,UAAUC,OAAQH,IAEpC,IAAK,GADDI,GAAQF,UAAUF,GACbzE,EAAI,EAAGA,EAAIiF,EAAML,OAAQ5E,IAAK,CACrC,GAAI8E,GAAOG,EAAMjF,EACjB,IAAI6E,EAAME,eAAeD,GACvB,GAAIO,EAAEP,IAASO,EAAEP,GAAMS,cAAgBC,OACrBC,SAAZjB,EAAEM,KACJN,EAAEM,OAEAN,EAAEM,GAAMS,cAAgBC,OAC1BtG,QAAQwG,WAAWlB,EAAEM,GAAOO,EAAEP,IAG9BN,EAAEM,GAAQO,EAAEP,OAET,CAAA,GAAII,MAAMC,QAAQE,EAAEP,IACzB,KAAM,IAAIQ,WAAU,yCAEpBd,GAAEM,GAAQO,EAAEP,IAMpB,MAAON,IAWTtF,QAAQyG,uBAAyB,SAAUV,EAAOT,EAAGa,GAEnD,GAAIH,MAAMC,QAAQE,GAChB,KAAM,IAAIC,WAAU,yCAEtB,KAAK,GAAIR,KAAQO,GACf,GAAIA,EAAEN,eAAeD,IACQ,IAAvBG,EAAMW,QAAQd,GAChB,GAAIO,EAAEP,IAASO,EAAEP,GAAMS,cAAgBC,OACrBC,SAAZjB,EAAEM,KACJN,EAAEM,OAEAN,EAAEM,GAAMS,cAAgBC,OAC1BtG,QAAQwG,WAAWlB,EAAEM,GAAOO,EAAEP,IAG9BN,EAAEM,GAAQO,EAAEP,OAET,CAAA,GAAII,MAAMC,QAAQE,EAAEP,IACzB,KAAM,IAAIQ,WAAU,yCAEpBd,GAAEM,GAAQO,EAAEP,GAKpB,MAAON,IASTtF,QAAQwG,WAAa,SAASlB,EAAGa,GAE/B,GAAIH,MAAMC,QAAQE,GAChB,KAAM,IAAIC,WAAU,yCAGtB,KAAK,GAAIR,KAAQO,GACf,GAAIA,EAAEN,eAAeD,GACnB,GAAIO,EAAEP,IAASO,EAAEP,GAAMS,cAAgBC,OACrBC,SAAZjB,EAAEM,KACJN,EAAEM,OAEAN,EAAEM,GAAMS,cAAgBC,OAC1BtG,QAAQwG,WAAWlB,EAAEM,GAAOO,EAAEP,IAG9BN,EAAEM,GAAQO,EAAEP,OAET,CAAA,GAAII,MAAMC,QAAQE,EAAEP,IACzB,KAAM,IAAIQ,WAAU,yCAEpBd,GAAEM,GAAQO,EAAEP,GAIlB,MAAON,IAUTtF,QAAQ2G,WAAa,SAAUrB,EAAGa,GAChC,GAAIb,EAAEI,QAAUS,EAAET,OAAQ,OAAO,CAEjC,KAAK,GAAIH,GAAI,EAAGC,EAAMF,EAAEI,OAAYF,EAAJD,EAASA,IACvC,GAAID,EAAEC,IAAMY,EAAEZ,GAAI,OAAO,CAG3B,QAAO,GAYTvF,QAAQ4G,QAAU,SAAS5C,EAAQ6C,GACjC,GAAIvC,EAEJ,IAAeiC,SAAXvC,EACF,MAAOuC,OAET,IAAe,OAAXvC,EACF,MAAO,KAGT,KAAK6C,EACH,MAAO7C,EAET,IAAsB,gBAAT6C,MAAwBA,YAAgB1C,SACnD,KAAM,IAAIP,OAAM,wBAIlB,QAAQiD,GACN,IAAK,UACL,IAAK,UACH,MAAOC,SAAQ9C,EAEjB,KAAK,SACL,IAAK,SACH,MAAOC,QAAOD,EAAO+C,UAEvB,KAAK,SACL,IAAK,SACH,MAAO5C,QAAOH,EAEhB,KAAK,OACH,GAAIhE,QAAQ+D,SAASC,GACnB,MAAO,IAAIK,MAAKL,EAElB,IAAIA,YAAkBK,MACpB,MAAO,IAAIA,MAAKL,EAAO+C,UAEpB,IAAIlD,OAAOmD,SAAShD,GACvB,MAAO,IAAIK,MAAKL,EAAO+C,UAEzB,IAAI/G,QAAQkE,SAASF,GAEnB,MADAM,GAAQC,aAAaC,KAAKR,GACtBM,EAEK,GAAID,MAAKJ,OAAOK,EAAM,KAGtBT,OAAOG,GAAQiD,QAIxB,MAAM,IAAIrD,OACN,iCAAmC5D,QAAQkH,QAAQlD,GAC/C,gBAGZ,KAAK,SACH,GAAIhE,QAAQ+D,SAASC,GACnB,MAAOH,QAAOG,EAEhB,IAAIA,YAAkBK,MACpB,MAAOR,QAAOG,EAAO+C,UAElB,IAAIlD,OAAOmD,SAAShD,GACvB,MAAOH,QAAOG,EAEhB,IAAIhE,QAAQkE,SAASF,GAEnB,MADAM,GAAQC,aAAaC,KAAKR,GAGjBH,OAFLS,EAEYL,OAAOK,EAAM,IAGbN,EAIhB,MAAM,IAAIJ,OACN,iCAAmC5D,QAAQkH,QAAQlD,GAC/C,gBAGZ,KAAK,UACH,GAAIhE,QAAQ+D,SAASC,GACnB,MAAO,IAAIK,MAAKL,EAEb,IAAIA,YAAkBK,MACzB,MAAOL,GAAOmD,aAEX,IAAItD,OAAOmD,SAAShD,GACvB,MAAOA,GAAOiD,SAASE,aAEpB,IAAInH,QAAQkE,SAASF,GAExB,MADAM,GAAQC,aAAaC,KAAKR,GACtBM,EAEK,GAAID,MAAKJ,OAAOK,EAAM,KAAK6C,cAG3B,GAAI9C,MAAKL,GAAQmD,aAI1B,MAAM,IAAIvD,OACN,iCAAmC5D,QAAQkH,QAAQlD,GAC/C,mBAGZ,KAAK,UACH,GAAIhE,QAAQ+D,SAASC,GACnB,MAAO,SAAWA,EAAS,IAExB,IAAIA,YAAkBK,MACzB,MAAO,SAAWL,EAAO+C,UAAY,IAElC,IAAI/G,QAAQkE,SAASF,GAAS,CACjCM,EAAQC,aAAaC,KAAKR,EAC1B,IAAIoD,EAQJ,OALEA,GAFE9C,EAEM,GAAID,MAAKJ,OAAOK,EAAM,KAAKyC,UAG3B,GAAI1C,MAAKL,GAAQ+C,UAEpB,SAAWK,EAAQ,KAG1B,KAAM,IAAIxD,OACN,iCAAmC5D,QAAQkH,QAAQlD,GAC/C,mBAGZ,SACE,KAAM,IAAIJ,OAAM,iBAAmBiD,EAAO,MAOhD,IAAItC,cAAe,qBAOnBvE,SAAQkH,QAAU,SAASlD,GACzB,GAAI6C,SAAc7C,EAElB,OAAY,UAAR6C,EACY,MAAV7C,EACK,OAELA,YAAkB8C,SACb,UAEL9C,YAAkBC,QACb,SAELD,YAAkBG,QACb,SAELH,YAAkBgC,OACb,QAELhC,YAAkBK,MACb,OAEF,SAEQ,UAARwC,EACA,SAEQ,WAARA,EACA,UAEQ,UAARA,EACA,SAGFA,GAST7G,QAAQqH,gBAAkB,SAASC,GACjC,MAAOA,GAAKC,wBAAwBC,KAAOC,OAAOC,aASpD1H,QAAQ2H,eAAiB,SAASL,GAChC,MAAOA,GAAKC,wBAAwBK,IAAMH,OAAOI,aAQnD7H,QAAQ8H,aAAe,SAASR,EAAMS,GACpC,GAAIC,GAAUV,EAAKS,UAAUE,MAAM,IACD,KAA9BD,EAAQtB,QAAQqB,KAClBC,EAAQE,KAAKH,GACbT,EAAKS,UAAYC,EAAQG,KAAK,OASlCnI,QAAQoI,gBAAkB,SAASd,EAAMS,GACvC,GAAIC,GAAUV,EAAKS,UAAUE,MAAM,KAC/BI,EAAQL,EAAQtB,QAAQqB,EACf,KAATM,IACFL,EAAQM,OAAOD,EAAO,GACtBf,EAAKS,UAAYC,EAAQG,KAAK,OAalCnI,QAAQuI,QAAU,SAASvE,EAAQwE,GACjC,GAAIjD,GACAC,CACJ,IAAIxB,YAAkBgC,OAEpB,IAAKT,EAAI,EAAGC,EAAMxB,EAAO0B,OAAYF,EAAJD,EAASA,IACxCiD,EAASxE,EAAOuB,GAAIA,EAAGvB,OAKzB,KAAKuB,IAAKvB,GACJA,EAAO6B,eAAeN,IACxBiD,EAASxE,EAAOuB,GAAIA,EAAGvB,IAY/BhE,QAAQyI,QAAU,SAASzE,GACzB,GAAI0E,KAEJ,KAAK,GAAI9C,KAAQ5B,GACXA,EAAO6B,eAAeD,IAAO8C,EAAMR,KAAKlE,EAAO4B,GAGrD,OAAO8C,IAUT1I,QAAQ2I,eAAiB,SAAS3E,EAAQ4E,EAAKxB,GAC7C,MAAIpD,GAAO4E,KAASxB,GAClBpD,EAAO4E,GAAOxB,GACP,IAGA,GAYXpH,QAAQ6I,iBAAmB,SAASC,EAASC,EAAQC,EAAUC,GACzDH,EAAQD,kBACStC,SAAf0C,IACFA,GAAa,GAEA,eAAXF,GAA2BG,UAAUC,UAAUzC,QAAQ,YAAc,IACvEqC,EAAS,kBAGXD,EAAQD,iBAAiBE,EAAQC,EAAUC,IAE3CH,EAAQM,YAAY,KAAOL,EAAQC,IAWvChJ,QAAQqJ,oBAAsB,SAASP,EAASC,EAAQC,EAAUC,GAC5DH,EAAQO,qBAES9C,SAAf0C,IACFA,GAAa,GAEA,eAAXF,GAA2BG,UAAUC,UAAUzC,QAAQ,YAAc,IACvEqC,EAAS,kBAGXD,EAAQO,oBAAoBN,EAAQC,EAAUC,IAG9CH,EAAQQ,YAAY,KAAOP,EAAQC,IAOvChJ,QAAQuJ,eAAiB,SAAUC,GAC5BA,IACHA,EAAQ/B,OAAO+B,OAEbA,EAAMD,eACRC,EAAMD,iBAGNC,EAAMC,aAAc,GASxBzJ,QAAQ0J,UAAY,SAASF,GAEtBA,IACHA,EAAQ/B,OAAO+B,MAGjB,IAAIG,EAcJ,OAZIH,GAAMG,OACRA,EAASH,EAAMG,OAERH,EAAMI,aACbD,EAASH,EAAMI,YAGMrD,QAAnBoD,EAAOE,UAA4C,GAAnBF,EAAOE,WAEzCF,EAASA,EAAOG,YAGXH,GAGT3J,QAAQ+J,UAQR/J,QAAQ+J,OAAOC,UAAY,SAAU5C,EAAO6C,GAK1C,MAJoB,kBAAT7C,KACTA,EAAQA,KAGG,MAATA,EACe,GAATA,EAGH6C,GAAgB,MASzBjK,QAAQ+J,OAAOG,SAAW,SAAU9C,EAAO6C,GAKzC,MAJoB,kBAAT7C,KACTA,EAAQA,KAGG,MAATA,EACKnD,OAAOmD,IAAU6C,GAAgB,KAGnCA,GAAgB,MASzBjK,QAAQ+J,OAAOI,SAAW,SAAU/C,EAAO6C,GAKzC,MAJoB,kBAAT7C,KACTA,EAAQA,KAGG,MAATA,EACKjD,OAAOiD,GAGT6C,GAAgB,MASzBjK,QAAQ+J,OAAOK,OAAS,SAAUhD,EAAO6C,GAKvC,MAJoB,kBAAT7C,KACTA,EAAQA,KAGNpH,QAAQkE,SAASkD,GACZA,EAEApH,QAAQ+D,SAASqD,GACjBA,EAAQ,KAGR6C,GAAgB,MAU3BjK,QAAQ+J,OAAOM,UAAY,SAAUjD,EAAO6C,GAK1C,MAJoB,kBAAT7C,KACTA,EAAQA,KAGHA,GAAS6C,GAAgB,MAKlCjK,QAAQsK,QAAU,SAASC,KACzB,GAAIC,MAiBJ,OAdEA,OADS,KAAPD,IACM,GACM,KAAPA,IACC,GACM,KAAPA,IACC,GACM,KAAPA,IACC,GACM,KAAPA,IACC,GACM,KAAPA,IACC,GAEAE,KAAKF,MAKjBvK,QAAQ0K,QAAU,SAASC,GACzB,GAAIH,EAiBJ,OAdEA,GADQ,IAAPG,EACO,IACM,IAAPA,EACC,IACM,IAAPA,EACC,IACM,IAAPA,EACC,IACM,IAAPA,EACC,IACM,IAAPA,EACC,IAEA,GAAKA,GAWjB3K,QAAQ4K,WAAa,SAASC,GAC5B,GAAIhK,EACJ,IAAIb,QAAQkE,SAAS2G,GAAQ,CAC3B,GAAI7K,QAAQ8K,WAAWD,GAAQ,CAC7B,GAAIE,GAAMF,EAAMG,OAAO,GAAGA,OAAO,EAAEH,EAAMnF,OAAO,GAAGuC,MAAM,IACzD4C,GAAQ7K,QAAQiL,SAASF,EAAI,GAAGA,EAAI,GAAGA,EAAI,IAE7C,GAAI/K,QAAQkL,WAAWL,GAAQ,CAC7B,GAAIM,GAAMnL,QAAQoL,SAASP,GACvBQ,GAAmBC,EAAEH,EAAIG,EAAEC,EAAU,IAARJ,EAAII,EAASC,EAAEvG,KAAKwG,IAAI,EAAU,KAARN,EAAIK,IAC3DE,GAAmBJ,EAAEH,EAAIG,EAAEC,EAAEtG,KAAKwG,IAAI,EAAU,KAARN,EAAIK,GAAUA,EAAQ,GAANL,EAAIK,GAC5DG,EAAkB3L,QAAQ4L,SAASF,EAAeJ,EAAGI,EAAeJ,EAAGI,EAAeF,GACtFK,EAAkB7L,QAAQ4L,SAASP,EAAgBC,EAAED,EAAgBE,EAAEF,EAAgBG,EAE3F3K,IACEiL,WAAYjB,EACZkB,OAAOJ,EACPK,WACEF,WAAWD,EACXE,OAAOJ,GAETM,OACEH,WAAWD,EACXE,OAAOJ,QAKX9K,IACEiL,WAAWjB,EACXkB,OAAOlB,EACPmB,WACEF,WAAWjB,EACXkB,OAAOlB,GAEToB,OACEH,WAAWjB,EACXkB,OAAOlB,QAMbhK,MACAA,EAAEiL,WAAajB,EAAMiB,YAAc,QACnCjL,EAAEkL,OAASlB,EAAMkB,QAAUlL,EAAEiL,WAEzB9L,QAAQkE,SAAS2G,EAAMmB,WACzBnL,EAAEmL,WACAD,OAAQlB,EAAMmB,UACdF,WAAYjB,EAAMmB,YAIpBnL,EAAEmL,aACFnL,EAAEmL,UAAUF,WAAajB,EAAMmB,WAAanB,EAAMmB,UAAUF,YAAcjL,EAAEiL,WAC5EjL,EAAEmL,UAAUD,OAASlB,EAAMmB,WAAanB,EAAMmB,UAAUD,QAAUlL,EAAEkL,QAGlE/L,QAAQkE,SAAS2G,EAAMoB,OACzBpL,EAAEoL,OACAF,OAAQlB,EAAMoB,MACdH,WAAYjB,EAAMoB,QAIpBpL,EAAEoL,SACFpL,EAAEoL,MAAMH,WAAajB,EAAMoB,OAASpB,EAAMoB,MAAMH,YAAcjL,EAAEiL,WAChEjL,EAAEoL,MAAMF,OAASlB,EAAMoB,OAASpB,EAAMoB,MAAMF,QAAUlL,EAAEkL,OAI5D,OAAOlL,IASTb,QAAQkM,SAAW,SAASC,GAC1BA,EAAMA,EAAIC,QAAQ,IAAI,IAAIC,aAE1B,IAAI/G,GAAItF,QAAQsK,QAAQ6B,EAAIG,UAAU,EAAG,IACrCnG,EAAInG,QAAQsK,QAAQ6B,EAAIG,UAAU,EAAG,IACrCzL,EAAIb,QAAQsK,QAAQ6B,EAAIG,UAAU,EAAG,IACrCC,EAAIvM,QAAQsK,QAAQ6B,EAAIG,UAAU,EAAG,IACrCE,EAAIxM,QAAQsK,QAAQ6B,EAAIG,UAAU,EAAG,IACrCG,EAAIzM,QAAQsK,QAAQ6B,EAAIG,UAAU,EAAG,IAErCI,EAAS,GAAJpH,EAAUa,EACfwG,EAAS,GAAJ9L,EAAU0L,EACfpG,EAAS,GAAJqG,EAAUC,CAEnB,QAAQC,EAAEA,EAAEC,EAAEA,EAAExG,EAAEA,IAGpBnG,QAAQiL,SAAW,SAAS2B,EAAIC,EAAMC,GACpC,GAAIxH,GAAItF,QAAQ0K,QAAQzF,KAAKC,MAAM0H,EAAM,KACrCzG,EAAInG,QAAQ0K,QAAQkC,EAAM,IAC1B/L,EAAIb,QAAQ0K,QAAQzF,KAAKC,MAAM2H,EAAQ,KACvCN,EAAIvM,QAAQ0K,QAAQmC,EAAQ,IAC5BL,EAAIxM,QAAQ0K,QAAQzF,KAAKC,MAAM4H,EAAO,KACtCL,EAAIzM,QAAQ0K,QAAQoC,EAAO,IAE3BX,EAAM7G,EAAIa,EAAItF,EAAI0L,EAAIC,EAAIC,CAC9B,OAAO,IAAMN,GAafnM,QAAQ+M,SAAW,SAASH,EAAIC,EAAMC,GACpCF,GAAQ,IAAKC,GAAY,IAAKC,GAAU,GACxC,IAAIE,GAAS/H,KAAKwG,IAAImB,EAAI3H,KAAKwG,IAAIoB,EAAMC,IACrCG,EAAShI,KAAKiI,IAAIN,EAAI3H,KAAKiI,IAAIL,EAAMC,GAGzC,IAAIE,GAAUC,EACZ,OAAQ3B,EAAE,EAAEC,EAAE,EAAEC,EAAEwB,EAIpB,IAAIT,GAAKK,GAAKI,EAAUH,EAAMC,EAASA,GAAME,EAAUJ,EAAIC,EAAQC,EAAKF,EACpEtB,EAAKsB,GAAKI,EAAU,EAAMF,GAAME,EAAU,EAAI,EAC9CG,EAAM,IAAI7B,EAAIiB,GAAGU,EAASD,IAAS,IACnCI,GAAcH,EAASD,GAAQC,EAC/B7F,EAAQ6F,CACZ,QAAQ3B,EAAE6B,EAAI5B,EAAE6B,EAAW5B,EAAEpE,IAY/BpH,QAAQqN,SAAW,SAAS/B,EAAGC,EAAGC,GAChC,GAAIkB,GAAGC,EAAGxG,EAENZ,EAAIN,KAAKC,MAAU,EAAJoG,GACfmB,EAAQ,EAAJnB,EAAQ/F,EACZzE,EAAI0K,GAAK,EAAID,GACb+B,EAAI9B,GAAK,EAAIiB,EAAIlB,GACjBgC,EAAI/B,GAAK,GAAK,EAAIiB,GAAKlB,EAE3B,QAAQhG,EAAI,GACV,IAAK,GAAGmH,EAAIlB,EAAGmB,EAAIY,EAAGpH,EAAIrF,CAAG,MAC7B,KAAK,GAAG4L,EAAIY,EAAGX,EAAInB,EAAGrF,EAAIrF,CAAG,MAC7B,KAAK,GAAG4L,EAAI5L,EAAG6L,EAAInB,EAAGrF,EAAIoH,CAAG,MAC7B,KAAK,GAAGb,EAAI5L,EAAG6L,EAAIW,EAAGnH,EAAIqF,CAAG,MAC7B,KAAK,GAAGkB,EAAIa,EAAGZ,EAAI7L,EAAGqF,EAAIqF,CAAG,MAC7B,KAAK,GAAGkB,EAAIlB,EAAGmB,EAAI7L,EAAGqF,EAAImH,EAG5B,OAAQZ,EAAEzH,KAAKC,MAAU,IAAJwH,GAAUC,EAAE1H,KAAKC,MAAU,IAAJyH,GAAUxG,EAAElB,KAAKC,MAAU,IAAJiB,KAGrEnG,QAAQ4L,SAAW,SAASN,EAAGC,EAAGC,GAChC,GAAIT,GAAM/K,QAAQqN,SAAS/B,EAAGC,EAAGC,EACjC,OAAOxL,SAAQiL,SAASF,EAAI2B,EAAG3B,EAAI4B,EAAG5B,EAAI5E,IAG5CnG,QAAQoL,SAAW,SAASe,GAC1B,GAAIpB,GAAM/K,QAAQkM,SAASC,EAC3B,OAAOnM,SAAQ+M,SAAShC,EAAI2B,EAAG3B,EAAI4B,EAAG5B,EAAI5E,IAG5CnG,QAAQkL,WAAa,SAASiB,GAC5B,GAAIqB,GAAO,qCAAqCC,KAAKtB,EACrD,OAAOqB,IAGTxN,QAAQ8K,WAAa,SAASC,GAC5BA,EAAMA,EAAIqB,QAAQ,IAAI,GACtB,IAAIoB,GAAO,wCAAwCC,KAAK1C,EACxD,OAAOyC,IAUTxN,QAAQ0N,sBAAwB,SAASC,EAAQC,GAC/C,GAA8B,gBAAnBA,GAA6B,CAEtC,IAAK,GADDC,GAAWvH,OAAOwH,OAAOF,GACpBrI,EAAI,EAAGA,EAAIoI,EAAOjI,OAAQH,IAC7BqI,EAAgB/H,eAAe8H,EAAOpI,KACC,gBAA9BqI,GAAgBD,EAAOpI,MAChCsI,EAASF,EAAOpI,IAAMvF,QAAQ+N,aAAaH,EAAgBD,EAAOpI,KAIxE,OAAOsI,GAGP,MAAO,OAWX7N,QAAQ+N,aAAe,SAASH,GAC9B,GAA8B,gBAAnBA,GAA6B,CACtC,GAAIC,GAAWvH,OAAOwH,OAAOF,EAC7B,KAAK,GAAIrI,KAAKqI,GACRA,EAAgB/H,eAAeN,IACA,gBAAtBqI,GAAgBrI,KACzBsI,EAAStI,GAAKvF,QAAQ+N,aAAaH,EAAgBrI,IAIzD,OAAOsI,GAGP,MAAO,OAcX7N,QAAQgO,aAAe,SAAUC,EAAaC,EAASnE,GACrD,GAAwBxD,SAApB2H,EAAQnE,GACV,GAA8B,iBAAnBmE,GAAQnE,GACjBkE,EAAYlE,GAAQoE,QAAUD,EAAQnE,OAEnC,CACHkE,EAAYlE,GAAQoE,SAAU,CAC9B,KAAKvI,OAAQsI,GAAQnE,GACfmE,EAAQnE,GAAQlE,eAAeD,QACjCqI,EAAYlE,GAAQnE,MAAQsI,EAAQnE,GAAQnE,SAiBtD5F,QAAQgO,aAAe,SAAUC,EAAaC,EAASnE,GACrD,GAAwBxD,SAApB2H,EAAQnE,GACV,GAA8B,iBAAnBmE,GAAQnE,GACjBkE,EAAYlE,GAAQoE,QAAUD,EAAQnE,OAEnC,CACHkE,EAAYlE,GAAQoE,SAAU,CAC9B,KAAKvI,OAAQsI,GAAQnE,GACfmE,EAAQnE,GAAQlE,eAAeD,QACjCqI,EAAYlE,GAAQnE,MAAQsI,EAAQnE,GAAQnE,SA2BtD5F,QAAQoO,aAAe,SAASC,EAAcC,EAAOC,EAAOC,GAC1D,GAUIpH,GAVAsB,EAAQ2F,EAERI,EAAgB,IAChBC,EAAY,EACZC,GAAQ,EACRC,EAAM,EACNC,EAAOnG,EAAMhD,OACboJ,EAASF,EACTG,EAAUF,EACVG,EAAQ/J,KAAKC,MAAM,IAAK2J,EAAKD,GAGjC,IAAY,GAARC,EACFG,EAAQ,OAEL,IAAY,GAARH,EAELG,EADEtG,EAAMsG,GAAOC,UAAUX,GAChB,EAGD,OAGP,CAGH,IAFAO,GAAQ,EAEQ,GAATF,GAA8BF,EAAZC,GACvBtH,EAAmBb,SAAXiI,EAAuB9F,EAAMsG,GAAOT,GAAS7F,EAAMsG,GAAOT,GAAOC,GAErE9F,EAAMsG,GAAOC,UAAUX,GACzBK,GAAQ,GAGJvH,EAAQkH,EAAMY,MAChBJ,EAAS7J,KAAKC,MAAM,IAAK2J,EAAKD,IAG9BG,EAAU9J,KAAKC,MAAM,IAAK2J,EAAKD,IAG7BA,GAAOE,GAAUD,GAAQE,GAC3BC,EAAQ,GACRL,GAAQ,IAGRE,EAAOE,EAASH,EAAME,EACtBE,EAAQ/J,KAAKC,MAAM,IAAK2J,EAAKD,MAGjCF,GAEEA,IAAaD,GACfU,QAAQC,IAAI,+CAGhB,MAAOJ,IAoBThP,QAAQqP,oBAAsB,SAAShB,EAAc1E,EAAQ4E,EAAOe,GAClE,GASIC,GACAC,EAAWpI,EAAOqI,EAVlBhB,EAAgB,IAChBC,EAAY,EACZhG,EAAQ2F,EACRM,GAAQ,EACRC,EAAM,EACNC,EAAOnG,EAAMhD,OACboJ,EAASF,EACTG,EAAUF,EACVG,EAAQ/J,KAAKC,MAAM,IAAK2J,EAAKD,GAIjC,IAAY,GAARC,EAAYG,EAAQ,OACnB,IAAY,GAARH,EACPzH,EAAQsB,EAAMsG,GAAOT,GAEnBS,EADE5H,GAASuC,EACF,EAGD,OAGP,CAEH,IADAkF,GAAQ,EACQ,GAATF,GAA8BF,EAAZC,GACvBc,EAAY9G,EAAMzD,KAAKiI,IAAI,EAAE8B,EAAQ,IAAIT,GACzCnH,EAAQsB,EAAMsG,GAAOT,GACrBkB,EAAY/G,EAAMzD,KAAKwG,IAAI/C,EAAMhD,OAAO,EAAEsJ,EAAQ,IAAIT,GAElDnH,GAASuC,GAAsBA,EAAZ6F,GAAsBpI,EAAQuC,GAAkBA,EAARvC,GAAkBqI,EAAY9F,GAC3FgF,GAAQ,EACJvH,GAASuC,IACW,UAAlB2F,EACc3F,EAAZ6F,GAAsBpI,EAAQuC,IAChCqF,EAAQ/J,KAAKiI,IAAI,EAAE8B,EAAQ,IAIjBrF,EAARvC,GAAkBqI,EAAY9F,IAChCqF,EAAQ/J,KAAKwG,IAAI/C,EAAMhD,OAAO,EAAEsJ,EAAQ,OAMlCrF,EAARvC,EACF0H,EAAS7J,KAAKC,MAAM,IAAK2J,EAAKD,IAG9BG,EAAU9J,KAAKC,MAAM,IAAK2J,EAAKD,IAEjCW,EAAWtK,KAAKC,MAAM,IAAK2J,EAAKD,IAE5BA,GAAOE,GAAUD,GAAQE,GAC3BC,EAAQ,GACRL,GAAQ,IAGRE,EAAOE,EAASH,EAAME,EACtBE,EAAQ/J,KAAKC,MAAM,IAAK2J,EAAKD,MAGjCF,GAEEA,IAAaD,GACfU,QAAQC,IAAI,+CAGhB,MAAOJ,KAKL,SAAS/O,EAAQD,EAASM,GAI9BL,EAAOD,QAA6B,mBAAXyH,SAA2BA,OAAe,QAAKnH,EAAoB,IAKxF,SAASL,EAAQD,EAASM,GAE9B,GAAIoP,IAA0D,SAASC,EAAQ1P,IAM/E,SAAWsG,GAoSP,QAASqJ,GAAItK,EAAGa,EAAGtF,GACf,OAAQ4E,UAAUC,QACd,IAAK,GAAG,MAAY,OAALJ,EAAYA,EAAIa,CAC/B,KAAK,GAAG,MAAY,OAALb,EAAYA,EAAS,MAALa,EAAYA,EAAItF,CAC/C,SAAS,KAAM,IAAI+C,OAAM,iBAIjC,QAASiM,KAGL,OACIC,OAAQ,EACRC,gBACAC,eACAC,SAAW,GACXC,cAAgB,EAChBC,WAAY,EACZC,aAAe,KACfC,eAAgB,EAChBC,iBAAkB,EAClBC,KAAK,GAIb,QAASC,GAAUC,EAAKC,GAEpB,QAASC,KACD9M,GAAO+M,+BAAgC,GAChB,mBAAZzB,UAA2BA,QAAQ0B,MAC9C1B,QAAQ0B,KAAK,wBAA0BJ,GAJ/C,GAAIK,IAAY,CAOhB,OAAOzL,GAAO,WAKV,MAJIyL,KACAH,IACAG,GAAY,GAETJ,EAAGK,MAAM3Q,KAAMqF,YACvBiL,GAGP,QAASM,GAASC,EAAMC,GACpB,MAAO,UAAU5L,GACb,MAAO6L,GAAaF,EAAKtQ,KAAKP,KAAMkF,GAAI4L,IAGhD,QAASE,GAAgBH,EAAMI,GAC3B,MAAO,UAAU/L,GACb,MAAOlF,MAAKkR,OAAOC,QAAQN,EAAKtQ,KAAKP,KAAMkF,GAAI+L,IAmBvD,QAASG,MAKT,QAASC,GAAOC,GACZC,EAAcD,GACdrM,EAAOjF,KAAMsR,GAIjB,QAASE,GAASC,GACd,GAAIC,GAAkBC,EAAqBF,GACvCG,EAAQF,EAAgBG,MAAQ,EAChCC,EAAWJ,EAAgBK,SAAW,EACtCC,EAASN,EAAgBO,OAAS,EAClCC,EAAQR,EAAgBS,MAAQ,EAChCC,EAAOV,EAAgBW,KAAO,EAC9BC,EAAQZ,EAAgBa,MAAQ,EAChCC,EAAUd,EAAgBe,QAAU,EACpCC,EAAUhB,EAAgBiB,QAAU,EACpCC,EAAelB,EAAgBmB,aAAe,CAGlD7S,MAAK8S,eAAiBF,EACR,IAAVF,EACU,IAAVF,EACQ,KAARF,EAGJtS,KAAK+S,OAASX,EACF,EAARF,EAIJlS,KAAKgT,SAAWhB,EACD,EAAXF,EACQ,GAARF,EAEJ5R,KAAKiT,SAELjT,KAAKkT,UAQT,QAASjO,GAAOC,EAAGa,GACf,IAAK,GAAIZ,KAAKY,GACNA,EAAEN,eAAeN,KACjBD,EAAEC,GAAKY,EAAEZ,GAYjB,OARIY,GAAEN,eAAe,cACjBP,EAAEF,SAAWe,EAAEf,UAGfe,EAAEN,eAAe,aACjBP,EAAEyB,QAAUZ,EAAEY,SAGXzB,EAGX,QAASiO,GAAY3S,GACjB,GAAiB2E,GAAbiO,IACJ,KAAKjO,IAAK3E,GACFA,EAAEiF,eAAeN,IAAMkO,GAAiB5N,eAAeN,KACvDiO,EAAOjO,GAAK3E,EAAE2E,GAItB,OAAOiO,GAGX,QAASE,GAASC,GACd,MAAa,GAATA,EACO1O,KAAK2O,KAAKD,GAEV1O,KAAKC,MAAMyO,GAM1B,QAASxC,GAAawC,EAAQE,EAAcC,GAIxC,IAHA,GAAIC,GAAS,GAAK9O,KAAK+O,IAAIL,GACvBM,EAAON,GAAU,EAEdI,EAAOrO,OAASmO,GACnBE,EAAS,IAAMA,CAEnB,QAAQE,EAAQH,EAAY,IAAM,GAAM,KAAOC,EAInD,QAASG,GAAgCC,EAAKtC,EAAUuC,EAAUC,GAC9D,GAAIrB,GAAenB,EAASqB,cACxBV,EAAOX,EAASsB,MAChBf,EAASP,EAASuB,OACtBiB,GAA+B,MAAhBA,GAAuB,EAAOA,EAEzCrB,GACAmB,EAAIG,GAAGC,SAASJ,EAAIG,GAAKtB,EAAeoB,GAExC5B,GACAgC,GAAUL,EAAK,OAAQM,GAAUN,EAAK,QAAU3B,EAAO4B,GAEvDhC,GACAsC,GAAeP,EAAKM,GAAUN,EAAK,SAAW/B,EAASgC,GAEvDC,GACAxQ,GAAOwQ,aAAaF,EAAK3B,GAAQJ,GAKzC,QAASnM,GAAQ0O,GACb,MAAiD,mBAA1CrO,OAAOsO,UAAUxP,SAASzE,KAAKgU,GAG1C,QAASvQ,GAAOuQ,GACZ,MAAkD,kBAA1CrO,OAAOsO,UAAUxP,SAASzE,KAAKgU,IAC/BA,YAAiBtQ,MAI7B,QAASwQ,GAAcC,EAAQC,EAAQC,GACnC,GAGIzP,GAHAC,EAAMP,KAAKwG,IAAIqJ,EAAOpP,OAAQqP,EAAOrP,QACrCuP,EAAahQ,KAAK+O,IAAIc,EAAOpP,OAASqP,EAAOrP,QAC7CwP,EAAQ,CAEZ,KAAK3P,EAAI,EAAOC,EAAJD,EAASA,KACZyP,GAAeF,EAAOvP,KAAOwP,EAAOxP,KACnCyP,GAAeG,EAAML,EAAOvP,MAAQ4P,EAAMJ,EAAOxP,MACnD2P,GAGR,OAAOA,GAAQD,EAGnB,QAASG,GAAeC,GACpB,GAAIA,EAAO,CACP,GAAIC,GAAUD,EAAME,cAAcnJ,QAAQ,QAAS,KACnDiJ,GAAQG,GAAYH,IAAUI,GAAeH,IAAYA,EAE7D,MAAOD,GAGX,QAAStD,GAAqB2D,GAC1B,GACIC,GACA/P,EAFAkM,IAIJ,KAAKlM,IAAQ8P,GACLA,EAAY7P,eAAeD,KAC3B+P,EAAiBP,EAAexP,GAC5B+P,IACA7D,EAAgB6D,GAAkBD,EAAY9P,IAK1D,OAAOkM,GAGX,QAAS8D,GAASrH,GACd,GAAI2C,GAAO2E,CAEX,IAA8B,IAA1BtH,EAAM7H,QAAQ,QACdwK,EAAQ,EACR2E,EAAS,UAER,CAAA,GAA+B,IAA3BtH,EAAM7H,QAAQ,SAKnB,MAJAwK,GAAQ,GACR2E,EAAS,QAMbhS,GAAO0K,GAAS,SAAUuH,EAAQzN,GAC9B,GAAI9C,GAAGwQ,EACHC,EAASnS,GAAO6M,GAAGuF,MAAM1H,GACzB2H,IAYJ,IAVsB,gBAAXJ,KACPzN,EAAQyN,EACRA,EAASvP,GAGbwP,EAAS,SAAUxQ,GACf,GAAI3E,GAAIiD,KAASsS,MAAMC,IAAIP,EAAQtQ,EACnC,OAAOyQ,GAAOrV,KAAKkD,GAAO6M,GAAGuF,MAAOrV,EAAGkV,GAAU,KAGxC,MAATzN,EACA,MAAO0N,GAAO1N,EAGd,KAAK9C,EAAI,EAAO2L,EAAJ3L,EAAWA,IACnB2Q,EAAQhO,KAAK6N,EAAOxQ,GAExB,OAAO2Q,IAKnB,QAASf,GAAMkB,GACX,GAAIC,IAAiBD,EACjBjP,EAAQ,CAUZ,OARsB,KAAlBkP,GAAuBC,SAASD,KAE5BlP,EADAkP,GAAiB,EACTrR,KAAKC,MAAMoR,GAEXrR,KAAK2O,KAAK0C,IAInBlP,EAGX,QAASoP,GAAYvE,EAAMI,GACvB,MAAO,IAAIhO,MAAKA,KAAKoS,IAAIxE,EAAMI,EAAQ,EAAG,IAAIqE,aAGlD,QAASC,GAAY1E,EAAM2E,EAAKC,GAC5B,MAAOC,IAAWjT,IAAQoO,EAAM,GAAI,GAAK2E,EAAMC,IAAOD,EAAKC,GAAKtE,KAGpE,QAASwE,GAAW9E,GAChB,MAAO+E,GAAW/E,GAAQ,IAAM,IAGpC,QAAS+E,GAAW/E,GAChB,MAAQA,GAAO,IAAM,GAAKA,EAAO,MAAQ,GAAMA,EAAO,MAAQ,EAGlE,QAASN,GAAc/Q,GACnB,GAAIqP,EACArP,GAAEqW,IAAyB,KAAnBrW,EAAEsW,IAAIjH,WACdA,EACIrP,EAAEqW,GAAGE,IAAS,GAAKvW,EAAEqW,GAAGE,IAAS,GAAKA,GACtCvW,EAAEqW,GAAGG,IAAQ,GAAKxW,EAAEqW,GAAGG,IAAQZ,EAAY5V,EAAEqW,GAAGI,IAAOzW,EAAEqW,GAAGE,KAAUC,GACtExW,EAAEqW,GAAGK,IAAQ,GAAK1W,EAAEqW,GAAGK,IAAQ,GAAKA,GACpC1W,EAAEqW,GAAGM,IAAU,GAAK3W,EAAEqW,GAAGM,IAAU,GAAKA,GACxC3W,EAAEqW,GAAGO,IAAU,GAAK5W,EAAEqW,GAAGO,IAAU,GAAKA,GACxC5W,EAAEqW,GAAGQ,IAAe,GAAK7W,EAAEqW,GAAGQ,IAAe,IAAMA,GACnD,GAEA7W,EAAEsW,IAAIQ,qBAAkCL,GAAXpH,GAAmBA,EAAWmH,MAC3DnH,EAAWmH,IAGfxW,EAAEsW,IAAIjH,SAAWA,GAIzB,QAAS0H,GAAQ/W,GAgBb,MAfkB,OAAdA,EAAEgX,WACFhX,EAAEgX,UAAYnT,MAAM7D,EAAE0T,GAAGuD,YACrBjX,EAAEsW,IAAIjH,SAAW,IAChBrP,EAAEsW,IAAIpH,QACNlP,EAAEsW,IAAI9G,eACNxP,EAAEsW,IAAI/G,YACNvP,EAAEsW,IAAI7G,gBACNzP,EAAEsW,IAAI5G,gBAEP1P,EAAEkX,UACFlX,EAAEgX,SAAWhX,EAAEgX,UACa,IAAxBhX,EAAEsW,IAAIhH,eACwB,IAA9BtP,EAAEsW,IAAInH,aAAarK,SAGxB9E,EAAEgX,SAGb,QAASG,GAAkBnP,GACvB,MAAOA,GAAMA,EAAI2M,cAAcnJ,QAAQ,IAAK,KAAOxD,EAIvD,QAASoP,GAAOrD,EAAOsD,GACnB,MAAOA,GAAMC,OAASrU,GAAO8Q,GAAOwD,KAAKF,EAAMG,SAAW,GACtDvU,GAAO8Q,GAAO0D,QAiMtB,QAASC,GAAS1P,EAAK2P,GAMnB,MALAA,GAAOC,KAAO5P,EACT6P,GAAU7P,KACX6P,GAAU7P,GAAO,GAAI4I,IAEzBiH,GAAU7P,GAAKwN,IAAImC,GACZE,GAAU7P,GAIrB,QAAS8P,GAAW9P,SACT6P,IAAU7P,GASrB,QAAS+P,GAAkB/P,GACvB,GAAWgQ,GAAGtH,EAAMuH,EAAM5Q,EAAtB1C,EAAI,EACJuT,EAAM,SAAUC,GACZ,IAAKN,GAAUM,IAAMC,GACjB,IACI1Y,EAAoB,GAAG,KAAOyY,GAChC,MAAOvM,IAEb,MAAOiM,IAAUM,GAGzB,KAAKnQ,EACD,MAAO/E,IAAO6M,GAAGuF,KAGrB,KAAKhQ,EAAQ2C,GAAM,CAGf,GADA0I,EAAOwH,EAAIlQ,GAEP,MAAO0I,EAEX1I,IAAOA,GAMX,KAAOrD,EAAIqD,EAAIlD,QAAQ,CAKnB,IAJAuC,EAAQ8P,EAAkBnP,EAAIrD,IAAI0C,MAAM,KACxC2Q,EAAI3Q,EAAMvC,OACVmT,EAAOd,EAAkBnP,EAAIrD,EAAI,IACjCsT,EAAOA,EAAOA,EAAK5Q,MAAM,KAAO,KACzB2Q,EAAI,GAAG,CAEV,GADAtH,EAAOwH,EAAI7Q,EAAMgR,MAAM,EAAGL,GAAGzQ,KAAK,MAE9B,MAAOmJ,EAEX,IAAIuH,GAAQA,EAAKnT,QAAUkT,GAAK/D,EAAc5M,EAAO4Q,GAAM,IAASD,EAAI,EAEpE,KAEJA,KAEJrT,IAEJ,MAAO1B,IAAO6M,GAAGuF,MAQrB,QAASiD,GAAuBvE,GAC5B,MAAIA,GAAMrQ,MAAM,YACLqQ,EAAMvI,QAAQ,WAAY,IAE9BuI,EAAMvI,QAAQ,MAAO,IAGhC,QAAS+M,GAAmBrD,GACxB,GAA4CvQ,GAAGG,EAA3CgD,EAAQoN,EAAOxR,MAAM8U,GAEzB,KAAK7T,EAAI,EAAGG,EAASgD,EAAMhD,OAAYA,EAAJH,EAAYA,IAEvCmD,EAAMnD,GADN8T,GAAqB3Q,EAAMnD,IAChB8T,GAAqB3Q,EAAMnD,IAE3B2T,EAAuBxQ,EAAMnD,GAIhD,OAAO,UAAU4O,GACb,GAAIJ,GAAS,EACb,KAAKxO,EAAI,EAAOG,EAAJH,EAAYA,IACpBwO,GAAUrL,EAAMnD,YAAc+T,UAAW5Q,EAAMnD,GAAG5E,KAAKwT,EAAK2B,GAAUpN,EAAMnD,EAEhF,OAAOwO,IAKf,QAASwF,GAAa3Y,EAAGkV,GAErB,MAAKlV,GAAE+W,WAIP7B,EAAS0D,EAAa1D,EAAQlV,EAAE0Q,QAE3BmI,GAAgB3D,KACjB2D,GAAgB3D,GAAUqD,EAAmBrD,IAG1C2D,GAAgB3D,GAAQlV,IATpBA,EAAE0Q,OAAOoI,cAYxB,QAASF,GAAa1D,EAAQxE,GAG1B,QAASqI,GAA4BhF,GACjC,MAAOrD,GAAKsI,eAAejF,IAAUA,EAHzC,GAAIpP,GAAI,CAOR,KADAsU,GAAsBC,UAAY,EAC3BvU,GAAK,GAAKsU,GAAsBpM,KAAKqI,IACxCA,EAASA,EAAO1J,QAAQyN,GAAuBF,GAC/CE,GAAsBC,UAAY,EAClCvU,GAAK,CAGT,OAAOuQ,GAUX,QAASiE,GAAsBC,EAAOtI,GAClC,GAAIpM,GAAG2U,EAASvI,EAAOoG,OACvB,QAAQkC,GACR,IAAK,IACD,MAAOE,GACX,KAAK,OACD,MAAOC,GACX,KAAK,OACL,IAAK,OACL,IAAK,OACD,MAAOF,GAASG,GAAuBC,EAC3C,KAAK,IACL,IAAK,IACL,IAAK,IACD,MAAOC,GACX,KAAK,SACL,IAAK,QACL,IAAK,QACL,IAAK,QACD,MAAOL,GAASM,GAAsBC,EAC1C,KAAK,IACD,GAAIP,EAAU,MAAOC,GAEzB,KAAK,KACD,GAAID,EAAU,MAAOQ,GAEzB,KAAK,MACD,GAAIR,EAAU,MAAOE,GAEzB,KAAK,MACD,MAAOO,GACX,KAAK,MACL,IAAK,OACL,IAAK,KACL,IAAK,MACL,IAAK,OACD,MAAOC,GACX,KAAK,IACL,IAAK,IACD,MAAOhC,GAAkBjH,EAAOkJ,IAAIC,cACxC,KAAK,IACD,MAAOC,GACX,KAAK,IACL,IAAK,KACD,MAAOC,GACX,KAAK,IACD,MAAOC,GACX,KAAK,OACD,MAAOC,GACX,KAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACD,MAAOhB,GAASQ,GAAsBS,EAC1C,KAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACD,MAAOA,GACX,KAAK,KACD,MAAOC,GACX,SAEI,MADA7V,GAAI,GAAI8V,QAAOC,EAAaC,EAAetB,EAAM5N,QAAQ,KAAM,KAAM,OAK7E,QAASmP,GAA0BC,GAC/BA,EAASA,GAAU,EACnB,IAAIC,GAAqBD,EAAOlX,MAAMyW,QAClCW,EAAUD,EAAkBA,EAAkB/V,OAAS,OACvDiW,GAASD,EAAU,IAAIpX,MAAMsX,MAA0B,IAAK,EAAG,GAC/DhJ,IAAuB,GAAX+I,EAAM,IAAWxG,EAAMwG,EAAM,GAE7C,OAAoB,MAAbA,EAAM,IAAc/I,EAAUA,EAIzC,QAASiJ,GAAwB7B,EAAOrF,EAAOjD,GAC3C,GAAIpM,GAAGwW,EAAgBpK,EAAOuF,EAE9B,QAAQ+C,GAER,IAAK,IACY,MAATrF,IACAmH,EAAc3E,IAA8B,GAApBhC,EAAMR,GAAS,GAE3C,MAEJ,KAAK,IACL,IAAK,KACY,MAATA,IACAmH,EAAc3E,IAAShC,EAAMR,GAAS,EAE1C,MACJ,KAAK,MACL,IAAK,OACDrP,EAAIqT,EAAkBjH,EAAOkJ,IAAImB,YAAYpH,GAEpC,MAALrP,EACAwW,EAAc3E,IAAS7R,EAEvBoM,EAAOwF,IAAI9G,aAAeuE,CAE9B,MAEJ,KAAK,IACL,IAAK,KACY,MAATA,IACAmH,EAAc1E,IAAQjC,EAAMR,GAEhC,MACJ,KAAK,KACY,MAATA,IACAmH,EAAc1E,IAAQjC,EAAM6G,SAASrH,EAAO,KAEhD,MAEJ,KAAK,MACL,IAAK,OACY,MAATA,IACAjD,EAAOuK,WAAa9G,EAAMR,GAG9B,MAEJ,KAAK,KACDmH,EAAczE,IAAQxT,GAAOqY,kBAAkBvH,EAC/C,MACJ,KAAK,OACL,IAAK,QACL,IAAK,SACDmH,EAAczE,IAAQlC,EAAMR,EAC5B,MAEJ,KAAK,IACL,IAAK,IACDjD,EAAOyK,MAAQxD,EAAkBjH,EAAOkJ,IAAIwB,KAAKzH,EACjD,MAEJ,KAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KACDmH,EAAcxE,IAAQnC,EAAMR,EAC5B,MAEJ,KAAK,IACL,IAAK,KACDmH,EAAcvE,IAAUpC,EAAMR,EAC9B,MAEJ,KAAK,IACL,IAAK,KACDmH,EAActE,IAAUrC,EAAMR,EAC9B,MAEJ,KAAK,IACL,IAAK,KACL,IAAK,MACL,IAAK,OACDmH,EAAcrE,IAAetC,EAAuB,KAAhB,KAAOR,GAC3C,MAEJ,KAAK,IACDjD,EAAO4C,GAAK,GAAIjQ,MAAyB,IAApBgY,WAAW1H,GAChC,MAEJ,KAAK,IACL,IAAK,KACDjD,EAAO4K,SAAU,EACjB5K,EAAO6K,KAAOhB,EAA0B5G,EACxC,MAEJ,KAAK,KACL,IAAK,MACL,IAAK,OACDrP,EAAIqT,EAAkBjH,EAAOkJ,IAAI4B,cAAc7H,GAEtC,MAALrP,GACAoM,EAAO+K,GAAK/K,EAAO+K,OACnB/K,EAAO+K,GAAM,EAAInX,GAEjBoM,EAAOwF,IAAIwF,eAAiB/H,CAEhC,MAEJ,KAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,IACL,IAAK,IACDqF,EAAQA,EAAMhP,OAAO,EAAG,EAE5B,KAAK,OACL,IAAK,OACL,IAAK,QACDgP,EAAQA,EAAMhP,OAAO,EAAG,GACpB2J,IACAjD,EAAO+K,GAAK/K,EAAO+K,OACnB/K,EAAO+K,GAAGzC,GAAS7E,EAAMR,GAE7B,MACJ,KAAK,KACL,IAAK,KACDjD,EAAO+K,GAAK/K,EAAO+K,OACnB/K,EAAO+K,GAAGzC,GAASnW,GAAOqY,kBAAkBvH,IAIpD,QAASgI,GAAsBjL,GAC3B,GAAIkL,GAAGC,EAAUtK,EAAMuK,EAASlG,EAAKC,EAAKkG,EAAMzL,CAEhDsL,GAAIlL,EAAO+K,GACC,MAARG,EAAEI,IAAqB,MAAPJ,EAAEK,GAAoB,MAAPL,EAAEM,GACjCtG,EAAM,EACNC,EAAM,EAMNgG,EAAWjN,EAAIgN,EAAEI,GAAItL,EAAOuF,GAAGI,IAAOP,GAAWjT,KAAU,EAAG,GAAGoO,MACjEM,EAAO3C,EAAIgN,EAAEK,EAAG,GAChBH,EAAUlN,EAAIgN,EAAEM,EAAG,KAEnB5L,EAAOqH,EAAkBjH,EAAOkJ,IAChChE,EAAMtF,EAAK6L,MAAMvG,IACjBC,EAAMvF,EAAK6L,MAAMtG,IAEjBgG,EAAWjN,EAAIgN,EAAEQ,GAAI1L,EAAOuF,GAAGI,IAAOP,GAAWjT,KAAU+S,EAAKC,GAAK5E,MACrEM,EAAO3C,EAAIgN,EAAEA,EAAG,GAEL,MAAPA,EAAErQ,GAEFuQ,EAAUF,EAAErQ,EACEqK,EAAVkG,KACEvK,GAINuK,EAFc,MAAPF,EAAEpQ,EAECoQ,EAAEpQ,EAAIoK,EAGNA,GAGlBmG,EAAOM,GAAmBR,EAAUtK,EAAMuK,EAASjG,EAAKD,GAExDlF,EAAOuF,GAAGI,IAAQ0F,EAAK9K,KACvBP,EAAOuK,WAAac,EAAKO,UAO7B,QAASC,GAAe7L,GACpB,GAAInM,GAAGiY,EAAkBC,EAAaC,EAAzB/I,IAEb,KAAIjD,EAAO4C,GAAX,CA6BA,IAzBAmJ,EAAcE,EAAiBjM,GAG3BA,EAAO+K,IAAyB,MAAnB/K,EAAOuF,GAAGG,KAAqC,MAApB1F,EAAOuF,GAAGE,KAClDwF,EAAsBjL,GAItBA,EAAOuK,aACPyB,EAAY9N,EAAI8B,EAAOuF,GAAGI,IAAOoG,EAAYpG,KAEzC3F,EAAOuK,WAAalF,EAAW2G,KAC/BhM,EAAOwF,IAAIQ,oBAAqB,GAGpC8F,EAAOI,GAAYF,EAAW,EAAGhM,EAAOuK,YACxCvK,EAAOuF,GAAGE,IAASqG,EAAKK,cACxBnM,EAAOuF,GAAGG,IAAQoG,EAAK9G,cAQtBnR,EAAI,EAAO,EAAJA,GAAyB,MAAhBmM,EAAOuF,GAAG1R,KAAcA,EACzCmM,EAAOuF,GAAG1R,GAAKoP,EAAMpP,GAAKkY,EAAYlY,EAI1C,MAAW,EAAJA,EAAOA,IACVmM,EAAOuF,GAAG1R,GAAKoP,EAAMpP,GAAsB,MAAhBmM,EAAOuF,GAAG1R,GAAqB,IAANA,EAAU,EAAI,EAAKmM,EAAOuF,GAAG1R,EAGrFmM,GAAO4C,IAAM5C,EAAO4K,QAAUsB,GAAcE,IAAU/M,MAAM,KAAM4D,GAG/C,MAAfjD,EAAO6K,MACP7K,EAAO4C,GAAGyJ,cAAcrM,EAAO4C,GAAG0J,gBAAkBtM,EAAO6K,OAInE,QAAS0B,GAAevM,GACpB,GAAII,EAEAJ,GAAO4C,KAIXxC,EAAkBC,EAAqBL,EAAOwM,IAC9CxM,EAAOuF,IACHnF,EAAgBG,KAChBH,EAAgBO,MAChBP,EAAgBW,IAChBX,EAAgBa,KAChBb,EAAgBe,OAChBf,EAAgBiB,OAChBjB,EAAgBmB,aAGpBsK,EAAe7L,IAGnB,QAASiM,GAAiBjM,GACtB,GAAIyM,GAAM,GAAI9Z,KACd,OAAIqN,GAAO4K,SAEH6B,EAAIC,iBACJD,EAAIN,cACJM,EAAIzH,eAGAyH,EAAIE,cAAeF,EAAIG,WAAYH,EAAII,WAKvD,QAASC,GAA4B9M,GAEjC,GAAIA,EAAO+M,KAAO5a,GAAO6a,SAErB,WADAC,GAASjN,EAIbA,GAAOuF,MACPvF,EAAOwF,IAAIpH,OAAQ,CAGnB,IAEIvK,GAAGqZ,EAAaC,EAAQ7E,EAAO8E,EAF/BxN,EAAOqH,EAAkBjH,EAAOkJ,IAChCY,EAAS,GAAK9J,EAAOwM,GAErBa,EAAevD,EAAO9V,OACtBsZ,EAAyB,CAI7B,KAFAH,EAASrF,EAAa9H,EAAO+M,GAAInN,GAAMhN,MAAM8U,QAExC7T,EAAI,EAAGA,EAAIsZ,EAAOnZ,OAAQH,IAC3ByU,EAAQ6E,EAAOtZ,GACfqZ,GAAepD,EAAOlX,MAAMyV,EAAsBC,EAAOtI,SAAgB,GACrEkN,IACAE,EAAUtD,EAAOxQ,OAAO,EAAGwQ,EAAO9U,QAAQkY,IACtCE,EAAQpZ,OAAS,GACjBgM,EAAOwF,IAAIlH,YAAY9H,KAAK4W,GAEhCtD,EAASA,EAAOvC,MAAMuC,EAAO9U,QAAQkY,GAAeA,EAAYlZ,QAChEsZ,GAA0BJ,EAAYlZ,QAGtC2T,GAAqBW,IACjB4E,EACAlN,EAAOwF,IAAIpH,OAAQ,EAGnB4B,EAAOwF,IAAInH,aAAa7H,KAAK8R,GAEjC6B,EAAwB7B,EAAO4E,EAAalN,IAEvCA,EAAOoG,UAAY8G,GACxBlN,EAAOwF,IAAInH,aAAa7H,KAAK8R,EAKrCtI,GAAOwF,IAAIhH,cAAgB6O,EAAeC,EACtCxD,EAAO9V,OAAS,GAChBgM,EAAOwF,IAAIlH,YAAY9H,KAAKsT,GAI5B9J,EAAOyK,OAASzK,EAAOuF,GAAGK,IAAQ,KAClC5F,EAAOuF,GAAGK,KAAS,IAGnB5F,EAAOyK,SAAU,GAA6B,KAApBzK,EAAOuF,GAAGK,MACpC5F,EAAOuF,GAAGK,IAAQ,GAGtBiG,EAAe7L,GACfC,EAAcD,GAGlB,QAAS4J,GAAe/P,GACpB,MAAOA,GAAEa,QAAQ,sCAAuC,SAAU6S,EAASC,EAAIC,EAAIC,EAAIC,GACnF,MAAOH,IAAMC,GAAMC,GAAMC,IAKjC,QAAShE,GAAa9P,GAClB,MAAOA,GAAEa,QAAQ,yBAA0B,QAI/C,QAASkT,GAA2B5N,GAChC,GAAI6N,GACAC,EAEAC,EACAla,EACAma,CAEJ,IAAyB,IAArBhO,EAAO+M,GAAG/Y,OAGV,MAFAgM,GAAOwF,IAAI7G,eAAgB,OAC3BqB,EAAO4C,GAAK,GAAIjQ,MAAKsb,KAIzB,KAAKpa,EAAI,EAAGA,EAAImM,EAAO+M,GAAG/Y,OAAQH,IAC9Bma,EAAe,EACfH,EAAala,KAAWqM,GACxB6N,EAAWrI,IAAMrH,IACjB0P,EAAWd,GAAK/M,EAAO+M,GAAGlZ,GAC1BiZ,EAA4Be,GAEvB5H,EAAQ4H,KAKbG,GAAgBH,EAAWrI,IAAIhH,cAG/BwP,GAAqD,GAArCH,EAAWrI,IAAInH,aAAarK,OAE5C6Z,EAAWrI,IAAI0I,MAAQF,GAEJ,MAAfD,GAAsCA,EAAfC,KACvBD,EAAcC,EACdF,EAAaD,GAIrBla,GAAOqM,EAAQ8N,GAAcD,GAIjC,QAASZ,GAASjN,GACd,GAAInM,GAAGsa,EACHrE,EAAS9J,EAAOwM,GAChB5Z,EAAQwb,GAAStb,KAAKgX,EAE1B,IAAIlX,EAAO,CAEP,IADAoN,EAAOwF,IAAI3G,KAAM,EACZhL,EAAI,EAAGsa,EAAIE,GAASra,OAAYma,EAAJta,EAAOA,IACpC,GAAIwa,GAASxa,GAAG,GAAGf,KAAKgX,GAAS,CAE7B9J,EAAO+M,GAAKsB,GAASxa,GAAG,IAAMjB,EAAM,IAAM,IAC1C,OAGR,IAAKiB,EAAI,EAAGsa,EAAIG,GAASta,OAAYma,EAAJta,EAAOA,IACpC,GAAIya,GAASza,GAAG,GAAGf,KAAKgX,GAAS,CAC7B9J,EAAO+M,IAAMuB,GAASza,GAAG,EACzB,OAGJiW,EAAOlX,MAAMyW,MACbrJ,EAAO+M,IAAM,KAEjBD,EAA4B9M,OAE5BA,GAAOkG,UAAW,EAK1B,QAASqI,GAAmBvO,GACxBiN,EAASjN,GACLA,EAAOkG,YAAa,UACblG,GAAOkG,SACd/T,GAAOqc,wBAAwBxO,IAIvC,QAASyO,IAAkBzO,GACvB,GAAIiD,GAAQjD,EAAOwM,GACfe,EAAUmB,GAAgB5b,KAAKmQ,EAE/BA,KAAUpO,EACVmL,EAAO4C,GAAK,GAAIjQ,MACT4a,EACPvN,EAAO4C,GAAK,GAAIjQ,OAAM4a,EAAQ,IACN,gBAAVtK,GACdsL,EAAmBvO,GACZzL,EAAQ0O,IACfjD,EAAOuF,GAAKtC,EAAMsE,MAAM,GACxBsE,EAAe7L,IACRtN,EAAOuQ,GACdjD,EAAO4C,GAAK,GAAIjQ,OAAMsQ,GACG,gBAAZ,GACbsJ,EAAevM,GACU,gBAAZ,GAEbA,EAAO4C,GAAK,GAAIjQ,MAAKsQ,GAErB9Q,GAAOqc,wBAAwBxO,GAIvC,QAASoM,IAASuC,EAAGzf,EAAG2L,EAAGjB,EAAGgV,EAAG/U,EAAGgV,GAGhC,GAAI/C,GAAO,GAAInZ,MAAKgc,EAAGzf,EAAG2L,EAAGjB,EAAGgV,EAAG/U,EAAGgV,EAMtC,OAHQ,MAAJF,GACA7C,EAAKgD,YAAYH,GAEd7C,EAGX,QAASI,IAAYyC,GACjB,GAAI7C,GAAO,GAAInZ,MAAKA,KAAKoS,IAAI1F,MAAM,KAAMtL,WAIzC,OAHQ,MAAJ4a,GACA7C,EAAKiD,eAAeJ,GAEjB7C,EAGX,QAASkD,IAAa/L,EAAOgM,GACzB,GAAqB,gBAAVhM,GACP,GAAKlQ,MAAMkQ,IAKP,GADAA,EAAQgM,EAASnE,cAAc7H,GACV,gBAAVA,GACP,MAAO,UALXA,GAAQqH,SAASrH,EAAO,GAShC,OAAOA,GASX,QAASiM,IAAkBpF,EAAQ7H,EAAQkN,EAAeC,EAAUxP,GAChE,MAAOA,GAAKyP,aAAapN,GAAU,IAAKkN,EAAerF,EAAQsF,GAGnE,QAASC,IAAa/N,EAAc6N,EAAevP,GAC/C,GAAIwB,GAAUkO,GAAM/b,KAAK+O,IAAIhB,GAAgB,KACzCJ,EAAUoO,GAAMlO,EAAU,IAC1BJ,EAAQsO,GAAMpO,EAAU,IACxBJ,EAAOwO,GAAMtO,EAAQ,IACrBV,EAAQgP,GAAMxO,EAAO,KACrByO,EAAOnO,EAAUoO,GAAuB3V,IAAO,IAAKuH,IACpC,IAAZF,IAAkB,MAClBA,EAAUsO,GAAuBtgB,IAAM,KAAMgS,IACnC,IAAVF,IAAgB,MAChBA,EAAQwO,GAAuB5V,IAAM,KAAMoH,IAClC,IAATF,IAAe,MACfA,GAAQ0O,GAAuBC,KAAO,KAAM3O,IAC5CA,GAAQ0O,GAAuBE,KAAO,MACtC5O,EAAO0O,GAAuBG,KAAO,KAAML,GAAMxO,EAAO,MAC9C,IAAVR,IAAgB,OAAS,KAAMA,EAIvC,OAHAiP,GAAK,GAAKJ,EACVI,EAAK,GAAKjO,EAAe,EACzBiO,EAAK,GAAK3P,EACHsP,GAAkB7P,SAAUkQ,GAgBvC,QAASnK,IAAW3C,EAAKmN,EAAgBC,GACrC,GAEIC,GAFAC,EAAMF,EAAuBD,EAC7BI,EAAkBH,EAAuBpN,EAAI1B,KAajD,OATIiP,GAAkBD,IAClBC,GAAmB,GAGDD,EAAM,EAAxBC,IACAA,GAAmB,GAGvBF,EAAiB3d,GAAOsQ,GAAKwN,IAAI,IAAKD,IAElCnP,KAAMtN,KAAK2O,KAAK4N,EAAelE,YAAc,GAC7CrL,KAAMuP,EAAevP,QAK7B,QAASoL,IAAmBpL,EAAMM,EAAMuK,EAASyE,EAAsBD,GACnE,GAA6CM,GAAWtE,EAApD/Q,EAAIqR,GAAY3L,EAAM,EAAG,GAAG4P,WAOhC,OALAtV,GAAU,IAANA,EAAU,EAAIA,EAClBuQ,EAAqB,MAAXA,EAAkBA,EAAUwE,EACtCM,EAAYN,EAAiB/U,GAAKA,EAAIgV,EAAuB,EAAI,IAAUD,EAAJ/U,EAAqB,EAAI,GAChG+Q,EAAY,GAAK/K,EAAO,IAAMuK,EAAUwE,GAAkBM,EAAY,GAGlE3P,KAAMqL,EAAY,EAAIrL,EAAOA,EAAO,EACpCqL,UAAWA,EAAY,EAAKA,EAAYvG,EAAW9E,EAAO,GAAKqL,GAQvE,QAASwE,IAAWpQ,GAChB,GAAIiD,GAAQjD,EAAOwM,GACfpI,EAASpE,EAAO+M,EAEpB,OAAc,QAAV9J,GAAmBmB,IAAWvP,GAAuB,KAAVoO,EACpC9Q,GAAOke,SAAS5R,WAAW,KAGjB,gBAAVwE,KACPjD,EAAOwM,GAAKvJ,EAAQgE,IAAoBqJ,SAASrN,IAGjD9Q,GAAOmD,SAAS2N,IAChBjD,EAAS6B,EAAYoB,GAErBjD,EAAO4C,GAAK,GAAIjQ,OAAMsQ,EAAML,KACrBwB,EACH7P,EAAQ6P,GACRwJ,EAA2B5N,GAE3B8M,EAA4B9M,GAGhCyO,GAAkBzO,GAGf,GAAID,GAAOC,IAwCtB,QAASuQ,IAAOvR,EAAIwR,GAChB,GAAIC,GAAK5c,CAIT,IAHuB,IAAnB2c,EAAQxc,QAAgBO,EAAQic,EAAQ,MACxCA,EAAUA,EAAQ,KAEjBA,EAAQxc,OACT,MAAO7B,KAGX,KADAse,EAAMD,EAAQ,GACT3c,EAAI,EAAGA,EAAI2c,EAAQxc,SAAUH,EAC1B2c,EAAQ3c,GAAGmL,GAAIyR,KACfA,EAAMD,EAAQ3c,GAGtB,OAAO4c,GAqmBX,QAASzN,IAAeP,EAAK/M,GACzB,GAAIgb,EAGJ,OAAqB,gBAAVhb,KACPA,EAAQ+M,EAAI7C,OAAOyK,YAAY3U,GAEV,gBAAVA,IACA+M,GAIfiO,EAAand,KAAKwG,IAAI0I,EAAIqJ,OAClBhH,EAAYrC,EAAIlC,OAAQ7K,IAChC+M,EAAIG,GAAG,OAASH,EAAI+D,OAAS,MAAQ,IAAM,SAAS9Q,EAAOgb,GACpDjO,GAGX,QAASM,IAAUN,EAAKkO,GACpB,MAAOlO,GAAIG,GAAG,OAASH,EAAI+D,OAAS,MAAQ,IAAMmK,KAGtD,QAAS7N,IAAUL,EAAKkO,EAAMjb,GAC1B,MAAa,UAATib,EACO3N,GAAeP,EAAK/M,GAEpB+M,EAAIG,GAAG,OAASH,EAAI+D,OAAS,MAAQ,IAAMmK,GAAMjb,GAIhE,QAASkb,IAAaD,EAAME,GACxB,MAAO,UAAUnb,GACb,MAAa,OAATA,GACAoN,GAAUpU,KAAMiiB,EAAMjb,GACtBvD,GAAOwQ,aAAajU,KAAMmiB,GACnBniB,MAEAqU,GAAUrU,KAAMiiB,IAwJnC,QAASG,IAAmBC,GACxB5e,GAAOgO,SAASnB,GAAG+R,GAAQ,WACvB,MAAOriB,MAAKiT,MAAMoP,IAI1B,QAASC,IAAqBD,EAAME,GAChC9e,GAAOgO,SAASnB,GAAG,KAAO+R,GAAQ,WAC9B,OAAQriB,KAAOuiB,GAwCvB,QAASC,IAAWC,GAEK,mBAAVC,SAGXC,GAAkBC,GAAYnf,OAE1Bmf,GAAYnf,OADZgf,EACqBrS,EACb,uGAGA3M,IAEaA,IA9rE7B,IAnVA,GAAIA,IAIAkf,GAEAxd,GALA0d,GAAU,QAEVD,GAAgC,mBAAXrT,GAAyBA,EAASvP,KAEvD4gB,GAAQ/b,KAAK+b,MAGb3J,GAAO,EACPF,GAAQ,EACRC,GAAO,EACPE,GAAO,EACPC,GAAS,EACTC,GAAS,EACTC,GAAc,EAGdgB,MAGAhF,IACIyP,iBAAkB,KAClBhF,GAAK,KACLO,GAAK,KACL7D,GAAK,KACL9C,QAAU,KACVyE,KAAO,KACPrE,OAAS,KACTE,QAAU,KACVlB,IAAM,KACNjB,MAAQ,MAIZ+C,GAA+B,mBAAX/Y,IAA0BA,EAAOD,QAGrDogB,GAAkB,sBAClB+C,GAA0B,uDAI1BC,GAAmB,gIAGnBhK,GAAmB,mKACnBS,GAAwB,yCAGxBqB,GAA2B,QAC3BR,GAA6B,UAC7BL,GAA4B,UAC5BG,GAA2B,gBAC3BS,GAAmB,MACnBN,GAAiB,mHACjBI,GAAqB,uBACrBC,GAAc,KACdF,GAAwB,yBACxBK,GAAoB,UAGpBjB,GAAqB,KACrBO,GAAsB,OACtBN,GAAwB,QACxBC,GAAuB,QACvBG,GAAsB,aACtBD,GAAyB,WAIzBwF,GAAW,4IAEXuD,GAAY,uBAEZtD,KACK,eAAgB,0BAChB,aAAc,sBACd,eAAgB,oBAChB,aAAc,iBACd,WAAY,gBAIjBC,KACK,gBAAiB,6BACjB,WAAY,wBACZ,QAAS,mBACT,KAAM,cAIXpE,GAAuB,kBAIvB0H,IADyB,0CAA0Crb,MAAM,MAErEsb,aAAiB,EACjBC,QAAY,IACZC,QAAY,IACZC,MAAU,KACVC,KAAS,MACTC,OAAW,OACXC,MAAU,UAGdrO,IACI+K,GAAK,cACLhV,EAAI,SACJ3K,EAAI,SACJ0K,EAAI,OACJiB,EAAI,MACJuX,EAAI,OACJlH,EAAI,OACJK,EAAI,UACJqD,EAAI,QACJyD,EAAI,UACJ1D,EAAI,OACJ2D,IAAM,YACNxX,EAAI,UACJ0Q,EAAI,aACJE,GAAI,WACJJ,GAAI,eAGRvH,IACIwO,UAAY,YACZC,WAAa,aACbC,QAAU,UACVC,SAAW,WACXC,YAAc,eAIlB5K,MAGAyH,IACE3V,EAAG,GACH3K,EAAG,GACH0K,EAAG,GACH6V,GAAI,GACJC,GAAI,GACJC,GAAI,KAINiD,GAAmB,gBAAgBrc,MAAM,KACzCsc,GAAe,kBAAkBtc,MAAM,KAEvCoR,IACIiH,EAAO,WACH,MAAOlgB,MAAKiS,QAAU,GAE1BmS,IAAO,SAAU1O,GACb,MAAO1V,MAAKkR,OAAOmT,YAAYrkB,KAAM0V,IAEzC4O,KAAO,SAAU5O,GACb,MAAO1V,MAAKkR,OAAOc,OAAOhS,KAAM0V,IAEpCgO,EAAO,WACH,MAAO1jB,MAAKod,QAEhBwG,IAAO,WACH,MAAO5jB,MAAKkd,aAEhB/Q,EAAO,WACH,MAAOnM,MAAKqS,OAEhB0O,GAAO,SAAUrL,GACb,MAAO1V,MAAKkR,OAAOqT,YAAYvkB,KAAM0V,IAEzC8O,IAAO,SAAU9O,GACb,MAAO1V,MAAKkR,OAAOuT,cAAczkB,KAAM0V,IAE3CgP,KAAO,SAAUhP,GACb,MAAO1V,MAAKkR,OAAOyT,SAAS3kB,KAAM0V,IAEtC8G,EAAO,WACH,MAAOxc,MAAKmS,QAEhB0K,EAAO,WACH,MAAO7c,MAAK4kB,WAEhBC,GAAO,WACH,MAAO9T,GAAa/Q,KAAK6R,OAAS,IAAK,IAE3CiT,KAAO,WACH,MAAO/T,GAAa/Q,KAAK6R,OAAQ,IAErCkT,MAAQ,WACJ,MAAOhU,GAAa/Q,KAAK6R,OAAQ,IAErCmT,OAAS,WACL,GAAI/E,GAAIjgB,KAAK6R,OAAQgC,EAAOoM,GAAK,EAAI,IAAM,GAC3C,OAAOpM,GAAO9C,EAAalM,KAAK+O,IAAIqM,GAAI,IAE5CjD,GAAO,WACH,MAAOjM,GAAa/Q,KAAKyc,WAAa,IAAK,IAE/CwI,KAAO,WACH,MAAOlU,GAAa/Q,KAAKyc,WAAY,IAEzCyI,MAAQ,WACJ,MAAOnU,GAAa/Q,KAAKyc,WAAY,IAEzCG,GAAO,WACH,MAAO7L,GAAa/Q,KAAKmlB,cAAgB,IAAK,IAElDC,KAAO,WACH,MAAOrU,GAAa/Q,KAAKmlB,cAAe,IAE5CE,MAAQ,WACJ,MAAOtU,GAAa/Q,KAAKmlB,cAAe,IAE5C/Y,EAAI,WACA,MAAOpM,MAAK0c,WAEhBI,EAAI,WACA,MAAO9c,MAAKslB,cAEhBpgB,EAAO,WACH,MAAOlF,MAAKkR,OAAOqU,SAASvlB,KAAKsS,QAAStS,KAAKwS,WAAW,IAE9DgT,EAAO,WACH,MAAOxlB,MAAKkR,OAAOqU,SAASvlB,KAAKsS,QAAStS,KAAKwS,WAAW,IAE9DiT,EAAO,WACH,MAAOzlB,MAAKsS,SAEhBpH,EAAO,WACH,MAAOlL,MAAKsS,QAAU,IAAM,IAEhC9R,EAAO,WACH,MAAOR,MAAKwS,WAEhBrH,EAAO,WACH,MAAOnL,MAAK0S,WAEhBgT,EAAO,WACH,MAAO3Q,GAAM/U,KAAK4S,eAAiB,MAEvC+S,GAAO,WACH,MAAO5U,GAAagE,EAAM/U,KAAK4S,eAAiB,IAAK,IAEzDgT,IAAO,WACH,MAAO7U,GAAa/Q,KAAK4S,eAAgB,IAE7CiT,KAAO,WACH,MAAO9U,GAAa/Q,KAAK4S,eAAgB,IAE7CkT,EAAO,WACH,GAAI5gB,IAAKlF,KAAK+X,OACVhS,EAAI,GAKR,OAJQ,GAAJb,IACAA,GAAKA,EACLa,EAAI,KAEDA,EAAIgL,EAAagE,EAAM7P,EAAI,IAAK,GAAK,IAAM6L,EAAagE,EAAM7P,GAAK,GAAI,IAElF6gB,GAAO,WACH,GAAI7gB,IAAKlF,KAAK+X,OACVhS,EAAI,GAKR,OAJQ,GAAJb,IACAA,GAAKA,EACLa,EAAI,KAEDA,EAAIgL,EAAagE,EAAM7P,EAAI,IAAK,GAAK6L,EAAagE,EAAM7P,GAAK,GAAI,IAE5E8gB,EAAI,WACA,MAAOhmB,MAAKimB,YAEhBC,GAAK,WACD,MAAOlmB,MAAKmmB,YAEhBC,EAAO,WACH,MAAOpmB,MAAKqmB,QAEhB1C,EAAI,WACA,MAAO3jB,MAAK+R,YAIpBuU,IAAS,SAAU,cAAe,WAAY,gBAAiB,eAyD5DpC,GAAiB5e,QACpBH,GAAI+e,GAAiBqC,MACrBtN,GAAqB9T,GAAI,KAAO6L,EAAgBiI,GAAqB9T,IAAIA,GAE7E,MAAOgf,GAAa7e,QAChBH,GAAIgf,GAAaoC,MACjBtN,GAAqB9T,GAAIA,IAAKyL,EAASqI,GAAqB9T,IAAI,EAmgDpE,KAjgDA8T,GAAqBuN,KAAO5V,EAASqI,GAAqB2K,IAAK,GA+S/D3e,EAAOmM,EAASoD,WAEZwB,IAAM,SAAU1E,GACZ,GAAI9L,GAAML,CACV,KAAKA,IAAKmM,GACN9L,EAAO8L,EAAOnM,GACM,kBAATK,GACPxF,KAAKmF,GAAKK,EAEVxF,KAAK,IAAMmF,GAAKK,GAK5BwN,QAAU,wFAAwFnL,MAAM,KACxGmK,OAAS,SAAUxR,GACf,MAAOR,MAAKgT,QAAQxS,EAAEyR,UAG1BwU,aAAe,kDAAkD5e,MAAM,KACvEwc,YAAc,SAAU7jB,GACpB,MAAOR,MAAKymB,aAAajmB,EAAEyR,UAG/B0J,YAAc,SAAU+K,GACpB,GAAIvhB,GAAG4O,EAAK4S,CAMZ,KAJK3mB,KAAK4mB,eACN5mB,KAAK4mB,iBAGJzhB,EAAI,EAAO,GAAJA,EAAQA,IAQhB,GANKnF,KAAK4mB,aAAazhB,KACnB4O,EAAMtQ,GAAOsS,KAAK,IAAM5Q,IACxBwhB,EAAQ,IAAM3mB,KAAKgS,OAAO+B,EAAK,IAAM,KAAO/T,KAAKqkB,YAAYtQ,EAAK,IAClE/T,KAAK4mB,aAAazhB,GAAK,GAAI6V,QAAO2L,EAAM3a,QAAQ,IAAK,IAAK,MAG1DhM,KAAK4mB,aAAazhB,GAAGkI,KAAKqZ,GAC1B,MAAOvhB,IAKnB0hB,UAAY,2DAA2Dhf,MAAM,KAC7E8c,SAAW,SAAUnkB,GACjB,MAAOR,MAAK6mB,UAAUrmB,EAAE6R,QAG5ByU,eAAiB,8BAA8Bjf,MAAM,KACrD4c,cAAgB,SAAUjkB,GACtB,MAAOR,MAAK8mB,eAAetmB,EAAE6R,QAGjC0U,aAAe,uBAAuBlf,MAAM,KAC5C0c,YAAc,SAAU/jB,GACpB,MAAOR,MAAK+mB,aAAavmB,EAAE6R,QAG/B+J,cAAgB,SAAU4K,GACtB,GAAI7hB,GAAG4O,EAAK4S,CAMZ,KAJK3mB,KAAKinB,iBACNjnB,KAAKinB,mBAGJ9hB,EAAI,EAAO,EAAJA,EAAOA,IAQf,GANKnF,KAAKinB,eAAe9hB,KACrB4O,EAAMtQ,IAAQ,IAAM,IAAI4O,IAAIlN,GAC5BwhB,EAAQ,IAAM3mB,KAAK2kB,SAAS5Q,EAAK,IAAM,KAAO/T,KAAKykB,cAAc1Q,EAAK,IAAM,KAAO/T,KAAKukB,YAAYxQ,EAAK,IACzG/T,KAAKinB,eAAe9hB,GAAK,GAAI6V,QAAO2L,EAAM3a,QAAQ,IAAK,IAAK,MAG5DhM,KAAKinB,eAAe9hB,GAAGkI,KAAK2Z,GAC5B,MAAO7hB,IAKnB+hB,iBACIC,GAAK,SACLC,EAAI,aACJC,GAAK,cACLC,IAAM,iBACNC,KAAO,wBAEX/N,eAAiB,SAAUhR,GACvB,GAAImL,GAAS3T,KAAKknB,gBAAgB1e,EAOlC,QANKmL,GAAU3T,KAAKknB,gBAAgB1e,EAAIyD,iBACpC0H,EAAS3T,KAAKknB,gBAAgB1e,EAAIyD,eAAeD,QAAQ,mBAAoB,SAAUwb,GACnF,MAAOA,GAAI3O,MAAM,KAErB7Y,KAAKknB,gBAAgB1e,GAAOmL,GAEzBA,GAGXqI,KAAO,SAAUzH,GAGb,MAAiD,OAAxCA,EAAQ,IAAIY,cAAcsS,OAAO,IAG9ChN,eAAiB,gBACjB8K,SAAW,SAAUjT,EAAOE,EAASkV,GACjC,MAAIpV,GAAQ,GACDoV,EAAU,KAAO,KAEjBA,EAAU,KAAO,MAIhCC,WACIC,QAAU,gBACVC,QAAU,mBACVC,SAAW,eACXC,QAAU,oBACVC,SAAW,sBACXC,SAAW,KAEfC,SAAW,SAAU1f,EAAKuL,GACtB,GAAIJ,GAAS3T,KAAK2nB,UAAUnf,EAC5B,OAAyB,kBAAXmL,GAAwBA,EAAOhD,MAAMoD,GAAOJ,GAG9DwU,eACIC,OAAS,QACTC,KAAO,SACPld,EAAI,gBACJ3K,EAAI,WACJ8nB,GAAK,aACLpd,EAAI,UACJqd,GAAK,WACLpc,EAAI,QACJ4U,GAAK,UACLb,EAAI,UACJsI,GAAK,YACLvI,EAAI,SACJwI,GAAK,YAET9H,aAAe,SAAUpN,EAAQkN,EAAerF,EAAQsF,GACpD,GAAI/M,GAAS3T,KAAKmoB,cAAc/M,EAChC,OAA0B,kBAAXzH,GACXA,EAAOJ,EAAQkN,EAAerF,EAAQsF,GACtC/M,EAAO3H,QAAQ,MAAOuH,IAE9BmV,WAAa,SAAUC,EAAMhV,GACzB,GAAI+B,GAAS1V,KAAKmoB,cAAcQ,EAAO,EAAI,SAAW,OACtD,OAAyB,kBAAXjT,GAAwBA,EAAO/B,GAAU+B,EAAO1J,QAAQ,MAAO2H,IAGjFxC,QAAU,SAAUoC,GAChB,MAAOvT,MAAK4oB,SAAS5c,QAAQ,KAAMuH,IAEvCqV,SAAW,KAEXhH,SAAW,SAAUxG,GACjB,MAAOA,IAGXyN,WAAa,SAAUzN,GACnB,MAAOA,IAGXjJ,KAAO,SAAU4B,GACb,MAAO2C,IAAW3C,EAAK/T,KAAK+c,MAAMvG,IAAKxW,KAAK+c,MAAMtG,KAAKtE,MAG3D4K,OACIvG,IAAM,EACNC,IAAM,GAGVqS,aAAc,eACdxP,YAAa,WACT,MAAOtZ,MAAK8oB,gBAo0BpBrlB,GAAS,SAAU8Q,EAAOmB,EAAQxE,EAAM2I,GACpC,GAAIpZ,EAiBJ,OAfqB,iBAAX,KACNoZ,EAAS3I,EACTA,EAAO/K,GAIX1F,KACAA,EAAEqiB,kBAAmB,EACrBriB,EAAEqd,GAAKvJ,EACP9T,EAAE4d,GAAK3I,EACPjV,EAAE+Z,GAAKtJ,EACPzQ,EAAEiX,QAAUmC,EACZpZ,EAAEqX,QAAS,EACXrX,EAAEqW,IAAMrH,IAEDiS,GAAWjhB,IAGtBgD,GAAO+M,6BAA8B,EAErC/M,GAAOqc,wBAA0B1P,EACzB,4LAIA,SAAUkB,GACdA,EAAO4C,GAAK,GAAIjQ,MAAKqN,EAAOwM,MAyBhCra,GAAO4H,IAAM,WACT,GAAIwV,MAAUhI,MAAMtY,KAAK8E,UAAW,EAEpC,OAAOwc,IAAO,WAAYhB,IAG9Bpd,GAAOqJ,IAAM,WACT,GAAI+T,MAAUhI,MAAMtY,KAAK8E,UAAW,EAEpC,OAAOwc,IAAO,UAAWhB,IAI7Bpd,GAAOsS,IAAM,SAAUxB,EAAOmB,EAAQxE,EAAM2I,GACxC,GAAIpZ,EAkBJ,OAhBqB,iBAAX,KACNoZ,EAAS3I,EACTA,EAAO/K,GAIX1F,KACAA,EAAEqiB,kBAAmB,EACrBriB,EAAEyb,SAAU,EACZzb,EAAEqX,QAAS,EACXrX,EAAE+Z,GAAKtJ,EACPzQ,EAAEqd,GAAKvJ,EACP9T,EAAE4d,GAAK3I,EACPjV,EAAEiX,QAAUmC,EACZpZ,EAAEqW,IAAMrH,IAEDiS,GAAWjhB,GAAGsV,OAIzBtS,GAAO4iB,KAAO,SAAU9R,GACpB,MAAO9Q,IAAe,IAAR8Q,IAIlB9Q,GAAOgO,SAAW,SAAU8C,EAAO/L,GAC/B,GAGIqL,GACAkV,EACAC,EALAvX,EAAW8C,EAEXrQ,EAAQ,IAuDZ,OAlDIT,IAAOwlB,WAAW1U,GAClB9C,GACI0O,GAAI5L,EAAMzB,cACV3G,EAAGoI,EAAMxB,MACTmN,EAAG3L,EAAMvB,SAEW,gBAAVuB,IACd9C,KACIjJ,EACAiJ,EAASjJ,GAAO+L,EAEhB9C,EAASmB,aAAe2B,IAElBrQ,EAAQ6e,GAAwB3e,KAAKmQ,KAC/CV,EAAqB,MAAb3P,EAAM,GAAc,GAAK,EACjCuN,GACIwO,EAAG,EACH9T,EAAG4I,EAAM7Q,EAAM8S,KAASnD,EACxB3I,EAAG6J,EAAM7Q,EAAMgT,KAASrD,EACxBrT,EAAGuU,EAAM7Q,EAAMiT,KAAWtD,EAC1B1I,EAAG4J,EAAM7Q,EAAMkT,KAAWvD,EAC1BsM,GAAIpL,EAAM7Q,EAAMmT,KAAgBxD,KAE1B3P,EAAQ8e,GAAiB5e,KAAKmQ,MACxCV,EAAqB,MAAb3P,EAAM,GAAc,GAAK,EACjC8kB,EAAW,SAAUE,GAIjB,GAAInH,GAAMmH,GAAOjN,WAAWiN,EAAIld,QAAQ,IAAK,KAE7C;OAAQ3H,MAAM0d,GAAO,EAAIA,GAAOlO,GAEpCpC,GACIwO,EAAG+I,EAAS9kB,EAAM,IAClBgc,EAAG8I,EAAS9kB,EAAM,IAClBiI,EAAG6c,EAAS9kB,EAAM,IAClBgH,EAAG8d,EAAS9kB,EAAM,IAClB1D,EAAGwoB,EAAS9kB,EAAM,IAClBiH,EAAG6d,EAAS9kB,EAAM,IAClBsY,EAAGwM,EAAS9kB,EAAM,MAI1B6kB,EAAM,GAAIvX,GAASC,GAEfhO,GAAOwlB,WAAW1U,IAAUA,EAAM9O,eAAe,WACjDsjB,EAAIlT,MAAQtB,EAAMsB,OAGfkT,GAIXtlB,GAAO0lB,QAAUtG,GAGjBpf,GAAO2lB,cAAgBnG,GAGvBxf,GAAO6a,SAAW,aAIlB7a,GAAO4P,iBAAmBA,GAI1B5P,GAAOwQ,aAAe,aAGtBxQ,GAAO4lB,sBAAwB,SAASC,EAAWC,GACjD,MAAIzI,IAAuBwI,KAAenjB,GACjC,GAET2a,GAAuBwI,GAAaC,GAC7B,IAMT9lB,GAAOyN,KAAO,SAAU1I,EAAK2P,GACzB,GAAI7L,EACJ,OAAK9D,IAGD2P,EACAD,EAASP,EAAkBnP,GAAM2P,GACf,OAAXA,GACPG,EAAW9P,GACXA,EAAM,MACE6P,GAAU7P,IAClB+P,EAAkB/P,GAEtB8D,EAAI7I,GAAOgO,SAASnB,GAAGuF,MAAQpS,GAAO6M,GAAGuF,MAAQ0C,EAAkB/P,GAC5D8D,EAAEkd,OAXE/lB,GAAO6M,GAAGuF,MAAM2T,OAe/B/lB,GAAOgmB,SAAW,SAAUjhB,GAIxB,MAHIA,IAAOA,EAAIqN,OAASrN,EAAIqN,MAAM2T,QAC9BhhB,EAAMA,EAAIqN,MAAM2T,OAEbjR,EAAkB/P,IAI7B/E,GAAOmD,SAAW,SAAU8iB,GACxB,MAAOA,aAAerY,IACV,MAAPqY,GAAgBA,EAAIjkB,eAAe,qBAI5ChC,GAAOwlB,WAAa,SAAUS,GAC1B,MAAOA,aAAelY,IAGrBrM,GAAImhB,GAAMhhB,OAAS,EAAGH,IAAK,IAAKA,GACjCqQ,EAAS8Q,GAAMnhB,IAGnB1B,IAAOuR,eAAiB,SAAUC,GAC9B,MAAOD,GAAeC,IAG1BxR,GAAOke,QAAU,SAAUgI,GACvB,GAAInpB,GAAIiD,GAAOsS,IAAIwJ,IAQnB,OAPa,OAAToK,EACA1kB,EAAOzE,EAAEsW,IAAK6S,GAGdnpB,EAAEsW,IAAI5G,iBAAkB,EAGrB1P,GAGXiD,GAAOmmB,UAAY,WACf,MAAOnmB,IAAOkN,MAAM,KAAMtL,WAAWukB,aAGzCnmB,GAAOqY,kBAAoB,SAAUvH,GACjC,MAAOQ,GAAMR,IAAUQ,EAAMR,GAAS,GAAK,KAAO,MAQtDtP,EAAOxB,GAAO6M,GAAKe,EAAOmD,WAEtBqV,MAAQ,WACJ,MAAOpmB,IAAOzD,OAGlB2G,QAAU,WACN,OAAQ3G,KAAKkU,GAA4B,KAArBlU,KAAKgY,SAAW,IAGxCqO,KAAO,WACH,MAAOxhB,MAAKC,OAAO9E,KAAO,MAG9BgF,SAAW,WACP,MAAOhF,MAAK6pB,QAAQ3Y,KAAK,MAAMwE,OAAO,qCAG1C7O,OAAS,WACL,MAAO7G,MAAKgY,QAAU,GAAI/T,OAAMjE,MAAQA,KAAKkU,IAGjDnN,YAAc,WACV,GAAIvG,GAAIiD,GAAOzD,MAAM+V,KACrB,OAAI,GAAIvV,EAAEqR,QAAUrR,EAAEqR,QAAU,KACrBsH,EAAa3Y,EAAG,gCAEhB2Y,EAAa3Y,EAAG,mCAI/B6H,QAAU,WACN,GAAI7H,GAAIR,IACR,QACIQ,EAAEqR,OACFrR,EAAEyR,QACFzR,EAAE4c,OACF5c,EAAE8R,QACF9R,EAAEgS,UACFhS,EAAEkS,UACFlS,EAAEoS,iBAIV2E,QAAU,WACN,MAAOA,GAAQvX,OAGnB8pB,aAAe,WAEX,MAAI9pB,MAAK6W,GACE7W,KAAKuX,WAAa9C,EAAczU,KAAK6W,IAAK7W,KAAK8X,OAASrU,GAAOsS,IAAI/V,KAAK6W,IAAMpT,GAAOzD,KAAK6W,KAAKxO,WAAa,GAGhH,GAGX0hB,aAAe,WACX,MAAO9kB,MAAWjF,KAAK8W,MAG3BkT,UAAW,WACP,MAAOhqB,MAAK8W,IAAIjH,UAGpBkG,IAAM,WACF,MAAO/V,MAAK+X,KAAK,IAGrBE,MAAQ,WAGJ,MAFAjY,MAAK+X,KAAK,GACV/X,KAAK8X,QAAS,EACP9X,MAGX0V,OAAS,SAAUuU,GACf,GAAItW,GAASwF,EAAanZ,KAAMiqB,GAAexmB,GAAO2lB,cACtD,OAAOppB,MAAKkR,OAAO2X,WAAWlV,IAGlC4N,IAAM,SAAUhN,EAAOiT,GACnB,GAAI0C,EAUJ,OAPIA,GADiB,gBAAV3V,IAAqC,gBAARiT,GAC9B/jB,GAAOgO,SAASpN,OAAOmjB,IAAQjT,GAASiT,EAAKnjB,OAAOmjB,GAAOA,EAAMjT,GAC/C,gBAAVA,GACR9Q,GAAOgO,UAAU+V,EAAKjT,GAEtB9Q,GAAOgO,SAAS8C,EAAOiT,GAEjC1T,EAAgC9T,KAAMkqB,EAAK,GACpClqB,MAGXmqB,SAAW,SAAU5V,EAAOiT,GACxB,GAAI0C,EAUJ,OAPIA,GADiB,gBAAV3V,IAAqC,gBAARiT,GAC9B/jB,GAAOgO,SAASpN,OAAOmjB,IAAQjT,GAASiT,EAAKnjB,OAAOmjB,GAAOA,EAAMjT,GAC/C,gBAAVA,GACR9Q,GAAOgO,UAAU+V,EAAKjT,GAEtB9Q,GAAOgO,SAAS8C,EAAOiT,GAEjC1T,EAAgC9T,KAAMkqB,EAAK,IACpClqB,MAGX2oB,KAAO,SAAUpU,EAAOU,EAAOmV,GAC3B,GAEIzB,GAAMhV,EAFN0W,EAAOzS,EAAOrD,EAAOvU,MACrBsqB,EAAyC,KAA7BtqB,KAAK+X,OAASsS,EAAKtS,OA6BnC,OA1BA9C,GAAQD,EAAeC,GAET,SAAVA,GAA8B,UAAVA,GAEpB0T,EAAmD,OAA3C3oB,KAAKoW,cAAgBiU,EAAKjU,eAElCzC,EAAwC,IAA7B3T,KAAK6R,OAASwY,EAAKxY,SAAiB7R,KAAKiS,QAAUoY,EAAKpY,SAGnE0B,IAAY3T,KAAOyD,GAAOzD,MAAMuqB,QAAQ,UAC/BF,EAAO5mB,GAAO4mB,GAAME,QAAQ,WAAa5B,EAElDhV,GACgE,KADpD3T,KAAK+X,OAAStU,GAAOzD,MAAMuqB,QAAQ,SAASxS,QAC/CsS,EAAKtS,OAAStU,GAAO4mB,GAAME,QAAQ,SAASxS,SAAiB4Q,EACxD,SAAV1T,IACAtB,GAAkB,MAGtBgV,EAAQ3oB,KAAOqqB,EACf1W,EAAmB,WAAVsB,EAAqB0T,EAAO,IACvB,WAAV1T,EAAqB0T,EAAO,IAClB,SAAV1T,EAAmB0T,EAAO,KAChB,QAAV1T,GAAmB0T,EAAO2B,GAAY,MAC5B,SAAVrV,GAAoB0T,EAAO2B,GAAY,OACvC3B,GAEDyB,EAAUzW,EAASL,EAASK,IAGvC6W,KAAO,SAAUC,EAAMhK,GACnB,MAAOhd,IAAOgO,SAASzR,KAAK2oB,KAAK8B,IAAOvZ,KAAKlR,KAAKkR,OAAOsY,OAAOkB,UAAUjK,IAG9EkK,QAAU,SAAUlK,GAChB,MAAOzgB,MAAKwqB,KAAK/mB,KAAUgd,IAG/ByH,SAAW,SAAUuC,GAGjB,GAAI1M,GAAM0M,GAAQhnB,KACdmnB,EAAMhT,EAAOmG,EAAK/d,MAAMuqB,QAAQ,OAChC5B,EAAO3oB,KAAK2oB,KAAKiC,EAAK,QAAQ,GAC9BlV,EAAgB,GAAPiT,EAAY,WACV,GAAPA,EAAY,WACL,EAAPA,EAAW,UACJ,EAAPA,EAAW,UACJ,EAAPA,EAAW,UACJ,EAAPA,EAAW,WAAa,UAChC,OAAO3oB,MAAK0V,OAAO1V,KAAKkR,OAAOgX,SAASxS,EAAQ1V,QAGpD4W,WAAa,WACT,MAAOA,GAAW5W,KAAK6R,SAG3BgZ,MAAQ,WACJ,MAAQ7qB,MAAK+X,OAAS/X,KAAK6pB,QAAQ5X,MAAM,GAAG8F,QACxC/X,KAAK+X,OAAS/X,KAAK6pB,QAAQ5X,MAAM,GAAG8F,QAG5C1F,IAAM,SAAUkC,GACZ,GAAIlC,GAAMrS,KAAK8X,OAAS9X,KAAKkU,GAAGuN,YAAczhB,KAAKkU,GAAG4W,QACtD,OAAa,OAATvW,GACAA,EAAQ+L,GAAa/L,EAAOvU,KAAKkR,QAC1BlR,KAAKuhB,KAAMpV,EAAIoI,EAAQlC,KAEvBA,GAIfJ,MAAQiQ,GAAa,SAAS,GAE9BqI,QAAS,SAAUtV,GAIf,OAHAA,EAAQD,EAAeC,IAIvB,IAAK,OACDjV,KAAKiS,MAAM,EAEf,KAAK,UACL,IAAK,QACDjS,KAAKod,KAAK,EAEd,KAAK,OACL,IAAK,UACL,IAAK,MACDpd,KAAKsS,MAAM,EAEf,KAAK,OACDtS,KAAKwS,QAAQ,EAEjB,KAAK,SACDxS,KAAK0S,QAAQ,EAEjB,KAAK,SACD1S,KAAK4S,aAAa,GAgBtB,MAXc,SAAVqC,EACAjV,KAAK0c,QAAQ,GACI,YAAVzH,GACPjV,KAAKslB,WAAW,GAIN,YAAVrQ,GACAjV,KAAKiS,MAAqC,EAA/BpN,KAAKC,MAAM9E,KAAKiS,QAAU,IAGlCjS,MAGX+qB,MAAO,SAAU9V,GAEb,MADAA,GAAQD,EAAeC,GAChBjV,KAAKuqB,QAAQtV,GAAOsM,IAAe,YAAVtM,EAAsB,OAASA,EAAQ,GAAGkV,SAAS,KAAM,IAG7Fa,QAAS,SAAUzW,EAAOU,GAEtB,MADAA,GAAyB,mBAAVA,GAAwBA,EAAQ,eACvCjV,KAAK6pB,QAAQU,QAAQtV,IAAUxR,GAAO8Q,GAAOgW,QAAQtV,IAGjEgW,SAAU,SAAU1W,EAAOU,GAEvB,MADAA,GAAyB,mBAAVA,GAAwBA,EAAQ,eACvCjV,KAAK6pB,QAAQU,QAAQtV,IAAUxR,GAAO8Q,GAAOgW,QAAQtV,IAGjEiW,OAAQ,SAAU3W,EAAOU,GAErB,MADAA,GAAQA,GAAS,MACTjV,KAAK6pB,QAAQU,QAAQtV,MAAY2C,EAAOrD,EAAOvU,MAAMuqB,QAAQtV,IAGzE5J,IAAK+E,EACI,mGACA,SAAU7K,GAEN,MADAA,GAAQ9B,GAAOkN,MAAM,KAAMtL,WACZrF,KAARuF,EAAevF,KAAOuF,IAI1CuH,IAAKsD,EACG,mGACA,SAAU7K,GAEN,MADAA,GAAQ9B,GAAOkN,MAAM,KAAMtL,WACpBE,EAAQvF,KAAOA,KAAOuF,IAczCwS,KAAO,SAAUxD,EAAO4N,GACpB,GAAIgJ,GAASnrB,KAAKgY,SAAW,CAC7B,OAAa,OAATzD,EAoBOvU,KAAK8X,OAASqT,EAASnrB,KAAKkU,GAAGkX,qBAnBjB,gBAAV7W,KACPA,EAAQ4G,EAA0B5G,IAElC1P,KAAK+O,IAAIW,GAAS,KAClBA,EAAgB,GAARA,GAEZvU,KAAKgY,QAAUzD,EACfvU,KAAK8X,QAAS,EACVqT,IAAW5W,KACN4N,GAAYniB,KAAKqrB,kBAClBvX,EAAgC9T,KACxByD,GAAOgO,SAAS0Z,EAAS5W,EAAO,KAAM,GAAG,GACzCvU,KAAKqrB,oBACbrrB,KAAKqrB,mBAAoB,EACzB5nB,GAAOwQ,aAAajU,MAAM,GAC1BA,KAAKqrB,kBAAoB,OAM9BrrB,OAGXimB,SAAW,WACP,MAAOjmB,MAAK8X,OAAS,MAAQ,IAGjCqO,SAAW,WACP,MAAOnmB,MAAK8X,OAAS,6BAA+B,IAGxD8R,UAAY,WAMR,MALI5pB,MAAKmc,KACLnc,KAAK+X,KAAK/X,KAAKmc,MACW,gBAAZnc,MAAK8d,IACnB9d,KAAK+X,KAAK/X,KAAK8d,IAEZ9d,MAGXsrB,qBAAuB,SAAU/W,GAQ7B,MAHIA,GAJCA,EAIO9Q,GAAO8Q,GAAOwD,OAHd,GAMJ/X,KAAK+X,OAASxD,GAAS,KAAO,GAG1C6B,YAAc,WACV,MAAOA,GAAYpW,KAAK6R,OAAQ7R,KAAKiS,UAGzCiL,UAAY,SAAU3I,GAClB,GAAI2I,GAAY0D,IAAOnd,GAAOzD,MAAMuqB,QAAQ,OAAS9mB,GAAOzD,MAAMuqB,QAAQ,SAAW,OAAS,CAC9F,OAAgB,OAAThW,EAAgB2I,EAAYld,KAAKuhB,IAAI,IAAMhN,EAAQ2I,IAG9DnL,QAAU,SAAUwC,GAChB,MAAgB,OAATA,EAAgB1P,KAAK2O,MAAMxT,KAAKiS,QAAU,GAAK,GAAKjS,KAAKiS,MAAoB,GAAbsC,EAAQ,GAASvU,KAAKiS,QAAU,IAG3GwK,SAAW,SAAUlI,GACjB,GAAI1C,GAAO6E,GAAW1W,KAAMA,KAAKkR,OAAO6L,MAAMvG,IAAKxW,KAAKkR,OAAO6L,MAAMtG,KAAK5E,IAC1E,OAAgB,OAAT0C,EAAgB1C,EAAO7R,KAAKuhB,IAAI,IAAMhN,EAAQ1C,IAGzDsT,YAAc,SAAU5Q,GACpB,GAAI1C,GAAO6E,GAAW1W,KAAM,EAAG,GAAG6R,IAClC,OAAgB,OAAT0C,EAAgB1C,EAAO7R,KAAKuhB,IAAI,IAAMhN,EAAQ1C,IAGzDM,KAAO,SAAUoC,GACb,GAAIpC,GAAOnS,KAAKkR,OAAOiB,KAAKnS,KAC5B,OAAgB,OAATuU,EAAgBpC,EAAOnS,KAAKuhB,IAAI,IAAsB,GAAhBhN,EAAQpC,KAGzDyS,QAAU,SAAUrQ,GAChB,GAAIpC,GAAOuE,GAAW1W,KAAM,EAAG,GAAGmS,IAClC,OAAgB,OAAToC,EAAgBpC,EAAOnS,KAAKuhB,IAAI,IAAsB,GAAhBhN,EAAQpC,KAGzDuK,QAAU,SAAUnI,GAChB,GAAImI,IAAW1c,KAAKqS,MAAQ,EAAIrS,KAAKkR,OAAO6L,MAAMvG,KAAO,CACzD,OAAgB,OAATjC,EAAgBmI,EAAU1c,KAAKuhB,IAAI,IAAKhN,EAAQmI,IAG3D4I,WAAa,SAAU/Q,GAInB,MAAgB,OAATA,EAAgBvU,KAAKqS,OAAS,EAAIrS,KAAKqS,IAAIrS,KAAKqS,MAAQ,EAAIkC,EAAQA,EAAQ,IAGvFgX,eAAiB,WACb,MAAOhV,GAAYvW,KAAK6R,OAAQ,EAAG,IAGvC0E,YAAc,WACV,GAAIiV,GAAWxrB,KAAK6V,MAAMkH,KAC1B,OAAOxG,GAAYvW,KAAK6R,OAAQ2Z,EAAShV,IAAKgV,EAAS/U,MAG3DiC,IAAM,SAAUzD,GAEZ,MADAA,GAAQD,EAAeC,GAChBjV,KAAKiV,MAGhBe,IAAM,SAAUf,EAAOjO,GAKnB,MAJAiO,GAAQD,EAAeC,GACI,kBAAhBjV,MAAKiV,IACZjV,KAAKiV,GAAOjO,GAEThH,MAMXkR,KAAO,SAAU1I,GACb,MAAIA,KAAQrC,EACDnG,KAAK6V,OAEZ7V,KAAK6V,MAAQ0C,EAAkB/P,GACxBxI,SA+CnByD,GAAO6M,GAAGuC,YAAcpP,GAAO6M,GAAGsC,aAAesP,GAAa,gBAAgB,GAC9Eze,GAAO6M,GAAGqC,OAASlP,GAAO6M,GAAGoC,QAAUwP,GAAa,WAAW,GAC/Dze,GAAO6M,GAAGmC,OAAShP,GAAO6M,GAAGkC,QAAU0P,GAAa,WAAW,GAK/Dze,GAAO6M,GAAGiC,KAAO9O,GAAO6M,GAAGgC,MAAQ4P,GAAa,SAAS,GAEzDze,GAAO6M,GAAG8M,KAAO8E,GAAa,QAAQ,GACtCze,GAAO6M,GAAGmb,MAAQrb,EAAU,kDAAmD8R,GAAa,QAAQ,IACpGze,GAAO6M,GAAGuB,KAAOqQ,GAAa,YAAY,GAC1Cze,GAAO6M,GAAGsB,MAAQxB,EAAU,kDAAmD8R,GAAa,YAAY,IAGxGze,GAAO6M,GAAG8B,KAAO3O,GAAO6M,GAAG+B,IAC3B5O,GAAO6M,GAAG0B,OAASvO,GAAO6M,GAAG2B,MAC7BxO,GAAO6M,GAAG4B,MAAQzO,GAAO6M,GAAG6B,KAC5B1O,GAAO6M,GAAGob,SAAWjoB,GAAO6M,GAAGsU,QAC/BnhB,GAAO6M,GAAGwB,SAAWrO,GAAO6M,GAAGyB,QAG/BtO,GAAO6M,GAAGqb,OAASloB,GAAO6M,GAAGvJ,YAO7B9B,EAAOxB,GAAOgO,SAASnB,GAAKkB,EAASgD,WAEjCtB,QAAU,WACN,GAIIR,GAASF,EAASF,EAAOV,EAJzBgB,EAAe5S,KAAK8S,cACpBV,EAAOpS,KAAK+S,MACZf,EAAShS,KAAKgT,QACd4Y,EAAO5rB,KAAKiT,KAKhB2Y,GAAKhZ,aAAeA,EAAe,IAEnCF,EAAUY,EAASV,EAAe,KAClCgZ,EAAKlZ,QAAUA,EAAU,GAEzBF,EAAUc,EAASZ,EAAU,IAC7BkZ,EAAKpZ,QAAUA,EAAU,GAEzBF,EAAQgB,EAASd,EAAU,IAC3BoZ,EAAKtZ,MAAQA,EAAQ,GAErBF,GAAQkB,EAAShB,EAAQ,IACzBsZ,EAAKxZ,KAAOA,EAAO,GAEnBJ,GAAUsB,EAASlB,EAAO,IAC1BwZ,EAAK5Z,OAASA,EAAS,GAEvBJ,EAAQ0B,EAAStB,EAAS,IAC1B4Z,EAAKha,MAAQA,GAGjBM,MAAQ,WACJ,MAAOoB,GAAStT,KAAKoS,OAAS,IAGlCzL,QAAU,WACN,MAAO3G,MAAK8S,cACG,MAAb9S,KAAK+S,MACJ/S,KAAKgT,QAAU,GAAM,OACK,QAA3B+B,EAAM/U,KAAKgT,QAAU,KAG3B0X,SAAW,SAAUmB,GACjB,GAAIC,IAAc9rB,KACd2T,EAASgN,GAAamL,GAAaD,EAAY7rB,KAAKkR,OAMxD,OAJI2a,KACAlY,EAAS3T,KAAKkR,OAAOwX,WAAWoD,EAAYnY,IAGzC3T,KAAKkR,OAAO2X,WAAWlV,IAGlC4N,IAAM,SAAUhN,EAAOiT,GAEnB,GAAI0C,GAAMzmB,GAAOgO,SAAS8C,EAAOiT,EAQjC,OANAxnB,MAAK8S,eAAiBoX,EAAIpX,cAC1B9S,KAAK+S,OAASmX,EAAInX,MAClB/S,KAAKgT,SAAWkX,EAAIlX,QAEpBhT,KAAKkT,UAEElT,MAGXmqB,SAAW,SAAU5V,EAAOiT,GACxB,GAAI0C,GAAMzmB,GAAOgO,SAAS8C,EAAOiT,EAQjC,OANAxnB,MAAK8S,eAAiBoX,EAAIpX,cAC1B9S,KAAK+S,OAASmX,EAAInX,MAClB/S,KAAKgT,SAAWkX,EAAIlX,QAEpBhT,KAAKkT,UAEElT,MAGX0Y,IAAM,SAAUzD,GAEZ,MADAA,GAAQD,EAAeC,GAChBjV,KAAKiV,EAAME,cAAgB,QAGtC4W,GAAK,SAAU9W,GAEX,MADAA,GAAQD,EAAeC,GAChBjV,KAAK,KAAOiV,EAAMwS,OAAO,GAAGxb,cAAgBgJ,EAAM4D,MAAM,GAAK,QAGxE3H,KAAOzN,GAAO6M,GAAGY,KAEjB8a,YAAc,WAEV,GAAIpa,GAAQ/M,KAAK+O,IAAI5T,KAAK4R,SACtBI,EAASnN,KAAK+O,IAAI5T,KAAKgS,UACvBI,EAAOvN,KAAK+O,IAAI5T,KAAKoS,QACrBE,EAAQzN,KAAK+O,IAAI5T,KAAKsS,SACtBE,EAAU3N,KAAK+O,IAAI5T,KAAKwS,WACxBE,EAAU7N,KAAK+O,IAAI5T,KAAK0S,UAAY1S,KAAK4S,eAAiB,IAE9D,OAAK5S,MAAKisB,aAMFjsB,KAAKisB,YAAc,EAAI,IAAM,IACjC,KACCra,EAAQA,EAAQ,IAAM,KACtBI,EAASA,EAAS,IAAM,KACxBI,EAAOA,EAAO,IAAM,KACnBE,GAASE,GAAWE,EAAW,IAAM,KACtCJ,EAAQA,EAAQ,IAAM,KACtBE,EAAUA,EAAU,IAAM,KAC1BE,EAAUA,EAAU,IAAM,IAXpB,QA2BnB,KAAKvN,KAAK+d,IACFA,GAAuBzd,eAAeN,MACtCmd,GAAqBnd,GAAG+d,GAAuB/d,KAC/Cid,GAAmBjd,GAAEgQ,eAI7BmN,IAAqB,QAAS,QAC9B7e,GAAOgO,SAASnB,GAAG4b,SAAW,WAC1B,QAASlsB,KAAsB,QAAfA,KAAK4R,SAAqB,OAAwB,GAAf5R,KAAK4R,SAU5DnO,GAAOyN,KAAK,MACRC,QAAU,SAAUoC,GAChB,GAAIxN,GAAIwN,EAAS,GACbI,EAAuC,IAA7BoB,EAAMxB,EAAS,IAAM,IAAa,KACrC,IAANxN,EAAW,KACL,IAANA,EAAW,KACL,IAANA,EAAW,KAAO,IACvB,OAAOwN,GAASI,KA4BpBiF,GACA/Y,EAAOD,QAAU6D,IAEf6L,EAAiC,SAAU6c,EAASvsB,EAASC,GAM3D,MALIA,GAAOyR,QAAUzR,EAAOyR,UAAYzR,EAAOyR,SAAS8a,YAAa,IAEjExJ,GAAYnf,OAASkf,IAGlBlf,IACTlD,KAAKX,EAASM,EAAqBN,EAASC,KAAUyP,IAAkCnJ,IAActG,EAAOD,QAAU0P,IACzHkT,IAAW,MAIhBjiB,KAAKP,QAEqBO,KAAKX,EAAU,WAAa,MAAOI,SAAYE,EAAoB,GAAGL,KAI/F,SAASA,EAAQD,EAASM,GAG9B,QAASmsB,GAAeC,GACvB,MAAOpsB,GAAoBqsB,EAAsBD,IAElD,QAASC,GAAsBD,GAC9B,MAAOE,GAAIF,IAAS,WAAa,KAAM,IAAI9oB,OAAM,uBAAyB8oB,EAAM,SALjF,GAAIE,KAOJH,GAAeI,KAAO,WACrB,MAAOvmB,QAAOumB,KAAKD,IAEpBH,EAAeK,QAAUH,EACzB1sB,EAAOD,QAAUysB,GAKb,SAASxsB,GAEbA,EAAOD,QAAU,SAASC,GAQzB,MAPIA,GAAO8sB,kBACV9sB,EAAOuQ,UAAY,aACnBvQ,EAAO+sB,SAEP/sB,EAAOgtB,YACPhtB,EAAO8sB,gBAAkB,GAEnB9sB,IAMJ,SAASA,EAAQD,GASrBA,EAAQktB,gBAAkB,SAASC,GAEjC,IAAK,GAAIC,KAAeD,GAClBA,EAActnB,eAAeunB,KAC/BD,EAAcC,GAAaC,UAAYF,EAAcC,GAAaE,KAClEH,EAAcC,GAAaE,UAYjCttB,EAAQutB,gBAAkB,SAASJ,GAEjC,IAAK,GAAIC,KAAeD,GACtB,GAAIA,EAActnB,eAAeunB,IAC3BD,EAAcC,GAAaC,UAAW,CACxC,IAAK,GAAI9nB,GAAI,EAAGA,EAAI4nB,EAAcC,GAAaC,UAAU3nB,OAAQH,IAC/D4nB,EAAcC,GAAaC,UAAU9nB,GAAGuE,WAAW0jB,YAAYL,EAAcC,GAAaC,UAAU9nB,GAEtG4nB,GAAcC,GAAaC,eAgBnCrtB,EAAQytB,cAAgB,SAAUL,EAAaD,EAAeO,GAC5D,GAAI5kB,EAqBJ,OAnBIqkB,GAActnB,eAAeunB,GAE3BD,EAAcC,GAAaC,UAAU3nB,OAAS,GAChDoD,EAAUqkB,EAAcC,GAAaC,UAAU,GAC/CF,EAAcC,GAAaC,UAAUM,UAIrC7kB,EAAU8kB,SAASC,gBAAgB,6BAA8BT,GACjEM,EAAaI,YAAYhlB,KAK3BA,EAAU8kB,SAASC,gBAAgB,6BAA8BT,GACjED,EAAcC,IAAgBE,QAAUD,cACxCK,EAAaI,YAAYhlB,IAE3BqkB,EAAcC,GAAaE,KAAKplB,KAAKY,GAC9BA,GAcT9I,EAAQ+tB,cAAgB,SAAUX,EAAaD,EAAea,GAC5D,GAAIllB,EAqBJ,OAnBIqkB,GAActnB,eAAeunB,GAE3BD,EAAcC,GAAaC,UAAU3nB,OAAS,GAChDoD,EAAUqkB,EAAcC,GAAaC,UAAU,GAC/CF,EAAcC,GAAaC,UAAUM,UAIrC7kB,EAAU8kB,SAASK,cAAcb,GACjCY,EAAaF,YAAYhlB,KAK3BA,EAAU8kB,SAASK,cAAcb,GACjCD,EAAcC,IAAgBE,QAAUD,cACxCW,EAAaF,YAAYhlB,IAE3BqkB,EAAcC,GAAaE,KAAKplB,KAAKY,GAC9BA,GAkBT9I,EAAQkuB,UAAY,SAASC,EAAG9N,EAAG+N,EAAOjB,EAAeO,GACvD,GAAIW,EAgBJ,OAfsC,UAAlCD,EAAMlgB,QAAQogB,WAAWC,OAC3BF,EAAQruB,EAAQytB,cAAc,SAASN,EAAcO,GACrDW,EAAMG,eAAe,KAAM,KAAML,GACjCE,EAAMG,eAAe,KAAM,KAAMnO,GACjCgO,EAAMG,eAAe,KAAM,IAAK,GAAMJ,EAAMlgB,QAAQogB,WAAWG,MAC/DJ,EAAMG,eAAe,KAAM,QAASJ,EAAMrmB,UAAY,YAGtDsmB,EAAQruB,EAAQytB,cAAc,OAAON,EAAcO,GACnDW,EAAMG,eAAe,KAAM,IAAKL,EAAI,GAAIC,EAAMlgB,QAAQogB,WAAWG,MACjEJ,EAAMG,eAAe,KAAM,IAAKnO,EAAI,GAAI+N,EAAMlgB,QAAQogB,WAAWG,MACjEJ,EAAMG,eAAe,KAAM,QAASJ,EAAMlgB,QAAQogB,WAAWG,MAC7DJ,EAAMG,eAAe,KAAM,SAAUJ,EAAMlgB,QAAQogB,WAAWG,MAC9DJ,EAAMG,eAAe,KAAM,QAASJ,EAAMrmB,UAAY,WAEjDsmB,GAUTruB,EAAQ0uB,QAAU,SAAUP,EAAG9N,EAAGsO,EAAOC,EAAQ7mB,EAAWolB,EAAeO,GAEvE,GAAImB,GAAO7uB,EAAQytB,cAAc,OAAON,EAAeO,EACvDmB,GAAKL,eAAe,KAAM,IAAKL,EAAI,GAAMQ,GACzCE,EAAKL,eAAe,KAAM,IAAKnO,GAC/BwO,EAAKL,eAAe,KAAM,QAASG,GACnCE,EAAKL,eAAe,KAAM,SAAUI,GACpCC,EAAKL,eAAe,KAAM,QAASzmB,KAMnC,SAAS9H,EAAQD,EAASM,GA0C9B,QAASW,GAAS+qB,EAAM9d,GActB,IAZI8d,GAAShmB,MAAMC,QAAQ+lB,IAAUjrB,EAAK4D,YAAYqnB,KACpD9d,EAAU8d,EACVA,EAAO,MAGT5rB,KAAK0uB,SAAW5gB,MAChB9N,KAAKiT,SACLjT,KAAK2uB,SAAW3uB,KAAK0uB,SAASE,SAAW,KACzC5uB,KAAK6uB,SAID7uB,KAAK0uB,SAASjoB,KAChB,IAAK,GAAI0H,KAASnO,MAAK0uB,SAASjoB,KAC9B,GAAIzG,KAAK0uB,SAASjoB,KAAKhB,eAAe0I,GAAQ,CAC5C,GAAInH,GAAQhH,KAAK0uB,SAASjoB,KAAK0H,EAE7BnO,MAAK6uB,MAAM1gB,GADA,QAATnH,GAA4B,WAATA,GAA+B,WAATA,EACvB,OAGAA,EAO5B,GAAIhH,KAAK0uB,SAASloB,QAChB,KAAM,IAAIhD,OAAM,sDAGlBxD,MAAK8uB,gBAGDlD,GACF5rB,KAAKuhB,IAAIqK,GA7Eb,GAAIjrB,GAAOT,EAAoB,EA0F/BW,GAAQ2T,UAAUua,GAAK,SAAS3lB,EAAOhB,GACrC,GAAI4mB,GAAchvB,KAAK8uB,aAAa1lB,EAC/B4lB,KACHA,KACAhvB,KAAK8uB,aAAa1lB,GAAS4lB,GAG7BA,EAAYlnB,MACVM,SAAUA,KAKdvH,EAAQ2T,UAAUya,UAAYpuB,EAAQ2T,UAAUua,GAOhDluB,EAAQ2T,UAAU0a,IAAM,SAAS9lB,EAAOhB,GACtC,GAAI4mB,GAAchvB,KAAK8uB,aAAa1lB,EAChC4lB,KACFhvB,KAAK8uB,aAAa1lB,GAAS4lB,EAAYG,OAAO,SAAUvmB,GACtD,MAAQA,GAASR,UAAYA,MAMnCvH,EAAQ2T,UAAU4a,YAAcvuB,EAAQ2T,UAAU0a,IASlDruB,EAAQ2T,UAAU6a,SAAW,SAAUjmB,EAAOkmB,EAAQC,GACpD,GAAa,KAATnmB,EACF,KAAM,IAAI5F,OAAM,yBAGlB,IAAIwrB,KACA5lB,KAASpJ,MAAK8uB,eAChBE,EAAcA,EAAYQ,OAAOxvB,KAAK8uB,aAAa1lB,KAEjD,KAAOpJ,MAAK8uB,eACdE,EAAcA,EAAYQ,OAAOxvB,KAAK8uB,aAAa,MAGrD,KAAK,GAAI3pB,GAAI,EAAGA,EAAI6pB,EAAY1pB,OAAQH,IAAK,CAC3C,GAAIsqB,GAAaT,EAAY7pB,EACzBsqB,GAAWrnB,UACbqnB,EAAWrnB,SAASgB,EAAOkmB,EAAQC,GAAY,QAYrD1uB,EAAQ2T,UAAU+M,IAAM,SAAUqK,EAAM2D,GACtC,GACIlvB,GADAqvB,KAEAC,EAAK3vB,IAET,IAAI4F,MAAMC,QAAQ+lB,GAEhB,IAAK,GAAIzmB,GAAI,EAAGC,EAAMwmB,EAAKtmB,OAAYF,EAAJD,EAASA,IAC1C9E,EAAKsvB,EAAGC,SAAShE,EAAKzmB,IACtBuqB,EAAS5nB,KAAKzH,OAGb,IAAIM,EAAK4D,YAAYqnB,GAGxB,IAAK,GADDiE,GAAU7vB,KAAK8vB,gBAAgBlE,GAC1BmE,EAAM,EAAGC,EAAOpE,EAAKqE,kBAAyBD,EAAND,EAAYA,IAAO,CAElE,IAAK,GADDG,MACKC,EAAM,EAAGC,EAAOP,EAAQvqB,OAAc8qB,EAAND,EAAYA,IAAO,CAC1D,GAAIhiB,GAAQ0hB,EAAQM,EACpBD,GAAK/hB,GAASyd,EAAKyE,SAASN,EAAKI,GAGnC9vB,EAAKsvB,EAAGC,SAASM,GACjBR,EAAS5nB,KAAKzH,OAGb,CAAA,KAAIurB,YAAgB1lB,SAMvB,KAAM,IAAI1C,OAAM,mBAJhBnD,GAAKsvB,EAAGC,SAAShE,GACjB8D,EAAS5nB,KAAKzH,GAUhB,MAJIqvB,GAASpqB,QACXtF,KAAKqvB,SAAS,OAAQttB,MAAO2tB,GAAWH,GAGnCG,GAST7uB,EAAQ2T,UAAU8b,OAAS,SAAU1E,EAAM2D,GACzC,GAAIG,MACAa,KACAZ,EAAK3vB,KACL4uB,EAAUe,EAAGhB,SAEb6B,EAAc,SAAUN,GAC1B,GAAI7vB,GAAK6vB,EAAKtB,EACVe,GAAG1c,MAAM5S,IAEXA,EAAKsvB,EAAGc,YAAYP,GACpBK,EAAWzoB,KAAKzH,KAIhBA,EAAKsvB,EAAGC,SAASM,GACjBR,EAAS5nB,KAAKzH,IAIlB,IAAIuF,MAAMC,QAAQ+lB,GAEhB,IAAK,GAAIzmB,GAAI,EAAGC,EAAMwmB,EAAKtmB,OAAYF,EAAJD,EAASA,IAC1CqrB,EAAY5E,EAAKzmB,QAGhB,IAAIxE,EAAK4D,YAAYqnB,GAGxB,IAAK,GADDiE,GAAU7vB,KAAK8vB,gBAAgBlE,GAC1BmE,EAAM,EAAGC,EAAOpE,EAAKqE,kBAAyBD,EAAND,EAAYA,IAAO,CAElE,IAAK,GADDG,MACKC,EAAM,EAAGC,EAAOP,EAAQvqB,OAAc8qB,EAAND,EAAYA,IAAO,CAC1D,GAAIhiB,GAAQ0hB,EAAQM,EACpBD,GAAK/hB,GAASyd,EAAKyE,SAASN,EAAKI,GAGnCK,EAAYN,OAGX,CAAA,KAAItE,YAAgB1lB,SAKvB,KAAM,IAAI1C,OAAM,mBAHhBgtB,GAAY5E,GAad,MAPI8D,GAASpqB,QACXtF,KAAKqvB,SAAS,OAAQttB,MAAO2tB,GAAWH,GAEtCgB,EAAWjrB,QACbtF,KAAKqvB,SAAS,UAAWttB,MAAOwuB,GAAahB,GAGxCG,EAASF,OAAOe,IAsCzB1vB,EAAQ2T,UAAUkE,IAAM,WACtB,GAGIrY,GAAIqwB,EAAK5iB,EAAS8d,EAHlB+D,EAAK3vB,KAIL2wB,EAAYhwB,EAAKmG,QAAQzB,UAAU,GACtB,WAAbsrB,GAAsC,UAAbA,GAE3BtwB,EAAKgF,UAAU,GACfyI,EAAUzI,UAAU,GACpBumB,EAAOvmB,UAAU,IAEG,SAAbsrB,GAEPD,EAAMrrB,UAAU,GAChByI,EAAUzI,UAAU,GACpBumB,EAAOvmB,UAAU,KAIjByI,EAAUzI,UAAU,GACpBumB,EAAOvmB,UAAU,GAInB,IAAIurB,EACJ,IAAI9iB,GAAWA,EAAQ8iB,WAAY,CACjC,GAAIC,IAAiB,YAAa,QAAS,SAG3C,IAFAD,EAA0D,IAA7CC,EAAcvqB,QAAQwH,EAAQ8iB,YAAoB,QAAU9iB,EAAQ8iB,WAE7EhF,GAASgF,GAAcjwB,EAAKmG,QAAQ8kB,GACtC,KAAM,IAAIpoB,OAAM,6BAA+B7C,EAAKmG,QAAQ8kB,GAAQ,sDACV9d,EAAQrH,KAAO,IAE3E,IAAkB,aAAdmqB,IAA8BjwB,EAAK4D,YAAYqnB,GACjD,KAAM,IAAIpoB,OAAM,6EAKlBotB,GADOhF,GAC6B,aAAtBjrB,EAAKmG,QAAQ8kB,GAAwB,YAGtC,OAIf,IAEgBsE,GAAMY,EAAQ3rB,EAAGC,EAF7BqB,EAAOqH,GAAWA,EAAQrH,MAAQzG,KAAK0uB,SAASjoB,KAChD0oB,EAASrhB,GAAWA,EAAQqhB,OAC5BptB,IAGJ,IAAUoE,QAAN9F,EAEF6vB,EAAOP,EAAGoB,SAAS1wB,EAAIoG,GACnB0oB,IAAWA,EAAOe,KACpBA,EAAO,UAGN,IAAW/pB,QAAPuqB,EAEP,IAAKvrB,EAAI,EAAGC,EAAMsrB,EAAIprB,OAAYF,EAAJD,EAASA,IACrC+qB,EAAOP,EAAGoB,SAASL,EAAIvrB,GAAIsB,KACtB0oB,GAAUA,EAAOe,KACpBnuB,EAAM+F,KAAKooB,OAMf,KAAKY,IAAU9wB,MAAKiT,MACdjT,KAAKiT,MAAMxN,eAAeqrB,KAC5BZ,EAAOP,EAAGoB,SAASD,EAAQrqB,KACtB0oB,GAAUA,EAAOe,KACpBnuB,EAAM+F,KAAKooB,GAYnB,IALIpiB,GAAWA,EAAQkjB,OAAe7qB,QAAN9F,GAC9BL,KAAKixB,MAAMlvB,EAAO+L,EAAQkjB,OAIxBljB,GAAWA,EAAQP,OAAQ,CAC7B,GAAIA,GAASO,EAAQP,MACrB,IAAUpH,QAAN9F,EACF6vB,EAAOlwB,KAAKkxB,cAAchB,EAAM3iB,OAGhC,KAAKpI,EAAI,EAAGC,EAAMrD,EAAMuD,OAAYF,EAAJD,EAASA,IACvCpD,EAAMoD,GAAKnF,KAAKkxB,cAAcnvB,EAAMoD,GAAIoI,GAM9C,GAAkB,aAAdqjB,EAA2B,CAC7B,GAAIf,GAAU7vB,KAAK8vB,gBAAgBlE,EACnC,IAAUzlB,QAAN9F,EAEFsvB,EAAGwB,WAAWvF,EAAMiE,EAASK,OAI7B,KAAK/qB,EAAI,EAAGA,EAAIpD,EAAMuD,OAAQH,IAC5BwqB,EAAGwB,WAAWvF,EAAMiE,EAAS9tB,EAAMoD,GAGvC,OAAOymB,GAEJ,GAAkB,UAAdgF,EAAwB,CAC/B,GAAIxd,KACJ,KAAKjO,EAAI,EAAGA,EAAIpD,EAAMuD,OAAQH,IAC5BiO,EAAOrR,EAAMoD,GAAG9E,IAAM0B,EAAMoD,EAE9B,OAAOiO,GAIP,GAAUjN,QAAN9F,EAEF,MAAO6vB,EAIP,IAAItE,EAAM,CAER,IAAKzmB,EAAI,EAAGC,EAAMrD,EAAMuD,OAAYF,EAAJD,EAASA,IACvCymB,EAAK9jB,KAAK/F,EAAMoD,GAElB,OAAOymB,GAIP,MAAO7pB,IAcflB,EAAQ2T,UAAU4c,OAAS,SAAUtjB,GACnC,GAII3I,GACAC,EACA/E,EACA6vB,EACAnuB,EARA6pB,EAAO5rB,KAAKiT,MACZkc,EAASrhB,GAAWA,EAAQqhB,OAC5B6B,EAAQljB,GAAWA,EAAQkjB,MAC3BvqB,EAAOqH,GAAWA,EAAQrH,MAAQzG,KAAK0uB,SAASjoB,KAMhDiqB,IAEJ,IAAIvB,EAEF,GAAI6B,EAAO,CAETjvB,IACA,KAAK1B,IAAMurB,GACLA,EAAKnmB,eAAepF,KACtB6vB,EAAOlwB,KAAK+wB,SAAS1wB,EAAIoG,GACrB0oB,EAAOe,IACTnuB,EAAM+F,KAAKooB,GAOjB,KAFAlwB,KAAKixB,MAAMlvB,EAAOivB,GAEb7rB,EAAI,EAAGC,EAAMrD,EAAMuD,OAAYF,EAAJD,EAASA,IACvCurB,EAAIvrB,GAAKpD,EAAMoD,GAAGnF,KAAK2uB,cAKzB,KAAKtuB,IAAMurB,GACLA,EAAKnmB,eAAepF,KACtB6vB,EAAOlwB,KAAK+wB,SAAS1wB,EAAIoG,GACrB0oB,EAAOe,IACTQ,EAAI5oB,KAAKooB,EAAKlwB,KAAK2uB,gBAQ3B,IAAIqC,EAAO,CAETjvB,IACA,KAAK1B,IAAMurB,GACLA,EAAKnmB,eAAepF,IACtB0B,EAAM+F,KAAK8jB,EAAKvrB,GAMpB,KAFAL,KAAKixB,MAAMlvB,EAAOivB,GAEb7rB,EAAI,EAAGC,EAAMrD,EAAMuD,OAAYF,EAAJD,EAASA,IACvCurB,EAAIvrB,GAAKpD,EAAMoD,GAAGnF,KAAK2uB,cAKzB,KAAKtuB,IAAMurB,GACLA,EAAKnmB,eAAepF,KACtB6vB,EAAOtE,EAAKvrB,GACZqwB,EAAI5oB,KAAKooB,EAAKlwB,KAAK2uB,WAM3B,OAAO+B,IAOT7vB,EAAQ2T,UAAU6c,WAAa,WAC7B,MAAOrxB,OAaTa,EAAQ2T,UAAUrM,QAAU,SAAUC,EAAU0F,GAC9C,GAGIoiB,GACA7vB,EAJA8uB,EAASrhB,GAAWA,EAAQqhB,OAC5B1oB,EAAOqH,GAAWA,EAAQrH,MAAQzG,KAAK0uB,SAASjoB,KAChDmlB,EAAO5rB,KAAKiT,KAIhB,IAAInF,GAAWA,EAAQkjB,MAIrB,IAAK,GAFDjvB,GAAQ/B,KAAK0Y,IAAI5K,GAEZ3I,EAAI,EAAGC,EAAMrD,EAAMuD,OAAYF,EAAJD,EAASA,IAC3C+qB,EAAOnuB,EAAMoD,GACb9E,EAAK6vB,EAAKlwB,KAAK2uB,UACfvmB,EAAS8nB,EAAM7vB,OAKjB,KAAKA,IAAMurB,GACLA,EAAKnmB,eAAepF,KACtB6vB,EAAOlwB,KAAK+wB,SAAS1wB,EAAIoG,KACpB0oB,GAAUA,EAAOe,KACpB9nB,EAAS8nB,EAAM7vB,KAkBzBQ,EAAQ2T,UAAUgY,IAAM,SAAUpkB,EAAU0F,GAC1C,GAIIoiB,GAJAf,EAASrhB,GAAWA,EAAQqhB,OAC5B1oB,EAAOqH,GAAWA,EAAQrH,MAAQzG,KAAK0uB,SAASjoB,KAChD6qB,KACA1F,EAAO5rB,KAAKiT,KAIhB,KAAK,GAAI5S,KAAMurB,GACTA,EAAKnmB,eAAepF,KACtB6vB,EAAOlwB,KAAK+wB,SAAS1wB,EAAIoG,KACpB0oB,GAAUA,EAAOe,KACpBoB,EAAYxpB,KAAKM,EAAS8nB,EAAM7vB,IAUtC,OAJIyN,IAAWA,EAAQkjB,OACrBhxB,KAAKixB,MAAMK,EAAaxjB,EAAQkjB,OAG3BM,GAUTzwB,EAAQ2T,UAAU0c,cAAgB,SAAUhB,EAAM3iB,GAChD,GAAIgkB,KAEJ,KAAK,GAAIpjB,KAAS+hB,GACZA,EAAKzqB,eAAe0I,IAAoC,IAAzBZ,EAAOjH,QAAQ6H,KAChDojB,EAAapjB,GAAS+hB,EAAK/hB,GAI/B,OAAOojB,IAST1wB,EAAQ2T,UAAUyc,MAAQ,SAAUlvB,EAAOivB,GACzC,GAAIrwB,EAAKmD,SAASktB,GAAQ,CAExB,GAAI3O,GAAO2O,CACXjvB,GAAMyvB,KAAK,SAAUtsB,EAAGa,GACtB,GAAI0rB,GAAKvsB,EAAEmd,GACPqP,EAAK3rB,EAAEsc,EACX,OAAQoP,GAAKC,EAAM,EAAWA,EAALD,EAAW,GAAK,QAGxC,CAAA,GAAqB,kBAAVT,GAOd,KAAM,IAAIhrB,WAAU,uCALpBjE,GAAMyvB,KAAKR,KAgBfnwB,EAAQ2T,UAAUmd,OAAS,SAAUtxB,EAAIkvB,GACvC,GACIpqB,GAAGC,EAAKwsB,EADRC,IAGJ,IAAIjsB,MAAMC,QAAQxF,GAChB,IAAK8E,EAAI,EAAGC,EAAM/E,EAAGiF,OAAYF,EAAJD,EAASA,IACpCysB,EAAY5xB,KAAK8xB,QAAQzxB,EAAG8E,IACX,MAAbysB,GACFC,EAAW/pB,KAAK8pB,OAKpBA,GAAY5xB,KAAK8xB,QAAQzxB,GACR,MAAbuxB,GACFC,EAAW/pB,KAAK8pB,EAQpB,OAJIC,GAAWvsB,QACbtF,KAAKqvB,SAAS,UAAWttB,MAAO8vB,GAAatC,GAGxCsC,GASThxB,EAAQ2T,UAAUsd,QAAU,SAAUzxB,GACpC,GAAIM,EAAKgD,SAAStD,IAAOM,EAAKmD,SAASzD,IACrC,GAAIL,KAAKiT,MAAM5S,GAEb,aADOL,MAAKiT,MAAM5S,GACXA,MAGN,IAAIA,YAAc6F,QAAQ,CAC7B,GAAI4qB,GAASzwB,EAAGL,KAAK2uB,SACrB,IAAImC,GAAU9wB,KAAKiT,MAAM6d,GAEvB,aADO9wB,MAAKiT,MAAM6d,GACXA,EAGX,MAAO,OAQTjwB,EAAQ2T,UAAUud,MAAQ,SAAUxC,GAClC,GAAImB,GAAMxqB,OAAOumB,KAAKzsB,KAAKiT,MAM3B,OAJAjT,MAAKiT,SAELjT,KAAKqvB,SAAS,UAAWttB,MAAO2uB,GAAMnB,GAE/BmB,GAQT7vB,EAAQ2T,UAAU1H,IAAM,SAAUqB,GAChC,GAAIyd,GAAO5rB,KAAKiT,MACZnG,EAAM,KACNklB,EAAW,IAEf,KAAK,GAAI3xB,KAAMurB,GACb,GAAIA,EAAKnmB,eAAepF,GAAK,CAC3B,GAAI6vB,GAAOtE,EAAKvrB,GACZ4xB,EAAY/B,EAAK/hB,EACJ,OAAb8jB,KAAuBnlB,GAAOmlB,EAAYD,KAC5CllB,EAAMojB,EACN8B,EAAWC,GAKjB,MAAOnlB,IAQTjM,EAAQ2T,UAAUnJ,IAAM,SAAU8C,GAChC,GAAIyd,GAAO5rB,KAAKiT,MACZ5H,EAAM,KACN6mB,EAAW,IAEf,KAAK,GAAI7xB,KAAMurB,GACb,GAAIA,EAAKnmB,eAAepF,GAAK,CAC3B,GAAI6vB,GAAOtE,EAAKvrB,GACZ4xB,EAAY/B,EAAK/hB,EACJ,OAAb8jB,KAAuB5mB,GAAmB6mB,EAAZD,KAChC5mB,EAAM6kB,EACNgC,EAAWD,GAKjB,MAAO5mB,IAUTxK,EAAQ2T,UAAU2d,SAAW,SAAUhkB,GACrC,GAIIhJ,GAJAymB,EAAO5rB,KAAKiT,MACZkF,KACAia,EAAYpyB,KAAK0uB,SAASjoB,MAAQzG,KAAK0uB,SAASjoB,KAAK0H,IAAU,KAC/D2C,EAAQ,CAGZ,KAAK,GAAItL,KAAQomB,GACf,GAAIA,EAAKnmB,eAAeD,GAAO,CAC7B,GAAI0qB,GAAOtE,EAAKpmB,GACZwB,EAAQkpB,EAAK/hB,GACbkkB,GAAS,CACb,KAAKltB,EAAI,EAAO2L,EAAJ3L,EAAWA,IACrB,GAAIgT,EAAOhT,IAAM6B,EAAO,CACtBqrB,GAAS,CACT,OAGCA,GAAqBlsB,SAAVa,IACdmR,EAAOrH,GAAS9J,EAChB8J,KAKN,GAAIshB,EACF,IAAKjtB,EAAI,EAAGA,EAAIgT,EAAO7S,OAAQH,IAC7BgT,EAAOhT,GAAKxE,EAAK6F,QAAQ2R,EAAOhT,GAAIitB,EAIxC,OAAOja,IASTtX,EAAQ2T,UAAUob,SAAW,SAAUM,GACrC,GAAI7vB,GAAK6vB,EAAKlwB,KAAK2uB,SAEnB,IAAUxoB,QAAN9F,GAEF,GAAIL,KAAKiT,MAAM5S,GAEb,KAAM,IAAImD,OAAM,iCAAmCnD,EAAK,uBAK1DA,GAAKM,EAAKgE,aACVurB,EAAKlwB,KAAK2uB,UAAYtuB,CAGxB,IAAI8L,KACJ,KAAK,GAAIgC,KAAS+hB,GAChB,GAAIA,EAAKzqB,eAAe0I,GAAQ,CAC9B,GAAIikB,GAAYpyB,KAAK6uB,MAAM1gB,EAC3BhC,GAAEgC,GAASxN,EAAK6F,QAAQ0pB,EAAK/hB,GAAQikB,GAKzC,MAFApyB,MAAKiT,MAAM5S,GAAM8L,EAEV9L,GAUTQ,EAAQ2T,UAAUuc,SAAW,SAAU1wB,EAAIiyB,GACzC,GAAInkB,GAAOnH,EAGPurB,EAAMvyB,KAAKiT,MAAM5S,EACrB,KAAKkyB,EACH,MAAO,KAIT,IAAIC,KACJ,IAAIF,EACF,IAAKnkB,IAASokB,GACRA,EAAI9sB,eAAe0I,KACrBnH,EAAQurB,EAAIpkB,GACZqkB,EAAUrkB,GAASxN,EAAK6F,QAAQQ,EAAOsrB,EAAMnkB,SAMjD,KAAKA,IAASokB,GACRA,EAAI9sB,eAAe0I,KACrBnH,EAAQurB,EAAIpkB,GACZqkB,EAAUrkB,GAASnH,EAIzB,OAAOwrB,IAWT3xB,EAAQ2T,UAAUic,YAAc,SAAUP,GACxC,GAAI7vB,GAAK6vB,EAAKlwB,KAAK2uB,SACnB,IAAUxoB,QAAN9F,EACF,KAAM,IAAImD,OAAM,6CAA+CivB,KAAKC,UAAUxC,GAAQ,IAExF,IAAI/jB,GAAInM,KAAKiT,MAAM5S,EACnB,KAAK8L,EAEH,KAAM,IAAI3I,OAAM,uCAAyCnD,EAAK,SAIhE,KAAK,GAAI8N,KAAS+hB,GAChB,GAAIA,EAAKzqB,eAAe0I,GAAQ,CAC9B,GAAIikB,GAAYpyB,KAAK6uB,MAAM1gB,EAC3BhC,GAAEgC,GAASxN,EAAK6F,QAAQ0pB,EAAK/hB,GAAQikB,GAIzC,MAAO/xB,IASTQ,EAAQ2T,UAAUsb,gBAAkB,SAAU6C,GAE5C,IAAK,GADD9C,MACKM,EAAM,EAAGC,EAAOuC,EAAUC,qBAA4BxC,EAAND,EAAYA,IACnEN,EAAQM,GAAOwC,EAAUE,YAAY1C,IAAQwC,EAAUG,eAAe3C,EAExE,OAAON,IAUThvB,EAAQ2T,UAAU2c,WAAa,SAAUwB,EAAW9C,EAASK,GAG3D,IAAK,GAFDH,GAAM4C,EAAUI,SAEX5C,EAAM,EAAGC,EAAOP,EAAQvqB,OAAc8qB,EAAND,EAAYA,IAAO,CAC1D,GAAIhiB,GAAQ0hB,EAAQM,EACpBwC,GAAUK,SAASjD,EAAKI,EAAKD,EAAK/hB,MAItCtO,EAAOD,QAAUiB,GAKb,SAAShB,EAAQD,EAASM,GAe9B,QAASY,GAAU8qB,EAAM9d,GACvB9N,KAAKiT,MAAQ,KACbjT,KAAKizB,QACLjzB,KAAK0uB,SAAW5gB,MAChB9N,KAAK2uB,SAAW,KAChB3uB,KAAK8uB,eAEL,IAAIa,GAAK3vB,IACTA,MAAK4I,SAAW,WACd+mB,EAAGuD,SAASviB,MAAMgf,EAAItqB,YAGxBrF,KAAKmzB,QAAQvH,GAzBf,GAAIjrB,GAAOT,EAAoB,GAC3BW,EAAUX,EAAoB,EAkClCY,GAAS0T,UAAU2e,QAAU,SAAUvH,GACrC,GAAI8E,GAAKvrB,EAAGC,CAEZ,IAAIpF,KAAKiT,MAAO,CAEVjT,KAAKiT,MAAMmc,aACbpvB,KAAKiT,MAAMmc,YAAY,IAAKpvB,KAAK4I,UAInC8nB,IACA,KAAK,GAAIrwB,KAAML,MAAKizB,KACdjzB,KAAKizB,KAAKxtB,eAAepF,IAC3BqwB,EAAI5oB,KAAKzH,EAGbL,MAAKizB,QACLjzB,KAAKqvB,SAAS,UAAWttB,MAAO2uB,IAKlC,GAFA1wB,KAAKiT,MAAQ2Y,EAET5rB,KAAKiT,MAAO,CAQd,IANAjT,KAAK2uB,SAAW3uB,KAAK0uB,SAASE,SACzB5uB,KAAKiT,OAASjT,KAAKiT,MAAMnF,SAAW9N,KAAKiT,MAAMnF,QAAQ8gB,SACxD,KAGJ8B,EAAM1wB,KAAKiT,MAAMme,QAAQjC,OAAQnvB,KAAK0uB,UAAY1uB,KAAK0uB,SAASS,SAC3DhqB,EAAI,EAAGC,EAAMsrB,EAAIprB,OAAYF,EAAJD,EAASA,IACrC9E,EAAKqwB,EAAIvrB,GACTnF,KAAKizB,KAAK5yB,IAAM,CAElBL,MAAKqvB,SAAS,OAAQttB,MAAO2uB,IAGzB1wB,KAAKiT,MAAM8b,IACb/uB,KAAKiT,MAAM8b,GAAG,IAAK/uB,KAAK4I,YAuC9B9H,EAAS0T,UAAUkE,IAAM,WACvB,GAGIgY,GAAK5iB,EAAS8d,EAHd+D,EAAK3vB,KAIL2wB,EAAYhwB,EAAKmG,QAAQzB,UAAU,GACtB,WAAbsrB,GAAsC,UAAbA,GAAsC,SAAbA,GAEpDD,EAAMrrB,UAAU,GAChByI,EAAUzI,UAAU,GACpBumB,EAAOvmB,UAAU,KAIjByI,EAAUzI,UAAU,GACpBumB,EAAOvmB,UAAU,GAInB,IAAI+tB,GAAczyB,EAAKsE,UAAWjF,KAAK0uB,SAAU5gB,EAG7C9N,MAAK0uB,SAASS,QAAUrhB,GAAWA,EAAQqhB,SAC7CiE,EAAYjE,OAAS,SAAUe,GAC7B,MAAOP,GAAGjB,SAASS,OAAOe,IAASpiB,EAAQqhB,OAAOe,IAKtD,IAAImD,KAOJ,OANWltB,SAAPuqB,GACF2C,EAAavrB,KAAK4oB,GAEpB2C,EAAavrB,KAAKsrB,GAClBC,EAAavrB,KAAK8jB,GAEX5rB,KAAKiT,OAASjT,KAAKiT,MAAMyF,IAAI/H,MAAM3Q,KAAKiT,MAAOogB,IAWxDvyB,EAAS0T,UAAU4c,OAAS,SAAUtjB,GACpC,GAAI4iB,EAEJ,IAAI1wB,KAAKiT,MAAO,CACd,GACIkc,GADAmE,EAAgBtzB,KAAK0uB,SAASS,MAK9BA,GAFArhB,GAAWA,EAAQqhB,OACjBmE,EACO,SAAUpD,GACjB,MAAOoD,GAAcpD,IAASpiB,EAAQqhB,OAAOe,IAItCpiB,EAAQqhB,OAIVmE,EAGX5C,EAAM1wB,KAAKiT,MAAMme,QACfjC,OAAQA,EACR6B,MAAOljB,GAAWA,EAAQkjB,YAI5BN,KAGF,OAAOA,IAQT5vB,EAAS0T,UAAU6c,WAAa,WAE9B,IADA,GAAIkC,GAAUvzB,KACPuzB,YAAmBzyB,IACxByyB,EAAUA,EAAQtgB,KAEpB,OAAOsgB,IAAW,MAYpBzyB,EAAS0T,UAAU0e,SAAW,SAAU9pB,EAAOkmB,EAAQC,GACrD,GAAIpqB,GAAGC,EAAK/E,EAAI6vB,EACZQ,EAAMpB,GAAUA,EAAOvtB,MACvB6pB,EAAO5rB,KAAKiT,MACZugB,KACAC,KACAC,IAEJ,IAAIhD,GAAO9E,EAAM,CACf,OAAQxiB,GACN,IAAK,MAEH,IAAKjE,EAAI,EAAGC,EAAMsrB,EAAIprB,OAAYF,EAAJD,EAASA,IACrC9E,EAAKqwB,EAAIvrB,GACT+qB,EAAOlwB,KAAK0Y,IAAIrY,GACZ6vB,IACFlwB,KAAKizB,KAAK5yB,IAAM,EAChBmzB,EAAM1rB,KAAKzH,GAIf,MAEF,KAAK,SAGH,IAAK8E,EAAI,EAAGC,EAAMsrB,EAAIprB,OAAYF,EAAJD,EAASA,IACrC9E,EAAKqwB,EAAIvrB,GACT+qB,EAAOlwB,KAAK0Y,IAAIrY,GAEZ6vB,EACElwB,KAAKizB,KAAK5yB,GACZozB,EAAQ3rB,KAAKzH,IAGbL,KAAKizB,KAAK5yB,IAAM,EAChBmzB,EAAM1rB,KAAKzH,IAITL,KAAKizB,KAAK5yB,WACLL,MAAKizB,KAAK5yB,GACjBqzB,EAAQ5rB,KAAKzH,GAQnB,MAEF,KAAK,SAEH,IAAK8E,EAAI,EAAGC,EAAMsrB,EAAIprB,OAAYF,EAAJD,EAASA,IACrC9E,EAAKqwB,EAAIvrB,GACLnF,KAAKizB,KAAK5yB,WACLL,MAAKizB,KAAK5yB,GACjBqzB,EAAQ5rB,KAAKzH,IAOjBmzB,EAAMluB,QACRtF,KAAKqvB,SAAS,OAAQttB,MAAOyxB,GAAQjE,GAEnCkE,EAAQnuB,QACVtF,KAAKqvB,SAAS,UAAWttB,MAAO0xB,GAAUlE,GAExCmE,EAAQpuB,QACVtF,KAAKqvB,SAAS,UAAWttB,MAAO2xB,GAAUnE,KAMhDzuB,EAAS0T,UAAUua,GAAKluB,EAAQ2T,UAAUua,GAC1CjuB,EAAS0T,UAAU0a,IAAMruB,EAAQ2T,UAAU0a,IAC3CpuB,EAAS0T,UAAU6a,SAAWxuB,EAAQ2T,UAAU6a,SAGhDvuB,EAAS0T,UAAUya,UAAYnuB,EAAS0T,UAAUua,GAClDjuB,EAAS0T,UAAU4a,YAActuB,EAAS0T,UAAU0a,IAEpDrvB,EAAOD,QAAUkB,GAIb,SAASjB,EAAQD,EAASM,GAwB9B,QAASa,GAAQ4yB,EAAW/H,EAAM9d,GAChC,KAAM9N,eAAgBe,IACpB,KAAM,IAAI6yB,aAAY,mDAIxB5zB,MAAK6zB,iBAAmBF,EACxB3zB,KAAKuuB,MAAQ,QACbvuB,KAAKwuB,OAAS,QACdxuB,KAAK8zB,OAAS,GACd9zB,KAAK+zB,eAAiB,MACtB/zB,KAAKg0B,eAAiB,MAEtBh0B,KAAKi0B,OAAS,IACdj0B,KAAKk0B,OAAS,IACdl0B,KAAKm0B,OAAS,IACdn0B,KAAKo0B,YAAc,OACnBp0B,KAAKq0B,YAAc,QAEnBr0B,KAAKmuB,MAAQptB,EAAQuzB,MAAMC,IAC3Bv0B,KAAKw0B,iBAAkB,EACvBx0B,KAAKy0B,UAAW,EAChBz0B,KAAK00B,iBAAkB,EACvB10B,KAAK20B,YAAa,EAClB30B,KAAK40B,gBAAiB,EACtB50B,KAAK60B,aAAc,EACnB70B,KAAK80B,cAAgB,GAErB90B,KAAK+0B,kBAAoB,IACzB/0B,KAAKg1B,kBAAmB,EAExBh1B,KAAKi1B,OAAS,GAAIh0B,GAClBjB,KAAKk1B,IAAM,GAAI9zB,GAAQ,EAAG,EAAG,IAE7BpB,KAAK2yB,UAAY,KACjB3yB,KAAKm1B,WAAa,KAGlBn1B,KAAKo1B,KAAOjvB,OACZnG,KAAKq1B,KAAOlvB,OACZnG,KAAKs1B,KAAOnvB,OACZnG,KAAKu1B,SAAWpvB,OAChBnG,KAAKw1B,UAAYrvB,OAEjBnG,KAAKy1B,KAAO,EACZz1B,KAAK01B,MAAQvvB,OACbnG,KAAK21B,KAAO,EACZ31B,KAAK41B,KAAO,EACZ51B,KAAK61B,MAAQ1vB,OACbnG,KAAK81B,KAAO,EACZ91B,KAAK+1B,KAAO,EACZ/1B,KAAKg2B,MAAQ7vB,OACbnG,KAAKi2B,KAAO,EACZj2B,KAAKk2B,SAAW,EAChBl2B,KAAKm2B,SAAW,EAChBn2B,KAAKo2B,UAAY,EACjBp2B,KAAKq2B,UAAY,EAIjBr2B,KAAKs2B,UAAY,UACjBt2B,KAAKu2B,UAAY,UACjBv2B,KAAKw2B,SAAW,UAChBx2B,KAAKy2B,eAAiB,UAGtBz2B,KAAK0N,SAGL1N,KAAK02B,WAAW5oB,GAGZ8d,GACF5rB,KAAKmzB,QAAQvH,GA/FjB,GAAI+K,GAAUz2B,EAAoB,IAC9BW,EAAUX,EAAoB,GAC9BY,EAAWZ,EAAoB,GAC/BS,EAAOT,EAAoB,GAC3BkB,EAAUlB,EAAoB,IAC9BiB,EAAUjB,EAAoB,IAC9Be,EAASf,EAAoB,IAC7BgB,EAAShB,EAAoB,IAC7BmB,EAASnB,EAAoB,IAC7BoB,EAAapB,EAAoB,GA2FrCy2B,GAAQ51B,EAAQyT,WAKhBzT,EAAQyT,UAAUoiB,UAAY,WAC5B52B,KAAK62B,MAAQ,GAAIz1B,GAAQ,GAAKpB,KAAK21B,KAAO31B,KAAKy1B,MAC7C,GAAKz1B,KAAK81B,KAAO91B,KAAK41B,MACtB,GAAK51B,KAAKi2B,KAAOj2B,KAAK+1B,OAGpB/1B,KAAK00B,kBACH10B,KAAK62B,MAAM9I,EAAI/tB,KAAK62B,MAAM5W,EAE5BjgB,KAAK62B,MAAM5W,EAAIjgB,KAAK62B,MAAM9I,EAI1B/tB,KAAK62B,MAAM9I,EAAI/tB,KAAK62B,MAAM5W,GAK9BjgB,KAAK62B,MAAM7Q,GAAKhmB,KAAK80B,cAIrB90B,KAAK62B,MAAM7vB,MAAQ,GAAKhH,KAAKm2B,SAAWn2B,KAAKk2B,SAG7C,IAAIY,IAAW92B,KAAK21B,KAAO31B,KAAKy1B,MAAQ,EAAIz1B,KAAK62B,MAAM9I,EACnDgJ,GAAW/2B,KAAK81B,KAAO91B,KAAK41B,MAAQ,EAAI51B,KAAK62B,MAAM5W,EACnD+W,GAAWh3B,KAAKi2B,KAAOj2B,KAAK+1B,MAAQ,EAAI/1B,KAAK62B,MAAM7Q,CACvDhmB,MAAKi1B,OAAOgC,eAAeH,EAASC,EAASC,IAU/Cj2B,EAAQyT,UAAU0iB,eAAiB,SAASC,GAC1C,GAAIC,GAAcp3B,KAAKq3B,2BAA2BF,EAClD,OAAOn3B,MAAKs3B,4BAA4BF,IAW1Cr2B,EAAQyT,UAAU6iB,2BAA6B,SAASF,GACtD,GAAII,GAAKJ,EAAQpJ,EAAI/tB,KAAK62B,MAAM9I,EAC9ByJ,EAAKL,EAAQlX,EAAIjgB,KAAK62B,MAAM5W,EAC5BwX,EAAKN,EAAQnR,EAAIhmB,KAAK62B,MAAM7Q,EAE5B0R,EAAK13B,KAAKi1B,OAAO0C,oBAAoB5J,EACrC6J,EAAK53B,KAAKi1B,OAAO0C,oBAAoB1X,EACrC4X,EAAK73B,KAAKi1B,OAAO0C,oBAAoB3R,EAGrC8R,EAAQjzB,KAAKkzB,IAAI/3B,KAAKi1B,OAAO+C,oBAAoBjK,GACjDkK,EAAQpzB,KAAKqzB,IAAIl4B,KAAKi1B,OAAO+C,oBAAoBjK,GACjDoK,EAAQtzB,KAAKkzB,IAAI/3B,KAAKi1B,OAAO+C,oBAAoB/X,GACjDmY,EAAQvzB,KAAKqzB,IAAIl4B,KAAKi1B,OAAO+C,oBAAoB/X,GACjDoY,EAAQxzB,KAAKkzB,IAAI/3B,KAAKi1B,OAAO+C,oBAAoBhS,GACjDsS,EAAQzzB,KAAKqzB,IAAIl4B,KAAKi1B,OAAO+C,oBAAoBhS,GAGjDuS,EAAKH,GAASC,GAASb,EAAKI,GAAMU,GAASf,EAAKG,IAAOS,GAASV,EAAKI,GACrE5W,EAAK6W,GAASM,GAASX,EAAKI,GAAMM,GAASE,GAASb,EAAKI,GAAMU,GAASf,EAAKG,KAAQO,GAASK,GAASd,EAAKI,GAAMS,GAASd,EAAGG,IAC9Hc,EAAKP,GAASG,GAASX,EAAKI,GAAMM,GAASE,GAASb,EAAKI,GAAMU,GAASf,EAAKG,KAAQI,GAASQ,GAASd,EAAKI,GAAMS,GAASd,EAAGG,GAEhI,OAAO,IAAIt2B,GAAQm3B,EAAItX,EAAIuX,IAU7Bz3B,EAAQyT,UAAU8iB,4BAA8B,SAASF,GACvD,GAQIqB,GACAC,EATAC,EAAK34B,KAAKk1B,IAAInH,EAChB6K,EAAK54B,KAAKk1B,IAAIjV,EACd4Y,EAAK74B,KAAKk1B,IAAIlP,EACduS,EAAKnB,EAAYrJ,EACjB9M,EAAKmW,EAAYnX,EACjBuY,EAAKpB,EAAYpR,CAgBnB,OAXIhmB,MAAKw0B,iBACPiE,GAAMF,EAAKI,IAAOE,EAAKL,GACvBE,GAAMzX,EAAK2X,IAAOC,EAAKL,KAGvBC,EAAKF,IAAOM,EAAK74B,KAAKi1B,OAAO6D,gBAC7BJ,EAAKzX,IAAO4X,EAAK74B,KAAKi1B,OAAO6D,iBAKxB,GAAI33B,GACTnB,KAAK+4B,QAAUN,EAAKz4B,KAAKg5B,MAAMC,OAAOC,YACtCl5B,KAAKm5B,QAAUT,EAAK14B,KAAKg5B,MAAMC,OAAOC,cAO1Cn4B,EAAQyT,UAAU4kB,oBAAsB,SAASC,GAC/C,GAAIC,GAAO,QACPC,EAAS,OACTC,EAAc,CAElB,IAAgC,gBAAtB,GACRF,EAAOD,EACPE,EAAS,OACTC,EAAc,MAEX,IAAgC,gBAAtB,GACgBrzB,SAAzBkzB,EAAgBC,OAAuBA,EAAOD,EAAgBC,MACnCnzB,SAA3BkzB,EAAgBE,SAAyBA,EAASF,EAAgBE,QAClCpzB,SAAhCkzB,EAAgBG,cAA2BA,EAAcH,EAAgBG,iBAE1E,IAAyBrzB,SAApBkzB,EAIR,KAAM,qCAGRr5B,MAAKg5B,MAAM7K,MAAMkL,gBAAkBC,EACnCt5B,KAAKg5B,MAAM7K,MAAMsL,YAAcF,EAC/Bv5B,KAAKg5B,MAAM7K,MAAMuL,YAAcF,EAAc,KAC7Cx5B,KAAKg5B,MAAM7K,MAAMwL,YAAc,SAKjC54B,EAAQuzB,OACNsF,IAAK,EACLC,SAAU,EACVC,QAAS,EACTvF,IAAM,EACNwF,QAAU,EACVC,SAAU,EACVC,QAAS,EACTC,KAAO,EACPC,KAAM,EACNC,QAAU,GASZr5B,EAAQyT,UAAU6lB,gBAAkB,SAASC,GAC3C,OAAQA,GACN,IAAK,MAAW,MAAOv5B,GAAQuzB,MAAMC,GACrC,KAAK,WAAa,MAAOxzB,GAAQuzB,MAAMyF,OACvC,KAAK,YAAe,MAAOh5B,GAAQuzB,MAAM0F,QACzC,KAAK,WAAa,MAAOj5B,GAAQuzB,MAAM2F,OACvC,KAAK,OAAW,MAAOl5B,GAAQuzB,MAAM6F,IACrC,KAAK,OAAW,MAAOp5B,GAAQuzB,MAAM4F,IACrC,KAAK,UAAa,MAAOn5B,GAAQuzB,MAAM8F,OACvC,KAAK,MAAW,MAAOr5B,GAAQuzB,MAAMsF,GACrC,KAAK,YAAe,MAAO74B,GAAQuzB,MAAMuF,QACzC,KAAK,WAAa,MAAO94B,GAAQuzB,MAAMwF,QAGzC,MAAO,IAQT/4B,EAAQyT,UAAU+lB,wBAA0B,SAAS3O,GACnD,GAAI5rB,KAAKmuB,QAAUptB,EAAQuzB,MAAMC,KAC/Bv0B,KAAKmuB,QAAUptB,EAAQuzB,MAAMyF,SAC7B/5B,KAAKmuB,QAAUptB,EAAQuzB,MAAM6F,MAC7Bn6B,KAAKmuB,QAAUptB,EAAQuzB,MAAM4F,MAC7Bl6B,KAAKmuB,QAAUptB,EAAQuzB,MAAM8F,SAC7Bp6B,KAAKmuB,QAAUptB,EAAQuzB,MAAMsF,IAE7B55B,KAAKo1B,KAAO,EACZp1B,KAAKq1B,KAAO,EACZr1B,KAAKs1B,KAAO,EACZt1B,KAAKu1B,SAAWpvB,OAEZylB,EAAKgH,qBAAuB,IAC9B5yB,KAAKw1B,UAAY,OAGhB,CAAA,GAAIx1B,KAAKmuB,QAAUptB,EAAQuzB,MAAM0F,UACpCh6B,KAAKmuB,QAAUptB,EAAQuzB,MAAM2F,SAC7Bj6B,KAAKmuB,QAAUptB,EAAQuzB,MAAMuF,UAC7B75B,KAAKmuB,QAAUptB,EAAQuzB,MAAMwF,QAY7B,KAAM,kBAAoB95B,KAAKmuB,MAAQ,GAVvCnuB,MAAKo1B,KAAO,EACZp1B,KAAKq1B,KAAO,EACZr1B,KAAKs1B,KAAO,EACZt1B,KAAKu1B,SAAW,EAEZ3J,EAAKgH,qBAAuB,IAC9B5yB,KAAKw1B,UAAY,KAQvBz0B,EAAQyT,UAAUyb,gBAAkB,SAASrE,GAC3C,MAAOA,GAAKtmB,QAIdvE,EAAQyT,UAAUoe,mBAAqB,SAAShH,GAC9C,GAAI4O,GAAU,CACd,KAAK,GAAIC,KAAU7O,GAAK,GAClBA,EAAK,GAAGnmB,eAAeg1B,IACzBD,GAGJ,OAAOA,IAITz5B,EAAQyT,UAAUkmB,kBAAoB,SAAS9O,EAAM6O,GAEnD,IAAK,GADDE,MACKx1B,EAAI,EAAGA,EAAIymB,EAAKtmB,OAAQH,IACgB,IAA3Cw1B,EAAer0B,QAAQslB,EAAKzmB,GAAGs1B,KACjCE,EAAe7yB,KAAK8jB,EAAKzmB,GAAGs1B,GAGhC,OAAOE,IAIT55B,EAAQyT,UAAUomB,eAAiB,SAAShP,EAAK6O,GAE/C,IAAK,GADDI,IAAUxvB,IAAIugB,EAAK,GAAG6O,GAAQ3tB,IAAI8e,EAAK,GAAG6O,IACrCt1B,EAAI,EAAGA,EAAIymB,EAAKtmB,OAAQH,IAC3B01B,EAAOxvB,IAAMugB,EAAKzmB,GAAGs1B,KAAWI,EAAOxvB,IAAMugB,EAAKzmB,GAAGs1B,IACrDI,EAAO/tB,IAAM8e,EAAKzmB,GAAGs1B,KAAWI,EAAO/tB,IAAM8e,EAAKzmB,GAAGs1B,GAE3D,OAAOI,IAST95B,EAAQyT,UAAUsmB,gBAAkB,SAAUC,GAC5C,GAAIpL,GAAK3vB,IAOT,IAJIA,KAAKuzB,SACPvzB,KAAKuzB,QAAQrE,IAAI,IAAKlvB,KAAKg7B,WAGb70B,SAAZ40B,EAAJ,CAGIn1B,MAAMC,QAAQk1B,KAChBA,EAAU,GAAIl6B,GAAQk6B,GAGxB,IAAInP,EACJ,MAAImP,YAAmBl6B,IAAWk6B,YAAmBj6B,IAInD,KAAM,IAAI0C,OAAM,uCAGlB,IANEooB,EAAOmP,EAAQriB,MAME,GAAfkT,EAAKtmB,OAAT,CAGAtF,KAAKuzB,QAAUwH,EACf/6B,KAAK2yB,UAAY/G,EAGjB5rB,KAAKg7B,UAAY,WACfrL,EAAGwD,QAAQxD,EAAG4D,UAEhBvzB,KAAKuzB,QAAQxE,GAAG,IAAK/uB,KAAKg7B,WAS1Bh7B,KAAKo1B,KAAO,IACZp1B,KAAKq1B,KAAO,IACZr1B,KAAKs1B,KAAO,IACZt1B,KAAKu1B,SAAW,QAChBv1B,KAAKw1B,UAAY,SAKb5J,EAAK,GAAGnmB,eAAe,WACDU,SAApBnG,KAAKi7B,aACPj7B,KAAKi7B,WAAa,GAAI/5B,GAAO65B,EAAS/6B,KAAKw1B,UAAWx1B,MACtDA,KAAKi7B,WAAWC,kBAAkB,WAAYvL,EAAGwL,WAKrD,IAAIC,GAAWp7B,KAAKmuB,OAASptB,EAAQuzB,MAAMsF,KACzC55B,KAAKmuB,OAASptB,EAAQuzB,MAAMuF,UAC5B75B,KAAKmuB,OAASptB,EAAQuzB,MAAMwF,OAG9B,IAAIsB,EAAU,CACZ,GAA8Bj1B,SAA1BnG,KAAKq7B,iBACPr7B,KAAKo2B,UAAYp2B,KAAKq7B,qBAEnB,CACH,GAAIC,GAAQt7B,KAAK06B,kBAAkB9O,EAAK5rB,KAAKo1B,KAC7Cp1B,MAAKo2B,UAAakF,EAAM,GAAKA,EAAM,IAAO,EAG5C,GAA8Bn1B,SAA1BnG,KAAKu7B,iBACPv7B,KAAKq2B,UAAYr2B,KAAKu7B,qBAEnB,CACH,GAAIC,GAAQx7B,KAAK06B,kBAAkB9O,EAAK5rB,KAAKq1B,KAC7Cr1B,MAAKq2B,UAAamF,EAAM,GAAKA,EAAM,IAAO,GAK9C,GAAIC,GAASz7B,KAAK46B,eAAehP,EAAK5rB,KAAKo1B,KACvCgG,KACFK,EAAOpwB,KAAOrL,KAAKo2B,UAAY,EAC/BqF,EAAO3uB,KAAO9M,KAAKo2B,UAAY,GAEjCp2B,KAAKy1B,KAA6BtvB,SAArBnG,KAAK07B,YAA6B17B,KAAK07B,YAAcD,EAAOpwB,IACzErL,KAAK21B,KAA6BxvB,SAArBnG,KAAK27B,YAA6B37B,KAAK27B,YAAcF,EAAO3uB,IACrE9M,KAAK21B,MAAQ31B,KAAKy1B,OAAMz1B,KAAK21B,KAAO31B,KAAKy1B,KAAO,GACpDz1B,KAAK01B,MAA+BvvB,SAAtBnG,KAAK47B,aAA8B57B,KAAK47B,cAAgB57B,KAAK21B,KAAK31B,KAAKy1B,MAAM,CAE3F,IAAIoG,GAAS77B,KAAK46B,eAAehP,EAAK5rB,KAAKq1B,KACvC+F,KACFS,EAAOxwB,KAAOrL,KAAKq2B,UAAY,EAC/BwF,EAAO/uB,KAAO9M,KAAKq2B,UAAY,GAEjCr2B,KAAK41B,KAA6BzvB,SAArBnG,KAAK87B,YAA6B97B,KAAK87B,YAAcD,EAAOxwB,IACzErL,KAAK81B,KAA6B3vB,SAArBnG,KAAK+7B,YAA6B/7B,KAAK+7B,YAAcF,EAAO/uB,IACrE9M,KAAK81B,MAAQ91B,KAAK41B,OAAM51B,KAAK81B,KAAO91B,KAAK41B,KAAO,GACpD51B,KAAK61B,MAA+B1vB,SAAtBnG,KAAKg8B,aAA8Bh8B,KAAKg8B,cAAgBh8B,KAAK81B,KAAK91B,KAAK41B,MAAM,CAE3F,IAAIqG,GAASj8B,KAAK46B,eAAehP,EAAK5rB,KAAKs1B,KAM3C,IALAt1B,KAAK+1B,KAA6B5vB,SAArBnG,KAAKk8B,YAA6Bl8B,KAAKk8B,YAAcD,EAAO5wB,IACzErL,KAAKi2B,KAA6B9vB,SAArBnG,KAAKm8B,YAA6Bn8B,KAAKm8B,YAAcF,EAAOnvB,IACrE9M,KAAKi2B,MAAQj2B,KAAK+1B,OAAM/1B,KAAKi2B,KAAOj2B,KAAK+1B,KAAO,GACpD/1B,KAAKg2B,MAA+B7vB,SAAtBnG,KAAKo8B,aAA8Bp8B,KAAKo8B,cAAgBp8B,KAAKi2B,KAAKj2B,KAAK+1B,MAAM,EAErE5vB,SAAlBnG,KAAKu1B,SAAwB,CAC/B,GAAI8G,GAAar8B,KAAK46B,eAAehP,EAAK5rB,KAAKu1B,SAC/Cv1B,MAAKk2B,SAAqC/vB,SAAzBnG,KAAKs8B,gBAAiCt8B,KAAKs8B,gBAAkBD,EAAWhxB,IACzFrL,KAAKm2B,SAAqChwB,SAAzBnG,KAAKu8B,gBAAiCv8B,KAAKu8B,gBAAkBF,EAAWvvB,IACrF9M,KAAKm2B,UAAYn2B,KAAKk2B,WAAUl2B,KAAKm2B,SAAWn2B,KAAKk2B,SAAW,GAItEl2B,KAAK42B,eAUP71B,EAAQyT,UAAUgoB,eAAiB,SAAU5Q,GA0BzC,QAAS6Q,GAAWv3B,EAAGa,GACrB,MAAOb,GAAIa,EAzBf,GAAIgoB,GAAG9N,EAAG9a,EAAG6gB,EAAG0D,EAAKuE,EAEjBkH,IAEJ,IAAIn1B,KAAKmuB,QAAUptB,EAAQuzB,MAAM4F,MAC/Bl6B,KAAKmuB,QAAUptB,EAAQuzB,MAAM8F,QAAS,CAKtC,GAAIkB,MACAE,IACJ,KAAKr2B,EAAI,EAAGA,EAAInF,KAAKiwB,gBAAgBrE,GAAOzmB,IAC1C4oB,EAAInC,EAAKzmB,GAAGnF,KAAKo1B,OAAS,EAC1BnV,EAAI2L,EAAKzmB,GAAGnF,KAAKq1B,OAAS,EAED,KAArBiG,EAAMh1B,QAAQynB,IAChBuN,EAAMxzB,KAAKimB,GAEY,KAArByN,EAAMl1B,QAAQ2Z,IAChBub,EAAM1zB,KAAKmY,EAOfqb,GAAM9J,KAAKiL,GACXjB,EAAMhK,KAAKiL,EAGX,IAAIC,KACJ,KAAKv3B,EAAI,EAAGA,EAAIymB,EAAKtmB,OAAQH,IAAK,CAChC4oB,EAAInC,EAAKzmB,GAAGnF,KAAKo1B,OAAS,EAC1BnV,EAAI2L,EAAKzmB,GAAGnF,KAAKq1B,OAAS,EAC1BrP,EAAI4F,EAAKzmB,GAAGnF,KAAKs1B,OAAS,CAE1B,IAAIqH,GAASrB,EAAMh1B,QAAQynB,GACvB6O,EAASpB,EAAMl1B,QAAQ2Z,EAEA9Z,UAAvBu2B,EAAWC,KACbD,EAAWC,MAGb,IAAIxF,GAAU,GAAI/1B,EAClB+1B,GAAQpJ,EAAIA,EACZoJ,EAAQlX,EAAIA,EACZkX,EAAQnR,EAAIA,EAEZ0D,KACAA,EAAIuE,MAAQkJ,EACZzN,EAAImT,MAAQ12B,OACZujB,EAAIoT,OAAS32B,OACbujB,EAAIqT,OAAS,GAAI37B,GAAQ2sB,EAAG9N,EAAGjgB,KAAK+1B,MAEpC2G,EAAWC,GAAQC,GAAUlT,EAE7ByL,EAAWrtB,KAAK4hB,GAIlB,IAAKqE,EAAI,EAAGA,EAAI2O,EAAWp3B,OAAQyoB,IACjC,IAAK9N,EAAI,EAAGA,EAAIyc,EAAW3O,GAAGzoB,OAAQ2a,IAChCyc,EAAW3O,GAAG9N,KAChByc,EAAW3O,GAAG9N,GAAG+c,WAAcjP,EAAI2O,EAAWp3B,OAAO,EAAKo3B,EAAW3O,EAAE,GAAG9N,GAAK9Z,OAC/Eu2B,EAAW3O,GAAG9N,GAAGgd,SAAchd,EAAIyc,EAAW3O,GAAGzoB,OAAO,EAAKo3B,EAAW3O,GAAG9N,EAAE,GAAK9Z,OAClFu2B,EAAW3O,GAAG9N,GAAGid,WACdnP,EAAI2O,EAAWp3B,OAAO,GAAK2a,EAAIyc,EAAW3O,GAAGzoB,OAAO,EACnDo3B,EAAW3O,EAAE,GAAG9N,EAAE,GAClB9Z,YAOV,KAAKhB,EAAI,EAAGA,EAAIymB,EAAKtmB,OAAQH,IAC3B8oB,EAAQ,GAAI7sB,GACZ6sB,EAAMF,EAAInC,EAAKzmB,GAAGnF,KAAKo1B,OAAS,EAChCnH,EAAMhO,EAAI2L,EAAKzmB,GAAGnF,KAAKq1B,OAAS,EAChCpH,EAAMjI,EAAI4F,EAAKzmB,GAAGnF,KAAKs1B,OAAS,EAEVnvB,SAAlBnG,KAAKu1B,WACPtH,EAAMjnB,MAAQ4kB,EAAKzmB,GAAGnF,KAAKu1B,WAAa,GAG1C7L,KACAA,EAAIuE,MAAQA,EACZvE,EAAIqT,OAAS,GAAI37B,GAAQ6sB,EAAMF,EAAGE,EAAMhO,EAAGjgB,KAAK+1B,MAChDrM,EAAImT,MAAQ12B,OACZujB,EAAIoT,OAAS32B,OAEbgvB,EAAWrtB,KAAK4hB,EAIpB,OAAOyL,IASTp0B,EAAQyT,UAAU9G,OAAS,WAEzB,KAAO1N,KAAK6zB,iBAAiBsJ,iBAC3Bn9B,KAAK6zB,iBAAiBzG,YAAYptB,KAAK6zB,iBAAiBuJ,WAG1Dp9B,MAAKg5B,MAAQxL,SAASK,cAAc,OACpC7tB,KAAKg5B,MAAM7K,MAAMkP,SAAW,WAC5Br9B,KAAKg5B,MAAM7K,MAAMte,SAAW,SAG5B7P,KAAKg5B,MAAMC,OAASzL,SAASK,cAAe,UAC5C7tB,KAAKg5B,MAAMC,OAAO9K,MAAMkP,SAAW,WACnCr9B,KAAKg5B,MAAMtL,YAAY1tB,KAAKg5B,MAAMC,OAGhC,IAAIqE,GAAW9P,SAASK,cAAe,MACvCyP,GAASnP,MAAM1jB,MAAQ,MACvB6yB,EAASnP,MAAMoP,WAAc,OAC7BD,EAASnP,MAAMqP,QAAW,OAC1BF,EAASG,UAAa,mDACtBz9B,KAAKg5B,MAAMC,OAAOvL,YAAY4P,GAGhCt9B,KAAKg5B,MAAM7J,OAAS3B,SAASK,cAAe,OAC5C7tB,KAAKg5B,MAAM7J,OAAOhB,MAAMkP,SAAW,WACnCr9B,KAAKg5B,MAAM7J,OAAOhB,MAAM4O,OAAS,MACjC/8B,KAAKg5B,MAAM7J,OAAOhB,MAAM/mB,KAAO,MAC/BpH,KAAKg5B,MAAM7J,OAAOhB,MAAMI,MAAQ,OAChCvuB,KAAKg5B,MAAMtL,YAAY1tB,KAAKg5B,MAAM7J,OAGlC,IAAIQ,GAAK3vB,KACL09B,EAAc,SAAUt0B,GAAQumB,EAAGgO,aAAav0B,IAChDw0B,EAAe,SAAUx0B,GAAQumB,EAAGkO,cAAcz0B,IAClD00B,EAAe,SAAU10B,GAAQumB,EAAGoO,SAAS30B,IAC7C40B,EAAY,SAAU50B,GAAQumB,EAAGsO,WAAW70B,GAGhDzI,GAAK8H,iBAAiBzI,KAAKg5B,MAAMC,OAAQ,UAAWiF,WACpDv9B,EAAK8H,iBAAiBzI,KAAKg5B,MAAMC,OAAQ,YAAayE,GACtD/8B,EAAK8H,iBAAiBzI,KAAKg5B,MAAMC,OAAQ,aAAc2E,GACvDj9B,EAAK8H,iBAAiBzI,KAAKg5B,MAAMC,OAAQ,aAAc6E,GACvDn9B,EAAK8H,iBAAiBzI,KAAKg5B,MAAMC,OAAQ,YAAa+E,GAGtDh+B,KAAK6zB,iBAAiBnG,YAAY1tB,KAAKg5B,QAWzCj4B,EAAQyT,UAAU2pB,QAAU,SAAS5P,EAAOC,GAC1CxuB,KAAKg5B,MAAM7K,MAAMI,MAAQA,EACzBvuB,KAAKg5B,MAAM7K,MAAMK,OAASA,EAE1BxuB,KAAKo+B,iBAMPr9B,EAAQyT,UAAU4pB,cAAgB,WAChCp+B,KAAKg5B,MAAMC,OAAO9K,MAAMI,MAAQ,OAChCvuB,KAAKg5B,MAAMC,OAAO9K,MAAMK,OAAS,OAEjCxuB,KAAKg5B,MAAMC,OAAO1K,MAAQvuB,KAAKg5B,MAAMC,OAAOC,YAC5Cl5B,KAAKg5B,MAAMC,OAAOzK,OAASxuB,KAAKg5B,MAAMC,OAAOoF,aAG7Cr+B,KAAKg5B,MAAM7J,OAAOhB,MAAMI,MAASvuB,KAAKg5B,MAAMC,OAAOC,YAAc,GAAU,MAM7En4B,EAAQyT,UAAU8pB,eAAiB,WACjC,IAAKt+B,KAAKg5B,MAAM7J,SAAWnvB,KAAKg5B,MAAM7J,OAAOoP,OAC3C,KAAM,wBAERv+B,MAAKg5B,MAAM7J,OAAOoP,OAAOC,QAO3Bz9B,EAAQyT,UAAUiqB,cAAgB,WAC3Bz+B,KAAKg5B,MAAM7J,QAAWnvB,KAAKg5B,MAAM7J,OAAOoP,QAE7Cv+B,KAAKg5B,MAAM7J,OAAOoP,OAAOG,QAU3B39B,EAAQyT,UAAUmqB,cAAgB,WAG9B3+B,KAAK+4B,QAD0D,MAA7D/4B,KAAK+zB,eAAetM,OAAOznB,KAAK+zB,eAAezuB,OAAO,GAEtD2W,WAAWjc,KAAK+zB,gBAAkB,IAChC/zB,KAAKg5B,MAAMC,OAAOC,YAGPjd,WAAWjc,KAAK+zB,gBAK/B/zB,KAAKm5B,QAD0D,MAA7Dn5B,KAAKg0B,eAAevM,OAAOznB,KAAKg0B,eAAe1uB,OAAO,GAEtD2W,WAAWjc,KAAKg0B,gBAAkB,KAC/Bh0B,KAAKg5B,MAAMC,OAAOoF,aAAer+B,KAAKg5B,MAAM7J,OAAOkP,cAGzCpiB,WAAWjc,KAAKg0B,iBAoBnCjzB,EAAQyT,UAAUoqB,kBAAoB,SAASC,GACjC14B,SAAR04B,IAImB14B,SAAnB04B,EAAIC,YAA6C34B,SAAjB04B,EAAIE,UACtC/+B,KAAKi1B,OAAO+J,eAAeH,EAAIC,WAAYD,EAAIE,UAG5B54B,SAAjB04B,EAAII,UACNj/B,KAAKi1B,OAAOiK,aAAaL,EAAII,UAG/Bj/B,KAAKm7B,WASPp6B,EAAQyT,UAAU2qB,kBAAoB,WACpC,GAAIN,GAAM7+B,KAAKi1B,OAAOmK,gBAEtB,OADAP,GAAII,SAAWj/B,KAAKi1B,OAAO6D,eACpB+F,GAMT99B,EAAQyT,UAAU6qB,UAAY,SAASzT,GAErC5rB,KAAK86B,gBAAgBlP,EAAM5rB,KAAKmuB,OAK9BnuB,KAAKm1B,WAFHn1B,KAAKi7B,WAEWj7B,KAAKi7B,WAAWuB,iBAIhBx8B,KAAKw8B,eAAex8B,KAAK2yB,WAI7C3yB,KAAKs/B,iBAOPv+B,EAAQyT,UAAU2e,QAAU,SAAUvH,GACpC5rB,KAAKq/B,UAAUzT,GACf5rB,KAAKm7B,SAGDn7B,KAAKu/B,oBAAsBv/B,KAAKi7B,YAClCj7B,KAAKs+B;EAQTv9B,EAAQyT,UAAUkiB,WAAa,SAAU5oB,GACvC,GAAI0xB,GAAiBr5B,MAIrB,IAFAnG,KAAKy+B,gBAEWt4B,SAAZ2H,EAAuB,CAczB,GAZsB3H,SAAlB2H,EAAQygB,QAA2BvuB,KAAKuuB,MAAQzgB,EAAQygB,OACrCpoB,SAAnB2H,EAAQ0gB,SAA2BxuB,KAAKwuB,OAAS1gB,EAAQ0gB,QAErCroB,SAApB2H,EAAQgpB,UAA2B92B,KAAK+zB,eAAiBjmB,EAAQgpB,SAC7C3wB,SAApB2H,EAAQipB,UAA2B/2B,KAAKg0B,eAAiBlmB,EAAQipB,SAEzC5wB,SAAxB2H,EAAQsmB,cAA+Bp0B,KAAKo0B,YAActmB,EAAQsmB,aAC1CjuB,SAAxB2H,EAAQumB,cAA+Br0B,KAAKq0B,YAAcvmB,EAAQumB,aAC/CluB,SAAnB2H,EAAQmmB,SAA0Bj0B,KAAKi0B,OAASnmB,EAAQmmB,QACrC9tB,SAAnB2H,EAAQomB,SAA0Bl0B,KAAKk0B,OAASpmB,EAAQomB,QACrC/tB,SAAnB2H,EAAQqmB,SAA0Bn0B,KAAKm0B,OAASrmB,EAAQqmB,QAEtChuB,SAAlB2H,EAAQqgB,MAAqB,CAC/B,GAAIsR,GAAcz/B,KAAKq6B,gBAAgBvsB,EAAQqgB,MAC3B,MAAhBsR,IACFz/B,KAAKmuB,MAAQsR,GAGQt5B,SAArB2H,EAAQ2mB,WAA6Bz0B,KAAKy0B,SAAW3mB,EAAQ2mB,UACjCtuB,SAA5B2H,EAAQ0mB,kBAAiCx0B,KAAKw0B,gBAAkB1mB,EAAQ0mB,iBACjDruB,SAAvB2H,EAAQ6mB,aAA6B30B,KAAK20B,WAAa7mB,EAAQ6mB,YAC3CxuB,SAApB2H,EAAQ4xB,UAA6B1/B,KAAK60B,YAAc/mB,EAAQ4xB,SAC9Bv5B,SAAlC2H,EAAQ6xB,wBAAqC3/B,KAAK2/B,sBAAwB7xB,EAAQ6xB,uBACtDx5B,SAA5B2H,EAAQ4mB,kBAAiC10B,KAAK00B,gBAAkB5mB,EAAQ4mB,iBAC9CvuB,SAA1B2H,EAAQgnB,gBAA+B90B,KAAK80B,cAAgBhnB,EAAQgnB,eAEtC3uB,SAA9B2H,EAAQinB,oBAAiC/0B,KAAK+0B,kBAAoBjnB,EAAQinB,mBAC7C5uB,SAA7B2H,EAAQknB,mBAAiCh1B,KAAKg1B,iBAAmBlnB,EAAQknB,kBAC1C7uB,SAA/B2H,EAAQyxB,qBAAiCv/B,KAAKu/B,mBAAqBzxB,EAAQyxB,oBAErDp5B,SAAtB2H,EAAQsoB,YAAyBp2B,KAAKq7B,iBAAmBvtB,EAAQsoB,WAC3CjwB,SAAtB2H,EAAQuoB,YAAyBr2B,KAAKu7B,iBAAmBztB,EAAQuoB,WAEhDlwB,SAAjB2H,EAAQ2nB,OAAoBz1B,KAAK07B,YAAc5tB,EAAQ2nB,MACrCtvB,SAAlB2H,EAAQ4nB,QAAqB11B,KAAK47B,aAAe9tB,EAAQ4nB,OACxCvvB,SAAjB2H,EAAQ6nB,OAAoB31B,KAAK27B,YAAc7tB,EAAQ6nB,MACtCxvB,SAAjB2H,EAAQ8nB,OAAoB51B,KAAK87B,YAAchuB,EAAQ8nB,MACrCzvB,SAAlB2H,EAAQ+nB,QAAqB71B,KAAKg8B,aAAeluB,EAAQ+nB,OACxC1vB,SAAjB2H,EAAQgoB,OAAoB91B,KAAK+7B,YAAcjuB,EAAQgoB,MACtC3vB,SAAjB2H,EAAQioB,OAAoB/1B,KAAKk8B,YAAcpuB,EAAQioB,MACrC5vB,SAAlB2H,EAAQkoB,QAAqBh2B,KAAKo8B,aAAetuB,EAAQkoB,OACxC7vB,SAAjB2H,EAAQmoB,OAAoBj2B,KAAKm8B,YAAcruB,EAAQmoB,MAClC9vB,SAArB2H,EAAQooB,WAAwBl2B,KAAKs8B,gBAAkBxuB,EAAQooB,UAC1C/vB,SAArB2H,EAAQqoB,WAAwBn2B,KAAKu8B,gBAAkBzuB,EAAQqoB,UAEpChwB,SAA3B2H,EAAQ0xB,iBAA8BA,EAAiB1xB,EAAQ0xB,gBAE5Cr5B,SAAnBq5B,GACFx/B,KAAKi1B,OAAO+J,eAAeQ,EAAeV,WAAYU,EAAeT,UACrE/+B,KAAKi1B,OAAOiK,aAAaM,EAAeP,YAGxCj/B,KAAKi1B,OAAO+J,eAAe,EAAK,IAChCh/B,KAAKi1B,OAAOiK,aAAa,MAI7Bl/B,KAAKo5B,oBAAoBtrB,GAAWA,EAAQurB,iBAE5Cr5B,KAAKm+B,QAAQn+B,KAAKuuB,MAAOvuB,KAAKwuB,QAG1BxuB,KAAK2yB,WACP3yB,KAAKmzB,QAAQnzB,KAAK2yB,WAIhB3yB,KAAKu/B,oBAAsBv/B,KAAKi7B,YAClCj7B,KAAKs+B,kBAOTv9B,EAAQyT,UAAU2mB,OAAS,WACzB,GAAwBh1B,SAApBnG,KAAKm1B,WACP,KAAM,mCAGRn1B,MAAKo+B,gBACLp+B,KAAK2+B,gBACL3+B,KAAK4/B,gBACL5/B,KAAK6/B,eACL7/B,KAAK8/B,cAED9/B,KAAKmuB,QAAUptB,EAAQuzB,MAAM4F,MAC/Bl6B,KAAKmuB,QAAUptB,EAAQuzB,MAAM8F,QAC7Bp6B,KAAK+/B,kBAEE//B,KAAKmuB,QAAUptB,EAAQuzB,MAAM6F,KACpCn6B,KAAKggC,kBAEEhgC,KAAKmuB,QAAUptB,EAAQuzB,MAAMsF,KACpC55B,KAAKmuB,QAAUptB,EAAQuzB,MAAMuF,UAC7B75B,KAAKmuB,QAAUptB,EAAQuzB,MAAMwF,QAC7B95B,KAAKigC,iBAILjgC,KAAKkgC,iBAGPlgC,KAAKmgC,cACLngC,KAAKogC,iBAMPr/B,EAAQyT,UAAUqrB,aAAe,WAC/B,GAAI5G,GAASj5B,KAAKg5B,MAAMC,OACpBoH,EAAMpH,EAAOqH,WAAW,KAE5BD,GAAIE,UAAU,EAAG,EAAGtH,EAAO1K,MAAO0K,EAAOzK,SAO3CztB,EAAQyT,UAAU4rB,cAAgB,WAChC,GAAIngB,EAEJ,IAAIjgB,KAAKmuB,QAAUptB,EAAQuzB,MAAM0F,UAC/Bh6B,KAAKmuB,QAAUptB,EAAQuzB,MAAM2F,QAAS,CAEtC,GAEIuG,GAAUC,EAFVC,EAAmC,IAAzB1gC,KAAKg5B,MAAME,WAGrBl5B,MAAKmuB,QAAUptB,EAAQuzB,MAAM2F,SAC/BuG,EAAWE,EAAU,EACrBD,EAAWC,EAAU,EAAc,EAAVA,IAGzBF,EAAW,GACXC,EAAW,GAGb,IAAIjS,GAAS3pB,KAAKiI,IAA8B,IAA1B9M,KAAKg5B,MAAMqF,aAAqB,KAClD72B,EAAMxH,KAAK8zB,OACX6M,EAAQ3gC,KAAKg5B,MAAME,YAAcl5B,KAAK8zB,OACtC1sB,EAAOu5B,EAAQF,EACf1D,EAASv1B,EAAMgnB,EAGrB,GAAIyK,GAASj5B,KAAKg5B,MAAMC,OACpBoH,EAAMpH,EAAOqH,WAAW,KAI5B,IAHAD,EAAIO,UAAY,EAChBP,EAAIQ,KAAO,aAEP7gC,KAAKmuB,QAAUptB,EAAQuzB,MAAM0F,SAAU,CAEzC,GAAI8G,GAAO,EACPC,EAAOvS,CACX,KAAKvO,EAAI6gB,EAAUC,EAAJ9gB,EAAUA,IAAK,CAC5B,GAAI5T,IAAK4T,EAAI6gB,IAASC,EAAOD,GAGzB/zB,EAAU,IAAJV,EACN5B,EAAQzK,KAAKghC,SAASj0B,EAAK,EAAG,EAElCszB,GAAIY,YAAcx2B,EAClB41B,EAAIa,YACJb,EAAIc,OAAO/5B,EAAMI,EAAMyY,GACvBogB,EAAIe,OAAOT,EAAOn5B,EAAMyY,GACxBogB,EAAI9G,SAGN8G,EAAIY,YAAejhC,KAAKs2B,UACxB+J,EAAIgB,WAAWj6B,EAAMI,EAAKi5B,EAAUjS,GAiBtC,GAdIxuB,KAAKmuB,QAAUptB,EAAQuzB,MAAM2F,UAE/BoG,EAAIY,YAAejhC,KAAKs2B,UACxB+J,EAAIiB,UAAathC,KAAKw2B,SACtB6J,EAAIa,YACJb,EAAIc,OAAO/5B,EAAMI,GACjB64B,EAAIe,OAAOT,EAAOn5B,GAClB64B,EAAIe,OAAOT,EAAQF,EAAWD,EAAUzD,GACxCsD,EAAIe,OAAOh6B,EAAM21B,GACjBsD,EAAIkB,YACJlB,EAAI/G,OACJ+G,EAAI9G,UAGFv5B,KAAKmuB,QAAUptB,EAAQuzB,MAAM0F,UAC/Bh6B,KAAKmuB,QAAUptB,EAAQuzB,MAAM2F,QAAS,CAEtC,GAAIuH,GAAc,EACdC,EAAO,GAAIngC,GAAWtB,KAAKk2B,SAAUl2B,KAAKm2B,UAAWn2B,KAAKm2B,SAASn2B,KAAKk2B,UAAU,GAAG,EAKzF,KAJAuL,EAAK3yB,QACD2yB,EAAKC,aAAe1hC,KAAKk2B,UAC3BuL,EAAKhpB,QAECgpB,EAAKpgB,OACXpB,EAAI8c,GAAU0E,EAAKC,aAAe1hC,KAAKk2B,WAAal2B,KAAKm2B,SAAWn2B,KAAKk2B,UAAY1H,EAErF6R,EAAIa,YACJb,EAAIc,OAAO/5B,EAAOo6B,EAAavhB,GAC/BogB,EAAIe,OAAOh6B,EAAM6Y,GACjBogB,EAAI9G,SAEJ8G,EAAIsB,UAAY,QAChBtB,EAAIuB,aAAe,SACnBvB,EAAIiB,UAAYthC,KAAKs2B,UACrB+J,EAAIwB,SAASJ,EAAKC,aAAct6B,EAAO,EAAIo6B,EAAavhB,GAExDwhB,EAAKhpB,MAGP4nB,GAAIsB,UAAY,QAChBtB,EAAIuB,aAAe,KACnB,IAAIE,GAAQ9hC,KAAKq0B,WACjBgM,GAAIwB,SAASC,EAAOnB,EAAO5D,EAAS/8B,KAAK8zB,UAO7C/yB,EAAQyT,UAAU8qB,cAAgB,WAGhC,GAFAt/B,KAAKg5B,MAAM7J,OAAOsO,UAAY,GAE1Bz9B,KAAKi7B,WAAY,CACnB,GAAIntB,IACFi0B,QAAW/hC,KAAK2/B,uBAEdpB,EAAS,GAAIl9B,GAAOrB,KAAKg5B,MAAM7J,OAAQrhB,EAC3C9N,MAAKg5B,MAAM7J,OAAOoP,OAASA,EAG3Bv+B,KAAKg5B,MAAM7J,OAAOhB,MAAMqP,QAAU,OAGlCe,EAAOyD,UAAUhiC,KAAKi7B,WAAW9iB,QACjComB,EAAO0D,gBAAgBjiC,KAAK+0B,kBAG5B,IAAIpF,GAAK3vB,KACLkiC,EAAW,WACb,GAAIj6B,GAAQs2B,EAAO4D,UAEnBxS,GAAGsL,WAAWmH,YAAYn6B,GAC1B0nB,EAAGwF,WAAaxF,EAAGsL,WAAWuB,iBAE9B7M,EAAGwL,SAELoD,GAAO8D,oBAAoBH,OAG3BliC,MAAKg5B,MAAM7J,OAAOoP,OAASp4B,QAO/BpF,EAAQyT,UAAUorB,cAAgB,WACEz5B,SAA7BnG,KAAKg5B,MAAM7J,OAAOoP,QACrBv+B,KAAKg5B,MAAM7J,OAAOoP,OAAOpD,UAQ7Bp6B,EAAQyT,UAAU2rB,YAAc,WAC9B,GAAIngC,KAAKi7B,WAAY,CACnB,GAAIhC,GAASj5B,KAAKg5B,MAAMC,OACpBoH,EAAMpH,EAAOqH,WAAW,KAE5BD,GAAIQ,KAAO,aACXR,EAAIiC,UAAY,OAChBjC,EAAIiB,UAAY,OAChBjB,EAAIsB,UAAY,OAChBtB,EAAIuB,aAAe,KAEnB,IAAI7T,GAAI/tB,KAAK8zB,OACT7T,EAAIjgB,KAAK8zB,MACbuM,GAAIwB,SAAS7hC,KAAKi7B,WAAWsH,WAAa,KAAOviC,KAAKi7B,WAAWuH,mBAAoBzU,EAAG9N,KAQ5Flf,EAAQyT,UAAUsrB,YAAc,WAC9B,GAEEtV,GAAMiY,EAAIhB,EAAMiB,EAChBC,EAAMC,EAAOC,EAAOC,EACpB3X,EAAQ4X,EAASC,EACjBC,EAAQC,EALNjK,EAASj5B,KAAKg5B,MAAMC,OACtBoH,EAAMpH,EAAOqH,WAAW,KAQ1BD,GAAIQ,KAAO,GAAK7gC,KAAKi1B,OAAO6D,eAAiB,UAG7C,IAAIqK,GAAW,KAAQnjC,KAAK62B,MAAM9I,EAC9BqV,EAAW,KAAQpjC,KAAK62B,MAAM5W,EAC9BojB,EAAa,EAAIrjC,KAAKi1B,OAAO6D,eAC7BwK,EAAWtjC,KAAKi1B,OAAOmK,iBAAiBN,UAU5C,KAPAuB,EAAIO,UAAY,EAChB8B,EAAoCv8B,SAAtBnG,KAAK47B,aACnB6F,EAAO,GAAIngC,GAAWtB,KAAKy1B,KAAMz1B,KAAK21B,KAAM31B,KAAK01B,MAAOgN,GACxDjB,EAAK3yB,QACD2yB,EAAKC,aAAe1hC,KAAKy1B,MAC3BgM,EAAKhpB,QAECgpB,EAAKpgB,OAAO,CAClB,GAAI0M,GAAI0T,EAAKC,YAET1hC,MAAKy0B,UACPjK,EAAOxqB,KAAKk3B,eAAe,GAAI91B,GAAQ2sB,EAAG/tB,KAAK41B,KAAM51B,KAAK+1B,OAC1D0M,EAAKziC,KAAKk3B,eAAe,GAAI91B,GAAQ2sB,EAAG/tB,KAAK81B,KAAM91B,KAAK+1B,OACxDsK,EAAIY,YAAcjhC,KAAKu2B,UACvB8J,EAAIa,YACJb,EAAIc,OAAO3W,EAAKuD,EAAGvD,EAAKvK,GACxBogB,EAAIe,OAAOqB,EAAG1U,EAAG0U,EAAGxiB,GACpBogB,EAAI9G,WAGJ/O,EAAOxqB,KAAKk3B,eAAe,GAAI91B,GAAQ2sB,EAAG/tB,KAAK41B,KAAM51B,KAAK+1B,OAC1D0M,EAAKziC,KAAKk3B,eAAe,GAAI91B,GAAQ2sB,EAAG/tB,KAAK41B,KAAKuN,EAAUnjC,KAAK+1B,OACjEsK,EAAIY,YAAcjhC,KAAKs2B,UACvB+J,EAAIa,YACJb,EAAIc,OAAO3W,EAAKuD,EAAGvD,EAAKvK,GACxBogB,EAAIe,OAAOqB,EAAG1U,EAAG0U,EAAGxiB,GACpBogB,EAAI9G,SAEJ/O,EAAOxqB,KAAKk3B,eAAe,GAAI91B,GAAQ2sB,EAAG/tB,KAAK81B,KAAM91B,KAAK+1B,OAC1D0M,EAAKziC,KAAKk3B,eAAe,GAAI91B,GAAQ2sB,EAAG/tB,KAAK81B,KAAKqN,EAAUnjC,KAAK+1B,OACjEsK,EAAIY,YAAcjhC,KAAKs2B,UACvB+J,EAAIa,YACJb,EAAIc,OAAO3W,EAAKuD,EAAGvD,EAAKvK,GACxBogB,EAAIe,OAAOqB,EAAG1U,EAAG0U,EAAGxiB,GACpBogB,EAAI9G,UAGNsJ,EAASh+B,KAAKqzB,IAAIoL,GAAY,EAAKtjC,KAAK41B,KAAO51B,KAAK81B,KACpD6M,EAAO3iC,KAAKk3B,eAAe,GAAI91B,GAAQ2sB,EAAG8U,EAAO7iC,KAAK+1B,OAClDlxB,KAAKqzB,IAAe,EAAXoL,GAAgB,GAC3BjD,EAAIsB,UAAY,SAChBtB,EAAIuB,aAAe,MACnBe,EAAK1iB,GAAKojB,GAEHx+B,KAAKkzB,IAAe,EAAXuL,GAAgB,GAChCjD,EAAIsB,UAAY,QAChBtB,EAAIuB,aAAe,WAGnBvB,EAAIsB,UAAY,OAChBtB,EAAIuB,aAAe,UAErBvB,EAAIiB,UAAYthC,KAAKs2B,UACrB+J,EAAIwB,SAAS,KAAOJ,EAAKC,aAAe,KAAMiB,EAAK5U,EAAG4U,EAAK1iB,GAE3DwhB,EAAKhpB,OAWP,IAPA4nB,EAAIO,UAAY,EAChB8B,EAAoCv8B,SAAtBnG,KAAKg8B,aACnByF,EAAO,GAAIngC,GAAWtB,KAAK41B,KAAM51B,KAAK81B,KAAM91B,KAAK61B,MAAO6M,GACxDjB,EAAK3yB,QACD2yB,EAAKC,aAAe1hC,KAAK41B,MAC3B6L,EAAKhpB,QAECgpB,EAAKpgB,OACPrhB,KAAKy0B,UACPjK,EAAOxqB,KAAKk3B,eAAe,GAAI91B,GAAQpB,KAAKy1B,KAAMgM,EAAKC,aAAc1hC,KAAK+1B,OAC1E0M,EAAKziC,KAAKk3B,eAAe,GAAI91B,GAAQpB,KAAK21B,KAAM8L,EAAKC,aAAc1hC,KAAK+1B,OACxEsK,EAAIY,YAAcjhC,KAAKu2B,UACvB8J,EAAIa,YACJb,EAAIc,OAAO3W,EAAKuD,EAAGvD,EAAKvK,GACxBogB,EAAIe,OAAOqB,EAAG1U,EAAG0U,EAAGxiB,GACpBogB,EAAI9G,WAGJ/O,EAAOxqB,KAAKk3B,eAAe,GAAI91B,GAAQpB,KAAKy1B,KAAMgM,EAAKC,aAAc1hC,KAAK+1B,OAC1E0M,EAAKziC,KAAKk3B,eAAe,GAAI91B,GAAQpB,KAAKy1B,KAAK2N,EAAU3B,EAAKC,aAAc1hC,KAAK+1B,OACjFsK,EAAIY,YAAcjhC,KAAKs2B,UACvB+J,EAAIa,YACJb,EAAIc,OAAO3W,EAAKuD,EAAGvD,EAAKvK,GACxBogB,EAAIe,OAAOqB,EAAG1U,EAAG0U,EAAGxiB,GACpBogB,EAAI9G,SAEJ/O,EAAOxqB,KAAKk3B,eAAe,GAAI91B,GAAQpB,KAAK21B,KAAM8L,EAAKC,aAAc1hC,KAAK+1B,OAC1E0M,EAAKziC,KAAKk3B,eAAe,GAAI91B,GAAQpB,KAAK21B,KAAKyN,EAAU3B,EAAKC,aAAc1hC,KAAK+1B,OACjFsK,EAAIY,YAAcjhC,KAAKs2B,UACvB+J,EAAIa,YACJb,EAAIc,OAAO3W,EAAKuD,EAAGvD,EAAKvK,GACxBogB,EAAIe,OAAOqB,EAAG1U,EAAG0U,EAAGxiB,GACpBogB,EAAI9G,UAGNqJ,EAAS/9B,KAAKkzB,IAAIuL,GAAa,EAAKtjC,KAAKy1B,KAAOz1B,KAAK21B,KACrDgN,EAAO3iC,KAAKk3B,eAAe,GAAI91B,GAAQwhC,EAAOnB,EAAKC,aAAc1hC,KAAK+1B,OAClElxB,KAAKqzB,IAAe,EAAXoL,GAAgB,GAC3BjD,EAAIsB,UAAY,SAChBtB,EAAIuB,aAAe,MACnBe,EAAK1iB,GAAKojB,GAEHx+B,KAAKkzB,IAAe,EAAXuL,GAAgB,GAChCjD,EAAIsB,UAAY,QAChBtB,EAAIuB,aAAe,WAGnBvB,EAAIsB,UAAY,OAChBtB,EAAIuB,aAAe,UAErBvB,EAAIiB,UAAYthC,KAAKs2B,UACrB+J,EAAIwB,SAAS,KAAOJ,EAAKC,aAAe,KAAMiB,EAAK5U,EAAG4U,EAAK1iB,GAE3DwhB,EAAKhpB,MAaP,KATA4nB,EAAIO,UAAY,EAChB8B,EAAoCv8B,SAAtBnG,KAAKo8B,aACnBqF,EAAO,GAAIngC,GAAWtB,KAAK+1B,KAAM/1B,KAAKi2B,KAAMj2B,KAAKg2B,MAAO0M,GACxDjB,EAAK3yB,QACD2yB,EAAKC,aAAe1hC,KAAK+1B,MAC3B0L,EAAKhpB,OAEPmqB,EAAS/9B,KAAKqzB,IAAIoL,GAAa,EAAKtjC,KAAKy1B,KAAOz1B,KAAK21B,KACrDkN,EAASh+B,KAAKkzB,IAAIuL,GAAa,EAAKtjC,KAAK41B,KAAO51B,KAAK81B,MAC7C2L,EAAKpgB,OAEXmJ,EAAOxqB,KAAKk3B,eAAe,GAAI91B,GAAQwhC,EAAOC,EAAOpB,EAAKC,eAC1DrB,EAAIY,YAAcjhC,KAAKs2B,UACvB+J,EAAIa,YACJb,EAAIc,OAAO3W,EAAKuD,EAAGvD,EAAKvK,GACxBogB,EAAIe,OAAO5W,EAAKuD,EAAIsV,EAAY7Y,EAAKvK,GACrCogB,EAAI9G,SAEJ8G,EAAIsB,UAAY,QAChBtB,EAAIuB,aAAe,SACnBvB,EAAIiB,UAAYthC,KAAKs2B,UACrB+J,EAAIwB,SAASJ,EAAKC,aAAe,IAAKlX,EAAKuD,EAAI,EAAGvD,EAAKvK,GAEvDwhB,EAAKhpB,MAEP4nB,GAAIO,UAAY,EAChBpW,EAAOxqB,KAAKk3B,eAAe,GAAI91B,GAAQwhC,EAAOC,EAAO7iC,KAAK+1B,OAC1D0M,EAAKziC,KAAKk3B,eAAe,GAAI91B,GAAQwhC,EAAOC,EAAO7iC,KAAKi2B,OACxDoK,EAAIY,YAAcjhC,KAAKs2B,UACvB+J,EAAIa,YACJb,EAAIc,OAAO3W,EAAKuD,EAAGvD,EAAKvK,GACxBogB,EAAIe,OAAOqB,EAAG1U,EAAG0U,EAAGxiB,GACpBogB,EAAI9G,SAGJ8G,EAAIO,UAAY,EAEhBqC,EAASjjC,KAAKk3B,eAAe,GAAI91B,GAAQpB,KAAKy1B,KAAMz1B,KAAK41B,KAAM51B,KAAK+1B,OACpEmN,EAASljC,KAAKk3B,eAAe,GAAI91B,GAAQpB,KAAK21B,KAAM31B,KAAK41B,KAAM51B,KAAK+1B,OACpEsK,EAAIY,YAAcjhC,KAAKs2B,UACvB+J,EAAIa,YACJb,EAAIc,OAAO8B,EAAOlV,EAAGkV,EAAOhjB,GAC5BogB,EAAIe,OAAO8B,EAAOnV,EAAGmV,EAAOjjB,GAC5BogB,EAAI9G,SAEJ0J,EAASjjC,KAAKk3B,eAAe,GAAI91B,GAAQpB,KAAKy1B,KAAMz1B,KAAK81B,KAAM91B,KAAK+1B,OACpEmN,EAASljC,KAAKk3B,eAAe,GAAI91B,GAAQpB,KAAK21B,KAAM31B,KAAK81B,KAAM91B,KAAK+1B,OACpEsK,EAAIY,YAAcjhC,KAAKs2B,UACvB+J,EAAIa,YACJb,EAAIc,OAAO8B,EAAOlV,EAAGkV,EAAOhjB,GAC5BogB,EAAIe,OAAO8B,EAAOnV,EAAGmV,EAAOjjB,GAC5BogB,EAAI9G,SAGJ8G,EAAIO,UAAY,EAEhBpW,EAAOxqB,KAAKk3B,eAAe,GAAI91B,GAAQpB,KAAKy1B,KAAMz1B,KAAK41B,KAAM51B,KAAK+1B,OAClE0M,EAAKziC,KAAKk3B,eAAe,GAAI91B,GAAQpB,KAAKy1B,KAAMz1B,KAAK81B,KAAM91B,KAAK+1B,OAChEsK,EAAIY,YAAcjhC,KAAKs2B,UACvB+J,EAAIa,YACJb,EAAIc,OAAO3W,EAAKuD,EAAGvD,EAAKvK,GACxBogB,EAAIe,OAAOqB,EAAG1U,EAAG0U,EAAGxiB,GACpBogB,EAAI9G,SAEJ/O,EAAOxqB,KAAKk3B,eAAe,GAAI91B,GAAQpB,KAAK21B,KAAM31B,KAAK41B,KAAM51B,KAAK+1B,OAClE0M,EAAKziC,KAAKk3B,eAAe,GAAI91B,GAAQpB,KAAK21B,KAAM31B,KAAK81B,KAAM91B,KAAK+1B,OAChEsK,EAAIY,YAAcjhC,KAAKs2B,UACvB+J,EAAIa,YACJb,EAAIc,OAAO3W,EAAKuD,EAAGvD,EAAKvK,GACxBogB,EAAIe,OAAOqB,EAAG1U,EAAG0U,EAAGxiB,GACpBogB,EAAI9G,QAGJ,IAAItF,GAASj0B,KAAKi0B,MACdA,GAAO3uB,OAAS,IAClB09B,EAAU,GAAMhjC,KAAK62B,MAAM5W,EAC3B2iB,GAAS5iC,KAAKy1B,KAAOz1B,KAAK21B,MAAQ,EAClCkN,EAASh+B,KAAKqzB,IAAIoL,GAAY,EAAKtjC,KAAK41B,KAAOoN,EAAShjC,KAAK81B,KAAOkN,EACpEL,EAAO3iC,KAAKk3B,eAAe,GAAI91B,GAAQwhC,EAAOC,EAAO7iC,KAAK+1B,OACtDlxB,KAAKqzB,IAAe,EAAXoL,GAAgB,GAC3BjD,EAAIsB,UAAY,SAChBtB,EAAIuB,aAAe,OAEZ/8B,KAAKkzB,IAAe,EAAXuL,GAAgB,GAChCjD,EAAIsB,UAAY,QAChBtB,EAAIuB,aAAe,WAGnBvB,EAAIsB,UAAY,OAChBtB,EAAIuB,aAAe,UAErBvB,EAAIiB,UAAYthC,KAAKs2B,UACrB+J,EAAIwB,SAAS5N,EAAQ0O,EAAK5U,EAAG4U,EAAK1iB,GAIpC,IAAIiU,GAASl0B,KAAKk0B,MACdA,GAAO5uB,OAAS,IAClBy9B,EAAU,GAAM/iC,KAAK62B,MAAM9I,EAC3B6U,EAAS/9B,KAAKkzB,IAAIuL,GAAa,EAAKtjC,KAAKy1B,KAAOsN,EAAU/iC,KAAK21B,KAAOoN,EACtEF,GAAS7iC,KAAK41B,KAAO51B,KAAK81B,MAAQ,EAClC6M,EAAO3iC,KAAKk3B,eAAe,GAAI91B,GAAQwhC,EAAOC,EAAO7iC,KAAK+1B,OACtDlxB,KAAKqzB,IAAe,EAAXoL,GAAgB,GAC3BjD,EAAIsB,UAAY,SAChBtB,EAAIuB,aAAe,OAEZ/8B,KAAKkzB,IAAe,EAAXuL,GAAgB,GAChCjD,EAAIsB,UAAY,QAChBtB,EAAIuB,aAAe,WAGnBvB,EAAIsB,UAAY,OAChBtB,EAAIuB,aAAe,UAErBvB,EAAIiB,UAAYthC,KAAKs2B,UACrB+J,EAAIwB,SAAS3N,EAAQyO,EAAK5U,EAAG4U,EAAK1iB,GAIpC,IAAIkU,GAASn0B,KAAKm0B,MACdA,GAAO7uB,OAAS,IAClB6lB,EAAS,GACTyX,EAAS/9B,KAAKqzB,IAAIoL,GAAa,EAAKtjC,KAAKy1B,KAAOz1B,KAAK21B,KACrDkN,EAASh+B,KAAKkzB,IAAIuL,GAAa,EAAKtjC,KAAK41B,KAAO51B,KAAK81B,KACrDgN,GAAS9iC,KAAK+1B,KAAO/1B,KAAKi2B,MAAQ,EAClC0M,EAAO3iC,KAAKk3B,eAAe,GAAI91B,GAAQwhC,EAAOC,EAAOC,IACrDzC,EAAIsB,UAAY,QAChBtB,EAAIuB,aAAe,SACnBvB,EAAIiB,UAAYthC,KAAKs2B,UACrB+J,EAAIwB,SAAS1N,EAAQwO,EAAK5U,EAAI5C,EAAQwX,EAAK1iB,KAU/Clf,EAAQyT,UAAUwsB,SAAW,SAASvb,EAAGC,EAAG6d,GAC1C,GAAIC,GAAGC,EAAGC,EAAGC,EAAGC,EAAIxd,CAMpB,QAJAud,EAAIJ,EAAI7d,EACRke,EAAK/+B,KAAKC,MAAM2gB,EAAE,IAClBW,EAAIud,GAAK,EAAI9+B,KAAK+O,IAAM6R,EAAE,GAAM,EAAK,IAE7Bme,GACN,IAAK,GAAGJ,EAAIG,EAAGF,EAAIrd,EAAGsd,EAAI,CAAG,MAC7B,KAAK,GAAGF,EAAIpd,EAAGqd,EAAIE,EAAGD,EAAI,CAAG,MAC7B,KAAK,GAAGF,EAAI,EAAGC,EAAIE,EAAGD,EAAItd,CAAG,MAC7B,KAAK,GAAGod,EAAI,EAAGC,EAAIrd,EAAGsd,EAAIC,CAAG,MAC7B,KAAK,GAAGH,EAAIpd,EAAGqd,EAAI,EAAGC,EAAIC,CAAG,MAC7B,KAAK,GAAGH,EAAIG,EAAGF,EAAI,EAAGC,EAAItd,CAAG,MAE7B,SAASod,EAAI,EAAGC,EAAI,EAAGC,EAAI,EAG7B,MAAO,OAAS9nB,SAAW,IAAF4nB,GAAS,IAAM5nB,SAAW,IAAF6nB,GAAS,IAAM7nB,SAAW,IAAF8nB,GAAS,KAQpF3iC,EAAQyT,UAAUurB,gBAAkB,WAClC,GAEE9R,GAAO0S,EAAOn5B,EAAKq8B,EACnB1+B,EACA2+B,EAAgBxC,EAAWL,EAAaL,EACxC11B,EAAGC,EAAGC,EAAG24B,EALP9K,EAASj5B,KAAKg5B,MAAMC,OACtBoH,EAAMpH,EAAOqH,WAAW,KAO1B,MAAwBn6B,SAApBnG,KAAKm1B,YAA4Bn1B,KAAKm1B,WAAW7vB,QAAU,GAA/D,CAIA,IAAKH,EAAI,EAAGA,EAAInF,KAAKm1B,WAAW7vB,OAAQH,IAAK,CAC3C,GAAI03B,GAAQ78B,KAAKq3B,2BAA2Br3B,KAAKm1B,WAAWhwB,GAAG8oB,OAC3D6O,EAAS98B,KAAKs3B,4BAA4BuF,EAE9C78B,MAAKm1B,WAAWhwB,GAAG03B,MAAQA,EAC3B78B,KAAKm1B,WAAWhwB,GAAG23B,OAASA,CAG5B,IAAIkH,GAAchkC,KAAKq3B,2BAA2Br3B,KAAKm1B,WAAWhwB,GAAG43B,OACrE/8B,MAAKm1B,WAAWhwB,GAAG8+B,KAAOjkC,KAAKw0B,gBAAkBwP,EAAY1+B,UAAY0+B,EAAYhe,EAIvF,GAAIke,GAAY,SAAUh/B,EAAGa,GAC3B,MAAOA,GAAEk+B,KAAO/+B,EAAE++B,KAIpB,IAFAjkC,KAAKm1B,WAAW3D,KAAK0S,GAEjBlkC,KAAKmuB,QAAUptB,EAAQuzB,MAAM8F,SAC/B,IAAKj1B,EAAI,EAAGA,EAAInF,KAAKm1B,WAAW7vB,OAAQH,IAMtC,GALA8oB,EAAQjuB,KAAKm1B,WAAWhwB,GACxBw7B,EAAQ3gC,KAAKm1B,WAAWhwB,GAAG63B,WAC3Bx1B,EAAQxH,KAAKm1B,WAAWhwB,GAAG83B,SAC3B4G,EAAQ7jC,KAAKm1B,WAAWhwB,GAAG+3B,WAEb/2B,SAAV8nB,GAAiC9nB,SAAVw6B,GAA+Bx6B,SAARqB,GAA+BrB,SAAV09B,EAAqB,CAE1F,GAAI7jC,KAAK40B,gBAAkB50B,KAAK20B,WAAY,CAK1C,GAAIwP,GAAQ/iC,EAAQ+oB,SAAS0Z,EAAMhH,MAAO5O,EAAM4O,OAC5CuH,EAAQhjC,EAAQ+oB,SAAS3iB,EAAIq1B,MAAO8D,EAAM9D,OAC1CwH,EAAejjC,EAAQkjC,aAAaH,EAAOC,GAC3Ch/B,EAAMi/B,EAAa/+B,QAGvBw+B,GAAkBO,EAAare,EAAI,MAGnC8d,IAAiB,CAGfA,IAEFC,GAAQ9V,EAAMA,MAAMjI,EAAI2a,EAAM1S,MAAMjI,EAAIxe,EAAIymB,MAAMjI,EAAI6d,EAAM5V,MAAMjI,GAAK,EACvE9a,EAAoE,KAA/D,GAAK64B,EAAO/jC,KAAK+1B,MAAQ/1B,KAAK62B,MAAM7Q,EAAKhmB,KAAK80B,eACnD3pB,EAAI,EAEAnL,KAAK20B,YACPvpB,EAAIvG,KAAKwG,IAAI,EAAKg5B,EAAatW,EAAI3oB,EAAO,EAAG,GAC7Ck8B,EAAYthC,KAAKghC,SAAS91B,EAAGC,EAAGC,GAChC61B,EAAcK,IAGdl2B,EAAI,EACJk2B,EAAYthC,KAAKghC,SAAS91B,EAAGC,EAAGC,GAChC61B,EAAcjhC,KAAKs2B,aAIrBgL,EAAY,OACZL,EAAcjhC,KAAKs2B,WAErBsK,EAAY,GAEZP,EAAIO,UAAYA,EAChBP,EAAIiB,UAAYA,EAChBjB,EAAIY,YAAcA,EAClBZ,EAAIa,YACJb,EAAIc,OAAOlT,EAAM6O,OAAO/O,EAAGE,EAAM6O,OAAO7c,GACxCogB,EAAIe,OAAOT,EAAM7D,OAAO/O,EAAG4S,EAAM7D,OAAO7c,GACxCogB,EAAIe,OAAOyC,EAAM/G,OAAO/O,EAAG8V,EAAM/G,OAAO7c,GACxCogB,EAAIe,OAAO55B,EAAIs1B,OAAO/O,EAAGvmB,EAAIs1B,OAAO7c,GACpCogB,EAAIkB,YACJlB,EAAI/G,OACJ+G,EAAI9G,cAKR,KAAKp0B,EAAI,EAAGA,EAAInF,KAAKm1B,WAAW7vB,OAAQH,IACtC8oB,EAAQjuB,KAAKm1B,WAAWhwB,GACxBw7B,EAAQ3gC,KAAKm1B,WAAWhwB,GAAG63B,WAC3Bx1B,EAAQxH,KAAKm1B,WAAWhwB,GAAG83B,SAEb92B,SAAV8nB,IAEA2S,EADE5gC,KAAKw0B,gBACK,GAAKvG,EAAM4O,MAAM7W,EAGjB,IAAMhmB,KAAKk1B,IAAIlP,EAAIhmB,KAAKi1B,OAAO6D,iBAIjC3yB,SAAV8nB,GAAiC9nB,SAAVw6B,IAEzBoD,GAAQ9V,EAAMA,MAAMjI,EAAI2a,EAAM1S,MAAMjI,GAAK,EACzC9a,EAAoE,KAA/D,GAAK64B,EAAO/jC,KAAK+1B,MAAQ/1B,KAAK62B,MAAM7Q,EAAKhmB,KAAK80B,eAEnDuL,EAAIO,UAAYA,EAChBP,EAAIY,YAAcjhC,KAAKghC,SAAS91B,EAAG,EAAG,GACtCm1B,EAAIa,YACJb,EAAIc,OAAOlT,EAAM6O,OAAO/O,EAAGE,EAAM6O,OAAO7c,GACxCogB,EAAIe,OAAOT,EAAM7D,OAAO/O,EAAG4S,EAAM7D,OAAO7c,GACxCogB,EAAI9G,UAGQpzB,SAAV8nB,GAA+B9nB,SAARqB,IAEzBu8B,GAAQ9V,EAAMA,MAAMjI,EAAIxe,EAAIymB,MAAMjI,GAAK,EACvC9a,EAAoE,KAA/D,GAAK64B,EAAO/jC,KAAK+1B,MAAQ/1B,KAAK62B,MAAM7Q,EAAKhmB,KAAK80B,eAEnDuL,EAAIO,UAAYA,EAChBP,EAAIY,YAAcjhC,KAAKghC,SAAS91B,EAAG,EAAG,GACtCm1B,EAAIa,YACJb,EAAIc,OAAOlT,EAAM6O,OAAO/O,EAAGE,EAAM6O,OAAO7c,GACxCogB,EAAIe,OAAO55B,EAAIs1B,OAAO/O,EAAGvmB,EAAIs1B,OAAO7c,GACpCogB,EAAI9G,YAWZx4B,EAAQyT,UAAU0rB,eAAiB,WACjC,GAEI/6B,GAFA8zB,EAASj5B,KAAKg5B,MAAMC,OACpBoH,EAAMpH,EAAOqH,WAAW,KAG5B,MAAwBn6B,SAApBnG,KAAKm1B,YAA4Bn1B,KAAKm1B,WAAW7vB,QAAU,GAA/D,CAIA,IAAKH,EAAI,EAAGA,EAAInF,KAAKm1B,WAAW7vB,OAAQH,IAAK,CAC3C,GAAI03B,GAAQ78B,KAAKq3B,2BAA2Br3B,KAAKm1B,WAAWhwB,GAAG8oB,OAC3D6O,EAAS98B,KAAKs3B,4BAA4BuF,EAC9C78B,MAAKm1B,WAAWhwB,GAAG03B,MAAQA,EAC3B78B,KAAKm1B,WAAWhwB,GAAG23B,OAASA,CAG5B,IAAIkH,GAAchkC,KAAKq3B,2BAA2Br3B,KAAKm1B,WAAWhwB,GAAG43B,OACrE/8B,MAAKm1B,WAAWhwB,GAAG8+B,KAAOjkC,KAAKw0B,gBAAkBwP,EAAY1+B,UAAY0+B,EAAYhe,EAIvF,GAAIke,GAAY,SAAUh/B,EAAGa,GAC3B,MAAOA,GAAEk+B,KAAO/+B,EAAE++B,KAEpBjkC,MAAKm1B,WAAW3D,KAAK0S,EAGrB,IAAIxD,GAAmC,IAAzB1gC,KAAKg5B,MAAME,WACzB,KAAK/zB,EAAI,EAAGA,EAAInF,KAAKm1B,WAAW7vB,OAAQH,IAAK,CAC3C,GAAI8oB,GAAQjuB,KAAKm1B,WAAWhwB,EAE5B,IAAInF,KAAKmuB,QAAUptB,EAAQuzB,MAAMyF,QAAS,CAGxC,GAAIvP,GAAOxqB,KAAKk3B,eAAejJ,EAAM8O,OACrCsD,GAAIO,UAAY,EAChBP,EAAIY,YAAcjhC,KAAKu2B,UACvB8J,EAAIa,YACJb,EAAIc,OAAO3W,EAAKuD,EAAGvD,EAAKvK,GACxBogB,EAAIe,OAAOnT,EAAM6O,OAAO/O,EAAGE,EAAM6O,OAAO7c,GACxCogB,EAAI9G,SAIN,GAAIlL,EAEFA,GADEruB,KAAKmuB,QAAUptB,EAAQuzB,MAAM2F,QACxByG,EAAQ,EAAI,EAAEA,GAAWzS,EAAMA,MAAMjnB,MAAQhH,KAAKk2B,WAAal2B,KAAKm2B,SAAWn2B,KAAKk2B,UAGpFwK,CAGT,IAAI6D,EAEFA,GADEvkC,KAAKw0B,gBACEnG,GAAQJ,EAAM4O,MAAM7W,EAGpBqI,IAASruB,KAAKk1B,IAAIlP,EAAIhmB,KAAKi1B,OAAO6D,gBAEhC,EAATyL,IACFA,EAAS,EAGX,IAAIx3B,GAAKtC,EAAOgvB,CACZz5B,MAAKmuB,QAAUptB,EAAQuzB,MAAM0F,UAE/BjtB,EAAqE,KAA9D,GAAKkhB,EAAMA,MAAMjnB,MAAQhH,KAAKk2B,UAAYl2B,KAAK62B,MAAM7vB,OAC5DyD,EAAQzK,KAAKghC,SAASj0B,EAAK,EAAG,GAC9B0sB,EAAcz5B,KAAKghC,SAASj0B,EAAK,EAAG,KAE7B/M,KAAKmuB,QAAUptB,EAAQuzB,MAAM2F,SACpCxvB,EAAQzK,KAAKw2B,SACbiD,EAAcz5B,KAAKy2B,iBAInB1pB,EAA+E,KAAxE,GAAKkhB,EAAMA,MAAMjI,EAAIhmB,KAAK+1B,MAAQ/1B,KAAK62B,MAAM7Q,EAAKhmB,KAAK80B,eAC9DrqB,EAAQzK,KAAKghC,SAASj0B,EAAK,EAAG,GAC9B0sB,EAAcz5B,KAAKghC,SAASj0B,EAAK,EAAG,KAItCszB,EAAIO,UAAY,EAChBP,EAAIY,YAAcxH,EAClB4G,EAAIiB,UAAY72B,EAChB41B,EAAIa,YACJb,EAAImE,IAAIvW,EAAM6O,OAAO/O,EAAGE,EAAM6O,OAAO7c,EAAGskB,EAAQ,EAAW,EAAR1/B,KAAK4/B,IAAM,GAC9DpE,EAAI/G,OACJ+G,EAAI9G,YAQRx4B,EAAQyT,UAAUyrB,eAAiB,WACjC,GAEI96B,GAAGqT,EAAGksB,EAASC,EAFf1L,EAASj5B,KAAKg5B,MAAMC,OACpBoH,EAAMpH,EAAOqH,WAAW,KAG5B,MAAwBn6B,SAApBnG,KAAKm1B,YAA4Bn1B,KAAKm1B,WAAW7vB,QAAU,GAA/D,CAIA,IAAKH,EAAI,EAAGA,EAAInF,KAAKm1B,WAAW7vB,OAAQH,IAAK,CAC3C,GAAI03B,GAAQ78B,KAAKq3B,2BAA2Br3B,KAAKm1B,WAAWhwB,GAAG8oB,OAC3D6O,EAAS98B,KAAKs3B,4BAA4BuF,EAC9C78B,MAAKm1B,WAAWhwB,GAAG03B,MAAQA,EAC3B78B,KAAKm1B,WAAWhwB,GAAG23B,OAASA,CAG5B,IAAIkH,GAAchkC,KAAKq3B,2BAA2Br3B,KAAKm1B,WAAWhwB,GAAG43B,OACrE/8B,MAAKm1B,WAAWhwB,GAAG8+B,KAAOjkC,KAAKw0B,gBAAkBwP,EAAY1+B,UAAY0+B,EAAYhe,EAIvF,GAAIke,GAAY,SAAUh/B,EAAGa,GAC3B,MAAOA,GAAEk+B,KAAO/+B,EAAE++B,KAEpBjkC,MAAKm1B,WAAW3D,KAAK0S,EAGrB,IAAIU,GAAS5kC,KAAKo2B,UAAY,EAC1ByO,EAAS7kC,KAAKq2B,UAAY,CAC9B,KAAKlxB,EAAI,EAAGA,EAAInF,KAAKm1B,WAAW7vB,OAAQH,IAAK,CAC3C,GAGI4H,GAAKtC,EAAOgvB,EAHZxL,EAAQjuB,KAAKm1B,WAAWhwB,EAIxBnF,MAAKmuB,QAAUptB,EAAQuzB,MAAMuF,UAE/B9sB,EAAqE,KAA9D,GAAKkhB,EAAMA,MAAMjnB,MAAQhH,KAAKk2B,UAAYl2B,KAAK62B,MAAM7vB,OAC5DyD,EAAQzK,KAAKghC,SAASj0B,EAAK,EAAG,GAC9B0sB,EAAcz5B,KAAKghC,SAASj0B,EAAK,EAAG,KAE7B/M,KAAKmuB,QAAUptB,EAAQuzB,MAAMwF,SACpCrvB,EAAQzK,KAAKw2B,SACbiD,EAAcz5B,KAAKy2B,iBAInB1pB,EAA+E,KAAxE,GAAKkhB,EAAMA,MAAMjI,EAAIhmB,KAAK+1B,MAAQ/1B,KAAK62B,MAAM7Q,EAAKhmB,KAAK80B,eAC9DrqB,EAAQzK,KAAKghC,SAASj0B,EAAK,EAAG,GAC9B0sB,EAAcz5B,KAAKghC,SAASj0B,EAAK,EAAG,KAIlC/M,KAAKmuB,QAAUptB,EAAQuzB,MAAMwF,UAC/B8K,EAAU5kC,KAAKo2B,UAAY,IAAOnI,EAAMA,MAAMjnB,MAAQhH,KAAKk2B,WAAal2B,KAAKm2B,SAAWn2B,KAAKk2B,UAAY,GAAM,IAC/G2O,EAAU7kC,KAAKq2B,UAAY,IAAOpI,EAAMA,MAAMjnB,MAAQhH,KAAKk2B,WAAal2B,KAAKm2B,SAAWn2B,KAAKk2B,UAAY,GAAM,IAIjH,IAAIvG,GAAK3vB,KACLm3B,EAAUlJ,EAAMA,MAChBzmB,IACDymB,MAAO,GAAI7sB,GAAQ+1B,EAAQpJ,EAAI6W,EAAQzN,EAAQlX,EAAI4kB,EAAQ1N,EAAQnR,KACnEiI,MAAO,GAAI7sB,GAAQ+1B,EAAQpJ,EAAI6W,EAAQzN,EAAQlX,EAAI4kB,EAAQ1N,EAAQnR,KACnEiI,MAAO,GAAI7sB,GAAQ+1B,EAAQpJ,EAAI6W,EAAQzN,EAAQlX,EAAI4kB,EAAQ1N,EAAQnR,KACnEiI,MAAO,GAAI7sB,GAAQ+1B,EAAQpJ,EAAI6W,EAAQzN,EAAQlX,EAAI4kB,EAAQ1N,EAAQnR,KAElE+W,IACD9O,MAAO,GAAI7sB,GAAQ+1B,EAAQpJ,EAAI6W,EAAQzN,EAAQlX,EAAI4kB,EAAQ7kC,KAAK+1B,QAChE9H,MAAO,GAAI7sB,GAAQ+1B,EAAQpJ,EAAI6W,EAAQzN,EAAQlX,EAAI4kB,EAAQ7kC,KAAK+1B,QAChE9H,MAAO,GAAI7sB,GAAQ+1B,EAAQpJ,EAAI6W,EAAQzN,EAAQlX,EAAI4kB,EAAQ7kC,KAAK+1B,QAChE9H,MAAO,GAAI7sB,GAAQ+1B,EAAQpJ,EAAI6W,EAAQzN,EAAQlX,EAAI4kB,EAAQ7kC,KAAK+1B,OAInEvuB,GAAIW,QAAQ,SAAUuhB,GACpBA,EAAIoT,OAASnN,EAAGuH,eAAexN,EAAIuE,SAErC8O,EAAO50B,QAAQ,SAAUuhB,GACvBA,EAAIoT,OAASnN,EAAGuH,eAAexN,EAAIuE,QAIrC,IAAI6W,KACDH,QAASn9B,EAAKu9B,OAAQ3jC,EAAQ4jC,IAAIjI,EAAO,GAAG9O,MAAO8O,EAAO,GAAG9O,SAC7D0W,SAAUn9B,EAAI,GAAIA,EAAI,GAAIu1B,EAAO,GAAIA,EAAO,IAAKgI,OAAQ3jC,EAAQ4jC,IAAIjI,EAAO,GAAG9O,MAAO8O,EAAO,GAAG9O,SAChG0W,SAAUn9B,EAAI,GAAIA,EAAI,GAAIu1B,EAAO,GAAIA,EAAO,IAAKgI,OAAQ3jC,EAAQ4jC,IAAIjI,EAAO,GAAG9O,MAAO8O,EAAO,GAAG9O,SAChG0W,SAAUn9B,EAAI,GAAIA,EAAI,GAAIu1B,EAAO,GAAIA,EAAO,IAAKgI,OAAQ3jC,EAAQ4jC,IAAIjI,EAAO,GAAG9O,MAAO8O,EAAO,GAAG9O,SAChG0W,SAAUn9B,EAAI,GAAIA,EAAI,GAAIu1B,EAAO,GAAIA,EAAO,IAAKgI,OAAQ3jC,EAAQ4jC,IAAIjI,EAAO,GAAG9O,MAAO8O,EAAO,GAAG9O,QAKnG,KAHAA,EAAM6W,SAAWA,EAGZtsB,EAAI,EAAGA,EAAIssB,EAASx/B,OAAQkT,IAAK,CACpCksB,EAAUI,EAAStsB,EACnB,IAAIysB,GAAcjlC,KAAKq3B,2BAA2BqN,EAAQK,OAC1DL,GAAQT,KAAOjkC,KAAKw0B,gBAAkByQ,EAAY3/B,UAAY2/B,EAAYjf,EAwB5E,IAjBA8e,EAAStT,KAAK,SAAUtsB,EAAGa,GACzB,GAAI4iB,GAAO5iB,EAAEk+B,KAAO/+B,EAAE++B,IACtB,OAAItb,GAAaA,EAGbzjB,EAAEy/B,UAAYn9B,EAAY,EAC1BzB,EAAE4+B,UAAYn9B,EAAY,GAGvB,IAIT64B,EAAIO,UAAY,EAChBP,EAAIY,YAAcxH,EAClB4G,EAAIiB,UAAY72B,EAEX+N,EAAI,EAAGA,EAAIssB,EAASx/B,OAAQkT,IAC/BksB,EAAUI,EAAStsB,GACnBmsB,EAAUD,EAAQC,QAClBtE,EAAIa,YACJb,EAAIc,OAAOwD,EAAQ,GAAG7H,OAAO/O,EAAG4W,EAAQ,GAAG7H,OAAO7c,GAClDogB,EAAIe,OAAOuD,EAAQ,GAAG7H,OAAO/O,EAAG4W,EAAQ,GAAG7H,OAAO7c,GAClDogB,EAAIe,OAAOuD,EAAQ,GAAG7H,OAAO/O,EAAG4W,EAAQ,GAAG7H,OAAO7c,GAClDogB,EAAIe,OAAOuD,EAAQ,GAAG7H,OAAO/O,EAAG4W,EAAQ,GAAG7H,OAAO7c,GAClDogB,EAAIe,OAAOuD,EAAQ,GAAG7H,OAAO/O,EAAG4W,EAAQ,GAAG7H,OAAO7c,GAClDogB,EAAI/G,OACJ+G,EAAI9G,YAUVx4B,EAAQyT,UAAUwrB,gBAAkB,WAClC,GAEE/R,GAAO9oB,EAFL8zB,EAASj5B,KAAKg5B,MAAMC,OACtBoH,EAAMpH,EAAOqH,WAAW,KAG1B,MAAwBn6B,SAApBnG,KAAKm1B,YAA4Bn1B,KAAKm1B,WAAW7vB,QAAU,GAA/D,CAIA,IAAKH,EAAI,EAAGA,EAAInF,KAAKm1B,WAAW7vB,OAAQH,IAAK,CAC3C,GAAI03B,GAAQ78B,KAAKq3B,2BAA2Br3B,KAAKm1B,WAAWhwB,GAAG8oB,OAC3D6O,EAAS98B,KAAKs3B,4BAA4BuF,EAE9C78B,MAAKm1B,WAAWhwB,GAAG03B,MAAQA,EAC3B78B,KAAKm1B,WAAWhwB,GAAG23B,OAASA,EAc9B,IAVI98B,KAAKm1B,WAAW7vB,OAAS,IAC3B2oB,EAAQjuB,KAAKm1B,WAAW,GAExBkL,EAAIO,UAAY,EAChBP,EAAIY,YAAc,OAClBZ,EAAIa,YACJb,EAAIc,OAAOlT,EAAM6O,OAAO/O,EAAGE,EAAM6O,OAAO7c,IAIrC9a,EAAI,EAAGA,EAAInF,KAAKm1B,WAAW7vB,OAAQH,IACtC8oB,EAAQjuB,KAAKm1B,WAAWhwB,GACxBk7B,EAAIe,OAAOnT,EAAM6O,OAAO/O,EAAGE,EAAM6O,OAAO7c,EAItCjgB,MAAKm1B,WAAW7vB,OAAS,GAC3B+6B,EAAI9G,WASRx4B,EAAQyT,UAAUmpB,aAAe,SAASv0B,GAWxC,GAVAA,EAAQA,GAAS/B,OAAO+B,MAIpBpJ,KAAKklC,gBACPllC,KAAKmlC,WAAW/7B,GAIlBpJ,KAAKklC,eAAiB97B,EAAMg8B,MAAyB,IAAhBh8B,EAAMg8B,MAAiC,IAAjBh8B,EAAMi8B,OAC5DrlC,KAAKklC,gBAAmBllC,KAAKslC,UAAlC,CAGAtlC,KAAKulC,YAAcC,UAAUp8B,GAC7BpJ,KAAKylC,YAAcC,UAAUt8B,GAE7BpJ,KAAK2lC,WAAa,GAAI1hC,MAAKjE,KAAK8O,OAChC9O,KAAK4lC,SAAW,GAAI3hC,MAAKjE,KAAKqhB,KAC9BrhB,KAAK6lC,iBAAmB7lC,KAAKi1B,OAAOmK,iBAEpCp/B,KAAKg5B,MAAM7K,MAAM2X,OAAS,MAK1B,IAAInW,GAAK3vB,IACTA,MAAK+lC,YAAc,SAAU38B,GAAQumB,EAAGqW,aAAa58B,IACrDpJ,KAAKimC,UAAc,SAAU78B,GAAQumB,EAAGwV,WAAW/7B,IACnDzI,EAAK8H,iBAAiB+kB,SAAU,YAAamC,EAAGoW,aAChDplC,EAAK8H,iBAAiB+kB,SAAU,UAAWmC,EAAGsW,WAC9CtlC,EAAKwI,eAAeC,KAStBrI,EAAQyT,UAAUwxB,aAAe,SAAU58B,GACzCA,EAAQA,GAAS/B,OAAO+B,KAGxB,IAAI88B,GAAQjqB,WAAWupB,UAAUp8B,IAAUpJ,KAAKulC,YAC5CY,EAAQlqB,WAAWypB,UAAUt8B,IAAUpJ,KAAKylC,YAE5CW,EAAgBpmC,KAAK6lC,iBAAiB/G,WAAaoH,EAAQ,IAC3DG,EAAcrmC,KAAK6lC,iBAAiB9G,SAAWoH,EAAQ,IAEvDG,EAAY,EACZC,EAAY1hC,KAAKkzB,IAAIuO,EAAY,IAAM,EAAIzhC,KAAK4/B,GAIhD5/B,MAAK+O,IAAI/O,KAAKkzB,IAAIqO,IAAkBG,IACtCH,EAAgBvhC,KAAK+b,MAAOwlB,EAAgBvhC,KAAK4/B,IAAO5/B,KAAK4/B,GAAK,MAEhE5/B,KAAK+O,IAAI/O,KAAKqzB,IAAIkO,IAAkBG,IACtCH,GAAiBvhC,KAAK+b,MAAOwlB,EAAevhC,KAAK4/B,GAAK,IAAQ,IAAO5/B,KAAK4/B,GAAK,MAI7E5/B,KAAK+O,IAAI/O,KAAKkzB,IAAIsO,IAAgBE,IACpCF,EAAcxhC,KAAK+b,MAAOylB,EAAcxhC,KAAK4/B,IAAO5/B,KAAK4/B,IAEvD5/B,KAAK+O,IAAI/O,KAAKqzB,IAAImO,IAAgBE,IACpCF,GAAexhC,KAAK+b,MAAOylB,EAAaxhC,KAAK4/B,GAAK,IAAQ,IAAO5/B,KAAK4/B,IAGxEzkC,KAAKi1B,OAAO+J,eAAeoH,EAAeC,GAC1CrmC,KAAKm7B,QAGL,IAAIqL,GAAaxmC,KAAKm/B,mBACtBn/B,MAAKymC,KAAK,uBAAwBD,GAElC7lC,EAAKwI,eAAeC,IAStBrI,EAAQyT,UAAU2wB,WAAa,SAAU/7B,GACvCpJ,KAAKg5B,MAAM7K,MAAM2X,OAAS,OAC1B9lC,KAAKklC,gBAAiB,EAGtBvkC,EAAKsI,oBAAoBukB,SAAU,YAAaxtB,KAAK+lC,aACrDplC,EAAKsI,oBAAoBukB,SAAU,UAAaxtB,KAAKimC,WACrDtlC,EAAKwI,eAAeC,IAOtBrI,EAAQyT,UAAUypB,WAAa,SAAU70B,GACvC,GAAIs9B,GAAQ,IACRC,EAASnB,UAAUp8B,GAASzI,EAAKsG,gBAAgBjH,KAAKg5B,OACtD4N,EAASlB,UAAUt8B,GAASzI,EAAK4G,eAAevH,KAAKg5B,MAEzD,IAAKh5B,KAAK60B,YAAV,CASA,GALI70B,KAAK6mC,gBACPC,aAAa9mC,KAAK6mC,gBAIhB7mC,KAAKklC,eAEP,WADAllC,MAAK+mC,cAIP,IAAI/mC,KAAK0/B,SAAW1/B,KAAK0/B,QAAQsH,UAAW,CAE1C,GAAIA,GAAYhnC,KAAKinC,iBAAiBN,EAAQC,EAC1CI,KAAchnC,KAAK0/B,QAAQsH,YAEzBA,EACFhnC,KAAKknC,aAAaF,GAGlBhnC,KAAK+mC,oBAIN,CAEH,GAAIpX,GAAK3vB,IACTA,MAAK6mC,eAAiBM,WAAW,WAC/BxX,EAAGkX,eAAiB,IAGpB,IAAIG,GAAYrX,EAAGsX,iBAAiBN,EAAQC,EACxCI,IACFrX,EAAGuX,aAAaF,IAEjBN,MAOP3lC,EAAQyT,UAAUqpB,cAAgB,SAASz0B,GACzCpJ,KAAKslC,WAAY,CAEjB,IAAI3V,GAAK3vB,IACTA,MAAKonC,YAAc,SAAUh+B,GAAQumB,EAAG0X,aAAaj+B,IACrDpJ,KAAKsnC,WAAc,SAAUl+B,GAAQumB,EAAG4X,YAAYn+B,IACpDzI,EAAK8H,iBAAiB+kB,SAAU,YAAamC,EAAGyX,aAChDzmC,EAAK8H,iBAAiB+kB,SAAU,WAAYmC,EAAG2X,YAE/CtnC,KAAK29B,aAAav0B,IAMpBrI,EAAQyT,UAAU6yB,aAAe,SAASj+B,GACxCpJ,KAAKgmC,aAAa58B,IAMpBrI,EAAQyT,UAAU+yB,YAAc,SAASn+B,GACvCpJ,KAAKslC,WAAY,EAEjB3kC,EAAKsI,oBAAoBukB,SAAU,YAAaxtB,KAAKonC,aACrDzmC,EAAKsI,oBAAoBukB,SAAU,WAAcxtB,KAAKsnC,YAEtDtnC,KAAKmlC,WAAW/7B,IASlBrI,EAAQyT,UAAUupB,SAAW,SAAS30B,GAC/BA,IACHA,EAAQ/B,OAAO+B,MAGjB,IAAIo+B,GAAQ,CAYZ,IAXIp+B,EAAMq+B,WACRD,EAAQp+B,EAAMq+B,WAAW,IAChBr+B,EAAMs+B,SAGfF,GAASp+B,EAAMs+B,OAAO,GAMpBF,EAAO,CACT,GAAIG,GAAY3nC,KAAKi1B,OAAO6D,eACxB8O,EAAYD,GAAa,EAAIH,EAAQ,GAEzCxnC,MAAKi1B,OAAOiK,aAAa0I,GACzB5nC,KAAKm7B,SAELn7B,KAAK+mC,eAIP,GAAIP,GAAaxmC,KAAKm/B,mBACtBn/B,MAAKymC,KAAK,uBAAwBD,GAKlC7lC,EAAKwI,eAAeC,IAUtBrI,EAAQyT,UAAUqzB,gBAAkB,SAAU5Z,EAAO6Z,GAKnD,QAASj0B,GAAMka,GACb,MAAOA,GAAI,EAAI,EAAQ,EAAJA,EAAQ,GAAK,EALlC,GAAI7oB,GAAI4iC,EAAS,GACf/hC,EAAI+hC,EAAS,GACbrnC,EAAIqnC,EAAS,GAMX/b,EAAKlY,GAAM9N,EAAEgoB,EAAI7oB,EAAE6oB,IAAME,EAAMhO,EAAI/a,EAAE+a,IAAMla,EAAEka,EAAI/a,EAAE+a,IAAMgO,EAAMF,EAAI7oB,EAAE6oB,IACrEga,EAAKl0B,GAAMpT,EAAEstB,EAAIhoB,EAAEgoB,IAAME,EAAMhO,EAAIla,EAAEka,IAAMxf,EAAEwf,EAAIla,EAAEka,IAAMgO,EAAMF,EAAIhoB,EAAEgoB,IACrEia,EAAKn0B,GAAM3O,EAAE6oB,EAAIttB,EAAEstB,IAAME,EAAMhO,EAAIxf,EAAEwf,IAAM/a,EAAE+a,EAAIxf,EAAEwf,IAAMgO,EAAMF,EAAIttB,EAAEstB,GAGzE,SAAc,GAANhC,GAAiB,GAANgc,GAAWhc,GAAMgc,GAC3B,GAANA,GAAiB,GAANC,GAAWD,GAAMC,GACtB,GAANjc,GAAiB,GAANic,GAAWjc,GAAMic,IAUjCjnC,EAAQyT,UAAUyyB,iBAAmB,SAAUlZ,EAAG9N,GAChD,GAAI9a,GACF8iC,EAAU,IACVjB,EAAY,KACZkB,EAAmB,KACnBC,EAAc,KACdpD,EAAS,GAAI5jC,GAAQ4sB,EAAG9N,EAE1B,IAAIjgB,KAAKmuB,QAAUptB,EAAQuzB,MAAMsF,KAC/B55B,KAAKmuB,QAAUptB,EAAQuzB,MAAMuF,UAC7B75B,KAAKmuB,QAAUptB,EAAQuzB,MAAMwF,QAE7B,IAAK30B,EAAInF,KAAKm1B,WAAW7vB,OAAS,EAAGH,GAAK,EAAGA,IAAK,CAChD6hC,EAAYhnC,KAAKm1B,WAAWhwB,EAC5B,IAAI2/B,GAAYkC,EAAUlC,QAC1B,IAAIA,EACF,IAAK,GAAI35B,GAAI25B,EAASx/B,OAAS,EAAG6F,GAAK,EAAGA,IAAK,CAE7C,GAAIu5B,GAAUI,EAAS35B,GACnBw5B,EAAUD,EAAQC,QAClByD,GAAazD,EAAQ,GAAG7H,OAAQ6H,EAAQ,GAAG7H,OAAQ6H,EAAQ,GAAG7H,QAC9DuL,GAAa1D,EAAQ,GAAG7H,OAAQ6H,EAAQ,GAAG7H,OAAQ6H,EAAQ,GAAG7H,OAClE,IAAI98B,KAAK6nC,gBAAgB9C,EAAQqD,IAC/BpoC,KAAK6nC,gBAAgB9C,EAAQsD,GAE7B,MAAOrB,QAQf,KAAK7hC,EAAI,EAAGA,EAAInF,KAAKm1B,WAAW7vB,OAAQH,IAAK,CAC3C6hC,EAAYhnC,KAAKm1B,WAAWhwB,EAC5B,IAAI8oB,GAAQ+Y,EAAUlK,MACtB,IAAI7O,EAAO,CACT,GAAIqa,GAAQzjC,KAAK+O,IAAIma,EAAIE,EAAMF,GAC3Bwa,EAAQ1jC,KAAK+O,IAAIqM,EAAIgO,EAAMhO,GAC3BgkB,EAAQp/B,KAAK2jC,KAAKF,EAAQA,EAAQC,EAAQA,IAEzB,OAAhBJ,GAA+BA,EAAPlE,IAA8BgE,EAAPhE,IAClDkE,EAAclE,EACdiE,EAAmBlB,IAO3B,MAAOkB,IAQTnnC,EAAQyT,UAAU0yB,aAAe,SAAUF,GACzC,GAAIyB,GAASC,EAAMC,CAEd3oC,MAAK0/B,SAiCR+I,EAAUzoC,KAAK0/B,QAAQkJ,IAAIH,QAC3BC,EAAQ1oC,KAAK0/B,QAAQkJ,IAAIF,KACzBC,EAAQ3oC,KAAK0/B,QAAQkJ,IAAID,MAlCzBF,EAAUjb,SAASK,cAAc,OACjC4a,EAAQta,MAAMkP,SAAW,WACzBoL,EAAQta,MAAMqP,QAAU,OACxBiL,EAAQta,MAAMxiB,OAAS,oBACvB88B,EAAQta,MAAM1jB,MAAQ,UACtBg+B,EAAQta,MAAMziB,WAAa,wBAC3B+8B,EAAQta,MAAM0a,aAAe,MAC7BJ,EAAQta,MAAM2a,UAAY,qCAE1BJ,EAAOlb,SAASK,cAAc,OAC9B6a,EAAKva,MAAMkP,SAAW,WACtBqL,EAAKva,MAAMK,OAAS,OACpBka,EAAKva,MAAMI,MAAQ,IACnBma,EAAKva,MAAM4a,WAAa,oBAExBJ,EAAMnb,SAASK,cAAc,OAC7B8a,EAAIxa,MAAMkP,SAAW,WACrBsL,EAAIxa,MAAMK,OAAS,IACnBma,EAAIxa,MAAMI,MAAQ,IAClBoa,EAAIxa,MAAMxiB,OAAS,oBACnBg9B,EAAIxa,MAAM0a,aAAe,MAEzB7oC,KAAK0/B,SACHsH,UAAW,KACX4B,KACEH,QAASA,EACTC,KAAMA,EACNC,IAAKA,KAUX3oC,KAAK+mC,eAEL/mC,KAAK0/B,QAAQsH,UAAYA,EAEvByB,EAAQhL,UADsB,kBAArBz9B,MAAK60B,YACM70B,KAAK60B,YAAYmS,EAAU/Y,OAG3B,6BACM+Y,EAAU/Y,MAAMF,EAAI,gCACpBiZ,EAAU/Y,MAAMhO,EAAI,gCACpB+mB,EAAU/Y,MAAMjI,EAAI,qBAIhDyiB,EAAQta,MAAM/mB,KAAQ,IACtBqhC,EAAQta,MAAM3mB,IAAQ,IACtBxH,KAAKg5B,MAAMtL,YAAY+a,GACvBzoC,KAAKg5B,MAAMtL,YAAYgb,GACvB1oC,KAAKg5B,MAAMtL,YAAYib,EAGvB,IAAIK,GAAgBP,EAAQQ,YACxBC,EAAkBT,EAAQU,aAC1BC,EAAgBV,EAAKS,aACrBE,EAAcV,EAAIM,YAClBK,EAAgBX,EAAIQ,aAEpB/hC,EAAO4/B,EAAUlK,OAAO/O,EAAIib,EAAe,CAC/C5hC,GAAOvC,KAAKwG,IAAIxG,KAAKiI,IAAI1F,EAAM,IAAKpH,KAAKg5B,MAAME,YAAc,GAAK8P,GAElEN,EAAKva,MAAM/mB,KAAS4/B,EAAUlK,OAAO/O,EAAI,KACzC2a,EAAKva,MAAM3mB,IAAUw/B,EAAUlK,OAAO7c,EAAImpB,EAAc,KACxDX,EAAQta,MAAM/mB,KAAQA,EAAO,KAC7BqhC,EAAQta,MAAM3mB,IAASw/B,EAAUlK,OAAO7c,EAAImpB,EAAaF,EAAiB,KAC1EP,EAAIxa,MAAM/mB,KAAW4/B,EAAUlK,OAAO/O,EAAIsb,EAAW,EAAK,KAC1DV,EAAIxa,MAAM3mB,IAAWw/B,EAAUlK,OAAO7c,EAAIqpB,EAAY,EAAK,MAO7DvoC,EAAQyT,UAAUuyB,aAAe,WAC/B,GAAI/mC,KAAK0/B,QAAS,CAChB1/B,KAAK0/B,QAAQsH,UAAY,IAEzB,KAAK,GAAIxhC,KAAQxF,MAAK0/B,QAAQkJ,IAC5B,GAAI5oC,KAAK0/B,QAAQkJ,IAAInjC,eAAeD,GAAO,CACzC,GAAI0B,GAAOlH,KAAK0/B,QAAQkJ,IAAIpjC,EACxB0B,IAAQA,EAAKwC,YACfxC,EAAKwC,WAAW0jB,YAAYlmB,MAetCs+B,UAAY,SAASp8B,GACnB,MAAI,WAAaA,GAAcA,EAAMmgC,QAC9BngC,EAAMogC,cAAc,IAAMpgC,EAAMogC,cAAc,GAAGD,SAAW,GAQrE7D,UAAY,SAASt8B,GACnB,MAAI,WAAaA,GAAcA,EAAMqgC,QAC9BrgC,EAAMogC,cAAc,IAAMpgC,EAAMogC,cAAc,GAAGC,SAAW,GAGrE5pC,EAAOD,QAAUmB,GAKb,SAASlB,GAeb,QAAS82B,GAAQjN,GACf,MAAIA,GAAYggB,EAAMhgB,GAAtB,OAWF,QAASggB,GAAMhgB,GACb,IAAK,GAAIlhB,KAAOmuB,GAAQniB,UACtBkV,EAAIlhB,GAAOmuB,EAAQniB,UAAUhM,EAE/B,OAAOkhB,GAxBT7pB,EAAOD,QAAU+2B,EAoCjBA,EAAQniB,UAAUua,GAClB4H,EAAQniB,UAAU/L,iBAAmB,SAASW,EAAOkH,GAInD,MAHAtQ,MAAK2pC,WAAa3pC,KAAK2pC,gBACtB3pC,KAAK2pC,WAAWvgC,GAASpJ,KAAK2pC,WAAWvgC,QACvCtB,KAAKwI,GACDtQ,MAaT22B,EAAQniB,UAAUo1B,KAAO,SAASxgC,EAAOkH,GAIvC,QAASye,KACP8a,EAAK3a,IAAI9lB,EAAO2lB,GAChBze,EAAGK,MAAM3Q,KAAMqF,WALjB,GAAIwkC,GAAO7pC,IAUX,OATAA,MAAK2pC,WAAa3pC,KAAK2pC,eAOvB5a,EAAGze,GAAKA,EACRtQ,KAAK+uB,GAAG3lB,EAAO2lB,GACR/uB,MAaT22B,EAAQniB,UAAU0a,IAClByH,EAAQniB,UAAUs1B,eAClBnT,EAAQniB,UAAUu1B,mBAClBpT,EAAQniB,UAAUvL,oBAAsB,SAASG,EAAOkH,GAItD,GAHAtQ,KAAK2pC,WAAa3pC,KAAK2pC,eAGnB,GAAKtkC,UAAUC,OAEjB,MADAtF,MAAK2pC,cACE3pC,IAIT,IAAIgqC,GAAYhqC,KAAK2pC,WAAWvgC,EAChC,KAAK4gC,EAAW,MAAOhqC,KAGvB,IAAI,GAAKqF,UAAUC,OAEjB,aADOtF,MAAK2pC,WAAWvgC,GAChBpJ,IAKT,KAAK,GADDiqC,GACK9kC,EAAI,EAAGA,EAAI6kC,EAAU1kC,OAAQH,IAEpC,GADA8kC,EAAKD,EAAU7kC,GACX8kC,IAAO35B,GAAM25B,EAAG35B,KAAOA,EAAI,CAC7B05B,EAAU9hC,OAAO/C,EAAG,EACpB,OAGJ,MAAOnF,OAWT22B,EAAQniB,UAAUiyB,KAAO,SAASr9B,GAChCpJ,KAAK2pC,WAAa3pC,KAAK2pC,cACvB,IAAI9oB,MAAUhI,MAAMtY,KAAK8E,UAAW,GAChC2kC,EAAYhqC,KAAK2pC,WAAWvgC,EAEhC,IAAI4gC,EAAW,CACbA,EAAYA,EAAUnxB,MAAM,EAC5B,KAAK,GAAI1T,GAAI,EAAGC,EAAM4kC,EAAU1kC,OAAYF,EAAJD,IAAWA,EACjD6kC,EAAU7kC,GAAGwL,MAAM3Q,KAAM6gB,GAI7B,MAAO7gB,OAWT22B,EAAQniB,UAAU01B,UAAY,SAAS9gC,GAErC,MADApJ,MAAK2pC,WAAa3pC,KAAK2pC,eAChB3pC,KAAK2pC,WAAWvgC,QAWzButB,EAAQniB,UAAU21B,aAAe,SAAS/gC,GACxC,QAAUpJ,KAAKkqC,UAAU9gC,GAAO9D,SAM9B,SAASzF,GAQb,QAASuB,GAAQ2sB,EAAG9N,EAAG+F,GACrBhmB,KAAK+tB,EAAU5nB,SAAN4nB,EAAkBA,EAAI,EAC/B/tB,KAAKigB,EAAU9Z,SAAN8Z,EAAkBA,EAAI,EAC/BjgB,KAAKgmB,EAAU7f,SAAN6f,EAAkBA,EAAI,EASjC5kB,EAAQ+oB,SAAW,SAASjlB,EAAGa,GAC7B,GAAIqkC,GAAM,GAAIhpC,EAId,OAHAgpC,GAAIrc,EAAI7oB,EAAE6oB,EAAIhoB,EAAEgoB,EAChBqc,EAAInqB,EAAI/a,EAAE+a,EAAIla,EAAEka,EAChBmqB,EAAIpkB,EAAI9gB,EAAE8gB,EAAIjgB,EAAEigB,EACTokB,GASThpC,EAAQmgB,IAAM,SAASrc,EAAGa,GACxB,GAAIskC,GAAM,GAAIjpC,EAId,OAHAipC,GAAItc,EAAI7oB,EAAE6oB,EAAIhoB,EAAEgoB,EAChBsc,EAAIpqB,EAAI/a,EAAE+a,EAAIla,EAAEka,EAChBoqB,EAAIrkB,EAAI9gB,EAAE8gB,EAAIjgB,EAAEigB,EACTqkB,GASTjpC,EAAQ4jC,IAAM,SAAS9/B,EAAGa,GACxB,MAAO,IAAI3E,IACF8D,EAAE6oB,EAAIhoB,EAAEgoB,GAAK,GACb7oB,EAAE+a,EAAIla,EAAEka,GAAK,GACb/a,EAAE8gB,EAAIjgB,EAAEigB,GAAK,IAWxB5kB,EAAQkjC,aAAe,SAASp/B,EAAGa,GACjC,GAAIs+B,GAAe,GAAIjjC,EAMvB,OAJAijC,GAAatW,EAAI7oB,EAAE+a,EAAIla,EAAEigB,EAAI9gB,EAAE8gB,EAAIjgB,EAAEka,EACrCokB,EAAapkB,EAAI/a,EAAE8gB,EAAIjgB,EAAEgoB,EAAI7oB,EAAE6oB,EAAIhoB,EAAEigB,EACrCqe,EAAare,EAAI9gB,EAAE6oB,EAAIhoB,EAAEka,EAAI/a,EAAE+a,EAAIla,EAAEgoB,EAE9BsW,GAQTjjC,EAAQoT,UAAUlP,OAAS,WACzB,MAAOT,MAAK2jC,KACJxoC,KAAK+tB,EAAI/tB,KAAK+tB,EACd/tB,KAAKigB,EAAIjgB,KAAKigB,EACdjgB,KAAKgmB,EAAIhmB,KAAKgmB,IAIxBnmB,EAAOD,QAAUwB,GAKb,SAASvB,GAObsB,QAAU,SAAU4sB,EAAG9N,GACrBjgB,KAAK+tB,EAAU5nB,SAAN4nB,EAAkBA,EAAI,EAC/B/tB,KAAKigB,EAAU9Z,SAAN8Z,EAAkBA,EAAI,GAGjCpgB,EAAOD,QAAUuB,SAKb,SAAStB,EAAQD,EAASM,GAE9B,GAAIkB,GAAUlB,EAAoB,GAYlCe,QAAS,WACPjB,KAAKsqC,YAAc,GAAIlpC,GACvBpB,KAAKuqC,eACLvqC,KAAKuqC,YAAYzL,WAAa,EAC9B9+B,KAAKuqC,YAAYxL,SAAW,EAC5B/+B,KAAKwqC,UAAY,IAEjBxqC,KAAKyqC,eAAiB,GAAIrpC,GAC1BpB,KAAK0qC,eAAkB,GAAItpC,GAAQ,GAAIyD,KAAK4/B,GAAI,EAAG,GAEnDzkC,KAAK2qC,8BASP1pC,OAAOuT,UAAUyiB,eAAiB,SAASlJ,EAAG9N,EAAG+F,GAC/ChmB,KAAKsqC,YAAYvc,EAAIA,EACrB/tB,KAAKsqC,YAAYrqB,EAAIA,EACrBjgB,KAAKsqC,YAAYtkB,EAAIA,EAErBhmB,KAAK2qC,8BAWP1pC,OAAOuT,UAAUwqB,eAAiB,SAASF,EAAYC,GAClC54B,SAAf24B,IACF9+B,KAAKuqC,YAAYzL,WAAaA,GAGf34B,SAAb44B,IACF/+B,KAAKuqC,YAAYxL,SAAWA,EACxB/+B,KAAKuqC,YAAYxL,SAAW,IAAG/+B,KAAKuqC,YAAYxL,SAAW,GAC3D/+B,KAAKuqC,YAAYxL,SAAW,GAAIl6B,KAAK4/B,KAAIzkC,KAAKuqC,YAAYxL,SAAW,GAAIl6B,KAAK4/B,MAGjEt+B,SAAf24B,GAAyC34B,SAAb44B,IAC9B/+B,KAAK2qC,8BAQT1pC,OAAOuT,UAAU4qB,eAAiB,WAChC,GAAIwL,KAIJ,OAHAA,GAAI9L,WAAa9+B,KAAKuqC,YAAYzL,WAClC8L,EAAI7L,SAAW/+B,KAAKuqC,YAAYxL,SAEzB6L,GAOT3pC,OAAOuT,UAAU0qB,aAAe,SAAS55B,GACxBa,SAAXb,IAGJtF,KAAKwqC,UAAYllC,EAKbtF,KAAKwqC,UAAY,MAAMxqC,KAAKwqC,UAAY,KACxCxqC,KAAKwqC,UAAY,IAAKxqC,KAAKwqC,UAAY,GAE3CxqC,KAAK2qC,+BAOP1pC,OAAOuT,UAAUskB,aAAe,WAC9B,MAAO94B,MAAKwqC,WAOdvpC,OAAOuT,UAAUmjB,kBAAoB,WACnC,MAAO33B,MAAKyqC,gBAOdxpC,OAAOuT,UAAUwjB,kBAAoB,WACnC,MAAOh4B,MAAK0qC,gBAOdzpC,OAAOuT,UAAUm2B,2BAA6B,WAE5C3qC,KAAKyqC,eAAe1c,EAAI/tB,KAAKsqC,YAAYvc,EAAI/tB,KAAKwqC,UAAY3lC,KAAKkzB,IAAI/3B,KAAKuqC,YAAYzL,YAAcj6B,KAAKqzB,IAAIl4B,KAAKuqC,YAAYxL,UAChI/+B,KAAKyqC,eAAexqB,EAAIjgB,KAAKsqC,YAAYrqB,EAAIjgB,KAAKwqC,UAAY3lC,KAAKqzB,IAAIl4B,KAAKuqC,YAAYzL,YAAcj6B,KAAKqzB,IAAIl4B,KAAKuqC,YAAYxL,UAChI/+B,KAAKyqC,eAAezkB,EAAIhmB,KAAKsqC,YAAYtkB,EAAIhmB,KAAKwqC,UAAY3lC,KAAKkzB,IAAI/3B,KAAKuqC,YAAYxL,UAGxF/+B,KAAK0qC,eAAe3c,EAAIlpB,KAAK4/B,GAAG,EAAIzkC,KAAKuqC,YAAYxL,SACrD/+B,KAAK0qC,eAAezqB,EAAI,EACxBjgB,KAAK0qC,eAAe1kB,GAAKhmB,KAAKuqC,YAAYzL,YAG5Cj/B,EAAOD,QAAUqB,QAIb,SAASpB,EAAQD,EAASM,GAW9B,QAASgB,GAAQ0qB,EAAM6O,EAAQoQ,GAC7B7qC,KAAK4rB,KAAOA,EACZ5rB,KAAKy6B,OAASA,EACdz6B,KAAK6qC,MAAQA,EAEb7qC,KAAKiI,MAAQ9B,OACbnG,KAAKgH,MAAQb,OAGbnG,KAAKmY,OAAS0yB,EAAMnQ,kBAAkB9O,EAAKlT,MAAO1Y,KAAKy6B,QAGvDz6B,KAAKmY,OAAOqZ,KAAK,SAAUtsB,EAAGa,GAC5B,MAAOb,GAAIa,EAAI,EAAQA,EAAJb,EAAQ,GAAK,IAG9BlF,KAAKmY,OAAO7S,OAAS,GACvBtF,KAAKoiC,YAAY,GAInBpiC,KAAKm1B,cAELn1B,KAAKM,QAAS,EACdN,KAAK8qC,eAAiB3kC,OAElB0kC,EAAM7V,kBACRh1B,KAAKM,QAAS,EACdN,KAAK+qC,oBAGL/qC,KAAKM,QAAS,EAxClB,GAAIQ,GAAWZ,EAAoB,EAiDnCgB,GAAOsT,UAAUw2B,SAAW,WAC1B,MAAOhrC,MAAKM,QAQdY,EAAOsT,UAAUy2B,kBAAoB,WAInC,IAHA,GAAI7lC,GAAMpF,KAAKmY,OAAO7S,OAElBH,EAAI,EACDnF,KAAKm1B,WAAWhwB,IACrBA,GAGF,OAAON,MAAK+b,MAAMzb,EAAIC,EAAM,MAQ9BlE,EAAOsT,UAAU+tB,SAAW,WAC1B,MAAOviC,MAAK6qC,MAAMzW,aAQpBlzB,EAAOsT,UAAU02B,UAAY,WAC3B,MAAOlrC,MAAKy6B,QAOdv5B,EAAOsT,UAAUguB,iBAAmB,WAClC,MAAmBr8B,UAAfnG,KAAKiI,MACA9B,OAEFnG,KAAKmY,OAAOnY,KAAKiI,QAO1B/G,EAAOsT,UAAU22B,UAAY,WAC3B,MAAOnrC,MAAKmY,QAQdjX,EAAOsT,UAAU6b,SAAW,SAASpoB,GACnC,GAAIA,GAASjI,KAAKmY,OAAO7S,OACvB,KAAM,2BAER,OAAOtF,MAAKmY,OAAOlQ,IASrB/G,EAAOsT,UAAUgoB,eAAiB,SAASv0B,GAIzC,GAHc9B,SAAV8B,IACFA,EAAQjI,KAAKiI,OAED9B,SAAV8B,EACF,QAEF,IAAIktB,EACJ,IAAIn1B,KAAKm1B,WAAWltB,GAClBktB,EAAan1B,KAAKm1B,WAAWltB,OAE1B,CACH,GAAIoE,KACJA,GAAEouB,OAASz6B,KAAKy6B,OAChBpuB,EAAErF,MAAQhH,KAAKmY,OAAOlQ,EAEtB,IAAImjC,GAAW,GAAItqC,GAASd,KAAK4rB,MAAMuD,OAAQ,SAAUe,GAAO,MAAQA,GAAK7jB,EAAEouB,SAAWpuB,EAAErF,SAAW0R,KACvGyc,GAAan1B,KAAK6qC,MAAMrO,eAAe4O,GAEvCprC,KAAKm1B,WAAWltB,GAASktB,EAG3B,MAAOA,IAQTj0B,EAAOsT,UAAU0mB,kBAAoB,SAAS9yB,GAC5CpI,KAAK8qC,eAAiB1iC,GASxBlH,EAAOsT,UAAU4tB,YAAc,SAASn6B,GACtC,GAAIA,GAASjI,KAAKmY,OAAO7S,OACvB,KAAM,2BAERtF,MAAKiI,MAAQA,EACbjI,KAAKgH,MAAQhH,KAAKmY,OAAOlQ,IAO3B/G,EAAOsT,UAAUu2B,iBAAmB,SAAS9iC,GAC7B9B,SAAV8B,IACFA,EAAQ,EAEV,IAAI+wB,GAAQh5B,KAAK6qC,MAAM7R,KAEvB,IAAI/wB,EAAQjI,KAAKmY,OAAO7S,OAAQ,CAC9B,CAAqBtF,KAAKw8B,eAAev0B,GAIlB9B,SAAnB6yB,EAAMqS,WACRrS,EAAMqS,SAAW7d,SAASK,cAAc,OACxCmL,EAAMqS,SAASld,MAAMkP,SAAW,WAChCrE,EAAMqS,SAASld,MAAM1jB,MAAQ,OAC7BuuB,EAAMtL,YAAYsL,EAAMqS,UAE1B,IAAIA,GAAWrrC,KAAKirC,mBACpBjS,GAAMqS,SAAS5N,UAAY,wBAA0B4N,EAAW,IAEhErS,EAAMqS,SAASld,MAAM4O,OAAS,OAC9B/D,EAAMqS,SAASld,MAAM/mB,KAAO,MAE5B,IAAIuoB,GAAK3vB,IACTmnC,YAAW,WAAYxX,EAAGob,iBAAiB9iC,EAAM,IAAM,IACvDjI,KAAKM,QAAS,MAGdN,MAAKM,QAAS,EAGS6F,SAAnB6yB,EAAMqS,WACRrS,EAAM5L,YAAY4L,EAAMqS,UACxBrS,EAAMqS,SAAWllC,QAGfnG,KAAK8qC,gBACP9qC,KAAK8qC,kBAIXjrC,EAAOD,QAAUsB,GAKb,SAASrB,EAAQD,EAASM,GAa9B,QAASmB,GAAOsyB,EAAW7lB,GACzB,GAAkB3H,SAAdwtB,EACF,KAAM,qCAKR,IAHA3zB,KAAK2zB,UAAYA,EACjB3zB,KAAK+hC,QAAWj0B,GAA8B3H,QAAnB2H,EAAQi0B,QAAwBj0B,EAAQi0B,SAAU,EAEzE/hC,KAAK+hC,QAAS,CAChB/hC,KAAKg5B,MAAQxL,SAASK,cAAc,OAEpC7tB,KAAKg5B,MAAM7K,MAAMI,MAAQ,OACzBvuB,KAAKg5B,MAAM7K,MAAMkP,SAAW,WAC5Br9B,KAAK2zB,UAAUjG,YAAY1tB,KAAKg5B,OAEhCh5B,KAAKg5B,MAAMsS,KAAO9d,SAASK,cAAc,SACzC7tB,KAAKg5B,MAAMsS,KAAK7kC,KAAO,SACvBzG,KAAKg5B,MAAMsS,KAAKtkC,MAAQ,OACxBhH,KAAKg5B,MAAMtL,YAAY1tB,KAAKg5B,MAAMsS,MAElCtrC,KAAKg5B,MAAMwF,KAAOhR,SAASK,cAAc,SACzC7tB,KAAKg5B,MAAMwF,KAAK/3B,KAAO,SACvBzG,KAAKg5B,MAAMwF,KAAKx3B,MAAQ,OACxBhH,KAAKg5B,MAAMtL,YAAY1tB,KAAKg5B,MAAMwF,MAElCx+B,KAAKg5B,MAAMvgB,KAAO+U,SAASK,cAAc,SACzC7tB,KAAKg5B,MAAMvgB,KAAKhS,KAAO,SACvBzG,KAAKg5B,MAAMvgB,KAAKzR,MAAQ,OACxBhH,KAAKg5B,MAAMtL,YAAY1tB,KAAKg5B,MAAMvgB,MAElCzY,KAAKg5B,MAAMuS,IAAM/d,SAASK,cAAc,SACxC7tB,KAAKg5B,MAAMuS,IAAI9kC,KAAO,SACtBzG,KAAKg5B,MAAMuS,IAAIpd,MAAMkP,SAAW,WAChCr9B,KAAKg5B,MAAMuS,IAAIpd,MAAMxiB,OAAS,gBAC9B3L,KAAKg5B,MAAMuS,IAAIpd,MAAMI,MAAQ,QAC7BvuB,KAAKg5B,MAAMuS,IAAIpd,MAAMK,OAAS,MAC9BxuB,KAAKg5B,MAAMuS,IAAIpd,MAAM0a,aAAe,MACpC7oC,KAAKg5B,MAAMuS,IAAIpd,MAAMqd,gBAAkB,MACvCxrC,KAAKg5B,MAAMuS,IAAIpd,MAAMxiB,OAAS,oBAC9B3L,KAAKg5B,MAAMuS,IAAIpd,MAAMkL,gBAAkB,UACvCr5B,KAAKg5B,MAAMtL,YAAY1tB,KAAKg5B,MAAMuS,KAElCvrC,KAAKg5B,MAAMyS,MAAQje,SAASK,cAAc,SAC1C7tB,KAAKg5B,MAAMyS,MAAMhlC,KAAO,SACxBzG,KAAKg5B,MAAMyS,MAAMtd,MAAM2F,OAAS,MAChC9zB,KAAKg5B,MAAMyS,MAAMzkC,MAAQ,IACzBhH,KAAKg5B,MAAMyS,MAAMtd,MAAMkP,SAAW,WAClCr9B,KAAKg5B,MAAMyS,MAAMtd,MAAM/mB,KAAO,SAC9BpH,KAAKg5B,MAAMtL,YAAY1tB,KAAKg5B,MAAMyS,MAGlC,IAAI9b,GAAK3vB,IACTA,MAAKg5B,MAAMyS,MAAM/N,YAAc,SAAUt0B,GAAQumB,EAAGgO,aAAav0B,IACjEpJ,KAAKg5B,MAAMsS,KAAKI,QAAU,SAAUtiC,GAAQumB,EAAG2b,KAAKliC,IACpDpJ,KAAKg5B,MAAMwF,KAAKkN,QAAU,SAAUtiC,GAAQumB,EAAGgc,WAAWviC,IAC1DpJ,KAAKg5B,MAAMvgB,KAAKizB,QAAU,SAAUtiC,GAAQumB,EAAGlX,KAAKrP,IAGtDpJ,KAAK4rC,iBAAmBzlC,OAExBnG,KAAKmY,UACLnY,KAAKiI,MAAQ9B,OAEbnG,KAAK6rC,YAAc1lC,OACnBnG,KAAK8rC,aAAe,IACpB9rC,KAAK+rC,UAAW,EA3ElB,GAAIprC,GAAOT,EAAoB,EAiF/BmB,GAAOmT,UAAU82B,KAAO,WACtB,GAAIrjC,GAAQjI,KAAKmiC,UACbl6B,GAAQ,IACVA,IACAjI,KAAKgsC,SAAS/jC,KAOlB5G,EAAOmT,UAAUiE,KAAO,WACtB,GAAIxQ,GAAQjI,KAAKmiC,UACbl6B,GAAQjI,KAAKmY,OAAO7S,OAAS,IAC/B2C,IACAjI,KAAKgsC,SAAS/jC,KAOlB5G,EAAOmT,UAAUy3B,SAAW,WAC1B,GAAIn9B,GAAQ,GAAI7K,MAEZgE,EAAQjI,KAAKmiC,UACbl6B,GAAQjI,KAAKmY,OAAO7S,OAAS,GAC/B2C,IACAjI,KAAKgsC,SAAS/jC,IAEPjI,KAAK+rC,WAEZ9jC,EAAQ,EACRjI,KAAKgsC,SAAS/jC,GAGhB,IAAIoZ,GAAM,GAAIpd,MACV0kB,EAAQtH,EAAMvS,EAIdo9B,EAAWrnC,KAAKiI,IAAI9M,KAAK8rC,aAAenjB,EAAM,GAG9CgH,EAAK3vB,IACTA,MAAK6rC,YAAc1E,WAAW,WAAYxX,EAAGsc,YAAcC,IAM7D7qC,EAAOmT,UAAUm3B,WAAa,WACHxlC,SAArBnG,KAAK6rC,YACP7rC,KAAKw+B,OAELx+B,KAAK0+B,QAOTr9B,EAAOmT,UAAUgqB,KAAO,WAElBx+B,KAAK6rC,cAET7rC,KAAKisC,WAEDjsC,KAAKg5B,QACPh5B,KAAKg5B,MAAMwF,KAAKx3B,MAAQ,UAO5B3F,EAAOmT,UAAUkqB,KAAO,WACtByN,cAAcnsC,KAAK6rC,aACnB7rC,KAAK6rC,YAAc1lC,OAEfnG,KAAKg5B,QACPh5B,KAAKg5B,MAAMwF,KAAKx3B,MAAQ,SAQ5B3F,EAAOmT,UAAU6tB,oBAAsB,SAASj6B,GAC9CpI,KAAK4rC,iBAAmBxjC,GAO1B/G,EAAOmT,UAAUytB,gBAAkB,SAASiK,GAC1ClsC,KAAK8rC,aAAeI,GAOtB7qC,EAAOmT,UAAU43B,gBAAkB,WACjC,MAAOpsC,MAAK8rC,cASdzqC,EAAOmT,UAAU63B,YAAc,SAASC,GACtCtsC,KAAK+rC,SAAWO,GAOlBjrC,EAAOmT,UAAU+3B,SAAW,WACIpmC,SAA1BnG,KAAK4rC,kBACP5rC,KAAK4rC,oBAOTvqC,EAAOmT,UAAU2mB,OAAS,WACxB,GAAIn7B,KAAKg5B,MAAO,CAEdh5B,KAAKg5B,MAAMuS,IAAIpd,MAAM3mB,IAAOxH,KAAKg5B,MAAMqF,aAAa,EAChDr+B,KAAKg5B,MAAMuS,IAAIpC,aAAa,EAAK,KACrCnpC,KAAKg5B,MAAMuS,IAAIpd,MAAMI,MAASvuB,KAAKg5B,MAAME,YACrCl5B,KAAKg5B,MAAMsS,KAAKpS,YAChBl5B,KAAKg5B,MAAMwF,KAAKtF,YAChBl5B,KAAKg5B,MAAMvgB,KAAKygB,YAAc,GAAO,IAGzC;GAAI9xB,GAAOpH,KAAKwsC,YAAYxsC,KAAKiI,MACjCjI,MAAKg5B,MAAMyS,MAAMtd,MAAM/mB,KAAO,EAAS,OAS3C/F,EAAOmT,UAAUwtB,UAAY,SAAS7pB,GACpCnY,KAAKmY,OAASA,EAEVnY,KAAKmY,OAAO7S,OAAS,EACvBtF,KAAKgsC,SAAS,GAEdhsC,KAAKiI,MAAQ9B,QAOjB9E,EAAOmT,UAAUw3B,SAAW,SAAS/jC,GACnC,KAAIA,EAAQjI,KAAKmY,OAAO7S,QAOtB,KAAM,2BANNtF,MAAKiI,MAAQA,EAEbjI,KAAKm7B,SACLn7B,KAAKusC,YAWTlrC,EAAOmT,UAAU2tB,SAAW,WAC1B,MAAOniC,MAAKiI,OAQd5G,EAAOmT,UAAUkE,IAAM,WACrB,MAAO1Y,MAAKmY,OAAOnY,KAAKiI,QAI1B5G,EAAOmT,UAAUmpB,aAAe,SAASv0B,GAEvC,GAAI87B,GAAiB97B,EAAMg8B,MAAyB,IAAhBh8B,EAAMg8B,MAAiC,IAAjBh8B,EAAMi8B,MAChE,IAAKH,EAAL,CAEAllC,KAAKysC,aAAerjC,EAAMmgC,QAC1BvpC,KAAK0sC,YAAczwB,WAAWjc,KAAKg5B,MAAMyS,MAAMtd,MAAM/mB,MAErDpH,KAAKg5B,MAAM7K,MAAM2X,OAAS,MAK1B,IAAInW,GAAK3vB,IACTA,MAAK+lC,YAAc,SAAU38B,GAAQumB,EAAGqW,aAAa58B,IACrDpJ,KAAKimC,UAAc,SAAU78B,GAAQumB,EAAGwV,WAAW/7B,IACnDzI,EAAK8H,iBAAiB+kB,SAAU,YAAaxtB,KAAK+lC,aAClDplC,EAAK8H,iBAAiB+kB,SAAU,UAAaxtB,KAAKimC,WAClDtlC,EAAKwI,eAAeC,KAItB/H,EAAOmT,UAAUm4B,YAAc,SAAUvlC,GACvC,GAAImnB,GAAQtS,WAAWjc,KAAKg5B,MAAMuS,IAAIpd,MAAMI,OACxCvuB,KAAKg5B,MAAMyS,MAAMvS,YAAc,GAC/BnL,EAAI3mB,EAAO,EAEXa,EAAQpD,KAAK+b,MAAMmN,EAAIQ,GAASvuB,KAAKmY,OAAO7S,OAAO,GAIvD,OAHY,GAAR2C,IAAWA,EAAQ,GACnBA,EAAQjI,KAAKmY,OAAO7S,OAAO,IAAG2C,EAAQjI,KAAKmY,OAAO7S,OAAO,GAEtD2C,GAGT5G,EAAOmT,UAAUg4B,YAAc,SAAUvkC,GACvC,GAAIsmB,GAAQtS,WAAWjc,KAAKg5B,MAAMuS,IAAIpd,MAAMI,OACxCvuB,KAAKg5B,MAAMyS,MAAMvS,YAAc,GAE/BnL,EAAI9lB,GAASjI,KAAKmY,OAAO7S,OAAO,GAAKipB,EACrCnnB,EAAO2mB,EAAI,CAEf,OAAO3mB,IAKT/F,EAAOmT,UAAUwxB,aAAe,SAAU58B,GACxC,GAAIuf,GAAOvf,EAAMmgC,QAAUvpC,KAAKysC,aAC5B1e,EAAI/tB,KAAK0sC,YAAc/jB,EAEvB1gB,EAAQjI,KAAK2sC,YAAY5e,EAE7B/tB,MAAKgsC,SAAS/jC,GAEdtH,EAAKwI,kBAIP9H,EAAOmT,UAAU2wB,WAAa,WAC5BnlC,KAAKg5B,MAAM7K,MAAM2X,OAAS,OAG1BnlC,EAAKsI,oBAAoBukB,SAAU,YAAaxtB,KAAK+lC,aACrDplC,EAAKsI,oBAAoBukB,SAAU,UAAWxtB,KAAKimC,WAEnDtlC,EAAKwI,kBAGPtJ,EAAOD,QAAUyB,GAKb,SAASxB,GA2Bb,QAASyB,GAAWwN,EAAOuS,EAAKogB,EAAMiB,GAEpC1iC,KAAK4sC,OAAS,EACd5sC,KAAK6sC,KAAO,EACZ7sC,KAAK8sC,MAAQ,EACb9sC,KAAK0iC,YAAa,EAClB1iC,KAAK+sC,UAAY,EAEjB/sC,KAAKgtC,SAAW,EAChBhtC,KAAKitC,SAASn+B,EAAOuS,EAAKogB,EAAMiB,GAYlCphC,EAAWkT,UAAUy4B,SAAW,SAASn+B,EAAOuS,EAAKogB,EAAMiB,GACzD1iC,KAAK4sC,OAAS99B,EAAQA,EAAQ,EAC9B9O,KAAK6sC,KAAOxrB,EAAMA,EAAM,EAExBrhB,KAAKktC,QAAQzL,EAAMiB,IASrBphC,EAAWkT,UAAU04B,QAAU,SAASzL,EAAMiB,GAC/Bv8B,SAATs7B,GAA8B,GAARA,IAGPt7B,SAAfu8B,IACF1iC,KAAK0iC,WAAaA,GAGlB1iC,KAAK8sC,MADH9sC,KAAK0iC,cAAe,EACTphC,EAAW6rC,oBAAoB1L,GAE/BA,IAUjBngC,EAAW6rC,oBAAsB,SAAU1L,GACzC,GAAI2L,GAAQ,SAAUrf,GAAI,MAAOlpB,MAAKmK,IAAI+e,GAAKlpB,KAAKwoC,MAGhDC,EAAQzoC,KAAK0oC,IAAI,GAAI1oC,KAAK+b,MAAMwsB,EAAM3L,KACtC+L,EAAQ,EAAI3oC,KAAK0oC,IAAI,GAAI1oC,KAAK+b,MAAMwsB,EAAM3L,EAAO,KACjDgM,EAAQ,EAAI5oC,KAAK0oC,IAAI,GAAI1oC,KAAK+b,MAAMwsB,EAAM3L,EAAO,KAGjDiB,EAAa4K,CASjB,OARIzoC,MAAK+O,IAAI45B,EAAQ/L,IAAS58B,KAAK+O,IAAI8uB,EAAajB,KAAOiB,EAAa8K,GACpE3oC,KAAK+O,IAAI65B,EAAQhM,IAAS58B,KAAK+O,IAAI8uB,EAAajB,KAAOiB,EAAa+K,GAGtD,GAAd/K,IACFA,EAAa,GAGRA,GAOTphC,EAAWkT,UAAUktB,WAAa,WAChC,MAAOzlB,YAAWjc,KAAKgtC,SAASU,YAAY1tC,KAAK+sC,aAOnDzrC,EAAWkT,UAAUm5B,QAAU,WAC7B,MAAO3tC,MAAK8sC,OAOdxrC,EAAWkT,UAAU1F,MAAQ,WAC3B9O,KAAKgtC,SAAWhtC,KAAK4sC,OAAS5sC,KAAK4sC,OAAS5sC,KAAK8sC,OAMnDxrC,EAAWkT,UAAUiE,KAAO,WAC1BzY,KAAKgtC,UAAYhtC,KAAK8sC,OAOxBxrC,EAAWkT,UAAU6M,IAAM,WACzB,MAAQrhB,MAAKgtC,SAAWhtC,KAAK6sC,MAG/BhtC,EAAOD,QAAU0B,GAKb,SAASzB,EAAQD,EAASM,GAsB9B,QAASqB,GAAUoyB,EAAW5xB,EAAO+L,GACnC,KAAM9N,eAAgBuB,IACpB,KAAM,IAAIqyB,aAAY,mDAGxB,IAAIjE,GAAK3vB,IACTA,MAAK4tC,gBACH9+B,MAAO,KACPuS,IAAO,KAEPwsB,YAAY,EAEZC,YAAa,SACbvf,MAAO,KACPC,OAAQ,KACRuf,UAAW,KACXC,UAAW,MAEbhuC,KAAK8N,QAAUnN,EAAKyF,cAAepG,KAAK4tC,gBAGxC5tC,KAAKiuC,QAAQta,GAGb3zB,KAAK8B,cAEL9B,KAAKkuC,MACHtF,IAAK5oC,KAAK4oC,IACVuF,SAAUnuC,KAAK2F,MACfyoC,SACErf,GAAI/uB,KAAK+uB,GAAGsf,KAAKruC,MACjBkvB,IAAKlvB,KAAKkvB,IAAImf,KAAKruC,MACnBymC,KAAMzmC,KAAKymC,KAAK4H,KAAKruC,OAEvBW,MACE2tC,KAAM,KACNC,SAAU5e,EAAG6e,UAAUH,KAAK1e,GAC5B8e,eAAgB9e,EAAG+e,gBAAgBL,KAAK1e,GACxCgf,OAAQhf,EAAGif,QAAQP,KAAK1e,GACxBkf,aAAelf,EAAGmf,cAAcT,KAAK1e,KAKzC3vB,KAAKkO,MAAQ,GAAIvM,GAAM3B,KAAKkuC,MAC5BluC,KAAK8B,WAAWgG,KAAK9H,KAAKkO,OAC1BlO,KAAKkuC,KAAKhgC,MAAQlO,KAAKkO,MAGvBlO,KAAK+uC,SAAW,GAAIlsC,GAAS7C,KAAKkuC,MAClCluC,KAAK8B,WAAWgG,KAAK9H,KAAK+uC,UAC1B/uC,KAAKkuC,KAAKvtC,KAAK2tC,KAAOtuC,KAAK+uC,SAAST,KAAKD,KAAKruC,KAAK+uC,UAGnD/uC,KAAKgvC,YAAc,GAAI3sC,GAAYrC,KAAKkuC,MACxCluC,KAAK8B,WAAWgG,KAAK9H,KAAKgvC,aAI1BhvC,KAAKivC,WAAa,GAAI3sC,GAAWtC,KAAKkuC,MACtCluC,KAAK8B,WAAWgG,KAAK9H,KAAKivC,YAG1BjvC,KAAKkvC,QAAU,GAAIxsC,GAAQ1C,KAAKkuC,MAChCluC,KAAK8B,WAAWgG,KAAK9H,KAAKkvC,SAE1BlvC,KAAKmvC,UAAY,KACjBnvC,KAAKovC,WAAa,KAGdthC,GACF9N,KAAK02B,WAAW5oB,GAId/L,EACF/B,KAAKqvC,SAASttC,GAGd/B,KAAKm7B,SAnGT,GAEIx6B,IAFUT,EAAoB,IACrBA,EAAoB,IACtBA,EAAoB,IAC3BW,EAAUX,EAAoB,GAC9BY,EAAWZ,EAAoB,GAC/ByB,EAAQzB,EAAoB,IAC5BovC,EAAOpvC,EAAoB,IAC3B2C,EAAW3C,EAAoB,IAC/BmC,EAAcnC,EAAoB,IAClCoC,EAAapC,EAAoB,IACjCwC,EAAUxC,EAAoB,GA8FlCqB,GAASiT,UAAY,GAAI86B,GAMzB/tC,EAASiT,UAAU66B,SAAW,SAASttC,GACrC,GAGIwtC,GAHAC,EAAiC,MAAlBxvC,KAAKmvC,SAwBxB,IAhBEI,EAJGxtC,EAGIA,YAAiBlB,IAAWkB,YAAiBjB,GACvCiB,EAIA,GAAIlB,GAAQkB,GACvB0E,MACEqI,MAAO,OACPuS,IAAK,UAVI,KAgBfrhB,KAAKmvC,UAAYI,EACjBvvC,KAAKkvC,SAAWlvC,KAAKkvC,QAAQG,SAASE,GAElCC,IAAgB,SAAWxvC,MAAK8N,SAAW,OAAS9N,MAAK8N,SAAU,CACrE9N,KAAKyvC,KAEL,IAAI3gC,GAAS,SAAW9O,MAAK8N,QAAWnN,EAAK6F,QAAQxG,KAAK8N,QAAQgB,MAAO,QAAU,KAC/EuS,EAAS,OAASrhB,MAAK8N,QAAanN,EAAK6F,QAAQxG,KAAK8N,QAAQuT,IAAK,QAAU,IAEjFrhB,MAAK0vC,UAAU5gC,EAAOuS,KAQ1B9f,EAASiT,UAAUm7B,UAAY,SAASC,GAEtC,GAAIL,EAKFA,GAJGK,EAGIA,YAAkB/uC,IAAW+uC,YAAkB9uC,GACzC8uC,EAIA,GAAI/uC,GAAQ+uC,GAPZ,KAUf5vC,KAAKovC,WAAaG,EAClBvvC,KAAKkvC,QAAQS,UAAUJ,IAazBhuC,EAASiT,UAAUq7B,aAAe,SAASnf,EAAK5iB,GAC9C9N,KAAKkvC,SAAWlvC,KAAKkvC,QAAQW,aAAanf,GAEtC5iB,GAAWA,EAAQgiC,OACrB9vC,KAAK8vC,MAAMpf,IAQfnvB,EAASiT,UAAUu7B,aAAe,WAChC,MAAO/vC,MAAKkvC,SAAWlvC,KAAKkvC,QAAQa,oBAQtCxuC,EAASiT,UAAUs7B,MAAQ,SAASzvC,GAClC,GAAKL,KAAKmvC,WAAmBhpC,QAAN9F,EAAvB,CAEA,GAAIqwB,GAAM9qB,MAAMC,QAAQxF,GAAMA,GAAMA,GAGhC8uC,EAAYnvC,KAAKmvC,UAAU9d,aAAa3Y,IAAIgY,GAC9CjqB,MACEqI,MAAO,OACPuS,IAAK,UAKLvS,EAAQ,KACRuS,EAAM,IACV8tB,GAAUhnC,QAAQ,SAAU6nC,GAC1B,GAAI7kC,GAAI6kC,EAASlhC,MAAMnI,UACnByF,EAAI,OAAS4jC,GAAWA,EAAS3uB,IAAI1a,UAAYqpC,EAASlhC,MAAMnI,WAEtD,OAAVmI,GAAsBA,EAAJ3D,KACpB2D,EAAQ3D,IAGE,OAARkW,GAAgBjV,EAAIiV,KACtBA,EAAMjV,IAKV,IAAI6jC,IAAUnhC,EAAQuS,GAAO,EACzB6qB,EAAWrnC,KAAKiI,IAAK9M,KAAKkO,MAAMmT,IAAMrhB,KAAKkO,MAAMY,MAAwB,KAAfuS,EAAMvS,GAEpE9O,MAAKkO,MAAM++B,SAASgD,EAAS/D,EAAW,EAAG+D,EAAS/D,EAAW,KASjE3qC,EAASiT,UAAU07B,aAAe,WAEhC,GAAIC,GAAUnwC,KAAKmvC,UAAU9d,aAC3BhmB,EAAM,KACNyB,EAAM,IAER,IAAIqjC,EAAS,CAEX,GAAIC,GAAUD,EAAQ9kC,IAAI,QAC1BA,GAAM+kC,EAAUzvC,EAAK6F,QAAQ4pC,EAAQthC,MAAO,QAAQnI,UAAY,IAKhE,IAAI0pC,GAAeF,EAAQrjC,IAAI,QAC3BujC,KACFvjC,EAAMnM,EAAK6F,QAAQ6pC,EAAavhC,MAAO,QAAQnI,UAEjD,IAAI2pC,GAAaH,EAAQrjC,IAAI,MACzBwjC,KAEAxjC,EADS,MAAPA,EACInM,EAAK6F,QAAQ8pC,EAAWjvB,IAAK,QAAQ1a,UAGrC9B,KAAKiI,IAAIA,EAAKnM,EAAK6F,QAAQ8pC,EAAWjvB,IAAK,QAAQ1a,YAK/D,OACE0E,IAAa,MAAPA,EAAe,GAAIpH,MAAKoH,GAAO,KACrCyB,IAAa,MAAPA,EAAe,GAAI7I,MAAK6I,GAAO,OAKzCjN,EAAOD,QAAU2B,GAKb,SAAS1B,EAAQD,EAASM,GAK5BL,EAAOD,QADa,mBAAXyH,QACQA,OAAe,QAAKnH,EAAoB,IAGxC,WACf,KAAMsD,OAAM,+DAOZ,SAAS3D,EAAQD,EAASM,GAE9B,GAAIoP,IAMJ,SAAUjI,EAAQlB,GAChB,YA2OF,SAASoqC,KACFC,EAAOC,QAKVC,EAAMC,sBAGNC,EAAMC,KAAKL,EAAOM,SAAU,SAASC,GACjCC,EAAUC,SAASF,KAIvBL,EAAMQ,QAAQV,EAAOW,SAAUC,EAAYJ,EAAUK,QACrDX,EAAMQ,QAAQV,EAAOW,SAAUG,EAAWN,EAAUK,QAGpDb,EAAOC,OAAQ,GAxOnB,GAAID,GAAS,QAASA,GAAO9nC,EAASoF,GAClC,MAAO,IAAI0iC,GAAOe,SAAS7oC,EAASoF,OAUxC0iC,GAAO3tB,QAAU,QAgBjB2tB,EAAOgB,UAOHC,UAQIC,WAAY,OASZC,YAAa,QAUbC,aAAc,OAQdC,eAAgB,OAShBC,SAAU,OAaVC,kBAAmB,kBAU3BvB,EAAOW,SAAW3jB,SAOlBgjB,EAAOwB,kBAAoBlpC,UAAUmpC,gBAAkBnpC,UAAUopC,iBAOjE1B,EAAO2B,gBAAmB,gBAAkB9qC,GAO5CmpC,EAAO4B,UAAY,6CAA6C/kC,KAAKvE,UAAUC,WAO/EynC,EAAO6B,eAAkB7B,EAAO2B,iBAAmB3B,EAAO4B,WAAc5B,EAAOwB,kBAQ/ExB,EAAO8B,mBAAqB,EAU5B,IAAIC,MASAC,EAAiBhC,EAAOgC,eAAiB,OACzCC,EAAiBjC,EAAOiC,eAAiB,OACzCC,EAAelC,EAAOkC,aAAe,KACrCC,EAAkBnC,EAAOmC,gBAAkB,QAS3CC,EAAgBpC,EAAOoC,cAAgB,QACvCC,EAAgBrC,EAAOqC,cAAgB,QACvCC,EAActC,EAAOsC,YAAc,MASnCC,EAAcvC,EAAOuC,YAAc,QACnC3B,EAAaZ,EAAOY,WAAa,OACjCE,EAAYd,EAAOc,UAAY,MAC/B0B,EAAgBxC,EAAOwC,cAAgB,UACvCC,EAAczC,EAAOyC,YAAc,OASvCzC,GAAOC,OAAQ,EAOfD,EAAO0C,QAAU1C,EAAO0C,YAQxB1C,EAAOM,SAAWN,EAAOM,YAkCzB,IAAIF,GAAQJ,EAAO2C,OAUfluC,OAAQ,SAAgBmuC,EAAMC,EAAKC,GAC/B,IAAI,GAAI9qC,KAAO6qC,IACPA,EAAI5tC,eAAe+C,IAAS4qC,EAAK5qC,KAASrC,GAAamtC,IAG3DF,EAAK5qC,GAAO6qC,EAAI7qC,GAEpB,OAAO4qC,IAUXrkB,GAAI,SAAYrmB,EAASjC,EAAM8sC,GAC3B7qC,EAAQD,iBAAiBhC,EAAM8sC,GAAS,IAU5CrkB,IAAK,SAAaxmB,EAASjC,EAAM8sC,GAC7B7qC,EAAQO,oBAAoBxC,EAAM8sC,GAAS,IAa/C1C,KAAM,SAAcnnB,EAAK8pB,EAAUC,GAC/B,GAAItuC,GAAGC,CAGP,IAAG,WAAaskB,GACZA,EAAIvhB,QAAQqrC,EAAUC,OAEnB,IAAG/pB,EAAIpkB,SAAWa,GACrB,IAAIhB,EAAI,EAAGC,EAAMskB,EAAIpkB,OAAYF,EAAJD,EAASA,IAClC,GAAGquC,EAASjzC,KAAKkzC,EAAS/pB,EAAIvkB,GAAIA,EAAGukB,MAAS,EAC1C,WAKR,KAAIvkB,IAAKukB,GACL,GAAGA,EAAIjkB,eAAeN,IAClBquC,EAASjzC,KAAKkzC,EAAS/pB,EAAIvkB,GAAIA,EAAGukB,MAAS,EAC3C,QAahBgqB,MAAO,SAAeL,EAAKM,GACvB,MAAON,GAAI/sC,QAAQqtC,GAAQ,IAU/BC,QAAS,SAAiBP,EAAKM,GAC3B,GAAGN,EAAI/sC,QAAS,CACZ,GAAI2B,GAAQorC,EAAI/sC,QAAQqtC,EACxB,OAAkB,KAAV1rC,GAAgB,EAAQA,EAEhC,IAAI,GAAI9C,GAAI,EAAGC,EAAMiuC,EAAI/tC,OAAYF,EAAJD,EAASA,IACtC,GAAGkuC,EAAIluC,KAAOwuC,EACV,MAAOxuC,EAGf,QAAO,GAUfkD,QAAS,SAAiBqhB,GACtB,MAAO9jB,OAAM4O,UAAUqE,MAAMtY,KAAKmpB,EAAK,IAU3CmqB,UAAW,SAAmBC,EAAMC,GAChC,KAAMD,GAAM,CACR,GAAGA,GAAQC,EACP,OAAO,CAEXD,GAAOA,EAAKpqC,WAEhB,OAAO,GASXsqC,UAAW,SAAmBC,GAC1B,GAAIC,MACAC,KACA5K,KACAE,KACAp+B,EAAMxG,KAAKwG,IACXyB,EAAMjI,KAAKiI,GAGf,OAAsB,KAAnBmnC,EAAQ3uC,QAEH4uC,MAAOD,EAAQ,GAAGC,MAClBC,MAAOF,EAAQ,GAAGE,MAClB5K,QAAS0K,EAAQ,GAAG1K,QACpBE,QAASwK,EAAQ,GAAGxK,UAI5BmH,EAAMC,KAAKoD,EAAS,SAASG,GACzBF,EAAMpsC,KAAKssC,EAAMF,OACjBC,EAAMrsC,KAAKssC,EAAMD,OACjB5K,EAAQzhC,KAAKssC,EAAM7K,SACnBE,EAAQ3hC,KAAKssC,EAAM3K,YAInByK,OAAQ7oC,EAAIsF,MAAM9L,KAAMqvC,GAASpnC,EAAI6D,MAAM9L,KAAMqvC,IAAU,EAC3DC,OAAQ9oC,EAAIsF,MAAM9L,KAAMsvC,GAASrnC,EAAI6D,MAAM9L,KAAMsvC,IAAU,EAC3D5K,SAAUl+B,EAAIsF,MAAM9L,KAAM0kC,GAAWz8B,EAAI6D,MAAM9L,KAAM0kC,IAAY,EACjEE,SAAUp+B,EAAIsF,MAAM9L,KAAM4kC,GAAW38B,EAAI6D,MAAM9L,KAAM4kC,IAAY,KAYzE4K,YAAa,SAAqBC,EAAWC,EAAQC,GACjD,OACIzmB,EAAGlpB,KAAK+O,IAAI2gC,EAASD,IAAc,EACnCr0B,EAAGpb,KAAK+O,IAAI4gC,EAASF,IAAc,IAW3CG,SAAU,SAAkBC,EAAQC,GAChC,GAAI5mB,GAAI4mB,EAAOpL,QAAUmL,EAAOnL,QAC5BtpB,EAAI00B,EAAOlL,QAAUiL,EAAOjL,OAEhC,OAA0B,KAAnB5kC,KAAK+vC,MAAM30B,EAAG8N,GAAWlpB,KAAK4/B,IAUzCoQ,aAAc,SAAsBH,EAAQC,GACxC,GAAI5mB,GAAIlpB,KAAK+O,IAAI8gC,EAAOnL,QAAUoL,EAAOpL,SACrCtpB,EAAIpb,KAAK+O,IAAI8gC,EAAOjL,QAAUkL,EAAOlL,QAEzC,OAAG1b,IAAK9N,EACGy0B,EAAOnL,QAAUoL,EAAOpL,QAAU,EAAIkJ,EAAiBE,EAE3D+B,EAAOjL,QAAUkL,EAAOlL,QAAU,EAAIiJ,EAAeF,GAUhEsC,YAAa,SAAqBJ,EAAQC,GACtC,GAAI5mB,GAAI4mB,EAAOpL,QAAUmL,EAAOnL,QAC5BtpB,EAAI00B,EAAOlL,QAAUiL,EAAOjL,OAEhC,OAAO5kC,MAAK2jC,KAAMza,EAAIA,EAAM9N,EAAIA,IAWpC80B,SAAU,SAAkBjmC,EAAOuS,GAE/B,MAAGvS,GAAMxJ,QAAU,GAAK+b,EAAI/b,QAAU,EAC3BtF,KAAK80C,YAAYzzB,EAAI,GAAIA,EAAI,IAAMrhB,KAAK80C,YAAYhmC,EAAM,GAAIA,EAAM,IAExE,GAUXkmC,YAAa,SAAqBlmC,EAAOuS,GAErC,MAAGvS,GAAMxJ,QAAU,GAAK+b,EAAI/b,QAAU,EAC3BtF,KAAKy0C,SAASpzB,EAAI,GAAIA,EAAI,IAAMrhB,KAAKy0C,SAAS3lC,EAAM,GAAIA,EAAM,IAElE,GASXmmC,WAAY,SAAoBC,GAC5B,MAAOA,IAAaxC,GAAgBwC,GAAa1C,GAWrD2C,eAAgB,SAAwBzsC,EAASlD,EAAMwB,EAAOouC,GAC1D,GAAIC,IAAY,GAAI,SAAU,MAAO,IAAK,KAC1C7vC,GAAOorC,EAAM0E,YAAY9vC,EAEzB,KAAI,GAAIL,GAAI,EAAGA,EAAIkwC,EAAS/vC,OAAQH,IAAK,CACrC,GAAIzE,GAAI8E,CAOR,IALG6vC,EAASlwC,KACRzE,EAAI20C,EAASlwC,GAAKzE,EAAEmY,MAAM,EAAG,GAAG5M,cAAgBvL,EAAEmY,MAAM,IAIzDnY,IAAKgI,GAAQylB,MAAO,CACnBzlB,EAAQylB,MAAMztB,IAAgB,MAAV00C,GAAkBA,IAAWpuC,GAAS,EAC1D,UAeZuuC,eAAgB,SAAwB7sC,EAAS/C,EAAOyvC,GACpD,GAAIzvC,GAAU+C,GAAYA,EAAQylB,MAAlC,CAKAyiB,EAAMC,KAAKlrC,EAAO,SAASqB,EAAOxB,GAC9BorC,EAAMuE,eAAezsC,EAASlD,EAAMwB,EAAOouC,IAG/C,IAAII,GAAUJ,GAAU,WACpB,OAAO,EAIY,SAApBzvC,EAAM+rC,aACLhpC,EAAQ+sC,cAAgBD,GAGP,QAAlB7vC,EAAMmsC,WACLppC,EAAQgtC,YAAcF,KAU9BF,YAAa,SAAqBK,GAC9B,MAAOA,GAAI3pC,QAAQ,eAAgB,SAASb,GACxC,MAAOA,GAAE,GAAGc,kBAapBykC,EAAQF,EAAOpnC,OAQfwsC,oBAAoB,EAQpBC,SAAS,EAQTC,cAAc,EAWd/mB,GAAI,SAAYrmB,EAASjC,EAAM8sC,EAASwC,GACpC,GAAIzjB,GAAQ7rB,EAAKoB,MAAM,IACvB+oC,GAAMC,KAAKve,EAAO,SAAS7rB,GACvBmqC,EAAM7hB,GAAGrmB,EAASjC,EAAM8sC,GACxBwC,GAAQA,EAAKtvC,MAarByoB,IAAK,SAAaxmB,EAASjC,EAAM8sC,EAASwC,GACtC,GAAIzjB,GAAQ7rB,EAAKoB,MAAM,IACvB+oC,GAAMC,KAAKve,EAAO,SAAS7rB,GACvBmqC,EAAM1hB,IAAIxmB,EAASjC,EAAM8sC,GACzBwC,GAAQA,EAAKtvC,MAarByqC,QAAS,SAAiBxoC,EAASstC,EAAWzC,GAC1C,GAAI1J,GAAO7pC,KAEPi2C,EAAiB,SAAwBC,GACzC,GAGIC,GAHAC,EAAUF,EAAGzvC,KAAK0O,cAClBkhC,EAAY7F,EAAOwB,kBACnBsE,EAAU1F,EAAM8C,MAAM0C,EAAS,QAKhCE,IAAWzM,EAAK+L,qBAITU,GAAWN,GAAajD,GAA6B,IAAdmD,EAAG7Q,QAChDwE,EAAK+L,oBAAqB,EAC1B/L,EAAKiM,cAAe,GACdO,GAAaL,GAAajD,EAChClJ,EAAKiM,aAA+B,IAAfI,EAAGK,SAAiBC,EAAaC,UAAU5D,EAAeqD,GAExEI,GAAWN,GAAajD,IAC/BlJ,EAAK+L,oBAAqB,EAC1B/L,EAAKiM,cAAe,GAIrBO,GAAaL,GAAa1E,GACzBkF,EAAaE,cAAcV,EAAWE,GAIvCrM,EAAKiM,eACJK,EAActM,EAAK8M,SAASp2C,KAAKspC,EAAMqM,EAAIF,EAAWttC,EAAS6qC,IAKhE4C,GAAe7E,IACdzH,EAAK+L,oBAAqB,EAC1B/L,EAAKiM,cAAe,EACpBU,EAAaI,SAIdP,GAAaL,GAAa1E,GACzBkF,EAAaE,cAAcV,EAAWE,IAK9C,OADAl2C,MAAK+uB,GAAGrmB,EAAS6pC,EAAYyD,GAAYC,GAClCA,GAaXU,SAAU,SAAkBT,EAAIF,EAAWttC,EAAS6qC,GAChD,GAAIsD,GAAY72C,KAAK82C,aAAaZ,EAAIF,GAClCe,EAAkBF,EAAUvxC,OAC5B6wC,EAAcH,EACdgB,EAAgBH,EAAUI,QAC1BC,EAAgBH,CAGjBf,IAAajD,EACZiE,EAAgB/D,EAEV+C,GAAa1E,IACnB0F,EAAgBhE,EAGhBkE,EAAgBL,EAAUvxC,QAAW4wC,EAAiB,eAAIA,EAAGiB,eAAe7xC,OAAS,IAMtF4xC,EAAgB,GAAKl3C,KAAK61C,UACzBM,EAAc/E,GAIlBpxC,KAAK61C,SAAU,CAGf,IAAIuB,GAASp3C,KAAKq3C,iBAAiB3uC,EAASytC,EAAaU,EAAWX,EA4BpE,OAxBGF,IAAa1E,GACZiC,EAAQhzC,KAAKywC,EAAWoG,GAIzBJ,IACCI,EAAOF,cAAgBA,EACvBE,EAAOpB,UAAYgB,EAEnBzD,EAAQhzC,KAAKywC,EAAWoG,GAExBA,EAAOpB,UAAYG,QACZiB,GAAOF,eAIff,GAAe7E,IACdiC,EAAQhzC,KAAKywC,EAAWoG,GAIxBp3C,KAAK61C,SAAU,GAGZM,GAUXxF,oBAAqB,WACjB,GAAIre,EAgCJ,OA7BQA,GAFLke,EAAOwB,kBACH3qC,EAAOmvC,cAEF,cACA,cACA,+CAIA,gBACA,gBACA,oDAGFhG,EAAO6B,gBAET,aACA,YACA,yBAIA,uBACA,sBACA,gCAIRE,EAAYQ,GAAezgB,EAAM,GACjCigB,EAAYnB,GAAc9e,EAAM,GAChCigB,EAAYjB,GAAahf,EAAM,GACxBigB,GAUXuE,aAAc,SAAsBZ,EAAIF,GAEpC,GAAGxF,EAAOwB,kBACN,MAAOwE,GAAaM,cAIxB,IAAGZ,EAAGjC,QAAS,CACX,GAAG+B,GAAa5E,EACZ,MAAO8E,GAAGjC,OAGd,IAAIqD,MACA9nB,KAAYA,OAAOohB,EAAMvoC,QAAQ6tC,EAAGjC,SAAUrD,EAAMvoC,QAAQ6tC,EAAGiB,iBAC/DN,IASJ,OAPAjG,GAAMC,KAAKrhB,EAAQ,SAAS4kB,GACrBxD,EAAMgD,QAAQ0D,EAAalD,EAAMmD,eAAgB,GAChDV,EAAU/uC,KAAKssC,GAEnBkD,EAAYxvC,KAAKssC,EAAMmD,cAGpBV,EAKX,MADAX,GAAGqB,WAAa,GACRrB,IAYZmB,iBAAkB,SAA0B3uC,EAASstC,EAAW/B,EAASiC,GAErE,GAAIsB,GAAc3E,CAOlB,OANGjC,GAAM8C,MAAMwC,EAAGzvC,KAAM,UAAY+vC,EAAaC,UAAU7D,EAAesD,GACtEsB,EAAc5E,EACR4D,EAAaC,UAAU3D,EAAaoD,KAC1CsB,EAAc1E,IAId/N,OAAQ6L,EAAMoD,UAAUC,GACxBwD,UAAWxzC,KAAK8Z,MAChBxU,OAAQ2sC,EAAG3sC,OACX0qC,QAASA,EACT+B,UAAWA,EACXwB,YAAaA,EACbE,SAAUxB,EAMV/sC,eAAgB,WACZ,GAAIuuC,GAAW13C,KAAK03C,QACpBA,GAASC,qBAAuBD,EAASC,sBACzCD,EAASvuC,gBAAkBuuC,EAASvuC,kBAMxCyuC,gBAAiB,WACb53C,KAAK03C,SAASE,mBAQlBC,WAAY,WACR,MAAO7G,GAAU6G,iBAa7BrB,EAAehG,EAAOgG,cAMtBsB,YAOAhB,aAAc,WACV,GAAIiB,KAKJ,OAHAnH,GAAMC,KAAK7wC,KAAK83C,SAAU,SAASE,GAC/BD,EAAUjwC,KAAKkwC,KAEZD,GASXrB,cAAe,SAAuBV,EAAWiC,GAC1CjC,GAAa1E,GAAc0E,GAAa1E,GAAsC,IAAzB2G,EAAa1B,cAC1Dv2C,MAAK83C,SAASG,EAAaC,YAElCD,EAAaV,WAAaU,EAAaC,UACvCl4C,KAAK83C,SAASG,EAAaC,WAAaD,IAUhDxB,UAAW,SAAmBe,EAAatB,GACvC,IAAIA,EAAGsB,YACH,OAAO,CAGX,IAAIW,GAAKjC,EAAGsB,YACRllB,IAKJ,OAHAA,GAAMsgB,GAAkBuF,KAAQjC,EAAGkC,sBAAwBxF,GAC3DtgB,EAAMugB,GAAkBsF,KAAQjC,EAAGmC,sBAAwBxF,GAC3DvgB,EAAMwgB,GAAgBqF,KAAQjC,EAAGoC,oBAAsBxF,GAChDxgB,EAAMklB,IAOjBZ,MAAO,WACH52C,KAAK83C,cAWT9G,EAAYR,EAAO+H,WAEnBzH,YAGA0H,QAAS,KAITC,SAAU,KAGVC,SAAS,EAQTC,YAAa,SAAqBC,EAAMC,GAEjC74C,KAAKw4C,UAIRx4C,KAAK04C,SAAU,EAGf14C,KAAKw4C,SACDI,KAAMA,EACNE,WAAYlI,EAAM3rC,UAAW4zC,GAC7BE,WAAW,EACXC,eAAe,EACfC,iBAAiB,EACjBC,gBACA72B,KAAM,IAGVriB,KAAKqxC,OAAOwH,KAShBxH,OAAQ,SAAgBwH,GACpB,GAAI74C,KAAKw4C,UAAWx4C,KAAK04C,QAAzB,CAKAG,EAAY74C,KAAKm5C,gBAAgBN,EAGjC,IAAID,GAAO54C,KAAKw4C,QAAQI,KACpBQ,EAAcR,EAAK9qC,OAmBvB,OAhBA8iC,GAAMC,KAAK7wC,KAAK8wC,SAAU,SAAwBC,IAE1C/wC,KAAK04C,SAAWE,EAAK7qC,SAAWqrC,EAAYrI,EAAQ1uB,OACpD0uB,EAAQwC,QAAQhzC,KAAKwwC,EAAS8H,EAAWD,IAE9C54C,MAGAA,KAAKw4C,UACJx4C,KAAKw4C,QAAQO,UAAYF,GAG1BA,EAAU7C,WAAa1E,GACtBtxC,KAAK63C,aAGFgB,IASXhB,WAAY,WAGR73C,KAAKy4C,SAAW7H,EAAM3rC,UAAWjF,KAAKw4C,SAGtCx4C,KAAKw4C,QAAU,KACfx4C,KAAK04C,SAAU,GAYnBW,kBAAmB,SAA2BnD,EAAInR,EAAQuP,EAAWC,EAAQC,GACzE,GAAI8E,GAAMt5C,KAAKw4C,QACXe,GAAS,EACTC,EAASF,EAAIN,cACbS,EAAWH,EAAIJ,YAEhBM,IAAUtD,EAAGuB,UAAY+B,EAAO/B,UAAYjH,EAAO8B,qBAClDvN,EAASyU,EAAOzU,OAChBuP,EAAY4B,EAAGuB,UAAY+B,EAAO/B,UAClClD,EAAS2B,EAAGnR,OAAOwE,QAAUiQ,EAAOzU,OAAOwE,QAC3CiL,EAAS0B,EAAGnR,OAAO0E,QAAU+P,EAAOzU,OAAO0E,QAC3C8P,GAAS,IAGVrD,EAAGF,WAAa/C,GAAeiD,EAAGF,WAAahD,KAC9CsG,EAAIL,gBAAkB/C,KAGtBoD,EAAIN,eAAiBO,KACrBE,EAASC,SAAW9I,EAAMyD,YAAYC,EAAWC,EAAQC,GACzDiF,EAASE,MAAQ/I,EAAM6D,SAAS1P,EAAQmR,EAAGnR,QAC3C0U,EAASvE,UAAYtE,EAAMiE,aAAa9P,EAAQmR,EAAGnR,QAEnDuU,EAAIN,cAAgBM,EAAIL,iBAAmB/C,EAC3CoD,EAAIL,gBAAkB/C,GAG1BA,EAAG0D,UAAYH,EAASC,SAAS3rB,EACjCmoB,EAAG2D,UAAYJ,EAASC,SAASz5B,EACjCi2B,EAAG4D,aAAeL,EAASE,MAC3BzD,EAAG6D,iBAAmBN,EAASvE,WASnCiE,gBAAiB,SAAyBjD,GACtC,GAAIoD,GAAMt5C,KAAKw4C,QACXwB,EAAUV,EAAIR,WACdmB,EAASX,EAAIP,WAAaiB,GAG3B9D,EAAGF,WAAa/C,GAAeiD,EAAGF,WAAahD,KAC9CgH,EAAQ/F,WACRrD,EAAMC,KAAKqF,EAAGjC,QAAS,SAASG,GAC5B4F,EAAQ/F,QAAQnsC,MACZyhC,QAAS6K,EAAM7K,QACfE,QAAS2K,EAAM3K,YAK3B,IAAI6K,GAAY4B,EAAGuB,UAAYuC,EAAQvC,UACnClD,EAAS2B,EAAGnR,OAAOwE,QAAUyQ,EAAQjV,OAAOwE,QAC5CiL,EAAS0B,EAAGnR,OAAO0E,QAAUuQ,EAAQjV,OAAO0E,OAkBhD,OAhBAzpC,MAAKq5C,kBAAkBnD,EAAI+D,EAAOlV,OAAQuP,EAAWC,EAAQC,GAE7D5D,EAAM3rC,OAAOixC,GACT4C,WAAYkB,EAEZ1F,UAAWA,EACXC,OAAQA,EACRC,OAAQA,EAERvV,SAAU2R,EAAMkE,YAAYkF,EAAQjV,OAAQmR,EAAGnR,QAC/C4U,MAAO/I,EAAM6D,SAASuF,EAAQjV,OAAQmR,EAAGnR,QACzCmQ,UAAWtE,EAAMiE,aAAamF,EAAQjV,OAAQmR,EAAGnR,QACjDlO,MAAO+Z,EAAMmE,SAASiF,EAAQ/F,QAASiC,EAAGjC,SAC1CiG,SAAUtJ,EAAMoE,YAAYgF,EAAQ/F,QAASiC,EAAGjC,WAG7CiC,GASXjF,SAAU,SAAkBF,GAExB,GAAIjjC,GAAUijC,EAAQS,YAyBtB,OAxBG1jC,GAAQijC,EAAQ1uB,QAAUlc,IACzB2H,EAAQijC,EAAQ1uB,OAAQ,GAI5BuuB,EAAM3rC,OAAOurC,EAAOgB,SAAU1jC,GAAS,GAGvCijC,EAAQ9oC,MAAQ8oC,EAAQ9oC,OAAS,IAGjCjI,KAAK8wC,SAAShpC,KAAKipC,GAGnB/wC,KAAK8wC,SAAStf,KAAK,SAAStsB,EAAGa,GAC3B,MAAGb,GAAE+C,MAAQlC,EAAEkC,MACJ,GAER/C,EAAE+C,MAAQlC,EAAEkC,MACJ,EAEJ,IAGJjI,KAAK8wC,UAmBpBN,GAAOe,SAAW,SAAS7oC,EAASoF,GAChC,GAAI+7B,GAAO7pC,IAIXuwC,KAMAvwC,KAAK0I,QAAUA,EAOf1I,KAAK+N,SAAU,EAQf6iC,EAAMC,KAAK/iC,EAAS,SAAS9G,EAAOqb,SACzBvU,GAAQuU,GACfvU,EAAQ8iC,EAAM0E,YAAYjzB,IAASrb,IAGvChH,KAAK8N,QAAU8iC,EAAM3rC,OAAO2rC,EAAM3rC,UAAWurC,EAAOgB,UAAW1jC,OAG5D9N,KAAK8N,QAAQ2jC,UACZb,EAAM2E,eAAev1C,KAAK0I,QAAS1I,KAAK8N,QAAQ2jC,UAAU,GAQ9DzxC,KAAKm6C,kBAAoBzJ,EAAMQ,QAAQxoC,EAASqqC,EAAa,SAASmD,GAC/DrM,EAAK97B,SAAWmoC,EAAGF,WAAajD,EAC/B/B,EAAU2H,YAAY9O,EAAMqM,GACtBA,EAAGF,WAAa/C,GACtBjC,EAAUK,OAAO6E,KASzBl2C,KAAKo6C,kBAGT5J,EAAOe,SAAS/8B,WASZua,GAAI,SAAiB+hB,EAAUyC,GAC3B,GAAI1J,GAAO7pC,IAIX,OAHA0wC,GAAM3hB,GAAG8a,EAAKnhC,QAASooC,EAAUyC,EAAS,SAAS9sC,GAC/CojC,EAAKuQ,cAActyC,MAAOipC,QAAStqC,EAAM8sC,QAASA,MAE/C1J,GAUX3a,IAAK,SAAkB4hB,EAAUyC,GAC7B,GAAI1J,GAAO7pC,IAQX,OANA0wC,GAAMxhB,IAAI2a,EAAKnhC,QAASooC,EAAUyC,EAAS,SAAS9sC,GAChD,GAAIwB,GAAQ2oC,EAAMgD,SAAU7C,QAAStqC,EAAM8sC,QAASA,GACjDtrC,MAAU,GACT4hC,EAAKuQ,cAAclyC,OAAOD,EAAO,KAGlC4hC,GAUXoN,QAAS,SAAsBlG,EAAS8H,GAEhCA,IACAA,KAIJ,IAAIzvC,GAAQonC,EAAOW,SAASkJ,YAAY,QACxCjxC,GAAMkxC,UAAUvJ,GAAS,GAAM,GAC/B3nC,EAAM2nC,QAAU8H,CAIhB,IAAInwC,GAAU1I,KAAK0I,OAMnB,OALGkoC,GAAMiD,UAAUgF,EAAUtvC,OAAQb,KACjCA,EAAUmwC,EAAUtvC,QAGxBb,EAAQ6xC,cAAcnxC,GACfpJ,MASXw6C,OAAQ,SAAgBC,GAEpB,MADAz6C,MAAK+N,QAAU0sC,EACRz6C,MAQX06C,QAAS,WACL,GAAIv1C,GAAGw1C,CAMP,KAHA/J,EAAM2E,eAAev1C,KAAK0I,QAAS1I,KAAK8N,QAAQ2jC,UAAU,GAGtDtsC,EAAI,GAAKw1C,EAAK36C,KAAKo6C,gBAAgBj1C,IACnCyrC,EAAM1hB,IAAIlvB,KAAK0I,QAASiyC,EAAG5J,QAAS4J,EAAGpH,QAQ3C,OALAvzC,MAAKo6C,iBAGL1J,EAAMxhB,IAAIlvB,KAAK0I,QAAS6pC,EAAYQ,GAAc/yC,KAAKm6C,mBAEhD,OAqDf,SAAU93B,GAGN,QAASu4B,GAAY1E,EAAI0C,GACrB,GAAIU,GAAMtI,EAAUwH,OAGpB,MAAGI,EAAK9qC,QAAQ+sC,eAAiB,GAC7B3E,EAAGjC,QAAQ3uC,OAASszC,EAAK9qC,QAAQ+sC,gBAIrC,OAAO3E,EAAGF,WACN,IAAKjD,GACD+H,GAAY,CACZ,MAEJ,KAAK1J,GAGD,GAAG8E,EAAGjX,SAAW2Z,EAAK9qC,QAAQitC,iBAC1BzB,EAAIj3B,MAAQA,EACZ,MAGJ,IAAI24B,GAAc1B,EAAIR,WAAW/T,MAGjC,IAAGuU,EAAIj3B,MAAQA,IACXi3B,EAAIj3B,KAAOA,EACRu2B,EAAK9qC,QAAQmtC,wBAA0B/E,EAAGjX,SAAW,GAAG,CAIvD,GAAI1c,GAAS1d,KAAK+O,IAAIglC,EAAK9qC,QAAQitC,gBAAkB7E,EAAGjX,SACxD+b,GAAY9G,OAASgC,EAAG3B,OAAShyB,EACjCy4B,EAAY7G,OAAS+B,EAAG1B,OAASjyB,EACjCy4B,EAAYzR,SAAW2M,EAAG3B,OAAShyB,EACnCy4B,EAAYvR,SAAWyM,EAAG1B,OAASjyB,EAGnC2zB,EAAKlF,EAAUmI,gBAAgBjD,IAKpCoD,EAAIP,UAAUmC,gBACXtC,EAAK9qC,QAAQotC,gBACXtC,EAAK9qC,QAAQqtC,qBAAuBjF,EAAGjX,YAE3CiX,EAAGgF,gBAAiB,EAIxB,IAAIE,GAAgB9B,EAAIP,UAAU7D,SAC/BgB,GAAGgF,gBAAkBE,IAAkBlF,EAAGhB,YAErCgB,EAAGhB,UADJtE,EAAMqE,WAAWmG,GACAlF,EAAG1B,OAAS,EAAK9B,EAAeF,EAEhC0D,EAAG3B,OAAS,EAAK9B,EAAiBE,GAKtDmI,IACAlC,EAAK3B,QAAQ50B,EAAO,QAAS6zB,GAC7B4E,GAAY,GAIhBlC,EAAK3B,QAAQ50B,EAAM6zB,GACnB0C,EAAK3B,QAAQ50B,EAAO6zB,EAAGhB,UAAWgB,EAElC,IAAIjB,GAAarE,EAAMqE,WAAWiB,EAAGhB,YAGjC0D,EAAK9qC,QAAQutC,mBAAqBpG,GACjC2D,EAAK9qC,QAAQwtC,sBAAwBrG,IACtCiB,EAAG/sC,gBAEP,MAEJ,KAAK6pC,GACE8H,GAAa5E,EAAGgB,eAAiB0B,EAAK9qC,QAAQ+sC,iBAC7CjC,EAAK3B,QAAQ50B,EAAO,MAAO6zB,GAC3B4E,GAAY,EAEhB,MAEJ,KAAKxJ,GACDwJ,GAAY,GAzFxB,GAAIA,IAAY,CA8FhBtK,GAAOM,SAASyK,MACZl5B,KAAMA,EACNpa,MAAO,GACPsrC,QAASqH,EACTpJ,UAOIuJ,gBAAiB,GAWjBE,wBAAwB,EAQxBJ,eAAgB,EAUhBS,qBAAqB,EAQrBD,mBAAmB,EASnBH,gBAAgB,EAShBC,oBAAqB,MAG9B,QAgBH3K,EAAOM,SAAS0K,SACZn5B,KAAM,UACNpa,MAAO,KACPsrC,QAAS,SAAwB2C,EAAI0C,GACjCA,EAAK3B,QAAQj3C,KAAKqiB,KAAM6zB,KAqBhC,SAAU7zB,GAGN,QAASo5B,GAAYvF,EAAI0C,GACrB,GAAI9qC,GAAU8qC,EAAK9qC,QACf0qC,EAAUxH,EAAUwH,OAExB,QAAOtC,EAAGF,WACN,IAAKjD,GACDjM,aAAa4U,GAGblD,EAAQn2B,KAAOA,EAIfq5B,EAAQvU,WAAW,WACZqR,GAAWA,EAAQn2B,MAAQA,GAC1Bu2B,EAAK3B,QAAQ50B,EAAM6zB,IAExBpoC,EAAQ6tC,YACX,MAEJ,KAAKvK,GACE8E,EAAGjX,SAAWnxB,EAAQ8tC,eACrB9U,aAAa4U,EAEjB,MAEJ,KAAK1I,GACDlM,aAAa4U,IA7BzB,GAAIA,EAkCJlL,GAAOM,SAAS+K,MACZx5B,KAAMA,EACNpa,MAAO,GACPupC,UAMImK,YAAa,IAQbC,cAAe,GAEnBrI,QAASkI,IAEd,QAeHjL,EAAOM,SAASgL,SACZz5B,KAAM,UACNpa,MAAO8zC,IACPxI,QAAS,SAAwB2C,EAAI0C,GAC9B1C,EAAGF,WAAahD,GACf4F,EAAK3B,QAAQj3C,KAAKqiB,KAAM6zB,KAyCpC1F,EAAOM,SAASkL,OACZ35B,KAAM,QACNpa,MAAO,GACPupC,UAMIyK,gBAAiB,EAOjBC,gBAAiB,EAQjBC,eAAgB,GAQhBC,eAAgB,IAGpB7I,QAAS,SAAsB2C,EAAI0C,GAC/B,GAAG1C,EAAGF,WAAahD,EAAe,CAC9B,GAAIiB,GAAUiC,EAAGjC,QAAQ3uC,OACrBwI,EAAU8qC,EAAK9qC,OAGnB,IAAGmmC,EAAUnmC,EAAQmuC,iBACjBhI,EAAUnmC,EAAQouC,gBAClB,QAKDhG,EAAG0D,UAAY9rC,EAAQquC,gBACtBjG,EAAG2D,UAAY/rC,EAAQsuC,kBAEvBxD,EAAK3B,QAAQj3C,KAAKqiB,KAAM6zB,GACxB0C,EAAK3B,QAAQj3C,KAAKqiB,KAAO6zB,EAAGhB,UAAWgB,OA2BvD,SAAU7zB,GAGN,QAASg6B,GAAWnG,EAAI0C,GACpB,GAGI0D,GACAC,EAJAzuC,EAAU8qC,EAAK9qC,QACf0qC,EAAUxH,EAAUwH,QACpBlN,EAAO0F,EAAUyH,QAIrB,QAAOvC,EAAGF,WACN,IAAKjD,GACDyJ,GAAW,CACX,MAEJ,KAAKpL,GACDoL,EAAWA,GAAatG,EAAGjX,SAAWnxB,EAAQ2uC,cAC9C,MAEJ,KAAKnL,IACGV,EAAM8C,MAAMwC,EAAGwB,SAASjxC,KAAM,WAAayvC,EAAG5B,UAAYxmC,EAAQ4uC,aAAeF,IAEjFF,EAAYhR,GAAQA,EAAKyN,WAAa7C,EAAGuB,UAAYnM,EAAKyN,UAAUtB,UACpE8E,GAAe,EAGZjR,GAAQA,EAAKjpB,MAAQA,GACnBi6B,GAAaA,EAAYxuC,EAAQ6uC,mBAClCzG,EAAGjX,SAAWnxB,EAAQ8uC,oBACtBhE,EAAK3B,QAAQ,YAAaf,GAC1BqG,GAAe,KAIfA,GAAgBzuC,EAAQ+uC,aACxBrE,EAAQn2B,KAAOA,EACfu2B,EAAK3B,QAAQuB,EAAQn2B,KAAM6zB,MAnC/C,GAAIsG,IAAW,CA0CfhM,GAAOM,SAASgM,KACZz6B,KAAMA,EACNpa,MAAO,IACPsrC,QAAS8I,EACT7K,UAOIkL,WAAY,IAQZD,eAAgB,GAQhBI,WAAW,EAQXD,kBAAmB,GAQnBD,kBAAmB,OAG5B,OAeHnM,EAAOM,SAASiM,OACZ16B,KAAM,QACNpa,OAAQ8zC,IACRvK,UASIroC,gBAAgB,EAQhB6zC,cAAc,GAElBzJ,QAAS,SAAsB2C,EAAI0C,GAC/B,MAAGA,GAAK9qC,QAAQkvC,cAAgB9G,EAAGsB,aAAe5E,MAC9CsD,GAAG2B,cAIJe,EAAK9qC,QAAQ3E,gBACZ+sC,EAAG/sC,sBAGJ+sC,EAAGF,WAAa/C,GACf2F,EAAK3B,QAAQ,QAASf,OA4ClC,SAAU7zB,GAGN,QAAS46B,GAAiB/G,EAAI0C,GAC1B,OAAO1C,EAAGF,WACN,IAAKjD,GACD+H,GAAY,CACZ,MAEJ,KAAK1J,GAED,GAAG8E,EAAGjC,QAAQ3uC,OAAS,EACnB,MAGJ,IAAI43C,GAAiBr4C,KAAK+O,IAAI,EAAIsiC,EAAGrf,OACjCsmB,EAAoBt4C,KAAK+O,IAAIsiC,EAAGgE,SAIpC,IAAGgD,EAAiBtE,EAAK9qC,QAAQsvC,mBAC7BD,EAAoBvE,EAAK9qC,QAAQuvC,qBACjC,MAIJrM,GAAUwH,QAAQn2B,KAAOA,EAGrBy4B,IACAlC,EAAK3B,QAAQ50B,EAAO,QAAS6zB,GAC7B4E,GAAY,GAGhBlC,EAAK3B,QAAQ50B,EAAM6zB,GAGhBiH,EAAoBvE,EAAK9qC,QAAQuvC,sBAChCzE,EAAK3B,QAAQ,SAAUf,GAIxBgH,EAAiBtE,EAAK9qC,QAAQsvC,oBAC7BxE,EAAK3B,QAAQ,QAASf,GACtB0C,EAAK3B,QAAQ,SAAWf,EAAGrf,MAAQ,EAAI,KAAO,OAAQqf,GAE1D,MAEJ,KAAKlD,GACE8H,GAAa5E,EAAGgB,cAAgB,IAC/B0B,EAAK3B,QAAQ50B,EAAO,MAAO6zB,GAC3B4E,GAAY,IAlD5B,GAAIA,IAAY,CAwDhBtK,GAAOM,SAASwM,WACZj7B,KAAMA,EACNpa,MAAO,GACPupC,UAOI4L,kBAAmB,IAQnBC,qBAAsB,GAG1B9J,QAAS0J,IAEd,aAQG3tC,EAAiC,WAC/B,MAAOkhC,IACTjwC,KAAKX,EAASM,EAAqBN,EAASC,KAAUyP,IAAkCnJ,IAActG,EAAOD,QAAU0P,KAS1HjI,SAIC,SAASxH,EAAQD,EAASM,GAe9B,QAASyB,GAAMusC,EAAMpgC,GACnB,GAAIiQ,GAAMta,IAAS6O,MAAM,GAAGE,QAAQ,GAAGE,QAAQ,GAAGE,aAAa,EAC/D5S,MAAK8O,MAAQiP,EAAI8L,QAAQtI,IAAI,OAAQ,IAAI5a,UACzC3G,KAAKqhB,IAAMtD,EAAI8L,QAAQtI,IAAI,OAAQ,GAAG5a,UAEtC3G,KAAKkuC,KAAOA,EAGZluC,KAAK4tC,gBACH9+B,MAAO,KACPuS,IAAK,KACL6zB,UAAW,aACXqI,UAAU,EACVC,UAAU,EACVnyC,IAAK,KACLyB,IAAK,KACL2wC,QAAS,GACTC,QAAS,UAEX19C,KAAK8N,QAAUnN,EAAKsE,UAAWjF,KAAK4tC,gBAEpC5tC,KAAK2F,OACHyuC,UAIFp0C,KAAKkuC,KAAKE,QAAQrf,GAAG,YAAa/uB,KAAK29C,aAAatP,KAAKruC,OACzDA,KAAKkuC,KAAKE,QAAQrf,GAAG,OAAa/uB,KAAK49C,QAAQvP,KAAKruC,OACpDA,KAAKkuC,KAAKE,QAAQrf,GAAG,UAAa/uB,KAAK69C,WAAWxP,KAAKruC,OAGvDA,KAAKkuC,KAAKE,QAAQrf,GAAG,OAAQ/uB,KAAK89C,QAAQzP,KAAKruC,OAG/CA,KAAKkuC,KAAKE,QAAQrf,GAAG,aAAmB/uB,KAAK+9C,cAAc1P,KAAKruC,OAChEA,KAAKkuC,KAAKE,QAAQrf,GAAG,iBAAmB/uB,KAAK+9C,cAAc1P,KAAKruC,OAGhEA,KAAKkuC,KAAKE,QAAQrf,GAAG,QAAS/uB,KAAKg+C,SAAS3P,KAAKruC,OACjDA,KAAKkuC,KAAKE,QAAQrf,GAAG,QAAS/uB,KAAKi+C,SAAS5P,KAAKruC,OAEjDA,KAAK02B,WAAW5oB,GAsClB,QAASowC,GAAmBhJ,GAC1B,GAAiB,cAAbA,GAA0C,YAAbA,EAC/B,KAAM,IAAIlvC,WAAU,sBAAwBkvC,EAAY,yCAqX5D,QAASiJ,GAAY/J,EAAO1rC,GAC1B,OACEqlB,EAAGqmB,EAAMF,MAAQvzC,EAAKsG,gBAAgByB,GACtCuX,EAAGm0B,EAAMD,MAAQxzC,EAAK4G,eAAemB,IAtdzC,GAAI/H,GAAOT,EAAoB,GAC3Bk+C,EAAal+C,EAAoB,IACjCuD,EAASvD,EAAoB,GAC7BkC,EAAYlC,EAAoB,GAsDpCyB,GAAM6S,UAAY,GAAIpS,GAkBtBT,EAAM6S,UAAUkiB,WAAa,SAAU5oB,GACrC,GAAIA,EAAS,CAEX,GAAIP,IAAU,YAAa,MAAO,MAAO,UAAW,UAAW,WAAY,WAC3E5M,GAAK+E,gBAAgB6H,EAAQvN,KAAK8N,QAASA,IAEvC,SAAWA,IAAW,OAASA,KAEjC9N,KAAKitC,SAASn/B,EAAQgB,MAAOhB,EAAQuT,OAqB3C1f,EAAM6S,UAAUy4B,SAAW,SAASn+B,EAAOuS,GACzC,GAAIg9B,GAAUr+C,KAAKs+C,YAAYxvC,EAAOuS,EACtC,IAAIg9B,EAAS,CACX,GAAI/uB,IACFxgB,MAAO,GAAI7K,MAAKjE,KAAK8O,OACrBuS,IAAK,GAAIpd,MAAKjE,KAAKqhB,KAErBrhB,MAAKkuC,KAAKE,QAAQ3H,KAAK,cAAenX,GACtCtvB,KAAKkuC,KAAKE,QAAQ3H,KAAK,eAAgBnX,KAa3C3tB,EAAM6S,UAAU8pC,YAAc,SAASxvC,EAAOuS,GAC5C,GAIIsH,GAJA41B,EAAqB,MAATzvC,EAAiBnO,EAAK6F,QAAQsI,EAAO,QAAQnI,UAAY3G,KAAK8O,MAC1E0vC,EAAmB,MAAPn9B,EAAiB1gB,EAAK6F,QAAQ6a,EAAK,QAAQ1a,UAAc3G,KAAKqhB,IAC1EvU,EAA2B,MAApB9M,KAAK8N,QAAQhB,IAAenM,EAAK6F,QAAQxG,KAAK8N,QAAQhB,IAAK,QAAQnG,UAAY,KACtF0E,EAA2B,MAApBrL,KAAK8N,QAAQzC,IAAe1K,EAAK6F,QAAQxG,KAAK8N,QAAQzC,IAAK,QAAQ1E,UAAY,IAI1F,IAAItC,MAAMk6C,IAA0B,OAAbA,EACrB,KAAM,IAAI/6C,OAAM,kBAAoBsL,EAAQ,IAE9C,IAAIzK,MAAMm6C,IAAsB,OAAXA,EACnB,KAAM,IAAIh7C,OAAM,gBAAkB6d,EAAM,IAyC1C,IArCak9B,EAATC,IACFA,EAASD,GAIC,OAARlzC,GACaA,EAAXkzC,IACF51B,EAAQtd,EAAMkzC,EACdA,GAAY51B,EACZ61B,GAAU71B,EAGC,MAAP7b,GACE0xC,EAAS1xC,IACX0xC,EAAS1xC,IAOL,OAARA,GACE0xC,EAAS1xC,IACX6b,EAAQ61B,EAAS1xC,EACjByxC,GAAY51B,EACZ61B,GAAU71B,EAGC,MAAPtd,GACaA,EAAXkzC,IACFA,EAAWlzC,IAOU,OAAzBrL,KAAK8N,QAAQ2vC,QAAkB,CACjC,GAAIA,GAAUxhC,WAAWjc,KAAK8N,QAAQ2vC,QACxB,GAAVA,IACFA,EAAU,GAEcA,EAArBe,EAASD,IACPv+C,KAAKqhB,IAAMrhB,KAAK8O,QAAW2uC,GAE9Bc,EAAWv+C,KAAK8O,MAChB0vC,EAASx+C,KAAKqhB,MAIdsH,EAAQ80B,GAAWe,EAASD,GAC5BA,GAAY51B,EAAO,EACnB61B,GAAU71B,EAAO,IAMvB,GAA6B,OAAzB3oB,KAAK8N,QAAQ4vC,QAAkB,CACjC,GAAIA,GAAUzhC,WAAWjc,KAAK8N,QAAQ4vC,QACxB,GAAVA,IACFA,EAAU,GAEPc,EAASD,EAAYb,IACnB19C,KAAKqhB,IAAMrhB,KAAK8O,QAAW4uC,GAE9Ba,EAAWv+C,KAAK8O,MAChB0vC,EAASx+C,KAAKqhB,MAIdsH,EAAS61B,EAASD,EAAYb,EAC9Ba,GAAY51B,EAAO,EACnB61B,GAAU71B,EAAO,IAKvB,GAAI01B,GAAWr+C,KAAK8O,OAASyvC,GAAYv+C,KAAKqhB,KAAOm9B,CAKrD,OAHAx+C,MAAK8O,MAAQyvC,EACbv+C,KAAKqhB,IAAMm9B,EAEJH,GAOT18C,EAAM6S,UAAUiqC,SAAW,WACzB,OACE3vC,MAAO9O,KAAK8O,MACZuS,IAAKrhB,KAAKqhB,MAUd1f,EAAM6S,UAAUkqC,WAAa,SAAUnwB,GACrC,MAAO5sB,GAAM+8C,WAAW1+C,KAAK8O,MAAO9O,KAAKqhB,IAAKkN,IAWhD5sB,EAAM+8C,WAAa,SAAU5vC,EAAOuS,EAAKkN,GACvC,MAAa,IAATA,GAAelN,EAAMvS,GAAS,GAE9Bqc,OAAQrc,EACR+nB,MAAOtI,GAASlN,EAAMvS,KAKtBqc,OAAQ,EACR0L,MAAO,IAUbl1B,EAAM6S,UAAUmpC,aAAe,WAExB39C,KAAK8N,QAAQyvC,UAIbv9C,KAAK2F,MAAMyuC,MAAMuK,gBAEtB3+C,KAAK2F,MAAMyuC,MAAMtlC,MAAQ9O,KAAK8O,MAC9B9O,KAAK2F,MAAMyuC,MAAM/yB,IAAMrhB,KAAKqhB,IAExBrhB,KAAKkuC,KAAKtF,IAAIlpC,OAChBM,KAAKkuC,KAAKtF,IAAIlpC,KAAKyuB,MAAM2X,OAAS,UAStCnkC,EAAM6S,UAAUopC,QAAU,SAAUx0C,GAElC,GAAKpJ,KAAK8N,QAAQyvC,SAAlB,CACA,GAAIrI,GAAYl1C,KAAK8N,QAAQonC,SAI7B,IAHAgJ,EAAkBhJ,GAGbl1C,KAAK2F,MAAMyuC,MAAMuK,cAAtB,CACA,GAAInX,GAAsB,cAAb0N,EAA6B9rC,EAAM2nC,QAAQwD,OAASnrC,EAAM2nC,QAAQyD,OAC3EtI,EAAYlsC,KAAK2F,MAAMyuC,MAAM/yB,IAAMrhB,KAAK2F,MAAMyuC,MAAMtlC,MACpDyf,EAAsB,cAAb2mB,EAA6Bl1C,KAAKkuC,KAAKC,SAASpJ,OAAOxW,MAAQvuB,KAAKkuC,KAAKC,SAASpJ,OAAOvW,OAClGowB,GAAapX,EAAQjZ,EAAQ2d,CACjClsC,MAAKs+C,YAAYt+C,KAAK2F,MAAMyuC,MAAMtlC,MAAQ8vC,EAAW5+C,KAAK2F,MAAMyuC,MAAM/yB,IAAMu9B,GAC5E5+C,KAAKkuC,KAAKE,QAAQ3H,KAAK,eACrB33B,MAAO,GAAI7K,MAAKjE,KAAK8O,OACrBuS,IAAO,GAAIpd,MAAKjE,KAAKqhB,UASzB1f,EAAM6S,UAAUqpC,WAAa,WAEtB79C,KAAK8N,QAAQyvC,UAIbv9C,KAAK2F,MAAMyuC,MAAMuK,gBAElB3+C,KAAKkuC,KAAKtF,IAAIlpC,OAChBM,KAAKkuC,KAAKtF,IAAIlpC,KAAKyuB,MAAM2X,OAAS,QAIpC9lC,KAAKkuC,KAAKE,QAAQ3H,KAAK,gBACrB33B,MAAO,GAAI7K,MAAKjE,KAAK8O,OACrBuS,IAAO,GAAIpd,MAAKjE,KAAKqhB,SAUzB1f,EAAM6S,UAAUupC,cAAgB,SAAS30C,GAEvC,GAAMpJ,KAAK8N,QAAQ0vC,UAAYx9C,KAAK8N,QAAQyvC,SAA5C,CAGA,GAAI/V,GAAQ,CAYZ,IAXIp+B,EAAMq+B,WACRD,EAAQp+B,EAAMq+B,WAAa,IAClBr+B,EAAMs+B,SAGfF,GAASp+B,EAAMs+B,OAAS,GAMtBF,EAAO,CAKT,GAAI3Q,EAEFA,GADU,EAAR2Q,EACM,EAAKA,EAAQ,EAGb,GAAK,EAAKA,EAAQ,EAI5B,IAAIuJ,GAAUqN,EAAWS,YAAY7+C,KAAMoJ,GACvC4uC,EAAUmG,EAAWpN,EAAQhM,OAAQ/kC,KAAKkuC,KAAKtF,IAAI7D,QACnD+Z,EAAc9+C,KAAK++C,eAAe/G,EAEtCh4C,MAAKg/C,KAAKnoB,EAAOioB,GAKnB11C,EAAMD,mBAORxH,EAAM6S,UAAUwpC,SAAW,WACzBh+C,KAAK2F,MAAMyuC,MAAMtlC,MAAQ9O,KAAK8O,MAC9B9O,KAAK2F,MAAMyuC,MAAM/yB,IAAMrhB,KAAKqhB,IAC5BrhB,KAAK2F,MAAMyuC,MAAMuK,eAAgB,EACjC3+C,KAAK2F,MAAMyuC,MAAMrP,OAAS,MAO5BpjC,EAAM6S,UAAUspC,QAAU,WACxB99C,KAAK2F,MAAMyuC,MAAMuK,eAAgB,GAQnCh9C,EAAM6S,UAAUypC,SAAW,SAAU70C,GAEnC,GAAMpJ,KAAK8N,QAAQ0vC,UAAYx9C,KAAK8N,QAAQyvC,WAE5Cv9C,KAAK2F,MAAMyuC,MAAMuK,eAAgB,EAE7Bv1C,EAAM2nC,QAAQkD,QAAQ3uC,OAAS,GAAG,CAC/BtF,KAAK2F,MAAMyuC,MAAMrP,SACpB/kC,KAAK2F,MAAMyuC,MAAMrP,OAASoZ,EAAW/0C,EAAM2nC,QAAQhM,OAAQ/kC,KAAKkuC,KAAKtF,IAAI7D,QAG3E,IAAIlO,GAAQ,EAAIztB,EAAM2nC,QAAQla,MAC1BooB,EAAWj/C,KAAK++C,eAAe/+C,KAAK2F,MAAMyuC,MAAMrP,QAGhDwZ,EAAW3iC,SAASqjC,GAAYj/C,KAAK2F,MAAMyuC,MAAMtlC,MAAQmwC,GAAYpoB,GACrE2nB,EAAS5iC,SAASqjC,GAAYj/C,KAAK2F,MAAMyuC,MAAM/yB,IAAM49B,GAAYpoB,EAGrE72B,MAAKitC,SAASsR,EAAUC,KAU5B78C,EAAM6S,UAAUuqC,eAAiB,SAAU/G,GACzC,GAAI0G,GACAxJ,EAAYl1C,KAAK8N,QAAQonC,SAI7B,IAFAgJ,EAAkBhJ,GAED,cAAbA,EAA2B,CAC7B,GAAI3mB,GAAQvuB,KAAKkuC,KAAKC,SAASpJ,OAAOxW,KAEtC,OADAmwB,GAAa1+C,KAAK0+C,WAAWnwB,GACtBypB,EAAQjqB,EAAI2wB,EAAW7nB,MAAQ6nB,EAAWvzB,OAGjD,GAAIqD,GAASxuB,KAAKkuC,KAAKC,SAASpJ,OAAOvW,MAEvC,OADAkwB,GAAa1+C,KAAK0+C,WAAWlwB,GACtBwpB,EAAQ/3B,EAAIy+B,EAAW7nB,MAAQ6nB,EAAWvzB,QA4BrDxpB,EAAM6S,UAAUwqC,KAAO,SAASnoB,EAAOkO,GAEvB,MAAVA,IACFA,GAAU/kC,KAAK8O,MAAQ9O,KAAKqhB,KAAO,EAIrC,IAAIk9B,GAAWxZ,GAAU/kC,KAAK8O,MAAQi2B,GAAUlO,EAC5C2nB,EAASzZ,GAAU/kC,KAAKqhB,IAAM0jB,GAAUlO,CAE5C72B,MAAKitC,SAASsR,EAAUC,IAS1B78C,EAAM6S,UAAU0qC,KAAO,SAAS1X,GAE9B,GAAI7e,GAAQ3oB,KAAKqhB,IAAMrhB,KAAK8O,MAGxByvC,EAAWv+C,KAAK8O,MAAQ6Z,EAAO6e,EAC/BgX,EAASx+C,KAAKqhB,IAAMsH,EAAO6e,CAI/BxnC,MAAK8O,MAAQyvC,EACbv+C,KAAKqhB,IAAMm9B,GAOb78C,EAAM6S,UAAU2sB,OAAS,SAASA,GAChC,GAAI4D,IAAU/kC,KAAK8O,MAAQ9O,KAAKqhB,KAAO,EAEnCsH,EAAOoc,EAAS5D,EAGhBod,EAAWv+C,KAAK8O,MAAQ6Z,EACxB61B,EAASx+C,KAAKqhB,IAAMsH,CAExB3oB,MAAKitC,SAASsR,EAAUC,IAG1B3+C,EAAOD,QAAU+B,GAKb,SAAS9B,EAAQD,EAASM,GAE9B,GAAIswC,GAAStwC,EAAoB,GAOjCN,GAAQi/C,YAAc,SAASn2C,EAASU,GACtC,GAAI4sC,GAAY,KAMZ/B,EAAUzD,EAAOpnC,MAAM0tC,aAAa1tC,EAAO4sC,GAC3CjF,EAAUP,EAAOpnC,MAAMiuC,iBAAiBr3C,KAAMg2C,EAAW/B,EAAS7qC,EAWtE,OAPI/E,OAAM0sC,EAAQhM,OAAOmP,SACvBnD,EAAQhM,OAAOmP,MAAQ9qC,EAAM8qC,OAE3B7vC,MAAM0sC,EAAQhM,OAAOoP,SACvBpD,EAAQhM,OAAOoP,MAAQ/qC,EAAM+qC,OAGxBpD,IAML,SAASlxC,GAOb,QAASuC,KACPpC,KAAK8N,QAAU,KACf9N,KAAK2F,MAAQ,KAQfvD,EAAUoS,UAAUkiB,WAAa,SAAS5oB,GACpCA,GACFnN,KAAKsE,OAAOjF,KAAK8N,QAASA,IAQ9B1L,EAAUoS,UAAU2mB,OAAS,WAE3B,OAAO,GAMT/4B,EAAUoS,UAAU2qC,QAAU,aAU9B/8C,EAAUoS,UAAU4qC,WAAa,WAC/B,GAAIC,GAAWr/C,KAAK2F,MAAM25C,iBAAmBt/C,KAAK2F,MAAM4oB,OACpDvuB,KAAK2F,MAAM45C,kBAAoBv/C,KAAK2F,MAAM6oB,MAK9C,OAHAxuB,MAAK2F,MAAM25C,eAAiBt/C,KAAK2F,MAAM4oB,MACvCvuB,KAAK2F,MAAM45C,gBAAkBv/C,KAAK2F,MAAM6oB,OAEjC6wB,GAGTx/C,EAAOD,QAAUwC,GAKb,SAASvC,EAAQD,EAASM,GAqB9B,QAASovC,MAnBT,GAAI3Y,GAAUz2B,EAAoB,IAC9BswC,EAAStwC,EAAoB,IAC7BS,EAAOT,EAAoB,GAQ3Bs/C,GAPUt/C,EAAoB,GACnBA,EAAoB,GACvBA,EAAoB,IACjBA,EAAoB,IACjBA,EAAoB,IACrBA,EAAoB,IACvBA,EAAoB,IAClBA,EAAoB,IAYpCy2B,GAAQ2Y,EAAK96B,WASb86B,EAAK96B,UAAUy5B,QAAU,SAAUta,GACjC3zB,KAAK4oC,OAEL5oC,KAAK4oC,IAAIlpC,KAAuB8tB,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAIl9B,WAAuB8hB,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAI6W,mBAAuBjyB,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAI8W,qBAAuBlyB,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAI+W,gBAAuBnyB,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAIgX,cAAuBpyB,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAIiX,eAAuBryB,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAI7D,OAAuBvX,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAIxhC,KAAuBomB,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAIjI,MAAuBnT,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAIphC,IAAuBgmB,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAI7L,OAAuBvP,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAIkX,UAAuBtyB,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAImX,aAAuBvyB,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAIoX,cAAuBxyB,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAIqX,iBAAuBzyB,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAIsX,eAAuB1yB,SAASK,cAAc,OACvD7tB,KAAK4oC,IAAIuX,kBAAuB3yB,SAASK,cAAc,OAEvD7tB,KAAK4oC,IAAIlpC,KAAKiI,UAA4B,oBAC1C3H,KAAK4oC,IAAIl9B,WAAW/D,UAAsB,sBAC1C3H,KAAK4oC,IAAI6W,mBAAmB93C,UAAc,+BAC1C3H,KAAK4oC,IAAI8W,qBAAqB/3C,UAAY,iCAC1C3H,KAAK4oC,IAAI+W,gBAAgBh4C,UAAiB,kBAC1C3H,KAAK4oC,IAAIgX,cAAcj4C,UAAmB,gBAC1C3H,KAAK4oC,IAAIiX,eAAel4C,UAAkB,iBAC1C3H,KAAK4oC,IAAIphC,IAAIG,UAA6B,eAC1C3H,KAAK4oC,IAAI7L,OAAOp1B,UAA0B,kBAC1C3H,KAAK4oC,IAAIxhC,KAAKO,UAA4B,UAC1C3H,KAAK4oC,IAAI7D,OAAOp9B,UAA0B,UAC1C3H,KAAK4oC,IAAIjI,MAAMh5B,UAA2B,UAC1C3H,KAAK4oC,IAAIkX,UAAUn4C,UAAuB,aAC1C3H,KAAK4oC,IAAImX,aAAap4C,UAAoB,gBAC1C3H,KAAK4oC,IAAIoX,cAAcr4C,UAAmB,aAC1C3H,KAAK4oC,IAAIqX,iBAAiBt4C,UAAgB,gBAC1C3H,KAAK4oC,IAAIsX,eAAev4C,UAAkB,aAC1C3H,KAAK4oC,IAAIuX,kBAAkBx4C,UAAe,gBAE1C3H,KAAK4oC,IAAIlpC,KAAKguB,YAAY1tB,KAAK4oC,IAAIl9B,YACnC1L,KAAK4oC,IAAIlpC,KAAKguB,YAAY1tB,KAAK4oC,IAAI6W,oBACnCz/C,KAAK4oC,IAAIlpC,KAAKguB,YAAY1tB,KAAK4oC,IAAI8W,sBACnC1/C,KAAK4oC,IAAIlpC,KAAKguB,YAAY1tB,KAAK4oC,IAAI+W,iBACnC3/C,KAAK4oC,IAAIlpC,KAAKguB,YAAY1tB,KAAK4oC,IAAIgX,eACnC5/C,KAAK4oC,IAAIlpC,KAAKguB,YAAY1tB,KAAK4oC,IAAIiX,gBACnC7/C,KAAK4oC,IAAIlpC,KAAKguB,YAAY1tB,KAAK4oC,IAAIphC,KACnCxH,KAAK4oC,IAAIlpC,KAAKguB,YAAY1tB,KAAK4oC,IAAI7L,QAEnC/8B,KAAK4oC,IAAI+W,gBAAgBjyB,YAAY1tB,KAAK4oC,IAAI7D,QAC9C/kC,KAAK4oC,IAAIgX,cAAclyB,YAAY1tB,KAAK4oC,IAAIxhC,MAC5CpH,KAAK4oC,IAAIiX,eAAenyB,YAAY1tB,KAAK4oC,IAAIjI,OAE7C3gC,KAAK4oC,IAAI+W,gBAAgBjyB,YAAY1tB,KAAK4oC,IAAIkX,WAC9C9/C,KAAK4oC,IAAI+W,gBAAgBjyB,YAAY1tB,KAAK4oC,IAAImX,cAC9C//C,KAAK4oC,IAAIgX,cAAclyB,YAAY1tB,KAAK4oC,IAAIoX,eAC5ChgD,KAAK4oC,IAAIgX,cAAclyB,YAAY1tB,KAAK4oC,IAAIqX,kBAC5CjgD,KAAK4oC,IAAIiX,eAAenyB,YAAY1tB,KAAK4oC,IAAIsX,gBAC7ClgD,KAAK4oC,IAAIiX,eAAenyB,YAAY1tB,KAAK4oC,IAAIuX,mBAE7CngD,KAAK+uB,GAAG,cAAe/uB,KAAKm7B,OAAOkT,KAAKruC,OACxCA,KAAK+uB,GAAG,SAAU/uB,KAAKm7B,OAAOkT,KAAKruC,OACnCA,KAAK+uB,GAAG,QAAS/uB,KAAKg+C,SAAS3P,KAAKruC,OACpCA,KAAK+uB,GAAG,QAAS/uB,KAAKi+C,SAAS5P,KAAKruC,OACpCA,KAAK+uB,GAAG,YAAa/uB,KAAK29C,aAAatP,KAAKruC,OAC5CA,KAAK+uB,GAAG,OAAQ/uB,KAAK49C,QAAQvP,KAAKruC,OAIlCA,KAAK0D,OAAS8sC,EAAOxwC,KAAK4oC,IAAIlpC,MAC5B0gD,iBAAiB,IAEnBpgD,KAAKkqC,YAEL,IAAIva,GAAK3vB,KACLqgD,GACF,QAAS,QACT,MAAO,YAAa,OACpB,YAAa,OAAQ,UACrB,aAAc,iBAgChB,IA9BAA,EAAOl4C,QAAQ,SAAUiB,GACvB,GAAIR,GAAW,WACb,GAAIiY,IAAQzX,GAAOomB,OAAO5pB,MAAM4O,UAAUqE,MAAMtY,KAAK8E,UAAW,GAC5DsqB,GAAG2wB,YACL3wB,EAAG8W,KAAK91B,MAAMgf,EAAI9O,GAGtB8O,GAAGjsB,OAAOqrB,GAAG3lB,EAAOR,GACpB+mB,EAAGua,UAAU9gC,GAASR,IAIxB5I,KAAK2F,OACHjG,QACAgM,cACAi0C,mBACAC,iBACAC,kBACA9a,UACA39B,QACAu5B,SACAn5B,OACAu1B,UACApxB,UACA40C,UAAW,EACXC,aAAc,GAEhBxgD,KAAKo0C,UAGAzgB,EAAW,KAAM,IAAInwB,OAAM,wBAChCmwB,GAAUjG,YAAY1tB,KAAK4oC,IAAIlpC,OA4BjC4vC,EAAK96B,UAAUkiB,WAAa,SAAU5oB,GACpC,GAAIA,EAAS,CAEX,GAAIP,IAAU,QAAS,SAAU,YAAa,YAAa,aAAc,QAAS,MAAO,cAAe,aACxG5M,GAAK+E,gBAAgB6H,EAAQvN,KAAK8N,QAASA,GAEvC,cAAgBA,KACdA,EAAQ2yC,WACVzgD,KAAK0gD,UAAY,GAAIlB,GAAUx/C,KAAK4oC,IAAIlpC,MAGpCM,KAAK0gD,YACP1gD,KAAK0gD,UAAUvB,gBACRn/C,MAAK0gD,YAMlB1gD,KAAK2gD,kBASP,GALA3gD,KAAK8B,WAAWqG,QAAQ,SAAUy4C,GAChCA,EAAUlqB,WAAW5oB,KAInBA,GAAWA,EAAQkjB,MACrB,KAAM,IAAIxtB,OAAM,wEAIlBxD,MAAKm7B,UAOPmU,EAAK96B,UAAU8rC,SAAW,WACxB,OAAQtgD,KAAK0gD,WAAa1gD,KAAK0gD,UAAUG,QAM3CvR,EAAK96B,UAAU2qC,QAAU,WAEvBn/C,KAAK+xB,QAGL/xB,KAAKkvB,MAGLlvB,KAAK8gD,kBAGD9gD,KAAK4oC,IAAIlpC,KAAKgK,YAChB1J,KAAK4oC,IAAIlpC,KAAKgK,WAAW0jB,YAAYptB,KAAK4oC,IAAIlpC,MAEhDM,KAAK4oC,IAAM,KAGP5oC,KAAK0gD,YACP1gD,KAAK0gD,UAAUvB,gBACRn/C,MAAK0gD,UAId,KAAK,GAAIt3C,KAASpJ,MAAKkqC,UACjBlqC,KAAKkqC,UAAUzkC,eAAe2D,UACzBpJ,MAAKkqC,UAAU9gC,EAG1BpJ,MAAKkqC,UAAY,KACjBlqC,KAAK0D,OAAS,KAGd1D,KAAK8B,WAAWqG,QAAQ,SAAUy4C,GAChCA,EAAUzB,YAGZn/C,KAAKkuC,KAAO,MAQdoB,EAAK96B,UAAUusC,cAAgB,SAAUt2B,GACvC,IAAKzqB,KAAKivC,WACR,KAAM,IAAIzrC,OAAM,yDAGlBxD,MAAKivC,WAAW8R,cAAct2B,IAOhC6kB,EAAK96B,UAAUwsC,cAAgB,WAC7B,IAAKhhD,KAAKivC,WACR,KAAM,IAAIzrC,OAAM,yDAGlB,OAAOxD,MAAKivC,WAAW+R,iBAQzB1R,EAAK96B,UAAUysC,gBAAkB,WAC/B,MAAOjhD,MAAKkvC,SAAWlvC,KAAKkvC,QAAQ+R,uBAetC3R,EAAK96B,UAAUud,MAAQ,SAASmvB,KAEzBA,GAAQA,EAAKn/C,QAChB/B,KAAKqvC,SAAS,QAIX6R,GAAQA,EAAKtR,SAChB5vC,KAAK2vC,UAAU,QAIZuR,GAAQA,EAAKpzC,WAChB9N,KAAK8B,WAAWqG,QAAQ,SAAUy4C,GAChCA,EAAUlqB,WAAWkqB,EAAUhT,kBAGjC5tC,KAAK02B,WAAW12B,KAAK4tC,kBAOzB0B,EAAK96B,UAAUi7B,IAAM,WAEnB,GAAI0R,GAAYnhD,KAAKkwC,eAGjBphC,EAAQqyC,EAAU91C,IAClBgW,EAAM8/B,EAAUr0C,GACpB,IAAa,MAATgC,GAAwB,MAAPuS,EAAa,CAChC,GAAI6qB,GAAY7qB,EAAI1a,UAAYmI,EAAMnI,SACtB,IAAZulC,IAEFA,EAAW,OAEbp9B,EAAQ,GAAI7K,MAAK6K,EAAMnI,UAAuB,IAAXulC,GACnC7qB,EAAM,GAAIpd,MAAKod,EAAI1a,UAAuB,IAAXulC,IAInB,OAAVp9B,GAA0B,OAARuS,IAItBrhB,KAAKkO,MAAM++B,SAASn+B,EAAOuS,IAiB7BiuB,EAAK96B,UAAUk7B,UAAY,SAAS5gC,EAAOuS,GACzC,GAAwB,GAApBhc,UAAUC,OAAa,CACzB,GAAI4I,GAAQ7I,UAAU,EACtBrF,MAAKkO,MAAM++B,SAAS/+B,EAAMY,MAAOZ,EAAMmT,SAGvCrhB,MAAKkO,MAAM++B,SAASn+B,EAAOuS,IAQ/BiuB,EAAK96B,UAAU4sC,UAAY,WACzB,GAAIlzC,GAAQlO,KAAKkO,MAAMuwC,UACvB,QACE3vC,MAAO,GAAI7K,MAAKiK,EAAMY,OACtBuS,IAAK,GAAIpd,MAAKiK,EAAMmT,OAQxBiuB,EAAK96B,UAAU2mB,OAAS,WACtB,GAAIkkB,IAAU,EACZvxC,EAAU9N,KAAK8N,QACfnI,EAAQ3F,KAAK2F,MACbijC,EAAM5oC,KAAK4oC,GAEb,IAAKA,EAAL,CAG2B,OAAvB96B,EAAQggC,aACVntC,EAAK+G,aAAakhC,EAAIlpC,KAAM,OAC5BiB,EAAKqH,gBAAgB4gC,EAAIlpC,KAAM,YAG/BiB,EAAKqH,gBAAgB4gC,EAAIlpC,KAAM,OAC/BiB,EAAK+G,aAAakhC,EAAIlpC,KAAM,WAI9BkpC,EAAIlpC,KAAKyuB,MAAM4f,UAAYptC,EAAKgJ,OAAOK,OAAO8D,EAAQigC,UAAW,IACjEnF,EAAIlpC,KAAKyuB,MAAM6f,UAAYrtC,EAAKgJ,OAAOK,OAAO8D,EAAQkgC,UAAW,IACjEpF,EAAIlpC,KAAKyuB,MAAMI,MAAQ5tB,EAAKgJ,OAAOK,OAAO8D,EAAQygB,MAAO,IAGzD5oB,EAAMgG,OAAOvE,MAAUwhC,EAAI+W,gBAAgB1W,YAAcL,EAAI+W,gBAAgBzmB,aAAe,EAC5FvzB,EAAMgG,OAAOg1B,MAASh7B,EAAMgG,OAAOvE,KACnCzB,EAAMgG,OAAOnE,KAAUohC,EAAI+W,gBAAgBxW,aAAeP,EAAI+W,gBAAgBthB,cAAgB,EAC9F14B,EAAMgG,OAAOoxB,OAASp3B,EAAMgG,OAAOnE,GACnC,IAAI65C,GAAkBzY,EAAIlpC,KAAKypC,aAAeP,EAAIlpC,KAAK2+B,aACnDijB,EAAkB1Y,EAAIlpC,KAAKupC,YAAcL,EAAIlpC,KAAKw5B,WAItDvzB,GAAMo/B,OAAOvW,OAASoa,EAAI7D,OAAOoE,aACjCxjC,EAAMyB,KAAKonB,OAAWoa,EAAIxhC,KAAK+hC,aAC/BxjC,EAAMg7B,MAAMnS,OAAUoa,EAAIjI,MAAMwI,aAChCxjC,EAAM6B,IAAIgnB,OAAYoa,EAAIphC,IAAI62B,eAAoB14B,EAAMgG,OAAOnE,IAC/D7B,EAAMo3B,OAAOvO,OAASoa,EAAI7L,OAAOsB,eAAiB14B,EAAMgG,OAAOoxB,MAM/D,IAAImM,GAAgBrkC,KAAKiI,IAAInH,EAAMyB,KAAKonB,OAAQ7oB,EAAMo/B,OAAOvW,OAAQ7oB,EAAMg7B,MAAMnS,QAC7E+yB,EAAa57C,EAAM6B,IAAIgnB,OAAS0a,EAAgBvjC,EAAMo3B,OAAOvO,OAC/D6yB,EAAmB17C,EAAMgG,OAAOnE,IAAM7B,EAAMgG,OAAOoxB,MACrD6L;EAAIlpC,KAAKyuB,MAAMK,OAAS7tB,EAAKgJ,OAAOK,OAAO8D,EAAQ0gB,OAAQ+yB,EAAa,MAGxE57C,EAAMjG,KAAK8uB,OAASoa,EAAIlpC,KAAKypC,aAC7BxjC,EAAM+F,WAAW8iB,OAAS7oB,EAAMjG,KAAK8uB,OAAS6yB,CAC9C,IAAIG,GAAkB77C,EAAMjG,KAAK8uB,OAAS7oB,EAAM6B,IAAIgnB,OAAS7oB,EAAMo3B,OAAOvO,OACxE6yB,CACF17C,GAAMg6C,gBAAgBnxB,OAAUgzB,EAChC77C,EAAMi6C,cAAcpxB,OAAYgzB,EAChC77C,EAAMk6C,eAAerxB,OAAW7oB,EAAMi6C,cAAcpxB,OAGpD7oB,EAAMjG,KAAK6uB,MAAQqa,EAAIlpC,KAAKupC,YAC5BtjC,EAAM+F,WAAW6iB,MAAQ5oB,EAAMjG,KAAK6uB,MAAQ+yB,EAC5C37C,EAAMyB,KAAKmnB,MAAQqa,EAAIgX,cAAc1mB,cAAkBvzB,EAAMgG,OAAOvE,KACpEzB,EAAMi6C,cAAcrxB,MAAQ5oB,EAAMyB,KAAKmnB,MACvC5oB,EAAMg7B,MAAMpS,MAAQqa,EAAIiX,eAAe3mB,cAAgBvzB,EAAMgG,OAAOg1B,MACpEh7B,EAAMk6C,eAAetxB,MAAQ5oB,EAAMg7B,MAAMpS,KACzC,IAAIkzB,GAAc97C,EAAMjG,KAAK6uB,MAAQ5oB,EAAMyB,KAAKmnB,MAAQ5oB,EAAMg7B,MAAMpS,MAAQ+yB,CAC5E37C,GAAMo/B,OAAOxW,MAAiBkzB,EAC9B97C,EAAMg6C,gBAAgBpxB,MAAQkzB,EAC9B97C,EAAM6B,IAAI+mB,MAAoBkzB,EAC9B97C,EAAMo3B,OAAOxO,MAAiBkzB,EAG9B7Y,EAAIl9B,WAAWyiB,MAAMK,OAAmB7oB,EAAM+F,WAAW8iB,OAAS,KAClEoa,EAAI6W,mBAAmBtxB,MAAMK,OAAW7oB,EAAM+F,WAAW8iB,OAAS,KAClEoa,EAAI8W,qBAAqBvxB,MAAMK,OAAS7oB,EAAMg6C,gBAAgBnxB,OAAS,KACvEoa,EAAI+W,gBAAgBxxB,MAAMK,OAAc7oB,EAAMg6C,gBAAgBnxB,OAAS,KACvEoa,EAAIgX,cAAczxB,MAAMK,OAAgB7oB,EAAMi6C,cAAcpxB,OAAS,KACrEoa,EAAIiX,eAAe1xB,MAAMK,OAAe7oB,EAAMk6C,eAAerxB,OAAS,KAEtEoa,EAAIl9B,WAAWyiB,MAAMI,MAAmB5oB,EAAM+F,WAAW6iB,MAAQ,KACjEqa,EAAI6W,mBAAmBtxB,MAAMI,MAAW5oB,EAAMg6C,gBAAgBpxB,MAAQ,KACtEqa,EAAI8W,qBAAqBvxB,MAAMI,MAAS5oB,EAAM+F,WAAW6iB,MAAQ,KACjEqa,EAAI+W,gBAAgBxxB,MAAMI,MAAc5oB,EAAMo/B,OAAOxW,MAAQ,KAC7Dqa,EAAIphC,IAAI2mB,MAAMI,MAA0B5oB,EAAM6B,IAAI+mB,MAAQ,KAC1Dqa,EAAI7L,OAAO5O,MAAMI,MAAuB5oB,EAAMo3B,OAAOxO,MAAQ,KAG7Dqa,EAAIl9B,WAAWyiB,MAAM/mB,KAAiB,IACtCwhC,EAAIl9B,WAAWyiB,MAAM3mB,IAAiB,IACtCohC,EAAI6W,mBAAmBtxB,MAAM/mB,KAASzB,EAAMyB,KAAKmnB,MAAQ,KACzDqa,EAAI6W,mBAAmBtxB,MAAM3mB,IAAS,IACtCohC,EAAI8W,qBAAqBvxB,MAAM/mB,KAAO,IACtCwhC,EAAI8W,qBAAqBvxB,MAAM3mB,IAAO7B,EAAM6B,IAAIgnB,OAAS,KACzDoa,EAAI+W,gBAAgBxxB,MAAM/mB,KAAYzB,EAAMyB,KAAKmnB,MAAQ,KACzDqa,EAAI+W,gBAAgBxxB,MAAM3mB,IAAY7B,EAAM6B,IAAIgnB,OAAS,KACzDoa,EAAIgX,cAAczxB,MAAM/mB,KAAc,IACtCwhC,EAAIgX,cAAczxB,MAAM3mB,IAAc7B,EAAM6B,IAAIgnB,OAAS,KACzDoa,EAAIiX,eAAe1xB,MAAM/mB,KAAczB,EAAMyB,KAAKmnB,MAAQ5oB,EAAMo/B,OAAOxW,MAAS,KAChFqa,EAAIiX,eAAe1xB,MAAM3mB,IAAa7B,EAAM6B,IAAIgnB,OAAS,KACzDoa,EAAIphC,IAAI2mB,MAAM/mB,KAAwBzB,EAAMyB,KAAKmnB,MAAQ,KACzDqa,EAAIphC,IAAI2mB,MAAM3mB,IAAwB,IACtCohC,EAAI7L,OAAO5O,MAAM/mB,KAAqBzB,EAAMyB,KAAKmnB,MAAQ,KACzDqa,EAAI7L,OAAO5O,MAAM3mB,IAAsB7B,EAAM6B,IAAIgnB,OAAS7oB,EAAMg6C,gBAAgBnxB,OAAU,KAI1FxuB,KAAK0hD,kBAGL,IAAIv2B,GAASnrB,KAAK2F,MAAM46C,SACG,WAAvBzyC,EAAQggC,cACV3iB,GAAUtmB,KAAKiI,IAAI9M,KAAK2F,MAAMg6C,gBAAgBnxB,OAASxuB,KAAK2F,MAAMo/B,OAAOvW,OACvExuB,KAAK2F,MAAMgG,OAAOnE,IAAMxH,KAAK2F,MAAMgG,OAAOoxB,OAAQ,IAEtD6L,EAAI7D,OAAO5W,MAAM/mB,KAAO,IACxBwhC,EAAI7D,OAAO5W,MAAM3mB,IAAO2jB,EAAS,KACjCyd,EAAIxhC,KAAK+mB,MAAM/mB,KAAS,IACxBwhC,EAAIxhC,KAAK+mB,MAAM3mB,IAAS2jB,EAAS,KACjCyd,EAAIjI,MAAMxS,MAAM/mB,KAAQ,IACxBwhC,EAAIjI,MAAMxS,MAAM3mB,IAAQ2jB,EAAS,IAGjC,IAAIw2B,GAAwC,GAAxB3hD,KAAK2F,MAAM46C,UAAiB,SAAW,GACvDqB,EAAmB5hD,KAAK2F,MAAM46C,WAAavgD,KAAK2F,MAAM66C,aAAe,SAAW,EACpF5X,GAAIkX,UAAU3xB,MAAM0zB,WAAsBF,EAC1C/Y,EAAImX,aAAa5xB,MAAM0zB,WAAmBD,EAC1ChZ,EAAIoX,cAAc7xB,MAAM0zB,WAAkBF,EAC1C/Y,EAAIqX,iBAAiB9xB,MAAM0zB,WAAeD,EAC1ChZ,EAAIsX,eAAe/xB,MAAM0zB,WAAiBF,EAC1C/Y,EAAIuX,kBAAkBhyB,MAAM0zB,WAAcD,EAG1C5hD,KAAK8B,WAAWqG,QAAQ,SAAUy4C,GAChCvB,EAAUuB,EAAUzlB,UAAYkkB,IAE9BA,GAEFr/C,KAAKm7B,WAKTmU,EAAK96B,UAAUstC,QAAU,WACvB,KAAM,IAAIt+C,OAAM,wDAUlB8rC,EAAK96B,UAAUo6B,QAAU,SAAS7gB,GAChC,GAAI2wB,GAAa1+C,KAAKkO,MAAMwwC,WAAW1+C,KAAK2F,MAAMo/B,OAAOxW,MACzD,OAAO,IAAItqB,MAAK8pB,EAAI2wB,EAAW7nB,MAAQ6nB,EAAWvzB,SAWpDmkB,EAAK96B,UAAUs6B,cAAgB,SAAS/gB,GACtC,GAAI2wB,GAAa1+C,KAAKkO,MAAMwwC,WAAW1+C,KAAK2F,MAAMjG,KAAK6uB,MACvD,OAAO,IAAItqB,MAAK8pB,EAAI2wB,EAAW7nB,MAAQ6nB,EAAWvzB,SAWpDmkB,EAAK96B,UAAUg6B,UAAY,SAAS/jB,GAClC,GAAIi0B,GAAa1+C,KAAKkO,MAAMwwC,WAAW1+C,KAAK2F,MAAMo/B,OAAOxW,MACzD,QAAQ9D,EAAK9jB,UAAY+3C,EAAWvzB,QAAUuzB,EAAW7nB,OAa3DyY,EAAK96B,UAAUk6B,gBAAkB,SAASjkB,GACxC,GAAIi0B,GAAa1+C,KAAKkO,MAAMwwC,WAAW1+C,KAAK2F,MAAMjG,KAAK6uB,MACvD,QAAQ9D,EAAK9jB,UAAY+3C,EAAWvzB,QAAUuzB,EAAW7nB,OAQ3DyY,EAAK96B,UAAUmsC,gBAAkB,WACA,GAA3B3gD,KAAK8N,QAAQ+/B,WACf7tC,KAAK+hD,mBAGL/hD,KAAK8gD,mBASTxR,EAAK96B,UAAUutC,iBAAmB,WAChC,GAAIpyB,GAAK3vB,IAETA,MAAK8gD,kBAEL9gD,KAAKgiD,UAAY,WACf,MAA6B,IAAzBryB,EAAG7hB,QAAQ+/B,eAEble,GAAGmxB,uBAIDnxB,EAAGiZ,IAAIlpC,OAEJiwB,EAAGiZ,IAAIlpC,KAAKw5B,aAAevJ,EAAGhqB,MAAMs8C,WACtCtyB,EAAGiZ,IAAIlpC,KAAK2+B,cAAgB1O,EAAGhqB,MAAMu8C,cACtCvyB,EAAGhqB,MAAMs8C,UAAYtyB,EAAGiZ,IAAIlpC,KAAKw5B,YACjCvJ,EAAGhqB,MAAMu8C,WAAavyB,EAAGiZ,IAAIlpC,KAAK2+B,aAElC1O,EAAG8W,KAAK,aAMd9lC,EAAK8H,iBAAiBpB,OAAQ,SAAUrH,KAAKgiD,WAE7ChiD,KAAKmiD,WAAaC,YAAYpiD,KAAKgiD,UAAW,MAOhD1S,EAAK96B,UAAUssC,gBAAkB,WAC3B9gD,KAAKmiD,aACPhW,cAAcnsC,KAAKmiD,YACnBniD,KAAKmiD,WAAah8C,QAIpBxF,EAAKsI,oBAAoB5B,OAAQ,SAAUrH,KAAKgiD,WAChDhiD,KAAKgiD,UAAY,MAQnB1S,EAAK96B,UAAUwpC,SAAW,WACxBh+C,KAAKo0C,MAAMuK,eAAgB,GAQ7BrP,EAAK96B,UAAUypC,SAAW,WACxBj+C,KAAKo0C,MAAMuK,eAAgB,GAQ7BrP,EAAK96B,UAAUmpC,aAAe,WAC5B39C,KAAKo0C,MAAMiO,iBAAmBriD,KAAK2F,MAAM46C,WAQ3CjR,EAAK96B,UAAUopC,QAAU,SAAUx0C,GAGjC,GAAKpJ,KAAKo0C,MAAMuK,cAAhB,CAEA,GAAInX,GAAQp+B,EAAM2nC,QAAQyD,OAEtB8N,EAAetiD,KAAKuiD,gBACpBC,EAAexiD,KAAKyiD,cAAcziD,KAAKo0C,MAAMiO,iBAAmB7a,EAEhEgb,IAAgBF,GAClBtiD,KAAKm7B,WAUTmU,EAAK96B,UAAUiuC,cAAgB,SAAUlC,GAGvC,MAFAvgD,MAAK2F,MAAM46C,UAAYA,EACvBvgD,KAAK0hD,mBACE1hD,KAAK2F,MAAM46C,WAQpBjR,EAAK96B,UAAUktC,iBAAmB,WAEhC,GAAIlB,GAAe37C,KAAKwG,IAAIrL,KAAK2F,MAAMg6C,gBAAgBnxB,OAASxuB,KAAK2F,MAAMo/B,OAAOvW,OAAQ,EAc1F,OAbIgyB,IAAgBxgD,KAAK2F,MAAM66C,eAGG,UAA5BxgD,KAAK8N,QAAQggC,cACf9tC,KAAK2F,MAAM46C,WAAcC,EAAexgD,KAAK2F,MAAM66C,cAErDxgD,KAAK2F,MAAM66C,aAAeA,GAIxBxgD,KAAK2F,MAAM46C,UAAY,IAAGvgD,KAAK2F,MAAM46C,UAAY,GACjDvgD,KAAK2F,MAAM46C,UAAYC,IAAcxgD,KAAK2F,MAAM46C,UAAYC,GAEzDxgD,KAAK2F,MAAM46C,WAQpBjR,EAAK96B,UAAU+tC,cAAgB,WAC7B,MAAOviD,MAAK2F,MAAM46C,WAGpB1gD,EAAOD,QAAU0vC,GAKb,SAASzvC,EAAQD,EAASM,GAe9B,QAAS2C,GAAUqrC,EAAMpgC,GACvB9N,KAAK4oC,KACH8Z,WAAY,KACZC,cACAC,cACAC,cACAC,cACA71B,WACE01B,cACAC,cACAC,cACAC,gBAGJ9iD,KAAK2F,OACHuI,OACEY,MAAO,EACPuS,IAAK,EACL0hC,YAAa,GAEfC,QAAS,GAGXhjD,KAAK4tC,gBACHE,YAAa,SAEbmV,iBAAiB,EACjBC,iBAAiB,GAEnBljD,KAAK8N,QAAUnN,EAAKsE,UAAWjF,KAAK4tC,gBAEpC5tC,KAAKkuC,KAAOA,EAGZluC,KAAKiuC,UAELjuC,KAAK02B,WAAW5oB,GAjDlB,GAAInN,GAAOT,EAAoB,GAC3BkC,EAAYlC,EAAoB,IAChC2B,EAAW3B,EAAoB,IAC/BuD,EAASvD,EAAoB,EAiDjC2C,GAAS2R,UAAY,GAAIpS,GAUzBS,EAAS2R,UAAUkiB,WAAa,SAAS5oB,GACnCA,IAEFnN,EAAK+E,iBAAiB,cAAe,kBAAmB,mBAAoB1F,KAAK8N,QAASA,GAItF,UAAYA,KACe,kBAAlBrK,GAAO0/C,OAEhB1/C,EAAO0/C,OAAOr1C,EAAQq1C,QAGtB1/C,EAAOyN,KAAKpD,EAAQq1C,WAS5BtgD,EAAS2R,UAAUy5B,QAAU,WAC3BjuC,KAAK4oC,IAAI8Z,WAAal1B,SAASK,cAAc,OAC7C7tB,KAAK4oC,IAAIl9B,WAAa8hB,SAASK,cAAc,OAE7C7tB,KAAK4oC,IAAI8Z,WAAW/6C,UAAY,sBAChC3H,KAAK4oC,IAAIl9B,WAAW/D,UAAY,uBAMlC9E,EAAS2R,UAAU2qC,QAAU,WAEvBn/C,KAAK4oC,IAAI8Z,WAAWh5C,YACtB1J,KAAK4oC,IAAI8Z,WAAWh5C,WAAW0jB,YAAYptB,KAAK4oC,IAAI8Z,YAElD1iD,KAAK4oC,IAAIl9B,WAAWhC,YACtB1J,KAAK4oC,IAAIl9B,WAAWhC,WAAW0jB,YAAYptB,KAAK4oC,IAAIl9B,YAGtD1L,KAAKkuC,KAAO,MAOdrrC,EAAS2R,UAAU2mB,OAAS,WAC1B,GAAIrtB,GAAU9N,KAAK8N,QACfnI,EAAQ3F,KAAK2F,MACb+8C,EAAa1iD,KAAK4oC,IAAI8Z,WACtBh3C,EAAa1L,KAAK4oC,IAAIl9B,WAGtBqoC,EAAiC,OAAvBjmC,EAAQggC,YAAwB9tC,KAAKkuC,KAAKtF,IAAIphC,IAAMxH,KAAKkuC,KAAKtF,IAAI7L,OAC5EqmB,EAAiBV,EAAWh5C,aAAeqqC,CAG/C/zC,MAAKqjD,oBAGL,IACIJ,IADcjjD,KAAK8N,QAAQggC,YACT9tC,KAAK8N,QAAQm1C,iBAC/BC,EAAkBljD,KAAK8N,QAAQo1C,eAGnCv9C,GAAM29C,iBAAmBL,EAAkBt9C,EAAM49C,gBAAkB,EACnE59C,EAAM69C,iBAAmBN,EAAkBv9C,EAAM89C,gBAAkB,EACnE99C,EAAM6oB,OAAS7oB,EAAM29C,iBAAmB39C,EAAM69C,iBAC9C79C,EAAM4oB,MAAQm0B,EAAWzZ,YAEzBtjC,EAAM+9C,gBAAkB1jD,KAAKkuC,KAAKC,SAASzuC,KAAK8uB,OAAS7oB,EAAM69C,kBACnC,OAAvB11C,EAAQggC,YAAuB9tC,KAAKkuC,KAAKC,SAASpR,OAAOvO,OAASxuB,KAAKkuC,KAAKC,SAAS3mC,IAAIgnB,QAC9F7oB,EAAMg+C,eAAiB,EACvBh+C,EAAMi+C,gBAAkBj+C,EAAM+9C,gBAAkB/9C,EAAM69C,iBACtD79C,EAAMk+C,eAAiB,CAGvB,IAAIC,GAAwBpB,EAAWqB,YACnCC,EAAwBt4C,EAAWq4C,WAsBvC,OArBArB,GAAWh5C,YAAcg5C,EAAWh5C,WAAW0jB,YAAYs1B,GAC3Dh3C,EAAWhC,YAAcgC,EAAWhC,WAAW0jB,YAAY1hB,GAE3Dg3C,EAAWv0B,MAAMK,OAASxuB,KAAK2F,MAAM6oB,OAAS,KAE9CxuB,KAAKikD,iBAGDH,EACF/P,EAAOmQ,aAAaxB,EAAYoB,GAGhC/P,EAAOrmB,YAAYg1B,GAEjBsB,EACFhkD,KAAKkuC,KAAKtF,IAAI6W,mBAAmByE,aAAax4C,EAAYs4C,GAG1DhkD,KAAKkuC,KAAKtF,IAAI6W,mBAAmB/xB,YAAYhiB,GAGxC1L,KAAKo/C,cAAgBgE,GAO9BvgD,EAAS2R,UAAUyvC,eAAiB,WAClC,GAAInW,GAAc9tC,KAAK8N,QAAQggC,YAG3Bh/B,EAAQnO,EAAK6F,QAAQxG,KAAKkuC,KAAKhgC,MAAMY,MAAO,UAC5CuS,EAAM1gB,EAAK6F,QAAQxG,KAAKkuC,KAAKhgC,MAAMmT,IAAK,UACxC0hC,EAAc/iD,KAAKkuC,KAAKvtC,KAAKguC,OAA2C,GAAnC3uC,KAAK2F,MAAMw+C,gBAAkB,KAASx9C,UACtE3G,KAAKkuC,KAAKvtC,KAAKguC,OAAO,GAAGhoC,UAC9B86B,EAAO,GAAI5/B,GAAS,GAAIoC,MAAK6K,GAAQ,GAAI7K,MAAKod,GAAM0hC,EACxD/iD,MAAKyhC,KAAOA,CAKZ,IAAImH,GAAM5oC,KAAK4oC,GACfA,GAAI3b,UAAU01B,WAAa/Z,EAAI+Z,WAC/B/Z,EAAI3b,UAAU21B,WAAaha,EAAIga,WAC/Bha,EAAI3b,UAAU41B,WAAaja,EAAIia,WAC/Bja,EAAI3b,UAAU61B,WAAala,EAAIka,WAC/Bla,EAAI+Z,cACJ/Z,EAAIga,cACJha,EAAIia,cACJja,EAAIka,cAEJrhB,EAAK2iB,OAGL,KAFA,GAAIC,GAAmBl+C,OACnB2G,EAAM,EACH20B,EAAK6iB,WAAmB,IAANx3C,GAAY,CACnCA,GACA,IAAIwsC,GAAM7X,EAAKC,aACX3T,EAAI/tB,KAAKkuC,KAAKvtC,KAAK4tC,SAAS+K,GAC5BiL,EAAU9iB,EAAK8iB,SAIfvkD,MAAK8N,QAAQm1C,iBACfjjD,KAAKwkD,kBAAkBz2B,EAAG0T,EAAKgjB,gBAAiB3W,GAG9CyW,GAAWvkD,KAAK8N,QAAQo1C,iBACtBn1B,EAAI,IACkB5nB,QAApBk+C,IACFA,EAAmBt2B,GAErB/tB,KAAK0kD,kBAAkB32B,EAAG0T,EAAKkjB,gBAAiB7W,IAElD9tC,KAAK4kD,kBAAkB72B,EAAG+f,IAG1B9tC,KAAK6kD,kBAAkB92B,EAAG+f,GAG5BrM,EAAKhpB,OAIP,GAAIzY,KAAK8N,QAAQo1C,gBAAiB,CAChC,GAAI4B,GAAW9kD,KAAKkuC,KAAKvtC,KAAKguC,OAAO,GACjCoW,EAAWtjB,EAAKkjB,cAAcG,GAC9BE,EAAYD,EAASz/C,QAAUtF,KAAK2F,MAAMs/C,gBAAkB,IAAM,IAE9C9+C,QAApBk+C,GAA6CA,EAAZW,IACnChlD,KAAK0kD,kBAAkB,EAAGK,EAAUjX,GAKxCntC,EAAKwH,QAAQnI,KAAK4oC,IAAI3b,UAAW,SAAUi4B,GACzC,KAAOA,EAAI5/C,QAAQ,CACjB,GAAI4B,GAAOg+C,EAAI3+B,KACXrf,IAAQA,EAAKwC,YACfxC,EAAKwC,WAAW0jB,YAAYlmB,OAapCrE,EAAS2R,UAAUgwC,kBAAoB,SAAUz2B,EAAG4U,EAAMmL,GAExD,GAAIhM,GAAQ9hC,KAAK4oC,IAAI3b,UAAU61B,WAAWv1B,OAE1C,KAAKuU,EAAO,CAEV,GAAI2G,GAAUjb,SAAS23B,eAAe,GACtCrjB,GAAQtU,SAASK,cAAc,OAC/BiU,EAAMpU,YAAY+a,GAClB3G,EAAMn6B,UAAY,aAClB3H,KAAK4oC,IAAI8Z,WAAWh1B,YAAYoU,GAElC9hC,KAAK4oC,IAAIka,WAAWh7C,KAAKg6B,GAEzBA,EAAMsjB,WAAW,GAAGC,UAAY1iB,EAEhCb,EAAM3T,MAAM3mB,IAAsB,OAAfsmC,EAAyB9tC,KAAK2F,MAAM69C,iBAAmB,KAAQ,IAClF1hB,EAAM3T,MAAM/mB,KAAO2mB,EAAI,MAWzBlrB,EAAS2R,UAAUkwC,kBAAoB,SAAU32B,EAAG4U,EAAMmL,GAExD,GAAIhM,GAAQ9hC,KAAK4oC,IAAI3b,UAAU21B,WAAWr1B,OAE1C,KAAKuU,EAAO,CAEV,GAAI2G,GAAUjb,SAAS23B,eAAexiB,EACtCb,GAAQtU,SAASK,cAAc,OAC/BiU,EAAMn6B,UAAY,aAClBm6B,EAAMpU,YAAY+a,GAClBzoC,KAAK4oC,IAAI8Z,WAAWh1B,YAAYoU,GAElC9hC,KAAK4oC,IAAIga,WAAW96C,KAAKg6B,GAEzBA,EAAMsjB,WAAW,GAAGC,UAAY1iB,EAGhCb,EAAM3T,MAAM3mB,IAAsB,OAAfsmC,EAAwB,IAAO9tC,KAAK2F,MAAM29C,iBAAoB,KACjFxhB,EAAM3T,MAAM/mB,KAAO2mB,EAAI,MASzBlrB,EAAS2R,UAAUqwC,kBAAoB,SAAU92B,EAAG+f,GAElD,GAAIpF,GAAO1oC,KAAK4oC,IAAI3b,UAAU41B,WAAWt1B,OAEpCmb,KAEHA,EAAOlb,SAASK,cAAc,OAC9B6a,EAAK/gC,UAAY,sBACjB3H,KAAK4oC,IAAIl9B,WAAWgiB,YAAYgb,IAElC1oC,KAAK4oC,IAAIia,WAAW/6C,KAAK4gC,EAEzB,IAAI/iC,GAAQ3F,KAAK2F,KAEf+iC,GAAKva,MAAM3mB,IADM,OAAfsmC,EACenoC,EAAM69C,iBAAmB,KAGzBxjD,KAAKkuC,KAAKC,SAAS3mC,IAAIgnB,OAAS,KAEnDka,EAAKva,MAAMK,OAAS7oB,EAAM+9C,gBAAkB,KAC5Chb,EAAKva,MAAM/mB,KAAQ2mB,EAAIpoB,EAAMg+C,eAAiB,EAAK,MASrD9gD,EAAS2R,UAAUowC,kBAAoB,SAAU72B,EAAG+f,GAElD,GAAIpF,GAAO1oC,KAAK4oC,IAAI3b,UAAU01B,WAAWp1B,OAEpCmb,KAEHA,EAAOlb,SAASK,cAAc,OAC9B6a,EAAK/gC,UAAY,sBACjB3H,KAAK4oC,IAAIl9B,WAAWgiB,YAAYgb,IAElC1oC,KAAK4oC,IAAI+Z,WAAW76C,KAAK4gC,EAEzB,IAAI/iC,GAAQ3F,KAAK2F,KAEf+iC,GAAKva,MAAM3mB,IADM,OAAfsmC,EACe,IAGA9tC,KAAKkuC,KAAKC,SAAS3mC,IAAIgnB,OAAS,KAEnDka,EAAKva,MAAM/mB,KAAQ2mB,EAAIpoB,EAAMk+C,eAAiB,EAAK,KACnDnb,EAAKva,MAAMK,OAAS7oB,EAAMi+C,gBAAkB,MAQ9C/gD,EAAS2R,UAAU6uC,mBAAqB,WAKjCrjD,KAAK4oC,IAAI0c,mBACZtlD,KAAK4oC,IAAI0c,iBAAmB93B,SAASK,cAAc,OACnD7tB,KAAK4oC,IAAI0c,iBAAiB39C,UAAY,qBACtC3H,KAAK4oC,IAAI0c,iBAAiBn3B,MAAMkP,SAAW,WAE3Cr9B,KAAK4oC,IAAI0c,iBAAiB53B,YAAYF,SAAS23B,eAAe,MAC9DnlD,KAAK4oC,IAAI8Z,WAAWh1B,YAAY1tB,KAAK4oC,IAAI0c,mBAE3CtlD,KAAK2F,MAAM49C,gBAAkBvjD,KAAK4oC,IAAI0c,iBAAiBjnB,aACvDr+B,KAAK2F,MAAMw+C,eAAiBnkD,KAAK4oC,IAAI0c,iBAAiBpsB,YAGjDl5B,KAAK4oC,IAAI2c,mBACZvlD,KAAK4oC,IAAI2c,iBAAmB/3B,SAASK,cAAc,OACnD7tB,KAAK4oC,IAAI2c,iBAAiB59C,UAAY,qBACtC3H,KAAK4oC,IAAI2c,iBAAiBp3B,MAAMkP,SAAW,WAE3Cr9B,KAAK4oC,IAAI2c,iBAAiB73B,YAAYF,SAAS23B,eAAe,MAC9DnlD,KAAK4oC,IAAI8Z,WAAWh1B,YAAY1tB,KAAK4oC,IAAI2c,mBAE3CvlD,KAAK2F,MAAM89C,gBAAkBzjD,KAAK4oC,IAAI2c,iBAAiBlnB,aACvDr+B,KAAK2F,MAAMs/C,eAAiBjlD,KAAK4oC,IAAI2c,iBAAiBrsB,aASxDr2B,EAAS2R,UAAU85B,KAAO,SAASlxB,GACjC,MAAOpd,MAAKyhC,KAAK6M,KAAKlxB,IAGxBvd,EAAOD,QAAUiD,GAKb,SAAShD,EAAQD,EAASM,GA8B9B,QAAS2B,GAASiN,EAAOuS,EAAK0hC,GAE5B/iD,KAAKw4C,QAAU,GAAIv0C,MACnBjE,KAAK4sC,OAAS,GAAI3oC,MAClBjE,KAAK6sC,KAAO,GAAI5oC,MAEhBjE,KAAKwlD,WAAa,EAClBxlD,KAAK62B,MAAQh1B,EAAS4jD,MAAMC,IAC5B1lD,KAAKyhC,KAAO,EAGZzhC,KAAKitC,SAASn+B,EAAOuS,EAAK0hC,GAvC5B,GAAIt/C,GAASvD,EAAoB,EA2CjC2B,GAAS4jD,OACPpuC,YAAa,EACbD,OAAQ,EACRD,OAAQ,EACRD,KAAM,EACNwuC,IAAK,EACLC,QAAS,EACT5uC,MAAO,EACPE,KAAM,GAcRpV,EAAS2S,UAAUy4B,SAAW,SAASn+B,EAAOuS,EAAK0hC,GACjD,KAAMj0C,YAAiB7K,OAAWod,YAAepd,OAC/C,KAAO,+CAGTjE,MAAK4sC,OAAmBzmC,QAAT2I,EAAsB,GAAI7K,MAAK6K,EAAMnI,WAAa,GAAI1C,MACrEjE,KAAK6sC,KAAe1mC,QAAPkb,EAAoB,GAAIpd,MAAKod,EAAI1a,WAAa,GAAI1C,MAE3DjE,KAAKwlD,WACPxlD,KAAK4lD,eAAe7C,IAOxBlhD,EAAS2S,UAAU4vC,MAAQ,WACzBpkD,KAAKw4C,QAAU,GAAIv0C,MAAKjE,KAAK4sC,OAAOjmC,WACpC3G,KAAK6lD,gBAOPhkD,EAAS2S,UAAUqxC,aAAe,WAIhC,OAAQ7lD,KAAK62B,OACX,IAAKh1B,GAAS4jD,MAAMxuC,KAClBjX,KAAKw4C,QAAQp4B,YAAYpgB,KAAKyhC,KAAO58B,KAAKC,MAAM9E,KAAKw4C,QAAQv6B,cAAgBje,KAAKyhC,OAClFzhC,KAAKw4C,QAAQsN,SAAS,EACxB,KAAKjkD,GAAS4jD,MAAM1uC,MAAc/W,KAAKw4C,QAAQuN,QAAQ,EACvD,KAAKlkD,GAAS4jD,MAAMC,IACpB,IAAK7jD,GAAS4jD,MAAME,QAAc3lD,KAAKw4C,QAAQwN,SAAS,EACxD,KAAKnkD,GAAS4jD,MAAMvuC,KAAclX,KAAKw4C,QAAQyN,WAAW,EAC1D,KAAKpkD,GAAS4jD,MAAMtuC,OAAcnX,KAAKw4C,QAAQ0N,WAAW,EAC1D,KAAKrkD,GAAS4jD,MAAMruC,OAAcpX,KAAKw4C,QAAQ2N,gBAAgB,GAIjE,GAAiB,GAAbnmD,KAAKyhC,KAEP,OAAQzhC,KAAK62B,OACX,IAAKh1B,GAAS4jD,MAAMpuC,YAAcrX,KAAKw4C,QAAQ2N,gBAAgBnmD,KAAKw4C,QAAQ4N,kBAAoBpmD,KAAKw4C,QAAQ4N,kBAAoBpmD,KAAKyhC,KAAQ,MAC9I,KAAK5/B,GAAS4jD,MAAMruC,OAAcpX,KAAKw4C,QAAQ0N,WAAWlmD,KAAKw4C,QAAQ6N,aAAermD,KAAKw4C,QAAQ6N,aAAermD,KAAKyhC,KAAO,MAC9H,KAAK5/B,GAAS4jD,MAAMtuC,OAAcnX,KAAKw4C,QAAQyN,WAAWjmD,KAAKw4C,QAAQ8N,aAAetmD,KAAKw4C,QAAQ8N,aAAetmD,KAAKyhC,KAAO,MAC9H,KAAK5/B,GAAS4jD,MAAMvuC,KAAclX,KAAKw4C,QAAQwN,SAAShmD,KAAKw4C,QAAQ+N,WAAavmD,KAAKw4C,QAAQ+N,WAAavmD,KAAKyhC,KAAO,MACxH,KAAK5/B,GAAS4jD,MAAME,QACpB,IAAK9jD,GAAS4jD,MAAMC,IAAc1lD,KAAKw4C,QAAQuN,QAAS/lD,KAAKw4C,QAAQr6B,UAAU,GAAMne,KAAKw4C,QAAQr6B,UAAU,GAAKne,KAAKyhC,KAAO,EAAI,MACjI,KAAK5/B,GAAS4jD,MAAM1uC,MAAc/W,KAAKw4C,QAAQsN,SAAS9lD,KAAKw4C,QAAQt6B,WAAale,KAAKw4C,QAAQt6B,WAAale,KAAKyhC,KAAQ,MACzH,KAAK5/B,GAAS4jD,MAAMxuC,KAAcjX,KAAKw4C,QAAQp4B,YAAYpgB,KAAKw4C,QAAQv6B,cAAgBje,KAAKw4C,QAAQv6B,cAAgBje,KAAKyhC,QAUhI5/B,EAAS2S,UAAU8vC,QAAU,WAC3B,MAAQtkD,MAAKw4C,QAAQ7xC,WAAa3G,KAAK6sC,KAAKlmC,WAM9C9E,EAAS2S,UAAUiE,KAAO,WACxB,GAAI6yB,GAAOtrC,KAAKw4C,QAAQ7xC,SAIxB,IAAI3G,KAAKw4C,QAAQt6B,WAAa,EAC5B,OAAQle,KAAK62B,OACX,IAAKh1B,GAAS4jD,MAAMpuC,YAElBrX,KAAKw4C,QAAU,GAAIv0C,MAAKjE,KAAKw4C,QAAQ7xC,UAAY3G,KAAKyhC,KAAO,MAC/D,KAAK5/B,GAAS4jD,MAAMruC,OAAcpX,KAAKw4C,QAAU,GAAIv0C,MAAKjE,KAAKw4C,QAAQ7xC,UAAwB,IAAZ3G,KAAKyhC,KAAc,MACtG,KAAK5/B,GAAS4jD,MAAMtuC,OAAcnX,KAAKw4C,QAAU,GAAIv0C,MAAKjE,KAAKw4C,QAAQ7xC,UAAwB,IAAZ3G,KAAKyhC,KAAc,GAAK,MAC3G,KAAK5/B,GAAS4jD,MAAMvuC,KAClBlX,KAAKw4C,QAAU,GAAIv0C,MAAKjE,KAAKw4C,QAAQ7xC,UAAwB,IAAZ3G,KAAKyhC,KAAc,GAAK,GAEzE,IAAIv2B,GAAIlL,KAAKw4C,QAAQ+N,UACrBvmD,MAAKw4C,QAAQwN,SAAS96C,EAAKA,EAAIlL,KAAKyhC,KACpC,MACF,KAAK5/B,GAAS4jD,MAAME,QACpB,IAAK9jD,GAAS4jD,MAAMC,IAAc1lD,KAAKw4C,QAAQuN,QAAQ/lD,KAAKw4C,QAAQr6B,UAAYne,KAAKyhC,KAAO,MAC5F,KAAK5/B,GAAS4jD,MAAM1uC,MAAc/W,KAAKw4C,QAAQsN,SAAS9lD,KAAKw4C,QAAQt6B,WAAale,KAAKyhC,KAAO,MAC9F,KAAK5/B,GAAS4jD,MAAMxuC,KAAcjX,KAAKw4C,QAAQp4B,YAAYpgB,KAAKw4C,QAAQv6B,cAAgBje,KAAKyhC,UAK/F,QAAQzhC,KAAK62B,OACX,IAAKh1B,GAAS4jD,MAAMpuC,YAAcrX,KAAKw4C,QAAU,GAAIv0C,MAAKjE,KAAKw4C,QAAQ7xC,UAAY3G,KAAKyhC,KAAO,MAC/F,KAAK5/B,GAAS4jD,MAAMruC,OAAcpX,KAAKw4C,QAAQ0N,WAAWlmD,KAAKw4C,QAAQ6N,aAAermD,KAAKyhC,KAAO,MAClG,KAAK5/B,GAAS4jD,MAAMtuC,OAAcnX,KAAKw4C,QAAQyN,WAAWjmD,KAAKw4C,QAAQ8N,aAAetmD,KAAKyhC,KAAO,MAClG,KAAK5/B,GAAS4jD,MAAMvuC,KAAclX,KAAKw4C,QAAQwN,SAAShmD,KAAKw4C,QAAQ+N,WAAavmD,KAAKyhC,KAAO,MAC9F,KAAK5/B,GAAS4jD,MAAME,QACpB,IAAK9jD,GAAS4jD,MAAMC,IAAc1lD,KAAKw4C,QAAQuN,QAAQ/lD,KAAKw4C,QAAQr6B,UAAYne,KAAKyhC,KAAO,MAC5F,KAAK5/B,GAAS4jD,MAAM1uC,MAAc/W,KAAKw4C,QAAQsN,SAAS9lD,KAAKw4C,QAAQt6B,WAAale,KAAKyhC,KAAO,MAC9F,KAAK5/B,GAAS4jD,MAAMxuC,KAAcjX,KAAKw4C,QAAQp4B,YAAYpgB,KAAKw4C,QAAQv6B,cAAgBje,KAAKyhC,MAKjG,GAAiB,GAAbzhC,KAAKyhC,KAEP,OAAQzhC,KAAK62B,OACX,IAAKh1B,GAAS4jD,MAAMpuC,YAAiBrX,KAAKw4C,QAAQ4N,kBAAoBpmD,KAAKyhC,MAAMzhC,KAAKw4C,QAAQ2N,gBAAgB,EAAK,MACnH,KAAKtkD,GAAS4jD,MAAMruC,OAAiBpX,KAAKw4C,QAAQ6N,aAAermD,KAAKyhC,MAAMzhC,KAAKw4C,QAAQ0N,WAAW,EAAK,MACzG,KAAKrkD,GAAS4jD,MAAMtuC,OAAiBnX,KAAKw4C,QAAQ8N,aAAetmD,KAAKyhC,MAAMzhC,KAAKw4C,QAAQyN,WAAW,EAAK,MACzG,KAAKpkD,GAAS4jD,MAAMvuC,KAAiBlX,KAAKw4C,QAAQ+N,WAAavmD,KAAKyhC,MAAMzhC,KAAKw4C,QAAQwN,SAAS,EAAK,MACrG,KAAKnkD,GAAS4jD,MAAME,QACpB,IAAK9jD,GAAS4jD,MAAMC,IAAiB1lD,KAAKw4C,QAAQr6B,UAAYne,KAAKyhC,KAAK,GAAGzhC,KAAKw4C,QAAQuN,QAAQ,EAAI,MACpG,KAAKlkD,GAAS4jD,MAAM1uC,MAAiB/W,KAAKw4C,QAAQt6B,WAAale,KAAKyhC,MAAMzhC,KAAKw4C,QAAQsN,SAAS,EAAK,MACrG,KAAKjkD,GAAS4jD,MAAMxuC,MAMpBjX,KAAKw4C,QAAQ7xC,WAAa2kC,IAC5BtrC,KAAKw4C,QAAU,GAAIv0C,MAAKjE,KAAK6sC,KAAKlmC,aAStC9E,EAAS2S,UAAUktB,WAAa,WAC9B,MAAO1hC,MAAKw4C,SAgBd32C,EAAS2S,UAAUgyC,SAAW,SAASC,EAAUC,GAC/C1mD,KAAK62B,MAAQ4vB,EAETC,EAAU,IACZ1mD,KAAKyhC,KAAOilB,GAGd1mD,KAAKwlD,WAAY,GAOnB3jD,EAAS2S,UAAUmyC,aAAe,SAAUnM,GAC1Cx6C,KAAKwlD,UAAYhL,GAQnB34C,EAAS2S,UAAUoxC,eAAiB,SAAS7C,GAC3C,GAAmB58C,QAAf48C,EAAJ,CAIA,GAAI6D,GAAiB,QACjBC,EAAiB,OACjBC,EAAiB,MACjBC,EAAiB,KACjBC,EAAiB,IACjBC,EAAiB,IACjBC,EAAiB,CAGR,KAATN,EAAgB7D,IAAqB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMxuC,KAAajX,KAAKyhC,KAAO,KACjF,IAATmlB,EAAe7D,IAAsB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMxuC,KAAajX,KAAKyhC,KAAO,KACjF,IAATmlB,EAAe7D,IAAsB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMxuC,KAAajX,KAAKyhC,KAAO,KACjF,GAATmlB,EAAc7D,IAAuB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMxuC,KAAajX,KAAKyhC,KAAO,IACjF,GAATmlB,EAAc7D,IAAuB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMxuC,KAAajX,KAAKyhC,KAAO,IACjF,EAATmlB,EAAa7D,IAAwB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMxuC,KAAajX,KAAKyhC,KAAO,GAC1FmlB,EAAW7D,IAA0B/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMxuC,KAAajX,KAAKyhC,KAAO,GAChF,EAAVolB,EAAc9D,IAAuB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAM1uC,MAAa/W,KAAKyhC,KAAO,GAC1FolB,EAAY9D,IAAyB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAM1uC,MAAa/W,KAAKyhC,KAAO,GAClF,EAARqlB,EAAY/D,IAAyB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMC,IAAa1lD,KAAKyhC,KAAO,GAClF,EAARqlB,EAAY/D,IAAyB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMC,IAAa1lD,KAAKyhC,KAAO,GAC1FqlB,EAAU/D,IAA2B/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMC,IAAa1lD,KAAKyhC,KAAO,GAC1FqlB,EAAQ,EAAI/D,IAAyB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAME,QAAa3lD,KAAKyhC,KAAO,GACjF,EAATslB,EAAahE,IAAwB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMvuC,KAAalX,KAAKyhC,KAAO,GAC1FslB,EAAWhE,IAA0B/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMvuC,KAAalX,KAAKyhC,KAAO,GAC/E,GAAXulB,EAAgBjE,IAAqB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMtuC,OAAanX,KAAKyhC,KAAO,IAC/E,GAAXulB,EAAgBjE,IAAqB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMtuC,OAAanX,KAAKyhC,KAAO,IAC/E,EAAXulB,EAAejE,IAAsB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMtuC,OAAanX,KAAKyhC,KAAO,GAC1FulB,EAAajE,IAAwB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMtuC,OAAanX,KAAKyhC,KAAO,GAC/E,GAAXwlB,EAAgBlE,IAAqB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMruC,OAAapX,KAAKyhC,KAAO,IAC/E,GAAXwlB,EAAgBlE,IAAqB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMruC,OAAapX,KAAKyhC,KAAO,IAC/E,EAAXwlB,EAAelE,IAAsB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMruC,OAAapX,KAAKyhC,KAAO,GAC1FwlB,EAAalE,IAAwB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMruC,OAAapX,KAAKyhC,KAAO,GAC1E,IAAhBylB,EAAsBnE,IAAe/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMpuC,YAAarX,KAAKyhC,KAAO,KAC1E,IAAhBylB,EAAsBnE,IAAe/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMpuC,YAAarX,KAAKyhC,KAAO,KAC1E,GAAhBylB,EAAqBnE,IAAgB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMpuC,YAAarX,KAAKyhC,KAAO,IAC1E,GAAhBylB,EAAqBnE,IAAgB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMpuC,YAAarX,KAAKyhC,KAAO,IAC1E,EAAhBylB,EAAoBnE,IAAiB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMpuC,YAAarX,KAAKyhC,KAAO,GAC1FylB,EAAkBnE,IAAmB/iD,KAAK62B,MAAQh1B,EAAS4jD,MAAMpuC,YAAarX,KAAKyhC,KAAO,KAShG5/B,EAAS2S,UAAU85B,KAAO,SAASlxB,GACjC,GAAIyM,GAAQ,GAAI5lB,MAAKmZ,EAAKzW,UAE1B,IAAI3G,KAAK62B,OAASh1B,EAAS4jD,MAAMxuC,KAAM,CACrC,GAAIpF,GAAOgY,EAAM5L,cAAgBpZ,KAAK+b,MAAMiJ,EAAM3L,WAAa,GAC/D2L,GAAMzJ,YAAYvb,KAAK+b,MAAM/O,EAAO7R,KAAKyhC,MAAQzhC,KAAKyhC,MACtD5X,EAAMi8B,SAAS,GACfj8B,EAAMk8B,QAAQ,GACdl8B,EAAMm8B,SAAS,GACfn8B,EAAMo8B,WAAW,GACjBp8B,EAAMq8B,WAAW,GACjBr8B,EAAMs8B,gBAAgB,OAEnB,IAAInmD,KAAK62B,OAASh1B,EAAS4jD,MAAM1uC,MAChC8S,EAAM1L,UAAY,IACpB0L,EAAMk8B,QAAQ,GACdl8B,EAAMi8B,SAASj8B,EAAM3L,WAAa,IAIlC2L,EAAMk8B,QAAQ,GAGhBl8B,EAAMm8B,SAAS,GACfn8B,EAAMo8B,WAAW,GACjBp8B,EAAMq8B,WAAW,GACjBr8B,EAAMs8B,gBAAgB,OAEnB,IAAInmD,KAAK62B,OAASh1B,EAAS4jD,MAAMC,IAAK,CAEzC,OAAQ1lD,KAAKyhC,MACX,IAAK,GACL,IAAK,GACH5X,EAAMm8B,SAA6C,GAApCnhD,KAAK+b,MAAMiJ,EAAM08B,WAAa,IAAW,MAC1D,SACE18B,EAAMm8B,SAA6C,GAApCnhD,KAAK+b,MAAMiJ,EAAM08B,WAAa,KAEjD18B,EAAMo8B,WAAW,GACjBp8B,EAAMq8B,WAAW,GACjBr8B,EAAMs8B,gBAAgB,OAEnB,IAAInmD,KAAK62B,OAASh1B,EAAS4jD,MAAME,QAAS,CAE7C,OAAQ3lD,KAAKyhC,MACX,IAAK,GACL,IAAK,GACH5X,EAAMm8B,SAA6C,GAApCnhD,KAAK+b,MAAMiJ,EAAM08B,WAAa,IAAW,MAC1D,SACE18B,EAAMm8B,SAA4C,EAAnCnhD,KAAK+b,MAAMiJ,EAAM08B,WAAa,IAEjD18B,EAAMo8B,WAAW,GACjBp8B,EAAMq8B,WAAW,GACjBr8B,EAAMs8B,gBAAgB,OAEnB,IAAInmD,KAAK62B,OAASh1B,EAAS4jD,MAAMvuC,KAAM,CAC1C,OAAQlX,KAAKyhC,MACX,IAAK,GACH5X,EAAMo8B,WAAiD,GAAtCphD,KAAK+b,MAAMiJ,EAAMy8B,aAAe,IAAW,MAC9D,SACEz8B,EAAMo8B,WAAiD,GAAtCphD,KAAK+b,MAAMiJ,EAAMy8B,aAAe,KAErDz8B,EAAMq8B,WAAW,GACjBr8B,EAAMs8B,gBAAgB,OACjB,IAAInmD,KAAK62B,OAASh1B,EAAS4jD,MAAMtuC,OAAQ,CAE9C,OAAQnX,KAAKyhC,MACX,IAAK,IACL,IAAK,IACH5X,EAAMo8B,WAAgD,EAArCphD,KAAK+b,MAAMiJ,EAAMy8B,aAAe,IACjDz8B,EAAMq8B,WAAW,EACjB,MACF,KAAK,GACHr8B,EAAMq8B,WAAiD,GAAtCrhD,KAAK+b,MAAMiJ,EAAMw8B,aAAe,IAAW,MAC9D,SACEx8B,EAAMq8B,WAAiD,GAAtCrhD,KAAK+b,MAAMiJ,EAAMw8B,aAAe,KAErDx8B,EAAMs8B,gBAAgB,OAEnB,IAAInmD,KAAK62B,OAASh1B,EAAS4jD,MAAMruC,OAEpC,OAAQpX,KAAKyhC,MACX,IAAK,IACL,IAAK,IACH5X,EAAMq8B,WAAgD,EAArCrhD,KAAK+b,MAAMiJ,EAAMw8B,aAAe,IACjDx8B,EAAMs8B,gBAAgB,EACtB,MACF,KAAK,GACHt8B,EAAMs8B,gBAA6D,IAA7CthD,KAAK+b,MAAMiJ,EAAMu8B,kBAAoB,KAAe,MAC5E,SACEv8B,EAAMs8B,gBAA4D,IAA5CthD,KAAK+b,MAAMiJ,EAAMu8B,kBAAoB,UAG5D,IAAIpmD,KAAK62B,OAASh1B,EAAS4jD,MAAMpuC,YAAa,CACjD,GAAIoqB,GAAOzhC,KAAKyhC,KAAO,EAAIzhC,KAAKyhC,KAAO,EAAI,CAC3C5X,GAAMs8B,gBAAgBthD,KAAK+b,MAAMiJ,EAAMu8B,kBAAoB3kB,GAAQA,GAGrE,MAAO5X,IAQThoB,EAAS2S,UAAU+vC,QAAU,WAC3B,OAAQvkD,KAAK62B,OACX,IAAKh1B,GAAS4jD,MAAMpuC,YAClB,MAA0C,IAAlCrX,KAAKw4C,QAAQ4N,iBACvB,KAAKvkD,GAAS4jD,MAAMruC,OAClB,MAAqC,IAA7BpX,KAAKw4C,QAAQ6N,YACvB,KAAKxkD,GAAS4jD,MAAMtuC,OAClB,MAAmC,IAA3BnX,KAAKw4C,QAAQ+N,YAAkD,GAA7BvmD,KAAKw4C,QAAQ8N,YAEzD,KAAKzkD,GAAS4jD,MAAMvuC,KAClB,MAAmC,IAA3BlX,KAAKw4C,QAAQ+N,UACvB,KAAK1kD,GAAS4jD,MAAME,QACpB,IAAK9jD,GAAS4jD,MAAMC,IAClB,MAAkC,IAA1B1lD,KAAKw4C,QAAQr6B,SACvB,KAAKtc,GAAS4jD,MAAM1uC,MAClB,MAAmC,IAA3B/W,KAAKw4C,QAAQt6B,UACvB,KAAKrc,GAAS4jD,MAAMxuC,KAClB,OAAO,CACT,SACE,OAAO,IAWbpV,EAAS2S,UAAUiwC,cAAgB,SAASrnC,GAK1C,OAJYjX,QAARiX,IACFA,EAAOpd,KAAKw4C,SAGNx4C,KAAK62B,OACX,IAAKh1B,GAAS4jD,MAAMpuC,YAAc,MAAO5T,GAAO2Z,GAAM1H,OAAO,MAC7D,KAAK7T,GAAS4jD,MAAMruC,OAAc,MAAO3T,GAAO2Z,GAAM1H,OAAO,IAC7D,KAAK7T,GAAS4jD,MAAMtuC,OAAc,MAAO1T,GAAO2Z,GAAM1H,OAAO,QAC7D,KAAK7T,GAAS4jD,MAAMvuC,KAAc,MAAOzT,GAAO2Z,GAAM1H,OAAO,QAC7D,KAAK7T,GAAS4jD,MAAME,QAAc,MAAOliD,GAAO2Z,GAAM1H,OAAO,QAC7D,KAAK7T,GAAS4jD,MAAMC,IAAc,MAAOjiD,GAAO2Z,GAAM1H,OAAO,IAC7D,KAAK7T,GAAS4jD,MAAM1uC,MAAc,MAAOtT,GAAO2Z,GAAM1H,OAAO,MAC7D,KAAK7T,GAAS4jD,MAAMxuC,KAAc,MAAOxT,GAAO2Z,GAAM1H,OAAO,OAC7D,SAAkC,MAAO,KAW7C7T,EAAS2S,UAAUmwC,cAAgB,SAASvnC,GAM1C,OALYjX,QAARiX,IACFA,EAAOpd,KAAKw4C,SAINx4C,KAAK62B,OACX,IAAKh1B,GAAS4jD,MAAMpuC,YAAY,MAAO5T,GAAO2Z,GAAM1H,OAAO,WAC3D,KAAK7T,GAAS4jD,MAAMruC,OAAY,MAAO3T,GAAO2Z,GAAM1H,OAAO,eAC3D,KAAK7T,GAAS4jD,MAAMtuC,OACpB,IAAKtV,GAAS4jD,MAAMvuC,KAAY,MAAOzT,GAAO2Z,GAAM1H,OAAO,aAC3D,KAAK7T,GAAS4jD,MAAME,QACpB,IAAK9jD,GAAS4jD,MAAMC,IAAY,MAAOjiD,GAAO2Z,GAAM1H,OAAO,YAC3D,KAAK7T,GAAS4jD,MAAM1uC,MAAY,MAAOtT,GAAO2Z,GAAM1H,OAAO,OAC3D,KAAK7T,GAAS4jD,MAAMxuC,KAAY,MAAO,EACvC,SAAgC,MAAO,KAI3CpX,EAAOD,QAAUiC,GAKb,SAAShC,EAAQD,EAASM,GAe9B,QAASmC,GAAa6rC,EAAMpgC,GAC1B9N,KAAKkuC,KAAOA,EAGZluC,KAAK4tC,gBACHuZ,iBAAiB,EAEjBC,QAASA,EACTjE,OAAQ,MAEVnjD,KAAK8N,QAAUnN,EAAKsE,UAAWjF,KAAK4tC,gBAEpC5tC,KAAKiuC,UAELjuC,KAAK02B,WAAW5oB,GA3BlB,GAAInN,GAAOT,EAAoB,GAC3BkC,EAAYlC,EAAoB,IAChCuD,EAASvD,EAAoB,GAC7BknD,EAAUlnD,EAAoB,GA2BlCmC,GAAYmS,UAAY,GAAIpS,GAM5BC,EAAYmS,UAAUy5B,QAAU,WAC9B,GAAI1C,GAAM/d,SAASK,cAAc,MACjC0d,GAAI5jC,UAAY,cAChB4jC,EAAIpd,MAAMkP,SAAW,WACrBkO,EAAIpd,MAAM3mB,IAAM,MAChB+jC,EAAIpd,MAAMK,OAAS,OAEnBxuB,KAAKurC,IAAMA,GAMblpC,EAAYmS,UAAU2qC,QAAU,WAC9Bn/C,KAAK8N,QAAQq5C,iBAAkB,EAC/BnnD,KAAKm7B,SAELn7B,KAAKkuC,KAAO,MAQd7rC,EAAYmS,UAAUkiB,WAAa,SAAS5oB,GACtCA,GAEFnN,EAAK+E,iBAAiB,kBAAmB,SAAU,WAAY1F,KAAK8N,QAASA,IAQjFzL,EAAYmS,UAAU2mB,OAAS,WAC7B,GAAIn7B,KAAK8N,QAAQq5C,gBAAiB,CAChC,GAAIpT,GAAS/zC,KAAKkuC,KAAKtF,IAAI6W,kBACvBz/C,MAAKurC,IAAI7hC,YAAcqqC,IAErB/zC,KAAKurC,IAAI7hC,YACX1J,KAAKurC,IAAI7hC,WAAW0jB,YAAYptB,KAAKurC,KAEvCwI,EAAOrmB,YAAY1tB,KAAKurC,KAExBvrC,KAAK8O,QAGP,IAAIiP,GAAM,GAAI9Z,MACV8pB,EAAI/tB,KAAKkuC,KAAKvtC,KAAK4tC,SAASxwB,GAE5BolC,EAASnjD,KAAK8N,QAAQs5C,QAAQpnD,KAAK8N,QAAQq1C,QAC3CkE,EAAQlE,EAAO3K,QAAU,IAAM2K,EAAO14B,KAAO,KAAOhnB,EAAOsa,GAAKrI,OAAO,8BAC3E2xC,GAAQA,EAAM5/B,OAAO,GAAGxb,cAAgBo7C,EAAMn7C,UAAU,GAExDlM,KAAKurC,IAAIpd,MAAM/mB,KAAO2mB,EAAI,KAC1B/tB,KAAKurC,IAAI8b,MAAQA,MAIbrnD,MAAKurC,IAAI7hC,YACX1J,KAAKurC,IAAI7hC,WAAW0jB,YAAYptB,KAAKurC,KAEvCvrC,KAAK0+B,MAGP,QAAO,GAMTr8B,EAAYmS,UAAU1F,MAAQ,WAG5B,QAASwhB,KACPX,EAAG+O,MAGH,IAAI7H,GAAQlH,EAAGue,KAAKhgC,MAAMwwC,WAAW/uB,EAAGue,KAAKC,SAASpJ,OAAOxW,OAAOsI,MAChEqV,EAAW,EAAIrV,EAAQ,EACZ,IAAXqV,IAAiBA,EAAW,IAC5BA,EAAW,MAAMA,EAAW,KAEhCvc,EAAGwL,SAGHxL,EAAG23B,iBAAmBngB,WAAW7W,EAAQ4b,GAd3C,GAAIvc,GAAK3vB,IAiBTswB,MAMFjuB,EAAYmS,UAAUkqB,KAAO,WACGv4B,SAA1BnG,KAAKsnD,mBACPxgB,aAAa9mC,KAAKsnD,wBACXtnD,MAAKsnD,mBAIhBznD,EAAOD,QAAUyC,GAKb,SAASxC,EAAQD,GAGrBA,EAAY,IACV44C,QAAS,UACT/tB,KAAM,QAER7qB,EAAe,MAAIA,EAAY,GAC/BA,EAAe,MAAIA,EAAY,GAG/BA,EAAY,IACV2nD,OAAQ,aACR98B,KAAM,QAER7qB,EAAe,MAAIA,EAAY,GAC/BA,EAAe,MAAIA,EAAY,IAK3B,SAASC,EAAQD,EAASM,GAiB9B,QAASoC,GAAY4rC,EAAMpgC,GACzB9N,KAAKkuC,KAAOA,EAGZluC,KAAK4tC,gBACH4Z,gBAAgB,EAChBJ,QAASA,EACTjE,OAAQ,MAEVnjD,KAAK8N,QAAUnN,EAAKsE,UAAWjF,KAAK4tC,gBAEpC5tC,KAAKivC,WAAa,GAAIhrC,MACtBjE,KAAKynD,eAGLznD,KAAKiuC,UAELjuC,KAAK02B,WAAW5oB,GAhClB,GAAI0iC,GAAStwC,EAAoB,IAC7BS,EAAOT,EAAoB,GAC3BkC,EAAYlC,EAAoB,IAChCuD,EAASvD,EAAoB,GAC7BknD,EAAUlnD,EAAoB,GA+BlCoC,GAAWkS,UAAY,GAAIpS,GAO3BE,EAAWkS,UAAUkiB,WAAa,SAAS5oB,GACrCA,GAEFnN,EAAK+E,iBAAiB,iBAAkB,SAAU,WAAY1F,KAAK8N,QAASA,IAQhFxL,EAAWkS,UAAUy5B,QAAU,WAC7B,GAAI1C,GAAM/d,SAASK,cAAc,MACjC0d,GAAI5jC,UAAY,aAChB4jC,EAAIpd,MAAMkP,SAAW,WACrBkO,EAAIpd,MAAM3mB,IAAM,MAChB+jC,EAAIpd,MAAMK,OAAS,OACnBxuB,KAAKurC,IAAMA,CAEX,IAAImc,GAAOl6B,SAASK,cAAc,MAClC65B,GAAKv5B,MAAMkP,SAAW,WACtBqqB,EAAKv5B,MAAM3mB,IAAM,MACjBkgD,EAAKv5B,MAAM/mB,KAAO,QAClBsgD,EAAKv5B,MAAMK,OAAS,OACpBk5B,EAAKv5B,MAAMI,MAAQ,OACnBgd,EAAI7d,YAAYg6B,GAGhB1nD,KAAK0D,OAAS8sC,EAAOjF,GACnB6U,iBAAiB,IAEnBpgD,KAAK0D,OAAOqrB,GAAG,YAAa/uB,KAAK29C,aAAatP,KAAKruC,OACnDA,KAAK0D,OAAOqrB,GAAG,OAAa/uB,KAAK49C,QAAQvP,KAAKruC,OAC9CA,KAAK0D,OAAOqrB,GAAG,UAAa/uB,KAAK69C,WAAWxP,KAAKruC,QAMnDsC,EAAWkS,UAAU2qC,QAAU,WAC7Bn/C,KAAK8N,QAAQ05C,gBAAiB,EAC9BxnD,KAAKm7B,SAELn7B,KAAK0D,OAAO82C,QAAO,GACnBx6C,KAAK0D,OAAS,KAEd1D,KAAKkuC,KAAO,MAOd5rC,EAAWkS,UAAU2mB,OAAS,WAC5B,GAAIn7B,KAAK8N,QAAQ05C,eAAgB,CAC/B,GAAIzT,GAAS/zC,KAAKkuC,KAAKtF,IAAI6W,kBACvBz/C,MAAKurC,IAAI7hC,YAAcqqC,IAErB/zC,KAAKurC,IAAI7hC,YACX1J,KAAKurC,IAAI7hC,WAAW0jB,YAAYptB,KAAKurC,KAEvCwI,EAAOrmB,YAAY1tB,KAAKurC,KAG1B,IAAIxd,GAAI/tB,KAAKkuC,KAAKvtC,KAAK4tC,SAASvuC,KAAKivC,YAEjCkU,EAASnjD,KAAK8N,QAAQs5C,QAAQpnD,KAAK8N,QAAQq1C,QAC3CkE,EAAQlE,EAAO14B,KAAO,KAAOhnB,EAAOzD,KAAKivC,YAAYv5B,OAAO,8BAChE2xC,GAAQA,EAAM5/B,OAAO,GAAGxb,cAAgBo7C,EAAMn7C,UAAU,GAExDlM,KAAKurC,IAAIpd,MAAM/mB,KAAO2mB,EAAI,KAC1B/tB,KAAKurC,IAAI8b,MAAQA,MAIbrnD,MAAKurC,IAAI7hC,YACX1J,KAAKurC,IAAI7hC,WAAW0jB,YAAYptB,KAAKurC,IAIzC,QAAO,GAOTjpC,EAAWkS,UAAUusC,cAAgB,SAASt2B,GAC5CzqB,KAAKivC,WAAa,GAAIhrC,MAAKwmB,EAAK9jB,WAChC3G,KAAKm7B,UAOP74B,EAAWkS,UAAUwsC,cAAgB,WACnC,MAAO,IAAI/8C,MAAKjE,KAAKivC,WAAWtoC,YAQlCrE,EAAWkS,UAAUmpC,aAAe,SAASv0C,GAC3CpJ,KAAKynD,YAAYE,UAAW,EAC5B3nD,KAAKynD,YAAYxY,WAAajvC,KAAKivC,WAEnC7lC,EAAMwuC,kBACNxuC,EAAMD,kBAQR7G,EAAWkS,UAAUopC,QAAU,SAAUx0C,GACvC,GAAKpJ,KAAKynD,YAAYE,SAAtB,CAEA,GAAIpT,GAASnrC,EAAM2nC,QAAQwD,OACvBxmB,EAAI/tB,KAAKkuC,KAAKvtC,KAAK4tC,SAASvuC,KAAKynD,YAAYxY,YAAcsF,EAC3D9pB,EAAOzqB,KAAKkuC,KAAKvtC,KAAKguC,OAAO5gB,EAEjC/tB,MAAK+gD,cAAct2B,GAGnBzqB,KAAKkuC,KAAKE,QAAQ3H,KAAK,cACrBhc,KAAM,GAAIxmB,MAAKjE,KAAKivC,WAAWtoC,aAGjCyC,EAAMwuC,kBACNxuC,EAAMD,mBAQR7G,EAAWkS,UAAUqpC,WAAa,SAAUz0C,GACrCpJ,KAAKynD,YAAYE,WAGtB3nD,KAAKkuC,KAAKE,QAAQ3H,KAAK,eACrBhc,KAAM,GAAIxmB,MAAKjE,KAAKivC,WAAWtoC,aAGjCyC,EAAMwuC,kBACNxuC,EAAMD,mBAGRtJ,EAAOD,QAAU0C,GAKb,SAASzC,EAAQD,EAASM,GAwB9B,QAASwC,GAAQwrC,EAAMpgC,GACrB9N,KAAKkuC,KAAOA,EAEZluC,KAAK4tC,gBACHnnC,KAAM,KACNqnC,YAAa,SACb8Z,MAAO,SACPhmD,OAAO,EACPimD,WAAY,KAEZC,YAAY,EACZC,UACEC,YAAY,EACZC,aAAa,EACb1mC,KAAK,EACLoQ,QAAQ,GAGVu2B,MAAO,SAAUh4B,EAAM9nB,GACrBA,EAAS8nB,IAEXi4B,SAAU,SAAUj4B,EAAM9nB,GACxBA,EAAS8nB,IAEXk4B,OAAQ,SAAUl4B,EAAM9nB,GACtBA,EAAS8nB,IAEXm4B,SAAU,SAAUn4B,EAAM9nB,GACxBA,EAAS8nB,IAGX4D,QACE5D,MACE4O,WAAY,GACZC,SAAU,IAEZupB,KAAM,IAER9qB,QAAS,GAIXx9B,KAAK8N,QAAUnN,EAAKsE,UAAWjF,KAAK4tC,gBAGpC5tC,KAAKuoD,aACH9hD,MAAOqI,MAAO,OAAQuS,IAAK,SAG7BrhB,KAAK0+C,YACHnQ,SAAUL,EAAKvtC,KAAK4tC,SACpBI,OAAQT,EAAKvtC,KAAKguC,QAEpB3uC,KAAK4oC,OACL5oC,KAAK2F,SACL3F,KAAK0D,OAAS,IAEd,IAAIisB,GAAK3vB,IACTA,MAAKmvC,UAAY,KACjBnvC,KAAKovC,WAAa,KAGlBpvC,KAAKwoD,eACHjnC,IAAO,SAAUnY,EAAOkmB,GACtBK,EAAG84B,OAAOn5B,EAAOvtB,QAEnBuuB,OAAU,SAAUlnB,EAAOkmB,GACzBK,EAAG+4B,UAAUp5B,EAAOvtB,QAEtB4vB,OAAU,SAAUvoB,EAAOkmB,GACzBK,EAAGg5B,UAAUr5B,EAAOvtB,SAKxB/B,KAAK4oD,gBACHrnC,IAAO,SAAUnY,EAAOkmB,GACtBK,EAAGk5B,aAAav5B,EAAOvtB,QAEzBuuB,OAAU,SAAUlnB,EAAOkmB,GACzBK,EAAGm5B,gBAAgBx5B,EAAOvtB,QAE5B4vB,OAAU,SAAUvoB,EAAOkmB,GACzBK,EAAGo5B,gBAAgBz5B,EAAOvtB,SAI9B/B,KAAK+B,SACL/B,KAAK4vC,UACL5vC,KAAKgpD,YAELhpD,KAAKipD,aACLjpD,KAAKkpD,YAAa,EAElBlpD,KAAKmpD,eAGLnpD,KAAKiuC,UAELjuC,KAAK02B,WAAW5oB,GAu/BlB,QAASs7C,GAAcl5B,EAAMlC,GAC3B,GAAIA,GAASA,EAAMq7B,SAAWn5B,EAAKtE,KAAKoC,MAAO,CAC7C,GAAIs7B,GAAWp5B,EAAK6jB,MACpBuV,GAAS33B,OAAOzB,GAChBo5B,EAASt4B,QACThD,EAAMzM,IAAI2O,GACVlC,EAAMgD,QAENd,EAAKtE,KAAKoC,MAAQA,EAAMq7B,SAxnC5B,GAAI7Y,GAAStwC,EAAoB,IAC7BS,EAAOT,EAAoB,GAC3BW,EAAUX,EAAoB,GAC9BY,EAAWZ,EAAoB,GAC/BkC,EAAYlC,EAAoB,IAChCuC,EAAQvC,EAAoB,IAC5B+B,EAAU/B,EAAoB,IAC9BgC,EAAYhC,EAAoB,IAChCiC,EAAYjC,EAAoB,IAGhCqpD,EAAY,eAiHhB7mD,GAAQ8R,UAAY,GAAIpS,GAGxBM,EAAQ4vB,OACNk3B,IAAKvnD,EACLiM,MAAO/L,EACP8rB,MAAO/rB,GAMTQ,EAAQ8R,UAAUy5B,QAAU,WAC1B,GAAIjV,GAAQxL,SAASK,cAAc,MACnCmL,GAAMrxB,UAAY,UAClBqxB,EAAM,oBAAsBh5B,KAC5BA,KAAK4oC,IAAI5P,MAAQA,CAGjB,IAAIttB,GAAa8hB,SAASK,cAAc,MACxCniB,GAAW/D,UAAY,aACvBqxB,EAAMtL,YAAYhiB,GAClB1L,KAAK4oC,IAAIl9B,WAAaA,CAGtB,IAAIg3C,GAAal1B,SAASK,cAAc,MACxC60B,GAAW/6C,UAAY,aACvBqxB,EAAMtL,YAAYg1B,GAClB1iD,KAAK4oC,IAAI8Z,WAAaA,CAGtB,IAAI4F,GAAO96B,SAASK,cAAc,MAClCy6B,GAAK3gD,UAAY,OACjB3H,KAAK4oC,IAAI0f,KAAOA,CAGhB,IAAImB,GAAWj8B,SAASK,cAAc,MACtC47B,GAAS9hD,UAAY,WACrB3H,KAAK4oC,IAAI6gB,SAAWA,EAGpBzpD,KAAK0pD,mBAML1pD,KAAK0D,OAAS8sC,EAAOxwC,KAAKkuC,KAAKtF,IAAI+W,iBACjCS,iBAAiB,IAInBpgD,KAAK0D,OAAOqrB,GAAG,QAAa/uB,KAAKg+C,SAAS3P,KAAKruC,OAC/CA,KAAK0D,OAAOqrB,GAAG,YAAa/uB,KAAK29C,aAAatP,KAAKruC,OACnDA,KAAK0D,OAAOqrB,GAAG,OAAa/uB,KAAK49C,QAAQvP,KAAKruC,OAC9CA,KAAK0D,OAAOqrB,GAAG,UAAa/uB,KAAK69C,WAAWxP,KAAKruC,OAGjDA,KAAK0D,OAAOqrB,GAAG,MAAQ/uB,KAAK2pD,cAActb,KAAKruC,OAG/CA,KAAK0D,OAAOqrB,GAAG,OAAQ/uB,KAAK4pD,mBAAmBvb,KAAKruC,OAGpDA,KAAK0D,OAAOqrB,GAAG,YAAa/uB,KAAK6pD,WAAWxb,KAAKruC,OAGjDA,KAAK8pD,QAkEPpnD,EAAQ8R,UAAUkiB,WAAa,SAAS5oB,GACtC,GAAIA,EAAS,CAEX,GAAIP,IAAU,OAAQ,QAAS,cAAe,UAAW,QAAS,aAAc,aAChF5M,GAAK+E,gBAAgB6H,EAAQvN,KAAK8N,QAASA,GAEvC,UAAYA,KACgB,gBAAnBA,GAAQgmB,QACjB9zB,KAAK8N,QAAQgmB,OAAOw0B,KAAOx6C,EAAQgmB,OACnC9zB,KAAK8N,QAAQgmB,OAAO5D,KAAK4O,WAAahxB,EAAQgmB,OAC9C9zB,KAAK8N,QAAQgmB,OAAO5D,KAAK6O,SAAWjxB,EAAQgmB,QAEX,gBAAnBhmB,GAAQgmB,SACtBnzB,EAAK+E,iBAAiB,QAAS1F,KAAK8N,QAAQgmB,OAAQhmB,EAAQgmB,QACxD,QAAUhmB,GAAQgmB,SACe,gBAAxBhmB,GAAQgmB,OAAO5D,MACxBlwB,KAAK8N,QAAQgmB,OAAO5D,KAAK4O,WAAahxB,EAAQgmB,OAAO5D,KACrDlwB,KAAK8N,QAAQgmB,OAAO5D,KAAK6O,SAAWjxB,EAAQgmB,OAAO5D,MAEb,gBAAxBpiB,GAAQgmB,OAAO5D,MAC7BvvB,EAAK+E,iBAAiB,aAAc,YAAa1F,KAAK8N,QAAQgmB,OAAO5D,KAAMpiB,EAAQgmB,OAAO5D,SAM9F,YAAcpiB,KACgB,iBAArBA,GAAQi6C,UACjB/nD,KAAK8N,QAAQi6C,SAASC,WAAcl6C,EAAQi6C,SAC5C/nD,KAAK8N,QAAQi6C,SAASE,YAAcn6C,EAAQi6C,SAC5C/nD,KAAK8N,QAAQi6C,SAASxmC,IAAczT,EAAQi6C,SAC5C/nD,KAAK8N,QAAQi6C,SAASp2B,OAAc7jB,EAAQi6C,UAET,gBAArBj6C,GAAQi6C,UACtBpnD,EAAK+E,iBAAiB,aAAc,cAAe,MAAO,UAAW1F,KAAK8N,QAAQi6C,SAAUj6C,EAAQi6C,UAKxG,IAAIgC,GAAc,SAAW1nC,GAC3B,GAAIA,IAAQvU,GAAS,CACnB,GAAIwC,GAAKxC,EAAQuU,EACjB,MAAM/R,YAAc4I,WAClB,KAAM,IAAI1V,OAAM,UAAY6e,EAAO,uBAAyBA,EAAO,mBAErEriB,MAAK8N,QAAQuU,GAAQ/R,IAEtB+9B,KAAKruC,OACP,QAAS,WAAY,WAAY,UAAUmI,QAAQ4hD,GAGpD/pD,KAAKgqD,cAOTtnD,EAAQ8R,UAAUw1C,UAAY,WAC5BhqD,KAAKgpD,YACLhpD,KAAKkpD,YAAa,GAMpBxmD,EAAQ8R,UAAU2qC,QAAU,WAC1Bn/C,KAAKiqD,OACLjqD,KAAKqvC,SAAS,MACdrvC,KAAK2vC,UAAU,MAEf3vC,KAAK0D,OAAS,KAEd1D,KAAKkuC,KAAO,KACZluC,KAAK0+C,WAAa,MAMpBh8C,EAAQ8R,UAAUy1C,KAAO,WAEnBjqD,KAAK4oC,IAAI5P,MAAMtvB,YACjB1J,KAAK4oC,IAAI5P,MAAMtvB,WAAW0jB,YAAYptB,KAAK4oC,IAAI5P,OAI7Ch5B,KAAK4oC,IAAI0f,KAAK5+C,YAChB1J,KAAK4oC,IAAI0f,KAAK5+C,WAAW0jB,YAAYptB,KAAK4oC,IAAI0f,MAI5CtoD,KAAK4oC,IAAI6gB,SAAS//C,YACpB1J,KAAK4oC,IAAI6gB,SAAS//C,WAAW0jB,YAAYptB,KAAK4oC,IAAI6gB,WAQtD/mD,EAAQ8R,UAAUs1C,KAAO,WAElB9pD,KAAK4oC,IAAI5P,MAAMtvB,YAClB1J,KAAKkuC,KAAKtF,IAAI7D,OAAOrX,YAAY1tB,KAAK4oC,IAAI5P,OAIvCh5B,KAAK4oC,IAAI0f,KAAK5+C,YACjB1J,KAAKkuC,KAAKtF,IAAIphC,IAAIkmB,YAAY1tB,KAAK4oC,IAAI0f,MAIpCtoD,KAAK4oC,IAAI6gB,SAAS//C,YACrB1J,KAAKkuC,KAAKtF,IAAIxhC,KAAKsmB,YAAY1tB,KAAK4oC,IAAI6gB,WAW5C/mD,EAAQ8R,UAAUq7B,aAAe,SAASnf,GACxC,GAAIvrB,GAAG+kD,EAAI7pD,EAAI6vB,CAMf,KAJW/pB,QAAPuqB,IAAkBA,MACjB9qB,MAAMC,QAAQ6qB,KAAMA,GAAOA,IAG3BvrB,EAAI,EAAG+kD,EAAKlqD,KAAKipD,UAAU3jD,OAAY4kD,EAAJ/kD,EAAQA,IAC9C9E,EAAKL,KAAKipD,UAAU9jD,GACpB+qB,EAAOlwB,KAAK+B,MAAM1B,GACd6vB,GAAMA,EAAKi6B,UAKjB,KADAnqD,KAAKipD,aACA9jD,EAAI,EAAG+kD,EAAKx5B,EAAIprB,OAAY4kD,EAAJ/kD,EAAQA,IACnC9E,EAAKqwB,EAAIvrB,GACT+qB,EAAOlwB,KAAK+B,MAAM1B,GACd6vB,IACFlwB,KAAKipD,UAAUnhD,KAAKzH,GACpB6vB,EAAKk6B,WASX1nD,EAAQ8R,UAAUu7B,aAAe,WAC/B,MAAO/vC,MAAKipD,UAAUz5B,YAOxB9sB,EAAQ8R,UAAUysC,gBAAkB,WAClC,GAAI/yC,GAAQlO,KAAKkuC,KAAKhgC,MAAMuwC,WACxBr3C,EAAQpH,KAAKkuC,KAAKvtC,KAAK4tC,SAASrgC,EAAMY,OACtC6xB,EAAQ3gC,KAAKkuC,KAAKvtC,KAAK4tC,SAASrgC,EAAMmT,KAEtCqP,IACJ,KAAK,GAAI24B,KAAWrpD,MAAK4vC,OACvB,GAAI5vC,KAAK4vC,OAAOnqC,eAAe4jD,GAM7B,IAAK,GALDr7B,GAAQhuB,KAAK4vC,OAAOyZ,GACpBgB,EAAkBr8B,EAAMs8B,aAInBnlD,EAAI,EAAGA,EAAIklD,EAAgB/kD,OAAQH,IAAK,CAC/C,GAAI+qB,GAAOm6B,EAAgBllD,EAEtB+qB,GAAK9oB,KAAOu5B,GAAWzQ,EAAK9oB,KAAO8oB,EAAK3B,MAAQnnB,GACnDspB,EAAI5oB,KAAKooB,EAAK7vB,IAMtB,MAAOqwB,IAQThuB,EAAQ8R,UAAU+1C,UAAY,SAASlqD,GAErC,IAAK,GADD4oD,GAAYjpD,KAAKipD,UACZ9jD,EAAI,EAAG+kD,EAAKjB,EAAU3jD,OAAY4kD,EAAJ/kD,EAAQA,IAC7C,GAAI8jD,EAAU9jD,IAAM9E,EAAI,CACtB4oD,EAAU/gD,OAAO/C,EAAG,EACpB,SASNzC,EAAQ8R,UAAU2mB,OAAS,WACzB,GAAIrH,GAAS9zB,KAAK8N,QAAQgmB,OACtB5lB,EAAQlO,KAAKkuC,KAAKhgC,MAClBlE,EAASrJ,EAAKgJ,OAAOK,OACrB8D,EAAU9N,KAAK8N,QACfggC,EAAchgC,EAAQggC,YACtBuR,GAAU,EACVrmB,EAAQh5B,KAAK4oC,IAAI5P,MACjB+uB,EAAWj6C,EAAQi6C,SAASC,YAAcl6C,EAAQi6C,SAASE,WAG/DjvB,GAAMrxB,UAAY,WAAaogD,EAAW,YAAc,IAGxD1I,EAAUr/C,KAAKwqD,gBAAkBnL,CAIjC,IAAIoL,GAAkBv8C,EAAMmT,IAAMnT,EAAMY,MACpC47C,EAAUD,GAAmBzqD,KAAK2qD,qBAAyB3qD,KAAK2F,MAAM4oB,OAASvuB,KAAK2F,MAAMs8C,SAC1FyI,KAAQ1qD,KAAKkpD,YAAa,GAC9BlpD,KAAK2qD,oBAAsBF,EAC3BzqD,KAAK2F,MAAMs8C,UAAYjiD,KAAK2F,MAAM4oB,KAGlC,IAAIq8B,GAAU5qD,KAAKkpD,WACf2B,EAAa7qD,KAAK8qD,cAClBC,GACE76B,KAAM4D,EAAO5D,KACbo4B,KAAMx0B,EAAOw0B,MAEf0C,GACE96B,KAAM4D,EAAO5D,KACbo4B,KAAMx0B,EAAO5D,KAAK6O,SAAW,GAE/BvQ,EAAS,EACTwf,EAAYla,EAAOw0B,KAAOx0B,EAAO5D,KAAK6O,QA4B1C,OA3BAp+B,GAAKwH,QAAQnI,KAAK4vC,OAAQ,SAAU5hB,GAClC,GAAIi9B,GAAej9B,GAAS68B,EAAcE,EAAcC,EACpDE,EAAel9B,EAAMmN,OAAOjtB,EAAO+8C,EAAaL,EACpDvL,GAAU6L,GAAgB7L,EAC1B7wB,GAAUR,EAAMQ,SAElBA,EAAS3pB,KAAKiI,IAAI0hB,EAAQwf,GAC1BhuC,KAAKkpD,YAAa,EAGlBlwB,EAAM7K,MAAMK,OAAUxkB,EAAOwkB,GAG7BxuB,KAAK2F,MAAM6B,IAAMwxB,EAAMmyB,UACvBnrD,KAAK2F,MAAMyB,KAAO4xB,EAAMoyB,WACxBprD,KAAK2F,MAAM4oB,MAAQyK,EAAMiQ,YACzBjpC,KAAK2F,MAAM6oB,OAASA,EAGpBxuB,KAAK4oC,IAAI0f,KAAKn6B,MAAM3mB,IAAMwC,EAAuB,OAAf8jC,EAC7B9tC,KAAKkuC,KAAKC,SAAS3mC,IAAIgnB,OAASxuB,KAAKkuC,KAAKC,SAASxiC,OAAOnE,IAC1DxH,KAAKkuC,KAAKC,SAAS3mC,IAAIgnB,OAASxuB,KAAKkuC,KAAKC,SAASwR,gBAAgBnxB,QACxExuB,KAAK4oC,IAAI0f,KAAKn6B,MAAM/mB,KAAO,IAG3Bi4C,EAAUr/C,KAAKo/C,cAAgBC,GAUjC38C,EAAQ8R,UAAUs2C,YAAc,WAC9B,GAAIO,GAA+C,OAA5BrrD,KAAK8N,QAAQggC,YAAwB,EAAK9tC,KAAKgpD,SAAS1jD,OAAS,EACpFgmD,EAAetrD,KAAKgpD,SAASqC,GAC7BR,EAAa7qD,KAAK4vC,OAAO0b,IAAiBtrD,KAAK4vC,OAAO2Z,EAE1D,OAAOsB,IAAc,MAQvBnoD,EAAQ8R,UAAUk1C,iBAAmB,WACnC,GAAI6B,GAAYvrD,KAAK4vC,OAAO2Z,EAE5B,IAAIvpD,KAAKovC,WAEHmc,IACFA,EAAUtB,aACHjqD,MAAK4vC,OAAO2Z,QAKrB,KAAKgC,EAAW,CACd,GAAIlrD,GAAK,KACLurB,EAAO,IACX2/B,GAAY,GAAI9oD,GAAMpC,EAAIurB,EAAM5rB,MAChCA,KAAK4vC,OAAO2Z,GAAagC,CAEzB,KAAK,GAAIz6B,KAAU9wB,MAAK+B,MAClB/B,KAAK+B,MAAM0D,eAAeqrB,IAC5By6B,EAAUhqC,IAAIvhB,KAAK+B,MAAM+uB,GAI7By6B,GAAUzB,SAShBpnD,EAAQ8R,UAAUg3C,YAAc,WAC9B,MAAOxrD,MAAK4oC,IAAI6gB,UAOlB/mD,EAAQ8R,UAAU66B,SAAW,SAASttC,GACpC,GACI2uB,GADAf,EAAK3vB,KAELyrD,EAAezrD,KAAKmvC,SAGxB,IAAKptC,EAGA,CAAA,KAAIA,YAAiBlB,IAAWkB,YAAiBjB,IAIpD,KAAM,IAAIkF,WAAU,kDAHpBhG,MAAKmvC,UAAYptC,MAHjB/B,MAAKmvC,UAAY,IAoBnB,IAXIsc,IAEF9qD,EAAKwH,QAAQnI,KAAKwoD,cAAe,SAAUpgD,EAAUgB,GACnDqiD,EAAav8B,IAAI9lB,EAAOhB,KAI1BsoB,EAAM+6B,EAAar6B,SACnBpxB,KAAK2oD,UAAUj4B,IAGb1wB,KAAKmvC,UAAW,CAElB,GAAI9uC,GAAKL,KAAKK,EACdM,GAAKwH,QAAQnI,KAAKwoD,cAAe,SAAUpgD,EAAUgB,GACnDumB,EAAGwf,UAAUpgB,GAAG3lB,EAAOhB,EAAU/H,KAInCqwB,EAAM1wB,KAAKmvC,UAAU/d,SACrBpxB,KAAKyoD,OAAO/3B,GAGZ1wB,KAAK0pD,qBAQThnD,EAAQ8R,UAAUk3C,SAAW,WAC3B,MAAO1rD,MAAKmvC,WAOdzsC,EAAQ8R,UAAUm7B,UAAY,SAASC,GACrC,GACIlf,GADAf,EAAK3vB,IAgBT,IAZIA,KAAKovC,aACPzuC,EAAKwH,QAAQnI,KAAK4oD,eAAgB,SAAUxgD,EAAUgB,GACpDumB,EAAGyf,WAAWhgB,YAAYhmB,EAAOhB,KAInCsoB,EAAM1wB,KAAKovC,WAAWhe,SACtBpxB,KAAKovC,WAAa,KAClBpvC,KAAK+oD,gBAAgBr4B,IAIlBkf,EAGA,CAAA,KAAIA,YAAkB/uC,IAAW+uC,YAAkB9uC,IAItD,KAAM,IAAIkF,WAAU,kDAHpBhG,MAAKovC,WAAaQ,MAHlB5vC,MAAKovC,WAAa,IASpB,IAAIpvC,KAAKovC,WAAY,CAEnB,GAAI/uC,GAAKL,KAAKK,EACdM,GAAKwH,QAAQnI,KAAK4oD,eAAgB,SAAUxgD,EAAUgB,GACpDumB,EAAGyf,WAAWrgB,GAAG3lB,EAAOhB,EAAU/H,KAIpCqwB,EAAM1wB,KAAKovC,WAAWhe,SACtBpxB,KAAK6oD,aAAan4B,GAIpB1wB,KAAK0pD,mBAGL1pD,KAAK2rD,SAEL3rD,KAAKkuC,KAAKE,QAAQ3H,KAAK,WAOzB/jC,EAAQ8R,UAAUo3C,UAAY,WAC5B,MAAO5rD,MAAKovC,YAOd1sC,EAAQ8R,UAAUq3C,WAAa,SAASxrD,GACtC,GAAI6vB,GAAOlwB,KAAKmvC,UAAUz2B,IAAIrY,GAC1B8vC,EAAUnwC,KAAKmvC,UAAU9d,YAEzBnB,IAEFlwB,KAAK8N,QAAQu6C,SAASn4B,EAAM,SAAUA,GAChCA,GAGFigB,EAAQxe,OAAOtxB;IAWvBqC,EAAQ8R,UAAUk0C,UAAY,SAASh4B,GACrC,GAAIf,GAAK3vB,IAET0wB,GAAIvoB,QAAQ,SAAU9H,GACpB,GAAI2vC,GAAWrgB,EAAGwf,UAAUz2B,IAAIrY,EAAIsvB,EAAG44B,aACnCr4B,EAAOP,EAAG5tB,MAAM1B,GAChBoG,EAAOupC,EAASvpC,MAAQkpB,EAAG7hB,QAAQrH,OAASupC,EAAS3uB,IAAM,QAAU,OAErEpb,EAAcvD,EAAQ4vB,MAAM7rB,EAchC,IAZIypB,IAEGjqB,GAAiBiqB,YAAgBjqB,GAMpC0pB,EAAGc,YAAYP,EAAM8f,IAJrBrgB,EAAGm8B,YAAY57B,GACfA,EAAO,QAONA,EAAM,CAET,IAAIjqB,EAKC,KAEG,IAAID,WAFK,iBAARS,EAEa,4HAIA,sBAAwBA,EAAO,IAVnDypB,GAAO,GAAIjqB,GAAY+pC,EAAUrgB,EAAG+uB,WAAY/uB,EAAG7hB,SACnDoiB,EAAK7vB,GAAKA,EACVsvB,EAAGC,SAASM,MAalBlwB,KAAK2rD,SACL3rD,KAAKkpD,YAAa,EAClBlpD,KAAKkuC,KAAKE,QAAQ3H,KAAK,WAQzB/jC,EAAQ8R,UAAUi0C,OAAS/lD,EAAQ8R,UAAUk0C,UAO7ChmD,EAAQ8R,UAAUm0C,UAAY,SAASj4B,GACrC,GAAI5f,GAAQ,EACR6e,EAAK3vB,IACT0wB,GAAIvoB,QAAQ,SAAU9H,GACpB,GAAI6vB,GAAOP,EAAG5tB,MAAM1B,EAChB6vB,KACFpf,IACA6e,EAAGm8B,YAAY57B,MAIfpf,IAEF9Q,KAAK2rD,SACL3rD,KAAKkpD,YAAa,EAClBlpD,KAAKkuC,KAAKE,QAAQ3H,KAAK,YAQ3B/jC,EAAQ8R,UAAUm3C,OAAS,WAGzBhrD,EAAKwH,QAAQnI,KAAK4vC,OAAQ,SAAU5hB,GAClCA,EAAMgD,WASVtuB,EAAQ8R,UAAUs0C,gBAAkB,SAASp4B,GAC3C1wB,KAAK6oD,aAAan4B,IAQpBhuB,EAAQ8R,UAAUq0C,aAAe,SAASn4B,GACxC,GAAIf,GAAK3vB,IAET0wB,GAAIvoB,QAAQ,SAAU9H,GACpB,GAAI0rD,GAAYp8B,EAAGyf,WAAW12B,IAAIrY,GAC9B2tB,EAAQ2B,EAAGigB,OAAOvvC,EAEtB,IAAK2tB,EA6BHA,EAAMmF,QAAQ44B,OA7BJ,CAEV,GAAI1rD,GAAMkpD,EACR,KAAM,IAAI/lD,OAAM,qBAAuBnD,EAAK,qBAG9C,IAAI2rD,GAAe9lD,OAAOwH,OAAOiiB,EAAG7hB,QACpCnN,GAAKsE,OAAO+mD,GACVx9B,OAAQ,OAGVR,EAAQ,GAAIvrB,GAAMpC,EAAI0rD,EAAWp8B,GACjCA,EAAGigB,OAAOvvC,GAAM2tB,CAGhB,KAAK,GAAI8C,KAAUnB,GAAG5tB,MACpB,GAAI4tB,EAAG5tB,MAAM0D,eAAeqrB,GAAS,CACnC,GAAIZ,GAAOP,EAAG5tB,MAAM+uB,EAChBZ,GAAKtE,KAAKoC,OAAS3tB,GACrB2tB,EAAMzM,IAAI2O,GAKhBlC,EAAMgD,QACNhD,EAAM87B,UAQV9pD,KAAKkuC,KAAKE,QAAQ3H,KAAK,WAQzB/jC,EAAQ8R,UAAUu0C,gBAAkB,SAASr4B,GAC3C,GAAIkf,GAAS5vC,KAAK4vC,MAClBlf,GAAIvoB,QAAQ,SAAU9H,GACpB,GAAI2tB,GAAQ4hB,EAAOvvC,EAEf2tB,KACFA,EAAMi8B,aACCra,GAAOvvC,MAIlBL,KAAKgqD,YAELhqD,KAAKkuC,KAAKE,QAAQ3H,KAAK,WAQzB/jC,EAAQ8R,UAAUg2C,aAAe,WAC/B,GAAIxqD,KAAKovC,WAAY,CAEnB,GAAI4Z,GAAWhpD,KAAKovC,WAAWhe,QAC7BJ,MAAOhxB,KAAK8N,QAAQ+5C,aAGlBxJ,GAAW19C,EAAK4F,WAAWyiD,EAAUhpD,KAAKgpD,SAC9C,IAAI3K,EAAS,CAEX,GAAIzO,GAAS5vC,KAAK4vC,MAClBoZ,GAAS7gD,QAAQ,SAAUkhD,GACzBzZ,EAAOyZ,GAASY,SAIlBjB,EAAS7gD,QAAQ,SAAUkhD,GACzBzZ,EAAOyZ,GAASS,SAGlB9pD,KAAKgpD,SAAWA,EAGlB,MAAO3K,GAGP,OAAO,GASX37C,EAAQ8R,UAAUob,SAAW,SAASM,GACpClwB,KAAK+B,MAAMmuB,EAAK7vB,IAAM6vB,CAGtB,IAAIm5B,GAAUrpD,KAAKovC,WAAalf,EAAKtE,KAAKoC,MAAQu7B,EAC9Cv7B,EAAQhuB,KAAK4vC,OAAOyZ,EACpBr7B,IAAOA,EAAMzM,IAAI2O,IASvBxtB,EAAQ8R,UAAUic,YAAc,SAASP,EAAM8f,GAC7C,GAAIic,GAAa/7B,EAAKtE,KAAKoC,KAQ3B,IANAkC,EAAKtE,KAAOokB,EACR9f,EAAKg8B,WACPh8B,EAAKiL,SAIH8wB,GAAc/7B,EAAKtE,KAAKoC,MAAO,CACjC,GAAIs7B,GAAWtpD,KAAK4vC,OAAOqc,EACvB3C,IAAUA,EAAS33B,OAAOzB,EAE9B,IAAIm5B,GAAUrpD,KAAKovC,WAAalf,EAAKtE,KAAKoC,MAAQu7B,EAC9Cv7B,EAAQhuB,KAAK4vC,OAAOyZ,EACpBr7B,IAAOA,EAAMzM,IAAI2O,KAUzBxtB,EAAQ8R,UAAUs3C,YAAc,SAAS57B,GAEvCA,EAAK+5B,aAGEjqD,MAAK+B,MAAMmuB,EAAK7vB,GAGvB,IAAI4H,GAAQjI,KAAKipD,UAAU3iD,QAAQ4pB,EAAK7vB,GAC3B,KAAT4H,GAAajI,KAAKipD,UAAU/gD,OAAOD,EAAO,EAG9C,IAAIohD,GAAUrpD,KAAKovC,WAAalf,EAAKtE,KAAKoC,MAAQu7B,EAC9Cv7B,EAAQhuB,KAAK4vC,OAAOyZ,EACpBr7B,IAAOA,EAAM2D,OAAOzB,IAS1BxtB,EAAQ8R,UAAU23C,qBAAuB,SAAS7jD,GAGhD,IAAK,GAFD8jD,MAEKjnD,EAAI,EAAGA,EAAImD,EAAMhD,OAAQH,IAC5BmD,EAAMnD,YAAchD,IACtBiqD,EAAStkD,KAAKQ,EAAMnD,GAGxB,OAAOinD,IAYT1pD,EAAQ8R,UAAUwpC,SAAW,SAAU50C,GAErCpJ,KAAKmpD,YAAYj5B,KAAOxtB,EAAQ2pD,eAAejjD,IAQjD1G,EAAQ8R,UAAUmpC,aAAe,SAAUv0C,GACzC,GAAKpJ,KAAK8N,QAAQi6C,SAASC,YAAehoD,KAAK8N,QAAQi6C,SAASE,YAAhE,CAIA,GAEItiD,GAFAuqB,EAAOlwB,KAAKmpD,YAAYj5B,MAAQ,KAChCP,EAAK3vB,IAGT,IAAIkwB,GAAQA,EAAKo8B,SAAU,CACzB,GAAIC,GAAenjD,EAAMG,OAAOgjD,aAC5BC,EAAgBpjD,EAAMG,OAAOijD,aAE7BD,IACF5mD,GACEuqB,KAAMq8B,GAGJ58B,EAAG7hB,QAAQi6C,SAASC,aACtBriD,EAAMmJ,MAAQohB,EAAKtE,KAAK9c,MAAMnI,WAE5BgpB,EAAG7hB,QAAQi6C,SAASE,aAClB,SAAW/3B,GAAKtE,OAAMjmB,EAAMqoB,MAAQkC,EAAKtE,KAAKoC,OAGpDhuB,KAAKmpD,YAAYsD,WAAa9mD,IAEvB6mD,GACP7mD,GACEuqB,KAAMs8B,GAGJ78B,EAAG7hB,QAAQi6C,SAASC,aACtBriD,EAAM0b,IAAM6O,EAAKtE,KAAKvK,IAAI1a,WAExBgpB,EAAG7hB,QAAQi6C,SAASE,aAClB,SAAW/3B,GAAKtE,OAAMjmB,EAAMqoB,MAAQkC,EAAKtE,KAAKoC,OAGpDhuB,KAAKmpD,YAAYsD,WAAa9mD,IAG9B3F,KAAKmpD,YAAYsD,UAAYzsD,KAAK+vC,eAAevjB,IAAI,SAAUnsB,GAC7D,GAAI6vB,GAAOP,EAAG5tB,MAAM1B,GAChBsF,GACFuqB,KAAMA,EAWR,OARIP,GAAG7hB,QAAQi6C,SAASC,aAClB,SAAW93B,GAAKtE,OAAMjmB,EAAMmJ,MAAQohB,EAAKtE,KAAK9c,MAAMnI,WACpD,OAASupB,GAAKtE,OAAQjmB,EAAM0b,IAAM6O,EAAKtE,KAAKvK,IAAI1a,YAElDgpB,EAAG7hB,QAAQi6C,SAASE,aAClB,SAAW/3B,GAAKtE,OAAMjmB,EAAMqoB,MAAQkC,EAAKtE,KAAKoC,OAG7CroB,IAIXyD,EAAMwuC,qBASVl1C,EAAQ8R,UAAUopC,QAAU,SAAUx0C,GACpC,GAAIpJ,KAAKmpD,YAAYsD,UAAW,CAC9B,GAAIv+C,GAAQlO,KAAKkuC,KAAKhgC,MAClBogC,EAAOtuC,KAAKkuC,KAAKvtC,KAAK2tC,MAAQ,KAC9BiG,EAASnrC,EAAM2nC,QAAQwD,OACvB1d,EAAS72B,KAAK2F,MAAM4oB,OAASrgB,EAAMmT,IAAMnT,EAAMY,OAC/Cqc,EAASopB,EAAS1d,CAGtB72B,MAAKmpD,YAAYsD,UAAUtkD,QAAQ,SAAUxC,GAC3C,GAAI,SAAWA,GAAO,CACpB,GAAImJ,GAAQ,GAAI7K,MAAK0B,EAAMmJ,MAAQqc,EACnCxlB,GAAMuqB,KAAKtE,KAAK9c,MAAQw/B,EAAOA,EAAKx/B,GAASA,EAG/C,GAAI,OAASnJ,GAAO,CAClB,GAAI0b,GAAM,GAAIpd,MAAK0B,EAAM0b,IAAM8J,EAC/BxlB,GAAMuqB,KAAKtE,KAAKvK,IAAMitB,EAAOA,EAAKjtB,GAAOA,EAG3C,GAAI,SAAW1b,GAAO,CAEpB,GAAIqoB,GAAQtrB,EAAQgqD,gBAAgBtjD,EACpCggD,GAAazjD,EAAMuqB,KAAMlC,MAM7BhuB,KAAKkpD,YAAa,EAClBlpD,KAAKkuC,KAAKE,QAAQ3H,KAAK,UAEvBr9B,EAAMwuC,oBA2BVl1C,EAAQ8R,UAAUqpC,WAAa,SAAUz0C,GACvC,GAAIpJ,KAAKmpD,YAAYsD,UAAW,CAE9B,GAAIE,MACAh9B,EAAK3vB,KACLmwC,EAAUnwC,KAAKmvC,UAAU9d,aAEzBo7B,EAAYzsD,KAAKmpD,YAAYsD,SACjCzsD,MAAKmpD,YAAYsD,UAAY,KAC7BA,EAAUtkD,QAAQ,SAAUxC,GAC1B,GAAItF,GAAKsF,EAAMuqB,KAAK7vB,GAChB2vC,EAAWrgB,EAAGwf,UAAUz2B,IAAIrY,EAAIsvB,EAAG44B,aAEnClK,GAAU,CACV,UAAW14C,GAAMuqB,KAAKtE,OACxByyB,EAAW14C,EAAMmJ,OAASnJ,EAAMuqB,KAAKtE,KAAK9c,MAAMnI,UAChDqpC,EAASlhC,MAAQnO,EAAK6F,QAAQb,EAAMuqB,KAAKtE,KAAK9c,MACtCqhC,EAAQzhB,SAASjoB,MAAQ0pC,EAAQzhB,SAASjoB,KAAKqI,OAAS,SAE9D,OAASnJ,GAAMuqB,KAAKtE,OACtByyB,EAAUA,GAAa14C,EAAM0b,KAAO1b,EAAMuqB,KAAKtE,KAAKvK,IAAI1a,UACxDqpC,EAAS3uB,IAAM1gB,EAAK6F,QAAQb,EAAMuqB,KAAKtE,KAAKvK,IACpC8uB,EAAQzhB,SAASjoB,MAAQ0pC,EAAQzhB,SAASjoB,KAAK4a,KAAO,SAE5D,SAAW1b,GAAMuqB,KAAKtE,OACxByyB,EAAUA,GAAa14C,EAAMqoB,OAASroB,EAAMuqB,KAAKtE,KAAKoC,MACtDgiB,EAAShiB,MAAQroB,EAAMuqB,KAAKtE,KAAKoC,OAI/BqwB,GACF1uB,EAAG7hB,QAAQs6C,OAAOpY,EAAU,SAAUA,GACpC,GAAIA,EAEFA,EAASG,EAAQxhB,UAAYtuB,EAC7BssD,EAAQ7kD,KAAKkoC,OAEV,CAIH,GAFI,SAAWrqC,KAAOA,EAAMuqB,KAAKtE,KAAK9c,MAAQnJ,EAAMmJ,OAChD,OAASnJ,KAASA,EAAMuqB,KAAKtE,KAAKvK,IAAQ1b,EAAM0b,KAChD,SAAW1b,IAASA,EAAMuqB,KAAKtE,KAAKoC,OAASroB,EAAMqoB,MAAO,CAC5D,GAAIA,GAAQ2B,EAAGigB,OAAOjqC,EAAMqoB,MAC5Bo7B,GAAazjD,EAAMuqB,KAAMlC,GAG3B2B,EAAGu5B,YAAa,EAChBv5B,EAAGue,KAAKE,QAAQ3H,KAAK,eAOzBkmB,EAAQrnD,QACV6qC,EAAQ7f,OAAOq8B,GAGjBvjD,EAAMwuC,oBASVl1C,EAAQ8R,UAAUm1C,cAAgB,SAAUvgD,GAC1C,GAAKpJ,KAAK8N,QAAQg6C,WAAlB,CAEA,GAAI8E,GAAWxjD,EAAM2nC,QAAQ2G,UAAYtuC,EAAM2nC,QAAQ2G,SAASkV,QAC5DC,EAAWzjD,EAAM2nC,QAAQ2G,UAAYtuC,EAAM2nC,QAAQ2G,SAASmV,QAChE,IAAID,GAAWC,EAEb,WADA7sD,MAAK4pD,mBAAmBxgD,EAI1B,IAAI0jD,GAAe9sD,KAAK+vC,eAEpB7f,EAAOxtB,EAAQ2pD,eAAejjD,GAC9B6/C,EAAY/4B,GAAQA,EAAK7vB,MAC7BL,MAAK6vC,aAAaoZ,EAElB,IAAI8D,GAAe/sD,KAAK+vC,gBAIpBgd,EAAaznD,OAAS,GAAKwnD,EAAaxnD,OAAS,IACnDtF,KAAKkuC,KAAKE,QAAQ3H,KAAK,UACrB1kC,MAAO/B,KAAK+vC,iBAIhB3mC,EAAMwuC,oBAQRl1C,EAAQ8R,UAAUq1C,WAAa,SAAUzgD,GACvC,GAAKpJ,KAAK8N,QAAQg6C,YACb9nD,KAAK8N,QAAQi6C,SAASxmC,IAA3B,CAEA,GAAIoO,GAAK3vB,KACLsuC,EAAOtuC,KAAKkuC,KAAKvtC,KAAK2tC,MAAQ,KAC9Bpe,EAAOxtB,EAAQ2pD,eAAejjD,EAElC,IAAI8mB,EAAM,CAIR,GAAI8f,GAAWrgB,EAAGwf,UAAUz2B,IAAIwX,EAAK7vB,GACrCL,MAAK8N,QAAQq6C,SAASnY,EAAU,SAAUA,GACpCA,GACFrgB,EAAGwf,UAAU7e,OAAO0f,SAIrB,CAEH,GAAIgd,GAAOrsD,EAAKsG,gBAAgBjH,KAAK4oC,IAAI5P,OACrCjL,EAAI3kB,EAAM2nC,QAAQhM,OAAOmP,MAAQ8Y,EACjCl+C,EAAQ9O,KAAKkuC,KAAKvtC,KAAKguC,OAAO5gB,GAC9Bk/B,GACFn+C,MAAOw/B,EAAOA,EAAKx/B,GAASA,EAC5B25B,QAAS,WAIX,IAA0B,UAAtBzoC,KAAK8N,QAAQrH,KAAkB,CACjC,GAAI4a,GAAMrhB,KAAKkuC,KAAKvtC,KAAKguC,OAAO5gB,EAAI/tB,KAAK2F,MAAM4oB,MAAQ,EACvD0+B,GAAQ5rC,IAAMitB,EAAOA,EAAKjtB,GAAOA,EAGnC4rC,EAAQjtD,KAAKmvC,UAAUvgB,SAAWjuB,EAAKgE,YAEvC,IAAIqpB,GAAQtrB,EAAQgqD,gBAAgBtjD,EAChC4kB,KACFi/B,EAAQj/B,MAAQA,EAAMq7B,SAIxBrpD,KAAK8N,QAAQo6C,MAAM+E,EAAS,SAAU/8B,GAChCA,GACFP,EAAGwf,UAAU5tB,IAAI0rC,QAYzBvqD,EAAQ8R,UAAUo1C,mBAAqB,SAAUxgD,GAC/C,GAAKpJ,KAAK8N,QAAQg6C,WAAlB,CAEA,GAAImB,GACA/4B,EAAOxtB,EAAQ2pD,eAAejjD,EAElC,IAAI8mB,EAAM,CAER+4B,EAAYjpD,KAAK+vC,cACjB,IAAI9nC,GAAQghD,EAAU3iD,QAAQ4pB,EAAK7vB,GACtB,KAAT4H,EAEFghD,EAAUnhD,KAAKooB,EAAK7vB,IAIpB4oD,EAAU/gD,OAAOD,EAAO,GAE1BjI,KAAK6vC,aAAaoZ,GAElBjpD,KAAKkuC,KAAKE,QAAQ3H,KAAK,UACrB1kC,MAAO/B,KAAK+vC,iBAGd3mC,EAAMwuC,qBAUVl1C,EAAQ2pD,eAAiB,SAASjjD,GAEhC,IADA,GAAIG,GAASH,EAAMG,OACZA,GAAQ,CACb,GAAIA,EAAO9D,eAAe,iBACxB,MAAO8D,GAAO,gBAEhBA,GAASA,EAAOG,WAGlB,MAAO,OASThH,EAAQgqD,gBAAkB,SAAStjD,GAEjC,IADA,GAAIG,GAASH,EAAMG,OACZA,GAAQ,CACb,GAAIA,EAAO9D,eAAe,kBACxB,MAAO8D,GAAO,iBAEhBA,GAASA,EAAOG,WAGlB,MAAO,OASThH,EAAQwqD,kBAAoB,SAAS9jD,GAEnC,IADA,GAAIG,GAASH,EAAMG,OACZA,GAAQ,CACb,GAAIA,EAAO9D,eAAe,oBACxB,MAAO8D,GAAO,mBAEhBA,GAASA,EAAOG,WAGlB,MAAO,OAGT7J,EAAOD,QAAU8C,GAKb,SAAS7C,EAAQD,EAASM,GAY9B,QAASuC,GAAO4mD,EAASz9B,EAAMsjB,GAC7BlvC,KAAKqpD,QAAUA,EAEfrpD,KAAKkvC,QAAUA,EAEflvC,KAAK4oC,OACL5oC,KAAK2F,OACHm8B,OACEvT,MAAO,EACPC,OAAQ,IAGZxuB,KAAK2H,UAAY,KAEjB3H,KAAK+B,SACL/B,KAAKsqD,gBACLtqD,KAAKiO,cACHk/C,WACAC,UAGFptD,KAAKiuC,UAELjuC,KAAKmzB,QAAQvH,GAjCf,GAAIjrB,GAAOT,EAAoB,GAC3B0B,EAAQ1B,EAAoB,IAC5BiC,EAAYjC,EAAoB,GAsCpCuC,GAAM+R,UAAUy5B,QAAU,WACxB,GAAInM,GAAQtU,SAASK,cAAc,MACnCiU,GAAMn6B,UAAY,SAClB3H,KAAK4oC,IAAI9G,MAAQA,CAEjB,IAAIurB,GAAQ7/B,SAASK,cAAc,MACnCw/B,GAAM1lD,UAAY,QAClBm6B,EAAMpU,YAAY2/B,GAClBrtD,KAAK4oC,IAAIykB,MAAQA,CAEjB,IAAI3K,GAAal1B,SAASK,cAAc,MACxC60B,GAAW/6C,UAAY,QACvB+6C,EAAW,kBAAoB1iD,KAC/BA,KAAK4oC,IAAI8Z,WAAaA,EAEtB1iD,KAAK4oC,IAAIl9B,WAAa8hB,SAASK,cAAc,OAC7C7tB,KAAK4oC,IAAIl9B,WAAW/D,UAAY,QAEhC3H,KAAK4oC,IAAI0f,KAAO96B,SAASK,cAAc,OACvC7tB,KAAK4oC,IAAI0f,KAAK3gD,UAAY,QAK1B3H,KAAK4oC,IAAI0kB,OAAS9/B,SAASK,cAAc,OACzC7tB,KAAK4oC,IAAI0kB,OAAOn/B,MAAM0zB,WAAa,SACnC7hD,KAAK4oC,IAAI0kB,OAAO7vB,UAAY,IAC5Bz9B,KAAK4oC,IAAIl9B,WAAWgiB,YAAY1tB,KAAK4oC,IAAI0kB,SAO3C7qD,EAAM+R,UAAU2e,QAAU,SAASvH,GAEjC,GAAI6c,GAAU7c,GAAQA,EAAK6c,OACvBA,aAAmB8kB,SACrBvtD,KAAK4oC,IAAIykB,MAAM3/B,YAAY+a,GAG3BzoC,KAAK4oC,IAAIykB,MAAM5vB,UADIt3B,SAAZsiC,GAAqC,OAAZA,EACLA,EAGAzoC,KAAKqpD,SAAW,GAI7CrpD,KAAK4oC,IAAI9G,MAAMulB,MAAQz7B,GAAQA,EAAKy7B,OAAS,GAExCrnD,KAAK4oC,IAAIykB,MAAMjwB,WAIlBz8B,EAAKqH,gBAAgBhI,KAAK4oC,IAAIykB,MAAO,UAHrC1sD,EAAK+G,aAAa1H,KAAK4oC,IAAIykB,MAAO,SAOpC,IAAI1lD,GAAYikB,GAAQA,EAAKjkB,WAAa,IACtCA,IAAa3H,KAAK2H,YAChB3H,KAAK2H,YACPhH,EAAKqH,gBAAgBhI,KAAK4oC,IAAI9G,MAAOn6B,GACrChH,EAAKqH,gBAAgBhI,KAAK4oC,IAAI8Z,WAAY/6C,GAC1ChH,EAAKqH,gBAAgBhI,KAAK4oC,IAAIl9B,WAAY/D,GAC1ChH,EAAKqH,gBAAgBhI,KAAK4oC,IAAI0f,KAAM3gD,IAEtChH,EAAK+G,aAAa1H,KAAK4oC,IAAI9G,MAAOn6B,GAClChH,EAAK+G,aAAa1H,KAAK4oC,IAAI8Z,WAAY/6C,GACvChH,EAAK+G,aAAa1H,KAAK4oC,IAAIl9B,WAAY/D,GACvChH,EAAK+G,aAAa1H,KAAK4oC,IAAI0f,KAAM3gD,KAQrClF,EAAM+R,UAAUg5C,cAAgB,WAC9B,MAAOxtD,MAAK2F,MAAMm8B,MAAMvT,OAW1B9rB,EAAM+R,UAAU2mB,OAAS,SAASjtB,EAAO4lB,EAAQ82B,GAC/C,GAAIvL,IAAU,CAEdr/C,MAAKsqD,aAAetqD,KAAKytD,oBAAoBztD,KAAKiO,aAAcjO,KAAKsqD,aAAcp8C,EAInF,IAAIw/C,GAAe1tD,KAAK4oC,IAAI0kB,OAAOjvB,YAC/BqvB,IAAgB1tD,KAAK2tD,mBACvB3tD,KAAK2tD,iBAAmBD,EAExB/sD,EAAKwH,QAAQnI,KAAK+B,MAAO,SAAUmuB,GACjCA,EAAK09B,OAAQ,EACT19B,EAAKg8B,WAAWh8B,EAAKiL,WAG3ByvB,GAAU,GAIR5qD,KAAKkvC,QAAQphC,QAAQlM,MACvBA,EAAMA,MAAM5B,KAAKsqD,aAAcx2B,EAAQ82B,GAGvChpD,EAAMisD,QAAQ7tD,KAAKsqD,aAAcx2B,EAInC,IAAItF,GACA87B,EAAetqD,KAAKsqD,YACxB,IAAIA,EAAahlD,OAAQ,CACvB,GAAI+F,GAAMi/C,EAAa,GAAG9iD,IACtBsF,EAAMw9C,EAAa,GAAG9iD,IAAM8iD,EAAa,GAAG97B,MAKhD,IAJA7tB,EAAKwH,QAAQmiD,EAAc,SAAUp6B,GACnC7kB,EAAMxG,KAAKwG,IAAIA,EAAK6kB,EAAK1oB,KACzBsF,EAAMjI,KAAKiI,IAAIA,EAAMojB,EAAK1oB,IAAM0oB,EAAK1B,UAEnCnjB,EAAMyoB,EAAOw0B,KAAM,CAErB,GAAIn9B,GAAS9f,EAAMyoB,EAAOw0B,IAC1Bx7C,IAAOqe,EACPxqB,EAAKwH,QAAQmiD,EAAc,SAAUp6B,GACnCA,EAAK1oB,KAAO2jB,IAGhBqD,EAAS1hB,EAAMgnB,EAAO5D,KAAK6O,SAAW,MAGtCvQ,GAASsF,EAAOw0B,KAAOx0B,EAAO5D,KAAK6O,QAErCvQ,GAAS3pB,KAAKiI,IAAI0hB,EAAQxuB,KAAK2F,MAAMm8B,MAAMtT,OAG3C,IAAIk0B,GAAa1iD,KAAK4oC,IAAI8Z,UAC1B1iD,MAAKwH,IAAMk7C,EAAWyI,UACtBnrD,KAAKoH,KAAOs7C,EAAW0I,WACvBprD,KAAKuuB,MAAQm0B,EAAWzZ,YACxBoW,EAAU1+C,EAAK4H,eAAevI,KAAM,SAAUwuB,IAAW6wB,EAGzDA,EAAU1+C,EAAK4H,eAAevI,KAAK2F,MAAMm8B,MAAO,QAAS9hC,KAAK4oC,IAAIykB,MAAMn0B,cAAgBmmB,EACxFA,EAAU1+C,EAAK4H,eAAevI,KAAK2F,MAAMm8B,MAAO,SAAU9hC,KAAK4oC,IAAIykB,MAAMhvB,eAAiBghB,EAG1Fr/C,KAAK4oC,IAAIl9B,WAAWyiB,MAAMK,OAAUA,EAAS,KAC7CxuB,KAAK4oC,IAAI8Z,WAAWv0B,MAAMK,OAAUA,EAAS,KAC7CxuB,KAAK4oC,IAAI9G,MAAM3T,MAAMK,OAASA,EAAS,IAGvC,KAAK,GAAIrpB,GAAI,EAAG+kD,EAAKlqD,KAAKsqD,aAAahlD,OAAY4kD,EAAJ/kD,EAAQA,IAAK,CAC1D,GAAI+qB,GAAOlwB,KAAKsqD,aAAanlD,EAC7B+qB,GAAK49B,cAGP,MAAOzO,IAMT58C,EAAM+R,UAAUs1C,KAAO,WAChB9pD,KAAK4oC,IAAI9G,MAAMp4B,YAClB1J,KAAKkvC,QAAQtG,IAAI6gB,SAAS/7B,YAAY1tB,KAAK4oC,IAAI9G,OAG5C9hC,KAAK4oC,IAAI8Z,WAAWh5C,YACvB1J,KAAKkvC,QAAQtG,IAAI8Z,WAAWh1B,YAAY1tB,KAAK4oC,IAAI8Z,YAG9C1iD,KAAK4oC,IAAIl9B,WAAWhC,YACvB1J,KAAKkvC,QAAQtG,IAAIl9B,WAAWgiB,YAAY1tB,KAAK4oC,IAAIl9B,YAG9C1L,KAAK4oC,IAAI0f,KAAK5+C,YACjB1J,KAAKkvC,QAAQtG,IAAI0f,KAAK56B,YAAY1tB,KAAK4oC,IAAI0f,OAO/C7lD,EAAM+R,UAAUy1C,KAAO,WACrB,GAAInoB,GAAQ9hC,KAAK4oC,IAAI9G,KACjBA,GAAMp4B,YACRo4B,EAAMp4B,WAAW0jB,YAAY0U,EAG/B,IAAI4gB,GAAa1iD,KAAK4oC,IAAI8Z,UACtBA,GAAWh5C,YACbg5C,EAAWh5C,WAAW0jB,YAAYs1B,EAGpC,IAAIh3C,GAAa1L,KAAK4oC,IAAIl9B,UACtBA,GAAWhC,YACbgC,EAAWhC,WAAW0jB,YAAY1hB,EAGpC,IAAI48C,GAAOtoD,KAAK4oC,IAAI0f,IAChBA,GAAK5+C,YACP4+C,EAAK5+C,WAAW0jB,YAAYk7B,IAQhC7lD,EAAM+R,UAAU+M,IAAM,SAAS2O,GAI7B,GAHAlwB,KAAK+B,MAAMmuB,EAAK7vB,IAAM6vB,EACtBA,EAAK69B,UAAU/tD,MAEwB,IAAnCA,KAAKsqD,aAAahkD,QAAQ4pB,GAAa,CACzC,GAAIhiB,GAAQlO,KAAKkvC,QAAQhB,KAAKhgC,KAC9BlO,MAAKguD,gBAAgB99B,EAAMlwB,KAAKsqD,aAAcp8C,KAQlDzL,EAAM+R,UAAUmd,OAAS,SAASzB,SACzBlwB,MAAK+B,MAAMmuB,EAAK7vB,IACvB6vB,EAAK69B,UAAU/tD,KAAKkvC,QAGpB,IAAIjnC,GAAQjI,KAAKsqD,aAAahkD,QAAQ4pB,EACzB,KAATjoB,GAAajI,KAAKsqD,aAAapiD,OAAOD,EAAO,IASnDxF,EAAM+R,UAAUy5C,kBAAoB,SAAS/9B,GAC3ClwB,KAAKkvC,QAAQ2c,WAAW37B,EAAK7vB,KAM/BoC,EAAM+R,UAAUwc,MAAQ,WACtB,GAAI1oB,GAAQ3H,EAAK0H,QAAQrI,KAAK+B,MAC9B/B,MAAKiO,aAAak/C,QAAU7kD,EAC5BtI,KAAKiO,aAAam/C,MAAQptD,KAAKmsD,qBAAqB7jD,GAEpD1G,EAAMssD,aAAaluD,KAAKiO,aAAak/C,SACrCvrD,EAAMusD,WAAWnuD,KAAKiO,aAAam/C,QASrC3qD,EAAM+R,UAAU23C,qBAAuB,SAAS7jD,GAG9C,IAAK,GAFD8jD,MAEKjnD,EAAI,EAAGA,EAAImD,EAAMhD,OAAQH,IAC5BmD,EAAMnD,YAAchD,IACtBiqD,EAAStkD,KAAKQ,EAAMnD,GAGxB,OAAOinD,IAWT3pD,EAAM+R,UAAUi5C,oBAAsB,SAASx/C,EAAcq8C,EAAcp8C,GACzE,GAAIkgD,GAEAjpD,EADAkpD,IAKJ,IAAI/D,EAAahlD,OAAS,EACxB,IAAKH,EAAI,EAAGA,EAAImlD,EAAahlD,OAAQH,IACnCnF,KAAKguD,gBAAgB1D,EAAanlD,GAAIkpD,EAAiBngD,EAMzDkgD,GAD4B,GAA1BC,EAAgB/oD,OACE3E,EAAKqN,aAAaC,EAAak/C,QAASj/C,EAAO,OAAO,SAGtDD,EAAak/C,QAAQ7mD,QAAQ+nD,EAAgB,GAInE,IAAIC,GAAkB3tD,EAAKqN,aAAaC,EAAam/C,MAAOl/C,EAAO,OAAO,MAG1E,IAAyB,IAArBkgD,EAAyB,CAC3B,IAAKjpD,EAAIipD,EAAmBjpD,GAAK,IAC3BnF,KAAKuuD,kBAAkBtgD,EAAak/C,QAAQhoD,GAAIkpD,EAAiBngD,GADnC/I,KAGpC,IAAKA,EAAIipD,EAAoB,EAAGjpD,EAAI8I,EAAak/C,QAAQ7nD,SACnDtF,KAAKuuD,kBAAkBtgD,EAAak/C,QAAQhoD,GAAIkpD,EAAiBngD,GADN/I,MAMnE,GAAuB,IAAnBmpD,EAAuB,CACzB,IAAKnpD,EAAImpD,EAAiBnpD,GAAK,IACzBnF,KAAKuuD,kBAAkBtgD,EAAam/C,MAAMjoD,GAAIkpD,EAAiBngD,GADnC/I,KAGlC,IAAKA,EAAImpD,EAAkB,EAAGnpD,EAAI8I,EAAam/C,MAAM9nD,SAC/CtF,KAAKuuD,kBAAkBtgD,EAAam/C,MAAMjoD,GAAIkpD,EAAiBngD,GADR/I,MAK/D,MAAOkpD,IAeT5rD,EAAM+R,UAAU+5C,kBAAoB,SAASr+B,EAAMo6B,EAAcp8C,GAC/D,MAAIgiB,GAAKrhB,UAAUX,IACZgiB,EAAKg8B,WAAWh8B,EAAK45B,OAC1B55B,EAAKs+B,cAC6B,IAA9BlE,EAAahkD,QAAQ4pB,IACvBo6B,EAAaxiD,KAAKooB,IAEb,IAGHA,EAAKg8B,WAAWh8B,EAAK+5B,QAClB,IAeXxnD,EAAM+R,UAAUw5C,gBAAkB,SAAS99B,EAAMo6B,EAAcp8C,GACzDgiB,EAAKrhB,UAAUX,IACZgiB,EAAKg8B,WAAWh8B,EAAK45B,OAE1B55B,EAAKs+B,cACLlE,EAAaxiD,KAAKooB,IAGdA,EAAKg8B,WAAWh8B,EAAK+5B,QAI7BpqD,EAAOD,QAAU6C,GAKb,SAAS5C,EAAQD,GAGrB,GAAI6uD,GAAU,IAMd7uD,GAAQsuD,aAAe,SAASnsD,GAC9BA,EAAMyvB,KAAK,SAAUtsB,EAAGa,GACtB,MAAOb,GAAE0mB,KAAK9c,MAAQ/I,EAAE6lB,KAAK9c,SASjClP,EAAQuuD,WAAa,SAASpsD,GAC5BA,EAAMyvB,KAAK,SAAUtsB,EAAGa,GACtB,GAAI2oD,GAAS,OAASxpD,GAAE0mB,KAAQ1mB,EAAE0mB,KAAKvK,IAAMnc,EAAE0mB,KAAK9c,MAChD6/C,EAAS,OAAS5oD,GAAE6lB,KAAQ7lB,EAAE6lB,KAAKvK,IAAMtb,EAAE6lB,KAAK9c,KAEpD,OAAO4/C,GAAQC,KAenB/uD,EAAQgC,MAAQ,SAASG,EAAO+xB,EAAQ86B,GACtC,GAAIzpD,GAAG0pD,CAEP,IAAID,EAEF,IAAKzpD,EAAI,EAAG0pD,EAAO9sD,EAAMuD,OAAYupD,EAAJ1pD,EAAUA,IACzCpD,EAAMoD,GAAGqC,IAAM,IAKnB,KAAKrC,EAAI,EAAG0pD,EAAO9sD,EAAMuD,OAAYupD,EAAJ1pD,EAAUA,IAAK,CAC9C,GAAI+qB,GAAOnuB,EAAMoD,EACjB,IAAiB,OAAb+qB,EAAK1oB,IAAc,CAErB0oB,EAAK1oB,IAAMssB,EAAOw0B,IAElB,GAAG,CAID,IAAK,GADDwG,GAAgB,KACXt2C,EAAI,EAAGu2C,EAAKhtD,EAAMuD,OAAYypD,EAAJv2C,EAAQA,IAAK,CAC9C,GAAIjT,GAAQxD,EAAMyW,EAClB,IAAkB,OAAdjT,EAAMiC,KAAgBjC,IAAU2qB,GAAQtwB,EAAQovD,UAAU9+B,EAAM3qB,EAAOuuB,EAAO5D,MAAO,CACvF4+B,EAAgBvpD,CAChB,QAIiB,MAAjBupD,IAEF5+B,EAAK1oB,IAAMsnD,EAActnD,IAAMsnD,EAActgC,OAASsF,EAAO5D,KAAK6O,gBAE7D+vB,MAYflvD,EAAQiuD,QAAU,SAAS9rD,EAAO+xB,GAChC,GAAI3uB,GAAG0pD,CAGP,KAAK1pD,EAAI,EAAG0pD,EAAO9sD,EAAMuD,OAAYupD,EAAJ1pD,EAAUA,IACzCpD,EAAMoD,GAAGqC,IAAMssB,EAAOw0B,MAc1B1oD,EAAQovD,UAAY,SAAS9pD,EAAGa,EAAG+tB,GACjC,MAAS5uB,GAAEkC,KAAO0sB,EAAOgL,WAAa2vB,EAAkB1oD,EAAEqB,KAAOrB,EAAEwoB,OAC9DrpB,EAAEkC,KAAOlC,EAAEqpB,MAAQuF,EAAOgL,WAAa2vB,EAAW1oD,EAAEqB,MACpDlC,EAAEsC,IAAMssB,EAAOiL,SAAW0vB,EAAyB1oD,EAAEyB,IAAMzB,EAAEyoB,QAC7DtpB,EAAEsC,IAAMtC,EAAEspB,OAASsF,EAAOiL,SAAW0vB,EAAa1oD,EAAEyB,MAMvD,SAAS3H,EAAQD,EAASM,GAe9B,QAASiC,GAAWypB,EAAM8yB,EAAY5wC,GASpC,GARA9N,KAAK2F,OACH8iC,SACEla,MAAO,IAGXvuB,KAAK6P,UAAW,EAGZ+b,EAAM,CACR,GAAkBzlB,QAAdylB,EAAK9c,MACP,KAAM,IAAItL,OAAM,oCAAsCooB,EAAKvrB,GAE7D,IAAgB8F,QAAZylB,EAAKvK,IACP,KAAM,IAAI7d,OAAM,kCAAoCooB,EAAKvrB,IAI7D2B,EAAKzB,KAAKP,KAAM4rB,EAAM8yB,EAAY5wC,GA/BpC,GAAI0iC,GAAStwC,EAAoB,IAC7B8B,EAAO9B,EAAoB,GAiC/BiC,GAAUqS,UAAY,GAAIxS,GAAM,KAAM,KAAM,MAE5CG,EAAUqS,UAAUy6C,cAAgB,aAOpC9sD,EAAUqS,UAAU3F,UAAY,SAASX,GAEvC,MAAQlO,MAAK4rB,KAAK9c,MAAQZ,EAAMmT,KAASrhB,KAAK4rB,KAAKvK,IAAMnT,EAAMY,OAMjE3M,EAAUqS,UAAU2mB,OAAS,WAC3B,GAAIyN,GAAM5oC,KAAK4oC,GAoBf,IAnBKA,IAEH5oC,KAAK4oC,OACLA,EAAM5oC,KAAK4oC,IAGXA,EAAI4gB,IAAMh8B,SAASK,cAAc,OAIjC+a,EAAIH,QAAUjb,SAASK,cAAc,OACrC+a,EAAIH,QAAQ9gC,UAAY,UACxBihC,EAAI4gB,IAAI97B,YAAYkb,EAAIH,SAGxBG,EAAI4gB,IAAI,iBAAmBxpD,OAIxBA,KAAK+zC,OACR,KAAM,IAAIvwC,OAAM,yCAElB,KAAKolC,EAAI4gB,IAAI9/C,WAAY,CACvB,GAAIg5C,GAAa1iD,KAAK+zC,OAAOnL,IAAI8Z,UACjC,KAAKA,EACH,KAAM,IAAIl/C,OAAM,sEAElBk/C,GAAWh1B,YAAYkb,EAAI4gB,KAK7B,GAHAxpD,KAAKksD,WAAY,EAGblsD,KAAK4rB,KAAK6c,SAAWzoC,KAAKyoC,QAAS,CAErC,GADAzoC,KAAKyoC,QAAUzoC,KAAK4rB,KAAK6c,QACrBzoC,KAAKyoC,kBAAmB8kB,SAC1B3kB,EAAIH,QAAQhL,UAAY,GACxBmL,EAAIH,QAAQ/a,YAAY1tB,KAAKyoC,aAE1B,CAAA,GAAyBtiC,QAArBnG,KAAK4rB,KAAK6c,QAIjB,KAAM,IAAIjlC,OAAM,sCAAwCxD,KAAK4rB,KAAKvrB,GAHlEuoC,GAAIH,QAAQhL,UAAYz9B,KAAKyoC,QAM/BzoC,KAAK4tD,OAAQ,EAIX5tD,KAAK4rB,KAAKy7B,OAASrnD,KAAKqnD,QAC1Bze,EAAI4gB,IAAInC,MAAQrnD,KAAK4rB,KAAKy7B,MAC1BrnD,KAAKqnD,MAAQrnD,KAAK4rB,KAAKy7B,MAIzB,IAAI1/C,IAAa3H,KAAK4rB,KAAKjkB,UAAa,IAAM3H,KAAK4rB,KAAKjkB,UAAa,KAChE3H,KAAKssD,SAAW,YAAc,GAC/BtsD,MAAK2H,WAAaA,IACpB3H,KAAK2H,UAAYA,EACjBihC,EAAI4gB,IAAI7hD,UAAY3H,KAAKivD,cAAgBtnD,EAEzC3H,KAAK4tD,OAAQ,GAIX5tD,KAAK4tD,QAEP5tD,KAAK6P,SAA6D,WAAlDxI,OAAO6nD,iBAAiBtmB,EAAIH,SAAS54B,SAErD7P,KAAK2F,MAAM8iC,QAAQla,MAAQvuB,KAAK4oC,IAAIH,QAAQQ,YAC5CjpC,KAAKwuB,OAASxuB,KAAK4oC,IAAI4gB,IAAIrgB,aAE3BnpC,KAAK4tD,OAAQ,GAGf5tD,KAAKmvD,qBAAqBvmB,EAAI4gB,KAC9BxpD,KAAKovD,mBACLpvD,KAAKqvD,qBAOPltD,EAAUqS,UAAUs1C,KAAO,WACpB9pD,KAAKksD,WACRlsD,KAAKm7B,UAQTh5B,EAAUqS,UAAUy1C,KAAO,WACzB,GAAIjqD,KAAKksD,UAAW,CAClB,GAAI1C,GAAMxpD,KAAK4oC,IAAI4gB,GAEfA,GAAI9/C,YACN8/C,EAAI9/C,WAAW0jB,YAAYo8B,GAG7BxpD,KAAKwH,IAAM,KACXxH,KAAKoH,KAAO,KAEZpH,KAAKksD,WAAY,IAQrB/pD,EAAUqS,UAAUg6C,YAAc,WAChC,GAKIc,GALA3pD,EAAQ3F,KAAK2F,MACb4pD,EAAcvvD,KAAK+zC,OAAOxlB,MAC1Bzf,EAAQ9O,KAAK0+C,WAAWnQ,SAASvuC,KAAK4rB,KAAK9c,OAC3CuS,EAAMrhB,KAAK0+C,WAAWnQ,SAASvuC,KAAK4rB,KAAKvK,KACzCmc,EAAUx9B,KAAK8N,QAAQ0vB,SAId+xB,EAATzgD,IACFA,GAASygD,GAEPluC,EAAM,EAAIkuC,IACZluC,EAAM,EAAIkuC,EAEZ,IAAIC,GAAW3qD,KAAKiI,IAAIuU,EAAMvS,EAAO,EAEjC9O,MAAK6P,UAEPy/C,EAAczqD,KAAKiI,KAAKgC,EAAO,GAE/B9O,KAAKoH,KAAO0H,EACZ9O,KAAKuuB,MAAQihC,EAAWxvD,KAAK2F,MAAM8iC,QAAQla,QAQzC+gC,EADU,EAARxgD,EACYjK,KAAKwG,KAAKyD,EACnBuS,EAAMvS,EAAQnJ,EAAM8iC,QAAQla,MAAQ,EAAIiP,GAI/B,EAGhBx9B,KAAKoH,KAAO0H,EACZ9O,KAAKuuB,MAAQihC,GAGfxvD,KAAK4oC,IAAI4gB,IAAIr7B,MAAM/mB,KAAOpH,KAAKoH,KAAO,KACtCpH,KAAK4oC,IAAI4gB,IAAIr7B,MAAMI,MAAQihC,EAAW,KACtCxvD,KAAK4oC,IAAIH,QAAQta,MAAM/mB,KAAOkoD,EAAc,MAO9CntD,EAAUqS,UAAUs5C,YAAc,WAChC,GAAIhgB,GAAc9tC,KAAK8N,QAAQggC,YAC3B0b,EAAMxpD,KAAK4oC,IAAI4gB,GAGjBA,GAAIr7B,MAAM3mB,IADO,OAAfsmC,EACc9tC,KAAKwH,IAAM,KAGVxH,KAAK+zC,OAAOvlB,OAASxuB,KAAKwH,IAAMxH,KAAKwuB,OAAU,MAQpErsB,EAAUqS,UAAU46C,iBAAmB,WACrC,GAAIpvD,KAAKssD,UAAYtsD,KAAK8N,QAAQi6C,SAASC,aAAehoD,KAAK4oC,IAAI6mB,SAAU,CAE3E,GAAIA,GAAWjiC,SAASK,cAAc,MACtC4hC,GAAS9nD,UAAY,YACrB8nD,EAASlD,aAAevsD,KAGxBwwC,EAAOif,GACLtmD,gBAAgB,IACf4lB,GAAG,OAAQ,cAId/uB,KAAK4oC,IAAI4gB,IAAI97B,YAAY+hC,GACzBzvD,KAAK4oC,IAAI6mB,SAAWA,OAEZzvD,KAAKssD,UAAYtsD,KAAK4oC,IAAI6mB,WAE9BzvD,KAAK4oC,IAAI6mB,SAAS/lD,YACpB1J,KAAK4oC,IAAI6mB,SAAS/lD,WAAW0jB,YAAYptB,KAAK4oC,IAAI6mB,UAEpDzvD,KAAK4oC,IAAI6mB,SAAW,OAQxBttD,EAAUqS,UAAU66C,kBAAoB,WACtC,GAAIrvD,KAAKssD,UAAYtsD,KAAK8N,QAAQi6C,SAASC,aAAehoD,KAAK4oC,IAAI8mB,UAAW,CAE5E,GAAIA,GAAYliC,SAASK,cAAc,MACvC6hC,GAAU/nD,UAAY,aACtB+nD,EAAUlD,cAAgBxsD,KAG1BwwC,EAAOkf,GACLvmD,gBAAgB,IACf4lB,GAAG,OAAQ,cAId/uB,KAAK4oC,IAAI4gB,IAAI97B,YAAYgiC,GACzB1vD,KAAK4oC,IAAI8mB,UAAYA,OAEb1vD,KAAKssD,UAAYtsD,KAAK4oC,IAAI8mB,YAE9B1vD,KAAK4oC,IAAI8mB,UAAUhmD,YACrB1J,KAAK4oC,IAAI8mB,UAAUhmD,WAAW0jB,YAAYptB,KAAK4oC,IAAI8mB,WAErD1vD,KAAK4oC,IAAI8mB,UAAY,OAIzB7vD,EAAOD,QAAUuC,GAKb,SAAStC,EAAQD,EAASM,GAa9B,QAAS8B,GAAM4pB,EAAM8yB,EAAY5wC,GAC/B9N,KAAKK,GAAK,KACVL,KAAK+zC,OAAS,KACd/zC,KAAK4rB,KAAOA,EACZ5rB,KAAK4oC,IAAM,KACX5oC,KAAK0+C,WAAaA,MAClB1+C,KAAK8N,QAAUA,MAEf9N,KAAKssD,UAAW,EAChBtsD,KAAKksD,WAAY,EACjBlsD,KAAK4tD,OAAQ,EAEb5tD,KAAKwH,IAAM,KACXxH,KAAKoH,KAAO,KACZpH,KAAKuuB,MAAQ,KACbvuB,KAAKwuB,OAAS,KA1BhB,GAAIgiB,GAAStwC,EAAoB,GAgCjC8B,GAAKwS,UAAU41C,OAAS,WACtBpqD,KAAKssD,UAAW,EACZtsD,KAAKksD,WAAWlsD,KAAKm7B,UAM3Bn5B,EAAKwS,UAAU21C,SAAW,WACxBnqD,KAAKssD,UAAW,EACZtsD,KAAKksD,WAAWlsD,KAAKm7B,UAO3Bn5B,EAAKwS,UAAUu5C,UAAY,SAASha,GAC9B/zC,KAAKksD,WACPlsD,KAAKiqD,OACLjqD,KAAK+zC,OAASA,EACV/zC,KAAK+zC,QACP/zC,KAAK8pD,QAIP9pD,KAAK+zC,OAASA,GASlB/xC,EAAKwS,UAAU3F,UAAY,WAEzB,OAAO,GAOT7M,EAAKwS,UAAUs1C,KAAO,WACpB,OAAO,GAOT9nD,EAAKwS,UAAUy1C,KAAO,WACpB,OAAO,GAMTjoD,EAAKwS,UAAU2mB,OAAS,aAOxBn5B,EAAKwS,UAAUg6C,YAAc,aAO7BxsD,EAAKwS,UAAUs5C,YAAc,aAS7B9rD,EAAKwS,UAAU26C,qBAAuB,SAAUQ,GAC9C,GAAI3vD,KAAKssD,UAAYtsD,KAAK8N,QAAQi6C,SAASp2B,SAAW3xB,KAAK4oC,IAAIgnB,aAAc,CAE3E,GAAIjgC,GAAK3vB,KAEL4vD,EAAepiC,SAASK,cAAc,MAC1C+hC,GAAajoD,UAAY,SACzBioD,EAAavI,MAAQ,mBAErB7W,EAAOof,GACLzmD,gBAAgB,IACf4lB,GAAG,MAAO,SAAU3lB,GACrBumB,EAAGokB,OAAOka,kBAAkBt+B,GAC5BvmB,EAAMwuC,oBAGR+X,EAAOjiC,YAAYkiC,GACnB5vD,KAAK4oC,IAAIgnB,aAAeA,OAEhB5vD,KAAKssD,UAAYtsD,KAAK4oC,IAAIgnB,eAE9B5vD,KAAK4oC,IAAIgnB,aAAalmD,YACxB1J,KAAK4oC,IAAIgnB,aAAalmD,WAAW0jB,YAAYptB,KAAK4oC,IAAIgnB,cAExD5vD,KAAK4oC,IAAIgnB,aAAe,OAI5B/vD,EAAOD,QAAUoC,GAKb,SAASnC,EAAQD,EAASM,GAc9B,QAAS+B,GAAS2pB,EAAM8yB,EAAY5wC,GAalC,GAZA9N,KAAK2F,OACHgjC,KACEpa,MAAO,EACPC,OAAQ,GAEVka,MACEna,MAAO,EACPC,OAAQ,IAKR5C,GACgBzlB,QAAdylB,EAAK9c,MACP,KAAM,IAAItL,OAAM,oCAAsCooB,EAI1D5pB,GAAKzB,KAAKP,KAAM4rB,EAAM8yB,EAAY5wC,GA/BpC,GAAI9L,GAAO9B,EAAoB,GAkC/B+B,GAAQuS,UAAY,GAAIxS,GAAM,KAAM,KAAM,MAO1CC,EAAQuS,UAAU3F,UAAY,SAASX,GAGrC,GAAIg+B,IAAYh+B,EAAMmT,IAAMnT,EAAMY,OAAS,CAC3C,OAAQ9O,MAAK4rB,KAAK9c,MAAQZ,EAAMY,MAAQo9B,GAAclsC,KAAK4rB,KAAK9c,MAAQZ,EAAMmT,IAAM6qB,GAMtFjqC,EAAQuS,UAAU2mB,OAAS,WACzB,GAAIyN,GAAM5oC,KAAK4oC,GA2Bf,IA1BKA,IAEH5oC,KAAK4oC,OACLA,EAAM5oC,KAAK4oC,IAGXA,EAAI4gB,IAAMh8B,SAASK,cAAc,OAGjC+a,EAAIH,QAAUjb,SAASK,cAAc,OACrC+a,EAAIH,QAAQ9gC,UAAY,UACxBihC,EAAI4gB,IAAI97B,YAAYkb,EAAIH,SAGxBG,EAAIF,KAAOlb,SAASK,cAAc,OAClC+a,EAAIF,KAAK/gC,UAAY,OAGrBihC,EAAID,IAAMnb,SAASK,cAAc,OACjC+a,EAAID,IAAIhhC,UAAY,MAGpBihC,EAAI4gB,IAAI,iBAAmBxpD,OAIxBA,KAAK+zC,OACR,KAAM,IAAIvwC,OAAM,yCAElB,KAAKolC,EAAI4gB,IAAI9/C,WAAY,CACvB,GAAIg5C,GAAa1iD,KAAK+zC,OAAOnL,IAAI8Z,UACjC,KAAKA,EAAY,KAAM,IAAIl/C,OAAM,sEACjCk/C,GAAWh1B,YAAYkb,EAAI4gB,KAE7B,IAAK5gB,EAAIF,KAAKh/B,WAAY,CACxB,GAAIgC,GAAa1L,KAAK+zC,OAAOnL,IAAIl9B,UACjC,KAAKA,EAAY,KAAM,IAAIlI,OAAM,sEACjCkI,GAAWgiB,YAAYkb,EAAIF,MAE7B,IAAKE,EAAID,IAAIj/B,WAAY,CACvB,GAAI4+C,GAAOtoD,KAAK+zC,OAAOnL,IAAI0f,IAC3B,KAAK58C,EAAY,KAAM,IAAIlI,OAAM,gEACjC8kD,GAAK56B,YAAYkb,EAAID,KAKvB,GAHA3oC,KAAKksD,WAAY,EAGblsD,KAAK4rB,KAAK6c,SAAWzoC,KAAKyoC,QAAS,CAErC,GADAzoC,KAAKyoC,QAAUzoC,KAAK4rB,KAAK6c,QACrBzoC,KAAKyoC,kBAAmB8kB,SAC1B3kB,EAAIH,QAAQhL,UAAY,GACxBmL,EAAIH,QAAQ/a,YAAY1tB,KAAKyoC,aAE1B,CAAA,GAAyBtiC,QAArBnG,KAAK4rB,KAAK6c,QAIjB,KAAM,IAAIjlC,OAAM,sCAAwCxD,KAAK4rB,KAAKvrB,GAHlEuoC,GAAIH,QAAQhL,UAAYz9B,KAAKyoC,QAM/BzoC,KAAK4tD,OAAQ,EAIX5tD,KAAK4rB,KAAKy7B,OAASrnD,KAAKqnD,QAC1Bze,EAAI4gB,IAAInC,MAAQrnD,KAAK4rB,KAAKy7B,MAC1BrnD,KAAKqnD,MAAQrnD,KAAK4rB,KAAKy7B,MAIzB,IAAI1/C,IAAa3H,KAAK4rB,KAAKjkB,UAAW,IAAM3H,KAAK4rB,KAAKjkB,UAAY,KAC7D3H,KAAKssD,SAAW,YAAc,GAC/BtsD,MAAK2H,WAAaA,IACpB3H,KAAK2H,UAAYA,EACjBihC,EAAI4gB,IAAI7hD,UAAY,WAAaA,EACjCihC,EAAIF,KAAK/gC,UAAY,YAAcA,EACnCihC,EAAID,IAAIhhC,UAAa,WAAaA,EAElC3H,KAAK4tD,OAAQ,GAIX5tD,KAAK4tD,QACP5tD,KAAK2F,MAAMgjC,IAAIna,OAASoa,EAAID,IAAIQ,aAChCnpC,KAAK2F,MAAMgjC,IAAIpa,MAAQqa,EAAID,IAAIM,YAC/BjpC,KAAK2F,MAAM+iC,KAAKna,MAAQqa,EAAIF,KAAKO,YACjCjpC,KAAKuuB,MAAQqa,EAAI4gB,IAAIvgB,YACrBjpC,KAAKwuB,OAASoa,EAAI4gB,IAAIrgB,aAEtBnpC,KAAK4tD,OAAQ,GAGf5tD,KAAKmvD,qBAAqBvmB,EAAI4gB,MAOhCvnD,EAAQuS,UAAUs1C,KAAO,WAClB9pD,KAAKksD,WACRlsD,KAAKm7B,UAOTl5B,EAAQuS,UAAUy1C,KAAO,WACvB,GAAIjqD,KAAKksD,UAAW,CAClB,GAAItjB,GAAM5oC,KAAK4oC,GAEXA,GAAI4gB,IAAI9/C,YAAck/B,EAAI4gB,IAAI9/C,WAAW0jB,YAAYwb,EAAI4gB,KACzD5gB,EAAIF,KAAKh/B,YAAak/B,EAAIF,KAAKh/B,WAAW0jB,YAAYwb,EAAIF,MAC1DE,EAAID,IAAIj/B,YAAck/B,EAAID,IAAIj/B,WAAW0jB,YAAYwb,EAAID,KAE7D3oC,KAAKwH,IAAM,KACXxH,KAAKoH,KAAO,KAEZpH,KAAKksD,WAAY,IAQrBjqD,EAAQuS,UAAUg6C,YAAc,WAC9B,GAAI1/C,GAAQ9O,KAAK0+C,WAAWnQ,SAASvuC,KAAK4rB,KAAK9c,OAC3C84C,EAAQ5nD,KAAK8N,QAAQ85C,MAErB4B,EAAMxpD,KAAK4oC,IAAI4gB,IACf9gB,EAAO1oC,KAAK4oC,IAAIF,KAChBC,EAAM3oC,KAAK4oC,IAAID,GAIjB3oC,MAAKoH,KADM,SAATwgD,EACU94C,EAAQ9O,KAAKuuB,MAET,QAATq5B,EACK94C,EAIAA,EAAQ9O,KAAKuuB,MAAQ,EAInCi7B,EAAIr7B,MAAM/mB,KAAOpH,KAAKoH,KAAO,KAG7BshC,EAAKva,MAAM/mB,KAAQ0H,EAAQ9O,KAAK2F,MAAM+iC,KAAKna,MAAQ,EAAK,KAGxDoa,EAAIxa,MAAM/mB,KAAQ0H,EAAQ9O,KAAK2F,MAAMgjC,IAAIpa,MAAQ,EAAK,MAOxDtsB,EAAQuS,UAAUs5C,YAAc,WAC9B,GAAIhgB,GAAc9tC,KAAK8N,QAAQggC,YAC3B0b,EAAMxpD,KAAK4oC,IAAI4gB,IACf9gB,EAAO1oC,KAAK4oC,IAAIF,KAChBC,EAAM3oC,KAAK4oC,IAAID,GAEnB,IAAmB,OAAfmF,EACF0b,EAAIr7B,MAAM3mB,KAAWxH,KAAKwH,KAAO,GAAK,KAEtCkhC,EAAKva,MAAM3mB,IAAS,IACpBkhC,EAAKva,MAAMK,OAAUxuB,KAAK+zC,OAAOvsC,IAAMxH,KAAKwH,IAAM,EAAK,KACvDkhC,EAAKva,MAAM4O,OAAS,OAEjB,CACH,GAAI8yB,GAAgB7vD,KAAK+zC,OAAO7E,QAAQvpC,MAAM6oB,OAC1C4a,EAAaymB,EAAgB7vD,KAAK+zC,OAAOvsC,IAAMxH,KAAK+zC,OAAOvlB,OAASxuB,KAAKwH,GAE7EgiD,GAAIr7B,MAAM3mB,KAAWxH,KAAK+zC,OAAOvlB,OAASxuB,KAAKwH,IAAMxH,KAAKwuB,QAAU,GAAK,KACzEka,EAAKva,MAAM3mB,IAAUqoD,EAAgBzmB,EAAc,KACnDV,EAAKva,MAAM4O,OAAS,IAGtB4L,EAAIxa,MAAM3mB,KAAQxH,KAAK2F,MAAMgjC,IAAIna,OAAS,EAAK,MAGjD3uB,EAAOD,QAAUqC,GAKb,SAASpC,EAAQD,EAASM,GAc9B,QAASgC,GAAW0pB,EAAM8yB,EAAY5wC,GAcpC,GAbA9N,KAAK2F,OACHgjC,KACEnhC,IAAK,EACL+mB,MAAO,EACPC,OAAQ,GAEVia,SACEja,OAAQ,EACRshC,WAAY,IAKZlkC,GACgBzlB,QAAdylB,EAAK9c,MACP,KAAM,IAAItL,OAAM,oCAAsCooB,EAI1D5pB,GAAKzB,KAAKP,KAAM4rB,EAAM8yB,EAAY5wC,GAhCpC,GAAI9L,GAAO9B,EAAoB,GAmC/BgC,GAAUsS,UAAY,GAAIxS,GAAM,KAAM,KAAM,MAO5CE,EAAUsS,UAAU3F,UAAY,SAASX,GAGvC,GAAIg+B,IAAYh+B,EAAMmT,IAAMnT,EAAMY,OAAS,CAC3C,OAAQ9O,MAAK4rB,KAAK9c,MAAQZ,EAAMY,MAAQo9B,GAAclsC,KAAK4rB,KAAK9c,MAAQZ,EAAMmT,IAAM6qB,GAMtFhqC,EAAUsS,UAAU2mB,OAAS,WAC3B,GAAIyN,GAAM5oC,KAAK4oC,GAwBf,IAvBKA,IAEH5oC,KAAK4oC,OACLA,EAAM5oC,KAAK4oC,IAGXA,EAAI3a,MAAQT,SAASK,cAAc,OAInC+a,EAAIH,QAAUjb,SAASK,cAAc,OACrC+a,EAAIH,QAAQ9gC,UAAY,UACxBihC,EAAI3a,MAAMP,YAAYkb,EAAIH,SAG1BG,EAAID,IAAMnb,SAASK,cAAc,OACjC+a,EAAI3a,MAAMP,YAAYkb,EAAID,KAG1BC,EAAI3a,MAAM,iBAAmBjuB,OAI1BA,KAAK+zC,OACR,KAAM,IAAIvwC,OAAM,yCAElB,KAAKolC,EAAI3a,MAAMvkB,WAAY,CACzB,GAAIg5C,GAAa1iD,KAAK+zC,OAAOnL,IAAI8Z,UACjC,KAAKA,EACH,KAAM,IAAIl/C,OAAM,sEAElBk/C,GAAWh1B,YAAYkb,EAAI3a,OAK7B,GAHAjuB,KAAKksD,WAAY,EAGblsD,KAAK4rB,KAAK6c,SAAWzoC,KAAKyoC,QAAS,CAErC,GADAzoC,KAAKyoC,QAAUzoC,KAAK4rB,KAAK6c,QACrBzoC,KAAKyoC,kBAAmB8kB,SAC1B3kB,EAAIH,QAAQhL,UAAY,GACxBmL,EAAIH,QAAQ/a,YAAY1tB,KAAKyoC,aAE1B,CAAA,GAAyBtiC,QAArBnG,KAAK4rB,KAAK6c,QAIjB,KAAM,IAAIjlC,OAAM,sCAAwCxD,KAAK4rB,KAAKvrB,GAHlEuoC,GAAIH,QAAQhL,UAAYz9B,KAAKyoC,QAM/BzoC,KAAK4tD,OAAQ,EAIX5tD,KAAK4rB,KAAKy7B,OAASrnD,KAAKqnD,QAC1Bze,EAAI3a,MAAMo5B,MAAQrnD,KAAK4rB,KAAKy7B,MAC5BrnD,KAAKqnD,MAAQrnD,KAAK4rB,KAAKy7B,MAIzB,IAAI1/C,IAAa3H,KAAK4rB,KAAKjkB,UAAW,IAAM3H,KAAK4rB,KAAKjkB,UAAY,KAC7D3H,KAAKssD,SAAW,YAAc,GAC/BtsD,MAAK2H,WAAaA,IACpB3H,KAAK2H,UAAYA,EACjBihC,EAAI3a,MAAMtmB,UAAa,aAAeA,EACtCihC,EAAID,IAAIhhC,UAAa,WAAaA,EAElC3H,KAAK4tD,OAAQ,GAIX5tD,KAAK4tD,QACP5tD,KAAKuuB,MAAQqa,EAAI3a,MAAMgb,YACvBjpC,KAAKwuB,OAASoa,EAAI3a,MAAMkb,aACxBnpC,KAAK2F,MAAMgjC,IAAIpa,MAAQqa,EAAID,IAAIM,YAC/BjpC,KAAK2F,MAAMgjC,IAAIna,OAASoa,EAAID,IAAIQ,aAChCnpC,KAAK2F,MAAM8iC,QAAQja,OAASoa,EAAIH,QAAQU,aAGxCP,EAAIH,QAAQta,MAAM2hC,WAAa,EAAI9vD,KAAK2F,MAAMgjC,IAAIpa,MAAQ,KAG1Dqa,EAAID,IAAIxa,MAAM3mB,KAAQxH,KAAKwuB,OAASxuB,KAAK2F,MAAMgjC,IAAIna,QAAU,EAAK,KAClEoa,EAAID,IAAIxa,MAAM/mB,KAAQpH,KAAK2F,MAAMgjC,IAAIpa,MAAQ,EAAK,KAElDvuB,KAAK4tD,OAAQ,GAGf5tD,KAAKmvD,qBAAqBvmB,EAAI3a,QAOhC/rB,EAAUsS,UAAUs1C,KAAO,WACpB9pD,KAAKksD,WACRlsD,KAAKm7B,UAOTj5B,EAAUsS,UAAUy1C,KAAO,WACrBjqD,KAAKksD,YACHlsD,KAAK4oC,IAAI3a,MAAMvkB,YACjB1J,KAAK4oC,IAAI3a,MAAMvkB,WAAW0jB,YAAYptB,KAAK4oC,IAAI3a,OAGjDjuB,KAAKwH,IAAM,KACXxH,KAAKoH,KAAO,KAEZpH,KAAKksD,WAAY,IAQrBhqD,EAAUsS,UAAUg6C,YAAc,WAChC,GAAI1/C,GAAQ9O,KAAK0+C,WAAWnQ,SAASvuC,KAAK4rB,KAAK9c,MAE/C9O,MAAKoH,KAAO0H,EAAQ9O,KAAK2F,MAAMgjC,IAAIpa,MAGnCvuB,KAAK4oC,IAAI3a,MAAME,MAAM/mB,KAAOpH,KAAKoH,KAAO,MAO1ClF,EAAUsS,UAAUs5C,YAAc,WAChC,GAAIhgB,GAAc9tC,KAAK8N,QAAQggC,YAC3B7f,EAAQjuB,KAAK4oC,IAAI3a,KAGnBA,GAAME,MAAM3mB,IADK,OAAfsmC,EACgB9tC,KAAKwH,IAAM,KAGVxH,KAAK+zC,OAAOvlB,OAASxuB,KAAKwH,IAAMxH,KAAKwuB,OAAU,MAItE3uB,EAAOD,QAAUsC,GAKb,SAASrC,EAAQD,EAASM,GAiB9B,QAASs/C,GAAU7rB,GACjB3zB,KAAK6gD,QAAS,EAEd7gD,KAAK4oC,KACHjV,UAAWA,GAGb3zB,KAAK4oC,IAAImnB,QAAUviC,SAASK,cAAc,OAC1C7tB,KAAK4oC,IAAImnB,QAAQpoD,UAAY,UAE7B3H,KAAK4oC,IAAIjV,UAAUjG,YAAY1tB,KAAK4oC,IAAImnB,SAExC/vD,KAAK0D,OAAS8sC,EAAOxwC,KAAK4oC,IAAImnB,SAAU3P,iBAAiB,IACzDpgD,KAAK0D,OAAOqrB,GAAG,MAAO/uB,KAAKgwD,cAAc3hB,KAAKruC,MAG9C,IAAI2vB,GAAK3vB,KACLqgD,GACF,QAAS,QACT,YAAa,OACb,YAAa,OAAQ,UACrB,aAAc,iBAEhBA,GAAOl4C,QAAQ,SAAUiB,GACvBumB,EAAGjsB,OAAOqrB,GAAG3lB,EAAO,SAAUA,GAC5BA,EAAMwuC,sBAKV53C,KAAKiwD,aAAezf,EAAOnpC,QAAS+4C,iBAAiB,IACrDpgD,KAAKiwD,aAAalhC,GAAG,MAAO,SAAU3lB,GAE/B8mD,EAAW9mD,EAAMG,OAAQoqB,IAC5BhE,EAAGwgC,eAKPnwD,KAAKowD,YAAcpwD,KAAKmwD,WAAW9hB,KAAKruC,MAiF1C,QAASkwD,GAAWxnD,EAASqrC,GAC3B,KAAOrrC,GAAS,CACd,GAAIA,IAAYqrC,EACd,OAAO,CAETrrC,GAAUA,EAAQgB,WAEpB,OAAO,EA9IT,GAAI2mD,GAAYnwD,EAAoB,IAChCy2B,EAAUz2B,EAAoB,IAC9BswC,EAAStwC,EAAoB,IAC7BS,EAAOT,EAAoB,EAuD/By2B,GAAQ6oB,EAAUhrC,WAGlBgrC,EAAUhH,QAAU,KAKpBgH,EAAUhrC,UAAU2qC,QAAU,WAC5Bn/C,KAAKmwD,aAGLnwD,KAAK4oC,IAAImnB,QAAQrmD,WAAW0jB,YAAYptB,KAAK4oC,IAAImnB,SAGjD/vD,KAAK0D,OAAS,KACd1D,KAAKiwD,aAAe,MAQtBzQ,EAAUhrC,UAAU87C,SAAW,WAEzB9Q,EAAUhH,SACZgH,EAAUhH,QAAQ2X,aAEpB3Q,EAAUhH,QAAUx4C,KAEpBA,KAAK6gD,QAAS,EACd7gD,KAAK4oC,IAAImnB,QAAQ5hC,MAAMoiC,QAAU,OACjC5vD,EAAK+G,aAAa1H,KAAK4oC,IAAIjV,UAAW,cAEtC3zB,KAAKymC,KAAK,UACVzmC,KAAKymC,KAAK,YAIV4pB,EAAUhiB,KAAK,MAAOruC,KAAKowD,cAO7B5Q,EAAUhrC,UAAU27C,WAAa,WAC/BnwD,KAAK6gD,QAAS,EACd7gD,KAAK4oC,IAAImnB,QAAQ5hC,MAAMoiC,QAAU,GACjC5vD,EAAKqH,gBAAgBhI,KAAK4oC,IAAIjV,UAAW,cACzC08B,EAAUG,OAAO,MAAOxwD,KAAKowD,aAE7BpwD,KAAKymC,KAAK,UACVzmC,KAAKymC,KAAK,eAQZ+Y,EAAUhrC,UAAUw7C,cAAgB,SAAU5mD,GAE5CpJ,KAAKswD,WACLlnD,EAAMwuC,mBAsBR/3C,EAAOD,QAAU4/C,GAKb,SAAS3/C,GA8MX,QAAS4wD,GAAU7sD,EAAQ6C,EAAM2B,GAC7B,MAAIxE,GAAO6E,iBACA7E,EAAO6E,iBAAiBhC,EAAM2B,GAAU,OAGnDxE,GAAOoF,YAAY,KAAOvC,EAAM2B,GASpC,QAASsoD,GAAoBtkD,GAGzB,MAAc,YAAVA,EAAE3F,KACK1C,OAAO4sD,aAAavkD,EAAEg5B,OAI7BwrB,EAAKxkD,EAAEg5B,OACAwrB,EAAKxkD,EAAEg5B,OAGdyrB,EAAazkD,EAAEg5B,OACRyrB,EAAazkD,EAAEg5B,OAInBrhC,OAAO4sD,aAAavkD,EAAEg5B,OAAOjwB,cASxC,QAAS27C,GAAM1kD,GACX,GAAI1D,GAAU0D,EAAE7C,QAAU6C,EAAE5C,WACxBunD,EAAWroD,EAAQsoD,OAGvB,QAAK,IAAMtoD,EAAQf,UAAY,KAAKrB,QAAQ,eAAiB,IAClD,EAIQ,SAAZyqD,GAAmC,UAAZA,GAAoC,YAAZA,GAA2BroD,EAAQuoD,iBAA8C,QAA3BvoD,EAAQuoD,gBAUxH,QAASC,GAAgBC,EAAYC,GACjC,MAAOD,GAAW3/B,OAAOzpB,KAAK,OAASqpD,EAAW5/B,OAAOzpB,KAAK,KASlE,QAASspD,GAAgBC,GACrBA,EAAeA,KAEf,IACI9oD,GADA+oD,GAAmB,CAGvB,KAAK/oD,IAAOgpD,GACJF,EAAa9oD,GACb+oD,GAAmB,EAGvBC,EAAiBhpD,GAAO,CAGvB+oD,KACDE,GAAmB,GAe3B,QAASC,GAAYC,EAAWC,EAAWjpD,EAAQgpB,EAAQkgC,GACvD,GAAI1sD,GACAiD,EACA0pD,IAGJ,KAAKnoB,EAAWgoB,GACZ,QAUJ,KANc,SAAVhpD,GAAqBopD,EAAYJ,KACjCC,GAAaD,IAKZxsD,EAAI,EAAGA,EAAIwkC,EAAWgoB,GAAWrsD,SAAUH,EAC5CiD,EAAWuhC,EAAWgoB,GAAWxsD,GAI7BiD,EAAS4pD,KAAOR,EAAiBppD,EAAS4pD,MAAQ5pD,EAAS6pD,OAM3DtpD,GAAUP,EAASO,SAOT,YAAVA,GAAwBuoD,EAAgBU,EAAWxpD,EAASwpD,cAIxDjgC,GAAUvpB,EAAS8pD,OAASL,GAC5BloB,EAAWgoB,GAAWzpD,OAAO/C,EAAG,GAGpC2sD,EAAQhqD,KAAKM,GAIrB,OAAO0pD,GASX,QAASK,GAAgB/lD,GACrB,GAAIwlD,KAkBJ,OAhBIxlD,GAAEygD,UACF+E,EAAU9pD,KAAK,SAGfsE,EAAEgmD,QACFR,EAAU9pD,KAAK,OAGfsE,EAAEwgD,SACFgF,EAAU9pD,KAAK,QAGfsE,EAAEimD,SACFT,EAAU9pD,KAAK,QAGZ8pD,EAaX,QAASU,GAAclqD,EAAUgE,GACzBhE,EAASgE,MAAO,IACZA,EAAEjD,gBACFiD,EAAEjD,iBAGFiD,EAAEwrC,iBACFxrC,EAAEwrC,kBAGNxrC,EAAE/C,aAAc,EAChB+C,EAAEmmD,cAAe,GAWzB,QAASC,GAAiBb,EAAWvlD,GAGjC,IAAI0kD,EAAM1kD,GAAV,CAIA,GACIjH,GADA6kC,EAAY0nB,EAAYC,EAAWQ,EAAgB/lD,GAAIA,EAAE3F,MAEzD6qD,KACAmB,GAA8B,CAGlC,KAAKttD,EAAI,EAAGA,EAAI6kC,EAAU1kC,SAAUH,EAO5B6kC,EAAU7kC,GAAG6sD,KACbS,GAA8B,EAG9BnB,EAAatnB,EAAU7kC,GAAG6sD,KAAO,EACjCM,EAActoB,EAAU7kC,GAAGiD,SAAUgE,IAMpCqmD,GAAgChB,GACjCa,EAActoB,EAAU7kC,GAAGiD,SAAUgE,EAOzCA,GAAE3F,MAAQgrD,GAAqBM,EAAYJ,IAC3CN,EAAgBC,IAUxB,QAASoB,GAAWtmD,GAIhBA,EAAEg5B,MAA0B,gBAAXh5B,GAAEg5B,MAAoBh5B,EAAEg5B,MAAQh5B,EAAEumD,OAEnD,IAAIhB,GAAYjB,EAAoBtkD,EAGpC,IAAKulD,EAIL,MAAc,SAAVvlD,EAAE3F,MAAmBmsD,GAAsBjB,OAC3CiB,GAAqB,OAIzBJ,GAAiBb,EAAWvlD,GAShC,QAAS2lD,GAAYvpD,GACjB,MAAc,SAAPA,GAAyB,QAAPA,GAAwB,OAAPA,GAAuB,QAAPA,EAW9D,QAASqqD,KACL/rB,aAAagsB,GACbA,EAAe3rB,WAAWkqB,EAAiB,KAS/C,QAAS0B,KACL,IAAKC,EAAc,CACfA,IACA,KAAK,GAAIxqD,KAAOooD,GAIRpoD,EAAM,IAAY,IAANA,GAIZooD,EAAKnrD,eAAe+C,KACpBwqD,EAAapC,EAAKpoD,IAAQA,GAItC,MAAOwqD,GAUX,QAASC,GAAgBzqD,EAAKopD,EAAWjpD,GAcrC,MAVKA,KACDA,EAASoqD,IAAiBvqD,GAAO,UAAY,YAKnC,YAAVG,GAAwBipD,EAAUtsD,SAClCqD,EAAS,WAGNA,EAYX,QAASuqD,GAAchB,EAAOzlC,EAAMrkB,EAAUO,GAI1C6oD,EAAiBU,GAAS,EAIrBvpD,IACDA,EAASsqD,EAAgBxmC,EAAK,OAUlC,IA2BItnB,GA3BAguD,EAAoB,WAChB1B,EAAmB9oD,IACjB6oD,EAAiBU,GACnBW,KAUJO,EAAoB,SAAShnD,GACzBkmD,EAAclqD,EAAUgE,GAKT,UAAXzD,IACAiqD,EAAqBlC,EAAoBtkD,IAK7C+6B,WAAWkqB,EAAiB,IAOpC,KAAKlsD,EAAI,EAAGA,EAAIsnB,EAAKnnB,SAAUH,EAC3BkuD,EAAY5mC,EAAKtnB,GAAIA,EAAIsnB,EAAKnnB,OAAS,EAAI6tD,EAAoBC,EAAmBzqD,EAAQupD,EAAO/sD,GAczG,QAASkuD,GAAYxB,EAAazpD,EAAUO,EAAQ2qD,EAAerB,GAG/DJ,EAAcA,EAAY7lD,QAAQ,OAAQ,IAE1C,IACI7G,GACAqD,EACAikB,EAHA8mC,EAAW1B,EAAYhqD,MAAM,KAI7B+pD,IAIJ,IAAI2B,EAASjuD,OAAS,EAClB,MAAO4tD,GAAcrB,EAAa0B,EAAUnrD,EAAUO,EAO1D,KAFA8jB,EAAuB,MAAhBolC,GAAuB,KAAOA,EAAYhqD,MAAM,KAElD1C,EAAI,EAAGA,EAAIsnB,EAAKnnB,SAAUH,EAC3BqD,EAAMikB,EAAKtnB,GAGPquD,EAAiBhrD,KACjBA,EAAMgrD,EAAiBhrD,IAMvBG,GAAoB,YAAVA,GAAwB8qD,EAAWjrD,KAC7CA,EAAMirD,EAAWjrD,GACjBopD,EAAU9pD,KAAK,UAIfiqD,EAAYvpD,IACZopD,EAAU9pD,KAAKU,EAMvBG,GAASsqD,EAAgBzqD,EAAKopD,EAAWjpD,GAIpCghC,EAAWnhC,KACZmhC,EAAWnhC,OAIfkpD,EAAYlpD,EAAKopD,EAAWjpD,GAAS2qD,EAAezB,GAQpDloB,EAAWnhC,GAAK8qD,EAAgB,UAAY,SACxClrD,SAAUA,EACVwpD,UAAWA,EACXjpD,OAAQA,EACRqpD,IAAKsB,EACLrB,MAAOA,EACPC,MAAOL,IAYf,QAAS6B,GAAcC,EAAcvrD,EAAUO,GAC3C,IAAK,GAAIxD,GAAI,EAAGA,EAAIwuD,EAAaruD,SAAUH,EACvCkuD,EAAYM,EAAaxuD,GAAIiD,EAAUO,GAjhB/C,IAAK,GAlDDqqD,GA6BAF,EArIAlC,GACIgD,EAAG,YACHC,EAAG,MACHC,GAAI,QACJC,GAAI,QACJC,GAAI,OACJC,GAAI,MACJC,GAAI,WACJC,GAAI,MACJC,GAAI,QACJC,GAAI,SACJC,GAAI,WACJC,GAAI,MACJC,GAAI,OACJC,GAAI,OACJC,GAAI,KACJC,GAAI,QACJC,GAAI,OACJC,GAAI,MACJC,GAAI,MACJC,GAAI,OACJC,GAAI,OACJC,IAAK,QAWTpE,GACIqE,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAM,IACNC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,KACLC,IAAK,IACLC,IAAK,KAaTxC,GACIyC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,EAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,EAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAM,IACNC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,MAST5D,GACI7pD,OAAU,MACV0tD,QAAW,OACXC,SAAU,QACVC,OAAU,OAiBd5tB,KAOA6tB,KAQAhG,KAcAoB,GAAqB,EAQrBnB,GAAmB,EAMdtsD,EAAI,EAAO,GAAJA,IAAUA,EACtByrD,EAAK,IAAMzrD,GAAK,IAAMA,CAM1B,KAAKA,EAAI,EAAQ,GAALA,IAAUA,EAClByrD,EAAKzrD,EAAI,IAAMA,CA8gBnBsrD,GAAUjjC,SAAU,WAAYklC,GAChCjC,EAAUjjC,SAAU,UAAWklC,GAC/BjC,EAAUjjC,SAAU,QAASklC,EAE7B,IAAIrC,IAiBAhiB,KAAM,SAAS5hB,EAAMrkB,EAAUO,GAG3B,MAFA+qD,GAAcjnC,YAAgB7mB,OAAQ6mB,GAAQA,GAAOrkB,EAAUO,GAC/D6uD,EAAY/qC,EAAO,IAAM9jB,GAAUP,EAC5BpI,MAoBXwwD,OAAQ,SAAS/jC,EAAM9jB,GAKnB,MAJI6uD,GAAY/qC,EAAO,IAAM9jB,WAClB6uD,GAAY/qC,EAAO,IAAM9jB,GAChC3I,KAAKquC,KAAK5hB,EAAM,aAAe9jB,IAE5B3I,MAUXi3C,QAAS,SAASxqB,EAAM9jB,GAEpB,MADA6uD,GAAY/qC,EAAO,IAAM9jB,KAClB3I,MAUX42C,MAAO,WAGH,MAFAjN,MACA6tB,KACOx3D,MAIjBH,GAAOD,QAAUywD,GAMb,SAASxwD,EAAQD,EAASM,GAsB9B,QAASsB,GAASmyB,EAAW5xB,EAAO+L,EAAS8hC,GAC3C,GAAIjgB,GAAK3vB,IACTA,MAAK4tC,gBACH9+B,MAAO,KACPuS,IAAO,KAEPwsB,YAAY,EAEZC,YAAa,SACbvf,MAAO,KACPC,OAAQ,KACRuf,UAAW,KACXC,UAAW,MAEbhuC,KAAK8N,QAAUnN,EAAKyF,cAAepG,KAAK4tC,gBAGxC5tC,KAAKiuC,QAAQta,GAGb3zB,KAAK8B,cAEL9B,KAAKkuC,MACHtF,IAAK5oC,KAAK4oC,IACVuF,SAAUnuC,KAAK2F,MACfyoC,SACErf,GAAI/uB,KAAK+uB,GAAGsf,KAAKruC,MACjBkvB,IAAKlvB,KAAKkvB,IAAImf,KAAKruC,MACnBymC,KAAMzmC,KAAKymC,KAAK4H,KAAKruC,OAEvBW,MACE2tC,KAAM,KACNC,SAAU5e,EAAG6e,UAAUH,KAAK1e,GAC5B8e,eAAgB9e,EAAG+e,gBAAgBL,KAAK1e,GACxCgf,OAAQhf,EAAGif,QAAQP,KAAK1e,GACxBkf,aAAelf,EAAGmf,cAAcT,KAAK1e,KAKzC3vB,KAAKkO,MAAQ,GAAIvM,GAAM3B,KAAKkuC,MAC5BluC,KAAK8B,WAAWgG,KAAK9H,KAAKkO,OAC1BlO,KAAKkuC,KAAKhgC,MAAQlO,KAAKkO,MAGvBlO,KAAK+uC,SAAW,GAAIlsC,GAAS7C,KAAKkuC,MAClCluC,KAAK8B,WAAWgG,KAAK9H,KAAK+uC,UAC1B/uC,KAAKkuC,KAAKvtC,KAAK2tC,KAAOtuC,KAAK+uC,SAAST,KAAKD,KAAKruC,KAAK+uC,UAGnD/uC,KAAKgvC,YAAc,GAAI3sC,GAAYrC,KAAKkuC,MACxCluC,KAAK8B,WAAWgG,KAAK9H,KAAKgvC,aAI1BhvC,KAAKivC,WAAa,GAAI3sC,GAAWtC,KAAKkuC,MACtCluC,KAAK8B,WAAWgG,KAAK9H,KAAKivC,YAG1BjvC,KAAKy3D,UAAY,GAAI70D,GAAU5C,KAAKkuC,MACpCluC,KAAK8B,WAAWgG,KAAK9H,KAAKy3D,WAE1Bz3D,KAAKmvC,UAAY,KACjBnvC,KAAKovC,WAAa,KAGdthC,GACF9N,KAAK02B,WAAW5oB,GAId8hC,GACF5vC,KAAK2vC,UAAUC,GAIb7tC,EACF/B,KAAKqvC,SAASttC,GAGd/B,KAAKm7B,SApGT,GAEIx6B,IAFUT,EAAoB,IACrBA,EAAoB,IACtBA,EAAoB,IAC3BW,EAAUX,EAAoB,GAC9BY,EAAWZ,EAAoB,GAC/ByB,EAAQzB,EAAoB,IAC5BovC,EAAOpvC,EAAoB,IAC3B2C,EAAW3C,EAAoB,IAC/BmC,EAAcnC,EAAoB,IAClCoC,EAAapC,EAAoB,IACjC0C,EAAY1C,EAAoB,GA+FpCsB,GAAQgT,UAAY,GAAI86B,GAMxB9tC,EAAQgT,UAAU66B,SAAW,SAASttC,GACpC,GAGIwtC,GAHAC,EAAiC,MAAlBxvC,KAAKmvC,SAwBxB,IAhBEI,EAJGxtC,EAGIA,YAAiBlB,IAAWkB,YAAiBjB,GACvCiB,EAIA,GAAIlB,GAAQkB,GACvB0E,MACEqI,MAAO,OACPuS,IAAK,UAVI,KAgBfrhB,KAAKmvC,UAAYI,EACjBvvC,KAAKy3D,WAAaz3D,KAAKy3D,UAAUpoB,SAASE,GAEtCC,IAAgB,SAAWxvC,MAAK8N,SAAW,OAAS9N,MAAK8N,SAAU,CACrE9N,KAAKyvC,KAEL,IAAI3gC,GAAS,SAAW9O,MAAK8N,QAAWnN,EAAK6F,QAAQxG,KAAK8N,QAAQgB,MAAO,QAAU,KAC/EuS,EAAS,OAASrhB,MAAK8N,QAAanN,EAAK6F,QAAQxG,KAAK8N,QAAQuT,IAAK,QAAU,IAEjFrhB,MAAK0vC,UAAU5gC,EAAOuS,KAQ1B7f,EAAQgT,UAAUm7B,UAAY,SAASC,GAErC,GAAIL,EAKFA,GAJGK,EAGIA,YAAkB/uC,IAAW+uC,YAAkB9uC,GACzC8uC,EAIA,GAAI/uC,GAAQ+uC,GAPZ,KAUf5vC,KAAKovC,WAAaG,EAClBvvC,KAAKy3D,UAAU9nB,UAAUJ,IAS3B/tC,EAAQgT,UAAUkjD,UAAY,SAASrO,EAAS96B,EAAOC,GAGrD,MAFeroB,UAAXooB,IAAuBA,EAAS,IACrBpoB,SAAXqoB,IAAuBA,EAAS,IACGroB,SAAnCnG,KAAKy3D,UAAU7nB,OAAOyZ,GACjBrpD,KAAKy3D,UAAU7nB,OAAOyZ,GAASqO,UAAUnpC,EAAMC,GAG/C,qBAAwB66B,GASnC7nD,EAAQgT,UAAUmjD,eAAiB,SAAStO,GAC1C,MAAuCljD,UAAnCnG,KAAKy3D,UAAU7nB,OAAOyZ,GAChBrpD,KAAKy3D,UAAU7nB,OAAOyZ,GAAStnB,UAAkE57B,SAAtDnG,KAAKy3D,UAAU3pD,QAAQ8hC,OAAOiS,WAAWwH,IAA+E,GAArDrpD,KAAKy3D,UAAU3pD,QAAQ8hC,OAAOiS,WAAWwH,KAGxJ,GAWX7nD,EAAQgT,UAAU07B,aAAe,WAC/B,GAAI7kC,GAAM,KACNyB,EAAM,IAGV,KAAK,GAAIu8C,KAAWrpD,MAAKy3D,UAAU7nB,OACjC,GAAI5vC,KAAKy3D,UAAU7nB,OAAOnqC,eAAe4jD,IACO,GAA1CrpD,KAAKy3D,UAAU7nB,OAAOyZ,GAAStnB,QACjC,IAAK,GAAI58B,GAAI,EAAGA,EAAInF,KAAKy3D,UAAU7nB,OAAOyZ,GAASla,UAAU7pC,OAAQH,IAAK,CACxE,GAAI+qB,GAAOlwB,KAAKy3D,UAAU7nB,OAAOyZ,GAASla,UAAUhqC,GAChD6B,EAAQrG,EAAK6F,QAAQ0pB,EAAKnC,EAAG,QAAQpnB,SACzC0E,GAAa,MAAPA,EAAcrE,EAAQqE,EAAMrE,EAAQA,EAAQqE,EAClDyB,EAAa,MAAPA,EAAc9F,EAAcA,EAAN8F,EAAc9F,EAAQ8F,EAM1D,OACEzB,IAAa,MAAPA,EAAe,GAAIpH,MAAKoH,GAAO,KACrCyB,IAAa,MAAPA,EAAe,GAAI7I,MAAK6I,GAAO,OAMzCjN,EAAOD,QAAU4B,GAKb,SAAS3B,GA4Bb,QAAS6B,GAASoN,EAAOuS,EAAK0hC,EAAavB,EAAiBoW,GAE1D53D,KAAKw4C,QAAU,EAEfx4C,KAAKwlD,WAAY,EACjBxlD,KAAK63D,UAAY,EACjB73D,KAAKyhC,KAAO,EACZzhC,KAAK62B,MAAQ,EAEb72B,KAAK83D,YACL93D,KAAK+3D,UACL/3D,KAAKg4D,UAAY,EAEjBh4D,KAAKi4D,YAAc,EAAO,EAAM,EAAI,IACpCj4D,KAAKk4D,YAAc,IAAO,GAAM,EAAI,GAEpCl4D,KAAKitC,SAASn+B,EAAOuS,EAAK0hC,EAAavB,EAAiBoW,GAe1Dl2D,EAAS8S,UAAUy4B,SAAW,SAASn+B,EAAOuS,EAAK0hC,EAAavB,EAAiBoW,GAC/E53D,KAAK4sC,OAA6BzmC,SAApByxD,EAAYvsD,IAAoByD,EAAQ8oD,EAAYvsD,IAClErL,KAAK6sC,KAA2B1mC,SAApByxD,EAAY9qD,IAAoBuU,EAAMu2C,EAAY9qD,IAE1DgC,GAASuS,IACXrhB,KAAK4sC,OAAS99B,EAAQ,IACtB9O,KAAK6sC,KAAOxrB,EAAM,GAGhBrhB,KAAKwlD,WACPxlD,KAAK4lD,eAAe7C,EAAavB,GAEnCxhD,KAAKm4D,SAASP,IAOhBl2D,EAAS8S,UAAUoxC,eAAiB,SAAS7C,EAAavB,GAExD,GAAInzB,GAAOruB,KAAK6sC,KAAO7sC,KAAK4sC,OACxBwrB,EAAkB,IAAP/pC,EACXgqC,EAAmBtV,GAAeqV,EAAW5W,GAC7C8W,EAAmBzzD,KAAK+b,MAAM/b,KAAKmK,IAAIopD,GAAUvzD,KAAKwoC,MAEtDkrB,EAAe,GACfC,EAAkB3zD,KAAK0oC,IAAI,GAAG+qB,GAE9BxpD,EAAQ,CACW,GAAnBwpD,IACFxpD,EAAQwpD,EAIV,KAAK,GADDG,IAAgB,EACXtzD,EAAI2J,EAAOjK,KAAK+O,IAAIzO,IAAMN,KAAK+O,IAAI0kD,GAAmBnzD,IAAK,CAClEqzD,EAAkB3zD,KAAK0oC,IAAI,GAAGpoC,EAC9B,KAAK,GAAIqT,GAAI,EAAGA,EAAIxY,KAAKk4D,WAAW5yD,OAAQkT,IAAK,CAC/C,GAAIkgD,GAAWF,EAAkBx4D,KAAKk4D,WAAW1/C,EACjD,IAAIkgD,GAAYL,EAAkB,CAChCI,GAAgB,EAChBF,EAAe//C,CACf,QAGJ,GAAqB,GAAjBigD,EACF,MAGJz4D,KAAK63D,UAAYU,EACjBv4D,KAAK62B,MAAQ2hC,EACbx4D,KAAKyhC,KAAO+2B,EAAkBx4D,KAAKk4D,WAAWK,IAShD72D,EAAS8S,UAAU2jD,SAAW,SAASP,GACjBzxD,SAAhByxD,IACFA,KAEF,IAAIe,GAAgCxyD,SAApByxD,EAAYvsD,IAAoBrL,KAAK4sC,OAAuB,EAAb5sC,KAAK62B,MAAY72B,KAAKk4D,WAAWl4D,KAAK63D,WAAcD,EAAYvsD,IAC3HutD,EAA8BzyD,SAApByxD,EAAY9qD,IAAoB9M,KAAK6sC,KAAQ7sC,KAAK62B,MAAQ72B,KAAKk4D,WAAWl4D,KAAK63D,WAAcD,EAAY9qD,GAEvH9M,MAAK+3D,UAAgC5xD,SAApByxD,EAAY9qD,IAAoB9M,KAAK6lD,aAAa+S,GAAWhB,EAAY9qD,IAC1F9M,KAAK83D,YAAkC3xD,SAApByxD,EAAYvsD,IAAoBrL,KAAK6lD,aAAa8S,GAAaf,EAAYvsD,IAC9FrL,KAAKg4D,UAAYh4D,KAAK6lD,aAAa+S,GAAWA,EAAU54D,KAAK6lD,aAAa8S,GAAaA,EACvF34D,KAAK64D,YAAc74D,KAAK+3D,UAAY/3D,KAAK83D,YAEzC93D,KAAKw4C,QAAUx4C,KAAK+3D;EAItBr2D,EAAS8S,UAAUqxC,aAAe,SAAS7+C,GACzC,GAAI8xD,GAAU9xD,EAASA,GAAShH,KAAK62B,MAAQ72B,KAAKk4D,WAAWl4D,KAAK63D,WAClE,OAAI7wD,IAAShH,KAAK62B,MAAQ72B,KAAKk4D,WAAWl4D,KAAK63D,YAAc,GAAO73D,KAAK62B,MAAQ72B,KAAKk4D,WAAWl4D,KAAK63D,WAC7FiB,EAAW94D,KAAK62B,MAAQ72B,KAAKk4D,WAAWl4D,KAAK63D,WAG7CiB,GASXp3D,EAAS8S,UAAU8vC,QAAU,WAC3B,MAAQtkD,MAAKw4C,SAAWx4C,KAAK83D,aAM/Bp2D,EAAS8S,UAAUiE,KAAO,WACxB,GAAI6yB,GAAOtrC,KAAKw4C,OAChBx4C,MAAKw4C,SAAWx4C,KAAKyhC,KAGjBzhC,KAAKw4C,SAAWlN,IAClBtrC,KAAKw4C,QAAUx4C,KAAK6sC,OAOxBnrC,EAAS8S,UAAUikC,SAAW,WAC5Bz4C,KAAKw4C,SAAWx4C,KAAKyhC,KACrBzhC,KAAK+3D,WAAa/3D,KAAKyhC,KACvBzhC,KAAK64D,YAAc74D,KAAK+3D,UAAY/3D,KAAK83D,aAS3Cp2D,EAAS8S,UAAUktB,WAAa,WAE9B,IAAK,GADDgM,GAAc,GAAK7pC,OAAO7D,KAAKw4C,SAAS9K,YAAY,GAC/CvoC,EAAIuoC,EAAYpoC,OAAO,EAAGH,EAAI,EAAGA,IAAK,CAC7C,GAAsB,KAAlBuoC,EAAYvoC,GAGX,CAAA,GAAsB,KAAlBuoC,EAAYvoC,IAA+B,KAAlBuoC,EAAYvoC,GAAW,CACvDuoC,EAAcA,EAAY70B,MAAM,EAAE1T,EAClC,OAGA,MAPAuoC,EAAcA,EAAY70B,MAAM,EAAE1T,GAWtC,MAAOuoC,IAWThsC,EAAS8S,UAAU85B,KAAO,aAS1B5sC,EAAS8S,UAAU+vC,QAAU,WAC3B,MAAQvkD,MAAKw4C,SAAWx4C,KAAK62B,MAAQ72B,KAAKi4D,WAAWj4D,KAAK63D,aAAe,GAG3Eh4D,EAAOD,QAAU8B,GAKb,SAAS7B,EAAQD,EAASM,GAe9B,QAASqC,GAAU2rC,EAAMpgC,EAASirD,EAAKC,GACrCh5D,KAAKK,GAAKM,EAAKgE,aACf3E,KAAKkuC,KAAOA,EAEZluC,KAAK4tC,gBACHE,YAAa,OACbmV,iBAAiB,EACjBC,iBAAiB,EACjB+V,OAAO,EACPC,iBAAkB,EAClBC,iBAAkB,EAClBC,aAAc,GACdC,aAAc,EACdC,UAAW,GACX/qC,MAAO,OACPwT,SAAS,EACT61B,aACExwD,MAAOiE,IAAIlF,OAAW2G,IAAI3G,QAC1Bw6B,OAAQt1B,IAAIlF,OAAW2G,IAAI3G,UAI/BnG,KAAKg5D,iBAAmBA,EACxBh5D,KAAKu5D,aAAeR,EACpB/4D,KAAK2F,SACL3F,KAAKw5D,aACHC,SACAC,WAGF15D,KAAK4oC,OAEL5oC,KAAKkO,OAASY,MAAM,EAAGuS,IAAI,GAE3BrhB,KAAK8N,QAAUnN,EAAKsE,UAAWjF,KAAK4tC,gBACpC5tC,KAAK25D,iBAAmB,EAExB35D,KAAK02B,WAAW5oB,GAChB9N,KAAKuuB,MAAQ1qB,QAAQ,GAAK7D,KAAK8N,QAAQygB,OAAOviB,QAAQ,KAAK,KAC3DhM,KAAK45D,SAAW55D,KAAKuuB,MACrBvuB,KAAKwuB,OAASxuB,KAAKu5D,aAAapwB,aAEhCnpC,KAAK65D,WAAa,GAClB75D,KAAK85D,iBAAmB,GACxB95D,KAAK+5D,WAAa,EAClB/5D,KAAKg6D,QAAS,EACdh6D,KAAKi6D,eAGLj6D,KAAK4vC,UACL5vC,KAAKk6D,eAAiB,EAGtBl6D,KAAKiuC,UAlEP,GAAIttC,GAAOT,EAAoB,GAC3BU,EAAUV,EAAoB,GAC9BkC,EAAYlC,EAAoB,IAChCwB,EAAWxB,EAAoB,GAkEnCqC,GAASiS,UAAY,GAAIpS,GAIzBG,EAASiS,UAAU2lD,SAAW,SAASr4B,EAAOs4B,GACvCp6D,KAAK4vC,OAAOnqC,eAAeq8B,KAC9B9hC,KAAK4vC,OAAO9N,GAASs4B,GAEvBp6D,KAAKk6D,gBAAkB,GAGzB33D,EAASiS,UAAUyzC,YAAc,SAASnmB,EAAOs4B,GAC/Cp6D,KAAK4vC,OAAO9N,GAASs4B,GAGvB73D,EAASiS,UAAU6lD,YAAc,SAASv4B,GACpC9hC,KAAK4vC,OAAOnqC,eAAeq8B,WACtB9hC,MAAK4vC,OAAO9N,GACnB9hC,KAAKk6D,gBAAkB,IAK3B33D,EAASiS,UAAUkiB,WAAa,SAAU5oB,GACxC,GAAIA,EAAS,CACX,GAAIqtB,IAAS,CACTn7B,MAAK8N,QAAQggC,aAAehgC,EAAQggC,aAAuC3nC,SAAxB2H,EAAQggC,cAC7D3S,GAAS,EAEX,IAAI5tB,IACF,cACA,kBACA,kBACA,QACA,mBACA,mBACA,eACA,eACA,YACA,QACA,UACA,cAEF5M,GAAK+E,gBAAgB6H,EAAQvN,KAAK8N,QAASA,GAE3C9N,KAAK45D,SAAW/1D,QAAQ,GAAK7D,KAAK8N,QAAQygB,OAAOviB,QAAQ,KAAK,KAEhD,GAAVmvB,GAAkBn7B,KAAK4oC,IAAI5P,QAC7Bh5B,KAAKiqD,OACLjqD,KAAK8pD,UASXvnD,EAASiS,UAAUy5B,QAAU,WAC3BjuC,KAAK4oC,IAAI5P,MAAQxL,SAASK,cAAc,OACxC7tB,KAAK4oC,IAAI5P,MAAM7K,MAAMI,MAAQvuB,KAAK8N,QAAQygB,MAC1CvuB,KAAK4oC,IAAI5P,MAAM7K,MAAMK,OAASxuB,KAAKwuB,OAEnCxuB,KAAK4oC,IAAI0xB,cAAgB9sC,SAASK,cAAc,OAChD7tB,KAAK4oC,IAAI0xB,cAAcnsC,MAAMI,MAAQ,OACrCvuB,KAAK4oC,IAAI0xB,cAAcnsC,MAAMK,OAASxuB,KAAKwuB,OAG3CxuB,KAAK+4D,IAAMvrC,SAASC,gBAAgB,6BAA6B,OACjEztB,KAAK+4D,IAAI5qC,MAAMkP,SAAW,WAC1Br9B,KAAK+4D,IAAI5qC,MAAM3mB,IAAM,MACrBxH,KAAK+4D,IAAI5qC,MAAMK,OAAS,OACxBxuB,KAAK+4D,IAAI5qC,MAAMI,MAAQ,OACvBvuB,KAAK+4D,IAAI5qC,MAAMoiC,QAAU,QACzBvwD,KAAK4oC,IAAI5P,MAAMtL,YAAY1tB,KAAK+4D,MAGlCx2D,EAASiS,UAAU+lD,kBAAoB,WACrC35D,EAAQksB,gBAAgB9sB,KAAKi6D,YAE7B,IAAIlsC,GACAurC,EAAYt5D,KAAK8N,QAAQwrD,UACzBkB,EAAa,GACbC,EAAa,EACbx6C,EAAIw6C,EAAa,GAAMD,CAGzBzsC,GAD8B,QAA5B/tB,KAAK8N,QAAQggC,YACX2sB,EAGAz6D,KAAKuuB,MAAQ+qC,EAAYmB,CAG/B,KAAK,GAAIpR,KAAWrpD,MAAK4vC,OACnB5vC,KAAK4vC,OAAOnqC,eAAe4jD,KACO,GAAhCrpD,KAAK4vC,OAAOyZ,GAAStnB,SAAkE57B,SAA9CnG,KAAKg5D,iBAAiBnX,WAAWwH,IAAuE,GAA7CrpD,KAAKg5D,iBAAiBnX,WAAWwH,KACvIrpD,KAAK4vC,OAAOyZ,GAASqR,SAAS3sC,EAAG9N,EAAGjgB,KAAKi6D,YAAaj6D,KAAK+4D,IAAKO,EAAWkB,GAC3Ev6C,GAAKu6C,EAAaC,GAKxB75D,GAAQusB,gBAAgBntB,KAAKi6D,cAM/B13D,EAASiS,UAAUs1C,KAAO,WACnB9pD,KAAK4oC,IAAI5P,MAAMtvB,aACc,QAA5B1J,KAAK8N,QAAQggC,YACf9tC,KAAKkuC,KAAKtF,IAAIxhC,KAAKsmB,YAAY1tB,KAAK4oC,IAAI5P,OAGxCh5B,KAAKkuC,KAAKtF,IAAIjI,MAAMjT,YAAY1tB,KAAK4oC,IAAI5P,QAIxCh5B,KAAK4oC,IAAI0xB,cAAc5wD,YAC1B1J,KAAKkuC,KAAKtF,IAAI8W,qBAAqBhyB,YAAY1tB,KAAK4oC,IAAI0xB,gBAO5D/3D,EAASiS,UAAUy1C,KAAO,WACpBjqD,KAAK4oC,IAAI5P,MAAMtvB,YACjB1J,KAAK4oC,IAAI5P,MAAMtvB,WAAW0jB,YAAYptB,KAAK4oC,IAAI5P,OAG7Ch5B,KAAK4oC,IAAI0xB,cAAc5wD,YACzB1J,KAAK4oC,IAAI0xB,cAAc5wD,WAAW0jB,YAAYptB,KAAK4oC,IAAI0xB,gBAU3D/3D,EAASiS,UAAUy4B,SAAW,SAAUn+B,EAAOuS,GAC7CrhB,KAAKkO,MAAMY,MAAQA,EACnB9O,KAAKkO,MAAMmT,IAAMA,GAOnB9e,EAASiS,UAAU2mB,OAAS,WAC1B,GAAIw/B,IAAe,EACfC,EAAe,CACnB,KAAK,GAAIvR,KAAWrpD,MAAK4vC,OACnB5vC,KAAK4vC,OAAOnqC,eAAe4jD,KACO,GAAhCrpD,KAAK4vC,OAAOyZ,GAAStnB,SAAkE57B,SAA9CnG,KAAKg5D,iBAAiBnX,WAAWwH,IAAuE,GAA7CrpD,KAAKg5D,iBAAiBnX,WAAWwH,IACvIuR,IAIN,IAA2B,GAAvB56D,KAAKk6D,gBAAuC,GAAhBU,EAC9B56D,KAAKiqD,WAEF,CACHjqD,KAAK8pD,OACL9pD,KAAKwuB,OAAS3qB,OAAO7D,KAAKu5D,aAAaprC,MAAMK,OAAOxiB,QAAQ,KAAK,KAGjEhM,KAAK4oC,IAAI0xB,cAAcnsC,MAAMK,OAASxuB,KAAKwuB,OAAS,KACpDxuB,KAAKuuB,MAAgC,GAAxBvuB,KAAK8N,QAAQi0B,QAAkBl+B,QAAQ,GAAK7D,KAAK8N,QAAQygB,OAAOviB,QAAQ,KAAK,KAAO,CAEjG,IAAIrG,GAAQ3F,KAAK2F,MACbqzB,EAAQh5B,KAAK4oC,IAAI5P,KAGrBA,GAAMrxB,UAAY,WAGlB3H,KAAKqjD,oBAEL,IAAIvV,GAAc9tC,KAAK8N,QAAQggC,YAC3BmV,EAAkBjjD,KAAK8N,QAAQm1C,gBAC/BC,EAAkBljD,KAAK8N,QAAQo1C,eAGnCv9C,GAAM29C,iBAAmBL,EAAkBt9C,EAAM49C,gBAAkB,EACnE59C,EAAM69C,iBAAmBN,EAAkBv9C,EAAM89C,gBAAkB,EAEnE99C,EAAMg+C,eAAiB3jD,KAAKkuC,KAAKtF,IAAI8W,qBAAqBzW,YAAcjpC,KAAK+5D,WAAa/5D,KAAKuuB,MAAQ,EAAIvuB,KAAK8N,QAAQqrD,iBACxHxzD,EAAM+9C,gBAAkB,EACxB/9C,EAAMk+C,eAAiB7jD,KAAKkuC,KAAKtF,IAAI8W,qBAAqBzW,YAAcjpC,KAAK+5D,WAAa/5D,KAAKuuB,MAAQ,EAAIvuB,KAAK8N,QAAQorD,iBACxHvzD,EAAMi+C,gBAAkB,EAGL,QAAf9V,GACF9U,EAAM7K,MAAM3mB,IAAM,IAClBwxB,EAAM7K,MAAM/mB,KAAO,IACnB4xB,EAAM7K,MAAM4O,OAAS,GACrB/D,EAAM7K,MAAMI,MAAQvuB,KAAKuuB,MAAQ,KACjCyK,EAAM7K,MAAMK,OAASxuB,KAAKwuB,OAAS,OAGnCwK,EAAM7K,MAAM3mB,IAAM,GAClBwxB,EAAM7K,MAAM4O,OAAS,IACrB/D,EAAM7K,MAAM/mB,KAAO,IACnB4xB,EAAM7K,MAAMI,MAAQvuB,KAAKuuB,MAAQ,KACjCyK,EAAM7K,MAAMK,OAASxuB,KAAKwuB,OAAS,MAErCmsC,EAAe36D,KAAK66D,gBACM,GAAtB76D,KAAK8N,QAAQmrD,OACfj5D,KAAKu6D,oBAGT,MAAOI,IAOTp4D,EAASiS,UAAUqmD,cAAgB,WACjCj6D,EAAQksB,gBAAgB9sB,KAAKw5D,YAAYC,OACzC74D,EAAQksB,gBAAgB9sB,KAAKw5D,YAAYE,OAEzC,IAAI5rB,GAAc9tC,KAAK8N,QAAqB,YAGxCi1C,EAAc/iD,KAAKg6D,OAASh6D,KAAK2F,MAAM89C,iBAAmB,GAAKzjD,KAAK85D,iBACpEr4B,EAAO,GAAI//B,GAAS1B,KAAKkO,MAAMY,MAAO9O,KAAKkO,MAAMmT,IAAK0hC,EAAa/iD,KAAK4oC,IAAI5P,MAAMmQ,aAAcnpC,KAAK8N,QAAQ8pD,YAAY53D,KAAK8N,QAAQggC,aAC1I9tC,MAAKyhC,KAAOA,CAGZ,IAAIo4B,IAAc75D,KAAK4oC,IAAI5P,MAAMmQ,aAAgB1H,EAAKu2B,WAAah4D,KAAK4oC,IAAI5P,MAAMmQ,aAAe1H,EAAKo3B,gBAAoBp3B,EAAKo3B,YAAcp3B,EAAKu2B,WAAav2B,EAAKA,KACpKzhC,MAAK65D,WAAaA,CAElB,IAAIiB,GAAgB96D,KAAKwuB,OAASqrC,EAC9BkB,EAAiB,CAErB,IAAmB,GAAf/6D,KAAKg6D,OAAiB,CACxBH,EAAa75D,KAAK85D,iBAClBiB,EAAiBl2D,KAAK+b,MAAO5gB,KAAK4oC,IAAI5P,MAAMmQ,aAAe0wB,EAAciB,EACzE,KAAK,GAAI31D,GAAI,EAAO,GAAM41D,EAAV51D,EAA0BA,IACxCs8B,EAAKgX,UAEPqiB,GAAgB96D,KAAKwuB,OAASqrC,MAG9BiB,IAAiB,GAInB96D,MAAKg7D,YAAcv5B,EAAKs2B,SACxB,IAAIkD,GAAiB,EAGjBnuD,EAAM,CAEV9M,MAAKk7D,aAAe,CAEpB,KADA,GAAIj7C,GAAI,EACDnT,EAAMjI,KAAK+b,MAAMk6C,IAAgB,CACtCr5B,EAAKhpB,OACLwH,EAAIpb,KAAK+b,MAAM9T,EAAM+sD,GACrBoB,EAAiBnuD,EAAM+sD,CACvB,IAAItV,GAAU9iB,EAAK8iB,WAEfvkD,KAAK8N,QAAyB,iBAAgB,GAAXy2C,GAAmC,GAAfvkD,KAAKg6D,QAAsD,GAAnCh6D,KAAK8N,QAAyB,kBAC/G9N,KAAKm7D,aAAal7C,EAAI,EAAGwhB,EAAKC,aAAcoM,EAAa,cAAe9tC,KAAK2F,MAAM49C,iBAGjFgB,GAAWvkD,KAAK8N,QAAyB,iBAAoB,GAAf9N,KAAKg6D,QAChB,GAAnCh6D,KAAK8N,QAAyB,iBAA6B,GAAf9N,KAAKg6D,QAA8B,GAAXzV,GAClEtkC,GAAK,GACPjgB,KAAKm7D,aAAal7C,EAAI,EAAGwhB,EAAKC,aAAcoM,EAAa,cAAe9tC,KAAK2F,MAAM89C,iBAErFzjD,KAAKo7D,YAAYn7C,EAAG6tB,EAAa,wBAAyB9tC,KAAK8N,QAAQorD,iBAAkBl5D,KAAK2F,MAAMk+C,iBAGpG7jD,KAAKo7D,YAAYn7C,EAAG6tB,EAAa,wBAAyB9tC,KAAK8N,QAAQqrD,iBAAkBn5D,KAAK2F,MAAMg+C,gBAGtG72C,IAIA9M,KAAK25D,iBADY,GAAf35D,KAAKg6D,OACiB/5C,GAAKjgB,KAAKg7D,YAAcv5B,EAAK+W,SAG7Bx4C,KAAK4oC,IAAI5P,MAAMmQ,aAAe1H,EAAKo3B,WAG7D,IAAI1tC,GAA+B,GAAtBnrB,KAAK8N,QAAQmrD,MAAgBj5D,KAAK8N,QAAQwrD,UAAYt5D,KAAK8N,QAAQsrD,aAAe,GAAKp5D,KAAK8N,QAAQsrD,aAAe,EAEhI,OAAIp5D,MAAKk7D,aAAgBl7D,KAAKuuB,MAAQpD,GAAmC,GAAxBnrB,KAAK8N,QAAQi0B,SAC5D/hC,KAAKuuB,MAAQvuB,KAAKk7D,aAAe/vC,EACjCnrB,KAAK8N,QAAQygB,MAAQvuB,KAAKuuB,MAAQ,KAClC3tB,EAAQusB,gBAAgBntB,KAAKw5D,YAAYC,OACzC74D,EAAQusB,gBAAgBntB,KAAKw5D,YAAYE,QACzC15D,KAAKm7B,UACE,GAGAn7B,KAAKk7D,aAAgBl7D,KAAKuuB,MAAQpD,GAAmC,GAAxBnrB,KAAK8N,QAAQi0B,SAAmB/hC,KAAKuuB,MAAQvuB,KAAK45D,UACtG55D,KAAKuuB,MAAQ1pB,KAAKiI,IAAI9M,KAAK45D,SAAS55D,KAAKk7D,aAAe/vC,GACxDnrB,KAAK8N,QAAQygB,MAAQvuB,KAAKuuB,MAAQ,KAClC3tB,EAAQusB,gBAAgBntB,KAAKw5D,YAAYC,OACzC74D,EAAQusB,gBAAgBntB,KAAKw5D,YAAYE,QACzC15D,KAAKm7B,UACE,IAGPv6B,EAAQusB,gBAAgBntB,KAAKw5D,YAAYC,OACzC74D,EAAQusB,gBAAgBntB,KAAKw5D,YAAYE,SAClC,IAIXn3D,EAASiS,UAAU6mD,aAAe,SAAUr0D,GAC1C,GAAIs0D,GAAgBt7D,KAAKg7D,YAAch0D,EACnCu0D,EAAiBD,EAAgBt7D,KAAK25D,gBAC1C,OAAO4B,IAYTh5D,EAASiS,UAAU2mD,aAAe,SAAUl7C,EAAG0iB,EAAMmL,EAAanmC,EAAW6zD,GAE3E,GAAI15B,GAAQlhC,EAAQ+sB,cAAc,MAAM3tB,KAAKw5D,YAAYE,OAAQ15D,KAAK4oC,IAAI5P,MAC1E8I,GAAMn6B,UAAYA,EAClBm6B,EAAMrE,UAAYkF,EACC,QAAfmL,GACFhM,EAAM3T,MAAM/mB,KAAO,IAAMpH,KAAK8N,QAAQsrD,aAAe,KACrDt3B,EAAM3T,MAAMwT,UAAY,UAGxBG,EAAM3T,MAAMwS,MAAQ,IAAM3gC,KAAK8N,QAAQsrD,aAAe,KACtDt3B,EAAM3T,MAAMwT,UAAY,QAG1BG,EAAM3T,MAAM3mB,IAAMyY,EAAI,GAAMu7C,EAAkBx7D,KAAK8N,QAAQurD,aAAe,KAE1E12B,GAAQ,EAER,IAAI84B,GAAe52D,KAAKiI,IAAI9M,KAAK2F,MAAMs/C,eAAejlD,KAAK2F,MAAMw+C,eAC7DnkD,MAAKk7D,aAAev4B,EAAKr9B,OAASm2D,IACpCz7D,KAAKk7D,aAAev4B,EAAKr9B,OAASm2D,IAYtCl5D,EAASiS,UAAU4mD,YAAc,SAAUn7C,EAAG6tB,EAAanmC,EAAWwjB,EAAQoD,GAC5E,GAAmB,GAAfvuB,KAAKg6D,OAAgB,CACvB,GAAItxB,GAAO9nC,EAAQ+sB,cAAc,MAAM3tB,KAAKw5D,YAAYC,MAAOz5D,KAAK4oC,IAAI0xB,cACxE5xB,GAAK/gC,UAAYA,EACjB+gC,EAAKjL,UAAY,GAEE,QAAfqQ,EACFpF,EAAKva,MAAM/mB,KAAQpH,KAAKuuB,MAAQpD,EAAU,KAG1Cud,EAAKva,MAAMwS,MAAS3gC,KAAKuuB,MAAQpD,EAAU,KAG7Cud,EAAKva,MAAMI,MAAQA,EAAQ,KAC3Bma,EAAKva,MAAM3mB,IAAMyY,EAAI,OAazB1d,EAASiS,UAAU6uC,mBAAqB,WAEtC,KAAM,mBAAqBrjD,MAAK2F,OAAQ,CACtC,GAAI+1D,GAAYluC,SAAS23B,eAAe,KACpCG,EAAmB93B,SAASK,cAAc,MAC9Cy3B,GAAiB39C,UAAY,sBAC7B29C,EAAiB53B,YAAYguC,GAC7B17D,KAAK4oC,IAAI5P,MAAMtL,YAAY43B,GAE3BtlD,KAAK2F,MAAM49C,gBAAkB+B,EAAiBjnB,aAC9Cr+B,KAAK2F,MAAMw+C,eAAiBmB,EAAiBpsB,YAE7Cl5B,KAAK4oC,IAAI5P,MAAM5L,YAAYk4B,GAG7B,KAAM,mBAAqBtlD,MAAK2F,OAAQ,CACtC,GAAIg2D,GAAYnuC,SAAS23B,eAAe,KACpCI,EAAmB/3B,SAASK,cAAc,MAC9C03B,GAAiB59C,UAAY,sBAC7B49C,EAAiB73B,YAAYiuC,GAC7B37D,KAAK4oC,IAAI5P,MAAMtL,YAAY63B,GAE3BvlD,KAAK2F,MAAM89C,gBAAkB8B,EAAiBlnB,aAC9Cr+B,KAAK2F,MAAMs/C,eAAiBM,EAAiBrsB,YAE7Cl5B,KAAK4oC,IAAI5P,MAAM5L,YAAYm4B,KAU/BhjD,EAASiS,UAAU85B,KAAO,SAASlxB,GACjC,MAAOpd,MAAKyhC,KAAK6M,KAAKlxB,IAGxBvd,EAAOD,QAAU2C,GAKb,SAAS1C,EAAQD,EAASM,GAW9B,QAASsC,GAAYwrB,EAAOq7B,EAASv7C,EAAS8tD,GAC5C57D,KAAKK,GAAKgpD,CACV,IAAI97C,IAAU,WAAW,QAAQ,OAAO,mBAAmB,WAAW,aAAa,SAAS,aAC5FvN,MAAK8N,QAAUnN,EAAK2M,sBAAsBC,EAAOO,GACjD9N,KAAK67D,kBAAwC11D,SAApB6nB,EAAMrmB,UAC/B3H,KAAK47D,yBAA2BA,EAChC57D,KAAK87D,aAAe,EACpB97D,KAAKswB,OAAOtC,GACkB,GAA1BhuB,KAAK67D,oBACP77D,KAAK47D,yBAAyB,IAAM,GAEtC57D,KAAKmvC,aACLnvC,KAAK+hC,QAA4B57B,SAAlB6nB,EAAM+T,SAAwB,EAAO/T,EAAM+T,QArB5D,GAAIphC,GAAOT,EAAoB,GAC3BU,EAAUV,EAAoB,EAuBlCsC,GAAWgS,UAAU66B,SAAW,SAASttC,GAC1B,MAATA,GACF/B,KAAKmvC,UAAYptC,EACQ,GAArB/B,KAAK8N,QAAQ0jB,MACfxxB,KAAKmvC,UAAU3d,KAAK,SAAUtsB,EAAEa,GAAI,MAAOb,GAAE6oB,EAAIhoB,EAAEgoB,KAIrD/tB,KAAKmvC,cAIT3sC,EAAWgS,UAAUunD,gBAAkB,SAASl9B,GAC9C7+B,KAAK87D,aAAej9B,GAGtBr8B,EAAWgS,UAAUkiB,WAAa,SAAS5oB,GACzC,GAAgB3H,SAAZ2H,EAAuB,CACzB,GAAIP,IAAU,WAAW,QAAQ,OAAO,mBAAmB,WAC3D5M,GAAKmF,oBAAoByH,EAAQvN,KAAK8N,QAASA,GAE/CnN,EAAKiN,aAAa5N,KAAK8N,QAASA,EAAQ,cACxCnN,EAAKiN,aAAa5N,KAAK8N,QAASA,EAAQ,cACxCnN,EAAKiN,aAAa5N,KAAK8N,QAASA,EAAQ,UAEpCA,EAAQkuD,YACuB,gBAAtBluD,GAAQkuD,YACbluD,EAAQkuD,WAAWC,kBACqB,WAAtCnuD,EAAQkuD,WAAWC,gBACrBj8D,KAAK8N,QAAQkuD,WAAWE,MAAQ,EAEa,WAAtCpuD,EAAQkuD,WAAWC,gBAC1Bj8D,KAAK8N,QAAQkuD,WAAWE,MAAQ,GAGhCl8D,KAAK8N,QAAQkuD,WAAWC,gBAAkB,cAC1Cj8D,KAAK8N,QAAQkuD,WAAWE,MAAQ,OAQ5C15D,EAAWgS,UAAU8b,OAAS,SAAStC,GACrChuB,KAAKguB,MAAQA,EACbhuB,KAAKyoC,QAAUza,EAAMya,SAAW,QAChCzoC,KAAK2H,UAAYqmB,EAAMrmB,WAAa3H,KAAK2H,WAAa,aAAe3H,KAAK47D,yBAAyB,GAAK,GACxG57D,KAAK+hC,QAA4B57B,SAAlB6nB,EAAM+T,SAAwB,EAAO/T,EAAM+T,QAC1D/hC,KAAK02B,WAAW1I,EAAMlgB,UAGxBtL,EAAWgS,UAAUkmD,SAAW,SAAS3sC,EAAG9N,EAAG8M,EAAeovC,EAAc7C,EAAWkB,GACrF,GACI4B,GAAMC,EADNC,EAA0B,GAAb9B,EAGb+B,EAAU37D,EAAQysB,cAAc,OAAQN,EAAeovC,EAO3D,IANAI,EAAQnuC,eAAe,KAAM,IAAKL,GAClCwuC,EAAQnuC,eAAe,KAAM,IAAKnO,EAAIq8C,GACtCC,EAAQnuC,eAAe,KAAM,QAASkrC,GACtCiD,EAAQnuC,eAAe,KAAM,SAAU,EAAEkuC,GACzCC,EAAQnuC,eAAe,KAAM,QAAS,WAEZ,QAAtBpuB,KAAK8N,QAAQqgB,MACfiuC,EAAOx7D,EAAQysB,cAAc,OAAQN,EAAeovC,GACpDC,EAAKhuC,eAAe,KAAM,QAASpuB,KAAK2H,WACxCy0D,EAAKhuC,eAAe,KAAM,IAAK,IAAML,EAAI,IAAI9N,EAAE,MAAQ8N,EAAIurC,GAAa,IAAIr5C,GACzC,GAA/BjgB,KAAK8N,QAAQ0uD,OAAOzuD,UACtBsuD,EAAWz7D,EAAQysB,cAAc,OAAQN,EAAeovC,GACjB,OAAnCn8D,KAAK8N,QAAQ0uD,OAAO1uB,YACtBuuB,EAASjuC,eAAe,KAAM,IAAK,IAAIL,EAAE,MAAQ9N,EAAIq8C,GACnD,IAAIvuC,EAAE,IAAI9N,EAAE,MAAO8N,EAAIurC,GAAa,IAAIr5C,EAAE,MAAO8N,EAAIurC,GAAa,KAAOr5C,EAAIq8C,IAG/ED,EAASjuC,eAAe,KAAM,IAAK,IAAIL,EAAE,IAAI9N,EAAE,KACzC8N,EAAE,KAAO9N,EAAIq8C,GAAc,MACzBvuC,EAAIurC,GAAa,KAAOr5C,EAAIq8C,GAClC,KAAMvuC,EAAIurC,GAAa,IAAIr5C,GAE/Bo8C,EAASjuC,eAAe,KAAM,QAASpuB,KAAK2H,UAAY,cAGnB,GAAnC3H,KAAK8N,QAAQogB,WAAWngB,SAC1BnN,EAAQktB,UAAUC,EAAI,GAAMurC,EAAUr5C,EAAGjgB,KAAM+sB,EAAeovC,OAG7D,CACH,GAAIM,GAAW53D,KAAK+b,MAAM,GAAM04C,GAC5BoD,EAAa73D,KAAK+b,MAAM,GAAM45C,GAC9BmC,EAAa93D,KAAK+b,MAAM,IAAO45C,GAE/BrvC,EAAStmB,KAAK+b,OAAO04C,EAAa,EAAImD,GAAW,EAErD77D,GAAQ0tB,QAAQP,EAAI,GAAI0uC,EAAWtxC,EAAYlL,EAAIq8C,EAAaI,EAAa,EAAGD,EAAUC,EAAY18D,KAAK2H,UAAY,OAAQolB,EAAeovC,GAC9Iv7D,EAAQ0tB,QAAQP,EAAI,IAAI0uC,EAAWtxC,EAAS,EAAGlL,EAAIq8C,EAAaK,EAAa,EAAGF,EAAUE,EAAY38D,KAAK2H,UAAY,OAAQolB,EAAeovC,KAUlJ35D,EAAWgS,UAAUkjD,UAAY,SAAS4B,EAAWkB,GACnD,GAAIzB,GAAMvrC,SAASC,gBAAgB,6BAA6B,MAEhE,OADAztB,MAAK06D,SAAS,EAAE,GAAIF,KAAczB,EAAIO,EAAUkB,IACxCoC,KAAM7D,EAAKj3B,MAAO9hC,KAAKyoC,QAASqF,YAAY9tC,KAAK8N,QAAQ+uD,mBAGnEh9D,EAAOD,QAAU4C,GAKb,SAAS3C,EAAQD,EAASM,GAS9B,QAASyC,GAAOurC,EAAMpgC,EAASgvD,EAAM9D,GACnCh5D,KAAKkuC,KAAOA,EACZluC,KAAK4tC,gBACH7/B,SAAS,EACTkrD,OAAO,EACP8D,SAAU,GACVC,YAAa,EACb51D,MACE26B,SAAS,EACT1E,SAAU,YAEZsD,OACEoB,SAAS,EACT1E,SAAU,aAGdr9B,KAAK88D,KAAOA,EACZ98D,KAAK8N,QAAUnN,EAAKsE,UAAUjF,KAAK4tC,gBACnC5tC,KAAKg5D,iBAAmBA,EAExBh5D,KAAKi6D,eACLj6D,KAAK4oC,OACL5oC,KAAK4vC,UACL5vC,KAAKk6D,eAAiB,EACtBl6D,KAAKiuC,UAELjuC,KAAK02B,WAAW5oB,GAjClB,GAAInN,GAAOT,EAAoB,GAC3BU,EAAUV,EAAoB,GAC9BkC,EAAYlC,EAAoB,GAkCpCyC,GAAO6R,UAAY,GAAIpS,GAGvBO,EAAO6R,UAAU2lD,SAAW,SAASr4B,EAAOs4B,GACrCp6D,KAAK4vC,OAAOnqC,eAAeq8B,KAC9B9hC,KAAK4vC,OAAO9N,GAASs4B,GAEvBp6D,KAAKk6D,gBAAkB,GAGzBv3D,EAAO6R,UAAUyzC,YAAc,SAASnmB,EAAOs4B,GAC7Cp6D,KAAK4vC,OAAO9N,GAASs4B,GAGvBz3D,EAAO6R,UAAU6lD,YAAc,SAASv4B,GAClC9hC,KAAK4vC,OAAOnqC,eAAeq8B,WACtB9hC,MAAK4vC,OAAO9N,GACnB9hC,KAAKk6D,gBAAkB,IAI3Bv3D,EAAO6R,UAAUy5B,QAAU,WACzBjuC,KAAK4oC,IAAI5P,MAAQxL,SAASK,cAAc,OACxC7tB,KAAK4oC,IAAI5P,MAAMrxB,UAAY,SAC3B3H,KAAK4oC,IAAI5P,MAAM7K,MAAMkP,SAAW,WAChCr9B,KAAK4oC,IAAI5P,MAAM7K,MAAM3mB,IAAM,OAC3BxH,KAAK4oC,IAAI5P,MAAM7K,MAAMoiC,QAAU,QAE/BvwD,KAAK4oC,IAAIq0B,SAAWzvC,SAASK,cAAc,OAC3C7tB,KAAK4oC,IAAIq0B,SAASt1D,UAAY,aAC9B3H,KAAK4oC,IAAIq0B,SAAS9uC,MAAMkP,SAAW,WACnCr9B,KAAK4oC,IAAIq0B,SAAS9uC,MAAM3mB,IAAM,MAE9BxH,KAAK+4D,IAAMvrC,SAASC,gBAAgB,6BAA6B,OACjEztB,KAAK+4D,IAAI5qC,MAAMkP,SAAW,WAC1Br9B,KAAK+4D,IAAI5qC,MAAM3mB,IAAM,MACrBxH,KAAK+4D,IAAI5qC,MAAMI,MAAQvuB,KAAK8N,QAAQivD,SAAW,EAAI,KAEnD/8D,KAAK4oC,IAAI5P,MAAMtL,YAAY1tB,KAAK+4D,KAChC/4D,KAAK4oC,IAAI5P,MAAMtL,YAAY1tB,KAAK4oC,IAAIq0B,WAMtCt6D,EAAO6R,UAAUy1C,KAAO,WAElBjqD,KAAK4oC,IAAI5P,MAAMtvB,YACjB1J,KAAK4oC,IAAI5P,MAAMtvB,WAAW0jB,YAAYptB,KAAK4oC,IAAI5P,QAQnDr2B,EAAO6R,UAAUs1C,KAAO,WAEjB9pD,KAAK4oC,IAAI5P,MAAMtvB,YAClB1J,KAAKkuC,KAAKtF,IAAI7D,OAAOrX,YAAY1tB,KAAK4oC,IAAI5P,QAI9Cr2B,EAAO6R,UAAUkiB,WAAa,SAAS5oB,GACrC,GAAIP,IAAU,UAAU,cAAc,QAAQ,OAAO,QACrD5M,GAAKmF,oBAAoByH,EAAQvN,KAAK8N,QAASA,IAGjDnL,EAAO6R,UAAU2mB,OAAS,WACxB,GAAIy/B,GAAe,CACnB,KAAK,GAAIvR,KAAWrpD,MAAK4vC,OACnB5vC,KAAK4vC,OAAOnqC,eAAe4jD,KACO,GAAhCrpD,KAAK4vC,OAAOyZ,GAAStnB,SAAkE57B,SAA9CnG,KAAKg5D,iBAAiBnX,WAAWwH,IAAuE,GAA7CrpD,KAAKg5D,iBAAiBnX,WAAWwH,IACvIuR,IAKN,IAAuC,GAAnC56D,KAAK8N,QAAQ9N,KAAK88D,MAAM/6B,SAA2C,GAAvB/hC,KAAKk6D,gBAA+C,GAAxBl6D,KAAK8N,QAAQC,SAAoC,GAAhB6sD,EAC3G56D,KAAKiqD,WAEF,CACHjqD,KAAK8pD,OACmC,YAApC9pD,KAAK8N,QAAQ9N,KAAK88D,MAAMz/B,UAA8D,eAApCr9B,KAAK8N,QAAQ9N,KAAK88D,MAAMz/B,UAC5Er9B,KAAK4oC,IAAI5P,MAAM7K,MAAM/mB,KAAO,MAC5BpH,KAAK4oC,IAAI5P,MAAM7K,MAAMwT,UAAY,OACjC3hC,KAAK4oC,IAAIq0B,SAAS9uC,MAAMwT,UAAY,OACpC3hC,KAAK4oC,IAAIq0B,SAAS9uC,MAAM/mB,KAAQpH,KAAK8N,QAAQivD,SAAW,GAAM,KAC9D/8D,KAAK4oC,IAAIq0B,SAAS9uC,MAAMwS,MAAQ,GAChC3gC,KAAK+4D,IAAI5qC,MAAM/mB,KAAO,MACtBpH,KAAK+4D,IAAI5qC,MAAMwS,MAAQ,KAGvB3gC,KAAK4oC,IAAI5P,MAAM7K,MAAMwS,MAAQ,MAC7B3gC,KAAK4oC,IAAI5P,MAAM7K,MAAMwT,UAAY,QACjC3hC,KAAK4oC,IAAIq0B,SAAS9uC,MAAMwT,UAAY,QACpC3hC,KAAK4oC,IAAIq0B,SAAS9uC,MAAMwS,MAAS3gC,KAAK8N,QAAQivD,SAAW,GAAM,KAC/D/8D,KAAK4oC,IAAIq0B,SAAS9uC,MAAM/mB,KAAO,GAC/BpH,KAAK+4D,IAAI5qC,MAAMwS,MAAQ,MACvB3gC,KAAK+4D,IAAI5qC,MAAM/mB,KAAO,IAGgB,YAApCpH,KAAK8N,QAAQ9N,KAAK88D,MAAMz/B,UAA8D,aAApCr9B,KAAK8N,QAAQ9N,KAAK88D,MAAMz/B,UAC5Er9B,KAAK4oC,IAAI5P,MAAM7K,MAAM3mB,IAAM,EAAI3D,OAAO7D,KAAKkuC,KAAKtF,IAAI7D,OAAO5W,MAAM3mB,IAAIwE,QAAQ,KAAK,KAAO,KACzFhM,KAAK4oC,IAAI5P,MAAM7K,MAAM4O,OAAS,KAG9B/8B,KAAK4oC,IAAI5P,MAAM7K,MAAM4O,OAAS,EAAIl5B,OAAO7D,KAAKkuC,KAAKtF,IAAI7D,OAAO5W,MAAM3mB,IAAIwE,QAAQ,KAAK,KAAO,KAC5FhM,KAAK4oC,IAAI5P,MAAM7K,MAAM3mB,IAAM,IAGH,GAAtBxH,KAAK8N,QAAQmrD,OACfj5D,KAAK4oC,IAAI5P,MAAM7K,MAAMI,MAAQvuB,KAAK4oC,IAAIq0B,SAASh0B,YAAc,GAAK,KAClEjpC,KAAK4oC,IAAIq0B,SAAS9uC,MAAMwS,MAAQ,GAChC3gC,KAAK4oC,IAAIq0B,SAAS9uC,MAAM/mB,KAAO,GAC/BpH,KAAK+4D,IAAI5qC,MAAMI,MAAQ,QAGvBvuB,KAAK4oC,IAAI5P,MAAM7K,MAAMI,MAAQvuB,KAAK8N,QAAQivD,SAAW,GAAK/8D,KAAK4oC,IAAIq0B,SAASh0B,YAAc,GAAK,KAC/FjpC,KAAKk9D,kBAGP,IAAIz0B,GAAU,EACd,KAAK,GAAI4gB,KAAWrpD,MAAK4vC,OACnB5vC,KAAK4vC,OAAOnqC,eAAe4jD,KACO,GAAhCrpD,KAAK4vC,OAAOyZ,GAAStnB,SAAkE57B,SAA9CnG,KAAKg5D,iBAAiBnX,WAAWwH,IAAuE,GAA7CrpD,KAAKg5D,iBAAiBnX,WAAWwH,KACvI5gB,GAAWzoC,KAAK4vC,OAAOyZ,GAAS5gB,QAAU,UAIhDzoC,MAAK4oC,IAAIq0B,SAASx/B,UAAYgL,EAC9BzoC,KAAK4oC,IAAIq0B,SAAS9uC,MAAMib,WAAe,IAAOppC,KAAK8N,QAAQivD,SAAY/8D,KAAK8N,QAAQkvD,YAAe,OAIvGr6D,EAAO6R,UAAU0oD,gBAAkB,WACjC,GAAIl9D,KAAK4oC,IAAI5P,MAAMtvB,WAAY,CAC7B9I,EAAQksB,gBAAgB9sB,KAAKi6D,YAC7B,IAAIz8B,GAAUn2B,OAAO6nD,iBAAiBlvD,KAAK4oC,IAAI5P,OAAOmkC,WAClD1C,EAAa52D,OAAO25B,EAAQxxB,QAAQ,KAAK,KACzC+hB,EAAI0sC,EACJnB,EAAYt5D,KAAK8N,QAAQivD,SACzBvC,EAAa,IAAOx6D,KAAK8N,QAAQivD,SACjC98C,EAAIw6C,EAAa,GAAMD,EAAa,CAExCx6D,MAAK+4D,IAAI5qC,MAAMI,MAAQ+qC,EAAY,EAAImB,EAAa,IAEpD,KAAK,GAAIpR,KAAWrpD,MAAK4vC,OACnB5vC,KAAK4vC,OAAOnqC,eAAe4jD,KACO,GAAhCrpD,KAAK4vC,OAAOyZ,GAAStnB,SAAkE57B,SAA9CnG,KAAKg5D,iBAAiBnX,WAAWwH,IAAuE,GAA7CrpD,KAAKg5D,iBAAiBnX,WAAWwH,KACvIrpD,KAAK4vC,OAAOyZ,GAASqR,SAAS3sC,EAAG9N,EAAGjgB,KAAKi6D,YAAaj6D,KAAK+4D,IAAKO,EAAWkB,GAC3Ev6C,GAAKu6C,EAAax6D,KAAK8N,QAAQkvD,aAKrCp8D,GAAQusB,gBAAgBntB,KAAKi6D,eAIjCp6D,EAAOD,QAAU+C,GAKb,SAAS9C,EAAQD,EAASM,GAoB9B,QAAS0C,GAAUsrC,EAAMpgC,GACvB9N,KAAKK,GAAKM,EAAKgE,aACf3E,KAAKkuC,KAAOA,EAEZluC,KAAK4tC,gBACHivB,iBAAkB,OAClBO,aAAc,UACd5rC,MAAM,EACN6rC,UAAU,EACVC,YAAa,QACbd,QACEzuD,SAAS,EACT+/B,YAAa,UAEf3f,MAAO,OACPovC,UACEhvC,MAAO,GACPivC,cAAe,UACf5V,MAAO,UAEToU,YACEjuD,SAAS,EACTkuD,gBAAiB,cACjBC,MAAO,IAEThuC,YACEngB,SAAS,EACTsgB,KAAM,EACNF,MAAO,UAETsvC,UACExa,iBAAiB,EACjBC,iBAAiB,EACjB+V,OAAO,EACP1qC,MAAO,OACPwT,SAAS,EACT61B,aACExwD,MAAOiE,IAAIlF,OAAW2G,IAAI3G,QAC1Bw6B,OAAQt1B,IAAIlF,OAAW2G,IAAI3G,UAG/Bu3D,QACE3vD,SAAS,EACTkrD,OAAO,EACP7xD,MACE26B,SAAS,EACT1E,SAAU,YAEZsD,OACEoB,SAAS,EACT1E,SAAU,cAGduS,QACEiS,gBAKJ7hD,KAAK8N,QAAUnN,EAAKsE,UAAWjF,KAAK4tC,gBACpC5tC,KAAK4oC,OACL5oC,KAAK2F,SACL3F,KAAK0D,OAAS,KACd1D,KAAK4vC,UACL5vC,KAAK29D,oBAAqB,CAE1B,IAAIhuC,GAAK3vB,IACTA,MAAKmvC,UAAY,KACjBnvC,KAAKovC,WAAa,KAGlBpvC,KAAKwoD,eACHjnC,IAAO,SAAUnY,EAAOkmB,GACtBK,EAAG84B,OAAOn5B,EAAOvtB,QAEnBuuB,OAAU,SAAUlnB,EAAOkmB,GACzBK,EAAG+4B,UAAUp5B,EAAOvtB,QAEtB4vB,OAAU,SAAUvoB,EAAOkmB,GACzBK,EAAGg5B,UAAUr5B,EAAOvtB,SAKxB/B,KAAK4oD,gBACHrnC,IAAO,SAAUnY,EAAOkmB,GACtBK,EAAGk5B,aAAav5B,EAAOvtB,QAEzBuuB,OAAU,SAAUlnB,EAAOkmB,GACzBK,EAAGm5B,gBAAgBx5B,EAAOvtB,QAE5B4vB,OAAU,SAAUvoB,EAAOkmB,GACzBK,EAAGo5B,gBAAgBz5B,EAAOvtB,SAI9B/B,KAAK+B,SACL/B,KAAKipD,aACLjpD,KAAK49D,UAAY59D,KAAKkuC,KAAKhgC,MAAMY,MACjC9O,KAAKmpD,eAELnpD,KAAKi6D,eACLj6D,KAAK02B,WAAW5oB,GAChB9N,KAAK47D,0BAA4B,GAEjC57D,KAAKkuC,KAAKE,QAAQrf,GAAG,cAAc,WAC/B,GAAoB,GAAhBY,EAAGiuC,UAAgB,CACrB,GAAIzyC,GAASwE,EAAGue,KAAKhgC,MAAMY,MAAQ6gB,EAAGiuC,UAClC1vD,EAAQyhB,EAAGue,KAAKhgC,MAAMmT,IAAMsO,EAAGue,KAAKhgC,MAAMY,KAC9C,IAAgB,GAAZ6gB,EAAGpB,MAAY,CACjB,GAAIsvC,GAAmBluC,EAAGpB,MAAMrgB,EAC5B60B,EAAU5X,EAAS0yC,CACvBluC,GAAGopC,IAAI5qC,MAAM/mB,MAASuoB,EAAGpB,MAAQwU,EAAW,SAIpD/iC,KAAKkuC,KAAKE,QAAQrf,GAAG,eAAgB,WACnCY,EAAGiuC,UAAYjuC,EAAGue,KAAKhgC,MAAMY,MAC7B6gB,EAAGopC,IAAI5qC,MAAM/mB,KAAOzG,EAAKgJ,OAAOK,QAAQ2lB,EAAGpB,OAC3CoB,EAAGmuC,aAAantD,MAAMgf,KAIxB3vB,KAAKiuC,UACLjuC,KAAKkuC,KAAKE,QAAQ3H,KAAK,UA9IzB,GAAI9lC,GAAOT,EAAoB,GAC3BU,EAAUV,EAAoB,GAC9BW,EAAUX,EAAoB,GAC9BY,EAAWZ,EAAoB,GAC/BkC,EAAYlC,EAAoB,IAChCqC,EAAWrC,EAAoB,IAC/BsC,EAAatC,EAAoB,IACjCyC,EAASzC,EAAoB,IAE7BqpD,EAAY,eAwIhB3mD,GAAU4R,UAAY,GAAIpS,GAK1BQ,EAAU4R,UAAUy5B,QAAU,WAC5B,GAAIjV,GAAQxL,SAASK,cAAc,MACnCmL,GAAMrxB,UAAY,YAClB3H,KAAK4oC,IAAI5P,MAAQA,EAGjBh5B,KAAK+4D,IAAMvrC,SAASC,gBAAgB,6BAA6B,OACjEztB,KAAK+4D,IAAI5qC,MAAMkP,SAAW,WAC1Br9B,KAAK+4D,IAAI5qC,MAAMK,QAAU,GAAKxuB,KAAK8N,QAAQwvD,aAAatxD,QAAQ,KAAK,IAAM,KAC3EhM,KAAK+4D,IAAI5qC,MAAMoiC,QAAU,QACzBv3B,EAAMtL,YAAY1tB,KAAK+4D,KAGvB/4D,KAAK8N,QAAQ2vD,SAAS3vB,YAAc,OACpC9tC,KAAK+9D,UAAY,GAAIx7D,GAASvC,KAAKkuC,KAAMluC,KAAK8N,QAAQ2vD,SAAUz9D,KAAK+4D,IAAK/4D,KAAK8N,QAAQ8hC,QAEvF5vC,KAAK8N,QAAQ2vD,SAAS3vB,YAAc,QACpC9tC,KAAKg+D,WAAa,GAAIz7D,GAASvC,KAAKkuC,KAAMluC,KAAK8N,QAAQ2vD,SAAUz9D,KAAK+4D,IAAK/4D,KAAK8N,QAAQ8hC,cACjF5vC,MAAK8N,QAAQ2vD,SAAS3vB,YAG7B9tC,KAAKi+D,WAAa,GAAIt7D,GAAO3C,KAAKkuC,KAAMluC,KAAK8N,QAAQ4vD,OAAQ,OAAQ19D,KAAK8N,QAAQ8hC,QAClF5vC,KAAKk+D,YAAc,GAAIv7D,GAAO3C,KAAKkuC,KAAMluC,KAAK8N,QAAQ4vD,OAAQ,QAAS19D,KAAK8N,QAAQ8hC,QAEpF5vC,KAAK8pD,QAOPlnD,EAAU4R,UAAUkiB,WAAa,SAAS5oB,GACxC,GAAIA,EAAS,CACX,GAAIP,IAAU,WAAW,eAAe,cAAc,mBAAmB,QAAQ,WAAW,WAAW,OAAO,SAC9G5M,GAAKmF,oBAAoByH,EAAQvN,KAAK8N,QAASA,GAC/CnN,EAAKiN,aAAa5N,KAAK8N,QAASA,EAAQ,cACxCnN,EAAKiN,aAAa5N,KAAK8N,QAASA,EAAQ,cACxCnN,EAAKiN,aAAa5N,KAAK8N,QAASA,EAAQ,UACxCnN,EAAKiN,aAAa5N,KAAK8N,QAASA,EAAQ,UAEpCA,EAAQkuD,YACuB,gBAAtBluD,GAAQkuD,YACbluD,EAAQkuD,WAAWC,kBACqB,WAAtCnuD,EAAQkuD,WAAWC,gBACrBj8D,KAAK8N,QAAQkuD,WAAWE,MAAQ,EAEa,WAAtCpuD,EAAQkuD,WAAWC,gBAC1Bj8D,KAAK8N,QAAQkuD,WAAWE,MAAQ,GAGhCl8D,KAAK8N,QAAQkuD,WAAWC,gBAAkB,cAC1Cj8D,KAAK8N,QAAQkuD,WAAWE,MAAQ,KAMpCl8D,KAAK+9D,WACkB53D,SAArB2H,EAAQ2vD,WACVz9D,KAAK+9D,UAAUrnC,WAAW12B,KAAK8N,QAAQ2vD,UACvCz9D,KAAKg+D,WAAWtnC,WAAW12B,KAAK8N,QAAQ2vD,WAIxCz9D,KAAKi+D,YACgB93D,SAAnB2H,EAAQ4vD,SACV19D,KAAKi+D,WAAWvnC,WAAW12B,KAAK8N,QAAQ4vD,QACxC19D,KAAKk+D,YAAYxnC,WAAW12B,KAAK8N,QAAQ4vD,SAIzC19D,KAAK4vC,OAAOnqC,eAAe8jD,IAC7BvpD,KAAK4vC,OAAO2Z,GAAW7yB,WAAW5oB,GAGlC9N,KAAK4oC,IAAI5P,OACXh5B,KAAK89D,gBAOTl7D,EAAU4R,UAAUy1C,KAAO,WAErBjqD,KAAK4oC,IAAI5P,MAAMtvB,YACjB1J,KAAK4oC,IAAI5P,MAAMtvB,WAAW0jB,YAAYptB,KAAK4oC,IAAI5P,QAQnDp2B,EAAU4R,UAAUs1C,KAAO,WAEpB9pD,KAAK4oC,IAAI5P,MAAMtvB,YAClB1J,KAAKkuC,KAAKtF,IAAI7D,OAAOrX,YAAY1tB,KAAK4oC,IAAI5P,QAS9Cp2B,EAAU4R,UAAU66B,SAAW,SAASttC,GACtC,GACE2uB,GADEf,EAAK3vB,KAEPyrD,EAAezrD,KAAKmvC,SAGtB,IAAKptC,EAGA,CAAA,KAAIA,YAAiBlB,IAAWkB,YAAiBjB,IAIpD,KAAM,IAAIkF,WAAU,kDAHpBhG,MAAKmvC,UAAYptC,MAHjB/B,MAAKmvC,UAAY,IAoBnB,IAXIsc,IAEF9qD,EAAKwH,QAAQnI,KAAKwoD,cAAe,SAAUpgD,EAAUgB,GACnDqiD,EAAav8B,IAAI9lB,EAAOhB,KAI1BsoB,EAAM+6B,EAAar6B,SACnBpxB,KAAK2oD,UAAUj4B,IAGb1wB,KAAKmvC,UAAW,CAElB,GAAI9uC,GAAKL,KAAKK,EACdM,GAAKwH,QAAQnI,KAAKwoD,cAAe,SAAUpgD,EAAUgB,GACnDumB,EAAGwf,UAAUpgB,GAAG3lB,EAAOhB,EAAU/H,KAInCqwB,EAAM1wB,KAAKmvC,UAAU/d,SACrBpxB,KAAKyoD,OAAO/3B,GAEd1wB,KAAK0pD,mBACL1pD,KAAK89D,eACL99D,KAAKm7B,UAOPv4B,EAAU4R,UAAUm7B,UAAY,SAASC,GACvC,GACElf,GADEf,EAAK3vB,IAgBT,IAZIA,KAAKovC,aACPzuC,EAAKwH,QAAQnI,KAAK4oD,eAAgB,SAAUxgD,EAAUgB,GACpDumB,EAAGyf,WAAWhgB,YAAYhmB,EAAOhB,KAInCsoB,EAAM1wB,KAAKovC,WAAWhe,SACtBpxB,KAAKovC,WAAa,KAClBpvC,KAAK+oD,gBAAgBr4B,IAIlBkf,EAGA,CAAA,KAAIA,YAAkB/uC,IAAW+uC,YAAkB9uC,IAItD,KAAM,IAAIkF,WAAU,kDAHpBhG,MAAKovC,WAAaQ,MAHlB5vC,MAAKovC,WAAa,IASpB,IAAIpvC,KAAKovC,WAAY,CAEnB,GAAI/uC,GAAKL,KAAKK,EACdM,GAAKwH,QAAQnI,KAAK4oD,eAAgB,SAAUxgD,EAAUgB,GACpDumB,EAAGyf,WAAWrgB,GAAG3lB,EAAOhB,EAAU/H,KAIpCqwB,EAAM1wB,KAAKovC,WAAWhe,SACtBpxB,KAAK6oD,aAAan4B,GAEpB1wB,KAAK0oD,aASP9lD,EAAU4R,UAAUk0C,UAAY,WAC9B1oD,KAAK0pD,mBACL1pD,KAAKm+D,sBACLn+D,KAAK89D,eACL99D,KAAKm7B,UAEPv4B,EAAU4R,UAAUi0C,OAAkB,SAAU/3B,GAAM1wB,KAAK0oD,UAAUh4B,IACrE9tB,EAAU4R,UAAUm0C,UAAkB,SAAUj4B,GAAM1wB,KAAK0oD,UAAUh4B,IACrE9tB,EAAU4R,UAAUs0C,gBAAmB,SAAUE,GAC/C,IAAK,GAAI7jD,GAAI,EAAGA,EAAI6jD,EAAS1jD,OAAQH,IAAK,CACxC,GAAI6oB,GAAQhuB,KAAKovC,WAAW12B,IAAIswC,EAAS7jD,GACzCnF,MAAKo+D,aAAapwC,EAAOg7B,EAAS7jD,IAGpCnF,KAAK89D,eACL99D,KAAKm7B,UAEPv4B,EAAU4R,UAAUq0C,aAAe,SAAUG,GAAWhpD,KAAK8oD,gBAAgBE,IAE7EpmD,EAAU4R,UAAUu0C,gBAAkB,SAAUC,GAC9C,IAAK,GAAI7jD,GAAI,EAAGA,EAAI6jD,EAAS1jD,OAAQH,IAC9BnF,KAAK4vC,OAAOnqC,eAAeujD,EAAS7jD,MACkB,SAArDnF,KAAK4vC,OAAOoZ,EAAS7jD,IAAI2I,QAAQ+uD,kBACnC78D,KAAKg+D,WAAW3D,YAAYrR,EAAS7jD,IACrCnF,KAAKk+D,YAAY7D,YAAYrR,EAAS7jD,IACtCnF,KAAKk+D,YAAY/iC,WAGjBn7B,KAAK+9D,UAAU1D,YAAYrR,EAAS7jD,IACpCnF,KAAKi+D,WAAW5D,YAAYrR,EAAS7jD,IACrCnF,KAAKi+D,WAAW9iC,gBAEXn7B,MAAK4vC,OAAOoZ,EAAS7jD,IAGhCnF,MAAK0pD,mBACL1pD,KAAK89D,eACL99D,KAAKm7B,UAUPv4B,EAAU4R,UAAU4pD,aAAe,SAAUpwC,EAAOq7B,GAC7CrpD,KAAK4vC,OAAOnqC,eAAe4jD,IAY9BrpD,KAAK4vC,OAAOyZ,GAAS/4B,OAAOtC,GACyB,SAAjDhuB,KAAK4vC,OAAOyZ,GAASv7C,QAAQ+uD,kBAC/B78D,KAAKg+D,WAAW/V,YAAYoB,EAASrpD,KAAK4vC,OAAOyZ,IACjDrpD,KAAKk+D,YAAYjW,YAAYoB,EAASrpD,KAAK4vC,OAAOyZ,MAGlDrpD,KAAK+9D,UAAU9V,YAAYoB,EAASrpD,KAAK4vC,OAAOyZ,IAChDrpD,KAAKi+D,WAAWhW,YAAYoB,EAASrpD,KAAK4vC,OAAOyZ,OAlBnDrpD,KAAK4vC,OAAOyZ,GAAW,GAAI7mD,GAAWwrB,EAAOq7B,EAASrpD,KAAK8N,QAAS9N,KAAK47D,0BACpB,SAAjD57D,KAAK4vC,OAAOyZ,GAASv7C,QAAQ+uD,kBAC/B78D,KAAKg+D,WAAW7D,SAAS9Q,EAASrpD,KAAK4vC,OAAOyZ,IAC9CrpD,KAAKk+D,YAAY/D,SAAS9Q,EAASrpD,KAAK4vC,OAAOyZ,MAG/CrpD,KAAK+9D,UAAU5D,SAAS9Q,EAASrpD,KAAK4vC,OAAOyZ,IAC7CrpD,KAAKi+D,WAAW9D,SAAS9Q,EAASrpD,KAAK4vC,OAAOyZ,MAclDrpD,KAAKi+D,WAAW9iC,SAChBn7B,KAAKk+D,YAAY/iC,UAGnBv4B,EAAU4R,UAAU2pD,oBAAsB,WACxC,GAAsB,MAAlBn+D,KAAKmvC,UAAmB,CAC1B,GACIka,GADAgV,IAEJ,KAAKhV,IAAWrpD,MAAK4vC,OACf5vC,KAAK4vC,OAAOnqC,eAAe4jD,KAC7BgV,EAAchV,MAGlB,KAAK,GAAIv4B,KAAU9wB,MAAKmvC,UAAUl8B,MAChC,GAAIjT,KAAKmvC,UAAUl8B,MAAMxN,eAAeqrB,GAAS,CAC/C,GAAIZ,GAAOlwB,KAAKmvC,UAAUl8B,MAAM6d,EAChCZ,GAAKnC,EAAIptB,EAAK6F,QAAQ0pB,EAAKnC,EAAE,QAC7BswC,EAAcnuC,EAAKlC,OAAOlmB,KAAKooB,GAGnC,IAAKm5B,IAAWrpD,MAAK4vC,OACf5vC,KAAK4vC,OAAOnqC,eAAe4jD,IAC7BrpD,KAAK4vC,OAAOyZ,GAASha,SAASgvB,EAAchV,MAWpDzmD,EAAU4R,UAAUk1C,iBAAmB,WACrC,GAAsB,MAAlB1pD,KAAKmvC,UAAmB,CAE1B,GAAInhB,IAAS3tB,GAAIkpD,EAAW9gB,QAASzoC,KAAK8N,QAAQsvD,aAClDp9D,MAAKo+D,aAAapwC,EAAOu7B,EACzB,IAAI+U,GAAmB,CACvB,IAAIt+D,KAAKmvC,UACP,IAAK,GAAIre,KAAU9wB,MAAKmvC,UAAUl8B,MAChC,GAAIjT,KAAKmvC,UAAUl8B,MAAMxN,eAAeqrB,GAAS,CAC/C,GAAIZ,GAAOlwB,KAAKmvC,UAAUl8B,MAAM6d,EACpB3qB,SAAR+pB,IACEA,EAAKzqB,eAAe,SACHU,SAAf+pB,EAAKlC,QACPkC,EAAKlC,MAAQu7B,GAIfr5B,EAAKlC,MAAQu7B,EAEf+U,EAAmBpuC,EAAKlC,OAASu7B,EAAY+U,EAAmB,EAAIA,GAMpD,GAApBA,UACKt+D,MAAK4vC,OAAO2Z,GACnBvpD,KAAKi+D,WAAW5D,YAAY9Q,GAC5BvpD,KAAKk+D,YAAY7D,YAAY9Q,GAC7BvpD,KAAK+9D,UAAU1D,YAAY9Q,GAC3BvpD,KAAKg+D,WAAW3D,YAAY9Q,eAIvBvpD,MAAK4vC,OAAO2Z,GACnBvpD,KAAKi+D,WAAW5D,YAAY9Q,GAC5BvpD,KAAKk+D,YAAY7D,YAAY9Q,GAC7BvpD,KAAK+9D,UAAU1D,YAAY9Q,GAC3BvpD,KAAKg+D,WAAW3D,YAAY9Q,EAG9BvpD,MAAKi+D,WAAW9iC,SAChBn7B,KAAKk+D,YAAY/iC,UAQnBv4B,EAAU4R,UAAU2mB,OAAS,WAC3B,GAAIkkB,IAAU,CAEdr/C,MAAK+4D,IAAI5qC,MAAMK,QAAU,GAAKxuB,KAAK8N,QAAQwvD,aAAatxD,QAAQ,KAAK,IAAM,MACpD7F,SAAnBnG,KAAKiiD,WAA2BjiD,KAAKuuB,OAASvuB,KAAKiiD,WAAajiD,KAAKuuB,SACvE8wB,GAAU,GAGZA,EAAUr/C,KAAKo/C,cAAgBC,CAE/B,IAAIoL,GAAkBzqD,KAAKkuC,KAAKhgC,MAAMmT,IAAMrhB,KAAKkuC,KAAKhgC,MAAMY,MACxD47C,EAAUD,GAAmBzqD,KAAK2qD,qBAAyB3qD,KAAKuuB,OAASvuB,KAAKiiD,SAoBlF,OAnBAjiD,MAAK2qD,oBAAsBF,EAC3BzqD,KAAKiiD,UAAYjiD,KAAKuuB,MAGtBvuB,KAAKuuB,MAAQvuB,KAAK4oC,IAAI5P,MAAMiQ,YAIb,GAAXoW,IACFr/C,KAAK+4D,IAAI5qC,MAAMI,MAAQ5tB,EAAKgJ,OAAOK,OAAO,EAAEhK,KAAKuuB,OACjDvuB,KAAK+4D,IAAI5qC,MAAM/mB,KAAOzG,EAAKgJ,OAAOK,QAAQhK,KAAKuuB,SAEnC,GAAVm8B,GAA6C,GAA3B1qD,KAAK29D,qBACzB39D,KAAK89D,eAGP99D,KAAKi+D,WAAW9iC,SAChBn7B,KAAKk+D,YAAY/iC,SAEVkkB,GAOTz8C,EAAU4R,UAAUspD,aAAe,WAGjC,GADAl9D,EAAQksB,gBAAgB9sB,KAAKi6D,aACX,GAAdj6D,KAAKuuB,OAAgC,MAAlBvuB,KAAKmvC,UAAmB,CAC7C,GAAInhB,GAAO7oB,EACPo5D,KACAC,KACAC,KACA9D,GAAe,EAGf3R,IACJ,KAAK,GAAIK,KAAWrpD,MAAK4vC,OACnB5vC,KAAK4vC,OAAOnqC,eAAe4jD,KAC7Br7B,EAAQhuB,KAAK4vC,OAAOyZ,GACC,GAAjBr7B,EAAM+T,SAAgE57B,SAA5CnG,KAAK8N,QAAQ8hC,OAAOiS,WAAWwH,IAAqE,GAA3CrpD,KAAK8N,QAAQ8hC,OAAOiS,WAAWwH,IACpHL,EAASlhD,KAAKuhD,GAIpB,IAAIL,EAAS1jD,OAAS,EAAG,CAEvB,GAAIo5D,GAAU1+D,KAAKkuC,KAAKvtC,KAAKkuC,cAAe7uC,KAAKkuC,KAAKC,SAASzuC,KAAK6uB,OAChEowC,EAAU3+D,KAAKkuC,KAAKvtC,KAAKkuC,aAAa,EAAI7uC,KAAKkuC,KAAKC,SAASzuC,KAAK6uB,OAClE6gB,IAIJ,KAFApvC,KAAK4+D,iBAAiB5V,EAAU5Z,EAAYsvB,EAASC,GAEhDx5D,EAAI,EAAGA,EAAI6jD,EAAS1jD,OAAQH,IAC/Bo5D,EAAsBvV,EAAS7jD,IAAMnF,KAAK6+D,qBAAqBzvB,EAAW4Z,EAAS7jD,IAQrF,IALAnF,KAAK8+D,YAAY9V,EAAUuV,EAAuBE,GAIlD9D,EAAe36D,KAAK++D,aAAa/V,EAAUyV,GACvB,GAAhB9D,EAIF,MAHA/5D,GAAQusB,gBAAgBntB,KAAKi6D,aAC7Bj6D,KAAK29D,oBAAqB,MAC1B39D,MAAKkuC,KAAKE,QAAQ3H,KAAK,SAMzB,KAHAzmC,KAAK29D,oBAAqB,EAGrBx4D,EAAI,EAAGA,EAAI6jD,EAAS1jD,OAAQH,IAC/B6oB,EAAQhuB,KAAK4vC,OAAOoZ,EAAS7jD,IAC7Bq5D,EAAmBxV,EAAS7jD,IAAMnF,KAAKg/D,qBAAqB5vB,EAAW4Z,EAAS7jD,IAAK6oB,EAKvF,KAAK7oB,EAAI,EAAGA,EAAI6jD,EAAS1jD,OAAQH,IAC/B6oB,EAAQhuB,KAAK4vC,OAAOoZ,EAAS7jD,IACF,QAAvB6oB,EAAMlgB,QAAQqgB,OAChBnuB,KAAKi/D,eAAeT,EAAmBxV,EAAS7jD,IAAK6oB,EAGzDhuB,MAAKk/D,eAAelW,EAAUwV,IAKlC59D,EAAQusB,gBAAgBntB,KAAKi6D,cAI/Br3D,EAAU4R,UAAUoqD,iBAAmB,SAAU5V,EAAU5Z,EAAYsvB,EAASC,GAM9E,GAAI3wC,GAAO7oB,EAAGqT,EAAG0X,CACjB,IAAI84B,EAAS1jD,OAAS,EACpB,IAAKH,EAAI,EAAGA,EAAI6jD,EAAS1jD,OAAQH,IAAK,CACpC6oB,EAAQhuB,KAAK4vC,OAAOoZ,EAAS7jD,IAC7BiqC,EAAW4Z,EAAS7jD,MACpB,IAAIg6D,GAAgB/vB,EAAW4Z,EAAS7jD,GAExC,IAA0B,GAAtB6oB,EAAMlgB,QAAQ0jB,KAAc,CAC9B,GAAI5iB,GAAQ/J,KAAKiI,IAAI,EAAGnM,EAAKsO,oBAAoB+e,EAAMmhB,UAAWuvB,EAAS,IAAK,UAChF,KAAKlmD,EAAI5J,EAAO4J,EAAIwV,EAAMmhB,UAAU7pC,OAAQkT,IAE1C,GADA0X,EAAOlC,EAAMmhB,UAAU32B,GACVrS,SAAT+pB,EAAoB,CACtB,GAAIA,EAAKnC,EAAI4wC,EAAS,CACpBQ,EAAcr3D,KAAKooB,EACnB,OAGAivC,EAAcr3D,KAAKooB,QAMzB,KAAK1X,EAAI,EAAGA,EAAIwV,EAAMmhB,UAAU7pC,OAAQkT,IACtC0X,EAAOlC,EAAMmhB,UAAU32B,GACVrS,SAAT+pB,GACEA,EAAKnC,EAAI2wC,GAAWxuC,EAAKnC,EAAI4wC,GAC/BQ,EAAcr3D,KAAKooB,GAQ/BlwB,KAAKo/D,eAAepW,EAAU5Z,IAGhCxsC,EAAU4R,UAAU4qD,eAAiB,SAAUpW,EAAU5Z,GACvD,GAAIphB,EACJ,IAAIg7B,EAAS1jD,OAAS,EACpB,IAAK,GAAIH,GAAI,EAAGA,EAAI6jD,EAAS1jD,OAAQH,IAEnC,GADA6oB,EAAQhuB,KAAK4vC,OAAOoZ,EAAS7jD,IACC,GAA1B6oB,EAAMlgB,QAAQuvD,SAAkB,CAClC,GAAI8B,GAAgB/vB,EAAW4Z,EAAS7jD,GACxC,IAAIg6D,EAAc75D,OAAS,EAAG,CAC5B,GAAI+5D,GAAY,EACZC,EAAiBH,EAAc75D,OAI/Bi6D,EAAYv/D,KAAKkuC,KAAKvtC,KAAK8tC,eAAe0wB,EAAcA,EAAc75D,OAAS,GAAGyoB,GAAK/tB,KAAKkuC,KAAKvtC,KAAK8tC,eAAe0wB,EAAc,GAAGpxC,GACtIyxC,EAAiBF,EAAiBC,CACtCF,GAAYx6D,KAAKwG,IAAIxG,KAAK2O,KAAK,GAAM8rD,GAAiBz6D,KAAKiI,IAAI,EAAGjI,KAAK+b,MAAM4+C,IAG7E,KAAK,GADDC,MACKjnD,EAAI,EAAO8mD,EAAJ9mD,EAAoBA,GAAK6mD,EACvCI,EAAY33D,KAAKq3D,EAAc3mD,GAGjC42B,GAAW4Z,EAAS7jD,IAAMs6D,KAOpC78D,EAAU4R,UAAUsqD,YAAc,SAAU9V,EAAU5Z,EAAYqvB,GAChE,GAAI1S,GAAW/9B,EAAO7oB,EAAEqT,EAGpBknD,EAFAC,KACAC,IAEJ,IAAI5W,EAAS1jD,OAAS,EAAG,CACvB,IAAKH,EAAI,EAAGA,EAAI6jD,EAAS1jD,OAAQH,IAE/B,GADA4mD,EAAY3c,EAAW4Z,EAAS7jD,IAC5B4mD,EAAUzmD,OAAS,EAErB,GADA0oB,EAAQhuB,KAAK4vC,OAAOoZ,EAAS7jD,IACF,QAAvB6oB,EAAMlgB,QAAQqgB,OAA2D,SAAxCH,EAAMlgB,QAAQyvD,SAASC,cAA0B,CACpF,GAAI5nC,GAAOm2B,EAAU,GAAG9rC,EACpB6V,EAAOi2B,EAAU,GAAG9rC,CACxB,KAAKzH,EAAI,EAAGA,EAAIuzC,EAAUzmD,OAAQkT,IAChCod,EAAOA,EAAOm2B,EAAUvzC,GAAGyH,EAAI8rC,EAAUvzC,GAAGyH,EAAI2V,EAChDE,EAAOA,EAAOi2B,EAAUvzC,GAAGyH,EAAI8rC,EAAUvzC,GAAGyH,EAAI6V,CAElD2oC,GAAYzV,EAAS7jD,KAAOkG,IAAKuqB,EAAM9oB,IAAKgpB,EAAM+mC,iBAAkB7uC,EAAMlgB,QAAQ+uD,sBAE/E,IAA2B,OAAvB7uC,EAAMlgB,QAAQqgB,MAWrB,IATEuxC,EADoC,QAAlC1xC,EAAMlgB,QAAQ+uD,iBACE8C,EAGAC,EAGpBnB,EAAYzV,EAAS7jD,KAAOkG,IAAK,EAAGyB,IAAK,EAAG+vD,iBAAkB7uC,EAAMlgB,QAAQ+uD,iBAAkBgD,QAAQ,GAGjGrnD,EAAI,EAAGA,EAAIuzC,EAAUzmD,OAAQkT,IAChCknD,EAAgB53D,MACdimB,EAAGg+B,EAAUvzC,GAAGuV,EAChB9N,EAAG8rC,EAAUvzC,GAAGyH,EAChBopC,QAASL,EAAS7jD,IAO5B,IAAI26D,EACAH,GAAoBr6D,OAAS,IAE/Bq6D,EAAoBnuC,KAAK,SAAUtsB,EAAGa,GACpC,MAAIb,GAAE6oB,GAAKhoB,EAAEgoB,EACJ7oB,EAAEmkD,QAAUtjD,EAAEsjD,QAEdnkD,EAAE6oB,EAAIhoB,EAAEgoB,IAGnB+xC,KACA9/D,KAAK+/D,sBAAsBD,EAAeH,GAC1ClB,EAA4B,eAAIz+D,KAAKggE,qBAAqBF,EAAeH,GACzElB,EAA4B,eAAE5B,iBAAmB,OACjD7T,EAASlhD,KAAK,mBAEZ83D,EAAqBt6D,OAAS,IAEhCs6D,EAAqBpuC,KAAK,SAAUtsB,EAAGa,GACrC,MAAIb,GAAE6oB,GAAKhoB,EAAEgoB,EACJ7oB,EAAEmkD,QAAUtjD,EAAEsjD,QAEdnkD,EAAE6oB,EAAIhoB,EAAEgoB,IAGnB+xC,KACA9/D,KAAK+/D,sBAAsBD,EAAeF,GAC1CnB,EAA6B,gBAAIz+D,KAAKggE,qBAAqBF,EAAeF,GAC1EnB,EAA6B,gBAAE5B,iBAAmB,QAClD7T,EAASlhD,KAAK,sBAKpBlF,EAAU4R,UAAUwrD,qBAAuB,SAAUF,EAAeG,GAIlE,IAAK,GAHDz3D,GACAotB,EAAOqqC,EAAa,GAAGhgD,EACvB6V,EAAOmqC,EAAa,GAAGhgD,EAClB9a,EAAI,EAAGA,EAAI86D,EAAa36D,OAAQH,IACvCqD,EAAMy3D,EAAa96D,GAAG4oB,EACK5nB,SAAvB25D,EAAct3D,IAChBotB,EAAOA,EAAOqqC,EAAa96D,GAAG8a,EAAIggD,EAAa96D,GAAG8a,EAAI2V,EACtDE,EAAOA,EAAOmqC,EAAa96D,GAAG8a,EAAIggD,EAAa96D,GAAG8a,EAAI6V,GAGtDgqC,EAAct3D,GAAK03D,aAAeD,EAAa96D,GAAG8a,CAGtD,KAAK,GAAIkgD,KAAQL,GACXA,EAAcr6D,eAAe06D,KAC/BvqC,EAAOA,EAAOkqC,EAAcK,GAAMD,YAAcJ,EAAcK,GAAMD,YAActqC,EAClFE,EAAOA,EAAOgqC,EAAcK,GAAMD,YAAcJ,EAAcK,GAAMD,YAAcpqC,EAItF,QAAQzqB,IAAKuqB,EAAM9oB,IAAKgpB,IAU1BlzB,EAAU4R,UAAUuqD,aAAe,SAAU/V,EAAUyV,GACrD,GAGoE2B,GAAQC,EAHxE1F,GAAe,EACf2F,GAAgB,EAChBC,GAAiB,EACjBC,EAAU,IAAKC,EAAW,IAAKC,EAAU,KAAMC,EAAW,IAE9D,IAAI3X,EAAS1jD,OAAS,EAAG,CACvB,IAAK,GAAIH,GAAI,EAAGA,EAAI6jD,EAAS1jD,OAAQH,IAC/Bs5D,EAAYh5D,eAAeujD,EAAS7jD,KAClCs5D,EAAYzV,EAAS7jD,IAAI06D,UAAW,IACtCO,EAAS3B,EAAYzV,EAAS7jD,IAAIkG,IAClCg1D,EAAS5B,EAAYzV,EAAS7jD,IAAI2H,IAEe,QAA7C2xD,EAAYzV,EAAS7jD,IAAI03D,kBAC3ByD,GAAgB,EAChBE,EAAUA,EAAUJ,EAASA,EAASI,EACtCE,EAAoBL,EAAVK,EAAmBL,EAASK,IAGtCH,GAAiB,EACjBE,EAAWA,EAAWL,EAASA,EAASK,EACxCE,EAAsBN,EAAXM,EAAoBN,EAASM,GAM3B,IAAjBL,GACFtgE,KAAK+9D,UAAU9wB,SAASuzB,EAASE,GAEb,GAAlBH,GACFvgE,KAAKg+D,WAAW/wB,SAASwzB,EAAUE,GAsCvC,MAlCAhG,GAAe36D,KAAK4gE,qBAAqBN,EAAgBtgE,KAAK+9D,YAAepD,EAC7EA,EAAe36D,KAAK4gE,qBAAqBL,EAAgBvgE,KAAKg+D,aAAerD,EAEvD,GAAlB4F,GAA2C,GAAjBD,GAC5BtgE,KAAK+9D,UAAU8C,WAAY,EAC3B7gE,KAAKg+D,WAAW6C,WAAY,IAG5B7gE,KAAK+9D,UAAU8C,WAAY,EAC3B7gE,KAAKg+D,WAAW6C,WAAY,GAG9B7gE,KAAKg+D,WAAWhE,QAAUsG,EAEI,GAA1BtgE,KAAKg+D,WAAWhE,QACWh6D,KAAK+9D,UAAUhE,WAAtB,GAAlBwG,EAAqDvgE,KAAKg+D,WAAWzvC,MAChB,EAEzDosC,EAAe36D,KAAK+9D,UAAU5iC,UAAYw/B,EAC1C36D,KAAKg+D,WAAWlE,iBAAmB95D,KAAK+9D,UAAUlE,WAClDc,EAAe36D,KAAKg+D,WAAW7iC,UAAYw/B,GAG3CA,EAAe36D,KAAKg+D,WAAW7iC,UAAYw/B,EAIH,IAAtC3R,EAAS1iD,QAAQ,mBACnB0iD,EAAS9gD,OAAO8gD,EAAS1iD,QAAQ,kBAAkB,GAEV,IAAvC0iD,EAAS1iD,QAAQ,oBACnB0iD,EAAS9gD,OAAO8gD,EAAS1iD,QAAQ,mBAAmB,GAG/Cq0D,GAWT/3D,EAAU4R,UAAUosD,qBAAuB,SAAUE,EAAUxY,GAC7D,GAAIjK,IAAU,CAad,OAZgB,IAAZyiB,EACExY,EAAK1f,IAAI5P,MAAMtvB,aACjB4+C,EAAK2B,OACL5L,GAAU,GAIPiK,EAAK1f,IAAI5P,MAAMtvB,aAClB4+C,EAAKwB,OACLzL,GAAU,GAGPA,GAUTz7C,EAAU4R,UAAU0qD,eAAiB,SAAUlW,EAAUwV,GACvD,GAEIuC,GACAv4D,EAAKw4D,EACLhzC,EACA7oB,EAAEqT,EALFynD,KACAH,KAKAmB,EAAY,CAGhB,KAAK97D,EAAI,EAAGA,EAAI6jD,EAAS1jD,OAAQH,IAE/B,GADA6oB,EAAQhuB,KAAK4vC,OAAOoZ,EAAS7jD,IACF,OAAvB6oB,EAAMlgB,QAAQqgB,OACK,GAAjBH,EAAM+T,UAAoE57B,SAAhDnG,KAAK8N,QAAQ8hC,OAAOiS,WAAWmH,EAAS7jD,KAAoE,GAA/CnF,KAAK8N,QAAQ8hC,OAAOiS,WAAWmH,EAAS7jD,KACjI,IAAKqT,EAAI,EAAGA,EAAIgmD,EAAmBxV,EAAS7jD,IAAIG,OAAQkT,IACtDynD,EAAan4D,MACXimB,EAAGywC,EAAmBxV,EAAS7jD,IAAIqT,GAAGuV,EACtC9N,EAAGu+C,EAAmBxV,EAAS7jD,IAAIqT,GAAGyH,EACtCopC,QAASL,EAAS7jD,KAEpB87D,GAAa,CAMrB,IAAiB,GAAbA,EAeJ,IAZAhB,EAAazuC,KAAK,SAAUtsB,EAAGa,GAC7B,MAAIb,GAAE6oB,GAAKhoB,EAAEgoB,EACJ7oB,EAAEmkD,QAAUtjD,EAAEsjD,QAEdnkD,EAAE6oB,EAAIhoB,EAAEgoB,IAKnB/tB,KAAK+/D,sBAAsBD,EAAeG,GAGrC96D,EAAI,EAAGA,EAAI86D,EAAa36D,OAAQH,IAAK,CACxC6oB,EAAQhuB,KAAK4vC,OAAOqwB,EAAa96D,GAAGkkD,QACpC,IAAIuQ,GAAW,GAAM5rC,EAAMlgB,QAAQyvD,SAAShvC,KAE5C/lB,GAAMy3D,EAAa96D,GAAG4oB,CACtB,IAAImzC,GAAe,CACnB,IAA2B/6D,SAAvB25D,EAAct3D,GACZrD,EAAE,EAAI86D,EAAa36D,SAASy7D,EAAel8D,KAAK+O,IAAIqsD,EAAa96D,EAAE,GAAG4oB,EAAIvlB,IAC1ErD,EAAI,IAAwB47D,EAAel8D,KAAKwG,IAAI01D,EAAal8D,KAAK+O,IAAIqsD,EAAa96D,EAAE,GAAG4oB,EAAIvlB,KACpGw4D,EAAWhhE,KAAKmhE,iBAAiBJ,EAAc/yC,EAAO4rC,OAEnD,CACH,GAAIwH,GAAUj8D,GAAK26D,EAAct3D,GAAK64D,OAASvB,EAAct3D,GAAK84D,UAC9DC,EAAUp8D,GAAK26D,EAAct3D,GAAK84D,SAAW,EAC7CF,GAAUnB,EAAa36D,SAASy7D,EAAel8D,KAAK+O,IAAIqsD,EAAamB,GAASrzC,EAAIvlB,IAClF+4D,EAAU,IAAsBR,EAAel8D,KAAKwG,IAAI01D,EAAal8D,KAAK+O,IAAIqsD,EAAasB,GAASxzC,EAAIvlB,KAC5Gw4D,EAAWhhE,KAAKmhE,iBAAiBJ,EAAc/yC,EAAO4rC,GACtDkG,EAAct3D,GAAK84D,UAAY,EAEa,SAAxCtzC,EAAMlgB,QAAQyvD,SAASC,eACzB0D,EAAepB,EAAct3D,GAAK03D,YAClCJ,EAAct3D,GAAK03D,aAAelyC,EAAM8tC,aAAemE,EAAa96D,GAAG8a,GAExB,cAAxC+N,EAAMlgB,QAAQyvD,SAASC,gBAC9BwD,EAASzyC,MAAQyyC,EAASzyC,MAAQuxC,EAAct3D,GAAK64D,OACrDL,EAAS71C,QAAW20C,EAAct3D,GAAa,SAAIw4D,EAASzyC,MAAS,GAAIyyC,EAASzyC,OAASuxC,EAAct3D,GAAK64D,OAAO,GACjF,QAAhCrzC,EAAMlgB,QAAQyvD,SAAS3V,MAAwBoZ,EAAS71C,QAAU,GAAI61C,EAASzyC,MAC1C,SAAhCP,EAAMlgB,QAAQyvD,SAAS3V,QAAmBoZ,EAAS71C,QAAU,GAAI61C,EAASzyC,QAGvF3tB,EAAQ0tB,QAAQ2xC,EAAa96D,GAAG4oB,EAAIizC,EAAS71C,OAAQ80C,EAAa96D,GAAG8a,EAAIihD,EAAcF,EAASzyC,MAAOP,EAAM8tC,aAAemE,EAAa96D,GAAG8a,EAAG+N,EAAMrmB,UAAY,OAAQ3H,KAAKi6D,YAAaj6D,KAAK+4D,KAExJ,GAApC/qC,EAAMlgB,QAAQogB,WAAWngB,SAC3BnN,EAAQktB,UAAUmyC,EAAa96D,GAAG4oB,EAAIizC,EAAS71C,OAAQ80C,EAAa96D,GAAG8a,EAAIihD,EAAclzC,EAAOhuB,KAAKi6D,YAAaj6D,KAAK+4D,OAW7Hn2D,EAAU4R,UAAUurD,sBAAwB,SAAUD,EAAeG,GAGnE,IAAK,GADDc,GACK57D,EAAI,EAAGA,EAAI86D,EAAa36D,OAAQH,IACnCA,EAAI,EAAI86D,EAAa36D,SACvBy7D,EAAel8D,KAAK+O,IAAIqsD,EAAa96D,EAAI,GAAG4oB,EAAIkyC,EAAa96D,GAAG4oB,IAE9D5oB,EAAI,IACN47D,EAAel8D,KAAKwG,IAAI01D,EAAcl8D,KAAK+O,IAAIqsD,EAAa96D,EAAI,GAAG4oB,EAAIkyC,EAAa96D,GAAG4oB,KAErE,GAAhBgzC,IACuC56D,SAArC25D,EAAcG,EAAa96D,GAAG4oB,KAChC+xC,EAAcG,EAAa96D,GAAG4oB,IAAMszC,OAAQ,EAAGC,SAAU,EAAGpB,YAAa,IAE3EJ,EAAcG,EAAa96D,GAAG4oB,GAAGszC,QAAU,IAcjDz+D,EAAU4R,UAAU2sD,iBAAmB,SAAUJ,EAAc/yC,EAAO4rC,GACpE,GAAIrrC,GAAOpD,CAwBX,OAvBI41C,GAAe/yC,EAAMlgB,QAAQyvD,SAAShvC,OAASwyC,EAAe,GAChExyC,EAAuBqrC,EAAfmH,EAA0BnH,EAAWmH,EAE7C51C,EAAS,EAC2B,QAAhC6C,EAAMlgB,QAAQyvD,SAAS3V,MACzBz8B,GAAU,GAAM41C,EAEuB,SAAhC/yC,EAAMlgB,QAAQyvD,SAAS3V,QAC9Bz8B,GAAU,GAAM41C,KAKlBxyC,EAAQP,EAAMlgB,QAAQyvD,SAAShvC,MAC/BpD,EAAS,EAC2B,QAAhC6C,EAAMlgB,QAAQyvD,SAAS3V,MACzBz8B,GAAU,GAAM6C,EAAMlgB,QAAQyvD,SAAShvC,MAEA,SAAhCP,EAAMlgB,QAAQyvD,SAAS3V,QAC9Bz8B,GAAU,GAAM6C,EAAMlgB,QAAQyvD,SAAShvC,SAInCA,MAAOA,EAAOpD,OAAQA,IAUhCvoB,EAAU4R,UAAUyqD,eAAiB,SAAU9uB,EAASniB,GACtD,GAAe,MAAXmiB,GACEA,EAAQ7qC,OAAS,EAAG,CACtB,GAAI82D,GAAMjwD,EACNq1D,EAAY39D,OAAO7D,KAAK+4D,IAAI5qC,MAAMK,OAAOxiB,QAAQ,KAAK,IAa1D,IAZAowD,EAAOx7D,EAAQysB,cAAc,OAAQrtB,KAAKi6D,YAAaj6D,KAAK+4D,KAC5DqD,EAAKhuC,eAAe,KAAM,QAASJ,EAAMrmB,WAIvCwE,EADsC,GAApC6hB,EAAMlgB,QAAQkuD,WAAWjuD,QACvB/N,KAAKyhE,YAAYtxB,EAASniB,GAG1BhuB,KAAK0hE,QAAQvxB,GAIiB,GAAhCniB,EAAMlgB,QAAQ0uD,OAAOzuD,QAAiB,CACxC,GACI4zD,GADAtF,EAAWz7D,EAAQysB,cAAc,OAAOrtB,KAAKi6D,YAAaj6D,KAAK+4D,IAGjE4I,GADsC,OAApC3zC,EAAMlgB,QAAQ0uD,OAAO1uB,YACf,IAAMqC,EAAQ,GAAGpiB,EAAI,MAAgB5hB,EAAI,IAAMgkC,EAAQA,EAAQ7qC,OAAS,GAAGyoB,EAAI,KAG/E,IAAMoiB,EAAQ,GAAGpiB,EAAI,IAAMyzC,EAAY,IAAMr1D,EAAI,IAAMgkC,EAAQA,EAAQ7qC,OAAS,GAAGyoB,EAAI,IAAMyzC,EAEvGnF,EAASjuC,eAAe,KAAM,QAASJ,EAAMrmB,UAAY,SACzD00D,EAASjuC,eAAe,KAAM,IAAKuzC,GAGrCvF,EAAKhuC,eAAe,KAAM,IAAK,IAAMjiB,GAGG,GAApC6hB,EAAMlgB,QAAQogB,WAAWngB,SAC3B/N,KAAK4hE,YAAYzxB,EAASniB,EAAOhuB,KAAKi6D,YAAaj6D,KAAK+4D,OAehEn2D,EAAU4R,UAAUotD,YAAc,SAAUzxB,EAASniB,EAAOjB,EAAegsC,EAAK5tC,GAC/DhlB,SAAXglB,IAAuBA,EAAS,EACpC,KAAK,GAAIhmB,GAAI,EAAGA,EAAIgrC,EAAQ7qC,OAAQH,IAClCvE,EAAQktB,UAAUqiB,EAAQhrC,GAAG4oB,EAAI5C,EAAQglB,EAAQhrC,GAAG8a,EAAG+N,EAAOjB,EAAegsC,IAejFn2D,EAAU4R,UAAUqqD,qBAAuB,SAAUgD,GAKnD,IAAK,GAHDC,GAAQC,EADRC,KAEAzzB,EAAWvuC,KAAKkuC,KAAKvtC,KAAK4tC,SAErBppC,EAAI,EAAGA,EAAI08D,EAAWv8D,OAAQH,IACrC28D,EAASvzB,EAASszB,EAAW18D,GAAG4oB,GAAK/tB,KAAKuuB,MAAQ,EAClDwzC,EAASF,EAAW18D,GAAG8a,EACvB+hD,EAAcl6D,MAAMimB,EAAG+zC,EAAQ7hD,EAAG8hD,GAGpC,OAAOC,IAcTp/D,EAAU4R,UAAUwqD,qBAAuB,SAAU6C,EAAY7zC,GAC/D,GACI8zC,GAAQC,EADRC,KAEAzzB,EAAWvuC,KAAKkuC,KAAKvtC,KAAK4tC,SAC1B+Z,EAAOtoD,KAAK+9D,UACZyD,EAAY39D,OAAO7D,KAAK+4D,IAAI5qC,MAAMK,OAAOxiB,QAAQ,KAAK,IACpB;SAAlCgiB,EAAMlgB,QAAQ+uD,mBAChBvU,EAAOtoD,KAAKg+D,WAGd,KAAK,GAAI74D,GAAI,EAAGA,EAAI08D,EAAWv8D,OAAQH,IACrC28D,EAASvzB,EAASszB,EAAW18D,GAAG4oB,GAAK/tB,KAAKuuB,MAAQ,EAClDwzC,EAASl9D,KAAK+b,MAAM0nC,EAAK+S,aAAawG,EAAW18D,GAAG8a,IACpD+hD,EAAcl6D,MAAMimB,EAAG+zC,EAAQ7hD,EAAG8hD,GAKpC,OAFA/zC,GAAM+tC,gBAAgBl3D,KAAKwG,IAAIm2D,EAAWlZ,EAAK+S,aAAa,KAErD2G,GAUTp/D,EAAU4R,UAAUytD,mBAAqB,SAASr2C,GAMhD,IAAK,GAJDs2C,GAAIpjD,EAAIC,EAAIC,EAAImjD,EAAKC,EACrBj2D,EAAItH,KAAK+b,MAAMgL,EAAK,GAAGmC,GAAK,IAAMlpB,KAAK+b,MAAMgL,EAAK,GAAG3L,GAAK,IAC1DoiD,EAAgB,EAAE,EAClB/8D,EAASsmB,EAAKtmB,OACTH,EAAI,EAAOG,EAAS,EAAbH,EAAgBA,IAE9B+8D,EAAW,GAAL/8D,EAAUymB,EAAK,GAAKA,EAAKzmB,EAAE,GACjC2Z,EAAK8M,EAAKzmB,GACV4Z,EAAK6M,EAAKzmB,EAAE,GACZ6Z,EAAc1Z,EAARH,EAAI,EAAcymB,EAAKzmB,EAAE,GAAK4Z,EAUpCojD,GAAQp0C,IAAMm0C,EAAGn0C,EAAI,EAAEjP,EAAGiP,EAAIhP,EAAGgP,GAAIs0C,EAAgBpiD,IAAMiiD,EAAGjiD,EAAI,EAAEnB,EAAGmB,EAAIlB,EAAGkB,GAAIoiD,GAClFD,GAAQr0C,GAAMjP,EAAGiP,EAAI,EAAEhP,EAAGgP,EAAI/O,EAAG+O,GAAIs0C,EAAgBpiD,GAAMnB,EAAGmB,EAAI,EAAElB,EAAGkB,EAAIjB,EAAGiB,GAAIoiD,GAGlFl2D,GAAK,IACHg2D,EAAIp0C,EAAI,IACRo0C,EAAIliD,EAAI,IACRmiD,EAAIr0C,EAAI,IACRq0C,EAAIniD,EAAI,IACRlB,EAAGgP,EAAI,IACPhP,EAAGkB,EAAI,GAGX,OAAO9T,IAaTvJ,EAAU4R,UAAUitD,YAAc,SAAS71C,EAAMoC,GAC/C,GAAIkuC,GAAQluC,EAAMlgB,QAAQkuD,WAAWE,KACrC,IAAa,GAATA,GAAwB/1D,SAAV+1D,EAChB,MAAOl8D,MAAKiiE,mBAAmBr2C,EAO/B,KAAK,GAJDs2C,GAAIpjD,EAAIC,EAAIC,EAAImjD,EAAKC,EAAKE,EAAGC,EAAGC,EAAIh9C,EAAGke,EAAG++B,EAAGviD,EAC7CwiD,EAAQC,EAAQC,EAASC,EAASC,EAASC,EAC3C52D,EAAItH,KAAK+b,MAAMgL,EAAK,GAAGmC,GAAK,IAAMlpB,KAAK+b,MAAMgL,EAAK,GAAG3L,GAAK,IAC1D3a,EAASsmB,EAAKtmB,OACTH,EAAI,EAAOG,EAAS,EAAbH,EAAgBA,IAE9B+8D,EAAW,GAAL/8D,EAAUymB,EAAK,GAAKA,EAAKzmB,EAAE,GACjC2Z,EAAK8M,EAAKzmB,GACV4Z,EAAK6M,EAAKzmB,EAAE,GACZ6Z,EAAc1Z,EAARH,EAAI,EAAcymB,EAAKzmB,EAAE,GAAK4Z,EAEpCujD,EAAKz9D,KAAK2jC,KAAK3jC,KAAK0oC,IAAI20B,EAAGn0C,EAAIjP,EAAGiP,EAAE,GAAKlpB,KAAK0oC,IAAI20B,EAAGjiD,EAAInB,EAAGmB,EAAE,IAC9DsiD,EAAK19D,KAAK2jC,KAAK3jC,KAAK0oC,IAAIzuB,EAAGiP,EAAIhP,EAAGgP,EAAE,GAAKlpB,KAAK0oC,IAAIzuB,EAAGmB,EAAIlB,EAAGkB,EAAE,IAC9DuiD,EAAK39D,KAAK2jC,KAAK3jC,KAAK0oC,IAAIxuB,EAAGgP,EAAI/O,EAAG+O,EAAE,GAAKlpB,KAAK0oC,IAAIxuB,EAAGkB,EAAIjB,EAAGiB,EAAE,IAiB9DyiD,EAAU79D,KAAK0oC,IAAIi1B,EAAKtG,GACxB0G,EAAU/9D,KAAK0oC,IAAIi1B,EAAG,EAAEtG,GACxByG,EAAU99D,KAAK0oC,IAAIg1B,EAAKrG,GACxB2G,EAAUh+D,KAAK0oC,IAAIg1B,EAAG,EAAErG,GACxB6G,EAAUl+D,KAAK0oC,IAAI+0B,EAAKpG,GACxB4G,EAAUj+D,KAAK0oC,IAAI+0B,EAAG,EAAEpG,GAExB12C,EAAI,EAAEs9C,EAAU,EAAEC,EAASJ,EAASE,EACpCn/B,EAAI,EAAEk/B,EAAU,EAAEF,EAASC,EAASE,EACpCJ,EAAI,EAAEM,GAAUA,EAASJ,GACrBF,EAAI,IAAIA,EAAI,EAAIA,GACpBviD,EAAI,EAAEwiD,GAAUA,EAASC,GACrBziD,EAAI,IAAIA,EAAI,EAAIA,GAEpBiiD,GAAQp0C,IAAM80C,EAAUX,EAAGn0C,EAAIvI,EAAE1G,EAAGiP,EAAI+0C,EAAU/jD,EAAGgP,GAAK00C,EACxDxiD,IAAM4iD,EAAUX,EAAGjiD,EAAIuF,EAAE1G,EAAGmB,EAAI6iD,EAAU/jD,EAAGkB,GAAKwiD,GAEpDL,GAAQr0C,GAAM60C,EAAU9jD,EAAGiP,EAAI2V,EAAE3kB,EAAGgP,EAAI80C,EAAU7jD,EAAG+O,GAAK7N,EACxDD,GAAM2iD,EAAU9jD,EAAGmB,EAAIyjB,EAAE3kB,EAAGkB,EAAI4iD,EAAU7jD,EAAGiB,GAAKC,GAEvC,GAATiiD,EAAIp0C,GAAmB,GAATo0C,EAAIliD,IAASkiD,EAAMrjD,GACxB,GAATsjD,EAAIr0C,GAAmB,GAATq0C,EAAIniD,IAASmiD,EAAMrjD,GACrC5S,GAAK,IACHg2D,EAAIp0C,EAAI,IACRo0C,EAAIliD,EAAI,IACRmiD,EAAIr0C,EAAI,IACRq0C,EAAIniD,EAAI,IACRlB,EAAGgP,EAAI,IACPhP,EAAGkB,EAAI,GAGX,OAAO9T,IAUXvJ,EAAU4R,UAAUktD,QAAU,SAAS91C,GAGrC,IAAK,GADDzf,GAAI,GACChH,EAAI,EAAGA,EAAIymB,EAAKtmB,OAAQH,IAE7BgH,GADO,GAALhH,EACGymB,EAAKzmB,GAAG4oB,EAAI,IAAMnC,EAAKzmB,GAAG8a,EAG1B,IAAM2L,EAAKzmB,GAAG4oB,EAAI,IAAMnC,EAAKzmB,GAAG8a,CAGzC,OAAO9T,IAGTtM,EAAOD,QAAUgD,GAKb,SAAS/C,EAAQD,EAASM,GAkC9B,QAAS4C,GAAS6wB,EAAW/H,EAAM9d,GACjC,KAAM9N,eAAgB8C,IACpB,KAAM,IAAI8wB,aAAY,mDAGxB5zB,MAAKgjE,0BAGLhjE,KAAK6zB,iBAAmBF,EAGxB3zB,KAAKijE,kBAAoB,GACzBjjE,KAAKkjE,eAAiB,IAAOljE,KAAKijE,kBAClCjjE,KAAKmjE,WAAa,GAAMnjE,KAAKkjE,eAC7BljE,KAAKojE,yBAA2B,EAChCpjE,KAAKqjE,wBAA0B,GAE/BrjE,KAAKsjE,cAAe,EAEpBtjE,KAAKujE,kBAAoBhiD,IAAI,KAAKiiD,KAAK,KAAKC,SAAS,KAAKC,QAAQ,KAAKC,IAAI,MAG3E3jE,KAAK4tC,gBACHg2B,OACEC,KAAM,EACNC,UAAW,GACXC,UAAW,GACXx/B,OAAQ,GACRy/B,MAAO,UACPC,MAAO99D,OACPq6B,SAAU,GACVC,SAAU,GACVyjC,OAAO,EACPC,UAAW,QACXC,SAAU,GACVC,SAAU,UACVpS,MAAO,GACPxnD,OACIkB,OAAQ,UACRD,WAAY,UACdE,WACED,OAAQ,UACRD,WAAY,WAEdG,OACEF,OAAQ,UACRD,WAAY,YAGhB+tB,YAAa,UACbJ,gBAAiB,UACjBirC,eAAgB,UAChBt2C,MAAO7nB,OACPuzB,YAAa,GAEf6qC,OACE/jC,SAAU,EACVC,SAAU,GACVlS,MAAO,EACPi2C,yBAA0B,EAC1BC,WAAY,IACZt2C,MAAO,OACP1jB,OACEA,MAAM,UACNmB,UAAU,UACVC,MAAO,WAETs4D,UAAW,UACXC,SAAU,GACVC,SAAU,QACVK,SAAU,QACVC,iBAAkB,EAClBC,MACEt/D,OAAQ,GACRu/D,IAAK,EACLC,UAAW3+D,QAEb4+D,aAAc,QAEhBC,kBAAiB,EACjBC,SACEC,WACEn3D,SAAS,EACTo3D,MAAO,EAAI,GACXC,sBAAuB,KACvBC,eAAgB,GAChBC,aAAc,GACdC,eAAgB,IAChBC,QAAS,KAEXC,WACEJ,eAAgB,EAChBC,aAAc,IACdC,eAAgB,IAChBG,aAAc,IACdF,QAAS,KAEXG,uBACE53D,SAAS,EACTs3D,eAAgB,EAChBC,aAAc,IACdC,eAAgB,IAChBG,aAAc,IACdF,QAAS,KAEXA,QAAS,KACTH,eAAgB,KAChBC,aAAc,KACdC,eAAgB,MAElBK,YACE73D,SAAS,EACT83D,gBAAiB,IACjBC,iBAAiB,IACjBC,cAAc,IACdC,eAAgB,GAChBC,qBAAsB,GACtBC,gBAAiB,IACjBC,oBAAqB,GACrBC,mBAAoB,EACpBC,YAAa,IACbC,mBAAoB,GACpBC,sBAAuB,GACvBC,WAAY,GACZC,aAAcl4C,MAAQ,EACRC,OAAQ,EACR+V,OAAQ,GACtBmiC,sBAAuB,IACvBC,kBAAmB,GACnBC,uBAAwB,GAE1BC,YACE94D,SAAS,GAEX+4D,UACE/4D,SAAS,EACTg5D,OAAQh5C,EAAG,GAAI9N,EAAG,GAAI++B,KAAM,MAE9BgoB,kBACEj5D,SAAS,EACTk5D,kBAAkB,GAEpBC,oBACEn5D,SAAQ,EACRo5D,gBAAiB,IACjBC,YAAa,IACblyB,UAAW,MAEbmyB,wBAAwB,EACxBC,cACEv5D,SAAS,EACTw5D,SAAS,EACT9gE,KAAM,aACN+gE,UAAW,IAEbC,qBAAqB,EACrBC,YAAc,GACdC,YAAc,GACdC,WAAW,EACXC,wBAAyB,IACzB1kB,OAAQ,KACRiE,QAASA,EACT1nB,SACEgH,MAAO,IACPy9B,UAAW,QACXC,SAAU,GACVC,SAAU,UACV55D,OACEkB,OAAQ,OACRD,WAAY,YAGhBo8D,aAAa,EACbC,WAAW,EACXvqB,UAAU,EACV3xC,OAAO,EACPm8D,iBAAiB,EACjBC,iBAAiB,EACjB15C,MAAQ,OACRC,OAAS,OACTs5B,YAAY,GAEd9nD,KAAKkoE,UAAYvnE,EAAKsE,UAAWjF,KAAK4tC,gBAEtC5tC,KAAKmoE,UAAYvE,SAASW,UAC1BvkE,KAAKooE,oBAAqB,CAG1B,IAAIrlE,GAAU/C,IACdA,MAAK4vC,OAAS,GAAI3sC,GAClBjD,KAAKqoE,OAAS,GAAInlE,GAClBlD,KAAKqoE,OAAOC,kBAAkB,WAC5BvlE,EAAQwlE,YAIVvoE,KAAKwoE,WAAa,EAClBxoE,KAAKyoE,WAAa,EAClBzoE,KAAK0oE,cAAgB,EAIrB1oE,KAAK2oE,qBAEL3oE,KAAKiuC,UAELjuC,KAAK4oE,oBAEL5oE,KAAK6oE,qBAEL7oE,KAAK8oE,uBAEL9oE,KAAK+oE,uBAGL/oE,KAAKgpE,gBAAgBhpE,KAAKg5B,MAAME,YAAc,EAAGl5B,KAAKg5B,MAAMqF,aAAe,GAC3Er+B,KAAK42B,UAAU,GACf52B,KAAK02B,WAAW5oB,GAGhB9N,KAAKipE,kBAAmB,EACxBjpE,KAAKkpE,mBAGLlpE,KAAKmpE,oBACLnpE,KAAKopE,0BACLppE,KAAKqpE,eACLrpE,KAAK4jE,SACL5jE,KAAKukE,SAGLvkE,KAAKspE,eAAqBv7C,EAAK,EAAE9N,EAAK,GACtCjgB,KAAKupE,mBAAqBx7C,EAAK,EAAE9N,EAAK,GACtCjgB,KAAKwpE,iBAAmBz7C,EAAK,EAAE9N,EAAK,GACpCjgB,KAAKypE,cACLzpE,KAAK62B,MAAQ,EACb72B,KAAK0pE,cAAgB1pE,KAAK62B,MAG1B72B,KAAK2pE,UAAY,KACjB3pE,KAAK4pE,UAAY,KAGjB5pE,KAAK6pE,gBACHtoD,IAAO,SAAUnY,EAAOkmB,GACtBvsB,EAAQ+mE,UAAUx6C,EAAOvtB,OACzBgB,EAAQ+L,SAEVwhB,OAAU,SAAUlnB,EAAOkmB,GACzBvsB,EAAQgnE,aAAaz6C,EAAOvtB,OAC5BgB,EAAQ+L,SAEV6iB,OAAU,SAAUvoB,EAAOkmB,GACzBvsB,EAAQinE,aAAa16C,EAAOvtB,OAC5BgB,EAAQ+L,UAGZ9O,KAAKiqE,gBACH1oD,IAAO,SAAUnY,EAAOkmB,GACtBvsB,EAAQmnE,UAAU56C,EAAOvtB,OACzBgB,EAAQ+L,SAEVwhB,OAAU,SAAUlnB,EAAOkmB,GACzBvsB,EAAQonE,aAAa76C,EAAOvtB,OAC5BgB,EAAQ+L,SAEV6iB,OAAU,SAAUvoB,EAAOkmB,GACzBvsB,EAAQqnE,aAAa96C,EAAOvtB,OAC5BgB,EAAQ+L,UAKZ9O,KAAKqqE,QAAS,EACdrqE,KAAK07C,MAAQv1C,OAGbnG,KAAKmzB,QAAQvH,EAAK5rB,KAAKkoE,UAAUtC,WAAW73D,SAAW/N,KAAKkoE,UAAUhB,mBAAmBn5D,SAGzF/N,KAAKsjE,cAAe,EAC6B,GAA7CtjE,KAAKkoE,UAAUhB,mBAAmBn5D,QACpC/N,KAAKsqE,2BAI2B,GAA5BtqE,KAAKkoE,UAAUN,WACjB5nE,KAAKuqE,YAAW,EAAKvqE,KAAKkoE,UAAUtC,WAAW73D,SAK/C/N,KAAKkoE,UAAUtC,WAAW73D,SAC5B/N,KAAKwqE,sBArUT,GAAI7zC,GAAUz2B,EAAoB,IAC9BswC,EAAStwC,EAAoB,IAC7BmwD,EAAYnwD,EAAoB,IAChCS,EAAOT,EAAoB,GAC3Bk+C,EAAal+C,EAAoB,IACjCW,EAAUX,EAAoB,GAC9BY,EAAWZ,EAAoB,GAC/BmD,EAAYnD,EAAoB,IAChCoD,EAAcpD,EAAoB,IAClC+C,EAAS/C,EAAoB,IAC7BgD,EAAShD,EAAoB,IAC7BiD,EAAOjD,EAAoB,IAC3B8C,EAAO9C,EAAoB,IAC3BkD,EAAQlD,EAAoB,IAC5BuqE,EAAcvqE,EAAoB,IAClCs/C,EAAYt/C,EAAoB,IAChCknD,EAAUlnD,EAAoB,GAGlCA,GAAoB,IAuTpBy2B,EAAQ7zB,EAAQ0R,WAShB1R,EAAQ0R,UAAUk2D,eAAiB,WAIjC,IAAK,GAHDC,GAAUn9C,SAASo9C,qBAAsB,UAGpCzlE,EAAI,EAAGA,EAAIwlE,EAAQrlE,OAAQH,IAAK,CACvC,GAAIkuC,GAAMs3B,EAAQxlE,GAAGkuC,IACjBnvC,EAAQmvC,GAAO,qBAAqBjvC,KAAKivC,EAC7C,IAAInvC,EAEF,MAAOmvC,GAAInnC,UAAU,EAAGmnC,EAAI/tC,OAASpB,EAAM,GAAGoB,QAIlD,MAAO,OAQTxC,EAAQ0R,UAAUq2D,UAAY,WAC5B,GAAsD/2B,GAAlDg3B,EAAO,IAAKC,EAAO,KAAMC,EAAO,IAAKC,EAAO,IAChD,KAAK,GAAIC,KAAUlrE,MAAK4jE,MAClB5jE,KAAK4jE,MAAMn+D,eAAeylE,KAC5Bp3B,EAAO9zC,KAAK4jE,MAAMsH,GACdF,EAAQl3B,EAAM,IAAIk3B,EAAOl3B,EAAK/lB,GAC9Bk9C,EAAQn3B,EAAM,IAAIm3B,EAAOn3B,EAAK/lB,GAC9B+8C,EAAQh3B,EAAM,IAAIg3B,EAAOh3B,EAAK7zB,GAC9B8qD,EAAQj3B,EAAM,IAAIi3B,EAAOj3B,EAAK7zB,GAMtC,OAHY,MAAR+qD,GAAuB,MAARC,GAAwB,KAARH,GAAuB,MAARC,IAChDD,EAAO,EAAGC,EAAO,EAAGC,EAAO,EAAGC,EAAO,IAE/BD,KAAMA,EAAMC,KAAMA,EAAMH,KAAMA,EAAMC,KAAMA,IASpDjoE,EAAQ0R,UAAU22D,YAAc,SAASj9D,GACvC,OAAQ6f,EAAI,IAAO7f,EAAM+8D,KAAO/8D,EAAM88D,MAC9B/qD,EAAI,IAAO/R,EAAM68D,KAAO78D,EAAM48D,QASxChoE,EAAQ0R,UAAU42D,eAAiB,SAASl9D,GAC1C,GAAI62B,GAAS/kC,KAAKmrE,YAAYj9D,EAE9B62B,GAAOhX,GAAK/tB,KAAK62B,MACjBkO,EAAO9kB,GAAKjgB,KAAK62B,MACjBkO,EAAOhX,GAAK,GAAM/tB,KAAKg5B,MAAMC,OAAOC,YACpC6L,EAAO9kB,GAAK,GAAMjgB,KAAKg5B,MAAMC,OAAOoF,aAEpCr+B,KAAKgpE,iBAAiBjkC,EAAOhX,GAAGgX,EAAO9kB,IAUzCnd,EAAQ0R,UAAU+1D,WAAa,SAASc,EAAaC,GAC/BnlE,SAAhBklE,IACFA,GAAc,GAEKllE,SAAjBmlE,IACFA,GAAe,EAGjB,IACIC,GADAr9D,EAAQlO,KAAK6qE,WAGjB,IAAmB,GAAfQ,EAAqB,CACvB,GAAIG,GAAgBxrE,KAAKqpE,YAAY/jE,MAIjCimE,GAH+B,GAA/BvrE,KAAKkoE,UAAUZ,aACwB,GAArCtnE,KAAKkoE,UAAUtC,WAAW73D,SAC5By9D,GAAiBxrE,KAAKkoE,UAAUtC,WAAWC,gBAC/B,UAAY2F,EAAgB,WAAa,SAGzC,QAAUA,EAAgB,QAAU,SAIT,GAArCxrE,KAAKkoE,UAAUtC,WAAW73D,SAC1By9D,GAAiBxrE,KAAKkoE,UAAUtC,WAAWC,gBACjC,YAAc2F,EAAgB,YAAc,cAG5C,YAAcA,EAAgB,aAAe,SAK7D,IAAIjpD,GAAS1d,KAAKwG,IAAIrL,KAAKg5B,MAAMC,OAAOC,YAAc,IAAKl5B,KAAKg5B,MAAMC,OAAOoF,aAAe,IAC5FktC,IAAahpD,MAEV,CACH,GAAIg9C,GAA4D,KAA/C16D,KAAK+O,IAAI1F,EAAM88D,MAAQnmE,KAAK+O,IAAI1F,EAAM+8D,OACnDQ,EAA4D,KAA/C5mE,KAAK+O,IAAI1F,EAAM48D,MAAQjmE,KAAK+O,IAAI1F,EAAM68D,OAEnDW,EAAa1rE,KAAKg5B,MAAMC,OAAOC,YAAcqmC,EAC7CoM,EAAa3rE,KAAKg5B,MAAMC,OAAOoF,aAAeotC,CAElDF,GAA2BI,GAAdD,EAA4BA,EAAaC,EAGpDJ,EAAY,IACdA,EAAY,GAIdvrE,KAAK42B,UAAU20C,GACfvrE,KAAKorE,eAAel9D,GACA,GAAhBo9D,IACFtrE,KAAKqqE,QAAS,EACdrqE,KAAK8O,UASThM,EAAQ0R,UAAUo3D,qBAAuB,WACvC5rE,KAAK6rE,qBACL,KAAK,GAAIC,KAAO9rE,MAAK4jE,MACf5jE,KAAK4jE,MAAMn+D,eAAeqmE,IAC5B9rE,KAAKqpE,YAAYvhE,KAAKgkE,IAiB5BhpE,EAAQ0R,UAAU2e,QAAU,SAASvH,EAAM0/C,GAKzC,GAJqBnlE,SAAjBmlE,IACFA,GAAe,GAGb1/C,GAAQA,EAAK+c,MAAQ/c,EAAKg4C,OAASh4C,EAAK24C,OAC1C,KAAM,IAAI3wC,aAAY,iGAQxB,IAHA5zB,KAAK02B,WAAW9K,GAAQA,EAAK9d,SAGzB8d,GAAQA,EAAK+c,KAEf,GAAG/c,GAAQA,EAAK+c,IAAK,CACnB,GAAIojC,GAAU1oE,EAAU2oE,WAAWpgD,EAAK+c,IAExC,YADA3oC,MAAKmzB,QAAQ44C,QAIZ,IAAIngD,GAAQA,EAAKqgD,OAEpB,GAAGrgD,GAAQA,EAAKqgD,MAAO,CACrB,GAAIC,GAAY5oE,EAAY6oE,WAAWvgD,EAAKqgD,MAE5C,YADAjsE,MAAKmzB,QAAQ+4C,QAKflsE,MAAKosE,UAAUxgD,GAAQA,EAAKg4C,OAC5B5jE,KAAKqsE,UAAUzgD,GAAQA,EAAK24C,MAI9B,IADAvkE,KAAKssE,oBACAhB,EAEH,GAAItrE,KAAKkoE,UAAUN,UAAW,CAC5B,GAAIj4C,GAAK3vB,IACTmnC,YAAW,WAAYxX,EAAG48C,aAAc58C,EAAG7gB,SAAU,OAGrD9O,MAAK8O,SASXhM,EAAQ0R,UAAUkiB,WAAa,SAAU5oB,GACvC,GAAIA,EAAS,CACX,GAAItI,GAEA+H,GAAU,QAAQ,QAAQ,eAAe,qBAAqB,aAAa,aAAa,WAAW,mBACrG,QAAQ,SAAS,aAAa,YAAY,WAAW,aAMvD,IAJA5M,EAAK0F,uBAAuBkH,EAAOvN,KAAKkoE,UAAWp6D,GACnDnN,EAAK0F,wBAAwB,SAASrG,KAAKkoE,UAAUtE,MAAO91D,EAAQ81D,OACpEjjE,EAAK0F,wBAAwB,QAAQ,UAAUrG,KAAKkoE,UAAU3D,MAAOz2D,EAAQy2D,OAEzEz2D,EAAQm3D,UACVtkE,EAAKiN,aAAa5N,KAAKkoE,UAAUjD,QAASn3D,EAAQm3D,QAAQ,aAC1DtkE,EAAKiN,aAAa5N,KAAKkoE,UAAUjD,QAASn3D,EAAQm3D,QAAQ,aAEtDn3D,EAAQm3D,QAAQU,uBAAuB,CACzC3lE,KAAKkoE,UAAUhB,mBAAmBn5D,SAAU,EAC5C/N,KAAKkoE,UAAUjD,QAAQU,sBAAsB53D,SAAU,EACvD/N,KAAKkoE,UAAUjD,QAAQC,UAAUn3D,SAAU,CAC3C,KAAKvI,IAAQsI,GAAQm3D,QAAQU,sBACvB73D,EAAQm3D,QAAQU,sBAAsBlgE,eAAeD,KACvDxF,KAAKkoE,UAAUjD,QAAQU,sBAAsBngE,GAAQsI,EAAQm3D,QAAQU,sBAAsBngE,IAiDnG,GA3CIsI,EAAQo6C,QAAQloD,KAAKujE,iBAAiBhiD,IAAMzT,EAAQo6C,OACpDp6C,EAAQ0+D,SAASxsE,KAAKujE,iBAAiBC,KAAO11D,EAAQ0+D,QACtD1+D,EAAQ2+D,aAAazsE,KAAKujE,iBAAiBE,SAAW31D,EAAQ2+D,YAC9D3+D,EAAQ4+D,YAAY1sE,KAAKujE,iBAAiBG,QAAU51D,EAAQ4+D,WAC5D5+D,EAAQ6+D,WAAW3sE,KAAKujE,iBAAiBI,IAAM71D,EAAQ6+D,UAE3DhsE,EAAKiN,aAAa5N,KAAKkoE,UAAWp6D,EAAQ,gBAC1CnN,EAAKiN,aAAa5N,KAAKkoE,UAAWp6D,EAAQ,sBAC1CnN,EAAKiN,aAAa5N,KAAKkoE,UAAWp6D,EAAQ,cAC1CnN,EAAKiN,aAAa5N,KAAKkoE,UAAWp6D,EAAQ,cAC1CnN,EAAKiN,aAAa5N,KAAKkoE,UAAWp6D,EAAQ,YAC1CnN,EAAKiN,aAAa5N,KAAKkoE,UAAWp6D,EAAQ,oBAGtCA,EAAQk5D,mBACVhnE,KAAK4sE,SAAW5sE,KAAKkoE,UAAUlB,iBAAiBC,kBAK9Cn5D,EAAQy2D,QACkBp+D,SAAxB2H,EAAQy2D,MAAM95D,QACZ9J,EAAKmD,SAASgK,EAAQy2D,MAAM95D,QAC9BzK,KAAKkoE,UAAU3D,MAAM95D,SACrBzK,KAAKkoE,UAAU3D,MAAM95D,MAAMA,MAAQqD,EAAQy2D,MAAM95D,MACjDzK,KAAKkoE,UAAU3D,MAAM95D,MAAMmB,UAAYkC,EAAQy2D,MAAM95D,MACrDzK,KAAKkoE,UAAU3D,MAAM95D,MAAMoB,MAAQiC,EAAQy2D,MAAM95D,QAGftE,SAA9B2H,EAAQy2D,MAAM95D,MAAMA,QAA0BzK,KAAKkoE,UAAU3D,MAAM95D,MAAMA,MAAQqD,EAAQy2D,MAAM95D,MAAMA,OACnEtE,SAAlC2H,EAAQy2D,MAAM95D,MAAMmB,YAA0B5L,KAAKkoE,UAAU3D,MAAM95D,MAAMmB,UAAYkC,EAAQy2D,MAAM95D,MAAMmB,WAC3EzF,SAA9B2H,EAAQy2D,MAAM95D,MAAMoB,QAA0B7L,KAAKkoE,UAAU3D,MAAM95D,MAAMoB,MAAQiC,EAAQy2D,MAAM95D,MAAMoB,SAIxGiC,EAAQy2D,MAAMJ,WACWh+D,SAAxB2H,EAAQy2D,MAAM95D,QACZ9J,EAAKmD,SAASgK,EAAQy2D,MAAM95D,OAAmBzK,KAAKkoE,UAAU3D,MAAMJ,UAAYr2D,EAAQy2D,MAAM95D,MAC3DtE,SAA9B2H,EAAQy2D,MAAM95D,MAAMA,QAAsBzK,KAAKkoE,UAAU3D,MAAMJ,UAAYr2D,EAAQy2D,MAAM95D,MAAMA,SAK1GqD,EAAQ81D,OACN91D,EAAQ81D,MAAMn5D,MAAO,CACvB,GAAIoiE,GAAclsE,EAAK6J,WAAWsD,EAAQ81D,MAAMn5D,MAChDzK,MAAKkoE,UAAUtE,MAAMn5D,MAAMiB,WAAamhE,EAAYnhE,WACpD1L,KAAKkoE,UAAUtE,MAAMn5D,MAAMkB,OAASkhE,EAAYlhE,OAChD3L,KAAKkoE,UAAUtE,MAAMn5D,MAAMmB,UAAUF,WAAamhE,EAAYjhE,UAAUF,WACxE1L,KAAKkoE,UAAUtE,MAAMn5D,MAAMmB,UAAUD,OAASkhE,EAAYjhE,UAAUD,OACpE3L,KAAKkoE,UAAUtE,MAAMn5D,MAAMoB,MAAMH,WAAamhE,EAAYhhE,MAAMH,WAChE1L,KAAKkoE,UAAUtE,MAAMn5D,MAAMoB,MAAMF,OAASkhE,EAAYhhE,MAAMF,OAGhE,GAAImC,EAAQ8hC,OACV,IAAK,GAAIk9B,KAAah/D,GAAQ8hC,OAC5B,GAAI9hC,EAAQ8hC,OAAOnqC,eAAeqnE,GAAY,CAC5C,GAAI9+C,GAAQlgB,EAAQ8hC,OAAOk9B,EAC3B9sE,MAAK4vC,OAAOruB,IAAIurD,EAAW9+C,GAKjC,GAAIlgB,EAAQ4xB,QAAS,CACnB,IAAKl6B,IAAQsI,GAAQ4xB,QACf5xB,EAAQ4xB,QAAQj6B,eAAeD,KACjCxF,KAAKkoE,UAAUxoC,QAAQl6B,GAAQsI,EAAQ4xB,QAAQl6B,GAG/CsI,GAAQ4xB,QAAQj1B,QAClBzK,KAAKkoE,UAAUxoC,QAAQj1B,MAAQ9J,EAAK6J,WAAWsD,EAAQ4xB,QAAQj1B,QAiBnE,GAbI,cAAgBqD,KACdA,EAAQ2yC,YACVzgD,KAAK0gD,UAAY,GAAIlB,GAAUx/C,KAAKg5B,OACpCh5B,KAAK0gD,UAAU3xB,GAAG,SAAU/uB,KAAK+sE,gBAAgB1+B,KAAKruC,QAGlDA,KAAK0gD,YACP1gD,KAAK0gD,UAAUvB,gBACRn/C,MAAK0gD,YAKd5yC,EAAQ4rD,OACV,KAAM,IAAIl2D,OAAM,8EAMpBxD,KAAK2oE,qBAEL3oE,KAAKgtE,0BAELhtE,KAAKitE,0BAELjtE,KAAKktE,yBAILltE,KAAK+sE,kBACL/sE,KAAKm+B,QAAQn+B,KAAKkoE,UAAU35C,MAAOvuB,KAAKkoE,UAAU15C,QAClDxuB,KAAKqqE,QAAS,EACdrqE,KAAK8O,SAWPhM,EAAQ0R,UAAUy5B,QAAU,WAE1B,KAAOjuC,KAAK6zB,iBAAiBsJ,iBAC3Bn9B,KAAK6zB,iBAAiBzG,YAAYptB,KAAK6zB,iBAAiBuJ,WAY1D,IATAp9B,KAAKg5B,MAAQxL,SAASK,cAAc,OACpC7tB,KAAKg5B,MAAMrxB,UAAY,oBACvB3H,KAAKg5B,MAAM7K,MAAMkP,SAAW,WAC5Br9B,KAAKg5B,MAAM7K,MAAMte,SAAW,SAG5B7P,KAAKg5B,MAAMC,OAASzL,SAASK,cAAe,UAC5C7tB,KAAKg5B,MAAMC,OAAO9K,MAAMkP,SAAW,WACnCr9B,KAAKg5B,MAAMtL,YAAY1tB,KAAKg5B,MAAMC,SAC7Bj5B,KAAKg5B,MAAMC,OAAOqH,WAAY,CACjC,GAAIhD,GAAW9P,SAASK,cAAe,MACvCyP,GAASnP,MAAM1jB,MAAQ,MACvB6yB,EAASnP,MAAMoP,WAAc,OAC7BD,EAASnP,MAAMqP,QAAW,OAC1BF,EAASG,UAAa,mDACtBz9B,KAAKg5B,MAAMC,OAAOvL,YAAY4P,GAGhC,GAAI3N,GAAK3vB,IACTA,MAAK0nD,QACL1nD,KAAKmtE,SACLntE,KAAK0D,OAAS8sC,EAAOxwC,KAAKg5B,MAAMC,QAC9BmnB,iBAAiB,IAEnBpgD,KAAK0D,OAAOqrB,GAAG,MAAaY,EAAGy9C,OAAO/+B,KAAK1e,IAC3C3vB,KAAK0D,OAAOqrB,GAAG,YAAaY,EAAG09C,aAAah/B,KAAK1e,IACjD3vB,KAAK0D,OAAOqrB,GAAG,OAAaY,EAAGmuB,QAAQzP,KAAK1e,IAC5C3vB,KAAK0D,OAAOqrB,GAAG,QAAaY,EAAGsuB,SAAS5P,KAAK1e,IAC7C3vB,KAAK0D,OAAOqrB,GAAG,QAAaY,EAAGquB,SAAS3P,KAAK1e,IAC7C3vB,KAAK0D,OAAOqrB,GAAG,YAAaY,EAAGguB,aAAatP,KAAK1e,IACjD3vB,KAAK0D,OAAOqrB,GAAG,OAAaY,EAAGiuB,QAAQvP,KAAK1e,IAC5C3vB,KAAK0D,OAAOqrB,GAAG,UAAaY,EAAGkuB,WAAWxP,KAAK1e,IAC/C3vB,KAAK0D,OAAOqrB,GAAG,UAAaY,EAAG29C,WAAWj/B,KAAK1e,IAC/C3vB,KAAK0D,OAAOqrB,GAAG,aAAaY,EAAGouB,cAAc1P,KAAK1e,IAClD3vB,KAAK0D,OAAOqrB,GAAG,iBAAiBY,EAAGouB,cAAc1P,KAAK1e,IACtD3vB,KAAK0D,OAAOqrB,GAAG,YAAaY,EAAG49C,kBAAkBl/B,KAAK1e,IAGtD3vB,KAAK6zB,iBAAiBnG,YAAY1tB,KAAKg5B,QASzCl2B,EAAQ0R,UAAUu4D,gBAAkB,WAClC,GAAIp9C,GAAK3vB,IACTA,MAAKqwD,UAAYA,EAEjBrwD,KAAKqwD,UAAUzZ,QAEX52C,KAAKkoE,UAAUpB,SAAS/4D,SAAW/N,KAAKsgD,aAC1CtgD,KAAKqwD,UAAUhiB,KAAK,KAAQruC,KAAKwtE,QAAQn/B,KAAK1e,GAAQ,WACtD3vB,KAAKqwD,UAAUhiB,KAAK,KAAQruC,KAAKytE,aAAap/B,KAAK1e,GAAK,SACxD3vB,KAAKqwD,UAAUhiB,KAAK,OAAQruC,KAAK0tE,UAAUr/B,KAAK1e,GAAM,WACtD3vB,KAAKqwD,UAAUhiB,KAAK,OAAQruC,KAAKytE,aAAap/B,KAAK1e,GAAK,SACxD3vB,KAAKqwD,UAAUhiB,KAAK,OAAQruC,KAAK2tE,UAAUt/B,KAAK1e,GAAM,WACtD3vB,KAAKqwD,UAAUhiB,KAAK,OAAQruC,KAAK4tE,aAAav/B,KAAK1e,GAAK,SACxD3vB,KAAKqwD,UAAUhiB,KAAK,QAAQruC,KAAK6tE,WAAWx/B,KAAK1e,GAAK,WACtD3vB,KAAKqwD,UAAUhiB,KAAK,QAAQruC,KAAK4tE,aAAav/B,KAAK1e,GAAK,SACxD3vB,KAAKqwD,UAAUhiB,KAAK,IAAQruC,KAAK8tE,QAAQz/B,KAAK1e,GAAQ,WACtD3vB,KAAKqwD,UAAUhiB,KAAK,IAAQruC,KAAK+tE,UAAU1/B,KAAK1e,GAAQ,SACxD3vB,KAAKqwD,UAAUhiB,KAAK,IAAQruC,KAAKguE,SAAS3/B,KAAK1e,GAAO,WACtD3vB,KAAKqwD,UAAUhiB,KAAK,IAAQruC,KAAK+tE,UAAU1/B,KAAK1e,GAAQ,SACxD3vB,KAAKqwD,UAAUhiB,KAAK,IAAQruC,KAAK8tE,QAAQz/B,KAAK1e,GAAQ,WACtD3vB,KAAKqwD,UAAUhiB,KAAK,IAAQruC,KAAK+tE,UAAU1/B,KAAK1e,GAAQ,SACxD3vB,KAAKqwD,UAAUhiB,KAAK,IAAQruC,KAAKguE,SAAS3/B,KAAK1e,GAAO,WACtD3vB,KAAKqwD,UAAUhiB,KAAK,IAAQruC,KAAK+tE,UAAU1/B,KAAK1e,GAAQ,SACxD3vB,KAAKqwD,UAAUhiB,KAAK,SAASruC,KAAK8tE,QAAQz/B,KAAK1e,GAAO,WACtD3vB,KAAKqwD,UAAUhiB,KAAK,SAASruC,KAAK+tE,UAAU1/B,KAAK1e,GAAO,SACxD3vB,KAAKqwD,UAAUhiB,KAAK,WAAWruC,KAAKguE,SAAS3/B,KAAK1e,GAAI,WACtD3vB,KAAKqwD,UAAUhiB,KAAK,WAAWruC,KAAK+tE,UAAU1/B,KAAK1e,GAAK,UAGX,GAA3C3vB,KAAKkoE,UAAUlB,iBAAiBj5D,UAClC/N,KAAKqwD,UAAUhiB,KAAK,SAASruC,KAAKiuE,sBAAsB5/B,KAAK1e,IAC7D3vB,KAAKqwD,UAAUhiB,KAAK,MAAMruC,KAAKkuE,gBAAgB7/B,KAAK1e,MAUxD7sB,EAAQ0R,UAAU25D,YAAc,SAAU/5B,GACxC,OACErmB,EAAGqmB,EAAMF,MAAQvzC,EAAKsG,gBAAgBjH,KAAKg5B,MAAMC,QACjDhZ,EAAGm0B,EAAMD,MAAQxzC,EAAK4G,eAAevH,KAAKg5B,MAAMC,UASpDn2B,EAAQ0R,UAAUwpC,SAAW,SAAU50C,GACrCpJ,KAAK0nD,KAAK1P,QAAUh4C,KAAKmuE,YAAY/kE,EAAM2nC,QAAQhM,QACnD/kC,KAAK0nD,KAAK0mB,SAAU,EACpBpuE,KAAKmtE,MAAMt2C,MAAQ72B,KAAKquE,YAExBruE,KAAKsuE,aAAatuE,KAAK0nD,KAAK1P,UAO9Bl1C,EAAQ0R,UAAUmpC,aAAe,WAC/B39C,KAAKuuE,oBAUPzrE,EAAQ0R,UAAU+5D,iBAAmB,WACnC,GAAI7mB,GAAO1nD,KAAK0nD,KACZ5T,EAAO9zC,KAAKwuE,WAAW9mB,EAAK1P,QAQhC,IALA0P,EAAKC,UAAW,EAChBD,EAAKuB,aACLvB,EAAKtwB,YAAcp3B,KAAKyuE,kBACxB/mB,EAAKwjB,OAAS,KAEF,MAARp3B,EAAc,CAChB4T,EAAKwjB,OAASp3B,EAAKzzC,GAEdyzC,EAAK46B,cACR1uE,KAAK2uE,cAAc76B,GAAK,EAI1B,KAAK,GAAI86B,KAAY5uE,MAAK6uE,aAAajL,MACrC,GAAI5jE,KAAK6uE,aAAajL,MAAMn+D,eAAempE,GAAW,CACpD,GAAIhrE,GAAS5D,KAAK6uE,aAAajL,MAAMgL,GACjCzjE,GACF9K,GAAIuD,EAAOvD,GACXyzC,KAAMlwC,EAGNmqB,EAAGnqB,EAAOmqB,EACV9N,EAAGrc,EAAOqc,EACV6uD,OAAQlrE,EAAOkrE,OACfC,OAAQnrE,EAAOmrE,OAGjBnrE,GAAOkrE,QAAS,EAChBlrE,EAAOmrE,QAAS,EAEhBrnB,EAAKuB,UAAUnhD,KAAKqD,MAW5BrI,EAAQ0R,UAAUopC,QAAU,SAAUx0C,GACpCpJ,KAAKgvE,cAAc5lE,IAUrBtG,EAAQ0R,UAAUw6D,cAAgB,SAAS5lE,GACzC,IAAIpJ,KAAK0nD,KAAK0mB,QAAd,CAIA,GAAIp2B,GAAUh4C,KAAKmuE,YAAY/kE,EAAM2nC,QAAQhM,QAEzCpV,EAAK3vB,KACL0nD,EAAO1nD,KAAK0nD,KACZuB,EAAYvB,EAAKuB,SACrB,IAAIA,GAAaA,EAAU3jD,QAAsC,GAA5BtF,KAAKkoE,UAAUH,UAAmB,CAErE,GAAIxzB,GAASyD,EAAQjqB,EAAI25B,EAAK1P,QAAQjqB,EAClCymB,EAASwD,EAAQ/3B,EAAIynC,EAAK1P,QAAQ/3B,CAGtCgpC,GAAU9gD,QAAQ,SAAUgD,GAC1B,GAAI2oC,GAAO3oC,EAAE2oC,IAER3oC,GAAE2jE,SACLh7B,EAAK/lB,EAAI4B,EAAGs/C,qBAAqBt/C,EAAGu/C,qBAAqB/jE,EAAE4iB,GAAKwmB,IAG7DppC,EAAE4jE,SACLj7B,EAAK7zB,EAAI0P,EAAGw/C,qBAAqBx/C,EAAGy/C,qBAAqBjkE,EAAE8U,GAAKu0B,MAM/Dx0C,KAAKqqE,SACRrqE,KAAKqqE,QAAS,EACdrqE,KAAK8O,aAIP,IAAkC,GAA9B9O,KAAKkoE,UAAUJ,YAAqB,CAEtC,GAAI5hC,GAAQ8R,EAAQjqB,EAAI/tB,KAAK0nD,KAAK1P,QAAQjqB,EACtCoY,EAAQ6R,EAAQ/3B,EAAIjgB,KAAK0nD,KAAK1P,QAAQ/3B,CAE1CjgB,MAAKgpE,gBACHhpE,KAAK0nD,KAAKtwB,YAAYrJ,EAAImY,EAC1BlmC,KAAK0nD,KAAKtwB,YAAYnX,EAAIkmB,GAE5BnmC,KAAKuoE,aAWXzlE,EAAQ0R,UAAUqpC,WAAa,WAC7B79C,KAAK0nD,KAAKC,UAAW,CACrB,IAAIsB,GAAYjpD,KAAK0nD,KAAKuB,SACtBA,IAAaA,EAAU3jD,QACzB2jD,EAAU9gD,QAAQ,SAAUgD,GAE1BA,EAAE2oC,KAAKg7B,OAAS3jE,EAAE2jE,OAClB3jE,EAAE2oC,KAAKi7B,OAAS5jE,EAAE4jE,SAEpB/uE,KAAKqqE,QAAS,EACdrqE,KAAK8O,SAGL9O,KAAKuoE,WASTzlE,EAAQ0R,UAAU44D,OAAS,SAAUhkE,GACnC,GAAI4uC,GAAUh4C,KAAKmuE,YAAY/kE,EAAM2nC,QAAQhM,OAC7C/kC,MAAKwpE,gBAAkBxxB,EACvBh4C,KAAKqvE,WAAWr3B,IASlBl1C,EAAQ0R,UAAU64D,aAAe,SAAUjkE,GACzC,GAAI4uC,GAAUh4C,KAAKmuE,YAAY/kE,EAAM2nC,QAAQhM,OAC7C/kC,MAAKsvE,iBAAiBt3B,IAQxBl1C,EAAQ0R,UAAUspC,QAAU,SAAU10C,GACpC,GAAI4uC,GAAUh4C,KAAKmuE,YAAY/kE,EAAM2nC,QAAQhM,OAC7C/kC,MAAKwpE,gBAAkBxxB,EACvBh4C,KAAKuvE,cAAcv3B,IAQrBl1C,EAAQ0R,UAAU84D,WAAa,SAAUlkE,GACvC,GAAI4uC,GAAUh4C,KAAKmuE,YAAY/kE,EAAM2nC,QAAQhM,OAC7C/kC,MAAKwvE,iBAAiBx3B,IAQxBl1C,EAAQ0R,UAAUypC,SAAW,SAAU70C,GACrC,GAAI4uC,GAAUh4C,KAAKmuE,YAAY/kE,EAAM2nC,QAAQhM,OAE7C/kC,MAAK0nD,KAAK0mB,SAAU,EACd,SAAWpuE,MAAKmtE,QACpBntE,KAAKmtE,MAAMt2C,MAAQ,EAIrB,IAAIA,GAAQ72B,KAAKmtE,MAAMt2C,MAAQztB,EAAM2nC,QAAQla,KAC7C72B,MAAKyvE,MAAM54C,EAAOmhB,IAUpBl1C,EAAQ0R,UAAUi7D,MAAQ,SAAS54C,EAAOmhB,GACxC,GAA+B,GAA3Bh4C,KAAKkoE,UAAU1qB,SAAkB,CACnC,GAAIkyB,GAAW1vE,KAAKquE,WACR,MAARx3C,IACFA,EAAQ,MAENA,EAAQ,KACVA,EAAQ,GAGV,IAAI84C,GAAsB,IACRxpE,UAAdnG,KAAK0nD,MACmB,GAAtB1nD,KAAK0nD,KAAKC,WACZgoB,EAAsB3vE,KAAK4vE,YAAY5vE,KAAK0nD,KAAK1P,SAIrD,IAAI5gB,GAAcp3B,KAAKyuE,kBAEnBoB,EAAYh5C,EAAQ64C,EACpBI,GAAM,EAAID,GAAa73B,EAAQjqB,EAAIqJ,EAAYrJ,EAAI8hD,EACnDE,GAAM,EAAIF,GAAa73B,EAAQ/3B,EAAImX,EAAYnX,EAAI4vD,CASvD,IAPA7vE,KAAKypE,YAAc17C,EAAM/tB,KAAKivE,qBAAqBj3B,EAAQjqB,GACxC9N,EAAMjgB,KAAKmvE,qBAAqBn3B,EAAQ/3B,IAE3DjgB,KAAK42B,UAAUC,GACf72B,KAAKgpE,gBAAgB8G,EAAIC,GACzB/vE,KAAKgwE,wBAEsB,MAAvBL,EAA6B,CAC/B,GAAIM,GAAuBjwE,KAAKkwE,YAAYP,EAC5C3vE,MAAK0nD,KAAK1P,QAAQjqB,EAAIkiD,EAAqBliD,EAC3C/tB,KAAK0nD,KAAK1P,QAAQ/3B,EAAIgwD,EAAqBhwD,EAY7C,MATAjgB,MAAKuoE,UAEU1xC,EAAX64C,EACF1vE,KAAKymC,KAAK,QAASyO,UAAU,MAG7Bl1C,KAAKymC,KAAK,QAASyO,UAAU,MAGxBre,IAYX/zB,EAAQ0R,UAAUupC,cAAgB,SAAS30C,GAEzC,GAAIo+B,GAAQ,CAYZ,IAXIp+B,EAAMq+B,WACRD,EAAQp+B,EAAMq+B,WAAW,IAChBr+B,EAAMs+B,SAGfF,GAASp+B,EAAMs+B,OAAO,GAMpBF,EAAO,CAGT,GAAI3Q,GAAQ72B,KAAKquE,YACbrvB,EAAOxX,EAAQ,EACP,GAARA,IACFwX,GAAe,EAAIA,GAErBnoB,GAAU,EAAImoB,CAGd,IAAIjO,GAAUqN,EAAWS,YAAY7+C,KAAMoJ,GACvC4uC,EAAUh4C,KAAKmuE,YAAYp9B,EAAQhM,OAGvC/kC,MAAKyvE,MAAM54C,EAAOmhB,GAIpB5uC,EAAMD,kBASRrG,EAAQ0R,UAAU+4D,kBAAoB,SAAUnkE,GAC9C,GAAI2nC,GAAUqN,EAAWS,YAAY7+C,KAAMoJ,GACvC4uC,EAAUh4C,KAAKmuE,YAAYp9B,EAAQhM,OAGnC/kC,MAAKmwE,UACPnwE,KAAKowE,gBAAgBp4B,EAKvB,IAAIroB,GAAK3vB,KACLqwE,EAAY,WACd1gD,EAAG2gD,gBAAgBt4B,GAarB,IAXIh4C,KAAKuwE,YACPpkC,cAAcnsC,KAAKuwE,YAEhBvwE,KAAK0nD,KAAKC,WACb3nD,KAAKuwE,WAAappC,WAAWkpC,EAAWrwE,KAAKkoE,UAAUxoC,QAAQgH,QAOrC,GAAxB1mC,KAAKkoE,UAAUr8D,MAAe,CAEhC,IAAK,GAAI2kE,KAAUxwE,MAAKmoE,SAAS5D,MAC3BvkE,KAAKmoE,SAAS5D,MAAM9+D,eAAe+qE,KACrCxwE,KAAKmoE,SAAS5D,MAAMiM,GAAQ3kE,OAAQ,QAC7B7L,MAAKmoE,SAAS5D,MAAMiM,GAK/B,IAAI9mD,GAAM1pB,KAAKwuE,WAAWx2B,EACf,OAAPtuB,IACFA,EAAM1pB,KAAKywE,WAAWz4B,IAEb,MAAPtuB,GACF1pB,KAAK0wE,aAAahnD,EAIpB,KAAK,GAAIwhD,KAAUlrE,MAAKmoE,SAASvE,MAC3B5jE,KAAKmoE,SAASvE,MAAMn+D,eAAeylE,KACjCxhD,YAAevmB,IAAQumB,EAAIrpB,IAAM6qE,GAAUxhD,YAAe1mB,IAAe,MAAP0mB,KACpE1pB,KAAK2wE,YAAY3wE,KAAKmoE,SAASvE,MAAMsH,UAC9BlrE,MAAKmoE,SAASvE,MAAMsH,GAIjClrE,MAAKm7B,WAYTr4B,EAAQ0R,UAAU87D,gBAAkB,SAAUt4B,GAC5C,GAOI33C,GAPAqpB,GACFtiB,KAAQpH,KAAKivE,qBAAqBj3B,EAAQjqB,GAC1CvmB,IAAQxH,KAAKmvE,qBAAqBn3B,EAAQ/3B,GAC1C0gB,MAAQ3gC,KAAKivE,qBAAqBj3B,EAAQjqB,GAC1CgP,OAAQ/8B,KAAKmvE,qBAAqBn3B,EAAQ/3B,IAIxC2wD,EAAgB5wE,KAAKmwE,QAEzB,IAAqBhqE,QAAjBnG,KAAKmwE,SAAuB,CAE9B,GAAIvM,GAAQ5jE,KAAK4jE,KACjB,KAAKvjE,IAAMujE,GACT,GAAIA,EAAMn+D,eAAepF,GAAK,CAC5B,GAAIyzC,GAAO8vB,EAAMvjE,EACjB,IAAwB8F,SAApB2tC,EAAK+8B,YAA4B/8B,EAAKg9B,kBAAkBpnD,GAAM,CAChE1pB,KAAKmwE,SAAWr8B,CAChB,SAMR,GAAsB3tC,SAAlBnG,KAAKmwE,SAAwB,CAE/B,GAAI5L,GAAQvkE,KAAKukE,KACjB,KAAKlkE,IAAMkkE,GACT,GAAIA,EAAM9+D,eAAepF,GAAK,CAC5B,GAAI0wE,GAAOxM,EAAMlkE,EACjB,IAAI0wE,EAAKC,WAAkC7qE,SAApB4qE,EAAKF,YACxBE,EAAKD,kBAAkBpnD,GAAM,CAC/B1pB,KAAKmwE,SAAWY,CAChB,SAMR,GAAI/wE,KAAKmwE,UAEP,GAAInwE,KAAKmwE,UAAYS,EAAe,CAClC,GAAIjhD,GAAK3vB,IACJ2vB,GAAGshD,QACNthD,EAAGshD,MAAQ,GAAI7tE,GAAMusB,EAAGqJ,MAAOrJ,EAAGu4C,UAAUxoC,UAM9C/P,EAAGshD,MAAMC,YAAYl5B,EAAQjqB,EAAI,EAAGiqB,EAAQ/3B,EAAI,GAChD0P,EAAGshD,MAAME,QAAQxhD,EAAGwgD,SAASU,YAC7BlhD,EAAGshD,MAAMnnB,YAIP9pD,MAAKixE,OACPjxE,KAAKixE,MAAMhnB,QAYjBnnD,EAAQ0R,UAAU47D,gBAAkB,SAAUp4B,GACvCh4C,KAAKmwE,UAAanwE,KAAKwuE,WAAWx2B,KACrCh4C,KAAKmwE,SAAWhqE,OACZnG,KAAKixE,OACPjxE,KAAKixE,MAAMhnB,SAajBnnD,EAAQ0R,UAAU2pB,QAAU,SAAS5P,EAAOC,GAC1CxuB,KAAKg5B,MAAM7K,MAAMI,MAAQA,EACzBvuB,KAAKg5B,MAAM7K,MAAMK,OAASA,EAE1BxuB,KAAKg5B,MAAMC,OAAO9K,MAAMI,MAAQ,OAChCvuB,KAAKg5B,MAAMC,OAAO9K,MAAMK,OAAS,OAEjCxuB,KAAKg5B,MAAMC,OAAO1K,MAAQvuB,KAAKg5B,MAAMC,OAAOC,YAC5Cl5B,KAAKg5B,MAAMC,OAAOzK,OAASxuB,KAAKg5B,MAAMC,OAAOoF,aAE7Cr+B,KAAKymC,KAAK,UAAWlY,MAAMvuB,KAAKg5B,MAAMC,OAAO1K,MAAMC,OAAOxuB,KAAKg5B,MAAMC,OAAOzK,UAQ9E1rB,EAAQ0R,UAAU43D,UAAY,SAASxI,GACrC,GAAIwN,GAAepxE,KAAK2pE,SAExB,IAAI/F,YAAiB/iE,IAAW+iE,YAAiB9iE,GAC/Cd,KAAK2pE,UAAY/F,MAEd,IAAIA,YAAiBh+D,OACxB5F,KAAK2pE,UAAY,GAAI9oE,GACrBb,KAAK2pE,UAAUpoD,IAAIqiD,OAEhB,CAAA,GAAKA,EAIR,KAAM,IAAI59D,WAAU,4BAHpBhG,MAAK2pE,UAAY,GAAI9oE,GAgBvB,GAVIuwE,GAEFzwE,EAAKwH,QAAQnI,KAAK6pE,eAAgB,SAAUzhE,EAAUgB,GACpDgoE,EAAaliD,IAAI9lB,EAAOhB,KAK5BpI,KAAK4jE,SAED5jE,KAAK2pE,UAAW,CAElB,GAAIh6C,GAAK3vB,IACTW,GAAKwH,QAAQnI,KAAK6pE,eAAgB,SAAUzhE,EAAUgB,GACpDumB,EAAGg6C,UAAU56C,GAAG3lB,EAAOhB,IAIzB,IAAIsoB,GAAM1wB,KAAK2pE,UAAUv4C,QACzBpxB,MAAK8pE,UAAUp5C,GAEjB1wB,KAAKqxE,oBAQPvuE,EAAQ0R,UAAUs1D,UAAY,SAASp5C,GAErC,IAAK,GADDrwB,GACK8E,EAAI,EAAGC,EAAMsrB,EAAIprB,OAAYF,EAAJD,EAASA,IAAK,CAC9C9E,EAAKqwB,EAAIvrB,EACT,IAAIymB,GAAO5rB,KAAK2pE,UAAUjxD,IAAIrY,GAC1ByzC,EAAO,GAAI3wC,GAAKyoB,EAAM5rB,KAAKqoE,OAAQroE,KAAK4vC,OAAQ5vC,KAAKkoE,UAEzD,IADAloE,KAAK4jE,MAAMvjE,GAAMyzC,IACG,GAAfA,EAAKg7B,QAAkC,GAAfh7B,EAAKi7B,QAAgC,OAAXj7B,EAAK/lB,GAAyB,OAAX+lB,EAAK7zB,GAAa,CAC1F,GAAIskB,GAAS,EAAS7T,EAAIprB,OAAS,GAC/Bq0C,EAAQ,EAAI90C,KAAK4/B,GAAK5/B,KAAKE,QACZ,IAAf+uC,EAAKg7B,SAAkBh7B,EAAK/lB,EAAIwW,EAAS1/B,KAAKqzB,IAAIyhB,IACnC,GAAf7F,EAAKi7B,SAAkBj7B,EAAK7zB,EAAIskB,EAAS1/B,KAAKkzB,IAAI4hB,IAExD35C,KAAKqqE,QAAS,EAEhBrqE,KAAK4rE,uBAC4C,GAA7C5rE,KAAKkoE,UAAUhB,mBAAmBn5D,SAAwC,GAArB/N,KAAKsjE,eAC5DtjE,KAAKsxE,eACLtxE,KAAKsqE,4BAEPtqE,KAAKuxE,0BACLvxE,KAAKwxE,kBACLxxE,KAAKyxE,kBAAkBzxE,KAAK4jE,OAC5B5jE,KAAK0xE,gBAQP5uE,EAAQ0R,UAAUu1D,aAAe,SAASr5C,GAGxC,IAAK,GAFDkzC,GAAQ5jE,KAAK4jE,MACb+F,EAAY3pE,KAAK2pE,UACZxkE,EAAI,EAAGC,EAAMsrB,EAAIprB,OAAYF,EAAJD,EAASA,IAAK,CAC9C,GAAI9E,GAAKqwB,EAAIvrB,GACT2uC,EAAO8vB,EAAMvjE,GACburB,EAAO+9C,EAAUjxD,IAAIrY,EACrByzC,GAEFA,EAAK69B,cAAc/lD,EAAM5rB,KAAKkoE,YAI9Bp0B,EAAO,GAAI3wC,GAAKyuE,WAAY5xE,KAAKqoE,OAAQroE,KAAK4vC,OAAQ5vC,KAAKkoE,WAC3DtE,EAAMvjE,GAAMyzC,GAGhB9zC,KAAKqqE,QAAS,EACmC,GAA7CrqE,KAAKkoE,UAAUhB,mBAAmBn5D,SAAwC,GAArB/N,KAAKsjE,eAC5DtjE,KAAKsxE,eACLtxE,KAAKsqE,4BAEPtqE,KAAK4rE,uBACL5rE,KAAKwxE,kBACLxxE,KAAKyxE,kBAAkB7N,IAQzB9gE,EAAQ0R,UAAUw1D,aAAe,SAASt5C,GAExC,IAAK,GADDkzC,GAAQ5jE,KAAK4jE,MACRz+D,EAAI,EAAGC,EAAMsrB,EAAIprB,OAAYF,EAAJD,EAASA,IAAK,CAC9C,GAAI9E,GAAKqwB,EAAIvrB,SACNy+D,GAAMvjE,GAEfL,KAAK4rE,uBAC4C,GAA7C5rE,KAAKkoE,UAAUhB,mBAAmBn5D,SAAwC,GAArB/N,KAAKsjE,eAC5DtjE,KAAKsxE,eACLtxE,KAAKsqE,4BAEPtqE,KAAKuxE,0BACLvxE,KAAKwxE,kBACLxxE,KAAKqxE,mBACLrxE,KAAKyxE,kBAAkB7N,IASzB9gE,EAAQ0R,UAAU63D,UAAY,SAAS9H,GACrC,GAAIsN,GAAe7xE,KAAK4pE,SAExB,IAAIrF,YAAiB1jE,IAAW0jE,YAAiBzjE,GAC/Cd,KAAK4pE,UAAYrF,MAEd,IAAIA,YAAiB3+D,OACxB5F,KAAK4pE,UAAY,GAAI/oE,GACrBb,KAAK4pE,UAAUroD,IAAIgjD,OAEhB,CAAA,GAAKA,EAIR,KAAM,IAAIv+D,WAAU,4BAHpBhG,MAAK4pE,UAAY,GAAI/oE,GAgBvB,GAVIgxE,GAEFlxE,EAAKwH,QAAQnI,KAAKiqE,eAAgB,SAAU7hE,EAAUgB,GACpDyoE,EAAa3iD,IAAI9lB,EAAOhB,KAK5BpI,KAAKukE,SAEDvkE,KAAK4pE,UAAW,CAElB,GAAIj6C,GAAK3vB,IACTW,GAAKwH,QAAQnI,KAAKiqE,eAAgB,SAAU7hE,EAAUgB,GACpDumB,EAAGi6C,UAAU76C,GAAG3lB,EAAOhB,IAIzB,IAAIsoB,GAAM1wB,KAAK4pE,UAAUx4C,QACzBpxB,MAAKkqE,UAAUx5C,GAGjB1wB,KAAKwxE,mBAQP1uE,EAAQ0R,UAAU01D,UAAY,SAAUx5C,GAItC,IAAK,GAHD6zC,GAAQvkE,KAAKukE,MACbqF,EAAY5pE,KAAK4pE,UAEZzkE,EAAI,EAAGC,EAAMsrB,EAAIprB,OAAYF,EAAJD,EAASA,IAAK,CAC9C,GAAI9E,GAAKqwB,EAAIvrB,GAET2sE,EAAUvN,EAAMlkE,EAChByxE,IACFA,EAAQC,YAGV,IAAInmD,GAAOg+C,EAAUlxD,IAAIrY,GAAK2xE,iBAAoB,GAClDzN,GAAMlkE,GAAM,GAAI2C,GAAK4oB,EAAM5rB,KAAMA,KAAKkoE,WAGxCloE,KAAKqqE,QAAS,EACdrqE,KAAKyxE,kBAAkBlN,GACvBvkE,KAAKiyE,qBAC4C,GAA7CjyE,KAAKkoE,UAAUhB,mBAAmBn5D,SAAwC,GAArB/N,KAAKsjE,eAC5DtjE,KAAKsxE,eACLtxE,KAAKsqE,4BAEPtqE,KAAKuxE,2BAQPzuE,EAAQ0R,UAAU21D,aAAe,SAAUz5C,GAGzC,IAAK,GAFD6zC,GAAQvkE,KAAKukE,MACbqF,EAAY5pE,KAAK4pE,UACZzkE,EAAI,EAAGC,EAAMsrB,EAAIprB,OAAYF,EAAJD,EAASA,IAAK,CAC9C,GAAI9E,GAAKqwB,EAAIvrB,GAETymB,EAAOg+C,EAAUlxD,IAAIrY,GACrB0wE,EAAOxM,EAAMlkE,EACb0wE,IAEFA,EAAKgB,aACLhB,EAAKY,cAAc/lD,EAAM5rB,KAAKkoE,WAC9B6I,EAAKrN,YAILqN,EAAO,GAAI/tE,GAAK4oB,EAAM5rB,KAAMA,KAAKkoE,WACjCloE,KAAKukE,MAAMlkE,GAAM0wE,GAIrB/wE,KAAKiyE,qBAC4C,GAA7CjyE,KAAKkoE,UAAUhB,mBAAmBn5D,SAAwC,GAArB/N,KAAKsjE,eAC5DtjE,KAAKsxE,eACLtxE,KAAKsqE,4BAEPtqE,KAAKqqE,QAAS,EACdrqE,KAAKyxE,kBAAkBlN,IAQzBzhE,EAAQ0R,UAAU41D,aAAe,SAAU15C,GAEzC,IAAK,GADD6zC,GAAQvkE,KAAKukE,MACRp/D,EAAI,EAAGC,EAAMsrB,EAAIprB,OAAYF,EAAJD,EAASA,IAAK,CAC9C,GAAI9E,GAAKqwB,EAAIvrB,GACT4rE,EAAOxM,EAAMlkE,EACb0wE,KACc,MAAZA,EAAKmB,WACAlyE,MAAKmyE,QAAiB,QAAS,MAAEpB,EAAKmB,IAAI7xE,IAEnD0wE,EAAKgB,mBACExN,GAAMlkE,IAIjBL,KAAKqqE,QAAS,EACdrqE,KAAKyxE,kBAAkBlN,GAC0B,GAA7CvkE,KAAKkoE,UAAUhB,mBAAmBn5D,SAAwC,GAArB/N,KAAKsjE,eAC5DtjE,KAAKsxE,eACLtxE,KAAKsqE,4BAEPtqE,KAAKuxE,2BAOPzuE,EAAQ0R,UAAUg9D,gBAAkB,WAClC,GAAInxE,GACAujE,EAAQ5jE,KAAK4jE,MACbW,EAAQvkE,KAAKukE,KACjB,KAAKlkE,IAAMujE,GACLA,EAAMn+D,eAAepF,KACvBujE,EAAMvjE,GAAIkkE,SAId,KAAKlkE,IAAMkkE,GACT,GAAIA,EAAM9+D,eAAepF,GAAK,CAC5B,GAAI0wE,GAAOxM,EAAMlkE,EACjB0wE,GAAKvmD,KAAO,KACZumD,EAAKtuC,GAAK,KACVsuC,EAAKrN,YAaX5gE,EAAQ0R,UAAUi9D,kBAAoB,SAAS/nD,GAC7C,GAAIrpB,GAGA61B,EAAW/vB,OACXgwB,EAAWhwB,MACf,KAAK9F,IAAMqpB,GACT,GAAIA,EAAIjkB,eAAepF,GAAK,CAC1B,GAAI2G,GAAQ0iB,EAAIrpB,GAAIgwB,UACNlqB,UAAVa,IACFkvB,EAAyB/vB,SAAb+vB,EAA0BlvB,EAAQnC,KAAKwG,IAAIrE,EAAOkvB,GAC9DC,EAAyBhwB,SAAbgwB,EAA0BnvB,EAAQnC,KAAKiI,IAAI9F,EAAOmvB,IAMpE,GAAiBhwB,SAAb+vB,GAAuC/vB,SAAbgwB,EAC5B,IAAK91B,IAAMqpB,GACLA,EAAIjkB,eAAepF,IACrBqpB,EAAIrpB,GAAI+xE,cAAcl8C,EAAUC,IAUxCrzB,EAAQ0R,UAAU2mB,OAAS,WACzBn7B,KAAKm+B,QAAQn+B,KAAKkoE,UAAU35C,MAAOvuB,KAAKkoE,UAAU15C,QAClDxuB,KAAKuoE,WAOPzlE,EAAQ0R,UAAU+zD,QAAU,WAC1B,GAAIloC,GAAMrgC,KAAKg5B,MAAMC,OAAOqH,WAAW,MAEnC9jB,EAAIxc,KAAKg5B,MAAMC,OAAO1K,MACtBrjB,EAAIlL,KAAKg5B,MAAMC,OAAOzK,MAC1B6R,GAAIE,UAAU,EAAG,EAAG/jB,EAAGtR,GAGvBm1B,EAAIgyC,OACJhyC,EAAIiyC,UAAUtyE,KAAKo3B,YAAYrJ,EAAG/tB,KAAKo3B,YAAYnX,GACnDogB,EAAIxJ,MAAM72B,KAAK62B,MAAO72B,KAAK62B,OAE3B72B,KAAKspE,eACHv7C,EAAK/tB,KAAKivE,qBAAqB,GAC/BhvD,EAAKjgB,KAAKmvE,qBAAqB,IAEjCnvE,KAAKupE,mBACHx7C,EAAK/tB,KAAKivE,qBAAqBjvE,KAAKg5B,MAAMC,OAAOC,aACjDjZ,EAAKjgB,KAAKmvE,qBAAqBnvE,KAAKg5B,MAAMC,OAAOoF,eAInDr+B,KAAKuyE,gBAAgB,sBAAsBlyC,IACjB,GAAtBrgC,KAAK0nD,KAAKC,UAA4CxhD,SAAvBnG,KAAK0nD,KAAKC,UAA4D,GAAlC3nD,KAAKkoE,UAAUF,kBACpFhoE,KAAKuyE,gBAAgB,aAAalyC,IAGV,GAAtBrgC,KAAK0nD,KAAKC,UAA4CxhD,SAAvBnG,KAAK0nD,KAAKC,UAA4D,GAAlC3nD,KAAKkoE,UAAUD,kBACpFjoE,KAAKuyE,gBAAgB,aAAalyC,GAAI,GAGT,GAA3BrgC,KAAKooE,oBACPpoE,KAAKuyE,gBAAgB,oBAAoBlyC,GAO3CA,EAAImyC,WASN1vE,EAAQ0R,UAAUw0D,gBAAkB,SAASyJ,EAASC,GAC3BvsE,SAArBnG,KAAKo3B,cACPp3B,KAAKo3B,aACHrJ,EAAG,EACH9N,EAAG,IAIS9Z,SAAZssE,IACFzyE,KAAKo3B,YAAYrJ,EAAI0kD,GAEPtsE,SAAZusE,IACF1yE,KAAKo3B,YAAYnX,EAAIyyD,GAGvB1yE,KAAKymC,KAAK,gBAQZ3jC,EAAQ0R,UAAUi6D,gBAAkB,WAClC,OACE1gD,EAAG/tB,KAAKo3B,YAAYrJ,EACpB9N,EAAGjgB,KAAKo3B,YAAYnX,IASxBnd,EAAQ0R,UAAUoiB,UAAY,SAASC,GACrC72B,KAAK62B,MAAQA,GAQf/zB,EAAQ0R,UAAU65D,UAAY,WAC5B,MAAOruE,MAAK62B,OAUd/zB,EAAQ0R,UAAUy6D,qBAAuB,SAASlhD,GAChD,OAAQA,EAAI/tB,KAAKo3B,YAAYrJ,GAAK/tB,KAAK62B,OAUzC/zB,EAAQ0R,UAAU06D,qBAAuB,SAASnhD,GAChD,MAAOA,GAAI/tB,KAAK62B,MAAQ72B,KAAKo3B,YAAYrJ,GAU3CjrB,EAAQ0R,UAAU26D,qBAAuB,SAASlvD,GAChD,OAAQA,EAAIjgB,KAAKo3B,YAAYnX,GAAKjgB,KAAK62B,OAUzC/zB,EAAQ0R,UAAU46D,qBAAuB,SAASnvD,GAChD,MAAOA,GAAIjgB,KAAK62B,MAAQ72B,KAAKo3B,YAAYnX,GAU3Cnd,EAAQ0R,UAAU07D,YAAc,SAASrxC,GACvC,OAAQ9Q,EAAE/tB,KAAKkvE,qBAAqBrwC,EAAI9Q,GAAG9N,EAAEjgB,KAAKovE,qBAAqBvwC,EAAI5e,KAS7End,EAAQ0R,UAAUo7D,YAAc,SAAS/wC,GACvC,OAAQ9Q,EAAE/tB,KAAKivE,qBAAqBpwC,EAAI9Q,GAAG9N,EAAEjgB,KAAKmvE,qBAAqBtwC,EAAI5e,KAU7End,EAAQ0R,UAAUm+D,WAAa,SAAStyC,EAAIuyC,GACvBzsE,SAAfysE,IACFA,GAAa,EAIf,IAAIhP,GAAQ5jE,KAAK4jE,MACbtX,IAEJ,KAAK,GAAIjsD,KAAMujE,GACTA,EAAMn+D,eAAepF,KACvBujE,EAAMvjE,GAAIwyE,eAAe7yE,KAAK62B,MAAM72B,KAAKspE,cAActpE,KAAKupE,mBACxD3F,EAAMvjE,GAAIquE,aACZpiB,EAASxkD,KAAKzH,IAGVujE,EAAMvjE,GAAIyyE,UAAYF,IACxBhP,EAAMvjE,GAAI0yE,KAAK1yC,GAOvB,KAAK,GAAIl1B,GAAI,EAAG6nE,EAAO1mB,EAAShnD,OAAY0tE,EAAJ7nE,EAAUA,KAC5Cy4D,EAAMtX,EAASnhD,IAAI2nE,UAAYF,IACjChP,EAAMtX,EAASnhD,IAAI4nE,KAAK1yC,IAW9Bv9B,EAAQ0R,UAAUy+D,WAAa,SAAS5yC,GACtC,GAAIkkC,GAAQvkE,KAAKukE,KACjB,KAAK,GAAIlkE,KAAMkkE,GACb,GAAIA,EAAM9+D,eAAepF,GAAK,CAC5B,GAAI0wE,GAAOxM,EAAMlkE,EACjB0wE,GAAKvqB,SAASxmD,KAAK62B,OACfk6C,EAAKC,WACPzM,EAAMlkE,GAAI0yE,KAAK1yC,KAYvBv9B,EAAQ0R,UAAU0+D,kBAAoB,SAAS7yC,GAC7C,GAAIkkC,GAAQvkE,KAAKukE,KACjB,KAAK,GAAIlkE,KAAMkkE,GACTA,EAAM9+D,eAAepF,IACvBkkE,EAAMlkE,GAAI6yE,kBAAkB7yC,IASlCv9B,EAAQ0R,UAAU+3D,WAAa,WACgB,GAAzCvsE,KAAKkoE,UAAUb,wBACjBrnE,KAAKmzE,qBAKP,KADA,GAAIriE,GAAQ,EACL9Q,KAAKqqE,QAAUv5D,EAAQ9Q,KAAKkoE,UAAUL,yBAC3C7nE,KAAKozE,eACLtiE,GAEF9Q,MAAKuqE,YAAW,GAAM,GACuB,GAAzCvqE,KAAKkoE,UAAUb,wBACjBrnE,KAAKqzE,sBAEPrzE,KAAKymC,KAAK,cAAc6sC,WAAWxiE,KASrChO,EAAQ0R,UAAU2+D,oBAAsB,WACtC,GAAIvP,GAAQ5jE,KAAK4jE,KACjB,KAAK,GAAIvjE,KAAMujE,GACTA,EAAMn+D,eAAepF,IACJ,MAAfujE,EAAMvjE,GAAI0tB,GAA4B,MAAf61C,EAAMvjE,GAAI4f,IACnC2jD,EAAMvjE,GAAIkzE,UAAUxlD,EAAI61C,EAAMvjE,GAAIyuE,OAClClL,EAAMvjE,GAAIkzE,UAAUtzD,EAAI2jD,EAAMvjE,GAAI0uE,OAClCnL,EAAMvjE,GAAIyuE,QAAS,EACnBlL,EAAMvjE,GAAI0uE,QAAS,IAW3BjsE,EAAQ0R,UAAU6+D,oBAAsB,WACtC,GAAIzP,GAAQ5jE,KAAK4jE,KACjB,KAAK,GAAIvjE,KAAMujE,GACTA,EAAMn+D,eAAepF,IACM,MAAzBujE,EAAMvjE,GAAIkzE,UAAUxlD,IACtB61C,EAAMvjE,GAAIyuE,OAASlL,EAAMvjE,GAAIkzE,UAAUxlD,EACvC61C,EAAMvjE,GAAI0uE,OAASnL,EAAMvjE,GAAIkzE,UAAUtzD,IAa/Cnd,EAAQ0R,UAAUg/D,UAAY,SAASC,GACrC,GAAI7P,GAAQ5jE,KAAK4jE,KACjB,KAAK,GAAIvjE,KAAMujE,GACb,GAAIA,EAAMn+D,eAAepF,IAAOujE,EAAMvjE,GAAIqzE,SAASD,GACjD,OAAO,CAGX,QAAO,GAUT3wE,EAAQ0R,UAAUm/D,mBAAqB,SAASC,GAC9C,GAEI1I,GAFAh/B,EAAWlsC,KAAKqjE,wBAChBO,EAAQ5jE,KAAK4jE,MAEbiQ,GAAe,CAEnB,IAAI7zE,KAAKkoE,UAAUR,YAAc,EAC/B,IAAKwD,IAAUtH,GACTA,EAAMn+D,eAAeylE,KACvBtH,EAAMsH,GAAQ4I,oBAAoB5nC,EAAUlsC,KAAKkoE,UAAUR,aAC3DmM,GAAe,OAKnB,KAAK3I,IAAUtH,GACTA,EAAMn+D,eAAeylE,KACvBtH,EAAMsH,GAAQ6I,aAAa7nC,GAC3B2nC,GAAe,EAKrB,IAAoB,GAAhBA,IAA2C1tE,SAAlBytE,GAAgD,GAAjBA,GAAwB,CAClF,GAAII,GAAgBh0E,KAAKkoE,UAAUP,YAAc9iE,KAAKiI,IAAI9M,KAAK62B,MAAM,IACjEm9C,GAAgB,GAAIh0E,KAAKkoE,UAAUR,YACrC1nE,KAAKqqE,QAAS,GAGdrqE,KAAKqqE,OAASrqE,KAAKwzE,UAAUQ,GACV,GAAfh0E,KAAKqqE,QACPrqE,KAAKymC,KAAK,cAAc6sC,WAAW,OAErCtzE,KAAKqqE,OAASrqE,KAAKqqE,QAAUrqE,KAAKglE,oBAWxCliE,EAAQ0R,UAAU4+D,aAAe,WAC1BpzE,KAAKipE,kBACW,GAAfjpE,KAAKqqE,SACPrqE,KAAKi0E,sBAAsB,+BAC3Bj0E,KAAKi0E,sBAAsB,sBACgB,GAAvCj0E,KAAKkoE,UAAUZ,aAAav5D,SAA0D,GAAvC/N,KAAKkoE,UAAUZ,aAAaC,SAC7EvnE,KAAKk0E,mBAAmB,sBAAsB,GAEhDl0E,KAAKmrE,YAAYnrE,KAAK6qE,eAY5B/nE,EAAQ0R,UAAU2/D,eAAiB,WAEjCn0E,KAAK07C,MAAQv1C,OAEbnG,KAAKo0E,oBAGLp0E,KAAK8O,OAGL,IAAIulE,GAAkBpwE,KAAK8Z,MACvBu2D,EAAW,CACft0E,MAAKozE,cAEL,KADA,GAAImB,GAAetwE,KAAK8Z,MAAQs2D,EACzBE,EAAe,IAAKv0E,KAAKkjE,eAAiBljE,KAAKmjE,aAAemR,EAAWt0E,KAAKojE,0BACnFpjE,KAAKozE,eACLmB,EAAetwE,KAAK8Z,MAAQs2D,EAC5BC,GAGF,IAAInR,GAAal/D,KAAK8Z,KACtB/d,MAAKuoE,UACLvoE,KAAKmjE,WAAal/D,KAAK8Z,MAAQolD,GAIX,mBAAX97D,UACTA,OAAOmtE,sBAAwBntE,OAAOmtE,uBAAyBntE,OAAOotE,0BACvCptE,OAAOqtE,6BAA+BrtE,OAAOstE,yBAM9E7xE,EAAQ0R,UAAU1F,MAAQ,WACxB,GAAmB,GAAf9O,KAAKqqE,QAAqC,GAAnBrqE,KAAKwoE,YAAsC,GAAnBxoE,KAAKyoE,YAAyC,GAAtBzoE,KAAK0oE,eAC9E,IAAK1oE,KAAK07C,MAAO,CACf,GAAIk5B,GAAK9rE,UAAUC,UAAUoM,cAEzB0/D,GAAkB,CACQ,KAA1BD,EAAGtuE,QAAQ,YACbuuE,GAAkB,EAEa,IAAxBD,EAAGtuE,QAAQ,WACdsuE,EAAGtuE,QAAQ,WAAa,KAC1BuuE,GAAkB,GAKpB70E,KAAK07C,MADgB,GAAnBm5B,EACWxtE,OAAO8/B,WAAWnnC,KAAKm0E,eAAe9lC,KAAKruC,MAAOA,KAAKkjE,gBAGvD77D,OAAOmtE,sBAAsBx0E,KAAKm0E,eAAe9lC,KAAKruC,MAAOA,KAAKkjE,qBAKnFljE,MAAKuoE,WAUTzlE,EAAQ0R,UAAU4/D,kBAAoB,WACpC,GAAuB,GAAnBp0E,KAAKwoE,YAAsC,GAAnBxoE,KAAKyoE,WAAiB,CAChD,GAAIrxC,GAAcp3B,KAAKyuE,iBACvBzuE,MAAKgpE,gBAAgB5xC,EAAYrJ,EAAE/tB,KAAKwoE,WAAYpxC,EAAYnX,EAAEjgB,KAAKyoE,YAEzE,GAA0B,GAAtBzoE,KAAK0oE,cAAoB,CAC3B,GAAI3jC,IACFhX,EAAG/tB,KAAKg5B,MAAMC,OAAOC,YAAc,EACnCjZ,EAAGjgB,KAAKg5B,MAAMC,OAAOoF,aAAe,EAEtCr+B,MAAKyvE,MAAMzvE,KAAK62B,OAAO,EAAI72B,KAAK0oE,eAAgB3jC,KAQpDjiC,EAAQ0R,UAAUsgE,aAAe,WACF,GAAzB90E,KAAKipE,iBACPjpE,KAAKipE,kBAAmB,GAGxBjpE,KAAKipE,kBAAmB,EACxBjpE,KAAK8O,UAWThM,EAAQ0R,UAAU04D,uBAAyB,SAAS5B,GAIlD,GAHqBnlE,SAAjBmlE,IACFA,GAAe,GAE0B,GAAvCtrE,KAAKkoE,UAAUZ,aAAav5D,SAA0D,GAAvC/N,KAAKkoE,UAAUZ,aAAaC,QAAiB,CAC9FvnE,KAAKiyE,oBAEL,KAAK,GAAI/G,KAAUlrE,MAAKmyE,QAAiB,QAAS,MAC5CnyE,KAAKmyE,QAAiB,QAAS,MAAE1sE,eAAeylE,IACwB/kE,SAAtEnG,KAAKukE,MAAMvkE,KAAKmyE,QAAiB,QAAS,MAAEjH,GAAQ6J,qBAC/C/0E,MAAKmyE,QAAiB,QAAS,MAAEjH,OAK3C,CAEHlrE,KAAKmyE,QAAiB,QAAS,QAC/B,KAAK,GAAI3B,KAAUxwE,MAAKukE,MAClBvkE,KAAKukE,MAAM9+D,eAAe+qE,KAC5BxwE,KAAKukE,MAAMiM,GAAQ0B,IAAM,MAM/BlyE,KAAKuxE,0BACAjG,IACHtrE,KAAKqqE,QAAS,EACdrqE,KAAK8O,UAWThM,EAAQ0R,UAAUy9D,mBAAqB,WACrC,GAA2C,GAAvCjyE,KAAKkoE,UAAUZ,aAAav5D,SAA0D,GAAvC/N,KAAKkoE,UAAUZ,aAAaC,QAC7E,IAAK,GAAIiJ,KAAUxwE,MAAKukE,MACtB,GAAIvkE,KAAKukE,MAAM9+D,eAAe+qE,GAAS,CACrC,GAAIO,GAAO/wE,KAAKukE,MAAMiM,EACtB,IAAgB,MAAZO,EAAKmB,IAAa,CACpB,GAAIhH,GAAS,UAAU17C,OAAOuhD,EAAK1wE,GACnCL,MAAKmyE,QAAiB,QAAS,MAAEjH,GAAU,GAAI/nE,IACtC9C,GAAG6qE,EACFrH,KAAK,EACLG,MAAM,SACNC,MAAM,GACN+Q,mBAAmB,SACbh1E,KAAKkoE,WACrB6I,EAAKmB,IAAMlyE,KAAKmyE,QAAiB,QAAS,MAAEjH,GAC5C6F,EAAKmB,IAAI6C,aAAehE,EAAK1wE,GAC7B0wE,EAAKkE,wBAYfnyE,EAAQ0R,UAAUwuD,wBAA0B,WAC1C,IAAK,GAAIt5B,KAAS+gC,GACZA,EAAYhlE,eAAeikC,KAC7B5mC,EAAQ0R,UAAUk1B,GAAS+gC,EAAY/gC,KAQ7C5mC,EAAQ0R,UAAU0gE,cAAgB,WAChC,GAAIC,KACJ,KAAK,GAAIjK,KAAUlrE,MAAK4jE,MACtB,GAAI5jE,KAAK4jE,MAAMn+D,eAAeylE,GAAS,CACrC,GAAIp3B,GAAO9zC,KAAK4jE,MAAMsH,GAClBkK,GAAkBp1E,KAAK4jE,MAAMkL,OAC7BuG,GAAkBr1E,KAAK4jE,MAAMmL,QAC7B/uE,KAAK2pE,UAAU12D,MAAMi4D,GAAQn9C,GAAKlpB,KAAK+b,MAAMkzB,EAAK/lB,IAAM/tB,KAAK2pE,UAAU12D,MAAMi4D,GAAQjrD,GAAKpb,KAAK+b,MAAMkzB,EAAK7zB,KAC5Gk1D,EAAUrtE,MAAMzH,GAAG6qE,EAAOn9C,EAAElpB,KAAK+b,MAAMkzB,EAAK/lB,GAAG9N,EAAEpb,KAAK+b,MAAMkzB,EAAK7zB,GAAGm1D,eAAeA,EAAeC,eAAeA,IAIvHr1E,KAAK2pE,UAAUr5C,OAAO6kD,IAUxBryE,EAAQ0R,UAAU8gE,YAAc,SAAUpK,EAAQK,GAChD,GAAIvrE,KAAK4jE,MAAMn+D,eAAeylE,GAAS,CACnB/kE,SAAdolE,IACFA,EAAYvrE,KAAKquE,YAEnB,IAAIkH,IAAexnD,EAAG/tB,KAAK4jE,MAAMsH,GAAQn9C,EAAG9N,EAAGjgB,KAAK4jE,MAAMsH,GAAQjrD,GAE9Du1D,EAAgBjK,CACpBvrE,MAAK42B,UAAU4+C,EAEf,IAAIC,GAAez1E,KAAK4vE,aAAa7hD,EAAE,GAAM/tB,KAAKg5B,MAAMC,OAAO1K,MAAMtO,EAAE,GAAMjgB,KAAKg5B,MAAMC,OAAOzK,SAC3F4I,EAAcp3B,KAAKyuE,kBAEnBiH,GAAsB3nD,EAAE0nD,EAAa1nD,EAAIwnD,EAAaxnD,EAChC9N,EAAEw1D,EAAax1D,EAAIs1D,EAAat1D,EAE1DjgB,MAAKgpE,gBAAgB5xC,EAAYrJ,EAAIynD,EAAgBE,EAAmB3nD,EACnDqJ,EAAYnX,EAAIu1D,EAAgBE,EAAmBz1D,GACxEjgB,KAAKm7B,aAGLpsB,SAAQC,IAAI,iCAQhBlM,EAAQ0R,UAAU8rC,SAAW,WAC3B,OAAQtgD,KAAK0gD,WAAa1gD,KAAK0gD,UAAUG,QAG3ChhD,EAAOD,QAAUkD,GAKb,SAASjD,EAAQD,GAarB,QAAS+1E,GAAU/pD,GAEjB,MADA+c,GAAM/c,EACCgqD,IAoCT,QAASxxB,KACPn8C,EAAQ,EACRxH,EAAIkoC,EAAIlhB,OAAO,GAQjB,QAAShP,KACPxQ,IACAxH,EAAIkoC,EAAIlhB,OAAOxf,GAOjB,QAAS4tE,KACP,MAAOltC,GAAIlhB,OAAOxf,EAAQ,GAS5B,QAAS6tE,GAAer1E,GACtB,MAAOs1E,GAAkB1oE,KAAK5M,GAShC,QAAS6yC,GAAOpuC,EAAGa,GAKjB,GAJKb,IACHA,MAGEa,EACF,IAAK,GAAIsc,KAAQtc,GACXA,EAAEN,eAAe4c,KACnBnd,EAAEmd,GAAQtc,EAAEsc,GAIlB;MAAOnd,GAeT,QAAS8tB,GAAStJ,EAAK0yC,EAAMp1D,GAG3B,IAFA,GAAIylB,GAAO2vC,EAAKv0D,MAAM,KAClBmuE,EAAItsD,EACD+C,EAAKnnB,QAAQ,CAClB,GAAIkD,GAAMikB,EAAKc,OACXd,GAAKnnB,QAEF0wE,EAAExtE,KACLwtE,EAAExtE,OAEJwtE,EAAIA,EAAExtE,IAINwtE,EAAExtE,GAAOxB,GAWf,QAASivE,GAAQprC,EAAOiJ,GAOtB,IANA,GAAI3uC,GAAGC,EACHozC,EAAU,KAGV09B,GAAUrrC,GACVnrC,EAAOmrC,EACJnrC,EAAKq0C,QACVmiC,EAAOpuE,KAAKpI,EAAKq0C,QACjBr0C,EAAOA,EAAKq0C,MAId,IAAIr0C,EAAKkkE,MACP,IAAKz+D,EAAI,EAAGC,EAAM1F,EAAKkkE,MAAMt+D,OAAYF,EAAJD,EAASA,IAC5C,GAAI2uC,EAAKzzC,KAAOX,EAAKkkE,MAAMz+D,GAAG9E,GAAI,CAChCm4C,EAAU94C,EAAKkkE,MAAMz+D,EACrB,OAiBN,IAZKqzC,IAEHA,GACEn4C,GAAIyzC,EAAKzzC,IAEPwqC,EAAMiJ,OAER0E,EAAQ29B,KAAO7iC,EAAMkF,EAAQ29B,KAAMtrC,EAAMiJ,QAKxC3uC,EAAI+wE,EAAO5wE,OAAS,EAAGH,GAAK,EAAGA,IAAK,CACvC,GAAIoH,GAAI2pE,EAAO/wE,EAEVoH,GAAEq3D,QACLr3D,EAAEq3D,UAE4B,IAA5Br3D,EAAEq3D,MAAMt9D,QAAQkyC,IAClBjsC,EAAEq3D,MAAM97D,KAAK0wC,GAKb1E,EAAKqiC,OACP39B,EAAQ29B,KAAO7iC,EAAMkF,EAAQ29B,KAAMriC,EAAKqiC,OAS5C,QAASC,GAAQvrC,EAAOkmC,GAKtB,GAJKlmC,EAAM05B,QACT15B,EAAM05B,UAER15B,EAAM05B,MAAMz8D,KAAKipE,GACblmC,EAAMkmC,KAAM,CACd,GAAIoF,GAAO7iC,KAAUzI,EAAMkmC,KAC3BA,GAAKoF,KAAO7iC,EAAM6iC,EAAMpF,EAAKoF,OAajC,QAASE,GAAWxrC,EAAOrgB,EAAMiY,EAAIh8B,EAAM0vE,GACzC,GAAIpF,IACFvmD,KAAMA,EACNiY,GAAIA,EACJh8B,KAAMA,EAQR,OALIokC,GAAMkmC,OACRA,EAAKoF,KAAO7iC,KAAUzI,EAAMkmC,OAE9BA,EAAKoF,KAAO7iC,EAAMy9B,EAAKoF,SAAYA,GAE5BpF,EAOT,QAASuF,KAKP,IAJAC,EAAYC,EAAUC,KACtB78D,EAAQ,GAGI,KAALnZ,GAAiB,KAALA,GAAkB,MAALA,GAAkB,MAALA,GAC3CgY,GAGF,GAAG,CACD,GAAIi+D,IAAY,CAGhB,IAAS,KAALj2E,EAAU,CAGZ,IADA,GAAI0E,GAAI8C,EAAQ,EACQ,KAAjB0gC,EAAIlhB,OAAOtiB,IAA8B,KAAjBwjC,EAAIlhB,OAAOtiB,IACxCA,GAEF,IAAqB,MAAjBwjC,EAAIlhB,OAAOtiB,IAA+B,IAAjBwjC,EAAIlhB,OAAOtiB,GAAU,CAEhD,KAAY,IAAL1E,GAAgB,MAALA,GAChBgY,GAEFi+D,IAAY,GAGhB,GAAS,KAALj2E,GAA6B,KAAjBo1E,IAAsB,CAEpC,KAAY,IAALp1E,GAAgB,MAALA,GAChBgY,GAEFi+D,IAAY,EAEd,GAAS,KAALj2E,GAA6B,KAAjBo1E,IAAsB,CAEpC,KAAY,IAALp1E,GAAS,CACd,GAAS,KAALA,GAA6B,KAAjBo1E,IAAsB,CAEpCp9D,IACAA,GACA,OAGAA,IAGJi+D,GAAY,EAId,KAAY,KAALj2E,GAAiB,KAALA,GAAkB,MAALA,GAAkB,MAALA,GAC3CgY,UAGGi+D,EAGP,IAAS,IAALj2E,EAGF,YADA81E,EAAYC,EAAUG,UAKxB,IAAIC,GAAKn2E,EAAIo1E,GACb,IAAIgB,EAAWD,GAKb,MAJAL,GAAYC,EAAUG,UACtB/8D,EAAQg9D,EACRn+D,QACAA,IAKF,IAAIo+D,EAAWp2E,GAIb,MAHA81E,GAAYC,EAAUG,UACtB/8D,EAAQnZ,MACRgY,IAMF,IAAIq9D,EAAer1E,IAAW,KAALA,EAAU,CAIjC,IAHAmZ,GAASnZ,EACTgY,IAEOq9D,EAAer1E,IACpBmZ,GAASnZ,EACTgY,GAYF,OAVa,SAATmB,EACFA,GAAQ,EAEQ,QAATA,EACPA,GAAQ,EAEAvV,MAAMR,OAAO+V,MACrBA,EAAQ/V,OAAO+V,SAEjB28D,EAAYC,EAAUM,YAKxB,GAAS,KAALr2E,EAAU,CAEZ,IADAgY,IACY,IAALhY,IAAiB,KAALA,GAAkB,KAALA,GAA6B,KAAjBo1E,MAC1Cj8D,GAASnZ,EACA,KAALA,GACFgY,IAEFA,GAEF,IAAS,KAALhY,EACF,KAAMs2E,GAAe,2BAIvB,OAFAt+D,UACA89D,EAAYC,EAAUM,YAMxB,IADAP,EAAYC,EAAUQ,QACV,IAALv2E,GACLmZ,GAASnZ,EACTgY,GAEF,MAAM,IAAImb,aAAY,yBAA2BqjD,EAAKr9D,EAAO,IAAM,KAOrE,QAASg8D,KACP,GAAI/qC,KAwBJ,IAtBAuZ,IACAkyB,IAGa,UAAT18D,IACFixB,EAAMhxB,QAAS,EACfy8D,MAIW,SAAT18D,GAA6B,WAATA,KACtBixB,EAAMpkC,KAAOmT,EACb08D,KAIEC,GAAaC,EAAUM,aACzBjsC,EAAMxqC,GAAKuZ,EACX08D,KAIW,KAAT18D,EACF,KAAMm9D,GAAe,2BAQvB,IANAT,IAGAY,EAAgBrsC,GAGH,KAATjxB,EACF,KAAMm9D,GAAe,2BAKvB,IAHAT,IAGc,KAAV18D,EACF,KAAMm9D,GAAe,uBASvB,OAPAT,WAGOzrC,GAAMiJ,WACNjJ,GAAMkmC,WACNlmC,GAAMA,MAENA,EAOT,QAASqsC,GAAiBrsC,GACxB,KAAiB,KAAVjxB,GAAyB,KAATA,GACrBu9D,EAAetsC,GACF,KAATjxB,GACF08D,IAWN,QAASa,GAAetsC,GAEtB,GAAIusC,GAAWC,EAAcxsC,EAC7B,IAAIusC,EAIF,WAFAE,GAAUzsC,EAAOusC,EAMnB,IAAIjB,GAAOoB,EAAwB1sC,EACnC,KAAIsrC,EAAJ,CAKA,GAAII,GAAaC,EAAUM,WACzB,KAAMC,GAAe,sBAEvB,IAAI12E,GAAKuZ,CAGT,IAFA08D,IAEa,KAAT18D,EAAc,CAGhB,GADA08D,IACIC,GAAaC,EAAUM,WACzB,KAAMC,GAAe,sBAEvBlsC,GAAMxqC,GAAMuZ,EACZ08D,QAIAkB,GAAmB3sC,EAAOxqC,IAS9B,QAASg3E,GAAexsC,GACtB,GAAIusC,GAAW,IAgBf,IAba,YAATx9D,IACFw9D,KACAA,EAAS3wE,KAAO,WAChB6vE,IAGIC,GAAaC,EAAUM,aACzBM,EAAS/2E,GAAKuZ,EACd08D,MAKS,KAAT18D,EAAc,CAehB,GAdA08D,IAEKc,IACHA,MAEFA,EAASrjC,OAASlJ,EAClBusC,EAAStjC,KAAOjJ,EAAMiJ,KACtBsjC,EAASrG,KAAOlmC,EAAMkmC,KACtBqG,EAASvsC,MAAQA,EAAMA,MAGvBqsC,EAAgBE,GAGH,KAATx9D,EACF,KAAMm9D,GAAe,2BAEvBT,WAGOc,GAAStjC,WACTsjC,GAASrG,WACTqG,GAASvsC,YACTusC,GAASrjC,OAGXlJ,EAAM4sC,YACT5sC,EAAM4sC,cAER5sC,EAAM4sC,UAAU3vE,KAAKsvE,GAGvB,MAAOA,GAYT,QAASG,GAAyB1sC,GAEhC,MAAa,QAATjxB,GACF08D,IAGAzrC,EAAMiJ,KAAO4jC,IACN,QAES,QAAT99D,GACP08D,IAGAzrC,EAAMkmC,KAAO2G,IACN,QAES,SAAT99D,GACP08D,IAGAzrC,EAAMA,MAAQ6sC,IACP,SAGF,KAQT,QAASF,GAAmB3sC,EAAOxqC,GAEjC,GAAIyzC,IACFzzC,GAAIA,GAEF81E,EAAOuB,GACPvB,KACFriC,EAAKqiC,KAAOA,GAEdF,EAAQprC,EAAOiJ,GAGfwjC,EAAUzsC,EAAOxqC,GAQnB,QAASi3E,GAAUzsC,EAAOrgB,GACxB,KAAgB,MAAT5Q,GAA0B,MAATA,GAAe,CACrC,GAAI6oB,GACAh8B,EAAOmT,CACX08D,IAEA,IAAIc,GAAWC,EAAcxsC,EAC7B,IAAIusC,EACF30C,EAAK20C,MAEF,CACH,GAAIb,GAAaC,EAAUM,WACzB,KAAMC,GAAe,kCAEvBt0C,GAAK7oB,EACLq8D,EAAQprC,GACNxqC,GAAIoiC,IAEN6zC,IAIF,GAAIH,GAAOuB,IAGP3G,EAAOsF,EAAWxrC,EAAOrgB,EAAMiY,EAAIh8B,EAAM0vE,EAC7CC,GAAQvrC,EAAOkmC,GAEfvmD,EAAOiY,GASX,QAASi1C,KAGP,IAFA,GAAIvB,GAAO,KAEK,KAATv8D,GAAc,CAGnB,IAFA08D,IACAH,KACiB,KAAVv8D,GAAyB,KAATA,GAAc,CACnC,GAAI28D,GAAaC,EAAUM,WACzB,KAAMC,GAAe,0BAEvB,IAAI10D,GAAOzI,CAGX,IADA08D,IACa,KAAT18D,EACF,KAAMm9D,GAAe,wBAIvB,IAFAT,IAEIC,GAAaC,EAAUM,WACzB,KAAMC,GAAe,2BAEvB,IAAI/vE,GAAQ4S,CACZoZ,GAASmjD,EAAM9zD,EAAMrb,GAErBsvE,IACY,KAAR18D,GACF08D,IAIJ,GAAa,KAAT18D,EACF,KAAMm9D,GAAe,qBAEvBT,KAGF,MAAOH,GAQT,QAASY,GAAeY,GACtB,MAAO,IAAI/jD,aAAY+jD,EAAU,UAAYV,EAAKr9D,EAAO,IAAM,WAAa3R,EAAQ,KAStF,QAASgvE,GAAMt0C,EAAMi1C,GACnB,MAAQj1C,GAAKr9B,QAAUsyE,EAAaj1C,EAAQA,EAAK/3B,OAAO,EAAG,IAAM,MASnE,QAASitE,GAASnjE,EAAQC,EAAQrE,GAC5BoE,YAAkB9O,OACpB8O,EAAOvM,QAAQ,SAAU2vE,GACnBnjE,YAAkB/O,OACpB+O,EAAOxM,QAAQ,SAAU4vE,GACvBznE,EAAGwnE,EAAOC,KAIZznE,EAAGwnE,EAAOnjE,KAKVA,YAAkB/O,OACpB+O,EAAOxM,QAAQ,SAAU4vE,GACvBznE,EAAGoE,EAAQqjE,KAIbznE,EAAGoE,EAAQC,GAWjB,QAASq3D,GAAYpgD,GA+BjB,QAASosD,GAAYC,GACnB,GAAIC,IACF1tD,KAAMytD,EAAQztD,KACdiY,GAAIw1C,EAAQx1C,GAId,OAFA6Q,GAAM4kC,EAAWD,EAAQ9B,MACzB+B,EAAU/pD,MAAyB,MAAhB8pD,EAAQxxE,KAAgB,QAAU,OAC9CyxE,EApCX,GAAInM,GAAU4J,EAAS/pD,GACnBusD,GACFvU,SACAW,SACAz2D,WAkFF,OA9EIi+D,GAAQnI,OACVmI,EAAQnI,MAAMz7D,QAAQ,SAAUiwE,GAC9B,GAAIC,IACFh4E,GAAI+3E,EAAQ/3E,GACZyhC,MAAO/9B,OAAOq0E,EAAQt2C,OAASs2C,EAAQ/3E,IAEzCizC,GAAM+kC,EAAWD,EAAQjC,MACrBkC,EAAUpU,QACZoU,EAAUrU,MAAQ,SAEpBmU,EAAUvU,MAAM97D,KAAKuwE,KAKrBtM,EAAQxH,OAgBVwH,EAAQxH,MAAMp8D,QAAQ,SAAU8vE,GAC9B,GAAIztD,GAAMiY,CAERjY,GADEytD,EAAQztD,eAAgBtkB,QACnB+xE,EAAQztD,KAAKo5C,OAIlBvjE,GAAI43E,EAAQztD,MAKdiY,EADEw1C,EAAQx1C,aAAcv8B,QACnB+xE,EAAQx1C,GAAGmhC,OAIdvjE,GAAI43E,EAAQx1C,IAIZw1C,EAAQztD,eAAgBtkB,SAAU+xE,EAAQztD,KAAK+5C,OACjD0T,EAAQztD,KAAK+5C,MAAMp8D,QAAQ,SAAUmwE,GACnC,GAAIJ,GAAYF,EAAYM,EAC5BH,GAAU5T,MAAMz8D,KAAKowE,KAIzBL,EAASrtD,EAAMiY,EAAI,SAAUjY,EAAMiY,GACjC,GAAI61C,GAAUjC,EAAW8B,EAAW3tD,EAAKnqB,GAAIoiC,EAAGpiC,GAAI43E,EAAQxxE,KAAMwxE,EAAQ9B,MACtE+B,EAAYF,EAAYM,EAC5BH,GAAU5T,MAAMz8D,KAAKowE,KAGnBD,EAAQx1C,aAAcv8B,SAAU+xE,EAAQx1C,GAAG8hC,OAC7C0T,EAAQx1C,GAAG8hC,MAAMp8D,QAAQ,SAAUmwE,GACjC,GAAIJ,GAAYF,EAAYM,EAC5BH,GAAU5T,MAAMz8D,KAAKowE,OAOzBnM,EAAQoK,OACVgC,EAAUrqE,QAAUi+D,EAAQoK,MAGvBgC,EAnyBT,GAAI3B,IACFC,KAAO,EACPE,UAAY,EACZG,WAAY,EACZE,QAAU,GAIRH,GACF0B,KAAK,EACLC,KAAK,EACLC,KAAK,EACLC,KAAK,EACLC,KAAK,EACLC,KAAK,EACLC,KAAK,EAELC,MAAM,EACNC,MAAM,GAGJpwC,EAAM,GACN1gC,EAAQ,EACRxH,EAAI,GACJmZ,EAAQ,GACR28D,EAAYC,EAAUC,KAmCtBV,EAAoB,iBA2uBxBn2E,GAAQ+1E,SAAWA,EACnB/1E,EAAQosE,WAAaA,GAKjB,SAASnsE,EAAQD,GAGrB,QAASusE,GAAW6M,EAAWlrE,GAC7B,GAAIy2D,MACAX,IACJ5jE,MAAK8N,SACHy2D,OACEQ,cAAc,GAEhBnB,OACEqV,eAAe,EACfzuE,YAAY,IAIArE,SAAZ2H,IACF9N,KAAK8N,QAAQ81D,MAAqB,cAAI91D,EAAQmrE,eAAgB,EAC9Dj5E,KAAK8N,QAAQ81D,MAAkB,WAAO91D,EAAQtD,YAAgB,EAC9DxK,KAAK8N,QAAQy2D,MAAoB,aAAKz2D,EAAQi3D,cAAgB,EAKhE,KAAK,GAFDmU,GAASF,EAAUzU,MACnB4U,EAASH,EAAUpV,MACdz+D,EAAI,EAAGA,EAAI+zE,EAAO5zE,OAAQH,IAAK,CACtC,GAAI4rE,MACAqI,EAAQF,EAAO/zE,EACnB4rE,GAAS,GAAIqI,EAAM/4E,GACnB0wE,EAAW,KAAIqI,EAAMC,OACrBtI,EAAS,GAAIqI,EAAM7vE,OACnBwnE,EAAiB,WAAIqI,EAAME,WAG3BvI,EAAY,MAAIqI,EAAM3uE,MACtBsmE,EAAmB,aAAsB5qE,SAAlB4qE,EAAY,OAAkB,EAAQ/wE,KAAK8N,QAAQi3D,aAC1ER,EAAMz8D,KAAKipE,GAGb,IAAK,GAAI5rE,GAAI,EAAGA,EAAIg0E,EAAO7zE,OAAQH,IAAK,CACtC,GAAI2uC,MACAylC,EAAQJ,EAAOh0E,EACnB2uC,GAAS,GAAIylC,EAAMl5E,GACnByzC,EAAiB,WAAIylC,EAAMD,WAC3BxlC,EAAQ,EAAIylC,EAAMxrD,EAClB+lB,EAAQ,EAAIylC,EAAMt5D,EAClB6zB,EAAY,MAAIylC,EAAMz3C,MAEpBgS,EAAY,MADuB,GAAjC9zC,KAAK8N,QAAQ81D,MAAMp5D,WACL+uE,EAAM9uE,MAGUtE,SAAhBozE,EAAM9uE,OAAuBiB,WAAW6tE,EAAM9uE,MAAOkB,OAAO4tE,EAAM9uE,OAAStE,OAE7F2tC,EAAa,OAAIylC,EAAMlrD,KACvBylB,EAAqB,eAAI9zC,KAAK8N,QAAQ81D,MAAMqV,cAC5CnlC,EAAqB,eAAI9zC,KAAK8N,QAAQ81D,MAAMqV,cAC5CrV,EAAM97D,KAAKgsC,GAGb,OAAQ8vB,MAAMA,EAAOW,MAAMA,GAG7B3kE,EAAQusE,WAAaA,GAIjB,SAAStsE,EAAQD,EAASM,GAQ9B,QAAS+C,KACPjD,KAAK+xB,QACL/xB,KAAKw5E,aAAe,EARtB,GAAI74E,GAAOT,EAAoB,EAe/B+C,GAAOw2E,UACJ9tE,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aAO3IzI,EAAOuR,UAAUud,MAAQ,WACvB/xB,KAAK4vC,UACL5vC,KAAK4vC,OAAOtqC,OAAS,WAEnB,GAAIH,GAAI,CACR,KAAM,GAAIzE,KAAKV,MACTA,KAAKyF,eAAe/E,IACtByE,GAGJ,OAAOA,KAWXlC,EAAOuR,UAAUkE,IAAM,SAAUo0D,GAC/B,GAAI9+C,GAAQhuB,KAAK4vC,OAAOk9B,EACxB,IAAa3mE,QAAT6nB,EAAoB,CAEtB,GAAI/lB,GAAQjI,KAAKw5E,aAAev2E,EAAOw2E,QAAQn0E,MAC/CtF,MAAKw5E,eACLxrD,KACAA,EAAMvjB,MAAQxH,EAAOw2E,QAAQxxE,GAC7BjI,KAAK4vC,OAAOk9B,GAAa9+C,EAG3B,MAAOA,IAUT/qB,EAAOuR,UAAU+M,IAAM,SAAUurD,EAAW3+C,GAK1C,MAJAnuB,MAAK4vC,OAAOk9B,GAAa3+C,EACrBA,EAAM1jB,QACR0jB,EAAM1jB,MAAQ9J,EAAK6J,WAAW2jB,EAAM1jB,QAE/B0jB,GAGTtuB,EAAOD,QAAUqD,GAKb,SAASpD,GAMb,QAASqD,KACPlD,KAAKqoE,UAELroE,KAAKoI,SAAWjC,OAQlBjD,EAAOsR,UAAU8zD,kBAAoB,SAASlgE,GAC5CpI,KAAKoI,SAAWA,GAQlBlF,EAAOsR,UAAUklE,KAAO,SAASC,GAC/B,GAAIC,GAAM55E,KAAKqoE,OAAOsR,EACtB,IAAWxzE,QAAPyzE,EAAkB,CAEpB,GAAIvR,GAASroE,IACb45E,GAAM,GAAIC,OACV75E,KAAKqoE,OAAOsR,GAAOC,EACnBA,EAAIE,OAAS,WACPzR,EAAOjgE,UACTigE,EAAOjgE,SAASpI,OAGpB45E,EAAIvmC,IAAMsmC,EAGZ,MAAOC,IAGT/5E,EAAOD,QAAUsD,GAKb,SAASrD,EAAQD,EAASM,GA6B9B,QAASiD,GAAKyuE,EAAYmI,EAAWC,EAAWC,GAC9C,GAAI/R,GAAYvnE,EAAK2M,uBAAuB,SAAS2sE,EACrDj6E,MAAK8N,QAAUo6D,EAAUtE,MAEzB5jE,KAAKssD,UAAW,EAChBtsD,KAAK6L,OAAQ,EAEb7L,KAAKukE,SACLvkE,KAAKk6E,gBACLl6E,KAAKm6E,iBAELn6E,KAAKo6E,kBAAoB,EAGzBp6E,KAAKK,GAAK8F,OACVnG,KAAK+tB,EAAI,KACT/tB,KAAKigB,EAAI,KACTjgB,KAAK8uE,QAAS,EACd9uE,KAAK+uE,QAAS,EACd/uE,KAAKq6E,qBAAsB,EAC3Br6E,KAAKs6E,kBAAsB,EAC3Bt6E,KAAKu6E,gBAAkBN,EAAiBrW,MAAMr/B,OAC9CvkC,KAAKw6E,aAAc,EACnBx6E,KAAKiyD,MAAQ,GACbjyD,KAAKy6E,kBAAmB,EAGxBz6E,KAAK+5E,UAAYA,EACjB/5E,KAAKg6E,UAAYA,EAGjBh6E,KAAK06E,GAAK,EACV16E,KAAK26E,GAAK,EACV36E,KAAK46E,GAAK,EACV56E,KAAK66E,GAAK,EACV76E,KAAKwlE,QAAUyU,EAAiBhV,QAAQO,QACxCxlE,KAAKuzE,WAAaxlD,EAAE,KAAK9N,EAAE,MAG3BjgB,KAAK2xE,cAAcC,EAAY1J,GAG/BloE,KAAK86E,eACL96E,KAAK+6E,mBAAqB,EAC1B/6E,KAAKg7E,eAAiB,EACtBh7E,KAAKi7E,uBAA0BhB,EAAiBrU,WAAWa,YAAYl4C,MACvEvuB,KAAKk7E,wBAA0BjB,EAAiBrU,WAAWa,YAAYj4C,OACvExuB,KAAKm7E,wBAA0BlB,EAAiBrU,WAAWa,YAAYliC,OACvEvkC,KAAK0mE,sBAAwBuT,EAAiBrU,WAAWc,sBACzD1mE,KAAKo7E,gBAAkB,EAGvBp7E,KAAKq7E,gBAAkB,EACvBr7E,KAAKs7E,aAAe,EACpBt7E,KAAKspE,eAAiBv7C,EAAK,KAAM9N,EAAK,MACtCjgB,KAAKupE,mBAAqBx7C,EAAM,IAAK9N,EAAM,KAC3CjgB,KAAK+0E,aAAe,KAnFtB,GAAIp0E,GAAOT,EAAoB,EAyF/BiD,GAAKqR,UAAUsmE,aAAe,WAE5B96E,KAAKu7E,eAAiBp1E,OACtBnG,KAAKw7E,YAAc,EACnBx7E,KAAKy7E,kBACLz7E,KAAK07E,kBACL17E,KAAK27E,oBAOPx4E,EAAKqR,UAAUonE,WAAa,SAAS7K,GACH,IAA5B/wE,KAAKukE,MAAMj+D,QAAQyqE,IACrB/wE,KAAKukE,MAAMz8D,KAAKipE,GAEqB,IAAnC/wE,KAAKk6E,aAAa5zE,QAAQyqE,IAC5B/wE,KAAKk6E,aAAapyE,KAAKipE,GAEzB/wE,KAAK+6E,mBAAqB/6E,KAAKk6E,aAAa50E,QAO9CnC,EAAKqR,UAAUqnE,WAAa,SAAS9K,GACnC,GAAI9oE,GAAQjI,KAAKukE,MAAMj+D,QAAQyqE,EAClB,KAAT9oE,IACFjI,KAAKukE,MAAMr8D,OAAOD,EAAO,GACzBjI,KAAKk6E,aAAahyE,OAAOD,EAAO,IAElCjI,KAAK+6E,mBAAqB/6E,KAAKk6E,aAAa50E,QAS9CnC,EAAKqR,UAAUm9D,cAAgB,SAASC,EAAY1J,GAClD,GAAK0J,EAAL,CAIA,GAAIrkE,IAAU,cAAc,sBAAsB,QAAQ,QAAQ,SAAS,YACzE,WAAW,WAAW,QAAQ,OAmBhC,IAjBA5M,EAAKmF,oBAAoByH,EAAQvN,KAAK8N,QAAS8jE,GAE/C5xE,KAAK87E,cAAgB31E,OAECA,SAAlByrE,EAAWvxE,KAA0BL,KAAKK,GAAKuxE,EAAWvxE,IACrC8F,SAArByrE,EAAW9vC,QAA0B9hC,KAAK8hC,MAAQ8vC,EAAW9vC,MAAO9hC,KAAK87E,cAAgBlK,EAAW9vC,OAC/E37B,SAArByrE,EAAWvqB,QAA0BrnD,KAAKqnD,MAAQuqB,EAAWvqB,OAC5ClhD,SAAjByrE,EAAW7jD,IAA0B/tB,KAAK+tB,EAAI6jD,EAAW7jD,GACxC5nB,SAAjByrE,EAAW3xD,IAA0BjgB,KAAKigB,EAAI2xD,EAAW3xD,GACpC9Z,SAArByrE,EAAW5qE,QAA0BhH,KAAKgH,MAAQ4qE,EAAW5qE,OACxCb,SAArByrE,EAAW3f,QAA0BjyD,KAAKiyD,MAAQ2f,EAAW3f,MAAOjyD,KAAKy6E,kBAAmB,GAGzDt0E,SAAnCyrE,EAAWyI,sBAAoCr6E,KAAKq6E,oBAAsBzI,EAAWyI,qBAClDl0E,SAAnCyrE,EAAW0I,mBAAoCt6E,KAAKs6E,iBAAsB1I,EAAW0I,kBAClDn0E,SAAnCyrE,EAAWmK,kBAAoC/7E,KAAK+7E,gBAAsBnK,EAAWmK,iBAEzE51E,SAAZnG,KAAKK,GACP,KAAM,sBAIR,IAAkC,gBAAvBL,MAAK8N,QAAQkgB,OAAqD,gBAAvBhuB,MAAK8N,QAAQkgB,OAA4C,IAAtBhuB,KAAK8N,QAAQkgB,MAAc,CAClH,GAAIguD,GAAWh8E,KAAKg6E,UAAUthE,IAAI1Y,KAAK8N,QAAQkgB,MAC/C,KAAK,GAAIxoB,KAAQw2E,GACXA,EAASv2E,eAAeD,KAC1BxF,KAAK8N,QAAQtI,GAAQw2E,EAASx2E,IAUpC,GAH0BW,SAAtByrE,EAAWrtC,SAA+BvkC,KAAKu6E,gBAAkBv6E,KAAK8N,QAAQy2B,QACzDp+B,SAArByrE,EAAWnnE,QAA+BzK,KAAK8N,QAAQrD,MAAQ9J,EAAK6J,WAAWonE,EAAWnnE,QAEpEtE,SAAtBnG,KAAK8N,QAAQm2D,OAA2C,IAArBjkE,KAAK8N,QAAQm2D,MAAY,CAC9D,IAAIjkE,KAAK+5E,UAIP,KAAM,uBAHN/5E,MAAKi8E,SAAWj8E,KAAK+5E,UAAUL,KAAK15E,KAAK8N,QAAQm2D,OAkBrD,OAXAjkE,KAAK8uE,OAAS9uE,KAAK8uE,QAA4B3oE,SAAjByrE,EAAW7jD,IAAoB6jD,EAAWwD,eACxEp1E,KAAK+uE,OAAS/uE,KAAK+uE,QAA4B5oE,SAAjByrE,EAAW3xD,IAAoB2xD,EAAWyD,eACxEr1E,KAAKw6E,YAAcx6E,KAAKw6E,aAAsCr0E,SAAtByrE,EAAWrtC,OAEzB,SAAtBvkC,KAAK8N,QAAQk2D,QACfhkE,KAAK8N,QAAQg2D,UAAYoE,EAAUtE,MAAMpjC,SACzCxgC,KAAK8N,QAAQi2D,UAAYmE,EAAUtE,MAAMnjC,UAKnCzgC,KAAK8N,QAAQk2D,OACnB,IAAK,WAAiBhkE,KAAK+yE,KAAO/yE,KAAKk8E,cAAel8E,KAAKm8E,OAASn8E,KAAKo8E,eAAiB,MAC1F,KAAK,MAAiBp8E,KAAK+yE,KAAO/yE,KAAKq8E,SAAUr8E,KAAKm8E,OAASn8E,KAAKs8E,UAAY,MAChF,KAAK,SAAiBt8E,KAAK+yE,KAAO/yE,KAAKu8E,YAAav8E,KAAKm8E,OAASn8E,KAAKw8E,aAAe,MACtF,KAAK,UAAiBx8E,KAAK+yE,KAAO/yE,KAAKy8E,aAAcz8E,KAAKm8E,OAASn8E,KAAK08E,cAAgB,MAExF,KAAK,QAAiB18E,KAAK+yE,KAAO/yE,KAAK28E,WAAY38E,KAAKm8E,OAASn8E,KAAK48E,YAAc,MACpF,KAAK,OAAiB58E,KAAK+yE,KAAO/yE,KAAK68E,UAAW78E,KAAKm8E,OAASn8E,KAAK88E,WAAa,MAClF,KAAK,MAAiB98E,KAAK+yE,KAAO/yE,KAAK+8E,SAAU/8E,KAAKm8E,OAASn8E,KAAKg9E,YAAc,MAClF,KAAK,SAAiBh9E,KAAK+yE,KAAO/yE,KAAKi9E,YAAaj9E,KAAKm8E,OAASn8E,KAAKg9E,YAAc,MACrF,KAAK,WAAiBh9E,KAAK+yE,KAAO/yE,KAAKk9E,cAAel9E,KAAKm8E,OAASn8E,KAAKg9E,YAAc,MACvF,KAAK,eAAiBh9E,KAAK+yE,KAAO/yE,KAAKm9E,kBAAmBn9E,KAAKm8E,OAASn8E,KAAKg9E,YAAc,MAC3F,KAAK,OAAiBh9E,KAAK+yE,KAAO/yE,KAAKo9E,UAAWp9E,KAAKm8E,OAASn8E,KAAKg9E,YAAc,MACnF,SAAsBh9E,KAAK+yE,KAAO/yE,KAAKy8E,aAAcz8E,KAAKm8E,OAASn8E,KAAK08E,eAG1E18E,KAAKq9E,WAMPl6E,EAAKqR,UAAU41C,OAAS,WACtBpqD,KAAKssD,UAAW,EAChBtsD,KAAKq9E,UAMPl6E,EAAKqR,UAAU21C,SAAW,WACxBnqD,KAAKssD,UAAW,EAChBtsD,KAAKq9E,UAOPl6E,EAAKqR,UAAU8oE,eAAiB,WAC9Bt9E,KAAKq9E,UAOPl6E,EAAKqR,UAAU6oE,OAAS,WACtBr9E,KAAKuuB,MAAQpoB,OACbnG,KAAKwuB,OAASroB,QAQhBhD,EAAKqR,UAAUq8D,SAAW,WACxB,MAA6B,kBAAf7wE,MAAKqnD,MAAuBrnD,KAAKqnD,QAAUrnD,KAAKqnD,OAShElkD,EAAKqR,UAAU+oE,iBAAmB,SAAUl9C,EAAKsZ,GAC/C,GAAIjgB,GAAc,CAMlB,QAJK15B,KAAKuuB,OACRvuB,KAAKm8E,OAAO97C,GAGNrgC,KAAK8N,QAAQk2D,OACnB,IAAK,SACL,IAAK,MACH,MAAOhkE,MAAK8N,QAAQy2B,OAAQ7K,CAE9B,KAAK,UACH,GAAIx0B,GAAIlF,KAAKuuB,MAAQ,EACjBxoB,EAAI/F,KAAKwuB,OAAS,EAClBhS,EAAK3X,KAAKkzB,IAAI4hB,GAASz0C,EACvBgG,EAAKrG,KAAKqzB,IAAIyhB,GAAS5zC,CAC3B,OAAOb,GAAIa,EAAIlB,KAAK2jC,KAAKhsB,EAAIA,EAAItR,EAAIA,EAMvC,KAAK,MACL,IAAK,QACL,IAAK,OACL,QACE,MAAIlL,MAAKuuB,MACA1pB,KAAKwG,IACRxG,KAAK+O,IAAI5T,KAAKuuB,MAAQ,EAAI1pB,KAAKqzB,IAAIyhB,IACnC90C,KAAK+O,IAAI5T,KAAKwuB,OAAS,EAAI3pB,KAAKkzB,IAAI4hB,KAAWjgB,EAI5C,IAYfv2B,EAAKqR,UAAUgpE,UAAY,SAAS9C,EAAIC,GACtC36E,KAAK06E,GAAKA,EACV16E,KAAK26E,GAAKA,GASZx3E,EAAKqR,UAAUipE,UAAY,SAAS/C,EAAIC,GACtC36E,KAAK06E,IAAMA,EACX16E,KAAK26E,IAAMA,GAObx3E,EAAKqR,UAAUu/D,aAAe,SAAS7nC,GACrC,IAAKlsC,KAAK8uE,OAAQ,CAChB,GAAIv2C,GAAOv4B,KAAKwlE,QAAUxlE,KAAK46E,GAC3BrjD,GAAQv3B,KAAK06E,GAAKniD,GAAMv4B,KAAK8N,QAAQ+1D,IACzC7jE,MAAK46E,IAAMrjD,EAAK2U,EAChBlsC,KAAK+tB,GAAM/tB,KAAK46E,GAAK1uC,EAGvB,IAAKlsC,KAAK+uE,OAAQ,CAChB,GAAI9tD,GAAOjhB,KAAKwlE,QAAUxlE,KAAK66E,GAC3BrjD,GAAQx3B,KAAK26E,GAAK15D,GAAMjhB,KAAK8N,QAAQ+1D,IACzC7jE,MAAK66E,IAAMrjD,EAAK0U,EAChBlsC,KAAKigB,GAAMjgB,KAAK66E,GAAK3uC,IAWzB/oC,EAAKqR,UAAUs/D,oBAAsB,SAAS5nC,EAAUw7B,GACtD,GAAK1nE,KAAK8uE,OAQR9uE,KAAK06E,GAAK,MARM,CAChB,GAAIniD,GAAOv4B,KAAKwlE,QAAUxlE,KAAK46E,GAC3BrjD,GAAQv3B,KAAK06E,GAAKniD,GAAMv4B,KAAK8N,QAAQ+1D,IACzC7jE,MAAK46E,IAAMrjD,EAAK2U,EAChBlsC,KAAK46E,GAAM/1E,KAAK+O,IAAI5T,KAAK46E,IAAMlT,EAAiB1nE,KAAK46E,GAAK,EAAKlT,GAAeA,EAAe1nE,KAAK46E,GAClG56E,KAAK+tB,GAAM/tB,KAAK46E,GAAK1uC,EAMvB,GAAKlsC,KAAK+uE,OAQR/uE,KAAK26E,GAAK,MARM,CAChB,GAAI15D,GAAOjhB,KAAKwlE,QAAUxlE,KAAK66E,GAC3BrjD,GAAQx3B,KAAK26E,GAAK15D,GAAMjhB,KAAK8N,QAAQ+1D,IACzC7jE,MAAK66E,IAAMrjD,EAAK0U,EAChBlsC,KAAK66E,GAAMh2E,KAAK+O,IAAI5T,KAAK66E,IAAMnT,EAAiB1nE,KAAK66E,GAAK,EAAKnT,GAAeA,EAAe1nE,KAAK66E,GAClG76E,KAAKigB,GAAMjgB,KAAK66E,GAAK3uC,IAWzB/oC,EAAKqR,UAAUkpE,QAAU,WACvB,MAAQ19E,MAAK8uE,QAAU9uE,KAAK+uE,QAQ9B5rE,EAAKqR,UAAUk/D,SAAW,SAASD,GACjC,GAAI/5B,GAAW70C,KAAK2jC,KAAK3jC,KAAK0oC,IAAIvtC,KAAK46E,GAAG,GAAK/1E,KAAK0oC,IAAIvtC,KAAK66E,GAAG,GAEhE,OAAQnhC,GAAW+5B,GAOrBtwE,EAAKqR,UAAUk6D,WAAa,WAC1B,MAAO1uE,MAAKssD,UAOdnpD,EAAKqR,UAAU6b,SAAW,WACxB,MAAOrwB,MAAKgH,OASd7D,EAAKqR,UAAUsgC,YAAc,SAAS/mB,EAAG9N,GACvC,GAAIsY,GAAKv4B,KAAK+tB,EAAIA,EACd9M,EAAKjhB,KAAKigB,EAAIA,CAClB,OAAOpb,MAAK2jC,KAAKjQ,EAAKA,EAAKtX,EAAKA,IAUlC9d,EAAKqR,UAAU49D,cAAgB,SAAS/mE,EAAKyB,GAC3C,IAAK9M,KAAKw6E,aAA8Br0E,SAAfnG,KAAKgH,MAC5B,GAAI8F,GAAOzB,EACTrL,KAAK8N,QAAQy2B,QAASvkC,KAAK8N,QAAQg2D,UAAY9jE,KAAK8N,QAAQi2D,WAAa,MAEtE,CACH,GAAIltC,IAAS72B,KAAK8N,QAAQi2D,UAAY/jE,KAAK8N,QAAQg2D,YAAch3D,EAAMzB,EACvErL,MAAK8N,QAAQy2B,QAASvkC,KAAKgH,MAAQqE,GAAOwrB,EAAQ72B,KAAK8N,QAAQg2D,UAGnE9jE,KAAKu6E,gBAAkBv6E,KAAK8N,QAAQy2B,QAQtCphC,EAAKqR,UAAUu+D,KAAO,WACpB,KAAM,wCAQR5vE,EAAKqR,UAAU2nE,OAAS,WACtB,KAAM,0CAQRh5E,EAAKqR,UAAUs8D,kBAAoB,SAASpnD,GAC1C,MAAQ1pB,MAAKoH,KAAoBsiB,EAAIiX,OAC7B3gC,KAAKoH,KAAOpH,KAAKuuB,MAAQ7E,EAAItiB,MAC7BpH,KAAKwH,IAAoBkiB,EAAIqT,QAC7B/8B,KAAKwH,IAAMxH,KAAKwuB,OAAS9E,EAAIliB,KAGvCrE,EAAKqR,UAAUooE,aAAe,WAG5B,IAAK58E,KAAKuuB,QAAUvuB,KAAKwuB,OAAQ,CAC/B,GAAID,GAAOC,CACX,IAAIxuB,KAAKgH,MAAO,CACdhH,KAAK8N,QAAQy2B,OAAQvkC,KAAKu6E,eAC1B,IAAI1jD,GAAQ72B,KAAKi8E,SAASztD,OAASxuB,KAAKi8E,SAAS1tD,KACnCpoB,UAAV0wB,GACFtI,EAAQvuB,KAAK8N,QAAQy2B,QAASvkC,KAAKi8E,SAAS1tD,MAC5CC,EAASxuB,KAAK8N,QAAQy2B,OAAQ1N,GAAS72B,KAAKi8E,SAASztD,SAGrDD,EAAQ,EACRC,EAAS,OAIXD,GAAQvuB,KAAKi8E,SAAS1tD,MACtBC,EAASxuB,KAAKi8E,SAASztD,MAEzBxuB,MAAKuuB,MAASA,EACdvuB,KAAKwuB,OAASA,EAEdxuB,KAAKo7E,gBAAkB,EACnBp7E,KAAKuuB,MAAQ,GAAKvuB,KAAKwuB,OAAS,IAClCxuB,KAAKuuB,OAAU1pB,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAA0B1mE,KAAKi7E,uBAClFj7E,KAAKwuB,QAAU3pB,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAAyB1mE,KAAKk7E,wBACjFl7E,KAAK8N,QAAQy2B,QAAS1/B,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAAyB1mE,KAAKm7E,wBACxFn7E,KAAKo7E,gBAAkBp7E,KAAKuuB,MAAQA,KAM1CprB,EAAKqR,UAAUmoE,WAAa,SAAUt8C,GACpCrgC,KAAK48E,aAAav8C,GAElBrgC,KAAKoH,KAASpH,KAAK+tB,EAAI/tB,KAAKuuB,MAAQ,EACpCvuB,KAAKwH,IAASxH,KAAKigB,EAAIjgB,KAAKwuB,OAAS,CAErC,IAAI0F,EACJ,IAA2B,GAAvBl0B,KAAKi8E,SAAS1tD,MAAa,CAE7B,GAAIvuB,KAAKw7E,YAAc,EAAG,CACxB,GAAI56C,GAAc5gC,KAAKw7E,YAAc,EAAK,GAAK,CAC/C56C,IAAa5gC,KAAKq7E,gBAClBz6C,EAAY/7B,KAAKwG,IAAI,GAAMrL,KAAKuuB,MAAMqS,GAEtCP,EAAIs9C,YAAc,GAClBt9C,EAAIu9C,UAAU59E,KAAKi8E,SAAUj8E,KAAKoH,KAAOw5B,EAAW5gC,KAAKwH,IAAMo5B,EAAW5gC,KAAKuuB,MAAQ,EAAEqS,EAAW5gC,KAAKwuB,OAAS,EAAEoS,GAItHP,EAAIs9C,YAAc,EAClBt9C,EAAIu9C,UAAU59E,KAAKi8E,SAAUj8E,KAAKoH,KAAMpH,KAAKwH,IAAKxH,KAAKuuB,MAAOvuB,KAAKwuB,QACnE0F,EAASl0B,KAAKigB,EAAIjgB,KAAKwuB,OAAS,MAIhC0F,GAASl0B,KAAKigB,CAGhBjgB,MAAK69E,OAAOx9C,EAAKrgC,KAAK8hC,MAAO9hC,KAAK+tB,EAAGmG,EAAQ/tB,OAAW,QAI1DhD,EAAKqR,UAAU8nE,WAAa,SAAUj8C,GACpC,IAAKrgC,KAAKuuB,MAAO,CACf,GAAIuF,GAAS,EACTgqD,EAAW99E,KAAK+9E,YAAY19C,EAChCrgC,MAAKuuB,MAAQuvD,EAASvvD,MAAQ,EAAIuF,EAClC9zB,KAAKwuB,OAASsvD,EAAStvD,OAAS,EAAIsF,EAEpC9zB,KAAKuuB,OAAuE,GAA7D1pB,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAA+B1mE,KAAKi7E,uBACvFj7E,KAAKwuB,QAAuE,GAA7D3pB,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAA+B1mE,KAAKk7E,wBACvFl7E,KAAKo7E,gBAAkBp7E,KAAKuuB,OAASuvD,EAASvvD,MAAQ,EAAIuF,KAM9D3wB,EAAKqR,UAAU6nE,SAAW,SAAUh8C,GAClCrgC,KAAKs8E,WAAWj8C,GAEhBrgC,KAAKoH,KAAOpH,KAAK+tB,EAAI/tB,KAAKuuB,MAAQ,EAClCvuB,KAAKwH,IAAMxH,KAAKigB,EAAIjgB,KAAKwuB,OAAS,CAElC,IAAIwvD,GAAmB,IACnBtkD,EAAc15B,KAAK8N,QAAQ4rB,YAC3BukD,EAAqBj+E,KAAK8N,QAAQowE,qBAAuB,EAAIl+E,KAAK8N,QAAQ4rB,WAE9E2G,GAAIY,YAAcjhC,KAAKssD,SAAWtsD,KAAK8N,QAAQrD,MAAMmB,UAAUD,OAAS3L,KAAK6L,MAAQ7L,KAAK8N,QAAQrD,MAAMoB,MAAMF,OAAS3L,KAAK8N,QAAQrD,MAAMkB,OAGtI3L,KAAKw7E,YAAc,IACrBn7C,EAAIO,WAAa5gC,KAAKssD,SAAW2xB,EAAqBvkD,IAAiB15B,KAAKw7E,YAAc,EAAKwC,EAAmB,GAClH39C,EAAIO,WAAa5gC,KAAKq7E,gBACtBh7C,EAAIO,UAAY/7B,KAAKwG,IAAIrL,KAAKuuB,MAAM8R,EAAIO,WAExCP,EAAI89C,UAAUn+E,KAAKoH,KAAK,EAAEi5B,EAAIO,UAAW5gC,KAAKwH,IAAI,EAAE64B,EAAIO,UAAW5gC,KAAKuuB,MAAM,EAAE8R,EAAIO,UAAW5gC,KAAKwuB,OAAO,EAAE6R,EAAIO,UAAW5gC,KAAK8N,QAAQy2B,QACzIlE,EAAI9G,UAEN8G,EAAIO,WAAa5gC,KAAKssD,SAAW2xB,EAAqBvkD,IAAiB15B,KAAKw7E,YAAc,EAAKwC,EAAmB,GAClH39C,EAAIO,WAAa5gC,KAAKq7E,gBACtBh7C,EAAIO,UAAY/7B,KAAKwG,IAAIrL,KAAKuuB,MAAM8R,EAAIO,WAExCP,EAAIiB,UAAYthC,KAAKssD,SAAWtsD,KAAK8N,QAAQrD,MAAMmB,UAAUF,WAAa1L,KAAK8N,QAAQrD,MAAMiB,WAE7F20B,EAAI89C,UAAUn+E,KAAKoH,KAAMpH,KAAKwH,IAAKxH,KAAKuuB,MAAOvuB,KAAKwuB,OAAQxuB,KAAK8N,QAAQy2B,QACzElE,EAAI/G,OACJ+G,EAAI9G,SAEJv5B,KAAK69E,OAAOx9C,EAAKrgC,KAAK8hC,MAAO9hC,KAAK+tB,EAAG/tB,KAAKigB,IAI5C9c,EAAKqR,UAAU4nE,gBAAkB,SAAU/7C,GACzC,IAAKrgC,KAAKuuB,MAAO,CACf,GAAIuF,GAAS,EACTgqD,EAAW99E,KAAK+9E,YAAY19C,GAC5BhS,EAAOyvD,EAASvvD,MAAQ,EAAIuF,CAChC9zB,MAAKuuB,MAAQF,EACbruB,KAAKwuB,OAASH,EAGdruB,KAAKuuB,OAAU1pB,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAAyB1mE,KAAKi7E,uBACjFj7E,KAAKwuB,QAAU3pB,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAAyB1mE,KAAKk7E,wBACjFl7E,KAAK8N,QAAQy2B,QAAS1/B,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAAyB1mE,KAAKm7E,wBACxFn7E,KAAKo7E,gBAAkBp7E,KAAKuuB,MAAQF,IAIxClrB,EAAKqR,UAAU0nE,cAAgB,SAAU77C,GACvCrgC,KAAKo8E,gBAAgB/7C,GACrBrgC,KAAKoH,KAAOpH,KAAK+tB,EAAI/tB,KAAKuuB,MAAQ,EAClCvuB,KAAKwH,IAAMxH,KAAKigB,EAAIjgB,KAAKwuB,OAAS,CAElC,IAAIwvD,GAAmB,IACnBtkD,EAAc15B,KAAK8N,QAAQ4rB,YAC3BukD,EAAqBj+E,KAAK8N,QAAQowE,qBAAuB,EAAIl+E,KAAK8N,QAAQ4rB,WAE9E2G,GAAIY,YAAcjhC,KAAKssD,SAAWtsD,KAAK8N,QAAQrD,MAAMmB,UAAUD,OAAS3L,KAAK6L,MAAQ7L,KAAK8N,QAAQrD,MAAMoB,MAAMF,OAAS3L,KAAK8N,QAAQrD,MAAMkB,OAGtI3L,KAAKw7E,YAAc,IACrBn7C,EAAIO,WAAa5gC,KAAKssD,SAAW2xB,EAAqBvkD,IAAiB15B,KAAKw7E,YAAc,EAAKwC,EAAmB,GAClH39C,EAAIO,WAAa5gC,KAAKq7E,gBACtBh7C,EAAIO,UAAY/7B,KAAKwG,IAAIrL,KAAKuuB,MAAM8R,EAAIO,WAExCP,EAAI+9C,SAASp+E,KAAK+tB,EAAI/tB,KAAKuuB,MAAM,EAAI,EAAE8R,EAAIO,UAAW5gC,KAAKigB,EAAgB,GAAZjgB,KAAKwuB,OAAa,EAAE6R,EAAIO,UAAW5gC,KAAKuuB,MAAQ,EAAE8R,EAAIO,UAAW5gC,KAAKwuB,OAAS,EAAE6R,EAAIO,WACpJP,EAAI9G,UAEN8G,EAAIO,WAAa5gC,KAAKssD,SAAW2xB,EAAqBvkD,IAAiB15B,KAAKw7E,YAAc,EAAKwC,EAAmB,GAClH39C,EAAIO,WAAa5gC,KAAKq7E,gBACtBh7C,EAAIO,UAAY/7B,KAAKwG,IAAIrL,KAAKuuB,MAAM8R,EAAIO,WAExCP,EAAIiB,UAAYthC,KAAKssD,SAAWtsD,KAAK8N,QAAQrD,MAAMmB,UAAUF,WAAa1L,KAAK6L,MAAQ7L,KAAK8N,QAAQrD,MAAMoB,MAAMH,WAAa1L,KAAK8N,QAAQrD,MAAMiB,WAChJ20B,EAAI+9C,SAASp+E,KAAK+tB,EAAI/tB,KAAKuuB,MAAM,EAAGvuB,KAAKigB,EAAgB,GAAZjgB,KAAKwuB,OAAYxuB,KAAKuuB,MAAOvuB,KAAKwuB,QAC/E6R,EAAI/G,OACJ+G,EAAI9G,SAEJv5B,KAAK69E,OAAOx9C,EAAKrgC,KAAK8hC,MAAO9hC,KAAK+tB,EAAG/tB,KAAKigB,IAI5C9c,EAAKqR,UAAUgoE,cAAgB,SAAUn8C,GACvC,IAAKrgC,KAAKuuB,MAAO,CACf,GAAIuF,GAAS,EACTgqD,EAAW99E,KAAK+9E,YAAY19C,GAC5Bg+C,EAAWx5E,KAAKiI,IAAIgxE,EAASvvD,MAAOuvD,EAAStvD,QAAU,EAAIsF,CAC/D9zB,MAAK8N,QAAQy2B,OAAS85C,EAAW,EAEjCr+E,KAAKuuB,MAAQ8vD,EACbr+E,KAAKwuB,OAAS6vD,EAKdr+E,KAAK8N,QAAQy2B,QAAuE,GAA7D1/B,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAA+B1mE,KAAKm7E,wBAC/Fn7E,KAAKo7E,gBAAkBp7E,KAAK8N,QAAQy2B,OAAQ,GAAI85C,IAIpDl7E,EAAKqR,UAAU+nE,YAAc,SAAUl8C,GACrCrgC,KAAKw8E,cAAcn8C,GACnBrgC,KAAKoH,KAAOpH,KAAK+tB,EAAI/tB,KAAKuuB,MAAQ,EAClCvuB,KAAKwH,IAAMxH,KAAKigB,EAAIjgB,KAAKwuB,OAAS,CAElC,IAAIwvD,GAAmB,IACnBtkD,EAAc15B,KAAK8N,QAAQ4rB,YAC3BukD,EAAqBj+E,KAAK8N,QAAQowE,qBAAuB,EAAIl+E,KAAK8N,QAAQ4rB,WAE9E2G,GAAIY,YAAcjhC,KAAKssD,SAAWtsD,KAAK8N,QAAQrD,MAAMmB,UAAUD,OAAS3L,KAAK6L,MAAQ7L,KAAK8N,QAAQrD,MAAMoB,MAAMF,OAAS3L,KAAK8N,QAAQrD,MAAMkB,OAGtI3L,KAAKw7E,YAAc,IACrBn7C,EAAIO,WAAa5gC,KAAKssD,SAAW2xB,EAAqBvkD,IAAiB15B,KAAKw7E,YAAc,EAAKwC,EAAmB,GAClH39C,EAAIO,WAAa5gC,KAAKq7E,gBACtBh7C,EAAIO,UAAY/7B,KAAKwG,IAAIrL,KAAKuuB,MAAM8R,EAAIO,WAExCP,EAAIi+C,OAAOt+E,KAAK+tB,EAAG/tB,KAAKigB,EAAGjgB,KAAK8N,QAAQy2B,OAAO,EAAElE,EAAIO,WACrDP,EAAI9G,UAEN8G,EAAIO,WAAa5gC,KAAKssD,SAAW2xB,EAAqBvkD,IAAiB15B,KAAKw7E,YAAc,EAAKwC,EAAmB,GAClH39C,EAAIO,WAAa5gC,KAAKq7E,gBACtBh7C,EAAIO,UAAY/7B,KAAKwG,IAAIrL,KAAKuuB,MAAM8R,EAAIO,WAExCP,EAAIiB,UAAYthC,KAAKssD,SAAWtsD,KAAK8N,QAAQrD,MAAMmB,UAAUF,WAAa1L,KAAK6L,MAAQ7L,KAAK8N,QAAQrD,MAAMoB,MAAMH,WAAa1L,KAAK8N,QAAQrD,MAAMiB,WAChJ20B,EAAIi+C,OAAOt+E,KAAK+tB,EAAG/tB,KAAKigB,EAAGjgB,KAAK8N,QAAQy2B,QACxClE,EAAI/G,OACJ+G,EAAI9G,SAEJv5B,KAAK69E,OAAOx9C,EAAKrgC,KAAK8hC,MAAO9hC,KAAK+tB,EAAG/tB,KAAKigB,IAG5C9c,EAAKqR,UAAUkoE,eAAiB,SAAUr8C,GACxC,IAAKrgC,KAAKuuB,MAAO,CACf,GAAIuvD,GAAW99E,KAAK+9E,YAAY19C,EAEhCrgC,MAAKuuB,MAAyB,IAAjBuvD,EAASvvD,MACtBvuB,KAAKwuB,OAA2B,EAAlBsvD,EAAStvD,OACnBxuB,KAAKuuB,MAAQvuB,KAAKwuB,SACpBxuB,KAAKuuB,MAAQvuB,KAAKwuB,OAEpB,IAAI+vD,GAAcv+E,KAAKuuB,KAGvBvuB,MAAKuuB,OAAU1pB,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAAyB1mE,KAAKi7E,uBACjFj7E,KAAKwuB,QAAU3pB,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAAyB1mE,KAAKk7E,wBACjFl7E,KAAK8N,QAAQy2B,QAAU1/B,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAAyB1mE,KAAKm7E,wBACzFn7E,KAAKo7E,gBAAkBp7E,KAAKuuB,MAAQgwD,IAIxCp7E,EAAKqR,UAAUioE,aAAe,SAAUp8C,GACtCrgC,KAAK08E,eAAer8C,GACpBrgC,KAAKoH,KAAOpH,KAAK+tB,EAAI/tB,KAAKuuB,MAAQ,EAClCvuB,KAAKwH,IAAMxH,KAAKigB,EAAIjgB,KAAKwuB,OAAS,CAElC,IAAIwvD,GAAmB,IACnBtkD,EAAc15B,KAAK8N,QAAQ4rB,YAC3BukD,EAAqBj+E,KAAK8N,QAAQowE,qBAAuB,EAAIl+E,KAAK8N,QAAQ4rB,WAE9E2G,GAAIY,YAAcjhC,KAAKssD,SAAWtsD,KAAK8N,QAAQrD,MAAMmB,UAAUD,OAAS3L,KAAK6L,MAAQ7L,KAAK8N,QAAQrD,MAAMoB,MAAMF,OAAS3L,KAAK8N,QAAQrD,MAAMkB,OAGtI3L,KAAKw7E,YAAc,IACrBn7C,EAAIO,WAAa5gC,KAAKssD,SAAW2xB,EAAqBvkD,IAAiB15B,KAAKw7E,YAAc,EAAKwC,EAAmB,GAClH39C,EAAIO,WAAa5gC,KAAKq7E,gBACtBh7C,EAAIO,UAAY/7B,KAAKwG,IAAIrL,KAAKuuB,MAAM8R,EAAIO,WAExCP,EAAIm+C,QAAQx+E,KAAKoH,KAAK,EAAEi5B,EAAIO,UAAW5gC,KAAKwH,IAAI,EAAE64B,EAAIO,UAAW5gC,KAAKuuB,MAAM,EAAE8R,EAAIO,UAAW5gC,KAAKwuB,OAAO,EAAE6R,EAAIO,WAC/GP,EAAI9G,UAEN8G,EAAIO,WAAa5gC,KAAKssD,SAAW2xB,EAAqBvkD,IAAiB15B,KAAKw7E,YAAc,EAAKwC,EAAmB,GAClH39C,EAAIO,WAAa5gC,KAAKq7E,gBACtBh7C,EAAIO,UAAY/7B,KAAKwG,IAAIrL,KAAKuuB,MAAM8R,EAAIO,WAExCP,EAAIiB,UAAYthC,KAAKssD,SAAWtsD,KAAK8N,QAAQrD,MAAMmB,UAAUF,WAAa1L,KAAK6L,MAAQ7L,KAAK8N,QAAQrD,MAAMoB,MAAMH,WAAa1L,KAAK8N,QAAQrD,MAAMiB,WAEhJ20B,EAAIm+C,QAAQx+E,KAAKoH,KAAMpH,KAAKwH,IAAKxH,KAAKuuB,MAAOvuB,KAAKwuB,QAClD6R,EAAI/G,OACJ+G,EAAI9G,SACJv5B,KAAK69E,OAAOx9C,EAAKrgC,KAAK8hC,MAAO9hC,KAAK+tB,EAAG/tB,KAAKigB,IAG5C9c,EAAKqR,UAAUuoE,SAAW,SAAU18C,GAClCrgC,KAAKy+E,WAAWp+C,EAAK,WAGvBl9B,EAAKqR,UAAU0oE,cAAgB,SAAU78C,GACvCrgC,KAAKy+E,WAAWp+C,EAAK,aAGvBl9B,EAAKqR,UAAU2oE,kBAAoB,SAAU98C,GAC3CrgC,KAAKy+E,WAAWp+C,EAAK,iBAGvBl9B,EAAKqR,UAAUyoE,YAAc,SAAU58C,GACrCrgC,KAAKy+E,WAAWp+C,EAAK,WAGvBl9B,EAAKqR,UAAU4oE,UAAY,SAAU/8C,GACnCrgC,KAAKy+E,WAAWp+C,EAAK,SAGvBl9B,EAAKqR,UAAUwoE,aAAe,WAC5B,IAAKh9E,KAAKuuB,MAAO,CACfvuB,KAAK8N,QAAQy2B,OAAQvkC,KAAKu6E,eAC1B,IAAIlsD,GAAO,EAAIruB,KAAK8N,QAAQy2B,MAC5BvkC,MAAKuuB,MAAQF,EACbruB,KAAKwuB,OAASH,EAGdruB,KAAKuuB,OAAU1pB,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAAyB1mE,KAAKi7E,uBACjFj7E,KAAKwuB,QAAU3pB,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAAyB1mE,KAAKk7E,wBACjFl7E,KAAK8N,QAAQy2B,QAAsE,GAA7D1/B,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAA+B1mE,KAAKm7E,wBAC9Fn7E,KAAKo7E,gBAAkBp7E,KAAKuuB,MAAQF,IAIxClrB,EAAKqR,UAAUiqE,WAAa,SAAUp+C,EAAK2jC,GACzChkE,KAAKg9E,aAAa38C,GAElBrgC,KAAKoH,KAAOpH,KAAK+tB,EAAI/tB,KAAKuuB,MAAQ,EAClCvuB,KAAKwH,IAAMxH,KAAKigB,EAAIjgB,KAAKwuB,OAAS,CAElC,IAAIwvD,GAAmB,IACnBtkD,EAAc15B,KAAK8N,QAAQ4rB,YAC3BukD,EAAqBj+E,KAAK8N,QAAQowE,qBAAuB,EAAIl+E,KAAK8N,QAAQ4rB,YAC1EglD,EAAmB,CAGvB,QAAQ1a,GACN,IAAK,MAAiB0a,EAAmB,CAAG,MAC5C,KAAK,SAAiBA,EAAmB,CAAG,MAC5C,KAAK,WAAiBA,EAAmB,CAAG,MAC5C,KAAK,eAAiBA,EAAmB,CAAG,MAC5C,KAAK,OAAiBA,EAAmB,EAG3Cr+C,EAAIY,YAAcjhC,KAAKssD,SAAWtsD,KAAK8N,QAAQrD,MAAMmB,UAAUD,OAAS3L,KAAK6L,MAAQ7L,KAAK8N,QAAQrD,MAAMoB,MAAMF,OAAS3L,KAAK8N,QAAQrD,MAAMkB,OAEtI3L,KAAKw7E,YAAc,IACrBn7C,EAAIO,WAAa5gC,KAAKssD,SAAW2xB,EAAqBvkD,IAAiB15B,KAAKw7E,YAAc,EAAKwC,EAAmB,GAClH39C,EAAIO,WAAa5gC,KAAKq7E,gBACtBh7C,EAAIO,UAAY/7B,KAAKwG,IAAIrL,KAAKuuB,MAAM8R,EAAIO,WAExCP,EAAI2jC,GAAOhkE,KAAK+tB,EAAG/tB,KAAKigB,EAAGjgB,KAAK8N,QAAQy2B,OAAQm6C,EAAmBr+C,EAAIO,WACvEP,EAAI9G,UAEN8G,EAAIO,WAAa5gC,KAAKssD,SAAW2xB,EAAqBvkD,IAAiB15B,KAAKw7E,YAAc,EAAKwC,EAAmB,GAClH39C,EAAIO,WAAa5gC,KAAKq7E,gBACtBh7C,EAAIO,UAAY/7B,KAAKwG,IAAIrL,KAAKuuB,MAAM8R,EAAIO,WAExCP,EAAIiB,UAAYthC,KAAKssD,SAAWtsD,KAAK8N,QAAQrD,MAAMmB,UAAUF,WAAa1L,KAAK6L,MAAQ7L,KAAK8N,QAAQrD,MAAMoB,MAAMH,WAAa1L,KAAK8N,QAAQrD,MAAMiB,WAChJ20B,EAAI2jC,GAAOhkE,KAAK+tB,EAAG/tB,KAAKigB,EAAGjgB,KAAK8N,QAAQy2B,QACxClE,EAAI/G,OACJ+G,EAAI9G,SAEAv5B,KAAK8hC,OACP9hC,KAAK69E,OAAOx9C,EAAKrgC,KAAK8hC,MAAO9hC,KAAK+tB,EAAG/tB,KAAKigB,EAAIjgB,KAAKwuB,OAAS,EAAGroB,OAAW,OAAM,IAIpFhD,EAAKqR,UAAUsoE,YAAc,SAAUz8C,GACrC,IAAKrgC,KAAKuuB,MAAO,CACf,GAAIuF,GAAS,EACTgqD,EAAW99E,KAAK+9E,YAAY19C,EAChCrgC,MAAKuuB,MAAQuvD,EAASvvD,MAAQ,EAAIuF,EAClC9zB,KAAKwuB,OAASsvD,EAAStvD,OAAS,EAAIsF,EAGpC9zB,KAAKuuB,OAAU1pB,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAAyB1mE,KAAKi7E,uBACjFj7E,KAAKwuB,QAAU3pB,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAAyB1mE,KAAKk7E,wBACjFl7E,KAAK8N,QAAQy2B,QAAS1/B,KAAKwG,IAAIrL,KAAKw7E,YAAc,EAAGx7E,KAAK0mE,uBAAyB1mE,KAAKm7E,wBACxFn7E,KAAKo7E,gBAAkBp7E,KAAKuuB,OAASuvD,EAASvvD,MAAQ,EAAIuF,KAI9D3wB,EAAKqR,UAAUqoE,UAAY,SAAUx8C,GACnCrgC,KAAK88E,YAAYz8C,GACjBrgC,KAAKoH,KAAOpH,KAAK+tB,EAAI/tB,KAAKuuB,MAAQ,EAClCvuB,KAAKwH,IAAMxH,KAAKigB,EAAIjgB,KAAKwuB,OAAS,EAElCxuB,KAAK69E,OAAOx9C,EAAKrgC,KAAK8hC,MAAO9hC,KAAK+tB,EAAG/tB,KAAKigB,IAI5C9c,EAAKqR,UAAUqpE,OAAS,SAAUx9C,EAAKsC,EAAM5U,EAAG9N,EAAG2nC,EAAO+2B,EAAUC,GAClE,GAAIj8C,GAAQ9+B,OAAO7D,KAAK8N,QAAQs2D,UAAYpkE,KAAKs7E,aAAet7E,KAAKo6E,kBAAmB,CACtF/5C,EAAIQ,MAAQ7gC,KAAKssD,SAAW,QAAU,IAAMtsD,KAAK8N,QAAQs2D,SAAW,MAAQpkE,KAAK8N,QAAQu2D,SACzFhkC,EAAIiB,UAAYthC,KAAK8N,QAAQq2D,WAAa,QAC1C9jC,EAAIsB,UAAYimB,GAAS,SACzBvnB,EAAIuB,aAAe+8C,GAAY,QAE/B,IAAIllB,GAAQ92B,EAAK96B,MAAM,MACnBg3E,EAAYplB,EAAMn0D,OAClB8+D,EAAYvgE,OAAO7D,KAAK8N,QAAQs2D,UAAY,EAC5C0a,EAAQ7+D,GAAK,EAAI4+D,GAAa,EAAIza,CAChB,IAAlBwa,IACFE,EAAQ7+D,GAAK,EAAI4+D,IAAc,EAAIza,GAGrC,KAAK,GAAIj/D,GAAI,EAAO05E,EAAJ15E,EAAeA,IAC7Bk7B,EAAIwB,SAAS43B,EAAMt0D,GAAI4oB,EAAG+wD,GAC1BA,GAAS1a,IAMfjhE,EAAKqR,UAAUupE,YAAc,SAAS19C,GACpC,GAAmBl6B,SAAfnG,KAAK8hC,MAAqB,CAC5BzB,EAAIQ,MAAQ7gC,KAAKssD,SAAW,QAAU,IAAMtsD,KAAK8N,QAAQs2D,SAAW,MAAQpkE,KAAK8N,QAAQu2D,QAMzF,KAAK,GAJD5K,GAAQz5D,KAAK8hC,MAAMj6B,MAAM,MACzB2mB,GAAU3qB,OAAO7D,KAAK8N,QAAQs2D,UAAY,GAAK3K,EAAMn0D,OACrDipB,EAAQ,EAEHppB,EAAI,EAAG0pD,EAAO4K,EAAMn0D,OAAYupD,EAAJ1pD,EAAUA,IAC7CopB,EAAQ1pB,KAAKiI,IAAIyhB,EAAO8R,EAAI0+C,YAAYtlB,EAAMt0D,IAAIopB,MAGpD,QAAQA,MAASA,EAAOC,OAAUA,GAGlC,OAAQD,MAAS,EAAGC,OAAU,IAUlCrrB,EAAKqR,UAAUs+D,OAAS,WACtB,MAAmB3sE,UAAfnG,KAAKuuB,MACDvuB,KAAK+tB,EAAI/tB,KAAKuuB,MAAOvuB,KAAKq7E,iBAAoBr7E,KAAKspE,cAAcv7C,GACjE/tB,KAAK+tB,EAAI/tB,KAAKuuB,MAAOvuB,KAAKq7E,gBAAoBr7E,KAAKupE,kBAAkBx7C,GACrE/tB,KAAKigB,EAAIjgB,KAAKwuB,OAAOxuB,KAAKq7E,iBAAoBr7E,KAAKspE,cAAcrpD,GACjEjgB,KAAKigB,EAAIjgB,KAAKwuB,OAAOxuB,KAAKq7E,gBAAoBr7E,KAAKupE,kBAAkBtpD,GAGpE,GAQX9c,EAAKqR,UAAUwqE,OAAS,WACtB,MAAQh/E,MAAK+tB,GAAK/tB,KAAKspE,cAAcv7C,GAC7B/tB,KAAK+tB,EAAI/tB,KAAKupE,kBAAkBx7C,GAChC/tB,KAAKigB,GAAKjgB,KAAKspE,cAAcrpD,GAC7BjgB,KAAKigB,EAAIjgB,KAAKupE,kBAAkBtpD,GAW1C9c,EAAKqR,UAAUq+D,eAAiB,SAASh8C,EAAMyyC,EAAcC,GAC3DvpE,KAAKq7E,gBAAkB,EAAIxkD,EAC3B72B,KAAKs7E,aAAezkD,EACpB72B,KAAKspE,cAAgBA,EACrBtpE,KAAKupE,kBAAoBA,GAS3BpmE,EAAKqR,UAAUgyC,SAAW,SAAS3vB,GACjC72B,KAAKq7E,gBAAkB,EAAIxkD,EAC3B72B,KAAKs7E,aAAezkD,GAQtB1zB,EAAKqR,UAAUyqE,cAAgB,WAC7Bj/E,KAAK46E,GAAK,EACV56E,KAAK66E,GAAK,GASZ13E,EAAKqR,UAAU0qE,eAAiB,SAASC,GACvC,GAAIC,GAAep/E,KAAK46E,GAAK56E,KAAK46E,GAAKuE,CAEvCn/E,MAAK46E,GAAK/1E,KAAK2jC,KAAK42C,EAAap/E,KAAK8N,QAAQ+1D,MAC9Cub,EAAep/E,KAAK66E,GAAK76E,KAAK66E,GAAKsE,EAEnCn/E,KAAK66E,GAAKh2E,KAAK2jC,KAAK42C,EAAap/E,KAAK8N,QAAQ+1D,OAGhDhkE,EAAOD,QAAUuD,GAKb,SAAStD,EAAQD,EAASM,GAoB9B,QAAS8C,GAAM4uE,EAAY7uE,EAASk3E,GAClC,IAAKl3E,EACH,KAAM,qBAER,IAAIwK,IAAU,QAAQ,WAClB26D,EAAYvnE,EAAK2M,sBAAsBC,EAAO0sE,EAClDj6E,MAAK8N,QAAUo6D,EAAU3D,MACzBvkE,KAAKilE,QAAUiD,EAAUjD,QACzBjlE,KAAK8N,QAAsB,aAAImsE,EAA+B,aAG9Dj6E,KAAK+C,QAAUA,EAGf/C,KAAKK,GAAS8F,OACdnG,KAAKq/E,OAASl5E,OACdnG,KAAKs/E,KAASn5E,OACdnG,KAAKqnD,MAASlhD,OACdnG,KAAKu/E,cAAgBv/E,KAAK8N,QAAQygB,MAAQvuB,KAAK8N,QAAQ02D,yBACvDxkE,KAAKgH,MAASb,OACdnG,KAAKssD,UAAW,EAChBtsD,KAAK6L,OAAQ,EAEb7L,KAAKwqB,KAAO,KACZxqB,KAAKyiC,GAAK,KACVziC,KAAKkyE,IAAM,KAIXlyE,KAAKw/E,kBACLx/E,KAAKy/E,gBAELz/E,KAAKgxE,WAAY,EAEjBhxE,KAAK0/E,YAAc,EACnB1/E,KAAK2/E,aAAc,EAEnB3/E,KAAK2xE,cAAcC,GAEnB5xE,KAAK4/E,qBAAsB,EAC3B5/E,KAAK6/E,cAAgBr1D,KAAK,KAAMiY,GAAG,KAAMq9C,cACzC9/E,KAAK+/E,cAAgB,KA3DvB,GAAIp/E,GAAOT,EAAoB,GAC3BiD,EAAOjD,EAAoB,GAkE/B8C,GAAKwR,UAAUm9D,cAAgB,SAASC,GACtC,GAAKA,EAAL,CAIA,GAAIrkE,IAAU,QAAQ,WAAW,WAAW,YAAY,WAAW,QACjE,2BAA2B,aAAa,mBAAmB,OAyC7D,QAvCA5M,EAAKmF,oBAAoByH,EAAQvN,KAAK8N,QAAS8jE,GAEvBzrE,SAApByrE,EAAWpnD,OAA+BxqB,KAAKq/E,OAASzN,EAAWpnD,MACjDrkB,SAAlByrE,EAAWnvC,KAA+BziC,KAAKs/E,KAAO1N,EAAWnvC,IAE/Ct8B,SAAlByrE,EAAWvxE,KAA+BL,KAAKK,GAAKuxE,EAAWvxE,IAC1C8F,SAArByrE,EAAW9vC,QAA+B9hC,KAAK8hC,MAAQ8vC,EAAW9vC,OAE7C37B,SAArByrE,EAAWvqB,QAA6BrnD,KAAKqnD,MAAQuqB,EAAWvqB,OAC3ClhD,SAArByrE,EAAW5qE,QAA6BhH,KAAKgH,MAAQ4qE,EAAW5qE,OAC1Cb,SAAtByrE,EAAWtsE,SAA6BtF,KAAKilE,QAAQK,aAAesM,EAAWtsE,QAG/Ca,SAAhCyrE,EAAWjN,mBAAuC3kE,KAAK8N,QAAQ62D,iBAAmBiN,EAAWjN,kBAEjEx+D,SAA5ByrE,EAAW7M,eAAmC/kE,KAAK8N,QAAQi3D,aAAe6M,EAAW7M,cAEhE5+D,SAArByrE,EAAWnnE,QACbzK,KAAK8N,QAAQi3D,cAAe,EACxBpkE,EAAKmD,SAAS8tE,EAAWnnE,QAC3BzK,KAAK8N,QAAQrD,MAAMA,MAAQmnE,EAAWnnE,MACtCzK,KAAK8N,QAAQrD,MAAMmB,UAAYgmE,EAAWnnE,QAGXtE,SAA3ByrE,EAAWnnE,MAAMA,QAA0BzK,KAAK8N,QAAQrD,MAAMA,MAAQmnE,EAAWnnE,MAAMA,OACxDtE,SAA/ByrE,EAAWnnE,MAAMmB,YAA0B5L,KAAK8N,QAAQrD,MAAMmB,UAAYgmE,EAAWnnE,MAAMmB,WAChEzF,SAA3ByrE,EAAWnnE,MAAMoB,QAA0B7L,KAAK8N,QAAQrD,MAAMoB,MAAQ+lE,EAAWnnE,MAAMoB,SAK/F7L,KAAK0jE,UAEL1jE,KAAK0/E,WAAa1/E,KAAK0/E,YAAoCv5E,SAArByrE,EAAWrjD,MACjDvuB,KAAK2/E,YAAc3/E,KAAK2/E,aAAsCx5E,SAAtByrE,EAAWtsE,OAEnDtF,KAAKu/E,cAAgBv/E,KAAK8N,QAAQygB,MAAOvuB,KAAK8N,QAAQ02D,yBAG9CxkE,KAAK8N,QAAQqgB,OACnB,IAAK,OAAiBnuB,KAAK+yE,KAAO/yE,KAAKggF,SAAW,MAClD,KAAK,QAAiBhgF,KAAK+yE,KAAO/yE,KAAKigF,UAAY,MACnD,KAAK,eAAiBjgF,KAAK+yE,KAAO/yE,KAAKkgF,gBAAkB,MACzD,KAAK,YAAiBlgF,KAAK+yE,KAAO/yE,KAAKmgF,aAAe,MACtD,SAAsBngF,KAAK+yE,KAAO/yE,KAAKggF,aAO3Ch9E,EAAKwR,UAAUkvD,QAAU,WACvB1jE,KAAK+xE,aAEL/xE,KAAKwqB,KAAOxqB,KAAK+C,QAAQ6gE,MAAM5jE,KAAKq/E,SAAW,KAC/Cr/E,KAAKyiC,GAAKziC,KAAK+C,QAAQ6gE,MAAM5jE,KAAKs/E,OAAS,KAC3Ct/E,KAAKgxE,UAAahxE,KAAKwqB,MAAQxqB,KAAKyiC,GAEhCziC,KAAKgxE,WACPhxE,KAAKwqB,KAAKoxD,WAAW57E,MACrBA,KAAKyiC,GAAGm5C,WAAW57E,QAGfA,KAAKwqB,MACPxqB,KAAKwqB,KAAKqxD,WAAW77E,MAEnBA,KAAKyiC,IACPziC,KAAKyiC,GAAGo5C,WAAW77E,QAQzBgD,EAAKwR,UAAUu9D,WAAa,WACtB/xE,KAAKwqB,OACPxqB,KAAKwqB,KAAKqxD,WAAW77E,MACrBA,KAAKwqB,KAAO,MAEVxqB,KAAKyiC,KACPziC,KAAKyiC,GAAGo5C,WAAW77E,MACnBA,KAAKyiC,GAAK,MAGZziC,KAAKgxE,WAAY,GAQnBhuE,EAAKwR,UAAUq8D,SAAW,WACxB,MAA6B,kBAAf7wE,MAAKqnD,MAAuBrnD,KAAKqnD,QAAUrnD,KAAKqnD,OAQhErkD,EAAKwR,UAAU6b,SAAW,WACxB,MAAOrwB,MAAKgH,OASdhE,EAAKwR,UAAU49D,cAAgB,SAAS/mE,EAAKyB,GAC3C,IAAK9M,KAAK0/E,YAA6Bv5E,SAAfnG,KAAKgH,MAAqB,CAChD,GAAI6vB,IAAS72B,KAAK8N,QAAQ2yB,SAAWzgC,KAAK8N,QAAQ0yB,WAAa1zB,EAAMzB,EACrErL,MAAK8N,QAAQygB,OAAQvuB,KAAKgH,MAAQqE,GAAOwrB,EAAQ72B,KAAK8N,QAAQ0yB,SAC9DxgC,KAAKu/E,cAAgBv/E,KAAK8N,QAAQygB,MAAOvuB,KAAK8N,QAAQ02D,2BAU1DxhE,EAAKwR,UAAUu+D,KAAO,WACpB,KAAM,uCAQR/vE,EAAKwR,UAAUs8D,kBAAoB,SAASpnD,GAC1C,GAAI1pB,KAAKgxE,UAAW,CAClB,GAAI/oC,GAAU,GACVm4C,EAAQpgF,KAAKwqB,KAAKuD,EAClBsyD,EAAQrgF,KAAKwqB,KAAKvK,EAClBqgE,EAAMtgF,KAAKyiC,GAAG1U,EACdwyD,EAAMvgF,KAAKyiC,GAAGxiB,EACdugE,EAAO92D,EAAItiB,KACXq5E,EAAO/2D,EAAIliB,IAEXy8B,EAAOjkC,KAAK0gF,mBAAmBN,EAAOC,EAAOC,EAAKC,EAAKC,EAAMC,EAEjE,OAAex4C,GAAPhE,EAGR,OAAO,GAIXjhC,EAAKwR,UAAUmsE,UAAY,WACzB,GAAIC,GAAW5gF,KAAK8N,QAAQrD,KAgB5B,OAfiC,MAA7BzK,KAAK8N,QAAQi3D,aACf6b,GACEh1E,UAAW5L,KAAKyiC,GAAG30B,QAAQrD,MAAMmB,UAAUD,OAC3CE,MAAO7L,KAAKyiC,GAAG30B,QAAQrD,MAAMoB,MAAMF,OACnClB,MAAOzK,KAAKyiC,GAAG30B,QAAQrD,MAAMkB,SAGK,QAA7B3L,KAAK8N,QAAQi3D,cAAuD,GAA7B/kE,KAAK8N,QAAQi3D,gBAC3D6b,GACEh1E,UAAW5L,KAAKwqB,KAAK1c,QAAQrD,MAAMmB,UAAUD,OAC7CE,MAAO7L,KAAKwqB,KAAK1c,QAAQrD,MAAMoB,MAAMF,OACrClB,MAAOzK,KAAKwqB,KAAK1c,QAAQrD,MAAMkB,SAId,GAAjB3L,KAAKssD,SAA4Bs0B,EAASh1E,UACvB,GAAd5L,KAAK6L,MAAuB+0E,EAAS/0E,MACT+0E,EAASn2E,OAWhDzH,EAAKwR,UAAUwrE,UAAY,SAAS3/C,GAKlC,GAHAA,EAAIY,YAAcjhC,KAAK2gF,YACvBtgD,EAAIO,UAAc5gC,KAAK6gF,gBAEnB7gF,KAAKwqB,MAAQxqB,KAAKyiC,GAAI,CAExB,GAGIxU,GAHAikD,EAAMlyE,KAAK8gF,MAAMzgD,EAIrB,IAAIrgC,KAAK8hC,MAAO,CACd,GAAyC,GAArC9hC,KAAK8N,QAAQw5D,aAAav5D,SAA0B,MAAPmkE,EAAa,CAC5D,GAAI6O,GAAY,IAAK,IAAK/gF,KAAKwqB,KAAKuD,EAAImkD,EAAInkD,GAAK,IAAK/tB,KAAKyiC,GAAG1U,EAAImkD,EAAInkD,IAClEizD,EAAY,IAAK,IAAKhhF,KAAKwqB,KAAKvK,EAAIiyD,EAAIjyD,GAAK,IAAKjgB,KAAKyiC,GAAGxiB,EAAIiyD,EAAIjyD,GACtEgO,IAASF,EAAEgzD,EAAW9gE,EAAE+gE,OAGxB/yD,GAAQjuB,KAAKihF,aAAa,GAE5BjhF,MAAK69E,OAAOx9C,EAAKrgC,KAAK8hC,MAAO7T,EAAMF,EAAGE,EAAMhO,QAG3C,CACH,GAAI8N,GAAG9N,EACHskB,EAASvkC,KAAKilE,QAAQK,aAAe,EACrCxxB,EAAO9zC,KAAKwqB,IACXspB,GAAKvlB,OACRulB,EAAKqoC,OAAO97C,GAEVyT,EAAKvlB,MAAQulB,EAAKtlB,QACpBT,EAAI+lB,EAAK/lB,EAAI+lB,EAAKvlB,MAAQ,EAC1BtO,EAAI6zB,EAAK7zB,EAAIskB,IAGbxW,EAAI+lB,EAAK/lB,EAAIwW,EACbtkB,EAAI6zB,EAAK7zB,EAAI6zB,EAAKtlB,OAAS,GAE7BxuB,KAAKkhF,QAAQ7gD,EAAKtS,EAAG9N,EAAGskB,GACxBtW,EAAQjuB,KAAKmhF,eAAepzD,EAAG9N,EAAGskB,EAAQ,IAC1CvkC,KAAK69E,OAAOx9C,EAAKrgC,KAAK8hC,MAAO7T,EAAMF,EAAGE,EAAMhO,KAUhDjd,EAAKwR,UAAUqsE,cAAgB,WAC7B,MAAqB,IAAjB7gF,KAAKssD,SACAznD,KAAKwG,IAAIrL,KAAKu/E,cAAev/E,KAAK8N,QAAQ2yB,UAAUzgC,KAAKq7E,gBAG9C,GAAdr7E,KAAK6L,MACAhH,KAAKwG,IAAIrL,KAAK8N,QAAQ22D,WAAYzkE,KAAK8N,QAAQ2yB,UAAUzgC,KAAKq7E,gBAG9Dr7E,KAAK8N,QAAQygB,MAAMvuB,KAAKq7E,iBAKrCr4E,EAAKwR,UAAU4sE,mBAAqB,WAClC,GAAIC,GAAO,KACPC,EAAO,KACP/+D,EAASviB,KAAK8N,QAAQw5D,aAAaE,UACnC/gE,EAAOzG,KAAK8N,QAAQw5D,aAAa7gE,KAEjC8xB,EAAK1zB,KAAK+O,IAAI5T,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GACpC9M,EAAKpc,KAAK+O,IAAI5T,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,EA2JxC,OA1JY,YAARxZ,GAA8B,iBAARA,EACpB5B,KAAK+O,IAAI5T,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GAAKlpB,KAAK+O,IAAI5T,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,IACjEjgB,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,EACpBjgB,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GACxBszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAAStB,EAC9BqgE,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAAStB,GAEvBjhB,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,IAC7BszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAAStB,EAC9BqgE,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAAStB,GAGzBjhB,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,IACzBjgB,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GACxBszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAAStB,EAC9BqgE,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAAStB,GAEvBjhB,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,IAC7BszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAAStB,EAC9BqgE,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAAStB,IAGtB,YAARxa,IACF46E,EAAY9+D,EAAStB,EAAdsX,EAAmBv4B,KAAKwqB,KAAKuD,EAAIszD,IAGnCx8E,KAAK+O,IAAI5T,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GAAKlpB,KAAK+O,IAAI5T,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,KACtEjgB,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,EACpBjgB,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GACxBszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAASgW,EAC9B+oD,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAASgW,GAEvBv4B,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,IAC7BszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAASgW,EAC9B+oD,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAASgW,GAGzBv4B,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,IACzBjgB,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GACxBszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAASgW,EAC9B+oD,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAASgW,GAEvBv4B,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,IAC7BszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAASgW,EAC9B+oD,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAASgW,IAGtB,YAAR9xB,IACF66E,EAAY/+D,EAASgW,EAAdtX,EAAmBjhB,KAAKwqB,KAAKvK,EAAIqhE,IAI7B,iBAAR76E,EACH5B,KAAK+O,IAAI5T,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GAAKlpB,KAAK+O,IAAI5T,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,IACrEohE,EAAOrhF,KAAKwqB,KAAKuD,EAEfuzD,EADEthF,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,EACjBjgB,KAAKyiC,GAAGxiB,GAAK,EAAEsC,GAAUtB,EAGzBjhB,KAAKyiC,GAAGxiB,GAAK,EAAEsC,GAAUtB,GAG3Bpc,KAAK+O,IAAI5T,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GAAKlpB,KAAK+O,IAAI5T,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,KAExEohE,EADErhF,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,EACjB/tB,KAAKyiC,GAAG1U,GAAK,EAAExL,GAAUgW,EAGzBv4B,KAAKyiC,GAAG1U,GAAK,EAAExL,GAAUgW,EAElC+oD,EAAOthF,KAAKwqB,KAAKvK,GAGJ,cAARxZ,GAEL46E,EADErhF,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,EACjB/tB,KAAKyiC,GAAG1U,GAAK,EAAExL,GAAUgW,EAGzBv4B,KAAKyiC,GAAG1U,GAAK,EAAExL,GAAUgW,EAElC+oD,EAAOthF,KAAKwqB,KAAKvK,GAEF,YAARxZ,GACP46E,EAAOrhF,KAAKwqB,KAAKuD,EAEfuzD,EADEthF,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,EACjBjgB,KAAKyiC,GAAGxiB,GAAK,EAAEsC,GAAUtB,EAGzBjhB,KAAKyiC,GAAGxiB,GAAK,EAAEsC,GAAUtB,GAI9Bpc,KAAK+O,IAAI5T,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GAAKlpB,KAAK+O,IAAI5T,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,GACjEjgB,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,EACpBjgB,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GAExBszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAAStB,EAC9BqgE,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAAStB,EAC9BogE,EAAOrhF,KAAKyiC,GAAG1U,EAAIszD,EAAOrhF,KAAKyiC,GAAG1U,EAAIszD,GAE/BrhF,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,IAE7BszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAAStB,EAC9BqgE,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAAStB,EAC9BogE,EAAOrhF,KAAKyiC,GAAG1U,EAAIszD,EAAOrhF,KAAKyiC,GAAG1U,EAAGszD,GAGhCrhF,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,IACzBjgB,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GAExBszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAAStB,EAC9BqgE,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAAStB,EAC9BogE,EAAOrhF,KAAKyiC,GAAG1U,EAAIszD,EAAOrhF,KAAKyiC,GAAG1U,EAAIszD,GAE/BrhF,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,IAE7BszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAAStB,EAC9BqgE,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAAStB,EAC9BogE,EAAOrhF,KAAKyiC,GAAG1U,EAAIszD,EAAOrhF,KAAKyiC,GAAG1U,EAAIszD,IAInCx8E,KAAK+O,IAAI5T,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GAAKlpB,KAAK+O,IAAI5T,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,KACtEjgB,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,EACpBjgB,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GAExBszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAASgW,EAC9B+oD,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAASgW,EAC9B+oD,EAAOthF,KAAKyiC,GAAGxiB,EAAIqhE,EAAOthF,KAAKyiC,GAAGxiB,EAAIqhE,GAE/BthF,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,IAE7BszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAASgW,EAC9B+oD,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAASgW,EAC9B+oD,EAAOthF,KAAKyiC,GAAGxiB,EAAIqhE,EAAOthF,KAAKyiC,GAAGxiB,EAAIqhE,GAGjCthF,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,IACzBjgB,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GAExBszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAASgW,EAC9B+oD,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAASgW,EAC9B+oD,EAAOthF,KAAKyiC,GAAGxiB,EAAIqhE,EAAOthF,KAAKyiC,GAAGxiB,EAAIqhE,GAE/BthF,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,IAE7BszD,EAAOrhF,KAAKwqB,KAAKuD,EAAIxL,EAASgW,EAC9B+oD,EAAOthF,KAAKwqB,KAAKvK,EAAIsC,EAASgW,EAC9B+oD,EAAOthF,KAAKyiC,GAAGxiB,EAAIqhE,EAAOthF,KAAKyiC,GAAGxiB,EAAIqhE,MAOtCvzD,EAAEszD,EAAMphE,EAAEqhE;EAQpBt+E,EAAKwR,UAAUssE,MAAQ,SAAUzgD,GAI/B,GAFAA,EAAIa,YACJb,EAAIc,OAAOnhC,KAAKwqB,KAAKuD,EAAG/tB,KAAKwqB,KAAKvK,GACO,GAArCjgB,KAAK8N,QAAQw5D,aAAav5D,QAAiB,CAC7C,GAAyC,GAArC/N,KAAK8N,QAAQw5D,aAAaC,QAAkB,CAC9C,GAAI2K,GAAMlyE,KAAKohF,oBACf,OAAa,OAATlP,EAAInkD,GACNsS,EAAIe,OAAOphC,KAAKyiC,GAAG1U,EAAG/tB,KAAKyiC,GAAGxiB,GAC9BogB,EAAI9G,SACG,OAKP8G,EAAIkhD,iBAAiBrP,EAAInkD,EAAEmkD,EAAIjyD,EAAEjgB,KAAKyiC,GAAG1U,EAAG/tB,KAAKyiC,GAAGxiB,GACpDogB,EAAI9G,SACG24C,GAMT,MAFA7xC,GAAIkhD,iBAAiBvhF,KAAKkyE,IAAInkD,EAAE/tB,KAAKkyE,IAAIjyD,EAAEjgB,KAAKyiC,GAAG1U,EAAG/tB,KAAKyiC,GAAGxiB,GAC9DogB,EAAI9G,SACGv5B,KAAKkyE,IAMd,MAFA7xC,GAAIe,OAAOphC,KAAKyiC,GAAG1U,EAAG/tB,KAAKyiC,GAAGxiB,GAC9BogB,EAAI9G,SACG,MAYXv2B,EAAKwR,UAAU0sE,QAAU,SAAU7gD,EAAKtS,EAAG9N,EAAGskB,GAE5ClE,EAAIa,YACJb,EAAImE,IAAIzW,EAAG9N,EAAGskB,EAAQ,EAAG,EAAI1/B,KAAK4/B,IAAI,GACtCpE,EAAI9G,UAWNv2B,EAAKwR,UAAUqpE,OAAS,SAAUx9C,EAAKsC,EAAM5U,EAAG9N,GAC9C,GAAI0iB,EAAM,CAERtC,EAAIQ,MAAS7gC,KAAKwqB,KAAK8hC,UAAYtsD,KAAKyiC,GAAG6pB,SAAY,QAAU,IAC7DtsD,KAAK8N,QAAQs2D,SAAW,MAAQpkE,KAAK8N,QAAQu2D,SACjDhkC,EAAIiB,UAAYthC,KAAK8N,QAAQ42D,QAC7B,IAAIn2C,GAAQ8R,EAAI0+C,YAAYp8C,GAAMpU,MAC9BC,EAASxuB,KAAK8N,QAAQs2D,SACtBh9D,EAAO2mB,EAAIQ,EAAQ,EACnB/mB,EAAMyY,EAAIuO,EAAS,CAEvB6R,GAAImhD,SAASp6E,EAAMI,EAAK+mB,EAAOC,GAG/B6R,EAAIiB,UAAYthC,KAAK8N,QAAQq2D,WAAa,QAC1C9jC,EAAIsB,UAAY,OAChBtB,EAAIuB,aAAe,MACnBvB,EAAIwB,SAASc,EAAMv7B,EAAMI,KAa7BxE,EAAKwR,UAAU2rE,cAAgB,SAAS9/C,GAERA,EAAIY,YAAb,GAAjBjhC,KAAKssD,SAAuCtsD,KAAK8N,QAAQrD,MAAMmB,UAC5C,GAAd5L,KAAK6L,MAAkC7L,KAAK8N,QAAQrD,MAAMoB,MACnB7L,KAAK8N,QAAQrD,MAAMA,MAEnE41B,EAAIO,UAAY5gC,KAAK6gF,eAErB,IAAI3O,GAAM,IAEV,IAAoB/rE,SAAhBk6B,EAAIohD,SAA6Ct7E,SAApBk6B,EAAIqhD,YAA2B,CAE9D,GAAIC,IAAW,EAEbA,GAD+Bx7E,SAA7BnG,KAAK8N,QAAQ82D,KAAKt/D,QAAkDa,SAA1BnG,KAAK8N,QAAQ82D,KAAKC,KACnD7kE,KAAK8N,QAAQ82D,KAAKt/D,OAAOtF,KAAK8N,QAAQ82D,KAAKC,MAG3C,EAAE,GAIgB,mBAApBxkC,GAAIqhD,aACbrhD,EAAIqhD,YAAYC,GAChBthD,EAAIuhD,eAAiB,IAGrBvhD,EAAIohD,QAAUE,EACdthD,EAAIwhD,cAAgB,GAItB3P,EAAMlyE,KAAK8gF,MAAMzgD,GAGc,mBAApBA,GAAIqhD,aACbrhD,EAAIqhD,aAAa,IACjBrhD,EAAIuhD,eAAiB,IAGrBvhD,EAAIohD,SAAW,GACfphD,EAAIwhD,cAAgB,OAKtBxhD,GAAIa,YACJb,EAAIyhD,QAAU,QACsB37E,SAAhCnG,KAAK8N,QAAQ82D,KAAKE,UAEpBzkC,EAAI0hD,WAAW/hF,KAAKwqB,KAAKuD,EAAE/tB,KAAKwqB,KAAKvK,EAAEjgB,KAAKyiC,GAAG1U,EAAE/tB,KAAKyiC,GAAGxiB,GACpDjgB,KAAK8N,QAAQ82D,KAAKt/D,OAAOtF,KAAK8N,QAAQ82D,KAAKC,IAAI7kE,KAAK8N,QAAQ82D,KAAKE,UAAU9kE,KAAK8N,QAAQ82D,KAAKC,MAE9D1+D,SAA7BnG,KAAK8N,QAAQ82D,KAAKt/D,QAAkDa,SAA1BnG,KAAK8N,QAAQ82D,KAAKC,IAEnExkC,EAAI0hD,WAAW/hF,KAAKwqB,KAAKuD,EAAE/tB,KAAKwqB,KAAKvK,EAAEjgB,KAAKyiC,GAAG1U,EAAE/tB,KAAKyiC,GAAGxiB,GACpDjgB,KAAK8N,QAAQ82D,KAAKt/D,OAAOtF,KAAK8N,QAAQ82D,KAAKC,OAIhDxkC,EAAIc,OAAOnhC,KAAKwqB,KAAKuD,EAAG/tB,KAAKwqB,KAAKvK,GAClCogB,EAAIe,OAAOphC,KAAKyiC,GAAG1U,EAAG/tB,KAAKyiC,GAAGxiB,IAEhCogB,EAAI9G,QAIN,IAAIv5B,KAAK8hC,MAAO,CACd,GAAI7T,EACJ,IAAyC,GAArCjuB,KAAK8N,QAAQw5D,aAAav5D,SAA0B,MAAPmkE,EAAa,CAC5D,GAAI6O,GAAY,IAAK,IAAK/gF,KAAKwqB,KAAKuD,EAAImkD,EAAInkD,GAAK,IAAK/tB,KAAKyiC,GAAG1U,EAAImkD,EAAInkD,IAClEizD,EAAY,IAAK,IAAKhhF,KAAKwqB,KAAKvK,EAAIiyD,EAAIjyD,GAAK,IAAKjgB,KAAKyiC,GAAGxiB,EAAIiyD,EAAIjyD,GACtEgO,IAASF,EAAEgzD,EAAW9gE,EAAE+gE,OAGxB/yD,GAAQjuB,KAAKihF,aAAa,GAE5BjhF,MAAK69E,OAAOx9C,EAAKrgC,KAAK8hC,MAAO7T,EAAMF,EAAGE,EAAMhO,KAUhDjd,EAAKwR,UAAUysE,aAAe,SAAUe,GACtC,OACEj0D,GAAI,EAAIi0D,GAAchiF,KAAKwqB,KAAKuD,EAAIi0D,EAAahiF,KAAKyiC,GAAG1U,EACzD9N,GAAI,EAAI+hE,GAAchiF,KAAKwqB,KAAKvK,EAAI+hE,EAAahiF,KAAKyiC,GAAGxiB,IAa7Djd,EAAKwR,UAAU2sE,eAAiB,SAAUpzD,EAAG9N,EAAGskB,EAAQy9C,GACtD,GAAIroC,GAA6B,GAApBqoC,EAAa,EAAE,GAASn9E,KAAK4/B,EAC1C,QACE1W,EAAGA,EAAIwW,EAAS1/B,KAAKqzB,IAAIyhB,GACzB15B,EAAGA,EAAIskB,EAAS1/B,KAAKkzB,IAAI4hB,KAW7B32C,EAAKwR,UAAU0rE,iBAAmB,SAAS7/C,GACzC,GAAIpS,EAOJ,IALqB,GAAjBjuB,KAAKssD,UAAqBjsB,EAAIY,YAAcjhC,KAAK8N,QAAQrD,MAAMmB,UAAWy0B,EAAIiB,UAAYthC,KAAK8N,QAAQrD,MAAMmB,WAC1F,GAAd5L,KAAK6L,OAAgBw0B,EAAIY,YAAcjhC,KAAK8N,QAAQrD,MAAMoB,MAAWw0B,EAAIiB,UAAYthC,KAAK8N,QAAQrD,MAAMoB,QACnFw0B,EAAIY,YAAcjhC,KAAK8N,QAAQrD,MAAMA,MAAW41B,EAAIiB,UAAYthC,KAAK8N,QAAQrD,MAAMA,OACjH41B,EAAIO,UAAY5gC,KAAK6gF,gBAEjB7gF,KAAKwqB,MAAQxqB,KAAKyiC,GAAI,CAExB,GAAIyvC,GAAMlyE,KAAK8gF,MAAMzgD,GAEjBsZ,EAAQ90C,KAAK+vC,MAAO50C,KAAKyiC,GAAGxiB,EAAIjgB,KAAKwqB,KAAKvK,EAAKjgB,KAAKyiC,GAAG1U,EAAI/tB,KAAKwqB,KAAKuD,GACrEzoB,GAAU,GAAK,EAAItF,KAAK8N,QAAQygB,OAASvuB,KAAK8N,QAAQ62D,gBAE1D,IAAyC,GAArC3kE,KAAK8N,QAAQw5D,aAAav5D,SAA0B,MAAPmkE,EAAa,CAC5D,GAAI6O,GAAY,IAAK,IAAK/gF,KAAKwqB,KAAKuD,EAAImkD,EAAInkD,GAAK,IAAK/tB,KAAKyiC,GAAG1U,EAAImkD,EAAInkD,IAClEizD,EAAY,IAAK,IAAKhhF,KAAKwqB,KAAKvK,EAAIiyD,EAAIjyD,GAAK,IAAKjgB,KAAKyiC,GAAGxiB,EAAIiyD,EAAIjyD,GACtEgO,IAASF,EAAEgzD,EAAW9gE,EAAE+gE,OAGxB/yD,GAAQjuB,KAAKihF,aAAa,GAG5B5gD,GAAI4hD,MAAMh0D,EAAMF,EAAGE,EAAMhO,EAAG05B,EAAOr0C,GACnC+6B,EAAI/G,OACJ+G,EAAI9G,SAGAv5B,KAAK8hC,OACP9hC,KAAK69E,OAAOx9C,EAAKrgC,KAAK8hC,MAAO7T,EAAMF,EAAGE,EAAMhO,OAG3C,CAEH,GAAI8N,GAAG9N,EACHskB,EAAS,IAAO1/B,KAAKiI,IAAI,IAAI9M,KAAKilE,QAAQK,cAC1CxxB,EAAO9zC,KAAKwqB,IACXspB,GAAKvlB,OACRulB,EAAKqoC,OAAO97C,GAEVyT,EAAKvlB,MAAQulB,EAAKtlB,QACpBT,EAAI+lB,EAAK/lB,EAAiB,GAAb+lB,EAAKvlB,MAClBtO,EAAI6zB,EAAK7zB,EAAIskB,IAGbxW,EAAI+lB,EAAK/lB,EAAIwW,EACbtkB,EAAI6zB,EAAK7zB,EAAkB,GAAd6zB,EAAKtlB,QAEpBxuB,KAAKkhF,QAAQ7gD,EAAKtS,EAAG9N,EAAGskB,EAGxB,IAAIoV,GAAQ,GAAM90C,KAAK4/B,GACnBn/B,GAAU,GAAK,EAAItF,KAAK8N,QAAQygB,OAASvuB,KAAK8N,QAAQ62D,gBAC1D12C,GAAQjuB,KAAKmhF,eAAepzD,EAAG9N,EAAGskB,EAAQ,IAC1ClE,EAAI4hD,MAAMh0D,EAAMF,EAAGE,EAAMhO,EAAG05B,EAAOr0C,GACnC+6B,EAAI/G,OACJ+G,EAAI9G,SAGAv5B,KAAK8hC,QACP7T,EAAQjuB,KAAKmhF,eAAepzD,EAAG9N,EAAGskB,EAAQ,IAC1CvkC,KAAK69E,OAAOx9C,EAAKrgC,KAAK8hC,MAAO7T,EAAMF,EAAGE,EAAMhO,MAclDjd,EAAKwR,UAAUyrE,WAAa,SAAS5/C,GAEd,GAAjBrgC,KAAKssD,UAAqBjsB,EAAIY,YAAcjhC,KAAK8N,QAAQrD,MAAMmB,UAAWy0B,EAAIiB,UAAYthC,KAAK8N,QAAQrD,MAAMmB,WAC1F,GAAd5L,KAAK6L,OAAgBw0B,EAAIY,YAAcjhC,KAAK8N,QAAQrD,MAAMoB,MAAWw0B,EAAIiB,UAAYthC,KAAK8N,QAAQrD,MAAMoB,QACnFw0B,EAAIY,YAAcjhC,KAAK8N,QAAQrD,MAAMA,MAAW41B,EAAIiB,UAAYthC,KAAK8N,QAAQrD,MAAMA,OAEjH41B,EAAIO,UAAY5gC,KAAK6gF,eAErB,IAAIlnC,GAAOr0C,CAEX,IAAItF,KAAKwqB,MAAQxqB,KAAKyiC,GAAI,CACxBkX,EAAQ90C,KAAK+vC,MAAO50C,KAAKyiC,GAAGxiB,EAAIjgB,KAAKwqB,KAAKvK,EAAKjgB,KAAKyiC,GAAG1U,EAAI/tB,KAAKwqB,KAAKuD,EACrE,IASImkD,GATA35C,EAAMv4B,KAAKyiC,GAAG1U,EAAI/tB,KAAKwqB,KAAKuD,EAC5B9M,EAAMjhB,KAAKyiC,GAAGxiB,EAAIjgB,KAAKwqB,KAAKvK,EAC5BiiE,EAAoBr9E,KAAK2jC,KAAKjQ,EAAKA,EAAKtX,EAAKA,GAE7CkhE,EAAiBniF,KAAKwqB,KAAK+yD,iBAAiBl9C,EAAKsZ,EAAQ90C,KAAK4/B,IAC9D29C,GAAmBF,EAAoBC,GAAkBD,EACzD9B,EAAQ,EAAoBpgF,KAAKwqB,KAAKuD,GAAK,EAAIq0D,GAAmBpiF,KAAKyiC,GAAG1U,EAC1EsyD,EAAQ,EAAoBrgF,KAAKwqB,KAAKvK,GAAK,EAAImiE,GAAmBpiF,KAAKyiC,GAAGxiB,CAGrC,IAArCjgB,KAAK8N,QAAQw5D,aAAaC,SAAwD,GAArCvnE,KAAK8N,QAAQw5D,aAAav5D,QACzEmkE,EAAMlyE,KAAKkyE,IAEiC,GAArClyE,KAAK8N,QAAQw5D,aAAav5D,UACjCmkE,EAAMlyE,KAAKohF,sBAG4B,GAArCphF,KAAK8N,QAAQw5D,aAAav5D,SAA4B,MAATmkE,EAAInkD,IACnD4rB,EAAQ90C,KAAK+vC,MAAO50C,KAAKyiC,GAAGxiB,EAAIiyD,EAAIjyD,EAAKjgB,KAAKyiC,GAAG1U,EAAImkD,EAAInkD,GACzDwK,EAAMv4B,KAAKyiC,GAAG1U,EAAImkD,EAAInkD,EACtB9M,EAAMjhB,KAAKyiC,GAAGxiB,EAAIiyD,EAAIjyD,EACtBiiE,EAAoBr9E,KAAK2jC,KAAKjQ,EAAKA,EAAKtX,EAAKA,GAE/C,IAGIq/D,GAAIC,EAHJ8B,EAAeriF,KAAKyiC,GAAG86C,iBAAiBl9C,EAAKsZ,GAC7C2oC,GAAiBJ,EAAoBG,GAAgBH,CA6BzD,IA1ByC,GAArCliF,KAAK8N,QAAQw5D,aAAav5D,SAA4B,MAATmkE,EAAInkD,GACpDuyD,GAAO,EAAIgC,GAAiBpQ,EAAInkD,EAAIu0D,EAAgBtiF,KAAKyiC,GAAG1U,EAC5DwyD,GAAO,EAAI+B,GAAiBpQ,EAAIjyD,EAAIqiE,EAAgBtiF,KAAKyiC,GAAGxiB,IAG3DqgE,GAAO,EAAIgC,GAAiBtiF,KAAKwqB,KAAKuD,EAAIu0D,EAAgBtiF,KAAKyiC,GAAG1U,EAClEwyD,GAAO,EAAI+B,GAAiBtiF,KAAKwqB,KAAKvK,EAAIqiE,EAAgBtiF,KAAKyiC,GAAGxiB,GAGpEogB,EAAIa,YACJb,EAAIc,OAAOi/C,EAAMC,GACwB,GAArCrgF,KAAK8N,QAAQw5D,aAAav5D,SAA4B,MAATmkE,EAAInkD,EACnDsS,EAAIkhD,iBAAiBrP,EAAInkD,EAAEmkD,EAAIjyD,EAAEqgE,EAAKC,GAGtClgD,EAAIe,OAAOk/C,EAAKC,GAElBlgD,EAAI9G,SAGJj0B,GAAU,GAAK,EAAItF,KAAK8N,QAAQygB,OAASvuB,KAAK8N,QAAQ62D,iBACtDtkC,EAAI4hD,MAAM3B,EAAKC,EAAK5mC,EAAOr0C,GAC3B+6B,EAAI/G,OACJ+G,EAAI9G,SAGAv5B,KAAK8hC,MAAO,CACd,GAAI7T,EACJ,IAAyC,GAArCjuB,KAAK8N,QAAQw5D,aAAav5D,SAA0B,MAAPmkE,EAAa,CAC5D,GAAI6O,GAAY,IAAK,IAAK/gF,KAAKwqB,KAAKuD,EAAImkD,EAAInkD,GAAK,IAAK/tB,KAAKyiC,GAAG1U,EAAImkD,EAAInkD,IAClEizD,EAAY,IAAK,IAAKhhF,KAAKwqB,KAAKvK,EAAIiyD,EAAIjyD,GAAK,IAAKjgB,KAAKyiC,GAAGxiB,EAAIiyD,EAAIjyD,GACtEgO,IAASF,EAAEgzD,EAAW9gE,EAAE+gE,OAGxB/yD,GAAQjuB,KAAKihF,aAAa,GAE5BjhF,MAAK69E,OAAOx9C,EAAKrgC,KAAK8hC,MAAO7T,EAAMF,EAAGE,EAAMhO,QAG3C,CAEH,GACI8N,GAAG9N,EAAGgiE,EADNnuC,EAAO9zC,KAAKwqB,KAEZ+Z,EAAS,IAAO1/B,KAAKiI,IAAI,IAAI9M,KAAKilE,QAAQK,aACzCxxB,GAAKvlB,OACRulB,EAAKqoC,OAAO97C,GAEVyT,EAAKvlB,MAAQulB,EAAKtlB,QACpBT,EAAI+lB,EAAK/lB,EAAiB,GAAb+lB,EAAKvlB,MAClBtO,EAAI6zB,EAAK7zB,EAAIskB,EACb09C,GACEl0D,EAAGA,EACH9N,EAAG6zB,EAAK7zB,EACR05B,MAAO,GAAM90C,KAAK4/B,MAIpB1W,EAAI+lB,EAAK/lB,EAAIwW,EACbtkB,EAAI6zB,EAAK7zB,EAAkB,GAAd6zB,EAAKtlB,OAClByzD,GACEl0D,EAAG+lB,EAAK/lB,EACR9N,EAAGA,EACH05B,MAAO,GAAM90C,KAAK4/B,KAGtBpE,EAAIa,YAEJb,EAAImE,IAAIzW,EAAG9N,EAAGskB,EAAQ,EAAG,EAAI1/B,KAAK4/B,IAAI,GACtCpE,EAAI9G,QAGJ,IAAIj0B,IAAU,GAAK,EAAItF,KAAK8N,QAAQygB,OAASvuB,KAAK8N,QAAQ62D,gBAC1DtkC,GAAI4hD,MAAMA,EAAMl0D,EAAGk0D,EAAMhiE,EAAGgiE,EAAMtoC,MAAOr0C,GACzC+6B,EAAI/G,OACJ+G,EAAI9G,SAGAv5B,KAAK8hC,QACP7T,EAAQjuB,KAAKmhF,eAAepzD,EAAG9N,EAAGskB,EAAQ,IAC1CvkC,KAAK69E,OAAOx9C,EAAKrgC,KAAK8hC,MAAO7T,EAAMF,EAAGE,EAAMhO,MAmBlDjd,EAAKwR,UAAUksE,mBAAqB,SAAU6B,EAAGC,EAAIC,EAAGC,EAAIC,EAAGC,GAC7D,GAAI5iF,KAAKwqB,MAAQxqB,KAAKyiC,GAAI,CACxB,GAAyC,GAArCziC,KAAK8N,QAAQw5D,aAAav5D,QAAiB,CAC7C,GAAIszE,GAAMC,CACV,IAAyC,GAArCthF,KAAK8N,QAAQw5D,aAAav5D,SAAwD,GAArC/N,KAAK8N,QAAQw5D,aAAaC,QACzE8Z,EAAOrhF,KAAKkyE,IAAInkD,EAChBuzD,EAAOthF,KAAKkyE,IAAIjyD,MAEb,CACH,GAAIiyD,GAAMlyE,KAAKohF,oBACfC,GAAOnP,EAAInkD,EACXuzD,EAAOpP,EAAIjyD,EAEb,GACIgf,GACA95B,EAAEgI,EAAE4gB,EAAE9N,EAAG4iE,EAAOC,EAFhBC,EAAc,GAGlB,KAAK59E,EAAI,EAAO,GAAJA,EAAQA,IAClBgI,EAAI,GAAIhI,EACR4oB,EAAIlpB,KAAK0oC,IAAI,EAAEpgC,EAAE,GAAGo1E,EAAM,EAAEp1E,GAAG,EAAIA,GAAIk0E,EAAOx8E,KAAK0oC,IAAIpgC,EAAE,GAAGs1E,EAC5DxiE,EAAIpb,KAAK0oC,IAAI,EAAEpgC,EAAE,GAAGq1E,EAAM,EAAEr1E,GAAG,EAAIA,GAAIm0E,EAAOz8E,KAAK0oC,IAAIpgC,EAAE,GAAGu1E,EACxDv9E,EAAI,IACN85B,EAAWj/B,KAAKgjF,mBAAmBH,EAAMC,EAAM/0D,EAAE9N,EAAG0iE,EAAGC,GACvDG,EAAyBA,EAAX9jD,EAAyBA,EAAW8jD,GAEpDF,EAAQ90D,EAAG+0D,EAAQ7iE,CAErB,OAAO8iE,GAGP,MAAO/iF,MAAKgjF,mBAAmBT,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,GAIhD,GAAI70D,GAAG9N,EAAGsY,EAAItX,EACVsjB,EAAS,IAAOvkC,KAAKilE,QAAQK,aAC7BxxB,EAAO9zC,KAAKwqB,IAWhB,OAVIspB,GAAKvlB,MAAQulB,EAAKtlB,QACpBT,EAAI+lB,EAAK/lB,EAAI,GAAM+lB,EAAKvlB,MACxBtO,EAAI6zB,EAAK7zB,EAAIskB,IAGbxW,EAAI+lB,EAAK/lB,EAAIwW,EACbtkB,EAAI6zB,EAAK7zB,EAAI,GAAM6zB,EAAKtlB,QAE1B+J,EAAKxK,EAAI40D,EACT1hE,EAAKhB,EAAI2iE,EACF/9E,KAAK+O,IAAI/O,KAAK2jC,KAAKjQ,EAAGA,EAAKtX,EAAGA,GAAMsjB,IAI/CvhC,EAAKwR,UAAUwuE,mBAAqB,SAAST,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,GAC1D,GAAIK,GAAKR,EAAGF,EACVW,EAAKR,EAAGF,EACRW,EAAYF,EAAGA,EAAKC,EAAGA,EACvBE,IAAOT,EAAKJ,GAAMU,GAAML,EAAKJ,GAAMU,GAAMC,CAEvCC,GAAI,EACNA,EAAI,EAEO,EAAJA,IACPA,EAAI,EAGN,IAAIr1D,GAAIw0D,EAAKa,EAAIH,EACfhjE,EAAIuiE,EAAKY,EAAIF,EACb3qD,EAAKxK,EAAI40D,EACT1hE,EAAKhB,EAAI2iE,CAQX,OAAO/9E,MAAK2jC,KAAKjQ,EAAGA,EAAKtX,EAAGA,IAQ9Bje,EAAKwR,UAAUgyC,SAAW,SAAS3vB,GACjC72B,KAAKq7E,gBAAkB,EAAIxkD,GAI7B7zB,EAAKwR,UAAU41C,OAAS,WACtBpqD,KAAKssD,UAAW,GAGlBtpD,EAAKwR,UAAU21C,SAAW,WACxBnqD,KAAKssD,UAAW,GAGlBtpD,EAAKwR,UAAUygE,mBAAqB,WACjB,OAAbj1E,KAAKkyE,KAA8B,OAAdlyE,KAAKwqB,MAA6B,OAAZxqB,KAAKyiC,KAClDziC,KAAKkyE,IAAInkD,EAAI,IAAO/tB,KAAKwqB,KAAKuD,EAAI/tB,KAAKyiC,GAAG1U,GAC1C/tB,KAAKkyE,IAAIjyD,EAAI,IAAOjgB,KAAKwqB,KAAKvK,EAAIjgB,KAAKyiC,GAAGxiB,KAQ9Cjd,EAAKwR,UAAU0+D,kBAAoB,SAAS7yC,GAC1C,GAAgC,GAA5BrgC,KAAK4/E,oBAA6B,CACpC,GAA+B,OAA3B5/E,KAAK6/E,aAAar1D,MAA0C,OAAzBxqB,KAAK6/E,aAAap9C,GAAa,CACpE,GAAI4gD,GAAa,cAAc7zD,OAAOxvB,KAAKK,IACvCijF,EAAW,YAAY9zD,OAAOxvB,KAAKK,IACnC6nE,GACYtE,OAAO51C,MAAM,GAAIuW,OAAO,GACxB0gC,SAASO,QAAQ,GACjBI,YAAac,sBAAuB,EAAGD,aAAcl4C,MAAM,EAAGC,OAAQ,EAAG+V,OAAO,IAEhGvkC,MAAK6/E,aAAar1D,KAAO,GAAIrnB,IAC1B9C,GAAGgjF,EACFrf,MAAM,MACJv5D,OAAOiB,WAAW,UAAWC,OAAO,UAAWC,WAAYF,WAAW,mBAClEw8D,GACVloE,KAAK6/E,aAAap9C,GAAK,GAAIt/B,IACxB9C,GAAGijF,EACFtf,MAAM,MACNv5D,OAAOiB,WAAW,UAAWC,OAAO,UAAWC,WAAYF,WAAW,mBAChEw8D,GAG2B,GAAnCloE,KAAK6/E,aAAar1D,KAAK8hC,UAAsD,GAAjCtsD,KAAK6/E,aAAap9C,GAAG6pB,WACnEtsD,KAAK6/E,aAAaC,UAAY9/E,KAAKujF,wBAAwBljD,GAC3DrgC,KAAK6/E,aAAar1D,KAAKuD,EAAI/tB,KAAK6/E,aAAaC,UAAUt1D,KAAKuD,EAC5D/tB,KAAK6/E,aAAar1D,KAAKvK,EAAIjgB,KAAK6/E,aAAaC,UAAUt1D,KAAKvK,EAC5DjgB,KAAK6/E,aAAap9C,GAAG1U,EAAI/tB,KAAK6/E,aAAaC,UAAUr9C,GAAG1U,EACxD/tB,KAAK6/E,aAAap9C,GAAGxiB,EAAIjgB,KAAK6/E,aAAaC,UAAUr9C,GAAGxiB,GAG1DjgB,KAAK6/E,aAAar1D,KAAKuoD,KAAK1yC,GAC5BrgC,KAAK6/E,aAAap9C,GAAGswC,KAAK1yC,OAG1BrgC,MAAK6/E,cAAgBr1D,KAAK,KAAMiY,GAAG,KAAMq9C,eAQ7C98E,EAAKwR,UAAUgvE,oBAAsB,WACnCxjF,KAAK4/E,qBAAsB,GAO7B58E,EAAKwR,UAAUivE,qBAAuB,WACpCzjF,KAAK4/E,qBAAsB,GAU7B58E,EAAKwR,UAAUkvE,wBAA0B,SAAS31D,EAAE9N,GAClD,GAAI6/D,GAAY9/E,KAAK6/E,aAAaC,UAC9B6D,EAAe9+E,KAAK2jC,KAAK3jC,KAAK0oC,IAAIxf,EAAI+xD,EAAUt1D,KAAKuD,EAAE,GAAKlpB,KAAK0oC,IAAIttB,EAAI6/D,EAAUt1D,KAAKvK,EAAE,IAC1F2jE,EAAe/+E,KAAK2jC,KAAK3jC,KAAK0oC,IAAIxf,EAAI+xD,EAAUr9C,GAAG1U,EAAI,GAAKlpB,KAAK0oC,IAAIttB,EAAI6/D,EAAUr9C,GAAGxiB,EAAI,GAE9F,OAAmB,IAAf0jE,GACF3jF,KAAK+/E,cAAgB//E,KAAKwqB,KAC1BxqB,KAAKwqB,KAAOxqB,KAAK6/E,aAAar1D,KACvBxqB,KAAK6/E,aAAar1D,MAEL,GAAbo5D,GACP5jF,KAAK+/E,cAAgB//E,KAAKyiC,GAC1BziC,KAAKyiC,GAAKziC,KAAK6/E,aAAap9C,GACrBziC,KAAK6/E,aAAap9C,IAGlB,MASXz/B,EAAKwR,UAAUqvE,qBAAuB,WACG,GAAnC7jF,KAAK6/E,aAAar1D,KAAK8hC,WACzBtsD,KAAKwqB,KAAOxqB,KAAK+/E,cACjB//E,KAAK+/E,cAAgB,KACrB//E,KAAK6/E,aAAar1D,KAAK2/B,YAEY,GAAjCnqD,KAAK6/E,aAAap9C,GAAG6pB,WACvBtsD,KAAKyiC,GAAKziC,KAAK+/E,cACf//E,KAAK+/E,cAAgB,KACrB//E,KAAK6/E,aAAap9C,GAAG0nB,aAUzBnnD,EAAKwR,UAAU+uE,wBAA0B,SAASljD,GAChD,GASI6xC,GATAv4B,EAAQ90C,KAAK+vC,MAAO50C,KAAKyiC,GAAGxiB,EAAIjgB,KAAKwqB,KAAKvK,EAAKjgB,KAAKyiC,GAAG1U,EAAI/tB,KAAKwqB,KAAKuD,GACrEwK,EAAMv4B,KAAKyiC,GAAG1U,EAAI/tB,KAAKwqB,KAAKuD,EAC5B9M,EAAMjhB,KAAKyiC,GAAGxiB,EAAIjgB,KAAKwqB,KAAKvK,EAC5BiiE,EAAoBr9E,KAAK2jC,KAAKjQ,EAAKA,EAAKtX,EAAKA,GAC7CkhE,EAAiBniF,KAAKwqB,KAAK+yD,iBAAiBl9C,EAAKsZ,EAAQ90C,KAAK4/B,IAC9D29C,GAAmBF,EAAoBC,GAAkBD,EACzD9B,EAAQ,EAAoBpgF,KAAKwqB,KAAKuD,GAAK,EAAIq0D,GAAmBpiF,KAAKyiC,GAAG1U,EAC1EsyD,EAAQ,EAAoBrgF,KAAKwqB,KAAKvK,GAAK,EAAImiE,GAAmBpiF,KAAKyiC,GAAGxiB,CAGrC,IAArCjgB,KAAK8N,QAAQw5D,aAAaC,SAAwD,GAArCvnE,KAAK8N,QAAQw5D,aAAav5D,QACzEmkE,EAAMlyE,KAAKkyE,IAEiC,GAArClyE,KAAK8N,QAAQw5D,aAAav5D,UACjCmkE,EAAMlyE,KAAKohF,sBAG4B,GAArCphF,KAAK8N,QAAQw5D,aAAav5D,SAA4B,MAATmkE,EAAInkD,IACnD4rB,EAAQ90C,KAAK+vC,MAAO50C,KAAKyiC,GAAGxiB,EAAIiyD,EAAIjyD,EAAKjgB,KAAKyiC,GAAG1U,EAAImkD,EAAInkD,GACzDwK,EAAMv4B,KAAKyiC,GAAG1U,EAAImkD,EAAInkD,EACtB9M,EAAMjhB,KAAKyiC,GAAGxiB,EAAIiyD,EAAIjyD,EACtBiiE,EAAoBr9E,KAAK2jC,KAAKjQ,EAAKA,EAAKtX,EAAKA,GAE/C,IAGIq/D,GAAIC,EAHJ8B,EAAeriF,KAAKyiC,GAAG86C,iBAAiBl9C,EAAKsZ,GAC7C2oC,GAAiBJ,EAAoBG,GAAgBH,CAYzD,OATyC,IAArCliF,KAAK8N,QAAQw5D,aAAav5D,SAA4B,MAATmkE,EAAInkD,GACnDuyD,GAAO,EAAIgC,GAAiBpQ,EAAInkD,EAAIu0D,EAAgBtiF,KAAKyiC,GAAG1U,EAC5DwyD,GAAO,EAAI+B,GAAiBpQ,EAAIjyD,EAAIqiE,EAAgBtiF,KAAKyiC,GAAGxiB,IAG5DqgE,GAAO,EAAIgC,GAAiBtiF,KAAKwqB,KAAKuD,EAAIu0D,EAAgBtiF,KAAKyiC,GAAG1U,EAClEwyD,GAAO,EAAI+B,GAAiBtiF,KAAKwqB,KAAKvK,EAAIqiE,EAAgBtiF,KAAKyiC,GAAGxiB,IAG5DuK,MAAMuD,EAAEqyD,EAAMngE,EAAEogE,GAAO59C,IAAI1U,EAAEuyD,EAAIrgE,EAAEsgE,KAG7C1gF,EAAOD,QAAUoD,GAIb,SAASnD,GAWb,QAASuD,GAAMuwB,EAAW5F,EAAG9N,EAAG0iB,EAAMxU,GAElCnuB,KAAK2zB,UADHA,EACeA,EAGAnG,SAAS0gB,KAId/nC,SAAVgoB,IACe,gBAANJ,IACTI,EAAQJ,EACRA,EAAI5nB,QACqB,gBAATw8B,IAChBxU,EAAQwU,EACRA,EAAOx8B,QAGPgoB,GACEg2C,UAAW,QACXC,SAAU,GACVC,SAAU,UACV55D,OACEkB,OAAQ,OACRD,WAAY,aAMpB1L,KAAK+tB,EAAI,EACT/tB,KAAKigB,EAAI,EACTjgB,KAAKw9B,QAAU,EAELr3B,SAAN4nB,GAAyB5nB,SAAN8Z,GACrBjgB,KAAKkxE,YAAYnjD,EAAG9N,GAET9Z,SAATw8B,GACF3iC,KAAKmxE,QAAQxuC,GAIf3iC,KAAKg5B,MAAQxL,SAASK,cAAc,MACpC,IAAIi2D,GAAY9jF,KAAKg5B,MAAM7K,KAC3B21D,GAAUzmD,SAAW,WACrBymD,EAAUjiC,WAAa,SACvBiiC,EAAUn4E,OAAS,aAAewiB,EAAM1jB,MAAMkB,OAC9Cm4E,EAAUr5E,MAAQ0jB,EAAMg2C,UACxB2f,EAAU1f,SAAWj2C,EAAMi2C,SAAW,KACtC0f,EAAUC,WAAa51D,EAAMk2C,SAC7Byf,EAAUtmD,QAAUx9B,KAAKw9B,QAAU,KACnCsmD,EAAUzqD,gBAAkBlL,EAAM1jB,MAAMiB,WACxCo4E,EAAUj7C,aAAe,MACzBi7C,EAAUt4C,gBAAkB,MAC5Bs4C,EAAUE,mBAAqB,MAC/BF,EAAUh7C,UAAY,wCACtBg7C,EAAUG,WAAa,SACvBjkF,KAAK2zB,UAAUjG,YAAY1tB,KAAKg5B,OAOlC51B,EAAMoR,UAAU08D,YAAc,SAASnjD,EAAG9N,GACxCjgB,KAAK+tB,EAAInS,SAASmS,GAClB/tB,KAAKigB,EAAIrE,SAASqE,IAOpB7c,EAAMoR,UAAU28D,QAAU,SAASxuC,GACjC3iC,KAAKg5B,MAAMyE,UAAYkF,GAOzBv/B,EAAMoR,UAAUs1C,KAAO,SAAUA,GAK/B,GAJa3jD,SAAT2jD,IACFA,GAAO,GAGLA,EAAM,CACR,GAAIt7B,GAASxuB,KAAKg5B,MAAMqF,aACpB9P,EAASvuB,KAAKg5B,MAAME,YACpB6U,EAAY/tC,KAAKg5B,MAAMtvB,WAAW20B,aAClC6lD,EAAWlkF,KAAKg5B,MAAMtvB,WAAWwvB,YAEjC1xB,EAAOxH,KAAKigB,EAAIuO,CAChBhnB,GAAMgnB,EAASxuB,KAAKw9B,QAAUuQ,IAChCvmC,EAAMumC,EAAYvf,EAASxuB,KAAKw9B,SAE9Bh2B,EAAMxH,KAAKw9B,UACbh2B,EAAMxH,KAAKw9B,QAGb,IAAIp2B,GAAOpH,KAAK+tB,CACZ3mB,GAAOmnB,EAAQvuB,KAAKw9B,QAAU0mD,IAChC98E,EAAO88E,EAAW31D,EAAQvuB,KAAKw9B,SAE7Bp2B,EAAOpH,KAAKw9B,UACdp2B,EAAOpH,KAAKw9B,SAGdx9B,KAAKg5B,MAAM7K,MAAM/mB,KAAOA,EAAO,KAC/BpH,KAAKg5B,MAAM7K,MAAM3mB,IAAMA,EAAM,KAC7BxH,KAAKg5B,MAAM7K,MAAM0zB,WAAa,cAG9B7hD,MAAKiqD,QAOT7mD,EAAMoR,UAAUy1C,KAAO,WACrBjqD,KAAKg5B,MAAM7K,MAAM0zB,WAAa,UAGhChiD,EAAOD,QAAUwD,GAKb,SAASvD,EAAQD,EAASM,GAE9B,GAAIikF,GAAejkF,EAAoB,IACnCkkF,EAAelkF,EAAoB,IACnCmkF,EAAenkF,EAAoB,IACnCokF,EAAiBpkF,EAAoB,IACrCqkF,EAAoBrkF,EAAoB,IACxCskF,EAAkBtkF,EAAoB,IACtCukF,EAA0BvkF,EAAoB,GAQlDN,GAAQ8kF,WAAa,SAAUC,GAC7B,IAAK,GAAIC,KAAiBD,GACpBA,EAAel/E,eAAem/E,KAChC5kF,KAAK4kF,GAAiBD,EAAeC,KAY3ChlF,EAAQilF,YAAc,SAAUF,GAC9B,IAAK,GAAIC,KAAiBD,GACpBA,EAAel/E,eAAem/E,KAChC5kF,KAAK4kF,GAAiBz+E,SAW5BvG,EAAQ+oE,mBAAqB,WAC3B3oE,KAAK0kF,WAAWP,GAChBnkF,KAAK8kF,2BACkC,GAAnC9kF,KAAKkoE,UAAUlD,kBACjBhlE,KAAK+kF,6BAUTnlF,EAAQipE,mBAAqB,WAC3B7oE,KAAKg7E,eAAiB,EACtBh7E,KAAKglF,aAAe,EACpBhlF,KAAK0kF,WAAWN,IASlBxkF,EAAQgpE,kBAAoB,WAC1B5oE,KAAKmyE,WACLnyE,KAAKilF,cAAgB,WACrBjlF,KAAKmyE,QAAgB,UACrBnyE,KAAKmyE,QAAgB,OAAE,YAAcvO,SACnCW,SACA8E,eACAkS,eAAkB,EAClB2J,YAAe/+E,QACjBnG,KAAKmyE,QAAgB,UACrBnyE,KAAKmyE,QAAiB,SAAKvO,SACzBW,SACA8E,eACAkS,eAAkB,EAClB2J,YAAe/+E,QAEjBnG,KAAKqpE,YAAcrpE,KAAKmyE,QAAgB,OAAE,WAAwB,YAElEnyE,KAAK0kF,WAAWL,IASlBzkF,EAAQkpE,qBAAuB,WAC7B9oE,KAAK6uE,cAAgBjL,SAAWW,UAEhCvkE,KAAK0kF,WAAWJ,IASlB1kF,EAAQqtE,wBAA0B,WAEhCjtE,KAAKmlF,8BAA+B,EACpCnlF,KAAKolF,sBAAuB,EAEmB,GAA3CplF,KAAKkoE,UAAUlB,iBAAiBj5D,SAEL5H,SAAzBnG,KAAKqlF,kBACPrlF,KAAKqlF,gBAAkB73D,SAASK,cAAc,OAC9C7tB,KAAKqlF,gBAAgB19E,UAAY,0BACjC3H,KAAKqlF,gBAAgBhlF,GAAK,0BAExBL,KAAKqlF,gBAAgBl3D,MAAMoiC,QADR,GAAjBvwD,KAAK4sE,SAC8B,QAGA,OAEvC5sE,KAAKg5B,MAAMtL,YAAY1tB,KAAKqlF,kBAGLl/E,SAArBnG,KAAKslF,cACPtlF,KAAKslF,YAAc93D,SAASK,cAAc,OAC1C7tB,KAAKslF,YAAY39E,UAAY,gCAC7B3H,KAAKslF,YAAYjlF,GAAK,gCAEpBL,KAAKslF,YAAYn3D,MAAMoiC,QADJ,GAAjBvwD,KAAK4sE,SAC0B,OAGA,QAEnC5sE,KAAKg5B,MAAMtL,YAAY1tB,KAAKslF,cAGRn/E,SAAlBnG,KAAKulF,WACPvlF,KAAKulF,SAAW/3D,SAASK,cAAc,OACvC7tB,KAAKulF,SAAS59E,UAAY,gCAC1B3H,KAAKulF,SAASllF,GAAK,gCACnBL,KAAKulF,SAASp3D,MAAMoiC,QAAUvwD,KAAKqlF,gBAAgBl3D,MAAMoiC,QACzDvwD,KAAKg5B,MAAMtL,YAAY1tB,KAAKulF,WAI9BvlF,KAAK0kF,WAAWH,GAGhBvkF,KAAKiuE,yBAGwB9nE,SAAzBnG,KAAKqlF,kBAEPrlF,KAAKiuE,wBAELjuE,KAAK6zB,iBAAiBzG,YAAYptB,KAAKqlF,iBACvCrlF,KAAK6zB,iBAAiBzG,YAAYptB,KAAKslF,aACvCtlF,KAAK6zB,iBAAiBzG,YAAYptB,KAAKulF,UAEvCvlF,KAAKqlF,gBAAkBl/E,OACvBnG,KAAKslF,YAAcn/E,OACnBnG,KAAKulF,SAAWp/E,OAEhBnG,KAAK6kF,YAAYN,KAWvB3kF,EAAQotE,wBAA0B,WAChChtE,KAAK0kF,WAAWF,GAGhBxkF,KAAKwlF,mBACoC,GAArCxlF,KAAKkoE,UAAUrB,WAAW94D,SAC5B/N,KAAKylF,2BAUT7lF,EAAQmpE,qBAAuB,WAC7B/oE,KAAK0kF,WAAWD,KAMd,SAAS5kF,EAAQD,EAASM,GAuf9B,QAASwlF,KACP1lF,KAAKkoE,UAAUZ,aAAav5D,SAAW/N,KAAKkoE,UAAUZ,aAAav5D,OACnE,IAAI43E,GAAqBn4D,SAASo4D,eAAe,qBACCD,GAAmBx3D,MAAMziB,WAAhC,GAAvC1L,KAAKkoE,UAAUZ,aAAav5D,QAAwD,UACR,UAEhF/N,KAAKktE,wBAAuB,GAO9B,QAAS2Y,KACP,IAAK,GAAI3a,KAAUlrE,MAAKmpE,iBAClBnpE,KAAKmpE,iBAAiB1jE,eAAeylE,KACvClrE,KAAKmpE,iBAAiB+B,GAAQ0P,GAAK,EAAI56E,KAAKmpE,iBAAiB+B,GAAQ2P,GAAK,EAC1E76E,KAAKmpE,iBAAiB+B,GAAQwP,GAAK,EAAI16E,KAAKmpE,iBAAiB+B,GAAQyP,GAAK,EAG7B,IAA7C36E,KAAKkoE,UAAUhB,mBAAmBn5D,SACpC/N,KAAKsqE,2BACLwb,EAAiBvlF,KAAKP,KAAM,aAAc,EAAG,8CAC7C8lF,EAAiBvlF,KAAKP,KAAM,aAAc,EAAG,0BAC7C8lF,EAAiBvlF,KAAKP,KAAM,aAAc,EAAG,0BAC7C8lF,EAAiBvlF,KAAKP,KAAM,aAAc,EAAG,wBAC7C8lF,EAAiBvlF,KAAKP,KAAM,eAAgB,EAAG,oBAG/CA,KAAK+lF,kBAEP/lF,KAAKqqE,QAAS,EACdrqE,KAAK8O,QAMP,QAASk3E,KACP,GAAIl4E,GAAU,gDACVm4E,KACAC,EAAe14D,SAASo4D,eAAe,wBACvCO,EAAe34D,SAASo4D,eAAe,uBAC3C,IAA4B,GAAxBM,EAAaE,QAAiB,CAMhC,GALIpmF,KAAKkoE,UAAUjD,QAAQC,UAAUE,uBAAyBplE,KAAKqmF,gBAAgBphB,QAAQC,UAAUE,uBAAwB6gB,EAAgBn+E,KAAK,0BAA4B9H,KAAKkoE,UAAUjD,QAAQC,UAAUE,uBAC3MplE,KAAKkoE,UAAUjD,QAAQI,gBAAkBrlE,KAAKqmF,gBAAgBphB,QAAQC,UAAUG,gBAAyC4gB,EAAgBn+E,KAAK,mBAAqB9H,KAAKkoE,UAAUjD,QAAQI,gBAC1LrlE,KAAKkoE,UAAUjD,QAAQK,cAAgBtlE,KAAKqmF,gBAAgBphB,QAAQC,UAAUI,cAA2C2gB,EAAgBn+E,KAAK,iBAAmB9H,KAAKkoE,UAAUjD,QAAQK,cACxLtlE,KAAKkoE,UAAUjD,QAAQM,gBAAkBvlE,KAAKqmF,gBAAgBphB,QAAQC,UAAUK,gBAAyC0gB,EAAgBn+E,KAAK,mBAAqB9H,KAAKkoE,UAAUjD,QAAQM,gBAC1LvlE,KAAKkoE,UAAUjD,QAAQO,SAAWxlE,KAAKqmF,gBAAgBphB,QAAQC,UAAUM,SAAgDygB,EAAgBn+E,KAAK,YAAc9H,KAAKkoE,UAAUjD,QAAQO,SACzJ,GAA1BygB,EAAgB3gF,OAAa,CAC/BwI,EAAU,kBACVA,GAAW,wBACX,KAAK,GAAI3I,GAAI,EAAGA,EAAI8gF,EAAgB3gF,OAAQH,IAC1C2I,GAAWm4E,EAAgB9gF,GACvBA,EAAI8gF,EAAgB3gF,OAAS,IAC/BwI,GAAW,KAGfA,IAAW,KAET9N,KAAKkoE,UAAUZ,aAAav5D,SAAW/N,KAAKqmF,gBAAgB/e,aAAav5D,UAC7C,GAA1Bk4E,EAAgB3gF,OAAcwI,EAAU,kBACtCA,GAAW,KACjBA,GAAW,iBAAmB9N,KAAKkoE,UAAUZ,aAAav5D,SAE7C,iDAAXD,IACFA,GAAW,UAGV,IAA4B,GAAxBq4E,EAAaC,QAAiB,CAQrC,GAPAt4E,EAAU,kBACVA,GAAW,wCACP9N,KAAKkoE,UAAUjD,QAAQQ,UAAUC,cAAgB1lE,KAAKqmF,gBAAgBphB,QAAQQ,UAAUC,cAAgBugB,EAAgBn+E,KAAK,iBAAmB9H,KAAKkoE,UAAUjD,QAAQQ,UAAUC,cACjL1lE,KAAKkoE,UAAUjD,QAAQI,gBAAkBrlE,KAAKqmF,gBAAgBphB,QAAQQ,UAAUJ,gBAAwB4gB,EAAgBn+E,KAAK,mBAAqB9H,KAAKkoE,UAAUjD,QAAQI,gBACzKrlE,KAAKkoE,UAAUjD,QAAQK,cAAgBtlE,KAAKqmF,gBAAgBphB,QAAQQ,UAAUH,cAA0B2gB,EAAgBn+E,KAAK,iBAAmB9H,KAAKkoE,UAAUjD,QAAQK,cACvKtlE,KAAKkoE,UAAUjD,QAAQM,gBAAkBvlE,KAAKqmF,gBAAgBphB,QAAQQ,UAAUF,gBAAwB0gB,EAAgBn+E,KAAK,mBAAqB9H,KAAKkoE,UAAUjD,QAAQM,gBACzKvlE,KAAKkoE,UAAUjD,QAAQO,SAAWxlE,KAAKqmF,gBAAgBphB,QAAQQ,UAAUD,SAA+BygB,EAAgBn+E,KAAK,YAAc9H,KAAKkoE,UAAUjD,QAAQO,SACxI,GAA1BygB,EAAgB3gF,OAAa,CAC/BwI,GAAW,gBACX,KAAK,GAAI3I,GAAI,EAAGA,EAAI8gF,EAAgB3gF,OAAQH,IAC1C2I,GAAWm4E,EAAgB9gF,GACvBA,EAAI8gF,EAAgB3gF,OAAS,IAC/BwI,GAAW,KAGfA,IAAW,KAEiB,GAA1Bm4E,EAAgB3gF,SAAcwI,GAAW,KACzC9N,KAAKkoE,UAAUZ,cAAgBtnE,KAAKqmF,gBAAgB/e,eACtDx5D,GAAW,mBAAqB9N,KAAKkoE,UAAUZ,cAEjDx5D,GAAW,SAER,CAOH,GANAA,EAAU,kBACN9N,KAAKkoE,UAAUjD,QAAQU,sBAAsBD,cAAgB1lE,KAAKqmF,gBAAgBphB,QAAQU,sBAAsBD,cAAgBugB,EAAgBn+E,KAAK,iBAAmB9H,KAAKkoE,UAAUjD,QAAQU,sBAAsBD,cACrN1lE,KAAKkoE,UAAUjD,QAAQI,gBAAkBrlE,KAAKqmF,gBAAgBphB,QAAQU,sBAAsBN,gBAAwB4gB,EAAgBn+E,KAAK,mBAAqB9H,KAAKkoE,UAAUjD,QAAQI,gBACrLrlE,KAAKkoE,UAAUjD,QAAQK,cAAgBtlE,KAAKqmF,gBAAgBphB,QAAQU,sBAAsBL,cAA0B2gB,EAAgBn+E,KAAK,iBAAmB9H,KAAKkoE,UAAUjD,QAAQK,cACnLtlE,KAAKkoE,UAAUjD,QAAQM,gBAAkBvlE,KAAKqmF,gBAAgBphB,QAAQU,sBAAsBJ,gBAAwB0gB,EAAgBn+E,KAAK,mBAAqB9H,KAAKkoE,UAAUjD,QAAQM,gBACrLvlE,KAAKkoE,UAAUjD,QAAQO,SAAWxlE,KAAKqmF,gBAAgBphB,QAAQU,sBAAsBH,SAA+BygB,EAAgBn+E,KAAK,YAAc9H,KAAKkoE,UAAUjD,QAAQO,SACpJ,GAA1BygB,EAAgB3gF,OAAa,CAC/BwI,GAAW,oCACX,KAAK,GAAI3I,GAAI,EAAGA,EAAI8gF,EAAgB3gF,OAAQH,IAC1C2I,GAAWm4E,EAAgB9gF,GACvBA,EAAI8gF,EAAgB3gF,OAAS,IAC/BwI,GAAW,KAGfA,IAAW,MAOb,GALAA,GAAW,wBACXm4E,KACIjmF,KAAKkoE,UAAUhB,mBAAmBhyB,WAAal1C,KAAKqmF,gBAAgBnf,mBAAmBhyB,WAAkC+wC,EAAgBn+E,KAAK,cAAgB9H,KAAKkoE,UAAUhB,mBAAmBhyB,WAChMrwC,KAAK+O,IAAI5T,KAAKkoE,UAAUhB,mBAAmBC,kBAAoBnnE,KAAKqmF,gBAAgBnf,mBAAmBC,iBAAkB8e,EAAgBn+E,KAAK,oBAAsB9H,KAAKkoE,UAAUhB,mBAAmBC,iBACtMnnE,KAAKkoE,UAAUhB,mBAAmBE,aAAepnE,KAAKqmF,gBAAgBnf,mBAAmBE,aAAgC6e,EAAgBn+E,KAAK,gBAAkB9H,KAAKkoE,UAAUhB,mBAAmBE,aACxK,GAA1B6e,EAAgB3gF,OAAa,CAC/B,IAAK,GAAIH,GAAI,EAAGA,EAAI8gF,EAAgB3gF,OAAQH,IAC1C2I,GAAWm4E,EAAgB9gF,GACvBA,EAAI8gF,EAAgB3gF,OAAS,IAC/BwI,GAAW,KAGfA,IAAW,QAGXA,IAAW,eAEbA,IAAW,KAIb9N,KAAKsmF,WAAW7oD,UAAY3vB,EAO9B,QAASy4E,KACP,GAAI71D,IAAO,iBAAkB,gBAAiB,iBAC1C81D,EAAch5D,SAASi5D,cAAc,6CAA6Cz/E,MAClF0/E,EAAU,SAAWF,EAAc,SACnCG,EAAQn5D,SAASo4D,eAAec,EACpCC,GAAMx4D,MAAMoiC,QAAU,OACtB,KAAK,GAAIprD,GAAI,EAAGA,EAAIurB,EAAIprB,OAAQH,IAC1BurB,EAAIvrB,IAAMuhF,IACZC,EAAQn5D,SAASo4D,eAAel1D,EAAIvrB,IACpCwhF,EAAMx4D,MAAMoiC,QAAU,OAG1BvwD,MAAK4mF,gBACc,KAAfJ,GACFxmF,KAAKkoE,UAAUhB,mBAAmBn5D,SAAU,EAC5C/N,KAAKkoE,UAAUjD,QAAQU,sBAAsB53D,SAAU,EACvD/N,KAAKkoE,UAAUjD,QAAQC,UAAUn3D,SAAU,GAErB,KAAfy4E,EAC0C,GAA7CxmF,KAAKkoE,UAAUhB,mBAAmBn5D,UACpC/N,KAAKkoE,UAAUhB,mBAAmBn5D,SAAU,EAC5C/N,KAAKkoE,UAAUjD,QAAQU,sBAAsB53D,SAAU,EACvD/N,KAAKkoE,UAAUjD,QAAQC,UAAUn3D,SAAU,EAC3C/N,KAAKkoE,UAAUZ,aAAav5D,SAAU,EACtC/N,KAAKsqE,6BAIPtqE,KAAKkoE,UAAUhB,mBAAmBn5D,SAAU,EAC5C/N,KAAKkoE,UAAUjD,QAAQU,sBAAsB53D,SAAU,EACvD/N,KAAKkoE,UAAUjD,QAAQC,UAAUn3D,SAAU,GAE7C/N,KAAK8kF,0BACL,IAAIa,GAAqBn4D,SAASo4D,eAAe,qBACCD,GAAmBx3D,MAAMziB,WAAhC,GAAvC1L,KAAKkoE,UAAUZ,aAAav5D,QAAwD,UACR,UAChF/N,KAAKqqE,QAAS,EACdrqE,KAAK8O,QAWP,QAASg3E,GAAkBzlF,EAAGmsB,EAAIq6D,GAChC,GAAIC,GAAUzmF,EAAK,SACf0mF,EAAav5D,SAASo4D,eAAevlF,GAAI2G,KAEzCwlB,aAAe5mB,QACjB4nB,SAASo4D,eAAekB,GAAS9/E,MAAQwlB,EAAI5Q,SAASmrE,IACtD/mF,KAAKgnF,yBAAyBH,EAAsBr6D,EAAI5Q,SAASmrE,OAGjEv5D,SAASo4D,eAAekB,GAAS9/E,MAAQ4U,SAAS4Q,GAAOvQ,WAAW8qE,GACpE/mF,KAAKgnF,yBAAyBH,EAAuBjrE,SAAS4Q,GAAOvQ,WAAW8qE,MAGrD,gCAAzBF,GACuB,sCAAzBA,GACyB,kCAAzBA,IACA7mF,KAAKsqE,2BAEPtqE,KAAKqqE,QAAS,EACdrqE,KAAK8O,QAlsBP,GAAInO,GAAOT,EAAoB,GAC3B+mF,EAAiB/mF,EAAoB,IACrCgnF,EAA4BhnF,EAAoB,IAChDinF,EAAiBjnF,EAAoB,GAOzCN,GAAQwnF,iBAAmB,WACzBpnF,KAAKkoE,UAAUjD,QAAQC,UAAUn3D,SAAW/N,KAAKkoE,UAAUjD,QAAQC,UAAUn3D,QAC7E/N,KAAK8kF,2BACL9kF,KAAKqqE,QAAS,EACdrqE,KAAK8O,SASPlP,EAAQklF,yBAA2B,WAEe,GAA5C9kF,KAAKkoE,UAAUjD,QAAQC,UAAUn3D,SACnC/N,KAAK6kF,YAAYoC,GACjBjnF,KAAK6kF,YAAYqC,GAEjBlnF,KAAKkoE,UAAUjD,QAAQI,eAAiBrlE,KAAKkoE,UAAUjD,QAAQC,UAAUG,eACzErlE,KAAKkoE,UAAUjD,QAAQK,aAAetlE,KAAKkoE,UAAUjD,QAAQC,UAAUI,aACvEtlE,KAAKkoE,UAAUjD,QAAQM,eAAiBvlE,KAAKkoE,UAAUjD,QAAQC,UAAUK,eACzEvlE,KAAKkoE,UAAUjD,QAAQO,QAAUxlE,KAAKkoE,UAAUjD,QAAQC,UAAUM,QAElExlE,KAAK0kF,WAAWyC,IAE+C,GAAxDnnF,KAAKkoE,UAAUjD,QAAQU,sBAAsB53D,SACpD/N,KAAK6kF,YAAYsC,GACjBnnF,KAAK6kF,YAAYoC,GAEjBjnF,KAAKkoE,UAAUjD,QAAQI,eAAiBrlE,KAAKkoE,UAAUjD,QAAQU,sBAAsBN,eACrFrlE,KAAKkoE,UAAUjD,QAAQK,aAAetlE,KAAKkoE,UAAUjD,QAAQU,sBAAsBL,aACnFtlE,KAAKkoE,UAAUjD,QAAQM,eAAiBvlE,KAAKkoE,UAAUjD,QAAQU,sBAAsBJ,eACrFvlE,KAAKkoE,UAAUjD,QAAQO,QAAUxlE,KAAKkoE,UAAUjD,QAAQU,sBAAsBH,QAE9ExlE,KAAK0kF,WAAWwC,KAGhBlnF,KAAK6kF,YAAYsC,GACjBnnF,KAAK6kF,YAAYqC,GACjBlnF,KAAKqnF,cAAgBlhF,OAErBnG,KAAKkoE,UAAUjD,QAAQI,eAAiBrlE,KAAKkoE,UAAUjD,QAAQQ,UAAUJ,eACzErlE,KAAKkoE,UAAUjD,QAAQK,aAAetlE,KAAKkoE,UAAUjD,QAAQQ,UAAUH,aACvEtlE,KAAKkoE,UAAUjD,QAAQM,eAAiBvlE,KAAKkoE,UAAUjD,QAAQQ,UAAUF,eACzEvlE,KAAKkoE,UAAUjD,QAAQO,QAAUxlE,KAAKkoE,UAAUjD,QAAQQ,UAAUD,QAElExlE,KAAK0kF,WAAWuC,KAUpBrnF,EAAQ0nF,4BAA8B,WAEL,GAA3BtnF,KAAKqpE,YAAY/jE,OACnBtF,KAAK4jE,MAAM5jE,KAAKqpE,YAAY,IAAImU,UAAU,EAAG,IAIzCx9E,KAAKqpE,YAAY/jE,OAAStF,KAAKkoE,UAAUtC,WAAWE,kBAAyD,GAArC9lE,KAAKkoE,UAAUtC,WAAW73D,SACpG/N,KAAKunF,aAAavnF,KAAKkoE,UAAUtC,WAAWG,eAAe,GAI7D/lE,KAAKwnF,qBAUT5nF,EAAQ4nF,iBAAmB,WAKzBxnF,KAAKynF,gCACLznF,KAAK0nF,uBAED1nF,KAAKkoE,UAAUjD,QAAQM,eAAiB,IACC,GAAvCvlE,KAAKkoE,UAAUZ,aAAav5D,SAA0D,GAAvC/N,KAAKkoE,UAAUZ,aAAaC,QAC7EvnE,KAAK2nF,oCAGuD,GAAxD3nF,KAAKkoE,UAAUjD,QAAQU,sBAAsB53D,QAC/C/N,KAAK4nF,qCAGL5nF,KAAK6nF,2BAebjoF,EAAQ2xE,wBAA0B,WAChC,GAA2C,GAAvCvxE,KAAKkoE,UAAUZ,aAAav5D,SAA0D,GAAvC/N,KAAKkoE,UAAUZ,aAAaC,QAAiB,CAC9FvnE,KAAKmpE,oBACLnpE,KAAKopE,yBAEL,KAAK,GAAI8B,KAAUlrE,MAAK4jE,MAClB5jE,KAAK4jE,MAAMn+D,eAAeylE,KAC5BlrE,KAAKmpE,iBAAiB+B,GAAUlrE,KAAK4jE,MAAMsH,GAG/C,IAAI4c,GAAe9nF,KAAKmyE,QAAiB,QAAS,KAClD,KAAK,GAAI4V,KAAiBD,GACpBA,EAAariF,eAAesiF,KAC1B/nF,KAAKukE,MAAM9+D,eAAeqiF,EAAaC,GAAehT,cACxD/0E,KAAKmpE,iBAAiB4e,GAAiBD,EAAaC,GAGpDD,EAAaC,GAAevK,UAAU,EAAG,GAK/C,KAAK,GAAI1R,KAAO9rE,MAAKmpE,iBACfnpE,KAAKmpE,iBAAiB1jE,eAAeqmE,IACvC9rE,KAAKopE,uBAAuBthE,KAAKgkE,OAKrC9rE,MAAKmpE,iBAAmBnpE,KAAK4jE,MAC7B5jE,KAAKopE,uBAAyBppE,KAAKqpE,aAUvCzpE,EAAQ6nF,8BAAgC,WACtC,GAAIlvD,GAAItX,EAAIge,EAAU6U,EAAM3uC,EACxBy+D,EAAQ5jE,KAAKmpE,iBACb6e,EAAUhoF,KAAKkoE,UAAUjD,QAAQI,eACjC4iB,EAAe,CAEnB,KAAK9iF,EAAI,EAAGA,EAAInF,KAAKopE,uBAAuB9jE,OAAQH,IAClD2uC,EAAO8vB,EAAM5jE,KAAKopE,uBAAuBjkE,IACzC2uC,EAAK0xB,QAAUxlE,KAAKkoE,UAAUjD,QAAQO,QAEhB,WAAlBxlE,KAAKkoF,WAAqC,GAAXF,GACjCzvD,GAAMub,EAAK/lB,EACX9M,GAAM6yB,EAAK7zB,EACXgf,EAAWp6B,KAAK2jC,KAAKjQ,EAAKA,EAAKtX,EAAKA,GAEpCgnE,EAA4B,GAAZhpD,EAAiB,EAAK+oD,EAAU/oD,EAChD6U,EAAK4mC,GAAKniD,EAAK0vD,EACfn0C,EAAK6mC,GAAK15D,EAAKgnE,IAGfn0C,EAAK4mC,GAAK,EACV5mC,EAAK6mC,GAAK,IAahB/6E,EAAQioF,uBAAyB,WAC/B,GAAIM,GAAYpX,EAAMP,EAClBj4C,EAAItX,EAAIy5D,EAAIC,EAAIyN,EAAanpD,EAC7BslC,EAAQvkE,KAAKukE,KAGjB,KAAKiM,IAAUjM,GACTA,EAAM9+D,eAAe+qE,KACvBO,EAAOxM,EAAMiM,GACTO,EAAKC,WAEHhxE,KAAK4jE,MAAMn+D,eAAesrE,EAAKuO,OAASt/E,KAAK4jE,MAAMn+D,eAAesrE,EAAKsO,UACzE8I,EAAapX,EAAK9L,QAAQK,aAE1B6iB,IAAepX,EAAKtuC,GAAG+4C,YAAczK,EAAKvmD,KAAKgxD,YAAc,GAAKx7E,KAAKkoE,UAAUtC,WAAWY,WAE5FjuC,EAAMw4C,EAAKvmD,KAAKuD,EAAIgjD,EAAKtuC,GAAG1U,EAC5B9M,EAAM8vD,EAAKvmD,KAAKvK,EAAI8wD,EAAKtuC,GAAGxiB,EAC5Bgf,EAAWp6B,KAAK2jC,KAAKjQ,EAAKA,EAAKtX,EAAKA,GAEpB,GAAZge,IACFA,EAAW,KAIbmpD,EAAcpoF,KAAKkoE,UAAUjD,QAAQM,gBAAkB4iB,EAAalpD,GAAYA,EAEhFy7C,EAAKniD,EAAK6vD,EACVzN,EAAK15D,EAAKmnE,EAEVrX,EAAKvmD,KAAKkwD,IAAMA,EAChB3J,EAAKvmD,KAAKmwD,IAAMA,EAChB5J,EAAKtuC,GAAGi4C,IAAMA,EACd3J,EAAKtuC,GAAGk4C,IAAMA,KAexB/6E,EAAQ+nF,kCAAoC,WAC1C,GAAIQ,GAAYpX,EAAMP,EAAQ6X,EAC1B9jB,EAAQvkE,KAAKukE,KAGjB,KAAKiM,IAAUjM,GACb,GAAIA,EAAM9+D,eAAe+qE,KACvBO,EAAOxM,EAAMiM,GACTO,EAAKC,WAEHhxE,KAAK4jE,MAAMn+D,eAAesrE,EAAKuO,OAASt/E,KAAK4jE,MAAMn+D,eAAesrE,EAAKsO,SACzD,MAAZtO,EAAKmB,KAAa,CACpB,GAAIoW,GAAQvX,EAAKtuC,GACb8lD,EAAQxX,EAAKmB,IACbsW,EAAQzX,EAAKvmD,IAEjB29D,GAAapX,EAAK9L,QAAQK,aAE1B+iB,EAAsBC,EAAM9M,YAAcgN,EAAMhN,YAAc,EAG9D2M,GAAcE,EAAsBroF,KAAKkoE,UAAUtC,WAAWY,WAC9DxmE,KAAKyoF,sBAAsBH,EAAOC,EAAO,GAAMJ,GAC/CnoF,KAAKyoF,sBAAsBF,EAAOC,EAAO,GAAML,KAiB3DvoF,EAAQ6oF,sBAAwB,SAAUH,EAAOC,EAAOJ,GACtD,GAAI5vD,GAAItX,EAAIy5D,EAAIC,EAAIyN,EAAanpD,CAEjC1G,GAAM+vD,EAAMv6D,EAAIw6D,EAAMx6D,EACtB9M,EAAMqnE,EAAMroE,EAAIsoE,EAAMtoE,EACtBgf,EAAWp6B,KAAK2jC,KAAKjQ,EAAKA,EAAKtX,EAAKA,GAEpB,GAAZge,IACFA,EAAW,KAIbmpD,EAAcpoF,KAAKkoE,UAAUjD,QAAQM,gBAAkB4iB,EAAalpD,GAAYA,EAEhFy7C,EAAKniD,EAAK6vD,EACVzN,EAAK15D,EAAKmnE,EAEVE,EAAM5N,IAAMA,EACZ4N,EAAM3N,IAAMA,EACZ4N,EAAM7N,IAAMA,EACZ6N,EAAM5N,IAAMA,GAQd/6E,EAAQmlF,0BAA4B,WAClC,GAAkC5+E,SAA9BnG,KAAK0oF,qBAAoC,CAC3C1oF,KAAKqmF,mBACL1lF,EAAKyF,WAAWpG,KAAKqmF,gBAAgBrmF,KAAKkoE,UAE1C,IAAIygB,IAAgC,KAAM,KAAM,KAAM,KACtD3oF,MAAK0oF,qBAAuBl7D,SAASK,cAAc,OACnD7tB,KAAK0oF,qBAAqB/gF,UAAY,uBACtC3H,KAAK0oF,qBAAqBjrD,UAAY,onBAW2E,GAAKz9B,KAAKkoE,UAAUjD,QAAQC,UAAUE,sBAAyB,wGAA2G,GAAKplE,KAAKkoE,UAAUjD,QAAQC,UAAUE,sBAAyB,4JAGpPplE,KAAKkoE,UAAUjD,QAAQC,UAAUG,eAAiB,wFAA0FrlE,KAAKkoE,UAAUjD,QAAQC,UAAUG,eAAiB,2JAG/LrlE,KAAKkoE,UAAUjD,QAAQC,UAAUI,aAAe,sFAAwFtlE,KAAKkoE,UAAUjD,QAAQC,UAAUI,aAAe,6JAGtLtlE,KAAKkoE,UAAUjD,QAAQC,UAAUK,eAAiB,0FAA4FvlE,KAAKkoE,UAAUjD,QAAQC,UAAUK,eAAiB,sJAGvMvlE,KAAKkoE,UAAUjD,QAAQC,UAAUM,QAAU,4FAA8FxlE,KAAKkoE,UAAUjD,QAAQC,UAAUM,QAAU,sPAM/KxlE,KAAKkoE,UAAUjD,QAAQQ,UAAUC,aAAe,kGAAoG1lE,KAAKkoE,UAAUjD,QAAQQ,UAAUC,aAAe,2JAGnM1lE,KAAKkoE,UAAUjD,QAAQQ,UAAUJ,eAAiB,uFAAyFrlE,KAAKkoE,UAAUjD,QAAQQ,UAAUJ,eAAiB,0JAG9LrlE,KAAKkoE,UAAUjD,QAAQQ,UAAUH,aAAe,qFAAuFtlE,KAAKkoE,UAAUjD,QAAQQ,UAAUH,aAAe,4JAGrLtlE,KAAKkoE,UAAUjD,QAAQQ,UAAUF,eAAiB,yFAA2FvlE,KAAKkoE,UAAUjD,QAAQQ,UAAUF,eAAiB,qJAGtMvlE,KAAKkoE,UAAUjD,QAAQQ,UAAUD,QAAU,2FAA6FxlE,KAAKkoE,UAAUjD,QAAQQ,UAAUD,QAAU,oQAM9KxlE,KAAKkoE,UAAUjD,QAAQU,sBAAsBD,aAAe,kGAAoG1lE,KAAKkoE,UAAUjD,QAAQU,sBAAsBD,aAAe,2JAG3N1lE,KAAKkoE,UAAUjD,QAAQU,sBAAsBN,eAAiB,uFAAyFrlE,KAAKkoE,UAAUjD,QAAQU,sBAAsBN,eAAiB,0JAGtNrlE,KAAKkoE,UAAUjD,QAAQU,sBAAsBL,aAAe,qFAAuFtlE,KAAKkoE,UAAUjD,QAAQU,sBAAsBL,aAAe,4JAG7MtlE,KAAKkoE,UAAUjD,QAAQU,sBAAsBJ,eAAiB,yFAA2FvlE,KAAKkoE,UAAUjD,QAAQU,sBAAsBJ,eAAiB,qJAG9NvlE,KAAKkoE,UAAUjD,QAAQU,sBAAsBH,QAAU,2FAA6FxlE,KAAKkoE,UAAUjD,QAAQU,sBAAsBH,QAAU,uJAG3MmjB,EAA6BriF,QAAQtG,KAAKkoE,UAAUhB,mBAAmBhyB,WAAa,0FAA4Fl1C,KAAKkoE,UAAUhB,mBAAmBhyB,UAAY,oKAGtNl1C,KAAKkoE,UAAUhB,mBAAmBC,gBAAkB,yFAA2FnnE,KAAKkoE,UAAUhB,mBAAmBC,gBAAkB,6JAGvMnnE,KAAKkoE,UAAUhB,mBAAmBE,YAAc,wFAA0FpnE,KAAKkoE,UAAUhB,mBAAmBE,YAAc,odAU9RpnE,KAAK6zB,iBAAiB+0D,cAAc1kC,aAAalkD,KAAK0oF,qBAAsB1oF,KAAK6zB,kBACjF7zB,KAAKsmF,WAAa94D,SAASK,cAAc,OACzC7tB,KAAKsmF,WAAWn4D,MAAMi2C,SAAW,OACjCpkE,KAAKsmF,WAAWn4D,MAAM41D,WAAa,UACnC/jF,KAAK6zB,iBAAiB+0D,cAAc1kC,aAAalkD,KAAKsmF,WAAYtmF,KAAK6zB,iBAEvE;GAAIg1D,EACJA,GAAer7D,SAASo4D,eAAe,eACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,cAAe,GAAI,2CACvE6oF,EAAer7D,SAASo4D,eAAe,eACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,cAAe,EAAG,0BACtE6oF,EAAer7D,SAASo4D,eAAe,eACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,cAAe,EAAG,0BACtE6oF,EAAer7D,SAASo4D,eAAe,eACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,cAAe,EAAG,wBACtE6oF,EAAer7D,SAASo4D,eAAe,iBACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,gBAAiB,EAAG,mBAExE6oF,EAAer7D,SAASo4D,eAAe,cACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,aAAc,EAAG,kCACrE6oF,EAAer7D,SAASo4D,eAAe,cACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,aAAc,EAAG,0BACrE6oF,EAAer7D,SAASo4D,eAAe,cACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,aAAc,EAAG,0BACrE6oF,EAAer7D,SAASo4D,eAAe,cACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,aAAc,EAAG,wBACrE6oF,EAAer7D,SAASo4D,eAAe,gBACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,eAAgB,EAAG,mBAEvE6oF,EAAer7D,SAASo4D,eAAe,cACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,aAAc,EAAG,8CACrE6oF,EAAer7D,SAASo4D,eAAe,cACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,aAAc,EAAG,0BACrE6oF,EAAer7D,SAASo4D,eAAe,cACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,aAAc,EAAG,0BACrE6oF,EAAer7D,SAASo4D,eAAe,cACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,aAAc,EAAG,wBACrE6oF,EAAer7D,SAASo4D,eAAe,gBACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,eAAgB,EAAG,mBACvE6oF,EAAer7D,SAASo4D,eAAe,qBACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,oBAAqB2oF,EAA8B,gCACvGE,EAAer7D,SAASo4D,eAAe,kBACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,iBAAkB,EAAG,sCACzE6oF,EAAer7D,SAASo4D,eAAe,iBACvCiD,EAAa3mD,SAAW4jD,EAAiBz3C,KAAKruC,KAAM,gBAAiB,EAAG,iCAExE,IAAIkmF,GAAe14D,SAASo4D,eAAe,wBACvCO,EAAe34D,SAASo4D,eAAe,wBACvCkD,EAAet7D,SAASo4D,eAAe,uBAC3CO,GAAaC,SAAU,EACnBpmF,KAAKkoE,UAAUjD,QAAQC,UAAUn3D,UACnCm4E,EAAaE,SAAU,GAErBpmF,KAAKkoE,UAAUhB,mBAAmBn5D,UACpC+6E,EAAa1C,SAAU,EAGzB,IAAIT,GAAqBn4D,SAASo4D,eAAe,sBAC7CmD,EAAwBv7D,SAASo4D,eAAe,yBAChDoD,EAAwBx7D,SAASo4D,eAAe,wBAEpDD,GAAmBj6C,QAAUg6C,EAAwBr3C,KAAKruC,MAC1D+oF,EAAsBr9C,QAAUm6C,EAAqBx3C,KAAKruC,MAC1DgpF,EAAsBt9C,QAAUs6C,EAAqB33C,KAAKruC,MAExD2lF,EAAmBx3D,MAAMziB,WADQ,GAA/B1L,KAAKkoE,UAAUZ,cAA8D,GAAtCtnE,KAAKkoE,UAAUT,oBAClB,UAGA,UAIxC8e,EAAqB51E,MAAM3Q,MAE3BkmF,EAAahkD,SAAWqkD,EAAqBl4C,KAAKruC,MAClDmmF,EAAajkD,SAAWqkD,EAAqBl4C,KAAKruC,MAClD8oF,EAAa5mD,SAAWqkD,EAAqBl4C,KAAKruC,QAWtDJ,EAAQonF,yBAA2B,SAAUH,EAAuB7/E,GAClE,GAAIiiF,GAAYpC,EAAsBh/E,MAAM,IACpB,IAApBohF,EAAU3jF,OACZtF,KAAKkoE,UAAU+gB,EAAU,IAAMjiF,EAEJ,GAApBiiF,EAAU3jF,OACjBtF,KAAKkoE,UAAU+gB,EAAU,IAAIA,EAAU,IAAMjiF,EAElB,GAApBiiF,EAAU3jF,SACjBtF,KAAKkoE,UAAU+gB,EAAU,IAAIA,EAAU,IAAIA,EAAU,IAAMjiF,KA2N3D,SAASnH,EAAQD,GAQrBA,EAAQ8nF,qBAAuB,WAC7B,GAAInvD,GAAItX,EAAWge,EAAUy7C,EAAIC,EAAI0N,EACnCa,EAAgBZ,EAAOC,EAAOpjF,EAAGqT,EAE/BorD,EAAQ5jE,KAAKmpE,iBACbE,EAAcrpE,KAAKopE,uBAGnB+f,EAAS,GAAK,EACdpjF,EAAI,EAAI,EAGR2/D,EAAe1lE,KAAKkoE,UAAUjD,QAAQQ,UAAUC,aAChD0jB,EAAkB1jB,CAItB,KAAKvgE,EAAI,EAAGA,EAAIkkE,EAAY/jE,OAAS,EAAGH,IAEtC,IADAmjF,EAAQ1kB,EAAMyF,EAAYlkE,IACrBqT,EAAIrT,EAAI,EAAGqT,EAAI6wD,EAAY/jE,OAAQkT,IAAK,CAC3C+vE,EAAQ3kB,EAAMyF,EAAY7wD,IAC1B6vE,EAAsBC,EAAM9M,YAAc+M,EAAM/M,YAAc,EAE9DjjD,EAAKgwD,EAAMx6D,EAAIu6D,EAAMv6D,EACrB9M,EAAKsnE,EAAMtoE,EAAIqoE,EAAMroE,EACrBgf,EAAWp6B,KAAK2jC,KAAKjQ,EAAKA,EAAKtX,EAAKA,GAEpCmoE,EAA0C,GAAvBf,EAA4B3iB,EAAgBA,GAAgB,EAAI2iB,EAAsBroF,KAAKkoE,UAAUtC,WAAWW,sBACnI,IAAIrhE,GAAIikF,EAASC,CACF,GAAIA,EAAfnqD,IAEAiqD,EADa,GAAME,EAAjBnqD,EACe,EAGA/5B,EAAI+5B,EAAWl5B,EAIlCmjF,GAA0C,GAAvBb,EAA4B,EAAI,EAAIA,EAAsBroF,KAAKkoE,UAAUtC,WAAWU,mBACvG4iB,GAAkCjqD,EAElCy7C,EAAKniD,EAAK2wD,EACVvO,EAAK15D,EAAKioE,EAEVZ,EAAM5N,IAAMA,EACZ4N,EAAM3N,IAAMA,EACZ4N,EAAM7N,IAAMA,EACZ6N,EAAM5N,IAAMA,MAShB,SAAS96E,EAAQD,GAQrBA,EAAQ8nF,qBAAuB,WAC7B,GAAInvD,GAAItX,EAAIge,EAAUy7C,EAAIC,EACxBuO,EAAgBZ,EAAOC,EAAOpjF,EAAGqT,EAE/BorD,EAAQ5jE,KAAKmpE,iBACbE,EAAcrpE,KAAKopE,uBAGnB1D,EAAe1lE,KAAKkoE,UAAUjD,QAAQU,sBAAsBD,YAIhE,KAAKvgE,EAAI,EAAGA,EAAIkkE,EAAY/jE,OAAS,EAAGH,IAEtC,IADAmjF,EAAQ1kB,EAAMyF,EAAYlkE,IACrBqT,EAAIrT,EAAI,EAAGqT,EAAI6wD,EAAY/jE,OAAQkT,IAItC,GAHA+vE,EAAQ3kB,EAAMyF,EAAY7wD,IAGtB8vE,EAAMr2B,OAASs2B,EAAMt2B,MAAO,CAE9B15B,EAAKgwD,EAAMx6D,EAAIu6D,EAAMv6D,EACrB9M,EAAKsnE,EAAMtoE,EAAIqoE,EAAMroE,EACrBgf,EAAWp6B,KAAK2jC,KAAKjQ,EAAKA,EAAKtX,EAAKA,EAGpC,IAAIooE,GAAY,GAEdH,GADaxjB,EAAXzmC,GACgBp6B,KAAK0oC,IAAI87C,EAAUpqD,EAAS,GAAKp6B,KAAK0oC,IAAI87C,EAAU3jB,EAAa,GAGlE,EAGD,GAAZzmC,EACFA,EAAW,IAGXiqD,GAAkCjqD,EAEpCy7C,EAAKniD,EAAK2wD,EACVvO,EAAK15D,EAAKioE,EAEVZ,EAAM5N,IAAMA,EACZ4N,EAAM3N,IAAMA,EACZ4N,EAAM7N,IAAMA,EACZ6N,EAAM5N,IAAMA,IAYtB/6E,EAAQgoF,mCAAqC,WAS3C,IAAK,GARDO,GAAYpX,EAAMP,EAClBj4C,EAAItX,EAAIy5D,EAAIC,EAAIyN,EAAanpD,EAC7BslC,EAAQvkE,KAAKukE,MAEbX,EAAQ5jE,KAAKmpE,iBACbE,EAAcrpE,KAAKopE,uBAGdjkE,EAAI,EAAGA,EAAIkkE,EAAY/jE,OAAQH,IAAK,CAC3C,GAAImjF,GAAQ1kB,EAAMyF,EAAYlkE,GAC9BmjF,GAAMgB,SAAW,EACjBhB,EAAMiB,SAAW,EAKnB,IAAK/Y,IAAUjM,GACb,GAAIA,EAAM9+D,eAAe+qE,KACvBO,EAAOxM,EAAMiM,GACTO,EAAKC,WAEHhxE,KAAK4jE,MAAMn+D,eAAesrE,EAAKuO,OAASt/E,KAAK4jE,MAAMn+D,eAAesrE,EAAKsO,SAqBzE,GApBA8I,EAAapX,EAAK9L,QAAQK,aAE1B6iB,IAAepX,EAAKtuC,GAAG+4C,YAAczK,EAAKvmD,KAAKgxD,YAAc,GAAKx7E,KAAKkoE,UAAUtC,WAAWY,WAE5FjuC,EAAMw4C,EAAKvmD,KAAKuD,EAAIgjD,EAAKtuC,GAAG1U,EAC5B9M,EAAM8vD,EAAKvmD,KAAKvK,EAAI8wD,EAAKtuC,GAAGxiB,EAC5Bgf,EAAWp6B,KAAK2jC,KAAKjQ,EAAKA,EAAKtX,EAAKA,GAEpB,GAAZge,IACFA,EAAW,KAIbmpD,EAAcpoF,KAAKkoE,UAAUjD,QAAQM,gBAAkB4iB,EAAalpD,GAAYA,EAEhFy7C,EAAKniD,EAAK6vD,EACVzN,EAAK15D,EAAKmnE,EAINrX,EAAKtuC,GAAGwvB,OAAS8e,EAAKvmD,KAAKynC,MAC7B8e,EAAKtuC,GAAG6mD,UAAY5O,EACpB3J,EAAKtuC,GAAG8mD,UAAY5O,EACpB5J,EAAKvmD,KAAK8+D,UAAY5O,EACtB3J,EAAKvmD,KAAK++D,UAAY5O,MAEnB,CACH,GAAIp4D,GAAS,EACbwuD,GAAKtuC,GAAGi4C,IAAMn4D,EAAOm4D,EACrB3J,EAAKtuC,GAAGk4C,IAAMp4D,EAAOo4D,EACrB5J,EAAKvmD,KAAKkwD,IAAMn4D,EAAOm4D,EACvB3J,EAAKvmD,KAAKmwD,IAAMp4D,EAAOo4D,EAQjC,GACI2O,GAAUC,EADVnB,EAAc,CAElB,KAAKjjF,EAAI,EAAGA,EAAIkkE,EAAY/jE,OAAQH,IAAK,CACvC,GAAI2uC,GAAO8vB,EAAMyF,EAAYlkE,GAC7BmkF,GAAWzkF,KAAKwG,IAAI+8E,EAAYvjF,KAAKiI,KAAKs7E,EAAYt0C,EAAKw1C,WAC3DC,EAAW1kF,KAAKwG,IAAI+8E,EAAYvjF,KAAKiI,KAAKs7E,EAAYt0C,EAAKy1C,WAE3Dz1C,EAAK4mC,IAAM4O,EACXx1C,EAAK6mC,IAAM4O,EAIb,GAAIC,GAAU,EACVC,EAAU,CACd,KAAKtkF,EAAI,EAAGA,EAAIkkE,EAAY/jE,OAAQH,IAAK,CACvC,GAAI2uC,GAAO8vB,EAAMyF,EAAYlkE,GAC7BqkF,IAAW11C,EAAK4mC,GAChB+O,GAAW31C,EAAK6mC,GAElB,GAAI+O,GAAeF,EAAUngB,EAAY/jE,OACrCqkF,EAAeF,EAAUpgB,EAAY/jE,MAEzC,KAAKH,EAAI,EAAGA,EAAIkkE,EAAY/jE,OAAQH,IAAK,CACvC,GAAI2uC,GAAO8vB,EAAMyF,EAAYlkE,GAC7B2uC,GAAK4mC,IAAMgP,EACX51C,EAAK6mC,IAAMgP,KAOX,SAAS9pF,EAAQD,GAQrBA,EAAQ8nF,qBAAuB,WAC7B,GAA8D,GAA1D1nF,KAAKkoE,UAAUjD,QAAQC,UAAUE,sBAA4B,CAC/D,GAAItxB,GACA8vB,EAAQ5jE,KAAKmpE,iBACbE,EAAcrpE,KAAKopE,uBACnBwgB,EAAYvgB,EAAY/jE,MAE5BtF,MAAK6pF,mBAAmBjmB,EAAMyF,EAK9B,KAAK,GAHDge,GAAgBrnF,KAAKqnF,cAGhBliF,EAAI,EAAOykF,EAAJzkF,EAAeA,IAC7B2uC,EAAO8vB,EAAMyF,EAAYlkE,IACrB2uC,EAAKhmC,QAAQ+1D,KAAO,IAEtB7jE,KAAK8pF,sBAAsBzC,EAAc3nF,KAAKmtB,SAASk9D,GAAGj2C,GAC1D9zC,KAAK8pF,sBAAsBzC,EAAc3nF,KAAKmtB,SAASm9D,GAAGl2C,GAC1D9zC,KAAK8pF,sBAAsBzC,EAAc3nF,KAAKmtB,SAASo9D,GAAGn2C,GAC1D9zC,KAAK8pF,sBAAsBzC,EAAc3nF,KAAKmtB,SAASq9D,GAAGp2C,MAelEl0C,EAAQkqF,sBAAwB,SAASK,EAAar2C,GAEpD,GAAIq2C,EAAaC,cAAgB,EAAG,CAClC,GAAI7xD,GAAGtX,EAAGge,CAUV,IAPA1G,EAAK4xD,EAAaE,aAAat8D,EAAI+lB,EAAK/lB,EACxC9M,EAAKkpE,EAAaE,aAAapqE,EAAI6zB,EAAK7zB,EACxCgf,EAAWp6B,KAAK2jC,KAAKjQ,EAAKA,EAAKtX,EAAKA,GAKhCge,EAAWkrD,EAAaG,SAAWtqF,KAAKkoE,UAAUjD,QAAQC,UAAUC,MAAO,CAE7D,GAAZlmC,IACFA,EAAW,GAAIp6B,KAAKE,SACpBwzB,EAAK0G,EAEP,IAAIgpD,GAAejoF,KAAKkoE,UAAUjD,QAAQC,UAAUE,sBAAwB+kB,EAAatmB,KAAO/vB,EAAKhmC,QAAQ+1D,MAAQ5kC,EAAWA,EAAWA,GACvIy7C,EAAKniD,EAAK0vD,EACVtN,EAAK15D,EAAKgnE,CACdn0C,GAAK4mC,IAAMA,EACX5mC,EAAK6mC,IAAMA,MAIX,IAAkC,GAA9BwP,EAAaC,cACfpqF,KAAK8pF,sBAAsBK,EAAat9D,SAASk9D,GAAGj2C,GACpD9zC,KAAK8pF,sBAAsBK,EAAat9D,SAASm9D,GAAGl2C,GACpD9zC,KAAK8pF,sBAAsBK,EAAat9D,SAASo9D,GAAGn2C,GACpD9zC,KAAK8pF,sBAAsBK,EAAat9D,SAASq9D,GAAGp2C,OAGpD,IAAIq2C,EAAat9D,SAASjB,KAAKvrB,IAAMyzC,EAAKzzC,GAAI,CAE5B,GAAZ4+B,IACFA,EAAW,GAAIp6B,KAAKE,SACpBwzB,EAAK0G,EAEP,IAAIgpD,GAAejoF,KAAKkoE,UAAUjD,QAAQC,UAAUE,sBAAwB+kB,EAAatmB,KAAO/vB,EAAKhmC,QAAQ+1D,MAAQ5kC,EAAWA,EAAWA,GACvIy7C,EAAKniD,EAAK0vD,EACVtN,EAAK15D,EAAKgnE,CACdn0C,GAAK4mC,IAAMA,EACX5mC,EAAK6mC,IAAMA,KAcrB/6E,EAAQiqF,mBAAqB,SAASjmB,EAAMyF,GAU1C,IAAK,GATDv1B,GACA81C,EAAYvgB,EAAY/jE,OAExB0lE,EAAOnnE,OAAO0mF,UAChBzf,EAAOjnE,OAAO0mF,UACdtf,GAAOpnE,OAAO0mF,UACdxf,GAAOlnE,OAAO0mF,UAGPplF,EAAI,EAAOykF,EAAJzkF,EAAeA,IAAK,CAClC,GAAI4oB,GAAI61C,EAAMyF,EAAYlkE,IAAI4oB,EAC1B9N,EAAI2jD,EAAMyF,EAAYlkE,IAAI8a,CAC1B2jD,GAAMyF,EAAYlkE,IAAI2I,QAAQ+1D,KAAO,IAC/BmH,EAAJj9C,IAAYi9C,EAAOj9C,GACnBA,EAAIk9C,IAAQA,EAAOl9C,GACf+8C,EAAJ7qD,IAAY6qD,EAAO7qD,GACnBA,EAAI8qD,IAAQA,EAAO9qD,IAI3B,GAAIuqE,GAAW3lF,KAAK+O,IAAIq3D,EAAOD,GAAQnmE,KAAK+O,IAAIm3D,EAAOD,EACnD0f,GAAW,GAAI1f,GAAQ,GAAM0f,EAAUzf,GAAQ,GAAMyf,IACtCxf,GAAQ,GAAMwf,EAAUvf,GAAQ,GAAMuf,EAGzD,IAAIC,GAAkB,KAClBC,EAAW7lF,KAAKiI,IAAI29E,EAAgB5lF,KAAK+O,IAAIq3D,EAAOD,IACpD2f,EAAe,GAAMD,EACrBE,EAAU,IAAO5f,EAAOC,GAAO4f,EAAU,IAAO/f,EAAOC,GAGvDsc,GACF3nF,MACE2qF,cAAet8D,EAAE,EAAG9N,EAAE,GACtB4jD,KAAK,EACL31D,OACE88D,KAAM4f,EAAQD,EAAa1f,KAAK2f,EAAQD,EACxC7f,KAAM+f,EAAQF,EAAa5f,KAAK8f,EAAQF,GAE1Ct8D,KAAMq8D,EACNJ,SAAU,EAAII,EACd79D,UAAYjB,KAAK,MACjBs4D,SAAU,EACVjyB,MAAO,EACPm4B,cAAe,GAMnB,KAHApqF,KAAK8qF,aAAazD,EAAc3nF,MAG3ByF,EAAI,EAAOykF,EAAJzkF,EAAeA,IACzB2uC,EAAO8vB,EAAMyF,EAAYlkE,IACrB2uC,EAAKhmC,QAAQ+1D,KAAO,GACtB7jE,KAAK+qF,aAAa1D,EAAc3nF,KAAKo0C,EAKzC9zC,MAAKqnF,cAAgBA,GAWvBznF,EAAQorF,kBAAoB,SAASb,EAAcr2C,GACjD,GAAIm3C,GAAYd,EAAatmB,KAAO/vB,EAAKhmC,QAAQ+1D,KAC7CqnB,EAAe,EAAED,CAErBd,GAAaE,aAAat8D,EAAIo8D,EAAaE,aAAat8D,EAAIo8D,EAAatmB,KAAO/vB,EAAK/lB,EAAI+lB,EAAKhmC,QAAQ+1D,KACtGsmB,EAAaE,aAAat8D,GAAKm9D,EAE/Bf,EAAaE,aAAapqE,EAAIkqE,EAAaE,aAAapqE,EAAIkqE,EAAatmB,KAAO/vB,EAAK7zB,EAAI6zB,EAAKhmC,QAAQ+1D,KACtGsmB,EAAaE,aAAapqE,GAAKirE,EAE/Bf,EAAatmB,KAAOonB,CACpB,IAAIE,GAActmF,KAAKiI,IAAIjI,KAAKiI,IAAIgnC,EAAKtlB,OAAOslB,EAAKvP,QAAQuP,EAAKvlB,MAClE47D,GAAajG,SAAYiG,EAAajG,SAAWiH,EAAeA,EAAchB,EAAajG,UAa7FtkF,EAAQmrF,aAAe,SAASZ,EAAar2C,EAAKs3C,IAC1B,GAAlBA,GAA6CjlF,SAAnBilF,IAE5BprF,KAAKgrF,kBAAkBb,EAAar2C,GAGlCq2C,EAAat9D,SAASk9D,GAAG77E,MAAM+8D,KAAOn3B,EAAK/lB,EACzCo8D,EAAat9D,SAASk9D,GAAG77E,MAAM68D,KAAOj3B,EAAK7zB,EAC7CjgB,KAAKqrF,eAAelB,EAAar2C,EAAK,MAGtC9zC,KAAKqrF,eAAelB,EAAar2C,EAAK,MAIpCq2C,EAAat9D,SAASk9D,GAAG77E,MAAM68D,KAAOj3B,EAAK7zB,EAC7CjgB,KAAKqrF,eAAelB,EAAar2C,EAAK,MAGtC9zC,KAAKqrF,eAAelB,EAAar2C,EAAK,OAc5Cl0C,EAAQyrF,eAAiB,SAASlB,EAAar2C,EAAKw3C,GAClD,OAAQnB,EAAat9D,SAASy+D,GAAQlB,eACpC,IAAK,GACHD,EAAat9D,SAASy+D,GAAQz+D,SAASjB,KAAOkoB,EAC9Cq2C,EAAat9D,SAASy+D,GAAQlB,cAAgB,EAC9CpqF,KAAKgrF,kBAAkBb,EAAat9D,SAASy+D,GAAQx3C,EACrD,MACF,KAAK,GAGCq2C,EAAat9D,SAASy+D,GAAQz+D,SAASjB,KAAKmC,GAAK+lB,EAAK/lB,GACtDo8D,EAAat9D,SAASy+D,GAAQz+D,SAASjB,KAAK3L,GAAK6zB,EAAK7zB,GACxD6zB,EAAK/lB,GAAKlpB,KAAKE,SACf+uC,EAAK7zB,GAAKpb,KAAKE,WAGf/E,KAAK8qF,aAAaX,EAAat9D,SAASy+D,IACxCtrF,KAAK+qF,aAAaZ,EAAat9D,SAASy+D,GAAQx3C,GAElD,MACF,KAAK,GACH9zC,KAAK+qF,aAAaZ,EAAat9D,SAASy+D,GAAQx3C,KAatDl0C,EAAQkrF,aAAe,SAASX,GAE9B,GAAIoB,GAAgB,IACc,IAA9BpB,EAAaC,gBACfmB,EAAgBpB,EAAat9D,SAASjB,KACtCu+D,EAAatmB,KAAO,EAAGsmB,EAAaE,aAAat8D,EAAI,EAAGo8D,EAAaE,aAAapqE,EAAI,GAExFkqE,EAAaC,cAAgB,EAC7BD,EAAat9D,SAASjB,KAAO,KAC7B5rB,KAAKwrF,cAAcrB,EAAa,MAChCnqF,KAAKwrF,cAAcrB,EAAa,MAChCnqF,KAAKwrF,cAAcrB,EAAa,MAChCnqF,KAAKwrF,cAAcrB,EAAa,MAEX,MAAjBoB,GACFvrF,KAAK+qF,aAAaZ,EAAaoB,IAenC3rF,EAAQ4rF,cAAgB,SAASrB,EAAcmB,GAC7C,GAAItgB,GAAKC,EAAKH,EAAKC,EACf0gB,EAAY,GAAMtB,EAAa97D,IACnC,QAAQi9D,GACN,IAAK,KACHtgB,EAAOmf,EAAaj8E,MAAM88D,KAC1BC,EAAOkf,EAAaj8E,MAAM88D,KAAOygB,EACjC3gB,EAAOqf,EAAaj8E,MAAM48D,KAC1BC,EAAOof,EAAaj8E,MAAM48D,KAAO2gB,CACjC,MACF,KAAK,KACHzgB,EAAOmf,EAAaj8E,MAAM88D,KAAOygB,EACjCxgB,EAAOkf,EAAaj8E,MAAM+8D,KAC1BH,EAAOqf,EAAaj8E,MAAM48D,KAC1BC,EAAOof,EAAaj8E,MAAM48D,KAAO2gB,CACjC,MACF,KAAK,KACHzgB,EAAOmf,EAAaj8E,MAAM88D,KAC1BC,EAAOkf,EAAaj8E,MAAM88D,KAAOygB,EACjC3gB,EAAOqf,EAAaj8E,MAAM48D,KAAO2gB,EACjC1gB,EAAOof,EAAaj8E,MAAM68D,IAC1B,MACF,KAAK,KACHC,EAAOmf,EAAaj8E,MAAM88D,KAAOygB,EACjCxgB,EAAOkf,EAAaj8E,MAAM+8D,KAC1BH,EAAOqf,EAAaj8E,MAAM48D,KAAO2gB,EACjC1gB,EAAOof,EAAaj8E,MAAM68D,KAK9Bof,EAAat9D,SAASy+D,IACpBjB,cAAct8D,EAAE,EAAE9N,EAAE,GACpB4jD,KAAK,EACL31D,OAAO88D,KAAKA,EAAKC,KAAKA,EAAKH,KAAKA,EAAKC,KAAKA,GAC1C18C,KAAM,GAAM87D,EAAa97D,KACzBi8D,SAAU,EAAIH,EAAaG,SAC3Bz9D,UAAWjB,KAAK,MAChBs4D,SAAU,EACVjyB,MAAOk4B,EAAal4B,MAAM,EAC1Bm4B,cAAe,IAYnBxqF,EAAQ8rF,UAAY,SAASrrD,EAAI51B,GACJtE,SAAvBnG,KAAKqnF,gBAEPhnD,EAAIO,UAAY,EAEhB5gC,KAAK2rF,YAAY3rF,KAAKqnF,cAAc3nF,KAAK2gC,EAAI51B,KAajD7K,EAAQ+rF,YAAc,SAASC,EAAOvrD,EAAI51B,GAC1BtE,SAAVsE,IACFA,EAAQ,WAGkB,GAAxBmhF,EAAOxB,gBACTpqF,KAAK2rF,YAAYC,EAAO/+D,SAASk9D,GAAG1pD,GACpCrgC,KAAK2rF,YAAYC,EAAO/+D,SAASm9D,GAAG3pD,GACpCrgC,KAAK2rF,YAAYC,EAAO/+D,SAASq9D,GAAG7pD,GACpCrgC,KAAK2rF,YAAYC,EAAO/+D,SAASo9D,GAAG5pD,IAEtCA,EAAIY,YAAcx2B,EAClB41B,EAAIa,YACJb,EAAIc,OAAOyqD,EAAO19E,MAAM88D,KAAK4gB,EAAO19E,MAAM48D,MAC1CzqC,EAAIe,OAAOwqD,EAAO19E,MAAM+8D,KAAK2gB,EAAO19E,MAAM48D,MAC1CzqC,EAAI9G,SAEJ8G,EAAIa,YACJb,EAAIc,OAAOyqD,EAAO19E,MAAM+8D,KAAK2gB,EAAO19E,MAAM48D,MAC1CzqC,EAAIe,OAAOwqD,EAAO19E,MAAM+8D,KAAK2gB,EAAO19E,MAAM68D,MAC1C1qC,EAAI9G,SAEJ8G,EAAIa,YACJb,EAAIc,OAAOyqD,EAAO19E,MAAM+8D,KAAK2gB,EAAO19E,MAAM68D,MAC1C1qC,EAAIe,OAAOwqD,EAAO19E,MAAM88D,KAAK4gB,EAAO19E,MAAM68D,MAC1C1qC,EAAI9G,SAEJ8G,EAAIa,YACJb,EAAIc,OAAOyqD,EAAO19E,MAAM88D,KAAK4gB,EAAO19E,MAAM68D,MAC1C1qC,EAAIe,OAAOwqD,EAAO19E,MAAM88D,KAAK4gB,EAAO19E,MAAM48D,MAC1CzqC,EAAI9G,WAaF,SAAS15B,EAAQD,GAYrBA,EAAQ4qE,oBAAsB,WAE7BxqE,KAAKunF,aAAavnF,KAAKkoE,UAAUtC,WAAWC,iBAAiB,GAG7D7lE,KAAK0xE,eAID1xE,KAAK4nE,WACP5nE,KAAKusE,aAEPvsE,KAAK8O,SASNlP,EAAQ2nF,aAAe,SAASsE,EAAkBC,GAOhD,IANA,GAAItgB,GAAgBxrE,KAAKqpE,YAAY/jE,OAEjCymF,EAAY,GACZ95B,EAAQ,EAGLuZ,EAAgBqgB,GAA4BE,EAAR95B,GACrCA,EAAQ,GAAK,GACfjyD,KAAKgsF,oBAAmB,GACxBhsF,KAAKisF,0BAGLjsF,KAAKksF,uBAGP1gB,EAAgBxrE,KAAKqpE,YAAY/jE,OACjC2sD,GAAS,CAIPA,GAAQ,GAAmB,GAAd65B,GACf9rF,KAAK+lF,kBAEP/lF,KAAKuxE,2BASP3xE,EAAQusF,YAAc,SAASr4C,GAC7B,GAAIs4C,GAA2BpsF,KAAKqqE,MACpC,IAAIv2B,EAAK0nC,YAAcx7E,KAAKkoE,UAAUtC,WAAWM,iBAAmBlmE,KAAKqsF,kBAAkBv4C,KACrE,WAAlB9zC,KAAKkoF,WAAqD,GAA3BloF,KAAKqpE,YAAY/jE,QAAc,CAEhEtF,KAAKssF,WAAWx4C,EAIhB,KAHA,GAAIme,GAAQ,EAGJjyD,KAAKqpE,YAAY/jE,OAAStF,KAAKkoE,UAAUtC,WAAWC,iBAA6B,GAAR5T,GAC/EjyD,KAAKusF,uBACLt6B,GAAS,MAKXjyD,MAAKwsF,mBAAmB14C,GAAK,GAAM,GAGnC9zC,KAAK4rE,uBACL5rE,KAAKysF,sBACLzsF,KAAKuxE,0BACLvxE,KAAK0xE,cAIH1xE,MAAKqqE,QAAU+hB,GACjBpsF,KAAK8O,SAQTlP,EAAQowE,sBAAwB,WACW,GAArChwE,KAAKkoE,UAAUtC,WAAW73D,SAC5B/N,KAAK0sF,eAAe,GAAE,GAAM,IAUhC9sF,EAAQssF,qBAAuB,WAC7BlsF,KAAK0sF,eAAe,IAAG,GAAM,IAS/B9sF,EAAQ2sF,qBAAuB,WAC7BvsF,KAAK0sF,eAAe,GAAE,GAAM,IAgB9B9sF,EAAQ8sF,eAAiB,SAASC,EAAcC,EAAUh+B,EAAMi+B,GAC9D,GAAIT,GAA2BpsF,KAAKqqE,OAChCyiB,EAAgB9sF,KAAKqpE,YAAY/jE,MAGjCtF,MAAK0pE,cAAgB1pE,KAAK62B,OAA0B,GAAjB81D,GACrC3sF,KAAK+sF,kBAIH/sF,KAAK0pE,cAAgB1pE,KAAK62B,OAA0B,IAAjB81D,EAGrC3sF,KAAKgtF,cAAcp+B,IAEZ5uD,KAAK0pE,cAAgB1pE,KAAK62B,OAA0B,GAAjB81D,KAC7B,GAAT/9B,EAGF5uD,KAAKitF,cAAcL,EAAUh+B,GAI7B5uD,KAAKktF,uBAGTltF,KAAK4rE,uBAGD5rE,KAAKqpE,YAAY/jE,QAAUwnF,IAAkB9sF,KAAK0pE,cAAgB1pE,KAAK62B,OAA0B,IAAjB81D,KAClF3sF,KAAKmtF,eAAev+B,GACpB5uD,KAAK4rE,yBAIH5rE,KAAK0pE,cAAgB1pE,KAAK62B,OAA0B,IAAjB81D,KACrC3sF,KAAKotF,eACLptF,KAAK4rE,wBAGP5rE,KAAK0pE,cAAgB1pE,KAAK62B,MAG1B72B,KAAKysF,sBACLzsF,KAAK0xE,eAGD1xE,KAAKqpE,YAAY/jE,OAASwnF,IAC5B9sF,KAAKg7E,gBAAkB,EAEvBh7E,KAAKisF,2BAGW,GAAdY,GAAsC1mF,SAAf0mF,IAErB7sF,KAAKqqE,QAAU+hB,GACjBpsF,KAAK8O,QAIT9O,KAAKuxE,2BAMP3xE,EAAQwtF,aAAe,WAErB,GAAIC,GAAkBrtF,KAAKstF,mBACvBD,GAAkBrtF,KAAKkoE,UAAUtC,WAAWI,gBAC9ChmE,KAAKutF,sBAAsB,EAAIvtF,KAAKkoE,UAAUtC,WAAWI,eAAiBqnB,IAW9EztF,EAAQutF,eAAiB,SAASv+B,GAChC5uD,KAAKwtF,cACLxtF,KAAKytF,mBAAmB7+B,GAAM,IAQhChvD,EAAQosF,mBAAqB,SAASa,GACpC,GAAIT,GAA2BpsF,KAAKqqE,OAChCyiB,EAAgB9sF,KAAKqpE,YAAY/jE,MAErCtF,MAAKmtF,gBAAe,GAGpBntF,KAAK4rE,uBACL5rE,KAAKysF,sBACLzsF,KAAK0xE,eAGD1xE,KAAKqpE,YAAY/jE,QAAUwnF,IAC7B9sF,KAAKg7E,gBAAkB,IAGP,GAAd6R,GAAsC1mF,SAAf0mF,IAErB7sF,KAAKqqE,QAAU+hB,GACjBpsF,KAAK8O,SAUXlP,EAAQstF,oBAAsB,WAC5B,IAAK,GAAIhiB,KAAUlrE,MAAK4jE,MACtB,GAAI5jE,KAAK4jE,MAAMn+D,eAAeylE,GAAS,CACrC,GAAIp3B,GAAO9zC,KAAK4jE,MAAMsH,EACD,IAAjBp3B,EAAKkrC,WACFlrC,EAAKvlB,MAAMvuB,KAAK62B,MAAQ72B,KAAKkoE,UAAUtC,WAAWO,oBAAsBnmE,KAAKg5B,MAAMC,OAAOC,aAC1F4a,EAAKtlB,OAAOxuB,KAAK62B,MAAQ72B,KAAKkoE,UAAUtC,WAAWO,oBAAsBnmE,KAAKg5B,MAAMC,OAAOoF,eAC9Fr+B,KAAKmsF,YAAYr4C,KAc3Bl0C,EAAQqtF,cAAgB,SAASL,EAAUh+B,GACzC,IAAK,GAAIzpD,GAAI,EAAGA,EAAInF,KAAKqpE,YAAY/jE,OAAQH,IAAK,CAChD,GAAI2uC,GAAO9zC,KAAK4jE,MAAM5jE,KAAKqpE,YAAYlkE,GACvCnF,MAAKwsF,mBAAmB14C,EAAK84C,EAAUh+B,GACvC5uD,KAAKuxE,4BAeT3xE,EAAQ4sF,mBAAqB,SAAS9iF,EAAYkjF,EAAWh+B,EAAO8+B,GAElE,GAAIhkF,EAAW8xE,YAAc,IAEvB9xE,EAAW8xE,YAAcx7E,KAAKkoE,UAAUtC,WAAWM,kBACrDwnB,GAAU,GAEZd,EAAYc,GAAU,EAAOd,EAGzBljF,EAAW6xE,eAAiBv7E,KAAK62B,OAAkB,GAAT+3B,GAE5C,IAAK,GAAI++B,KAAmBjkF,GAAW+xE,eACrC,GAAI/xE,EAAW+xE,eAAeh2E,eAAekoF,GAAkB,CAC7D,GAAIC,GAAYlkF,EAAW+xE,eAAekS,EAI7B,IAAT/+B,GACEg/B,EAAU5S,gBAAkBtxE,EAAWiyE,gBAAgBjyE,EAAWiyE,gBAAgBr2E,OAAO,IACtFooF,IACL1tF,KAAK6tF,sBAAsBnkF,EAAWikF,EAAgBf,EAAUh+B,EAAM8+B,GAIpE1tF,KAAKqsF,kBAAkB3iF,IACzB1J,KAAK6tF,sBAAsBnkF,EAAWikF,EAAgBf,EAAUh+B,EAAM8+B,KAwBpF9tF,EAAQiuF,sBAAwB,SAASnkF,EAAYikF,EAAiBf,EAAWh+B,EAAO8+B,GACtF,GAAIE,GAAYlkF,EAAW+xE,eAAekS,EAG1C,IAAIC,EAAUrS,eAAiBv7E,KAAK62B,OAAkB,GAAT+3B,EAAe,CAE1D5uD,KAAK8tF,eAGL9tF,KAAK4jE,MAAM+pB,GAAmBC,EAG9B5tF,KAAK+tF,uBAAuBrkF,EAAWkkF,GAGvC5tF,KAAKguF,wBAAwBtkF,EAAWkkF,GAGxC5tF,KAAKiuF,eAAevkF,GAGpBA,EAAWoE,QAAQ+1D,MAAQ+pB,EAAU9/E,QAAQ+1D,KAC7Cn6D,EAAW8xE,aAAeoS,EAAUpS,YACpC9xE,EAAWoE,QAAQs2D,SAAWv/D,KAAKwG,IAAIrL,KAAKkoE,UAAUtC,WAAWS,YAAarmE,KAAKkoE,UAAUtE,MAAMQ,SAAWpkE,KAAKkoE,UAAUtC,WAAWQ,mBAAmB18D,EAAW8xE,aACtK9xE,EAAWqxE,mBAAqBrxE,EAAWwwE,aAAa50E,OAGxDsoF,EAAU7/D,EAAIrkB,EAAWqkB,EAAIrkB,EAAW0xE,iBAAmB,GAAMv2E,KAAKE,UACtE6oF,EAAU3tE,EAAIvW,EAAWuW,EAAIvW,EAAW0xE,iBAAmB,GAAMv2E,KAAKE,gBAG/D2E,GAAW+xE,eAAekS,EAGjC,IAAIO,IAAgB,CACpB,KAAK,GAAIC,KAAezkF,GAAW+xE,eACjC,GAAI/xE,EAAW+xE,eAAeh2E,eAAe0oF,IACvCzkF,EAAW+xE,eAAe0S,GAAanT,gBAAkB4S,EAAU5S,eAAgB,CACrFkT,GAAgB,CAChB,OAKe,GAAjBA,GACFxkF,EAAWiyE,gBAAgBp1D,MAG7BvmB,KAAKouF,uBAAuBR,GAI5BA,EAAU5S,eAAiB,EAG3BtxE,EAAW4zE,iBAGXt9E,KAAKqqE,QAAS,EAIC,GAAbuiB,GACF5sF,KAAKwsF,mBAAmBoB,EAAUhB,EAAUh+B,EAAM8+B,IAWtD9tF,EAAQwuF,uBAAyB,SAASt6C,GACxC,IAAK,GAAI3uC,GAAI,EAAGA,EAAI2uC,EAAKomC,aAAa50E,OAAQH,IAC5C2uC,EAAKomC,aAAa/0E,GAAG8vE,sBAczBr1E,EAAQotF,cAAgB,SAASp+B,GAClB,GAATA,EACF5uD,KAAKquF,sBAGLruF,KAAKsuF,wBAUT1uF,EAAQyuF,oBAAsB,WAC5B,GAAI91D,GAAGtX,EAAG3b,EACNipF,EAAYvuF,KAAKkoE,UAAUtC,WAAWK,qBAAqBjmE,KAAK62B,KAIpE,KAAK,GAAI25C,KAAUxwE,MAAKukE,MACtB,GAAIvkE,KAAKukE,MAAM9+D,eAAe+qE,GAAS,CACrC,GAAIO,GAAO/wE,KAAKukE,MAAMiM,EACtB,IAAIO,EAAKC,WACHD,EAAKuO,MAAQvO,EAAKsO,SACpB9mD,EAAMw4C,EAAKtuC,GAAG1U,EAAIgjD,EAAKvmD,KAAKuD,EAC5B9M,EAAM8vD,EAAKtuC,GAAGxiB,EAAI8wD,EAAKvmD,KAAKvK,EAC5B3a,EAAST,KAAK2jC,KAAKjQ,EAAKA,EAAKtX,EAAKA,GAGrBstE,EAATjpF,GAAoB,CAEtB,GAAIoE,GAAaqnE,EAAKvmD,KAClBojE,EAAY7c,EAAKtuC,EACjBsuC,GAAKtuC,GAAG30B,QAAQ+1D,KAAOkN,EAAKvmD,KAAK1c,QAAQ+1D,OAC3Cn6D,EAAaqnE,EAAKtuC,GAClBmrD,EAAY7c,EAAKvmD,MAGiB,GAAhCojE,EAAU7S,mBACZ/6E,KAAKwuF,cAAc9kF,EAAWkkF,GAAU,GAEA,GAAjClkF,EAAWqxE,oBAClB/6E,KAAKwuF,cAAcZ,EAAUlkF,GAAW,MAetD9J,EAAQ0uF,qBAAuB,WAC7B,IAAK,GAAIpjB,KAAUlrE,MAAK4jE,MAEtB,GAAI5jE,KAAK4jE,MAAMn+D,eAAeylE,GAAS,CACrC,GAAI0iB,GAAY5tF,KAAK4jE,MAAMsH,EAG3B,IAAoC,GAAhC0iB,EAAU7S,oBAA4D,GAAjC6S,EAAU1T,aAAa50E,OAAa,CAC3E,GAAIyrE,GAAO6c,EAAU1T,aAAa,GAC9BxwE,EAAcqnE,EAAKuO,MAAQsO,EAAUvtF,GAAML,KAAK4jE,MAAMmN,EAAKsO,QAAUr/E,KAAK4jE,MAAMmN,EAAKuO,KAGrFsO,GAAUvtF,IAAMqJ,EAAWrJ,KACzBqJ,EAAWoE,QAAQ+1D,KAAO+pB,EAAU9/E,QAAQ+1D,KAC9C7jE,KAAKwuF,cAAc9kF,EAAWkkF,GAAU,GAGxC5tF,KAAKwuF,cAAcZ,EAAUlkF,GAAW,OAgBpD9J,EAAQ6uF,4BAA8B,SAAS36C,GAG7C,IAAK,GAFD46C,GAAoB,GACpBC,EAAwB,KACnBxpF,EAAI,EAAGA,EAAI2uC,EAAKomC,aAAa50E,OAAQH,IAC5C,GAA6BgB,SAAzB2tC,EAAKomC,aAAa/0E,GAAkB,CACtC,GAAIypF,GAAY,IACZ96C,GAAKomC,aAAa/0E,GAAGk6E,QAAUvrC,EAAKzzC,GACtCuuF,EAAY96C,EAAKomC,aAAa/0E,GAAGqlB,KAE1BspB,EAAKomC,aAAa/0E,GAAGm6E,MAAQxrC,EAAKzzC,KACzCuuF,EAAY96C,EAAKomC,aAAa/0E,GAAGs9B,IAIlB,MAAbmsD,GAAqBF,EAAoBE,EAAUjT,gBAAgBr2E,SACrEopF,EAAoBE,EAAUjT,gBAAgBr2E,OAC9CqpF,EAAwBC,GAKb,MAAbA,GAAkDzoF,SAA7BnG,KAAK4jE,MAAMgrB,EAAUvuF,KAC5CL,KAAKwuF,cAAcI,EAAW96C,GAAM,IAYxCl0C,EAAQ6tF,mBAAqB,SAAS7+B,EAAOigC,GAE3C,IAAK,GAAI3jB,KAAUlrE,MAAK4jE,MAElB5jE,KAAK4jE,MAAMn+D,eAAeylE,IAC5BlrE,KAAK8uF,oBAAoB9uF,KAAK4jE,MAAMsH,GAAQtc,EAAMigC,IAcxDjvF,EAAQkvF,oBAAsB,SAASC,EAASngC,EAAOigC,EAAWG,GAKhE,GAJ6B7oF,SAAzB6oF,IACFA,EAAuB,GAGpBD,EAAQhU,oBAAsB/6E,KAAKglF,cAA6B,GAAb6J,GACrDE,EAAQhU,oBAAsB/6E,KAAKglF,cAA6B,GAAb6J,EAAoB,CASxE,IAAK,GAPDt2D,GAAGtX,EAAG3b,EACNipF,EAAYvuF,KAAKkoE,UAAUtC,WAAWK,qBAAqBjmE,KAAK62B,MAChEo4D,GAAe,EAGfC,KACAC,EAAuBJ,EAAQ7U,aAAa50E,OACvCkT,EAAI,EAAO22E,EAAJ32E,EAA0BA,IACxC02E,EAAapnF,KAAKinF,EAAQ7U,aAAa1hE,GAAGnY,GAK5C,IAAa,GAATuuD,EAEF,IADAqgC,GAAe,EACVz2E,EAAI,EAAO22E,EAAJ32E,EAA0BA,IAAK,CACzC,GAAIu4D,GAAO/wE,KAAKukE,MAAM2qB,EAAa12E,GACnC,IAAarS,SAAT4qE,GACEA,EAAKC,WACHD,EAAKuO,MAAQvO,EAAKsO,SACpB9mD,EAAMw4C,EAAKtuC,GAAG1U,EAAIgjD,EAAKvmD,KAAKuD,EAC5B9M,EAAM8vD,EAAKtuC,GAAGxiB,EAAI8wD,EAAKvmD,KAAKvK,EAC5B3a,EAAST,KAAK2jC,KAAKjQ,EAAKA,EAAKtX,EAAKA,GAErBstE,EAATjpF,GAAoB,CACtB2pF,GAAe,CACf,QASZ,IAAMrgC,GAASqgC,GAAiBrgC,EAE9B,IAAKp2C,EAAI,EAAO22E,EAAJ32E,EAA0BA,IAGpC,GAFAu4D,EAAO/wE,KAAKukE,MAAM2qB,EAAa12E,IAElBrS,SAAT4qE,EAAoB,CACtB,GAAI6c,GAAY5tF,KAAK4jE,MAAOmN,EAAKsO,QAAU0P,EAAQ1uF,GAAM0wE,EAAKuO,KAAOvO,EAAKsO,OAErEuO,GAAU1T,aAAa50E,QAAWtF,KAAKglF,aAAegK,GACtDpB,EAAUvtF,IAAM0uF,EAAQ1uF,IAC3BL,KAAKwuF,cAAcO,EAAQnB,EAAUh/B,MAkBjDhvD,EAAQ4uF,cAAgB,SAAS9kF,EAAYkkF,EAAWh/B,GAEtDllD,EAAW+xE,eAAemS,EAAUvtF,IAAMutF,CAG1C,KAAK,GAAIzoF,GAAI,EAAGA,EAAIyoF,EAAU1T,aAAa50E,OAAQH,IAAK,CACtD,GAAI4rE,GAAO6c,EAAU1T,aAAa/0E,EAC9B4rE,GAAKuO,MAAQ51E,EAAWrJ,IAAM0wE,EAAKsO,QAAU31E,EAAWrJ,GAC1DL,KAAKovF,qBAAqB1lF,EAAWkkF,EAAU7c,GAG/C/wE,KAAKqvF,sBAAsB3lF,EAAWkkF,EAAU7c,GAIpD6c,EAAU1T,gBAGVl6E,KAAKsvF,8BAA8B5lF,EAAWkkF,SAIvC5tF,MAAK4jE,MAAMgqB,EAAUvtF,GAG5B,IAAIkvF,GAAa7lF,EAAWoE,QAAQ+1D,IACpC+pB,GAAU5S,eAAiBh7E,KAAKg7E,eAChCtxE,EAAWoE,QAAQ+1D,MAAQ+pB,EAAU9/E,QAAQ+1D,KAC7Cn6D,EAAW8xE,aAAeoS,EAAUpS,YACpC9xE,EAAWoE,QAAQs2D,SAAWv/D,KAAKwG,IAAIrL,KAAKkoE,UAAUtC,WAAWS,YAAarmE,KAAKkoE,UAAUtE,MAAMQ,SAAWpkE,KAAKkoE,UAAUtC,WAAWQ,mBAAmB18D,EAAW8xE,aAGlK9xE,EAAWiyE,gBAAgBjyE,EAAWiyE,gBAAgBr2E,OAAS,IAAMtF,KAAKg7E,gBAC5EtxE,EAAWiyE,gBAAgB7zE,KAAK9H,KAAKg7E,gBAMrCtxE,EAAW6xE,eAFA,GAAT3sB,EAE0B,EAGA5uD,KAAK62B,MAInCntB,EAAW4zE,iBAGX5zE,EAAW+xE,eAAemS,EAAUvtF,IAAIk7E,eAAiB7xE,EAAW6xE,eAGpEqS,EAAU3O,gBAGVv1E,EAAWw1E,eAAeqQ,GAG1BvvF,KAAKqqE,QAAS,GAUhBzqE,EAAQ6sF,oBAAsB,WAC5B,IAAK,GAAItnF,GAAI,EAAGA,EAAInF,KAAKqpE,YAAY/jE,OAAQH,IAAK,CAChD,GAAI2uC,GAAO9zC,KAAK4jE,MAAM5jE,KAAKqpE,YAAYlkE,GACvC2uC,GAAKinC,mBAAqBjnC,EAAKomC,aAAa50E,MAG5C,IAAIkqF,GAAa,CACjB,IAAI17C,EAAKinC,mBAAqB,EAC5B,IAAK,GAAIviE,GAAI,EAAGA,EAAIs7B,EAAKinC,mBAAqB,EAAGviE,IAG/C,IAAK,GAFDi3E,GAAW37C,EAAKomC,aAAa1hE,GAAG8mE,KAChCoQ,EAAa57C,EAAKomC,aAAa1hE,GAAG6mE,OAC7B1mE,EAAIH,EAAE,EAAGG,EAAIm7B,EAAKinC,mBAAoBpiE,KACxCm7B,EAAKomC,aAAavhE,GAAG2mE,MAAQmQ,GAAY37C,EAAKomC,aAAavhE,GAAG0mE,QAAUqQ,GACxE57C,EAAKomC,aAAavhE,GAAG0mE,QAAUoQ,GAAY37C,EAAKomC,aAAavhE,GAAG2mE,MAAQoQ,KAC3EF,GAAc,EAKtB17C,GAAKinC,oBAAsByU,IAa/B5vF,EAAQwvF,qBAAuB,SAAS1lF,EAAYkkF,EAAW7c,GAEvDrnE,EAAWgyE,eAAej2E,eAAemoF,EAAUvtF,MACvDqJ,EAAWgyE,eAAekS,EAAUvtF,QAGtCqJ,EAAWgyE,eAAekS,EAAUvtF,IAAIyH,KAAKipE,SAGtC/wE,MAAKukE,MAAMwM,EAAK1wE,GAGvB,KAAK,GAAI8E,GAAI,EAAGA,EAAIuE,EAAWwwE,aAAa50E,OAAQH,IAClD,GAAIuE,EAAWwwE,aAAa/0E,GAAG9E,IAAM0wE,EAAK1wE,GAAI,CAC5CqJ,EAAWwwE,aAAahyE,OAAO/C,EAAE,EACjC,SAcNvF,EAAQyvF,sBAAwB,SAAS3lF,EAAYkkF,EAAW7c,GAE1DA,EAAKuO,MAAQvO,EAAKsO,OACpBr/E,KAAKovF,qBAAqB1lF,EAAYkkF,EAAW7c,IAG7CA,EAAKuO,MAAQsO,EAAUvtF,IACzB0wE,EAAK0O,aAAa33E,KAAK8lF,EAAUvtF,IACjC0wE,EAAKtuC,GAAK/4B,EACVqnE,EAAKuO,KAAO51E,EAAWrJ,KAIvB0wE,EAAKyO,eAAe13E,KAAK8lF,EAAUvtF,IACnC0wE,EAAKvmD,KAAO9gB,EACZqnE,EAAKsO,OAAS31E,EAAWrJ,IAG3BL,KAAK2vF,oBAAoBjmF,EAAWkkF,EAAU7c,KAalDnxE,EAAQ0vF,8BAAgC,SAAS5lF,EAAYkkF,GAE3D,IAAK,GAAIzoF,GAAI,EAAGA,EAAIuE,EAAWwwE,aAAa50E,OAAQH,IAAK,CACvD,GAAI4rE,GAAOrnE,EAAWwwE,aAAa/0E,EAE/B4rE,GAAKuO,MAAQvO,EAAKsO,QACpBr/E,KAAKovF,qBAAqB1lF,EAAYkkF,EAAW7c,KAcvDnxE,EAAQ+vF,oBAAsB,SAASjmF,EAAYkkF,EAAW7c,GAGtDrnE,EAAWywE,cAAc10E,eAAemoF,EAAUvtF,MACtDqJ,EAAWywE,cAAcyT,EAAUvtF,QAErCqJ,EAAWywE,cAAcyT,EAAUvtF,IAAIyH,KAAKipE,GAG5CrnE,EAAWwwE,aAAapyE,KAAKipE,IAY/BnxE,EAAQouF,wBAA0B,SAAStkF,EAAYkkF,GACrD,GAAIlkF,EAAWywE,cAAc10E,eAAemoF,EAAUvtF,IAAK,CACzD,IAAK,GAAI8E,GAAI,EAAGA,EAAIuE,EAAWywE,cAAcyT,EAAUvtF,IAAIiF,OAAQH,IAAK,CACtE,GAAI4rE,GAAOrnE,EAAWywE,cAAcyT,EAAUvtF,IAAI8E,EAC9C4rE,GAAKyO,eAAezO,EAAKyO,eAAel6E,OAAO,IAAMsoF,EAAUvtF,IACjE0wE,EAAKyO,eAAej5D,MACpBwqD,EAAKsO,OAASuO,EAAUvtF,GACxB0wE,EAAKvmD,KAAOojE,IAGZ7c,EAAK0O,aAAal5D,MAClBwqD,EAAKuO,KAAOsO,EAAUvtF,GACtB0wE,EAAKtuC,GAAKmrD,GAIZA,EAAU1T,aAAapyE,KAAKipE,EAG5B,KAAK,GAAIv4D,GAAI,EAAGA,EAAI9O,EAAWwwE,aAAa50E,OAAQkT,IAClD,GAAI9O,EAAWwwE,aAAa1hE,GAAGnY,IAAM0wE,EAAK1wE,GAAI,CAC5CqJ,EAAWwwE,aAAahyE,OAAOsQ,EAAE,EACjC,cAKC9O,GAAWywE,cAAcyT,EAAUvtF,MAa9CT,EAAQquF,eAAiB,SAASvkF,GAChC,IAAK,GAAIvE,GAAI,EAAGA,EAAIuE,EAAWwwE,aAAa50E,OAAQH,IAAK,CACvD,GAAI4rE,GAAOrnE,EAAWwwE,aAAa/0E,EAC/BuE,GAAWrJ,IAAM0wE,EAAKuO,MAAQ51E,EAAWrJ,IAAM0wE,EAAKsO,QACtD31E,EAAWwwE,aAAahyE,OAAO/C,EAAE,KAcvCvF,EAAQmuF,uBAAyB,SAASrkF,EAAYkkF,GACpD,IAAK,GAAIzoF,GAAI,EAAGA,EAAIuE,EAAWgyE,eAAekS,EAAUvtF,IAAIiF,OAAQH,IAAK,CACvE,GAAI4rE,GAAOrnE,EAAWgyE,eAAekS,EAAUvtF,IAAI8E,EAGnDnF,MAAKukE,MAAMwM,EAAK1wE,IAAM0wE,EAGtB6c,EAAU1T,aAAapyE,KAAKipE,GAC5BrnE,EAAWwwE,aAAapyE,KAAKipE,SAGxBrnE,GAAWgyE,eAAekS,EAAUvtF,KAa7CT,EAAQ8xE,aAAe,WACrB,GAAIxG,EAEJ,KAAKA,IAAUlrE,MAAK4jE,MAClB,GAAI5jE,KAAK4jE,MAAMn+D,eAAeylE,GAAS,CACrC,GAAIp3B,GAAO9zC,KAAK4jE,MAAMsH,EAClBp3B,GAAK0nC,YAAc,IACrB1nC,EAAKhS,MAAQ,IAAItS,OAAOzrB,OAAO+vC,EAAK0nC,aAAa,MAMvD,IAAKtQ,IAAUlrE,MAAK4jE,MACd5jE,KAAK4jE,MAAMn+D,eAAeylE,KAC5Bp3B,EAAO9zC,KAAK4jE,MAAMsH,GACM,GAApBp3B,EAAK0nC,cAEL1nC,EAAKhS,MADoB37B,SAAvB2tC,EAAKgoC,cACMhoC,EAAKgoC,cAGL/3E,OAAO+vC,EAAKzzC,OAuBnCT,EAAQqsF,uBAAyB,WAC/B,GAGI/gB,GAHA0kB,EAAW,EACXC,EAAW,IACXC,EAAe,CAInB,KAAK5kB,IAAUlrE,MAAK4jE,MACd5jE,KAAK4jE,MAAMn+D,eAAeylE,KAC5B4kB,EAAe9vF,KAAK4jE,MAAMsH,GAAQyQ,gBAAgBr2E,OACnCwqF,EAAXF,IAA0BA,EAAWE,GACrCD,EAAWC,IAAeD,EAAWC,GAI7C,IAAIF,EAAWC,EAAW7vF,KAAKkoE,UAAUtC,WAAWgB,uBAAwB,CAC1E,GAAIkmB,GAAgB9sF,KAAKqpE,YAAY/jE,OACjCyqF,EAAcH,EAAW5vF,KAAKkoE,UAAUtC,WAAWgB,sBAEvD,KAAKsE,IAAUlrE,MAAK4jE,MACd5jE,KAAK4jE,MAAMn+D,eAAeylE,IACxBlrE,KAAK4jE,MAAMsH,GAAQyQ,gBAAgBr2E,OAASyqF,GAC9C/vF,KAAKyuF,4BAA4BzuF,KAAK4jE,MAAMsH,GAIlDlrE,MAAK4rE,uBACL5rE,KAAKysF,sBAEDzsF,KAAKqpE,YAAY/jE,QAAUwnF,IAC7B9sF,KAAKg7E,gBAAkB,KAe7Bp7E,EAAQysF,kBAAoB,SAASv4C,GACnC,MACEjvC,MAAK+O,IAAIkgC,EAAK/lB,EAAI/tB,KAAKypE,WAAW17C,IAAM/tB,KAAKkoE,UAAUtC,WAAWe,kBAAkB3mE,KAAK62B,OAEzFhyB,KAAK+O,IAAIkgC,EAAK7zB,EAAIjgB,KAAKypE,WAAWxpD,IAAMjgB,KAAKkoE,UAAUtC,WAAWe,kBAAkB3mE,KAAK62B,OAU7Fj3B,EAAQmmF,gBAAkB,WACxB,IAAK,GAAI5gF,GAAI,EAAGA,EAAInF,KAAKqpE,YAAY/jE,OAAQH,IAAK,CAChD,GAAI2uC,GAAO9zC,KAAK4jE,MAAM5jE,KAAKqpE,YAAYlkE,GACvC,IAAoB,GAAf2uC,EAAKg7B,QAAkC,GAAfh7B,EAAKi7B,OAAkB,CAClD,GAAIxqC,GAAS,EAASvkC,KAAKqpE,YAAY/jE,OAAST,KAAKwG,IAAI,IAAIyoC,EAAKhmC,QAAQ+1D,MACtElqB,EAAQ,EAAI90C,KAAK4/B,GAAK5/B,KAAKE,QACZ,IAAf+uC,EAAKg7B,SAAkBh7B,EAAK/lB,EAAIwW,EAAS1/B,KAAKqzB,IAAIyhB,IACnC,GAAf7F,EAAKi7B,SAAkBj7B,EAAK7zB,EAAIskB,EAAS1/B,KAAKkzB,IAAI4hB,IACtD35C,KAAKouF,uBAAuBt6C,MAYlCl0C,EAAQ4tF,YAAc,WAMpB,IAAK,GALDwC,GAAU,EACVC,EAAiB,EACjBC,EAAa,EACbC,EAAa,EAERhrF,EAAI,EAAGA,EAAInF,KAAKqpE,YAAY/jE,OAAQH,IAAK,CAEhD,GAAI2uC,GAAO9zC,KAAK4jE,MAAM5jE,KAAKqpE,YAAYlkE,GACnC2uC,GAAKinC,mBAAqBoV,IAC5BA,EAAar8C,EAAKinC,oBAEpBiV,GAAWl8C,EAAKinC,mBAChBkV,GAAkBprF,KAAK0oC,IAAIuG,EAAKinC,mBAAmB,GACnDmV,GAAc,EAEhBF,GAAoBE,EACpBD,GAAkCC,CAElC,IAAIE,GAAWH,EAAiBprF,KAAK0oC,IAAIyiD,EAAQ,GAE7CK,EAAoBxrF,KAAK2jC,KAAK4nD,EAElCpwF,MAAKglF,aAAengF,KAAKC,MAAMkrF,EAAU,EAAEK,GAGvCrwF,KAAKglF,aAAemL,IACtBnwF,KAAKglF,aAAemL,IAexBvwF,EAAQ2tF,sBAAwB,SAAS+C,GACvCtwF,KAAKglF,aAAe,CACpB,IAAIuL,GAAe1rF,KAAKC,MAAM9E,KAAKqpE,YAAY/jE,OAASgrF,EACxD,KAAK,GAAIplB,KAAUlrE,MAAK4jE,MAClB5jE,KAAK4jE,MAAMn+D,eAAeylE,IACiB,GAAzClrE,KAAK4jE,MAAMsH,GAAQ6P,oBAA2B/6E,KAAK4jE,MAAMsH,GAAQgP,aAAa50E,QAAU,GACtFirF,EAAe,IACjBvwF,KAAK8uF,oBAAoB9uF,KAAK4jE,MAAMsH,IAAQ,GAAK,EAAK,GACtDqlB,GAAgB,IAa1B3wF,EAAQ0tF,kBAAoB,WAC1B,GAAIkD,GAAS,EACTC,EAAQ,CACZ,KAAK,GAAIvlB,KAAUlrE,MAAK4jE,MAClB5jE,KAAK4jE,MAAMn+D,eAAeylE,KACiB,GAAzClrE,KAAK4jE,MAAMsH,GAAQ6P,oBAA2B/6E,KAAK4jE,MAAMsH,GAAQgP,aAAa50E,QAAU,IAC1FkrF,GAAU,GAEZC,GAAS,EAGb,OAAOD,GAAOC,IAMZ,SAAS5wF,EAAQD,EAASM,GAE9B,GAAIS,GAAOT,EAAoB,EAgB/BN,GAAQ0sE,iBAAmB,WACzBtsE,KAAKmyE,QAAgB,OAAEnyE,KAAKkoF,WAAWtkB,MAAQ5jE,KAAK4jE,MACpD5jE,KAAKmyE,QAAgB,OAAEnyE,KAAKkoF,WAAW3jB,MAAQvkE,KAAKukE,MACpDvkE,KAAKmyE,QAAgB,OAAEnyE,KAAKkoF,WAAW7e,YAAcrpE,KAAKqpE,aAa5DzpE,EAAQ8wF,gBAAkB,SAASC,EAAUC,GACxBzqF,SAAfyqF,GAA0C,UAAdA,EAC9B5wF,KAAK6wF,sBAAsBF,GAG3B3wF,KAAK8wF,sBAAsBH,IAY/B/wF,EAAQixF,sBAAwB,SAASF,GACvC3wF,KAAKqpE,YAAcrpE,KAAKmyE,QAAgB,OAAEwe,GAAuB,YACjE3wF,KAAK4jE,MAAc5jE,KAAKmyE,QAAgB,OAAEwe,GAAiB,MAC3D3wF,KAAKukE,MAAcvkE,KAAKmyE,QAAgB,OAAEwe,GAAiB,OAU7D/wF,EAAQmxF,uBAAyB,WAC/B/wF,KAAKqpE,YAAcrpE,KAAKmyE,QAAiB,QAAe,YACxDnyE,KAAK4jE,MAAc5jE,KAAKmyE,QAAiB,QAAS,MAClDnyE,KAAKukE,MAAcvkE,KAAKmyE,QAAiB,QAAS,OAWpDvyE,EAAQkxF,sBAAwB,SAASH,GACvC3wF,KAAKqpE,YAAcrpE,KAAKmyE,QAAgB,OAAEwe,GAAuB,YACjE3wF,KAAK4jE,MAAc5jE,KAAKmyE,QAAgB,OAAEwe,GAAiB,MAC3D3wF,KAAKukE,MAAcvkE,KAAKmyE,QAAgB,OAAEwe,GAAiB,OAU7D/wF,EAAQoxF,kBAAoB,WAC1BhxF,KAAK0wF,gBAAgB1wF,KAAKkoF,YAU5BtoF,EAAQsoF,QAAU,WAChB,MAAOloF,MAAKilF,aAAajlF,KAAKilF,aAAa3/E,OAAO,IAUpD1F,EAAQqxF,gBAAkB,WACxB,GAAIjxF,KAAKilF,aAAa3/E,OAAS,EAC7B,MAAOtF,MAAKilF,aAAajlF,KAAKilF,aAAa3/E,OAAO,EAGlD,MAAM,IAAIU,WAAU,iEAaxBpG,EAAQsxF,iBAAmB,SAASC,GAClCnxF,KAAKilF,aAAan9E,KAAKqpF,IAUzBvxF,EAAQwxF,kBAAoB,WAC1BpxF,KAAKilF,aAAa1+D,OAWpB3mB,EAAQyxF,iBAAmB,SAASF,GAElCnxF,KAAKmyE,QAAgB,OAAEgf,IAAUvtB,SACAW,SACA8E,eACAkS,eAAkBv7E,KAAK62B,MACvBquD,YAAe/+E,QAGhDnG,KAAKmyE,QAAgB,OAAEgf,GAAoB,YAAI,GAAIhuF,OAC9C9C,GAAG8wF,EACF1mF,OACEiB,WAAY,UACZC,OAAQ,iBAEJ3L,KAAKkoE,WACjBloE,KAAKmyE,QAAgB,OAAEgf,GAAoB,YAAE3V,YAAc,GAW7D57E,EAAQ0xF,oBAAsB,SAASX,SAC9B3wF,MAAKmyE,QAAgB,OAAEwe,IAWhC/wF,EAAQ2xF,oBAAsB,SAASZ,SAC9B3wF,MAAKmyE,QAAgB,OAAEwe,IAWhC/wF,EAAQ4xF,cAAgB,SAASb,GAE/B3wF,KAAKmyE,QAAgB,OAAEwe,GAAY3wF,KAAKmyE,QAAgB,OAAEwe,GAG1D3wF,KAAKsxF,oBAAoBX,IAW3B/wF,EAAQ6xF,gBAAkB,SAASd,GAEjC3wF,KAAKmyE,QAAgB,OAAEwe,GAAY3wF,KAAKmyE,QAAgB,OAAEwe,GAG1D3wF,KAAKuxF,oBAAoBZ,IAa3B/wF,EAAQ8xF,qBAAuB,SAASf,GAEtC,IAAK,GAAIzlB,KAAUlrE,MAAK4jE,MAClB5jE,KAAK4jE,MAAMn+D,eAAeylE,KAC5BlrE,KAAKmyE,QAAgB,OAAEwe,GAAiB,MAAEzlB,GAAUlrE,KAAK4jE,MAAMsH,GAKnE,KAAK,GAAIsF,KAAUxwE,MAAKukE,MAClBvkE,KAAKukE,MAAM9+D,eAAe+qE,KAC5BxwE,KAAKmyE,QAAgB,OAAEwe,GAAiB,MAAEngB,GAAUxwE,KAAKukE,MAAMiM,GAKnE,KAAK,GAAIrrE,GAAI,EAAGA,EAAInF,KAAKqpE,YAAY/jE,OAAQH,IAC3CnF,KAAKmyE,QAAgB,OAAEwe,GAAuB,YAAE7oF,KAAK9H,KAAKqpE,YAAYlkE,KAW1EvF,EAAQ+xF,6BAA+B,WACrC3xF,KAAKunF,aAAa,GAAE,IAUtB3nF,EAAQ0sF,WAAa,SAASx4C,GAE5B,GAAI89C,GAAS5xF,KAAKkoF,gBAWXloF,MAAK4jE,MAAM9vB,EAAKzzC,GAEvB,IAAIwxF,GAAmBlxF,EAAKgE,YAG5B3E,MAAKwxF,cAAcI,GAGnB5xF,KAAKqxF,iBAAiBQ,GAGtB7xF,KAAKkxF,iBAAiBW,GAGtB7xF,KAAK0wF,gBAAgB1wF,KAAKkoF,WAG1BloF,KAAK4jE,MAAM9vB,EAAKzzC,IAAMyzC,GAUxBl0C,EAAQmtF,gBAAkB,WAExB,GAAI6E,GAAS5xF,KAAKkoF,SAGlB,IAAc,WAAV0J,IAC8B,GAA3B5xF,KAAKqpE,YAAY/jE,QACpBtF,KAAKmyE,QAAgB,OAAEyf,GAAqB,YAAErjE,MAAMvuB,KAAK62B,MAAQ72B,KAAKkoE,UAAUtC,WAAWO,oBAAsBnmE,KAAKg5B,MAAMC,OAAOC,aACnIl5B,KAAKmyE,QAAgB,OAAEyf,GAAqB,YAAEpjE,OAAOxuB,KAAK62B,MAAQ72B,KAAKkoE,UAAUtC,WAAWO,oBAAsBnmE,KAAKg5B,MAAMC,OAAOoF,cAAe,CACnJ,GAAIyzD,GAAiB9xF,KAAKixF,iBAG1BjxF,MAAK2xF,+BAIL3xF,KAAK0xF,qBAAqBI,GAI1B9xF,KAAKsxF,oBAAoBM,GAGzB5xF,KAAKyxF,gBAAgBK,GAGrB9xF,KAAK0wF,gBAAgBoB,GAGrB9xF,KAAKoxF,oBAGLpxF,KAAK4rE,uBAGL5rE,KAAKuxE,4BAeX3xE,EAAQq0E,sBAAwB,SAAS8d,EAAYC,GACnD,GAAiB7rF,SAAb6rF,EACF,IAAK,GAAIJ,KAAU5xF,MAAKmyE,QAAgB,OAClCnyE,KAAKmyE,QAAgB,OAAE1sE,eAAemsF,KAExC5xF,KAAK6wF,sBAAsBe,GAC3B5xF,KAAK+xF,UAKT,KAAK,GAAIH,KAAU5xF,MAAKmyE,QAAgB,OACtC,GAAInyE,KAAKmyE,QAAgB,OAAE1sE,eAAemsF,GAAS,CAEjD5xF,KAAK6wF,sBAAsBe,EAC3B,IAAI/wE,GAAOjb,MAAM4O,UAAUtM,OAAO3H,KAAK8E,UAAW,EAC9Cwb,GAAKvb,OAAS,EAChBtF,KAAK+xF,GAAalxE,EAAK,GAAGA,EAAK,IAG/B7gB,KAAK+xF,GAAaC,GAM1BhyF,KAAKgxF,qBAaPpxF,EAAQs0E,mBAAqB,SAAS6d,EAAYC,GAChD,GAAiB7rF,SAAb6rF,EACFhyF,KAAK+wF,yBACL/wF,KAAK+xF,SAEF,CACH/xF,KAAK+wF,wBACL,IAAIlwE,GAAOjb,MAAM4O,UAAUtM,OAAO3H,KAAK8E,UAAW,EAC9Cwb,GAAKvb,OAAS,EAChBtF,KAAK+xF,GAAalxE,EAAK,GAAGA,EAAK,IAG/B7gB,KAAK+xF,GAAaC,GAItBhyF,KAAKgxF,qBAaPpxF,EAAQqyF,sBAAwB,SAASF,EAAYC,GACnD,GAAiB7rF,SAAb6rF,EACF,IAAK,GAAIJ,KAAU5xF,MAAKmyE,QAAgB,OAClCnyE,KAAKmyE,QAAgB,OAAE1sE,eAAemsF,KAExC5xF,KAAK8wF,sBAAsBc,GAC3B5xF,KAAK+xF,UAKT,KAAK,GAAIH,KAAU5xF,MAAKmyE,QAAgB,OACtC,GAAInyE,KAAKmyE,QAAgB,OAAE1sE,eAAemsF,GAAS,CAEjD5xF,KAAK8wF,sBAAsBc,EAC3B,IAAI/wE,GAAOjb,MAAM4O,UAAUtM,OAAO3H,KAAK8E,UAAW,EAC9Cwb,GAAKvb,OAAS,EAChBtF,KAAK+xF,GAAalxE,EAAK,GAAGA,EAAK,IAG/B7gB,KAAK+xF,GAAaC,GAK1BhyF,KAAKgxF,qBAaPpxF,EAAQ2yE,gBAAkB,SAASwf,EAAYC,GAC7C,GAAInxE,GAAOjb,MAAM4O,UAAUtM,OAAO3H,KAAK8E,UAAW,EACjCc,UAAb6rF,GACFhyF,KAAKi0E,sBAAsB8d,GAC3B/xF,KAAKiyF,sBAAsBF,IAGvBlxE,EAAKvb,OAAS,GAChBtF,KAAKi0E,sBAAsB8d,EAAYlxE,EAAK,GAAGA,EAAK,IACpD7gB,KAAKiyF,sBAAsBF,EAAYlxE,EAAK,GAAGA,EAAK,MAGpD7gB,KAAKi0E,sBAAsB8d,EAAYC,GACvChyF,KAAKiyF,sBAAsBF,EAAYC,KAY7CpyF,EAAQisE,oBAAsB,WAC5B,GAAI+lB,GAAS5xF,KAAKkoF,SAClBloF,MAAKmyE,QAAgB,OAAEyf,GAAqB,eAC5C5xF,KAAKqpE,YAAcrpE,KAAKmyE,QAAgB,OAAEyf,GAAqB,aAWjEhyF,EAAQsyF,iBAAmB,SAAS7xD,EAAIuwD,GACtC,GAAsD98C,GAAlDg3B,EAAO,IAAKC,EAAO,KAAMC,EAAO,IAAKC,EAAO,IAChD,KAAK,GAAI2mB,KAAU5xF,MAAKmyE,QAAQye,GAC9B,GAAI5wF,KAAKmyE,QAAQye,GAAYnrF,eAAemsF,IACczrF,SAApDnG,KAAKmyE,QAAQye,GAAYgB,GAAqB,YAAiB,CAEjE5xF,KAAK0wF,gBAAgBkB,EAAOhB,GAE5B9lB,EAAO,IAAKC,EAAO,KAAMC,EAAO,IAAKC,EAAO,IAC5C,KAAK,GAAIC,KAAUlrE,MAAK4jE,MAClB5jE,KAAK4jE,MAAMn+D,eAAeylE,KAC5Bp3B,EAAO9zC,KAAK4jE,MAAMsH,GAClBp3B,EAAKqoC,OAAO97C,GACR2qC,EAAOl3B,EAAK/lB,EAAI,GAAM+lB,EAAKvlB,QAAQy8C,EAAOl3B,EAAK/lB,EAAI,GAAM+lB,EAAKvlB,OAC9D08C,EAAOn3B,EAAK/lB,EAAI,GAAM+lB,EAAKvlB,QAAQ08C,EAAOn3B,EAAK/lB,EAAI,GAAM+lB,EAAKvlB,OAC9Du8C,EAAOh3B,EAAK7zB,EAAI,GAAM6zB,EAAKtlB,SAASs8C,EAAOh3B,EAAK7zB,EAAI,GAAM6zB,EAAKtlB,QAC/Du8C,EAAOj3B,EAAK7zB,EAAI,GAAM6zB,EAAKtlB,SAASu8C,EAAOj3B,EAAK7zB,EAAI,GAAM6zB,EAAKtlB,QAGvEslB,GAAO9zC,KAAKmyE,QAAQye,GAAYgB,GAAqB,YACrD99C,EAAK/lB,EAAI,IAAOk9C,EAAOD,GACvBl3B,EAAK7zB,EAAI,IAAO8qD,EAAOD,GACvBh3B,EAAKvlB,MAAQ,GAAKulB,EAAK/lB,EAAIi9C,GAC3Bl3B,EAAKtlB,OAAS,GAAKslB,EAAK7zB,EAAI6qD,GAC5Bh3B,EAAKvP,OAAS1/B,KAAK2jC,KAAK3jC,KAAK0oC,IAAI,GAAIuG,EAAKvlB,MAAM,GAAK1pB,KAAK0oC,IAAI,GAAIuG,EAAKtlB,OAAO,IAC9EslB,EAAK0S,SAASxmD,KAAK62B,OACnBid,EAAKyoC,YAAYl8C,KAMzBzgC,EAAQuyF,oBAAsB,SAAS9xD,GACrCrgC,KAAKkyF,iBAAiB7xD,EAAI,UAC1BrgC,KAAKkyF,iBAAiB7xD,EAAI,UAC1BrgC,KAAKgxF,sBAMH,SAASnxF,EAAQD,EAASM,GAE9B,GAAIiD,GAAOjD,EAAoB,GAS/BN,GAAQwyF,yBAA2B,SAASxuF,EAAQyuF,GAClD,GAAIzuB,GAAQ5jE,KAAK4jE,KACjB,KAAK,GAAIsH,KAAUtH,GACbA,EAAMn+D,eAAeylE,IACnBtH,EAAMsH,GAAQ4F,kBAAkBltE,IAClCyuF,EAAiBvqF,KAAKojE,IAY9BtrE,EAAQ0yF,4BAA8B,SAAU1uF,GAC9C,GAAIyuF,KAEJ,OADAryF,MAAKi0E,sBAAsB,2BAA2BrwE,EAAOyuF,GACtDA,GAWTzyF,EAAQ2yF,yBAA2B,SAASv6C,GAC1C,GAAIjqB,GAAI/tB,KAAKivE,qBAAqBj3B,EAAQjqB,GACtC9N,EAAIjgB,KAAKmvE,qBAAqBn3B,EAAQ/3B,EAE1C,QACE7Y,KAAQ2mB,EACRvmB,IAAQyY,EACR0gB,MAAQ5S,EACRgP,OAAQ9c,IAYZrgB,EAAQ4uE,WAAa,SAAUx2B,GAE7B,GAAIw6C,GAAiBxyF,KAAKuyF,yBAAyBv6C,GAC/Cq6C,EAAmBryF,KAAKsyF,4BAA4BE,EAIxD,OAAIH,GAAiB/sF,OAAS,EACpBtF,KAAK4jE,MAAMyuB,EAAiBA,EAAiB/sF,OAAS,IAGvD,MAWX1F,EAAQ6yF,yBAA2B,SAAU7uF,EAAQ8uF,GACnD,GAAInuB,GAAQvkE,KAAKukE,KACjB,KAAK,GAAIiM,KAAUjM,GACbA,EAAM9+D,eAAe+qE,IACnBjM,EAAMiM,GAAQM,kBAAkBltE,IAClC8uF,EAAiB5qF,KAAK0oE,IAa9B5wE,EAAQ+yF,4BAA8B,SAAU/uF,GAC9C,GAAI8uF,KAEJ,OADA1yF,MAAKi0E,sBAAsB,2BAA2BrwE,EAAO8uF,GACtDA,GAWT9yF,EAAQ6wE,WAAa,SAASz4B,GAC5B,GAAIw6C,GAAiBxyF,KAAKuyF,yBAAyBv6C,GAC/C06C,EAAmB1yF,KAAK2yF,4BAA4BH,EAExD,OAAIE,GAAiBptF,OAAS,EACrBtF,KAAKukE,MAAMmuB,EAAiBA,EAAiBptF,OAAS,IAGtD,MAWX1F,EAAQgzF,gBAAkB,SAASlpE,GAC7BA,YAAevmB,GACjBnD,KAAK6uE,aAAajL,MAAMl6C,EAAIrpB,IAAMqpB,EAGlC1pB,KAAK6uE,aAAatK,MAAM76C,EAAIrpB,IAAMqpB,GAUtC9pB,EAAQizF,YAAc,SAASnpE,GACzBA,YAAevmB,GACjBnD,KAAKmoE,SAASvE,MAAMl6C,EAAIrpB,IAAMqpB,EAG9B1pB,KAAKmoE,SAAS5D,MAAM76C,EAAIrpB,IAAMqpB,GAWlC9pB,EAAQkzF,qBAAuB,SAASppE,GAClCA,YAAevmB,SACVnD,MAAK6uE,aAAajL,MAAMl6C,EAAIrpB,UAG5BL,MAAK6uE,aAAatK,MAAM76C,EAAIrpB,KAUvCT,EAAQkuF,aAAe,SAASiF,GACT5sF,SAAjB4sF,IACFA,GAAe,EAEjB,KAAI,GAAI7nB,KAAUlrE,MAAK6uE,aAAajL,MAC/B5jE,KAAK6uE,aAAajL,MAAMn+D,eAAeylE,IACxClrE,KAAK6uE,aAAajL,MAAMsH,GAAQ/gB,UAGpC,KAAI,GAAIqmB,KAAUxwE,MAAK6uE,aAAatK,MAC/BvkE,KAAK6uE,aAAatK,MAAM9+D,eAAe+qE,IACxCxwE,KAAK6uE,aAAatK,MAAMiM,GAAQrmB,UAIpCnqD,MAAK6uE,cAAgBjL,SAASW,UAEV,GAAhBwuB,GACF/yF,KAAKymC,KAAK,SAAUzmC,KAAK+vC,iBAU7BnwC,EAAQozF,kBAAoB,SAASD,GACd5sF,SAAjB4sF,IACFA,GAAe,EAGjB,KAAK,GAAI7nB,KAAUlrE,MAAK6uE,aAAajL,MAC/B5jE,KAAK6uE,aAAajL,MAAMn+D,eAAeylE,IACrClrE,KAAK6uE,aAAajL,MAAMsH,GAAQsQ,YAAc,IAChDx7E,KAAK6uE,aAAajL,MAAMsH,GAAQ/gB,WAChCnqD,KAAK8yF,qBAAqB9yF,KAAK6uE,aAAajL,MAAMsH,IAKpC,IAAhB6nB,GACF/yF,KAAKymC,KAAK,SAAUzmC,KAAK+vC,iBAW7BnwC,EAAQqzF,sBAAwB,WAC9B,GAAIniF,GAAQ,CACZ,KAAK,GAAIo6D,KAAUlrE,MAAK6uE,aAAajL,MAC/B5jE,KAAK6uE,aAAajL,MAAMn+D,eAAeylE,KACzCp6D,GAAS,EAGb,OAAOA,IASTlR,EAAQszF,iBAAmB,WACzB,IAAK,GAAIhoB,KAAUlrE,MAAK6uE,aAAajL,MACnC,GAAI5jE,KAAK6uE,aAAajL,MAAMn+D,eAAeylE,GACzC,MAAOlrE,MAAK6uE,aAAajL,MAAMsH,EAGnC,OAAO,OASTtrE,EAAQuzF,iBAAmB,WACzB,IAAK,GAAI3iB,KAAUxwE,MAAK6uE,aAAatK,MACnC,GAAIvkE,KAAK6uE,aAAatK,MAAM9+D,eAAe+qE,GACzC,MAAOxwE,MAAK6uE,aAAatK,MAAMiM,EAGnC,OAAO,OAUT5wE,EAAQwzF,sBAAwB,WAC9B,GAAItiF,GAAQ,CACZ,KAAK,GAAI0/D,KAAUxwE,MAAK6uE,aAAatK,MAC/BvkE,KAAK6uE,aAAatK,MAAM9+D,eAAe+qE,KACzC1/D,GAAS,EAGb,OAAOA,IAUTlR,EAAQyzF,wBAA0B,WAChC,GAAIviF,GAAQ,CACZ,KAAI,GAAIo6D,KAAUlrE,MAAK6uE,aAAajL,MAC/B5jE,KAAK6uE,aAAajL,MAAMn+D,eAAeylE,KACxCp6D,GAAS,EAGb,KAAI,GAAI0/D,KAAUxwE,MAAK6uE,aAAatK,MAC/BvkE,KAAK6uE,aAAatK,MAAM9+D,eAAe+qE,KACxC1/D,GAAS,EAGb,OAAOA,IASTlR,EAAQ0zF,kBAAoB,WAC1B,IAAI,GAAIpoB,KAAUlrE,MAAK6uE,aAAajL,MAClC,GAAG5jE,KAAK6uE,aAAajL,MAAMn+D,eAAeylE,GACxC,OAAO,CAGX,KAAI,GAAIsF,KAAUxwE,MAAK6uE,aAAatK,MAClC,GAAGvkE,KAAK6uE,aAAatK,MAAM9+D,eAAe+qE,GACxC,OAAO,CAGX,QAAO,GAUT5wE,EAAQ2zF,oBAAsB,WAC5B,IAAI,GAAIroB,KAAUlrE,MAAK6uE,aAAajL,MAClC,GAAG5jE,KAAK6uE,aAAajL,MAAMn+D,eAAeylE,IACpClrE,KAAK6uE,aAAajL,MAAMsH,GAAQsQ,YAAc,EAChD,OAAO,CAIb,QAAO,GAST57E,EAAQ4zF,sBAAwB,SAAS1/C,GACvC,IAAK,GAAI3uC,GAAI,EAAGA,EAAI2uC,EAAKomC,aAAa50E,OAAQH,IAAK,CACjD,GAAI4rE,GAAOj9B,EAAKomC,aAAa/0E,EAC7B4rE,GAAK3mB,SACLpqD,KAAK4yF,gBAAgB7hB,KAUzBnxE,EAAQ6zF,qBAAuB,SAAS3/C,GACtC,IAAK,GAAI3uC,GAAI,EAAGA,EAAI2uC,EAAKomC,aAAa50E,OAAQH,IAAK,CACjD,GAAI4rE,GAAOj9B,EAAKomC,aAAa/0E,EAC7B4rE,GAAKllE,OAAQ,EACb7L,KAAK6yF,YAAY9hB,KAWrBnxE,EAAQ8zF,wBAA0B,SAAS5/C,GACzC,IAAK,GAAI3uC,GAAI,EAAGA,EAAI2uC,EAAKomC,aAAa50E,OAAQH,IAAK,CACjD,GAAI4rE,GAAOj9B,EAAKomC,aAAa/0E,EAC7B4rE,GAAK5mB,WACLnqD,KAAK8yF,qBAAqB/hB,KAgB9BnxE,EAAQ+uE,cAAgB,SAAS/qE,EAAQ+vF,EAAQZ,EAAca,GACxCztF,SAAjB4sF,IACFA,GAAe,GAEM5sF,SAAnBytF,IACFA,GAAiB,GAGa,GAA5B5zF,KAAKszF,qBAA0C,GAAVK,GAAgD,GAA7B3zF,KAAKolF,sBAC/DplF,KAAK8tF,cAAa,GAGG,GAAnBlqF,EAAO0oD,UACT1oD,EAAOwmD,SACPpqD,KAAK4yF,gBAAgBhvF,GACjBA,YAAkBT,IAA6C,GAArCnD,KAAKmlF,8BAA2D,GAAlByO,GAC1E5zF,KAAKwzF,sBAAsB5vF,KAI7BA,EAAOumD,WACPnqD,KAAK8yF,qBAAqBlvF,IAGR,GAAhBmvF,GACF/yF,KAAKymC,KAAK,SAAUzmC,KAAK+vC,iBAY7BnwC,EAAQ+wE,YAAc,SAAS/sE,GACT,GAAhBA,EAAOiI,QACTjI,EAAOiI,OAAQ,EACf7L,KAAKymC,KAAK,YAAYqN,KAAKlwC,EAAOvD,OAWtCT,EAAQ8wE,aAAe,SAAS9sE,GACV,GAAhBA,EAAOiI,QACTjI,EAAOiI,OAAQ,EACf7L,KAAK6yF,YAAYjvF,GACbA,YAAkBT,IACpBnD,KAAKymC,KAAK,aAAaqN,KAAKlwC,EAAOvD,MAGnCuD,YAAkBT,IACpBnD,KAAKyzF,qBAAqB7vF,IAa9BhE,EAAQ0uE,aAAe,aAUvB1uE,EAAQyvE,WAAa,SAASr3B,GAC5B,GAAIlE,GAAO9zC,KAAKwuE,WAAWx2B,EAC3B,IAAY,MAARlE,EACF9zC,KAAK2uE,cAAc76B,GAAK,OAErB,CACH,GAAIi9B,GAAO/wE,KAAKywE,WAAWz4B,EACf,OAAR+4B,EACF/wE,KAAK2uE,cAAcoC,GAAK,GAGxB/wE,KAAK8tF,eAGT9tF,KAAKymC,KAAK,QAASzmC,KAAK+vC,gBACxB/vC,KAAKuoE,WAUP3oE,EAAQ0vE,iBAAmB,SAASt3B,GAClC,GAAIlE,GAAO9zC,KAAKwuE,WAAWx2B,EACf,OAARlE,GAAyB3tC,SAAT2tC,IAElB9zC,KAAKypE,YAAe17C,EAAM/tB,KAAKivE,qBAAqBj3B,EAAQjqB,GACxC9N,EAAMjgB,KAAKmvE,qBAAqBn3B,EAAQ/3B,IAC5DjgB,KAAKmsF,YAAYr4C,IAEnB9zC,KAAKymC,KAAK,cAAezmC,KAAK+vC,iBAUhCnwC,EAAQ2vE,cAAgB,SAASv3B,GAC/B,GAAIlE,GAAO9zC,KAAKwuE,WAAWx2B,EAC3B,IAAY,MAARlE,EACF9zC,KAAK2uE,cAAc76B,GAAK,OAErB,CACH,GAAIi9B,GAAO/wE,KAAKywE,WAAWz4B,EACf,OAAR+4B,GACF/wE,KAAK2uE,cAAcoC,GAAK,GAG5B/wE,KAAKuoE,WASP3oE,EAAQ4vE,iBAAmB,aAW3B5vE,EAAQmwC,aAAe,WACrB,GAAI8jD,GAAU7zF,KAAK8zF,mBACfC,EAAU/zF,KAAKg0F,kBACnB,QAAQpwB,MAAMiwB,EAAStvB,MAAMwvB,IAS/Bn0F,EAAQk0F,iBAAmB,WACzB,GAAIG,KACJ,KAAI,GAAI/oB,KAAUlrE,MAAK6uE,aAAajL,MAC/B5jE,KAAK6uE,aAAajL,MAAMn+D,eAAeylE,IACxC+oB,EAAQnsF,KAAKojE,EAGjB,OAAO+oB,IASTr0F,EAAQo0F,iBAAmB,WACzB,GAAIC,KACJ,KAAI,GAAIzjB,KAAUxwE,MAAK6uE,aAAatK,MAC/BvkE,KAAK6uE,aAAatK,MAAM9+D,eAAe+qE,IACxCyjB,EAAQnsF,KAAK0oE,EAGjB,OAAOyjB;EASTr0F,EAAQiwC,aAAe,SAASoZ,GAC9B,GAAI9jD,GAAG0pD,EAAMxuD,CAEb,KAAK4oD,GAAkC9iD,QAApB8iD,EAAU3jD,OAC3B,KAAM,qCAKR,KAFAtF,KAAK8tF,cAAa,GAEb3oF,EAAI,EAAG0pD,EAAO5F,EAAU3jD,OAAYupD,EAAJ1pD,EAAUA,IAAK,CAClD9E,EAAK4oD,EAAU9jD,EAEf,IAAI2uC,GAAO9zC,KAAK4jE,MAAMvjE,EACtB,KAAKyzC,EACH,KAAM,IAAIogD,YAAW,iBAAmB7zF,EAAK,cAE/CL,MAAK2uE,cAAc76B,GAAK,GAAK,GAG/B/kC,QAAQC,IAAI,+DAEZhP,KAAKm7B,UAUPv7B,EAAQu0F,YAAc,SAASlrC,EAAW2qC,GACxC,GAAIzuF,GAAG0pD,EAAMxuD,CAEb,KAAK4oD,GAAkC9iD,QAApB8iD,EAAU3jD,OAC3B,KAAM,qCAKR,KAFAtF,KAAK8tF,cAAa,GAEb3oF,EAAI,EAAG0pD,EAAO5F,EAAU3jD,OAAYupD,EAAJ1pD,EAAUA,IAAK,CAClD9E,EAAK4oD,EAAU9jD,EAEf,IAAI2uC,GAAO9zC,KAAK4jE,MAAMvjE,EACtB,KAAKyzC,EACH,KAAM,IAAIogD,YAAW,iBAAmB7zF,EAAK,cAE/CL,MAAK2uE,cAAc76B,GAAK,GAAK,EAAK8/C,GAEpC5zF,KAAKm7B,UASPv7B,EAAQw0F,YAAc,SAASnrC,GAC7B,GAAI9jD,GAAG0pD,EAAMxuD,CAEb,KAAK4oD,GAAkC9iD,QAApB8iD,EAAU3jD,OAC3B,KAAM,qCAKR,KAFAtF,KAAK8tF,cAAa,GAEb3oF,EAAI,EAAG0pD,EAAO5F,EAAU3jD,OAAYupD,EAAJ1pD,EAAUA,IAAK,CAClD9E,EAAK4oD,EAAU9jD,EAEf,IAAI4rE,GAAO/wE,KAAKukE,MAAMlkE,EACtB,KAAK0wE,EACH,KAAM,IAAImjB,YAAW,iBAAmB7zF,EAAK,cAE/CL,MAAK2uE,cAAcoC,GAAK,GAAK,EAAK6iB,gBAEpC5zF,KAAKm7B,UAOPv7B,EAAQyxE,iBAAmB,WACzB,IAAI,GAAInG,KAAUlrE,MAAK6uE,aAAajL,MAC/B5jE,KAAK6uE,aAAajL,MAAMn+D,eAAeylE,KACnClrE,KAAK4jE,MAAMn+D,eAAeylE,UACtBlrE,MAAK6uE,aAAajL,MAAMsH,GAIrC,KAAI,GAAIsF,KAAUxwE,MAAK6uE,aAAatK,MAC/BvkE,KAAK6uE,aAAatK,MAAM9+D,eAAe+qE,KACnCxwE,KAAKukE,MAAM9+D,eAAe+qE,UACtBxwE,MAAK6uE,aAAatK,MAAMiM,MASnC,SAAS3wE,EAAQD,EAASM,GAE9B,GAAIS,GAAOT,EAAoB,GAC3BiD,EAAOjD,EAAoB,IAC3B8C,EAAO9C,EAAoB,GAO/BN,GAAQy0F,qBAAuB,WAC7B,KAAOr0F,KAAKqlF,gBAAgBloD,iBAC1Bn9B,KAAKqlF,gBAAgBj4D,YAAYptB,KAAKqlF,gBAAgBjoD,aAW1Dx9B,EAAQ00F,4BAA8B,WACpC,IAAK,GAAIC,KAAgBv0F,MAAKkpE,gBACxBlpE,KAAKkpE,gBAAgBzjE,eAAe8uF,KACtCv0F,KAAKu0F,GAAgBv0F,KAAKkpE,gBAAgBqrB,KAUhD30F,EAAQ40F,gBAAkB,WACxBx0F,KAAK4sE,UAAY5sE,KAAK4sE,QACtB,IAAI6nB,GAAUjnE,SAASo4D,eAAe,2BAClCL,EAAW/3D,SAASo4D,eAAe,iCACnCN,EAAc93D,SAASo4D,eAAe,gCACrB,IAAjB5lF,KAAK4sE,UACP6nB,EAAQtmE,MAAMoiC,QAAQ,QACtBg1B,EAASp3D,MAAMoiC,QAAQ,QACvB+0B,EAAYn3D,MAAMoiC,QAAQ,OAC1Bg1B,EAAS75C,QAAU1rC,KAAKw0F,gBAAgBnmD,KAAKruC,QAG7Cy0F,EAAQtmE,MAAMoiC,QAAQ,OACtBg1B,EAASp3D,MAAMoiC,QAAQ,OACvB+0B,EAAYn3D,MAAMoiC,QAAQ,QAC1Bg1B,EAAS75C,QAAU,MAErB1rC,KAAKiuE,yBAQPruE,EAAQquE,sBAAwB,WAE1BjuE,KAAK00F,eACP10F,KAAKkvB,IAAI,SAAUlvB,KAAK00F,cAG1B,IAAIvxC,GAASnjD,KAAKkoE,UAAU9gB,QAAQpnD,KAAKkoE,UAAU/kB,OAmBnD,IAjB6Bh9C,SAAzBnG,KAAK20F,kBACP30F,KAAK20F,gBAAgBlR,uBACrBzjF,KAAK20F,gBAAkBxuF,OACvBnG,KAAK40F,oBAAsB,KAC3B50F,KAAKooE,oBAAqB,GAI5BpoE,KAAKs0F,8BAGLt0F,KAAKipE,kBAAmB,EAGxBjpE,KAAKmlF,8BAA+B,EACpCnlF,KAAKolF,sBAAuB,EAEP,GAAjBplF,KAAK4sE,SAAkB,CACzB,KAAO5sE,KAAKqlF,gBAAgBloD,iBAC1Bn9B,KAAKqlF,gBAAgBj4D,YAAYptB,KAAKqlF,gBAAgBjoD,WAIxDp9B,MAAKqlF,gBAAgB5nD,UAAY,oHAEc0lB,EAAgB,QAAG,mLAGnBA,EAAgB,QAAG,iBAC9B,GAAhCnjD,KAAKizF,yBAAgCjzF,KAAKujE,iBAAiBC,KAC7DxjE,KAAKqlF,gBAAgB5nD,WAAa,+JAGa0lB,EAAiB,SAAG,iBAE5B,GAAhCnjD,KAAKozF,yBAAgE,GAAhCpzF,KAAKizF,0BACjDjzF,KAAKqlF,gBAAgB5nD,WAAa,+JAGW0lB,EAAiB,SAAG,kBAEnC,GAA5BnjD,KAAKszF,sBACPtzF,KAAKqlF,gBAAgB5nD,WAAa,+JAGa0lB,EAAY,IAAG,iBAKhE,IAAI0xC,GAAgBrnE,SAASo4D,eAAe,6BAC5CiP,GAAcnpD,QAAU1rC,KAAK80F,sBAAsBzmD,KAAKruC,KACxD,IAAI+0F,GAAgBvnE,SAASo4D,eAAe,iCAE5C,IADAmP,EAAcrpD,QAAU1rC,KAAKg1F,sBAAsB3mD,KAAKruC,MACpB,GAAhCA,KAAKizF,yBAAgCjzF,KAAKujE,iBAAiBC,KAAM,CACnE,GAAIyxB,GAAaznE,SAASo4D,eAAe,8BACzCqP,GAAWvpD,QAAU1rC,KAAKk1F,UAAU7mD,KAAKruC,UAEtC,IAAoC,GAAhCA,KAAKozF,yBAAgE,GAAhCpzF,KAAKizF,wBAA8B,CAC/E,GAAIgC,GAAaznE,SAASo4D,eAAe,8BACzCqP,GAAWvpD,QAAU1rC,KAAKm1F,uBAAuB9mD,KAAKruC,MAExD,GAAgC,GAA5BA,KAAKszF,oBAA8B,CACrC,GAAI1jC,GAAepiC,SAASo4D,eAAe,4BAC3Ch2B,GAAalkB,QAAU1rC,KAAKkuE,gBAAgB7/B,KAAKruC,MAEnD,GAAIulF,GAAW/3D,SAASo4D,eAAe,gCACvCL,GAAS75C,QAAU1rC,KAAKw0F,gBAAgBnmD,KAAKruC,MAE7CA,KAAK00F,cAAgB10F,KAAKiuE,sBAAsB5/B,KAAKruC,MACrDA,KAAK+uB,GAAG,SAAU/uB,KAAK00F,mBAEpB,CACH10F,KAAKslF,YAAY7nD,UAAY,qIAEkB0lB,EAAa,KAAI,gBAChE,IAAIiyC,GAAiB5nE,SAASo4D,eAAe,oCAC7CwP,GAAe1pD,QAAU1rC,KAAKw0F,gBAAgBnmD,KAAKruC,QAWvDJ,EAAQk1F,sBAAwB,WAE9B90F,KAAKq0F,uBACDr0F,KAAK00F,eACP10F,KAAKkvB,IAAI,SAAUlvB,KAAK00F,cAG1B,IAAIvxC,GAASnjD,KAAKkoE,UAAU9gB,QAAQpnD,KAAKkoE,UAAU/kB,OAGnDnjD,MAAKqlF,gBAAgB5nD,UAAY,kHAEc0lB,EAAa,KAAI,wMAGaA,EAAuB,eAAI,gBAGxG,IAAIkyC,GAAa7nE,SAASo4D,eAAe,0BACzCyP,GAAW3pD,QAAU1rC,KAAKiuE,sBAAsB5/B,KAAKruC,MAGrDA,KAAK00F,cAAgB10F,KAAKs1F,SAASjnD,KAAKruC,MACxCA,KAAK+uB,GAAG,SAAU/uB,KAAK00F,gBASzB90F,EAAQo1F,sBAAwB,WAE9Bh1F,KAAKq0F,uBACLr0F,KAAK8tF,cAAa,GAClB9tF,KAAKipE,kBAAmB,CAExB,IAAI9lB,GAASnjD,KAAKkoE,UAAU9gB,QAAQpnD,KAAKkoE,UAAU/kB,OAE/CnjD,MAAK00F,eACP10F,KAAKkvB,IAAI,SAAUlvB,KAAK00F,eAG1B10F,KAAK8tF,eACL9tF,KAAKolF,sBAAuB,EAC5BplF,KAAKmlF,8BAA+B,EAEpCnlF,KAAKqlF,gBAAgB5nD,UAAY,kHAEgB0lB,EAAa,KAAI,wMAGaA,EAAwB,gBAAI,gBAG3G,IAAIkyC,GAAa7nE,SAASo4D,eAAe,0BACzCyP,GAAW3pD,QAAU1rC,KAAKiuE,sBAAsB5/B,KAAKruC,MAGrDA,KAAK00F,cAAgB10F,KAAKu1F,eAAelnD,KAAKruC,MAC9CA,KAAK+uB,GAAG,SAAU/uB,KAAK00F,eAGvB10F,KAAKkpE,gBAA8B,aAAIlpE,KAAKsuE,aAC5CtuE,KAAKkpE,gBAAkC,iBAAIlpE,KAAKwvE,iBAChDxvE,KAAKsuE,aAAetuE,KAAKu1F,eACzBv1F,KAAKwvE,iBAAmBxvE,KAAKw1F,eAG7Bx1F,KAAKuoE,WAQP3oE,EAAQu1F,uBAAyB,WAE/Bn1F,KAAKq0F,uBACLr0F,KAAKooE,oBAAqB,EAEtBpoE,KAAK00F,eACP10F,KAAKkvB,IAAI,SAAUlvB,KAAK00F,eAG1B10F,KAAK20F,gBAAkB30F,KAAKmzF,mBAC5BnzF,KAAK20F,gBAAgBnR,qBAErB,IAAIrgC,GAASnjD,KAAKkoE,UAAU9gB,QAAQpnD,KAAKkoE,UAAU/kB,OAEnDnjD,MAAKqlF,gBAAgB5nD,UAAY,kHAEc0lB,EAAa,KAAI,wMAGaA,EAA4B,oBAAI,gBAG7G,IAAIkyC,GAAa7nE,SAASo4D,eAAe,0BACzCyP,GAAW3pD,QAAU1rC,KAAKiuE,sBAAsB5/B,KAAKruC,MAGrDA,KAAKkpE,gBAA8B,aAASlpE,KAAKsuE,aACjDtuE,KAAKkpE,gBAAkC,iBAAKlpE,KAAKwvE,iBACjDxvE,KAAKkpE,gBAA4B,WAAWlpE,KAAKqvE,WACjDrvE,KAAKkpE,gBAAkC,iBAAKlpE,KAAKuuE,iBACjDvuE,KAAKkpE,gBAA+B,cAAQlpE,KAAKgvE,cACjDhvE,KAAKsuE,aAAmBtuE,KAAKy1F,mBAC7Bz1F,KAAKqvE,WAAmB,aACxBrvE,KAAKgvE,cAAmBhvE,KAAK01F,iBAC7B11F,KAAKuuE,iBAAmB,aACxBvuE,KAAKwvE,iBAAmBxvE,KAAK21F,oBAG7B31F,KAAKuoE,WAaP3oE,EAAQ61F,mBAAqB,SAASz9C,GACpCh4C,KAAK20F,gBAAgB9U,aAAar1D,KAAK2/B,WACvCnqD,KAAK20F,gBAAgB9U,aAAap9C,GAAG0nB,WACrCnqD,KAAK40F,oBAAsB50F,KAAK20F,gBAAgBjR,wBAAwB1jF,KAAKivE,qBAAqBj3B,EAAQjqB,GAAG/tB,KAAKmvE,qBAAqBn3B,EAAQ/3B,IAC9G,OAA7BjgB,KAAK40F,sBACP50F,KAAK40F,oBAAoBxqC,SACzBpqD,KAAKipE,kBAAmB,GAE1BjpE,KAAKuoE,WASP3oE,EAAQ81F,iBAAmB,SAAStsF,GAClC,GAAI4uC,GAAUh4C,KAAKmuE,YAAY/kE,EAAM2nC,QAAQhM,OACZ,QAA7B/kC,KAAK40F,qBAA6DzuF,SAA7BnG,KAAK40F,sBAC5C50F,KAAK40F,oBAAoB7mE,EAAI/tB,KAAKivE,qBAAqBj3B,EAAQjqB,GAC/D/tB,KAAK40F,oBAAoB30E,EAAIjgB,KAAKmvE,qBAAqBn3B,EAAQ/3B,IAEjEjgB,KAAKuoE,WAGP3oE,EAAQ+1F,oBAAsB,SAAS39C,GACrC,GAAI49C,GAAU51F,KAAKwuE,WAAWx2B,EACf,OAAX49C,GACqD,GAAnD51F,KAAK20F,gBAAgB9U,aAAar1D,KAAK8hC,WACzCtsD,KAAK61F,UAAUD,EAAQv1F,GAAIL,KAAK20F,gBAAgBlyD,GAAGpiC,IACnDL,KAAK20F,gBAAgB9U,aAAar1D,KAAK2/B,YAEY,GAAjDnqD,KAAK20F,gBAAgB9U,aAAap9C,GAAG6pB,WACvCtsD,KAAK61F,UAAU71F,KAAK20F,gBAAgBnqE,KAAKnqB,GAAIu1F,EAAQv1F,IACrDL,KAAK20F,gBAAgB9U,aAAap9C,GAAG0nB,aAIvCnqD,KAAK20F,gBAAgB9Q,uBAEvB7jF,KAAKipE,kBAAmB,EACxBjpE,KAAKuoE,WASP3oE,EAAQ21F,eAAiB,SAASv9C,GAChC,GAAoC,GAAhCh4C,KAAKizF,wBAA8B,CACrC,GAAIn/C,GAAO9zC,KAAKwuE,WAAWx2B,EAEf,OAARlE,IACEA,EAAK0nC,YAAc,EACrBsa,MAAM91F,KAAKkoE,UAAU9gB,QAAQpnD,KAAKkoE,UAAU/kB,QAAyB,kBAGrEnjD,KAAK2uE,cAAc76B,GAAK,GAExB9zC,KAAKmyE,QAAiB,QAAS,MAAc,WAAI,GAAIhvE,IAAM9C,GAAG,oBAAoBL,KAAKkoE,WACvFloE,KAAKmyE,QAAiB,QAAS,MAAc,WAAEpkD,EAAI+lB,EAAK/lB,EACxD/tB,KAAKmyE,QAAiB,QAAS,MAAc,WAAElyD,EAAI6zB,EAAK7zB,EACxDjgB,KAAKmyE,QAAiB,QAAS,MAAiB,cAAI,GAAIhvE,IAAM9C,GAAG,uBAAuBL,KAAKkoE,WAC7FloE,KAAKmyE,QAAiB,QAAS,MAAiB,cAAEpkD,EAAI+lB,EAAK/lB,EAC3D/tB,KAAKmyE,QAAiB,QAAS,MAAiB,cAAElyD,EAAI6zB,EAAK7zB,EAC3DjgB,KAAKmyE,QAAiB,QAAS,MAAiB,cAAE4C,aAAe,iBAGjE/0E,KAAKukE,MAAsB,eAAI,GAAIvhE,IAAM3C,GAAG,iBAAiBmqB,KAAKspB,EAAKzzC,GAAGoiC,GAAGziC,KAAKmyE,QAAiB,QAAS,MAAc,WAAE9xE,IAAKL,KAAMA,KAAKkoE,WAC5IloE,KAAKukE,MAAsB,eAAE/5C,KAAOspB,EACpC9zC,KAAKukE,MAAsB,eAAEyM,WAAY,EACzChxE,KAAKukE,MAAsB,eAAEwxB,QAAS,EACtC/1F,KAAKukE,MAAsB,eAAEjY,UAAW,EACxCtsD,KAAKukE,MAAsB,eAAE9hC,GAAKziC,KAAKmyE,QAAiB,QAAS,MAAc,WAC/EnyE,KAAKukE,MAAsB,eAAE2N,IAAMlyE,KAAKmyE,QAAiB,QAAS,MAAiB,cAEnFnyE,KAAKkpE,gBAA+B,cAAIlpE,KAAKgvE,cAC7ChvE,KAAKgvE,cAAgB,SAAS5lE,GAC5B,GAAI4uC,GAAUh4C,KAAKmuE,YAAY/kE,EAAM2nC,QAAQhM,OAC7C/kC,MAAKmyE,QAAiB,QAAS,MAAc,WAAEpkD,EAAI/tB,KAAKivE,qBAAqBj3B,EAAQjqB,GACrF/tB,KAAKmyE,QAAiB,QAAS,MAAc,WAAElyD,EAAIjgB,KAAKmvE,qBAAqBn3B,EAAQ/3B,GACrFjgB,KAAKmyE,QAAiB,QAAS,MAAiB,cAAEpkD,EAAI,IAAO/tB,KAAKivE,qBAAqBj3B,EAAQjqB,GAAK/tB,KAAKukE,MAAsB,eAAE/5C,KAAKuD,GACtI/tB,KAAKmyE,QAAiB,QAAS,MAAiB,cAAElyD,EAAIjgB,KAAKmvE,qBAAqBn3B,EAAQ/3B,IAG1FjgB,KAAKqqE,QAAS,EACdrqE,KAAK8O,YAMblP,EAAQ41F,eAAiB,SAASx9C,GAChC,GAAoC,GAAhCh4C,KAAKizF,wBAA8B,CAGrCjzF,KAAKgvE,cAAgBhvE,KAAKkpE,gBAA+B,oBAClDlpE,MAAKkpE,gBAA+B,aAG3C,IAAI8sB,GAAgBh2F,KAAKukE,MAAsB,eAAE8a,aAG1Cr/E,MAAKukE,MAAsB,qBAC3BvkE,MAAKmyE,QAAiB,QAAS,MAAc,iBAC7CnyE,MAAKmyE,QAAiB,QAAS,MAAiB,aAEvD,IAAIr+B,GAAO9zC,KAAKwuE,WAAWx2B,EACf,OAARlE,IACEA,EAAK0nC,YAAc,EACrBsa,MAAM91F,KAAKkoE,UAAU9gB,QAAQpnD,KAAKkoE,UAAU/kB,QAAyB,kBAGrEnjD,KAAKi2F,YAAYD,EAAcliD,EAAKzzC,IACpCL,KAAKiuE,0BAGTjuE,KAAK8tF,iBAQTluF,EAAQ01F,SAAW,WACjB,GAAIt1F,KAAKszF,qBAAwC,GAAjBtzF,KAAK4sE,SAAkB,CACrD,GAAI4lB,GAAiBxyF,KAAKuyF,yBAAyBvyF,KAAKwpE,iBACpD0sB,GAAe71F,GAAGM,EAAKgE,aAAaopB,EAAEykE,EAAeprF,KAAK6Y,EAAEuyE,EAAehrF,IAAIs6B,MAAM,MAAMszC,gBAAe,EAAKC,gBAAe,EAClI,IAAIr1E,KAAKujE,iBAAiBhiD,IAAK,CAC7B,GAAwC,GAApCvhB,KAAKujE,iBAAiBhiD,IAAIjc,OAU5B,KAAM,IAAI9B,OAAM,sEAThB,IAAImsB,GAAK3vB,IACTA,MAAKujE,iBAAiBhiD,IAAI20E,EAAa,SAASC,GAC9CxmE,EAAGg6C,UAAUpoD,IAAI40E,GACjBxmE,EAAGs+C,wBACHt+C,EAAG06C,QAAS,EACZ16C,EAAG7gB,cAWP9O,MAAK2pE,UAAUpoD,IAAI20E,GACnBl2F,KAAKiuE,wBACLjuE,KAAKqqE,QAAS,EACdrqE,KAAK8O,UAWXlP,EAAQq2F,YAAc,SAASG,EAAaC,GAC1C,GAAqB,GAAjBr2F,KAAK4sE,SAAkB,CACzB,GAAIspB,IAAe1rE,KAAK4rE,EAAc3zD,GAAG4zD,EACzC,IAAIr2F,KAAKujE,iBAAiBG,QAAS,CACjC,GAA4C,GAAxC1jE,KAAKujE,iBAAiBG,QAAQp+D,OAShC,KAAM,IAAI9B,OAAM,0EARhB,IAAImsB,GAAK3vB,IACTA,MAAKujE,iBAAiBG,QAAQwyB,EAAa,SAASC,GAClDxmE,EAAGi6C,UAAUroD,IAAI40E,GACjBxmE,EAAG06C,QAAS,EACZ16C,EAAG7gB,cAUP9O,MAAK4pE,UAAUroD,IAAI20E,GACnBl2F,KAAKqqE,QAAS,EACdrqE,KAAK8O,UAUXlP,EAAQi2F,UAAY,SAASO,EAAaC,GACxC,GAAqB,GAAjBr2F,KAAK4sE,SAAkB,CACzB,GAAIspB,IAAe71F,GAAIL,KAAK20F,gBAAgBt0F,GAAImqB,KAAK4rE,EAAc3zD,GAAG4zD,EACtE,IAAIr2F,KAAKujE,iBAAiBE,SAAU,CAClC,GAA6C,GAAzCzjE,KAAKujE,iBAAiBE,SAASn+D,OASjC,KAAM,IAAI9B,OAAM,wEARhB,IAAImsB,GAAK3vB,IACTA,MAAKujE,iBAAiBE,SAASyyB,EAAa,SAASC,GACnDxmE,EAAGi6C,UAAUt5C,OAAO6lE,GACpBxmE,EAAG06C,QAAS,EACZ16C,EAAG7gB,cAUP9O,MAAK4pE,UAAUt5C,OAAO4lE,GACtBl2F,KAAKqqE,QAAS,EACdrqE,KAAK8O,UAUXlP,EAAQs1F,UAAY,WAClB,IAAIl1F,KAAKujE,iBAAiBC,MAAyB,GAAjBxjE,KAAK4sE,SA4BrC,KAAM,IAAIppE,OAAM,iDA3BhB,IAAIswC,GAAO9zC,KAAKkzF,mBACZtnE,GAAQvrB,GAAGyzC,EAAKzzC,GAClByhC,MAAOgS,EAAKhS,MACZ9T,MAAO8lB,EAAKhmC,QAAQkgB,MACpBg2C,MAAOlwB,EAAKhmC,QAAQk2D,MACpBv5D,OACEiB,WAAWooC,EAAKhmC,QAAQrD,MAAMiB,WAC9BC,OAAOmoC,EAAKhmC,QAAQrD,MAAMkB,OAC1BC,WACEF,WAAWooC,EAAKhmC,QAAQrD,MAAMmB,UAAUF,WACxCC,OAAOmoC,EAAKhmC,QAAQrD,MAAMmB,UAAUD,SAG1C,IAAyC,GAArC3L,KAAKujE,iBAAiBC,KAAKl+D,OAU7B,KAAM,IAAI9B,OAAM,wEAThB,IAAImsB,GAAK3vB,IACTA,MAAKujE,iBAAiBC,KAAK53C,EAAM,SAAUuqE,GACzCxmE,EAAGg6C,UAAUr5C,OAAO6lE,GACpBxmE,EAAGs+C,wBACHt+C,EAAG06C,QAAS,EACZ16C,EAAG7gB,WAoBXlP,EAAQsuE,gBAAkB,WACxB,IAAKluE,KAAKszF,qBAAwC,GAAjBtzF,KAAK4sE,SACpC,GAAK5sE,KAAKuzF,sBA4BRuC,MAAM91F,KAAKkoE,UAAU9gB,QAAQpnD,KAAKkoE,UAAU/kB,QAA4B,wBA5BzC,CAC/B,GAAImzC,GAAgBt2F,KAAK8zF,mBACrByC,EAAgBv2F,KAAKg0F,kBACzB,IAAIh0F,KAAKujE,iBAAiBI,IAAK,CAC7B,GAAIh0C,GAAK3vB,KACL4rB,GAAQg4C,MAAO0yB,EAAe/xB,MAAOgyB,EACzC,MAAIv2F,KAAKujE,iBAAiBI,IAAIr+D,OAAS,GAUrC,KAAM,IAAI9B,OAAM,0EAThBxD,MAAKujE,iBAAiBI,IAAI/3C,EAAM,SAAUuqE,GACxCxmE,EAAGi6C,UAAUj4C,OAAOwkE,EAAc5xB,OAClC50C,EAAGg6C,UAAUh4C,OAAOwkE,EAAcvyB,OAClCj0C,EAAGm+D,eACHn+D,EAAG06C,QAAS,EACZ16C,EAAG7gB,cAQP9O,MAAK4pE,UAAUj4C,OAAO4kE,GACtBv2F,KAAK2pE,UAAUh4C,OAAO2kE,GACtBt2F,KAAK8tF,eACL9tF,KAAKqqE,QAAS,EACdrqE,KAAK8O,WAYT,SAASjP,EAAQD,EAASM,GAE9B,GACIswC,IADOtwC,EAAoB,GAClBA,EAAoB,IAEjCN,GAAQ4lF,iBAAmB,WAEzB,GAAIgR,GAAUhpE,SAASo4D,eAAe,6BAClC4Q,IAAWA,EAAQ9sF,YACrB8sF,EAAQ9sF,WAAW0jB,YAAYopE,GAEjChpE,SAASyY,UAAY,MAWvBrmC,EAAQ6lF,wBAA0B,WAChCzlF,KAAKwlF,mBAELxlF,KAAKy2F,iBACL,IAAIA,IAAkB,KAAK,OAAO,OAAO,QAAQ,SAAS,UAAU,eAChEC,GAAwB,UAAU,YAAY,YAAY,aAAa,UAAU,WAAW,aAEhG12F,MAAKy2F,eAAwB,QAAIjpE,SAASK,cAAc,OACxD7tB,KAAKy2F,eAAwB,QAAEp2F,GAAK,6BACpCL,KAAKg5B,MAAMtL,YAAY1tB,KAAKy2F,eAAwB,QAGpD,KAAK,GADD9mE,GAAK3vB,KACAmF,EAAI,EAAGA,EAAIsxF,EAAenxF,OAAQH,IAAK,CAC9CnF,KAAKy2F,eAAeA,EAAetxF,IAAMqoB,SAASK,cAAc,OAChE7tB,KAAKy2F,eAAeA,EAAetxF,IAAI9E,GAAK,sBAAwBo2F,EAAetxF,GACnFnF,KAAKy2F,eAAeA,EAAetxF,IAAIwC,UAAY,sBAAwB8uF,EAAetxF,GAC1FnF,KAAKy2F,eAAwB,QAAE/oE,YAAY1tB,KAAKy2F,eAAeA,EAAetxF,IAC9E,IAAIzB,GAAS8sC,EAAOxwC,KAAKy2F,eAAeA,EAAetxF,KAAMi7C,iBAAiB,GAC9E18C,GAAOqrB,GAAG,QAASY,EAAG+mE,EAAqBvxF,IAAIkpC,KAAK1e,IAEtD,GAAIjsB,GAAS8sC,EAAOhjB,UAAW4yB,iBAAiB,GAChD18C,GAAOqrB,GAAG,UAAWY,EAAGgnE,cAActoD,KAAK1e,KAQ7C/vB,EAAQ+2F,cAAgB,WACtB32F,KAAK4tE,eACL5tE,KAAKytE,eACLztE,KAAK+tE,aAYPnuE,EAAQ4tE,QAAU,SAASpkE,GACzBpJ,KAAKyoE,WAAazoE,KAAKkoE,UAAUpB,SAASC,MAAM9mD,EAChDjgB,KAAK8O,QACL1F,EAAMD,kBAQRvJ,EAAQ8tE,UAAY,SAAStkE,GAC3BpJ,KAAKyoE,YAAczoE,KAAKkoE,UAAUpB,SAASC,MAAM9mD,EACjDjgB,KAAK8O,QACL1F,EAAMD,kBAQRvJ,EAAQ+tE,UAAY,SAASvkE,GAC3BpJ,KAAKwoE,WAAaxoE,KAAKkoE,UAAUpB,SAASC,MAAMh5C,EAChD/tB,KAAK8O,QACL1F,EAAMD,kBAQRvJ,EAAQiuE,WAAa,SAASzkE,GAC5BpJ,KAAKwoE,YAAcxoE,KAAKkoE,UAAUpB,SAASC,MAAM9mD,EACjDjgB,KAAK8O,QACL1F,EAAMD,kBAQRvJ,EAAQkuE,QAAU,SAAS1kE,GACzBpJ,KAAK0oE,cAAgB1oE,KAAKkoE,UAAUpB,SAASC,MAAM/nB,KACnDh/C,KAAK8O,QACL1F,EAAMD,kBAQRvJ,EAAQouE,SAAW,SAAS5kE,GAC1BpJ,KAAK0oE,eAAiB1oE,KAAKkoE,UAAUpB,SAASC,MAAM/nB,KACpDh/C,KAAK8O,QACL1F,EAAMD,kBAQRvJ,EAAQmuE,UAAY,SAAS3kE,GAC3BpJ,KAAK0oE,cAAgB,EACrBt/D,GAASA,EAAMD,kBAQjBvJ,EAAQ6tE,aAAe,SAASrkE,GAC9BpJ,KAAKyoE,WAAa,EAClBr/D,GAASA,EAAMD,kBAQjBvJ,EAAQguE,aAAe,SAASxkE,GAC9BpJ,KAAKwoE,WAAa,EAClBp/D,GAASA,EAAMD,mBAMb,SAAStJ,EAAQD,GAErBA,EAAQ0xE,aAAe,WACrB,IAAK,GAAIpG,KAAUlrE,MAAK4jE,MACtB,GAAI5jE,KAAK4jE,MAAMn+D,eAAeylE,GAAS,CACrC,GAAIp3B,GAAO9zC,KAAK4jE,MAAMsH,EACO,IAAzBp3B,EAAK2mC,mBACP3mC,EAAKme,MAAQ,MAYrBryD,EAAQ0qE,yBAA2B,WACjC,GAAiD,GAA7CtqE,KAAKkoE,UAAUhB,mBAAmBn5D,SAAmB/N,KAAKqpE,YAAY/jE,OAAS,EAAG,CACjC,MAA/CtF,KAAKkoE,UAAUhB,mBAAmBhyB,WAAoE,MAA/Cl1C,KAAKkoE,UAAUhB,mBAAmBhyB,UAC3Fl1C,KAAKkoE,UAAUhB,mBAAmBC,iBAAmB,GAGrDnnE,KAAKkoE,UAAUhB,mBAAmBC,gBAAkBtiE,KAAK+O,IAAI5T,KAAKkoE,UAAUhB,mBAAmBC,iBAG9C,MAA/CnnE,KAAKkoE,UAAUhB,mBAAmBhyB,WAAoE,MAA/Cl1C,KAAKkoE,UAAUhB,mBAAmBhyB,UAChD,GAAvCl1C,KAAKkoE,UAAUZ,aAAav5D,UAC9B/N,KAAKkoE,UAAUZ,aAAa7gE,KAAO,YAIM,GAAvCzG,KAAKkoE,UAAUZ,aAAav5D,UAC9B/N,KAAKkoE,UAAUZ,aAAa7gE,KAAO,aAIvC,IACIqtC,GAAMo3B,EADN0rB,EAAU,EAEVC,GAAe,EACfC,GAAiB,CAErB,KAAK5rB,IAAUlrE,MAAK4jE,MACd5jE,KAAK4jE,MAAMn+D,eAAeylE,KAC5Bp3B,EAAO9zC,KAAK4jE,MAAMsH,GACA,IAAdp3B,EAAKme,MACP4kC,GAAe,EAGfC,GAAiB,EAEfF,EAAU9iD,EAAKywB,MAAMj/D,SACvBsxF,EAAU9iD,EAAKywB,MAAMj/D,QAM3B,IAAsB,GAAlBwxF,GAA0C,GAAhBD,EAC5B,KAAM,IAAIrzF,OAAM,wHAQhBxD,MAAK+2F,mBAGiB,GAAlBD,GACF92F,KAAKg3F,iBAAiBJ,EAGxB,IAAIK,GAAej3F,KAAKk3F,kBAGxBl3F,MAAKm3F,uBAAuBF,GAG5Bj3F,KAAK8O,UAYXlP,EAAQu3F,uBAAyB,SAASF,GACxC,GAAI/rB,GAAQp3B,CAGZ,KAAK,GAAIme,KAASglC,GAChB,GAAIA,EAAaxxF,eAAewsD,GAE9B,IAAKiZ,IAAU+rB,GAAahlC,GAAO2R,MAC7BqzB,EAAahlC,GAAO2R,MAAMn+D,eAAeylE,KAC3Cp3B,EAAOmjD,EAAahlC,GAAO2R,MAAMsH,GACkB,MAA/ClrE,KAAKkoE,UAAUhB,mBAAmBhyB,WAAoE,MAA/Cl1C,KAAKkoE,UAAUhB,mBAAmBhyB,UACvFpB,EAAKg7B,SACPh7B,EAAK/lB,EAAIkpE,EAAahlC,GAAOmlC,OAC7BtjD,EAAKg7B,QAAS,EAEdmoB,EAAahlC,GAAOmlC,QAAUH,EAAahlC,GAAOmV,aAIhDtzB,EAAKi7B,SACPj7B,EAAK7zB,EAAIg3E,EAAahlC,GAAOmlC,OAC7BtjD,EAAKi7B,QAAS,EAEdkoB,EAAahlC,GAAOmlC,QAAUH,EAAahlC,GAAOmV,aAGtDpnE,KAAKq3F,kBAAkBvjD,EAAKywB,MAAMzwB,EAAKzzC,GAAG42F,EAAanjD,EAAKme,OAOpEjyD,MAAKusE,cAUP3sE,EAAQs3F,iBAAmB,WACzB,GACIhsB,GAAQp3B,EAAMme,EADdglC,IAKJ,KAAK/rB,IAAUlrE,MAAK4jE,MACd5jE,KAAK4jE,MAAMn+D,eAAeylE,KAC5Bp3B,EAAO9zC,KAAK4jE,MAAMsH,GAClBp3B,EAAKg7B,QAAS,EACdh7B,EAAKi7B,QAAS,EACqC,MAA/C/uE,KAAKkoE,UAAUhB,mBAAmBhyB,WAAoE,MAA/Cl1C,KAAKkoE,UAAUhB,mBAAmBhyB,UAC3FpB,EAAK7zB,EAAIjgB,KAAKkoE,UAAUhB,mBAAmBC,gBAAgBrzB,EAAKme,MAGhEne,EAAK/lB,EAAI/tB,KAAKkoE,UAAUhB,mBAAmBC,gBAAgBrzB,EAAKme,MAEjC9rD,SAA7B8wF,EAAanjD,EAAKme,SACpBglC,EAAanjD,EAAKme,QAAUoP,OAAQ,EAAGuC,SAAWwzB,OAAO,EAAGhwB,YAAY,IAE1E6vB,EAAanjD,EAAKme,OAAOoP,QAAU,EACnC41B,EAAanjD,EAAKme,OAAO2R,MAAMsH,GAAUp3B,EAK7C,IAAIwjD,GAAW,CACf,KAAKrlC,IAASglC,GACRA,EAAaxxF,eAAewsD,IAC1BqlC,EAAWL,EAAahlC,GAAOoP,SACjCi2B,EAAWL,EAAahlC,GAAOoP,OAMrC,KAAKpP,IAASglC,GACRA,EAAaxxF,eAAewsD,KAC9BglC,EAAahlC,GAAOmV,aAAekwB,EAAW,GAAKt3F,KAAKkoE,UAAUhB,mBAAmBE,YACrF6vB,EAAahlC,GAAOmV,aAAgB6vB,EAAahlC,GAAOoP,OAAS,EACjE41B,EAAahlC,GAAOmlC,OAASH,EAAahlC,GAAOmV,YAAe,IAAO6vB,EAAahlC,GAAOoP,OAAS,GAAK41B,EAAahlC,GAAOmV,YAIjI,OAAO6vB,IAUTr3F,EAAQo3F,iBAAmB,SAASJ,GAClC,GAAI1rB,GAAQp3B,CAGZ,KAAKo3B,IAAUlrE,MAAK4jE,MACd5jE,KAAK4jE,MAAMn+D,eAAeylE,KAC5Bp3B,EAAO9zC,KAAK4jE,MAAMsH,GACdp3B,EAAKywB,MAAMj/D,QAAUsxF,IACvB9iD,EAAKme,MAAQ,GAMnB,KAAKiZ,IAAUlrE,MAAK4jE,MACd5jE,KAAK4jE,MAAMn+D,eAAeylE,KAC5Bp3B,EAAO9zC,KAAK4jE,MAAMsH,GACA,GAAdp3B,EAAKme,OACPjyD,KAAKu3F,UAAU,EAAEzjD,EAAKywB,MAAMzwB,EAAKzzC,MAgBzCT,EAAQm3F,iBAAmB,WACzB/2F,KAAKkoE,UAAUtC,WAAW73D,SAAU,EACpC/N,KAAKkoE,UAAUjD,QAAQC,UAAUn3D,SAAU,EAC3C/N,KAAKkoE,UAAUjD,QAAQU,sBAAsB53D,SAAU,EACvD/N,KAAK8kF,2BACsC,GAAvC9kF,KAAKkoE,UAAUZ,aAAav5D,UAC9B/N,KAAKkoE,UAAUZ,aAAaC,SAAU,GAExCvnE,KAAKktE,0BAcPttE,EAAQy3F,kBAAoB,SAAS9yB,EAAOizB,EAAUP,EAAcQ,GAClE,IAAK,GAAItyF,GAAI,EAAGA,EAAIo/D,EAAMj/D,OAAQH,IAAK,CACrC,GAAIyoF,GAAY,IAEdA,GADErpB,EAAMp/D,GAAGm6E,MAAQkY,EACPjzB,EAAMp/D,GAAGqlB,KAGT+5C,EAAMp/D,GAAGs9B,EAIvB,IAAIi1D,IAAY,CACmC,OAA/C13F,KAAKkoE,UAAUhB,mBAAmBhyB,WAAoE,MAA/Cl1C,KAAKkoE,UAAUhB,mBAAmBhyB,UACvF04C,EAAU9e,QAAU8e,EAAU37B,MAAQwlC,IACxC7J,EAAU9e,QAAS,EACnB8e,EAAU7/D,EAAIkpE,EAAarJ,EAAU37B,OAAOmlC,OAC5CM,GAAY,GAIV9J,EAAU7e,QAAU6e,EAAU37B,MAAQwlC,IACxC7J,EAAU7e,QAAS,EACnB6e,EAAU3tE,EAAIg3E,EAAarJ,EAAU37B,OAAOmlC,OAC5CM,GAAY,GAIC,GAAbA,IACFT,EAAarJ,EAAU37B,OAAOmlC,QAAUH,EAAarJ,EAAU37B,OAAOmV,YAClEwmB,EAAUrpB,MAAMj/D,OAAS,GAC3BtF,KAAKq3F,kBAAkBzJ,EAAUrpB,MAAMqpB,EAAUvtF,GAAG42F,EAAarJ,EAAU37B,UAenFryD,EAAQ23F,UAAY,SAAStlC,EAAOsS,EAAOizB,GACzC,IAAK,GAAIryF,GAAI,EAAGA,EAAIo/D,EAAMj/D,OAAQH,IAAK,CACrC,GAAIyoF,GAAY,IAEdA,GADErpB,EAAMp/D,GAAGm6E,MAAQkY,EACPjzB,EAAMp/D,GAAGqlB,KAGT+5C,EAAMp/D,GAAGs9B,IAEA,IAAnBmrD,EAAU37B,OAAe27B,EAAU37B,MAAQA,KAC7C27B,EAAU37B,MAAQA,EACdsS,EAAMj/D,OAAS,GACjBtF,KAAKu3F,UAAUtlC,EAAM,EAAG27B,EAAUrpB,MAAOqpB,EAAUvtF,OAY3DT,EAAQgnF,cAAgB,WACtB,IAAK,GAAI1b,KAAUlrE,MAAK4jE,MAClB5jE,KAAK4jE,MAAMn+D,eAAeylE,KAC5BlrE,KAAK4jE,MAAMsH,GAAQ4D,QAAS,EAC5B9uE,KAAK4jE,MAAMsH,GAAQ6D,QAAS,KAQ9B,SAASlvE,EAAQD,GAGrBA,EAAY,IACV4jE,KAAM,OACNG,IAAK,kBACLg0B,KAAM,OACN1hB,QAAS,WACTG,QAAS,WACTwhB,SAAU,YACVn0B,SAAU,YACVo0B,eAAgB,+CAChBC,gBAAiB,qEACjBC,oBAAqB,wEACrBC,gBAAiB,kCACjBC,mBAAoB,+BAEtBr4F,EAAe,MAAIA,EAAY,GAC/BA,EAAe,MAAIA,EAAY,GAG/BA,EAAY,IACV4jE,KAAM,WACNG,IAAK,uBACLg0B,KAAM,QACN1hB,QAAS,iBACTG,QAAS,iBACTwhB,SAAU,gBACVn0B,SAAU,gBACVo0B,eAAgB,uDAChBC,gBAAiB,6EACjBC,oBAAqB,kFACrBC,gBAAiB,wCACjBC,mBAAoB,2CAEtBr4F,EAAe,MAAIA,EAAY,GAC/BA,EAAe,MAAIA,EAAY,IAK3B,WAKoC,mBAA7Bs4F,4BAKTA,yBAAyB1jF,UAAU8pE,OAAS,SAASvwD,EAAG9N,EAAG3T,GACzDtM,KAAKkhC,YACLlhC,KAAKwkC,IAAIzW,EAAG9N,EAAG3T,EAAG,EAAG,EAAEzH,KAAK4/B,IAAI,IASlCyzD,yBAAyB1jF,UAAU2jF,OAAS,SAASpqE,EAAG9N,EAAG3T,GACzDtM,KAAKkhC,YACLlhC,KAAKyuB,KAAKV,EAAIzhB,EAAG2T,EAAI3T,EAAO,EAAJA,EAAW,EAAJA,IASjC4rF,yBAAyB1jF,UAAUszB,SAAW,SAAS/Z,EAAG9N,EAAG3T,GAE3DtM,KAAKkhC,WAEL,IAAI/1B,GAAQ,EAAJmB,EACJ8rF,EAAKjtF,EAAI,EACTktF,EAAKxzF,KAAK2jC,KAAK,GAAK,EAAIr9B,EACxBD,EAAIrG,KAAK2jC,KAAKr9B,EAAIA,EAAIitF,EAAKA,EAE/Bp4F,MAAKmhC,OAAOpT,EAAG9N,GAAK/U,EAAImtF,IACxBr4F,KAAKohC,OAAOrT,EAAIqqE,EAAIn4E,EAAIo4E,GACxBr4F,KAAKohC,OAAOrT,EAAIqqE,EAAIn4E,EAAIo4E,GACxBr4F,KAAKohC,OAAOrT,EAAG9N,GAAK/U,EAAImtF,IACxBr4F,KAAKuhC,aASP22D,yBAAyB1jF,UAAU8jF,aAAe,SAASvqE,EAAG9N,EAAG3T,GAE/DtM,KAAKkhC,WAEL,IAAI/1B,GAAQ,EAAJmB,EACJ8rF,EAAKjtF,EAAI,EACTktF,EAAKxzF,KAAK2jC,KAAK,GAAK,EAAIr9B,EACxBD,EAAIrG,KAAK2jC,KAAKr9B,EAAIA,EAAIitF,EAAKA,EAE/Bp4F,MAAKmhC,OAAOpT,EAAG9N,GAAK/U,EAAImtF,IACxBr4F,KAAKohC,OAAOrT,EAAIqqE,EAAIn4E,EAAIo4E,GACxBr4F,KAAKohC,OAAOrT,EAAIqqE,EAAIn4E,EAAIo4E,GACxBr4F,KAAKohC,OAAOrT,EAAG9N,GAAK/U,EAAImtF,IACxBr4F,KAAKuhC,aASP22D,yBAAyB1jF,UAAU+jF,KAAO,SAASxqE,EAAG9N,EAAG3T,GAEvDtM,KAAKkhC,WAEL,KAAK,GAAIs3D,GAAI,EAAO,GAAJA,EAAQA,IAAK,CAC3B,GAAIj0D,GAAUi0D,EAAI,IAAM,EAAS,IAAJlsF,EAAc,GAAJA,CACvCtM,MAAKohC,OACDrT,EAAIwW,EAAS1/B,KAAKkzB,IAAQ,EAAJygE,EAAQ3zF,KAAK4/B,GAAK,IACxCxkB,EAAIskB,EAAS1/B,KAAKqzB,IAAQ,EAAJsgE,EAAQ3zF,KAAK4/B,GAAK,KAI9CzkC,KAAKuhC,aAMP22D,yBAAyB1jF,UAAU2pE,UAAY,SAASpwD,EAAG9N,EAAGzD,EAAGtR,EAAGoB,GAClE,GAAImsF,GAAM5zF,KAAK4/B,GAAG,GACE,GAAhBjoB,EAAM,EAAIlQ,IAAYA,EAAMkQ,EAAI,GAChB,EAAhBtR,EAAM,EAAIoB,IAAYA,EAAMpB,EAAI,GACpClL,KAAKkhC,YACLlhC,KAAKmhC,OAAOpT,EAAEzhB,EAAE2T,GAChBjgB,KAAKohC,OAAOrT,EAAEvR,EAAElQ,EAAE2T,GAClBjgB,KAAKwkC,IAAIzW,EAAEvR,EAAElQ,EAAE2T,EAAE3T,EAAEA,EAAM,IAAJmsF,EAAY,IAAJA,GAAQ,GACrCz4F,KAAKohC,OAAOrT,EAAEvR,EAAEyD,EAAE/U,EAAEoB,GACpBtM,KAAKwkC,IAAIzW,EAAEvR,EAAElQ,EAAE2T,EAAE/U,EAAEoB,EAAEA,EAAE,EAAM,GAAJmsF,GAAO,GAChCz4F,KAAKohC,OAAOrT,EAAEzhB,EAAE2T,EAAE/U,GAClBlL,KAAKwkC,IAAIzW,EAAEzhB,EAAE2T,EAAE/U,EAAEoB,EAAEA,EAAM,GAAJmsF,EAAW,IAAJA,GAAQ,GACpCz4F,KAAKohC,OAAOrT,EAAE9N,EAAE3T,GAChBtM,KAAKwkC,IAAIzW,EAAEzhB,EAAE2T,EAAE3T,EAAEA,EAAM,IAAJmsF,EAAY,IAAJA,GAAQ,IAMrCP,yBAAyB1jF,UAAUgqE,QAAU,SAASzwD,EAAG9N,EAAGzD,EAAGtR,GAC7D,GAAIwtF,GAAQ,SACRC,EAAMn8E,EAAI,EAAKk8E,EACfE,EAAM1tF,EAAI,EAAKwtF,EACfG,EAAK9qE,EAAIvR,EACTs8E,EAAK74E,EAAI/U,EACT6tF,EAAKhrE,EAAIvR,EAAI,EACbw8E,EAAK/4E,EAAI/U,EAAI,CAEjBlL,MAAKkhC,YACLlhC,KAAKmhC,OAAOpT,EAAGirE,GACfh5F,KAAKi5F,cAAclrE,EAAGirE,EAAKJ,EAAIG,EAAKJ,EAAI14E,EAAG84E,EAAI94E,GAC/CjgB,KAAKi5F,cAAcF,EAAKJ,EAAI14E,EAAG44E,EAAIG,EAAKJ,EAAIC,EAAIG,GAChDh5F,KAAKi5F,cAAcJ,EAAIG,EAAKJ,EAAIG,EAAKJ,EAAIG,EAAIC,EAAID,GACjD94F,KAAKi5F,cAAcF,EAAKJ,EAAIG,EAAI/qE,EAAGirE,EAAKJ,EAAI7qE,EAAGirE,IAQjDd,yBAAyB1jF,UAAU4pE,SAAW,SAASrwD,EAAG9N,EAAGzD,EAAGtR,GAC9D,GAAImB,GAAI,EAAE,EACN6sF,EAAW18E,EACX28E,EAAWjuF,EAAImB,EAEfqsF,EAAQ,SACRC,EAAMO,EAAW,EAAKR,EACtBE,EAAMO,EAAW,EAAKT,EACtBG,EAAK9qE,EAAImrE,EACTJ,EAAK74E,EAAIk5E,EACTJ,EAAKhrE,EAAImrE,EAAW,EACpBF,EAAK/4E,EAAIk5E,EAAW,EACpBC,EAAMn5E,GAAK/U,EAAIiuF,EAAS,GACxBE,EAAMp5E,EAAI/U,CAEdlL,MAAKkhC,YACLlhC,KAAKmhC,OAAO03D,EAAIG,GAEhBh5F,KAAKi5F,cAAcJ,EAAIG,EAAKJ,EAAIG,EAAKJ,EAAIG,EAAIC,EAAID,GACjD94F,KAAKi5F,cAAcF,EAAKJ,EAAIG,EAAI/qE,EAAGirE,EAAKJ,EAAI7qE,EAAGirE,GAE/Ch5F,KAAKi5F,cAAclrE,EAAGirE,EAAKJ,EAAIG,EAAKJ,EAAI14E,EAAG84E,EAAI94E,GAC/CjgB,KAAKi5F,cAAcF,EAAKJ,EAAI14E,EAAG44E,EAAIG,EAAKJ,EAAIC,EAAIG,GAEhDh5F,KAAKohC,OAAOy3D,EAAIO,GAEhBp5F,KAAKi5F,cAAcJ,EAAIO,EAAMR,EAAIG,EAAKJ,EAAIU,EAAKN,EAAIM,GACnDr5F,KAAKi5F,cAAcF,EAAKJ,EAAIU,EAAKtrE,EAAGqrE,EAAMR,EAAI7qE,EAAGqrE,GAEjDp5F,KAAKohC,OAAOrT,EAAGirE,IAOjBd,yBAAyB1jF,UAAUytE,MAAQ,SAASl0D,EAAG9N,EAAG05B,EAAOr0C,GAE/D,GAAIg0F,GAAKvrE,EAAIzoB,EAAST,KAAKqzB,IAAIyhB,GAC3B4/C,EAAKt5E,EAAI3a,EAAST,KAAKkzB,IAAI4hB,GAI3B6/C,EAAKzrE,EAAa,GAATzoB,EAAeT,KAAKqzB,IAAIyhB,GACjC8/C,EAAKx5E,EAAa,GAAT3a,EAAeT,KAAKkzB,IAAI4hB,GAGjC+/C,EAAKJ,EAAKh0F,EAAS,EAAIT,KAAKqzB,IAAIyhB,EAAQ,GAAM90C,KAAK4/B,IACnDk1D,EAAKJ,EAAKj0F,EAAS,EAAIT,KAAKkzB,IAAI4hB,EAAQ,GAAM90C,KAAK4/B,IAGnDm1D,EAAKN,EAAKh0F,EAAS,EAAIT,KAAKqzB,IAAIyhB,EAAQ,GAAM90C,KAAK4/B,IACnDo1D,EAAKN,EAAKj0F,EAAS,EAAIT,KAAKkzB,IAAI4hB,EAAQ,GAAM90C,KAAK4/B,GAEvDzkC,MAAKkhC,YACLlhC,KAAKmhC,OAAOpT,EAAG9N,GACfjgB,KAAKohC,OAAOs4D,EAAIC,GAChB35F,KAAKohC,OAAOo4D,EAAIC,GAChBz5F,KAAKohC,OAAOw4D,EAAIC,GAChB75F,KAAKuhC,aASP22D,yBAAyB1jF,UAAUutE,WAAa,SAASh0D,EAAE9N,EAAEwiE,EAAGC,EAAGoX,GAC5DA,IAAWA,GAAW,GAAG,IACd,GAAZC,IAAeA,EAAa,KAChC,IAAIC,GAAYF,EAAUx0F,MAC1BtF,MAAKmhC,OAAOpT,EAAG9N,EAKf,KAJA,GAAIsY,GAAMkqD,EAAG10D,EAAI9M,EAAMyhE,EAAGziE,EACtBg6E,EAAQh5E,EAAGsX,EACX2hE,EAAgBr1F,KAAK2jC,KAAMjQ,EAAGA,EAAKtX,EAAGA,GACtCk5E,EAAU,EAAGpnB,GAAK,EACfmnB,GAAe,IAAI,CACxB,GAAIH,GAAaD,EAAUK,IAAYH,EACnCD,GAAaG,IAAeH,EAAaG,EAC7C,IAAIxkE,GAAQ7wB,KAAK2jC,KAAMuxD,EAAWA,GAAc,EAAIE,EAAMA,GACnD,GAAH1hE,IAAM7C,GAASA,GACnB3H,GAAK2H,EACLzV,GAAKg6E,EAAMvkE,EACX11B,KAAK+yE,EAAO,SAAW,UAAUhlD,EAAE9N,GACnCi6E,GAAiBH,EACjBhnB,GAAQA"} \ No newline at end of file diff --git a/dist/vis.min.js b/dist/vis.min.js index 537200c0..02bd6e6c 100644 --- a/dist/vis.min.js +++ b/dist/vis.min.js @@ -22,15 +22,15 @@ * License for the specific language governing permissions and limitations under * the License. */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):"object"==typeof exports?exports.vis=e():t.vis=e()}(this,function(){return function(t){function e(s){if(i[s])return i[s].exports;var o=i[s]={exports:{},id:s,loaded:!1};return t[s].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){e.util=i(1),e.DOMutil=i(6),e.DataSet=i(7),e.DataView=i(8),e.Graph3d=i(9),e.graph3d={Camera:i(13),Filter:i(14),Point2d:i(12),Point3d:i(11),Slider:i(15),StepNumber:i(16)},e.Timeline=i(17),e.Graph2d=i(38),e.timeline={DataStep:i(41),Range:i(20),stack:i(31),TimeStep:i(25),components:{items:{Item:i(33),ItemBox:i(34),ItemPoint:i(35),ItemRange:i(32)},Component:i(22),CurrentTime:i(26),CustomTime:i(28),DataAxis:i(40),GraphGroup:i(42),Group:i(30),ItemSet:i(29),Legend:i(43),LineGraph:i(39),TimeAxis:i(24)}},e.Network=i(44),e.network={Edge:i(50),Groups:i(47),Images:i(48),Node:i(49),Popup:i(51),dotparser:i(45),gephiParser:i(46)},e.Graph=function(){throw new Error("Graph is renamed to Network. Please create a graph as new vis.Network(...)")},e.moment=i(2),e.hammer=i(18)},function(module,exports,__webpack_require__){var moment=__webpack_require__(2);exports.isNumber=function(t){return t instanceof Number||"number"==typeof t},exports.isString=function(t){return t instanceof String||"string"==typeof t},exports.isDate=function(t){if(t instanceof Date)return!0;if(exports.isString(t)){var e=ASPDateRegex.exec(t);if(e)return!0;if(!isNaN(Date.parse(t)))return!0}return!1},exports.isDataTable=function(t){return"undefined"!=typeof google&&google.visualization&&google.visualization.DataTable&&t instanceof google.visualization.DataTable},exports.randomUUID=function(){var t=function(){return Math.floor(65536*Math.random()).toString(16)};return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},exports.extend=function(t){for(var e=1,i=arguments.length;i>e;e++){var s=arguments[e];for(var o in s)s.hasOwnProperty(o)&&(t[o]=s[o])}return t},exports.selectiveExtend=function(t,e){if(!Array.isArray(t))throw new Error("Array with property names expected as first argument");for(var i=2;ii;i++)if(t[i]!=e[i])return!1;return!0},exports.convert=function(t,e){var i;if(void 0===t)return void 0;if(null===t)return null;if(!e)return t;if("string"!=typeof e&&!(e instanceof String))throw new Error("Type must be a string");switch(e){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(moment.isMoment(t))return new Date(t.valueOf());if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])):moment(t).toDate();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"Moment":if(exports.isNumber(t))return moment(t);if(t instanceof Date)return moment(t.valueOf());if(moment.isMoment(t))return moment(t);if(exports.isString(t))return i=ASPDateRegex.exec(t),moment(i?Number(i[1]):t);throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"ISODate":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(moment.isMoment(t))return t.toDate().toISOString();if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])).toISOString():new Date(t).toISOString();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ISODate");case"ASPDate":if(exports.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(exports.isString(t)){i=ASPDateRegex.exec(t);var s;return s=i?new Date(Number(i[1])).valueOf():new Date(t).valueOf(),"/Date("+s+")/"}throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ASPDate");default:throw new Error('Unknown type "'+e+'"')}};var ASPDateRegex=/^\/?Date\((\-?\d+)/i;exports.getType=function(t){var e=typeof t;return"object"==e?null==t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":t instanceof Array?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":e},exports.getAbsoluteLeft=function(t){return t.getBoundingClientRect().left+window.pageXOffset},exports.getAbsoluteTop=function(t){return t.getBoundingClientRect().top+window.pageYOffset},exports.addClassName=function(t,e){var i=t.className.split(" ");-1==i.indexOf(e)&&(i.push(e),t.className=i.join(" "))},exports.removeClassName=function(t,e){var i=t.className.split(" "),s=i.indexOf(e);-1!=s&&(i.splice(s,1),t.className=i.join(" "))},exports.forEach=function(t,e){var i,s;if(t instanceof Array)for(i=0,s=t.length;s>i;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},exports.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e},exports.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},exports.addEventListener=function(t,e,i,s){t.addEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,s)):t.attachEvent("on"+e,i)},exports.removeEventListener=function(t,e,i,s){t.removeEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,s)):t.detachEvent("on"+e,i)},exports.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},exports.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},exports.option={},exports.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},exports.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},exports.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},exports.option.asSize=function(t,e){return"function"==typeof t&&(t=t()),exports.isString(t)?t:exports.isNumber(t)?t+"px":e||null},exports.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},exports.GiveDec=function(Hex){var Value;return Value="A"==Hex?10:"B"==Hex?11:"C"==Hex?12:"D"==Hex?13:"E"==Hex?14:"F"==Hex?15:eval(Hex)},exports.GiveHex=function(t){var e;return e=10==t?"A":11==t?"B":12==t?"C":13==t?"D":14==t?"E":15==t?"F":""+t},exports.parseColor=function(t){var e;if(exports.isString(t)){if(exports.isValidRGB(t)){var i=t.substr(4).substr(0,t.length-5).split(",");t=exports.RGBToHex(i[0],i[1],i[2])}if(exports.isValidHex(t)){var s=exports.hexToHSV(t),o={h:s.h,s:.45*s.s,v:Math.min(1,1.05*s.v)},n={h:s.h,s:Math.min(1,1.25*s.v),v:.6*s.v},r=exports.HSVToHex(n.h,n.h,n.v),a=exports.HSVToHex(o.h,o.s,o.v);e={background:t,border:r,highlight:{background:a,border:r},hover:{background:a,border:r}}}else e={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else e={},e.background=t.background||"white",e.border=t.border||e.background,exports.isString(t.highlight)?e.highlight={border:t.highlight,background:t.highlight}:(e.highlight={},e.highlight.background=t.highlight&&t.highlight.background||e.background,e.highlight.border=t.highlight&&t.highlight.border||e.border),exports.isString(t.hover)?e.hover={border:t.hover,background:t.hover}:(e.hover={},e.hover.background=t.hover&&t.hover.background||e.background,e.hover.border=t.hover&&t.hover.border||e.border);return e},exports.hexToRGB=function(t){t=t.replace("#","").toUpperCase();var e=exports.GiveDec(t.substring(0,1)),i=exports.GiveDec(t.substring(1,2)),s=exports.GiveDec(t.substring(2,3)),o=exports.GiveDec(t.substring(3,4)),n=exports.GiveDec(t.substring(4,5)),r=exports.GiveDec(t.substring(5,6)),a=16*e+i,h=16*s+o,i=16*n+r;return{r:a,g:h,b:i}},exports.RGBToHex=function(t,e,i){var s=exports.GiveHex(Math.floor(t/16)),o=exports.GiveHex(t%16),n=exports.GiveHex(Math.floor(e/16)),r=exports.GiveHex(e%16),a=exports.GiveHex(Math.floor(i/16)),h=exports.GiveHex(i%16),d=s+o+n+r+a+h;return"#"+d},exports.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var s=Math.min(t,Math.min(e,i)),o=Math.max(t,Math.max(e,i));if(s==o)return{h:0,s:0,v:s};var n=t==s?e-i:i==s?t-e:i-t,r=t==s?3:i==s?1:5,a=60*(r-n/(o-s))/360,h=(o-s)/o,d=o;return{h:a,s:h,v:d}},exports.HSVToRGB=function(t,e,i){var s,o,n,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:s=i,o=l,n=h;break;case 1:s=d,o=i,n=h;break;case 2:s=h,o=i,n=l;break;case 3:s=h,o=d,n=i;break;case 4:s=l,o=h,n=i;break;case 5:s=i,o=h,n=d}return{r:Math.floor(255*s),g:Math.floor(255*o),b:Math.floor(255*n)}},exports.HSVToHex=function(t,e,i){var s=exports.HSVToRGB(t,e,i);return exports.RGBToHex(s.r,s.g,s.b)},exports.hexToHSV=function(t){var e=exports.hexToRGB(t);return exports.RGBToHSV(e.r,e.g,e.b)},exports.isValidHex=function(t){var e=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t);return e},exports.isValidRGB=function(t){t=t.replace(" ","");var e=/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t);return e},exports.selectiveBridgeObject=function(t,e){if("object"==typeof e){for(var i=Object.create(e),s=0;sa;)o=void 0===s?n[u][i]:n[u][i][s],n[u].isVisible(e)?h=!0:(o=r&&console.log("BinarySearch too many iterations. Aborting.")}return u},exports.binarySearchGeneric=function(t,e,i,s){var o,n,r,a,h=1e4,d=0,l=t,c=!1,p=0,u=l.length,f=p,g=u,m=Math.floor(.5*(u+p));if(0==u)m=-1;else if(1==u)r=l[m][i],m=r==e?0:-1;else{for(u-=1;0==c&&h>d;)n=l[Math.max(0,m-1)][i],r=l[m][i],a=l[Math.min(l.length-1,m+1)][i],r==e||e>n&&r>e||e>r&&a>e?(c=!0,r!=e&&("before"==s?e>n&&r>e&&(m=Math.max(0,m-1)):e>r&&a>e&&(m=Math.min(l.length-1,m+1)))):(e>r?f=Math.floor(.5*(u+p)):g=Math.floor(.5*(u+p)),o=Math.floor(.5*(u+p)),p==f&&u==g?(m=-1,c=!0):(u=g,p=f,m=Math.floor(.5*(u+p)))),d++;d>=h&&console.log("BinarySearch too many iterations. Aborting.")}return m}},function(t,e,i){t.exports="undefined"!=typeof window&&window.moment||i(3)},function(t,e,i){var s;(function(t,o){(function(n){function r(t,e,i){switch(arguments.length){case 2:return null!=t?t:e;case 3:return null!=t?t:null!=e?e:i;default:throw new Error("Implement me")}}function a(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function h(t,e){function i(){ve.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}var s=!0;return f(function(){return s&&(i(),s=!1),e.apply(this,arguments)},e)}function d(t,e){return function(i){return v(t.call(this,i),e)}}function l(t,e){return function(i){return this.lang().ordinal(t.call(this,i),e)}}function c(){}function p(t){L(t),f(this,t)}function u(t){var e=S(t),i=e.year||0,s=e.quarter||0,o=e.month||0,n=e.week||0,r=e.day||0,a=e.hour||0,h=e.minute||0,d=e.second||0,l=e.millisecond||0;this._milliseconds=+l+1e3*d+6e4*h+36e5*a,this._days=+r+7*n,this._months=+o+3*s+12*i,this._data={},this._bubble()}function f(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return e.hasOwnProperty("toString")&&(t.toString=e.toString),e.hasOwnProperty("valueOf")&&(t.valueOf=e.valueOf),t}function g(t){var e,i={};for(e in t)t.hasOwnProperty(e)&&ke.hasOwnProperty(e)&&(i[e]=t[e]);return i}function m(t){return 0>t?Math.ceil(t):Math.floor(t)}function v(t,e,i){for(var s=""+Math.abs(t),o=t>=0;s.lengths;s++)(i&&t[s]!==e[s]||!i&&C(t[s])!==C(e[s]))&&r++;return r+n}function w(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=ri[t]||ai[e]||e}return t}function S(t){var e,i,s={};for(i in t)t.hasOwnProperty(i)&&(e=w(i),e&&(s[e]=t[i]));return s}function M(t){var e,i;if(0===t.indexOf("week"))e=7,i="day";else{if(0!==t.indexOf("month"))return;e=12,i="month"}ve[t]=function(s,o){var r,a,h=ve.fn._lang[t],d=[];if("number"==typeof s&&(o=s,s=n),a=function(t){var e=ve().utc().set(i,t);return h.call(ve.fn._lang,e,s||"")},null!=o)return a(o);for(r=0;e>r;r++)d.push(a(r));return d}}function C(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function E(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function D(t,e,i){return re(ve([t,11,31+e-i]),e,i).week}function T(t){return O(t)?366:365}function O(t){return t%4===0&&t%100!==0||t%400===0}function L(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[Me]<0||t._a[Me]>11?Me:t._a[Ce]<1||t._a[Ce]>E(t._a[Se],t._a[Me])?Ce:t._a[Ee]<0||t._a[Ee]>23?Ee:t._a[De]<0||t._a[De]>59?De:t._a[Te]<0||t._a[Te]>59?Te:t._a[Oe]<0||t._a[Oe]>999?Oe:-1,t._pf._overflowDayOfYear&&(Se>e||e>Ce)&&(e=Ce),t._pf.overflow=e)}function k(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length)),t._isValid}function N(t){return t?t.toLowerCase().replace("_","-"):t}function I(t,e){return e._isUTC?ve(t).zone(e._offset||0):ve(t).local()}function A(t,e){return e.abbr=t,Le[t]||(Le[t]=new c),Le[t].set(e),Le[t]}function z(t){delete Le[t]}function P(t){var e,s,o,n,r=0,a=function(t){if(!Le[t]&&Ne)try{i(4)("./"+t)}catch(e){}return Le[t]};if(!t)return ve.fn._lang;if(!b(t)){if(s=a(t))return s;t=[t]}for(;r0;){if(s=a(n.slice(0,e).join("-")))return s;if(o&&o.length>=e&&x(n,o,!0)>=e-1)break;e--}r++}return ve.fn._lang}function R(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function F(t){var e,i,s=t.match(Pe);for(e=0,i=s.length;i>e;e++)s[e]=pi[s[e]]?pi[s[e]]:R(s[e]);return function(o){var n="";for(e=0;i>e;e++)n+=s[e]instanceof Function?s[e].call(o,t):s[e];return n}}function H(t,e){return t.isValid()?(e=Y(e,t.lang()),hi[e]||(hi[e]=F(e)),hi[e](t)):t.lang().invalidDate()}function Y(t,e){function i(t){return e.longDateFormat(t)||t}var s=5;for(Re.lastIndex=0;s>=0&&Re.test(t);)t=t.replace(Re,i),Re.lastIndex=0,s-=1;return t}function B(t,e){var i,s=e._strict;switch(t){case"Q":return Ze;case"DDDD":return Ke;case"YYYY":case"GGGG":case"gggg":return s?$e:Ye;case"Y":case"G":case"g":return Qe;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return s?Je:Be;case"S":if(s)return Ze;case"SS":if(s)return qe;case"SSS":if(s)return Ke;case"DDD":return He;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Ge;case"a":case"A":return P(e._l)._meridiemParse;case"X":return Ve;case"Z":case"ZZ":return je;case"T":return Ue;case"SSSS":return We;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return s?qe:Fe;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Fe;case"Do":return Xe;default:return i=new RegExp(K(q(t.replace("\\","")),"i"))}}function W(t){t=t||"";var e=t.match(je)||[],i=e[e.length-1]||[],s=(i+"").match(oi)||["-",0,0],o=+(60*s[1])+C(s[2]);return"+"===s[0]?-o:o}function G(t,e,i){var s,o=i._a;switch(t){case"Q":null!=e&&(o[Me]=3*(C(e)-1));break;case"M":case"MM":null!=e&&(o[Me]=C(e)-1);break;case"MMM":case"MMMM":s=P(i._l).monthsParse(e),null!=s?o[Me]=s:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(o[Ce]=C(e));break;case"Do":null!=e&&(o[Ce]=C(parseInt(e,10)));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=C(e));break;case"YY":o[Se]=ve.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":o[Se]=C(e);break;case"a":case"A":i._isPm=P(i._l).isPM(e);break;case"H":case"HH":case"h":case"hh":o[Ee]=C(e);break;case"m":case"mm":o[De]=C(e);break;case"s":case"ss":o[Te]=C(e);break;case"S":case"SS":case"SSS":case"SSSS":o[Oe]=C(1e3*("0."+e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=W(e);break;case"dd":case"ddd":case"dddd":s=P(i._l).weekdaysParse(e),null!=s?(i._w=i._w||{},i._w.d=s):i._pf.invalidWeekday=e;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":t=t.substr(0,1);case"gggg":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=C(e));break;case"gg":case"GG":i._w=i._w||{},i._w[t]=ve.parseTwoDigitYear(e)}}function j(t){var e,i,s,o,n,a,h,d;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(n=1,a=4,i=r(e.GG,t._a[Se],re(ve(),1,4).year),s=r(e.W,1),o=r(e.E,1)):(d=P(t._l),n=d._week.dow,a=d._week.doy,i=r(e.gg,t._a[Se],re(ve(),n,a).year),s=r(e.w,1),null!=e.d?(o=e.d,n>o&&++s):o=null!=e.e?e.e+n:n),h=ae(i,s,o,a,n),t._a[Se]=h.year,t._dayOfYear=h.dayOfYear}function U(t){var e,i,s,o,n=[];if(!t._d){for(s=X(t),t._w&&null==t._a[Ce]&&null==t._a[Me]&&j(t),t._dayOfYear&&(o=r(t._a[Se],s[Se]),t._dayOfYear>T(o)&&(t._pf._overflowDayOfYear=!0),i=ie(o,0,t._dayOfYear),t._a[Me]=i.getUTCMonth(),t._a[Ce]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=n[e]=s[e];for(;7>e;e++)t._a[e]=n[e]=null==t._a[e]?2===e?1:0:t._a[e];t._d=(t._useUTC?ie:ee).apply(null,n),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()+t._tzm)}}function V(t){var e;t._d||(e=S(t._i),t._a=[e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond],U(t))}function X(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function Z(t){if(t._f===ve.ISO_8601)return void J(t);t._a=[],t._pf.empty=!0;var e,i,s,o,n,r=P(t._l),a=""+t._i,h=a.length,d=0;for(s=Y(t._f,r).match(Pe)||[],e=0;e0&&t._pf.unusedInput.push(n),a=a.slice(a.indexOf(i)+i.length),d+=i.length),pi[o]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(o),G(o,i,t)):t._strict&&!i&&t._pf.unusedTokens.push(o);t._pf.charsLeftOver=h-d,a.length>0&&t._pf.unusedInput.push(a),t._isPm&&t._a[Ee]<12&&(t._a[Ee]+=12),t._isPm===!1&&12===t._a[Ee]&&(t._a[Ee]=0),U(t),L(t)}function q(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,s,o){return e||i||s||o})}function K(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function $(t){var e,i,s,o,n;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(o=0;on)&&(s=n,i=e));f(t,i||e)}function J(t){var e,i,s=t._i,o=ti.exec(s);if(o){for(t._pf.iso=!0,e=0,i=ii.length;i>e;e++)if(ii[e][1].exec(s)){t._f=ii[e][0]+(o[6]||" ");break}for(e=0,i=si.length;i>e;e++)if(si[e][1].exec(s)){t._f+=si[e][0];break}s.match(je)&&(t._f+="Z"),Z(t)}else t._isValid=!1}function Q(t){J(t),t._isValid===!1&&(delete t._isValid,ve.createFromInputFallback(t))}function te(t){var e=t._i,i=Ie.exec(e);e===n?t._d=new Date:i?t._d=new Date(+i[1]):"string"==typeof e?Q(t):b(e)?(t._a=e.slice(0),U(t)):_(e)?t._d=new Date(+e):"object"==typeof e?V(t):"number"==typeof e?t._d=new Date(e):ve.createFromInputFallback(t)}function ee(t,e,i,s,o,n,r){var a=new Date(t,e,i,s,o,n,r);return 1970>t&&a.setFullYear(t),a}function ie(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function se(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function oe(t,e,i,s,o){return o.relativeTime(e||1,!!i,t,s)}function ne(t,e,i){var s=we(Math.abs(t)/1e3),o=we(s/60),n=we(o/60),r=we(n/24),a=we(r/365),h=s0,h[4]=i,oe.apply({},h)}function re(t,e,i){var s,o=i-e,n=i-t.day();return n>o&&(n-=7),o-7>n&&(n+=7),s=ve(t).add("d",n),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function ae(t,e,i,s,o){var n,r,a=ie(t,0,1).getUTCDay();return a=0===a?7:a,i=null!=i?i:o,n=o-a+(a>s?7:0)-(o>a?7:0),r=7*(e-1)+(i-o)+n+1,{year:r>0?t:t-1,dayOfYear:r>0?r:T(t-1)+r}}function he(t){var e=t._i,i=t._f;return null===e||i===n&&""===e?ve.invalid({nullInput:!0}):("string"==typeof e&&(t._i=e=P().preparse(e)),ve.isMoment(e)?(t=g(e),t._d=new Date(+e._d)):i?b(i)?$(t):Z(t):te(t),new p(t))}function de(t,e){var i,s;if(1===e.length&&b(e[0])&&(e=e[0]),!e.length)return ve();for(i=e[0],s=1;s=0?"+":"-";return e+v(Math.abs(t),6)},gg:function(){return v(this.weekYear()%100,2)},gggg:function(){return v(this.weekYear(),4)},ggggg:function(){return v(this.weekYear(),5)},GG:function(){return v(this.isoWeekYear()%100,2)},GGGG:function(){return v(this.isoWeekYear(),4)},GGGGG:function(){return v(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return C(this.milliseconds()/100)},SS:function(){return v(C(this.milliseconds()/10),2)},SSS:function(){return v(this.milliseconds(),3)},SSSS:function(){return v(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+v(C(t/60),2)+":"+v(C(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+v(C(t/60),2)+v(C(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},ui=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];li.length;)be=li.pop(),pi[be+"o"]=l(pi[be],be);for(;ci.length;)be=ci.pop(),pi[be+be]=d(pi[be],2);for(pi.DDDD=d(pi.DDD,3),f(c.prototype,{set:function(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t){var e,i,s;for(this._monthsParse||(this._monthsParse=[]),e=0;12>e;e++)if(this._monthsParse[e]||(i=ve.utc([2e3,e]),s="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[e]=new RegExp(s.replace(".",""),"i")),this._monthsParse[e].test(t))return e},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,i,s;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(i=ve([2e3,1]).day(e),s="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(s.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e){var i=this._calendar[t];return"function"==typeof i?i.apply(e):i},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,i,s){var o=this._relativeTime[i];return"function"==typeof o?o(t,e,i,s):o.replace(/%d/i,t)},pastFuture:function(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",preparse:function(t){return t},postformat:function(t){return t},week:function(t){return re(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),ve=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._i=t,o._f=e,o._l=i,o._strict=s,o._isUTC=!1,o._pf=a(),he(o)},ve.suppressDeprecationWarnings=!1,ve.createFromInputFallback=h("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i)}),ve.min=function(){var t=[].slice.call(arguments,0);return de("isBefore",t)},ve.max=function(){var t=[].slice.call(arguments,0);return de("isAfter",t)},ve.utc=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._useUTC=!0,o._isUTC=!0,o._l=i,o._i=t,o._f=e,o._strict=s,o._pf=a(),he(o).utc()},ve.unix=function(t){return ve(1e3*t)},ve.duration=function(t,e){var i,s,o,n=t,r=null;return ve.isDuration(t)?n={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(n={},e?n[e]=t:n.milliseconds=t):(r=Ae.exec(t))?(i="-"===r[1]?-1:1,n={y:0,d:C(r[Ce])*i,h:C(r[Ee])*i,m:C(r[De])*i,s:C(r[Te])*i,ms:C(r[Oe])*i}):(r=ze.exec(t))&&(i="-"===r[1]?-1:1,o=function(t){var e=t&&parseFloat(t.replace(",",".")); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):"object"==typeof exports?exports.vis=e():t.vis=e()}(this,function(){return function(t){function e(s){if(i[s])return i[s].exports;var o=i[s]={exports:{},id:s,loaded:!1};return t[s].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){e.util=i(1),e.DOMutil=i(6),e.DataSet=i(7),e.DataView=i(8),e.Graph3d=i(9),e.graph3d={Camera:i(13),Filter:i(14),Point2d:i(12),Point3d:i(11),Slider:i(15),StepNumber:i(16)},e.Timeline=i(17),e.Graph2d=i(38),e.timeline={DataStep:i(39),Range:i(20),stack:i(31),TimeStep:i(25),components:{items:{Item:i(33),ItemBox:i(34),ItemPoint:i(35),ItemRange:i(32)},Component:i(22),CurrentTime:i(26),CustomTime:i(28),DataAxis:i(40),GraphGroup:i(41),Group:i(30),ItemSet:i(29),Legend:i(42),LineGraph:i(43),TimeAxis:i(24)}},e.Network=i(44),e.network={Edge:i(50),Groups:i(47),Images:i(48),Node:i(49),Popup:i(51),dotparser:i(45),gephiParser:i(46)},e.Graph=function(){throw new Error("Graph is renamed to Network. Please create a graph as new vis.Network(...)")},e.moment=i(2),e.hammer=i(18)},function(module,exports,__webpack_require__){var moment=__webpack_require__(2);exports.isNumber=function(t){return t instanceof Number||"number"==typeof t},exports.isString=function(t){return t instanceof String||"string"==typeof t},exports.isDate=function(t){if(t instanceof Date)return!0;if(exports.isString(t)){var e=ASPDateRegex.exec(t);if(e)return!0;if(!isNaN(Date.parse(t)))return!0}return!1},exports.isDataTable=function(t){return"undefined"!=typeof google&&google.visualization&&google.visualization.DataTable&&t instanceof google.visualization.DataTable},exports.randomUUID=function(){var t=function(){return Math.floor(65536*Math.random()).toString(16)};return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},exports.extend=function(t){for(var e=1,i=arguments.length;i>e;e++){var s=arguments[e];for(var o in s)s.hasOwnProperty(o)&&(t[o]=s[o])}return t},exports.selectiveExtend=function(t,e){if(!Array.isArray(t))throw new Error("Array with property names expected as first argument");for(var i=2;ii;i++)if(t[i]!=e[i])return!1;return!0},exports.convert=function(t,e){var i;if(void 0===t)return void 0;if(null===t)return null;if(!e)return t;if("string"!=typeof e&&!(e instanceof String))throw new Error("Type must be a string");switch(e){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(moment.isMoment(t))return new Date(t.valueOf());if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])):moment(t).toDate();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"Moment":if(exports.isNumber(t))return moment(t);if(t instanceof Date)return moment(t.valueOf());if(moment.isMoment(t))return moment(t);if(exports.isString(t))return i=ASPDateRegex.exec(t),moment(i?Number(i[1]):t);throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"ISODate":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(moment.isMoment(t))return t.toDate().toISOString();if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])).toISOString():new Date(t).toISOString();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ISODate");case"ASPDate":if(exports.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(exports.isString(t)){i=ASPDateRegex.exec(t);var s;return s=i?new Date(Number(i[1])).valueOf():new Date(t).valueOf(),"/Date("+s+")/"}throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ASPDate");default:throw new Error('Unknown type "'+e+'"')}};var ASPDateRegex=/^\/?Date\((\-?\d+)/i;exports.getType=function(t){var e=typeof t;return"object"==e?null==t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":t instanceof Array?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":e},exports.getAbsoluteLeft=function(t){return t.getBoundingClientRect().left+window.pageXOffset},exports.getAbsoluteTop=function(t){return t.getBoundingClientRect().top+window.pageYOffset},exports.addClassName=function(t,e){var i=t.className.split(" ");-1==i.indexOf(e)&&(i.push(e),t.className=i.join(" "))},exports.removeClassName=function(t,e){var i=t.className.split(" "),s=i.indexOf(e);-1!=s&&(i.splice(s,1),t.className=i.join(" "))},exports.forEach=function(t,e){var i,s;if(t instanceof Array)for(i=0,s=t.length;s>i;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},exports.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e},exports.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},exports.addEventListener=function(t,e,i,s){t.addEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,s)):t.attachEvent("on"+e,i)},exports.removeEventListener=function(t,e,i,s){t.removeEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,s)):t.detachEvent("on"+e,i)},exports.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},exports.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},exports.option={},exports.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},exports.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},exports.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},exports.option.asSize=function(t,e){return"function"==typeof t&&(t=t()),exports.isString(t)?t:exports.isNumber(t)?t+"px":e||null},exports.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},exports.GiveDec=function(Hex){var Value;return Value="A"==Hex?10:"B"==Hex?11:"C"==Hex?12:"D"==Hex?13:"E"==Hex?14:"F"==Hex?15:eval(Hex)},exports.GiveHex=function(t){var e;return e=10==t?"A":11==t?"B":12==t?"C":13==t?"D":14==t?"E":15==t?"F":""+t},exports.parseColor=function(t){var e;if(exports.isString(t)){if(exports.isValidRGB(t)){var i=t.substr(4).substr(0,t.length-5).split(",");t=exports.RGBToHex(i[0],i[1],i[2])}if(exports.isValidHex(t)){var s=exports.hexToHSV(t),o={h:s.h,s:.45*s.s,v:Math.min(1,1.05*s.v)},n={h:s.h,s:Math.min(1,1.25*s.v),v:.6*s.v},r=exports.HSVToHex(n.h,n.h,n.v),a=exports.HSVToHex(o.h,o.s,o.v);e={background:t,border:r,highlight:{background:a,border:r},hover:{background:a,border:r}}}else e={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else e={},e.background=t.background||"white",e.border=t.border||e.background,exports.isString(t.highlight)?e.highlight={border:t.highlight,background:t.highlight}:(e.highlight={},e.highlight.background=t.highlight&&t.highlight.background||e.background,e.highlight.border=t.highlight&&t.highlight.border||e.border),exports.isString(t.hover)?e.hover={border:t.hover,background:t.hover}:(e.hover={},e.hover.background=t.hover&&t.hover.background||e.background,e.hover.border=t.hover&&t.hover.border||e.border);return e},exports.hexToRGB=function(t){t=t.replace("#","").toUpperCase();var e=exports.GiveDec(t.substring(0,1)),i=exports.GiveDec(t.substring(1,2)),s=exports.GiveDec(t.substring(2,3)),o=exports.GiveDec(t.substring(3,4)),n=exports.GiveDec(t.substring(4,5)),r=exports.GiveDec(t.substring(5,6)),a=16*e+i,h=16*s+o,i=16*n+r;return{r:a,g:h,b:i}},exports.RGBToHex=function(t,e,i){var s=exports.GiveHex(Math.floor(t/16)),o=exports.GiveHex(t%16),n=exports.GiveHex(Math.floor(e/16)),r=exports.GiveHex(e%16),a=exports.GiveHex(Math.floor(i/16)),h=exports.GiveHex(i%16),d=s+o+n+r+a+h;return"#"+d},exports.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var s=Math.min(t,Math.min(e,i)),o=Math.max(t,Math.max(e,i));if(s==o)return{h:0,s:0,v:s};var n=t==s?e-i:i==s?t-e:i-t,r=t==s?3:i==s?1:5,a=60*(r-n/(o-s))/360,h=(o-s)/o,d=o;return{h:a,s:h,v:d}},exports.HSVToRGB=function(t,e,i){var s,o,n,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:s=i,o=l,n=h;break;case 1:s=d,o=i,n=h;break;case 2:s=h,o=i,n=l;break;case 3:s=h,o=d,n=i;break;case 4:s=l,o=h,n=i;break;case 5:s=i,o=h,n=d}return{r:Math.floor(255*s),g:Math.floor(255*o),b:Math.floor(255*n)}},exports.HSVToHex=function(t,e,i){var s=exports.HSVToRGB(t,e,i);return exports.RGBToHex(s.r,s.g,s.b)},exports.hexToHSV=function(t){var e=exports.hexToRGB(t);return exports.RGBToHSV(e.r,e.g,e.b)},exports.isValidHex=function(t){var e=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t);return e},exports.isValidRGB=function(t){t=t.replace(" ","");var e=/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t);return e},exports.selectiveBridgeObject=function(t,e){if("object"==typeof e){for(var i=Object.create(e),s=0;sa;)o=void 0===s?n[u][i]:n[u][i][s],n[u].isVisible(e)?h=!0:(o=r&&console.log("BinarySearch too many iterations. Aborting.")}return u},exports.binarySearchGeneric=function(t,e,i,s){var o,n,r,a,h=1e4,d=0,l=t,c=!1,p=0,u=l.length,f=p,g=u,m=Math.floor(.5*(u+p));if(0==u)m=-1;else if(1==u)r=l[m][i],m=r==e?0:-1;else{for(u-=1;0==c&&h>d;)n=l[Math.max(0,m-1)][i],r=l[m][i],a=l[Math.min(l.length-1,m+1)][i],r==e||e>n&&r>e||e>r&&a>e?(c=!0,r!=e&&("before"==s?e>n&&r>e&&(m=Math.max(0,m-1)):e>r&&a>e&&(m=Math.min(l.length-1,m+1)))):(e>r?f=Math.floor(.5*(u+p)):g=Math.floor(.5*(u+p)),o=Math.floor(.5*(u+p)),p==f&&u==g?(m=-1,c=!0):(u=g,p=f,m=Math.floor(.5*(u+p)))),d++;d>=h&&console.log("BinarySearch too many iterations. Aborting.")}return m}},function(t,e,i){t.exports="undefined"!=typeof window&&window.moment||i(3)},function(t,e,i){var s;(function(t,o){(function(n){function r(t,e,i){switch(arguments.length){case 2:return null!=t?t:e;case 3:return null!=t?t:null!=e?e:i;default:throw new Error("Implement me")}}function a(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function h(t,e){function i(){ve.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}var s=!0;return f(function(){return s&&(i(),s=!1),e.apply(this,arguments)},e)}function d(t,e){return function(i){return v(t.call(this,i),e)}}function l(t,e){return function(i){return this.lang().ordinal(t.call(this,i),e)}}function c(){}function p(t){L(t),f(this,t)}function u(t){var e=S(t),i=e.year||0,s=e.quarter||0,o=e.month||0,n=e.week||0,r=e.day||0,a=e.hour||0,h=e.minute||0,d=e.second||0,l=e.millisecond||0;this._milliseconds=+l+1e3*d+6e4*h+36e5*a,this._days=+r+7*n,this._months=+o+3*s+12*i,this._data={},this._bubble()}function f(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return e.hasOwnProperty("toString")&&(t.toString=e.toString),e.hasOwnProperty("valueOf")&&(t.valueOf=e.valueOf),t}function g(t){var e,i={};for(e in t)t.hasOwnProperty(e)&&ke.hasOwnProperty(e)&&(i[e]=t[e]);return i}function m(t){return 0>t?Math.ceil(t):Math.floor(t)}function v(t,e,i){for(var s=""+Math.abs(t),o=t>=0;s.lengths;s++)(i&&t[s]!==e[s]||!i&&C(t[s])!==C(e[s]))&&r++;return r+n}function w(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=ri[t]||ai[e]||e}return t}function S(t){var e,i,s={};for(i in t)t.hasOwnProperty(i)&&(e=w(i),e&&(s[e]=t[i]));return s}function M(t){var e,i;if(0===t.indexOf("week"))e=7,i="day";else{if(0!==t.indexOf("month"))return;e=12,i="month"}ve[t]=function(s,o){var r,a,h=ve.fn._lang[t],d=[];if("number"==typeof s&&(o=s,s=n),a=function(t){var e=ve().utc().set(i,t);return h.call(ve.fn._lang,e,s||"")},null!=o)return a(o);for(r=0;e>r;r++)d.push(a(r));return d}}function C(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function E(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function D(t,e,i){return re(ve([t,11,31+e-i]),e,i).week}function T(t){return O(t)?366:365}function O(t){return t%4===0&&t%100!==0||t%400===0}function L(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[Me]<0||t._a[Me]>11?Me:t._a[Ce]<1||t._a[Ce]>E(t._a[Se],t._a[Me])?Ce:t._a[Ee]<0||t._a[Ee]>23?Ee:t._a[De]<0||t._a[De]>59?De:t._a[Te]<0||t._a[Te]>59?Te:t._a[Oe]<0||t._a[Oe]>999?Oe:-1,t._pf._overflowDayOfYear&&(Se>e||e>Ce)&&(e=Ce),t._pf.overflow=e)}function k(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length)),t._isValid}function N(t){return t?t.toLowerCase().replace("_","-"):t}function I(t,e){return e._isUTC?ve(t).zone(e._offset||0):ve(t).local()}function A(t,e){return e.abbr=t,Le[t]||(Le[t]=new c),Le[t].set(e),Le[t]}function z(t){delete Le[t]}function P(t){var e,s,o,n,r=0,a=function(t){if(!Le[t]&&Ne)try{i(4)("./"+t)}catch(e){}return Le[t]};if(!t)return ve.fn._lang;if(!b(t)){if(s=a(t))return s;t=[t]}for(;r0;){if(s=a(n.slice(0,e).join("-")))return s;if(o&&o.length>=e&&x(n,o,!0)>=e-1)break;e--}r++}return ve.fn._lang}function R(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function F(t){var e,i,s=t.match(Pe);for(e=0,i=s.length;i>e;e++)s[e]=pi[s[e]]?pi[s[e]]:R(s[e]);return function(o){var n="";for(e=0;i>e;e++)n+=s[e]instanceof Function?s[e].call(o,t):s[e];return n}}function H(t,e){return t.isValid()?(e=Y(e,t.lang()),hi[e]||(hi[e]=F(e)),hi[e](t)):t.lang().invalidDate()}function Y(t,e){function i(t){return e.longDateFormat(t)||t}var s=5;for(Re.lastIndex=0;s>=0&&Re.test(t);)t=t.replace(Re,i),Re.lastIndex=0,s-=1;return t}function B(t,e){var i,s=e._strict;switch(t){case"Q":return Ze;case"DDDD":return Ke;case"YYYY":case"GGGG":case"gggg":return s?$e:Ye;case"Y":case"G":case"g":return Qe;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return s?Je:Be;case"S":if(s)return Ze;case"SS":if(s)return qe;case"SSS":if(s)return Ke;case"DDD":return He;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Ge;case"a":case"A":return P(e._l)._meridiemParse;case"X":return Ve;case"Z":case"ZZ":return je;case"T":return Ue;case"SSSS":return We;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return s?qe:Fe;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Fe;case"Do":return Xe;default:return i=new RegExp(K(q(t.replace("\\","")),"i"))}}function W(t){t=t||"";var e=t.match(je)||[],i=e[e.length-1]||[],s=(i+"").match(oi)||["-",0,0],o=+(60*s[1])+C(s[2]);return"+"===s[0]?-o:o}function G(t,e,i){var s,o=i._a;switch(t){case"Q":null!=e&&(o[Me]=3*(C(e)-1));break;case"M":case"MM":null!=e&&(o[Me]=C(e)-1);break;case"MMM":case"MMMM":s=P(i._l).monthsParse(e),null!=s?o[Me]=s:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(o[Ce]=C(e));break;case"Do":null!=e&&(o[Ce]=C(parseInt(e,10)));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=C(e));break;case"YY":o[Se]=ve.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":o[Se]=C(e);break;case"a":case"A":i._isPm=P(i._l).isPM(e);break;case"H":case"HH":case"h":case"hh":o[Ee]=C(e);break;case"m":case"mm":o[De]=C(e);break;case"s":case"ss":o[Te]=C(e);break;case"S":case"SS":case"SSS":case"SSSS":o[Oe]=C(1e3*("0."+e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=W(e);break;case"dd":case"ddd":case"dddd":s=P(i._l).weekdaysParse(e),null!=s?(i._w=i._w||{},i._w.d=s):i._pf.invalidWeekday=e;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":t=t.substr(0,1);case"gggg":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=C(e));break;case"gg":case"GG":i._w=i._w||{},i._w[t]=ve.parseTwoDigitYear(e)}}function j(t){var e,i,s,o,n,a,h,d;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(n=1,a=4,i=r(e.GG,t._a[Se],re(ve(),1,4).year),s=r(e.W,1),o=r(e.E,1)):(d=P(t._l),n=d._week.dow,a=d._week.doy,i=r(e.gg,t._a[Se],re(ve(),n,a).year),s=r(e.w,1),null!=e.d?(o=e.d,n>o&&++s):o=null!=e.e?e.e+n:n),h=ae(i,s,o,a,n),t._a[Se]=h.year,t._dayOfYear=h.dayOfYear}function U(t){var e,i,s,o,n=[];if(!t._d){for(s=X(t),t._w&&null==t._a[Ce]&&null==t._a[Me]&&j(t),t._dayOfYear&&(o=r(t._a[Se],s[Se]),t._dayOfYear>T(o)&&(t._pf._overflowDayOfYear=!0),i=ie(o,0,t._dayOfYear),t._a[Me]=i.getUTCMonth(),t._a[Ce]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=n[e]=s[e];for(;7>e;e++)t._a[e]=n[e]=null==t._a[e]?2===e?1:0:t._a[e];t._d=(t._useUTC?ie:ee).apply(null,n),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()+t._tzm)}}function V(t){var e;t._d||(e=S(t._i),t._a=[e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond],U(t))}function X(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function Z(t){if(t._f===ve.ISO_8601)return void J(t);t._a=[],t._pf.empty=!0;var e,i,s,o,n,r=P(t._l),a=""+t._i,h=a.length,d=0;for(s=Y(t._f,r).match(Pe)||[],e=0;e0&&t._pf.unusedInput.push(n),a=a.slice(a.indexOf(i)+i.length),d+=i.length),pi[o]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(o),G(o,i,t)):t._strict&&!i&&t._pf.unusedTokens.push(o);t._pf.charsLeftOver=h-d,a.length>0&&t._pf.unusedInput.push(a),t._isPm&&t._a[Ee]<12&&(t._a[Ee]+=12),t._isPm===!1&&12===t._a[Ee]&&(t._a[Ee]=0),U(t),L(t)}function q(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,s,o){return e||i||s||o})}function K(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function $(t){var e,i,s,o,n;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(o=0;on)&&(s=n,i=e));f(t,i||e)}function J(t){var e,i,s=t._i,o=ti.exec(s);if(o){for(t._pf.iso=!0,e=0,i=ii.length;i>e;e++)if(ii[e][1].exec(s)){t._f=ii[e][0]+(o[6]||" ");break}for(e=0,i=si.length;i>e;e++)if(si[e][1].exec(s)){t._f+=si[e][0];break}s.match(je)&&(t._f+="Z"),Z(t)}else t._isValid=!1}function Q(t){J(t),t._isValid===!1&&(delete t._isValid,ve.createFromInputFallback(t))}function te(t){var e=t._i,i=Ie.exec(e);e===n?t._d=new Date:i?t._d=new Date(+i[1]):"string"==typeof e?Q(t):b(e)?(t._a=e.slice(0),U(t)):_(e)?t._d=new Date(+e):"object"==typeof e?V(t):"number"==typeof e?t._d=new Date(e):ve.createFromInputFallback(t)}function ee(t,e,i,s,o,n,r){var a=new Date(t,e,i,s,o,n,r);return 1970>t&&a.setFullYear(t),a}function ie(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function se(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function oe(t,e,i,s,o){return o.relativeTime(e||1,!!i,t,s)}function ne(t,e,i){var s=we(Math.abs(t)/1e3),o=we(s/60),n=we(o/60),r=we(n/24),a=we(r/365),h=s0,h[4]=i,oe.apply({},h)}function re(t,e,i){var s,o=i-e,n=i-t.day();return n>o&&(n-=7),o-7>n&&(n+=7),s=ve(t).add("d",n),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function ae(t,e,i,s,o){var n,r,a=ie(t,0,1).getUTCDay();return a=0===a?7:a,i=null!=i?i:o,n=o-a+(a>s?7:0)-(o>a?7:0),r=7*(e-1)+(i-o)+n+1,{year:r>0?t:t-1,dayOfYear:r>0?r:T(t-1)+r}}function he(t){var e=t._i,i=t._f;return null===e||i===n&&""===e?ve.invalid({nullInput:!0}):("string"==typeof e&&(t._i=e=P().preparse(e)),ve.isMoment(e)?(t=g(e),t._d=new Date(+e._d)):i?b(i)?$(t):Z(t):te(t),new p(t))}function de(t,e){var i,s;if(1===e.length&&b(e[0])&&(e=e[0]),!e.length)return ve();for(i=e[0],s=1;s=0?"+":"-";return e+v(Math.abs(t),6)},gg:function(){return v(this.weekYear()%100,2)},gggg:function(){return v(this.weekYear(),4)},ggggg:function(){return v(this.weekYear(),5)},GG:function(){return v(this.isoWeekYear()%100,2)},GGGG:function(){return v(this.isoWeekYear(),4)},GGGGG:function(){return v(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return C(this.milliseconds()/100)},SS:function(){return v(C(this.milliseconds()/10),2)},SSS:function(){return v(this.milliseconds(),3)},SSSS:function(){return v(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+v(C(t/60),2)+":"+v(C(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+v(C(t/60),2)+v(C(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},ui=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];li.length;)be=li.pop(),pi[be+"o"]=l(pi[be],be);for(;ci.length;)be=ci.pop(),pi[be+be]=d(pi[be],2);for(pi.DDDD=d(pi.DDD,3),f(c.prototype,{set:function(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t){var e,i,s;for(this._monthsParse||(this._monthsParse=[]),e=0;12>e;e++)if(this._monthsParse[e]||(i=ve.utc([2e3,e]),s="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[e]=new RegExp(s.replace(".",""),"i")),this._monthsParse[e].test(t))return e},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,i,s;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(i=ve([2e3,1]).day(e),s="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(s.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e){var i=this._calendar[t];return"function"==typeof i?i.apply(e):i},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,i,s){var o=this._relativeTime[i];return"function"==typeof o?o(t,e,i,s):o.replace(/%d/i,t)},pastFuture:function(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",preparse:function(t){return t},postformat:function(t){return t},week:function(t){return re(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),ve=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._i=t,o._f=e,o._l=i,o._strict=s,o._isUTC=!1,o._pf=a(),he(o)},ve.suppressDeprecationWarnings=!1,ve.createFromInputFallback=h("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i)}),ve.min=function(){var t=[].slice.call(arguments,0);return de("isBefore",t)},ve.max=function(){var t=[].slice.call(arguments,0);return de("isAfter",t)},ve.utc=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._useUTC=!0,o._isUTC=!0,o._l=i,o._i=t,o._f=e,o._strict=s,o._pf=a(),he(o).utc()},ve.unix=function(t){return ve(1e3*t)},ve.duration=function(t,e){var i,s,o,n=t,r=null;return ve.isDuration(t)?n={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(n={},e?n[e]=t:n.milliseconds=t):(r=Ae.exec(t))?(i="-"===r[1]?-1:1,n={y:0,d:C(r[Ce])*i,h:C(r[Ee])*i,m:C(r[De])*i,s:C(r[Te])*i,ms:C(r[Oe])*i}):(r=ze.exec(t))&&(i="-"===r[1]?-1:1,o=function(t){var e=t&&parseFloat(t.replace(",",".")); return(isNaN(e)?0:e)*i},n={y:o(r[2]),M:o(r[3]),d:o(r[4]),h:o(r[5]),m:o(r[6]),s:o(r[7]),w:o(r[8])}),s=new u(n),ve.isDuration(t)&&t.hasOwnProperty("_lang")&&(s._lang=t._lang),s},ve.version=_e,ve.defaultFormat=ei,ve.ISO_8601=function(){},ve.momentProperties=ke,ve.updateOffset=function(){},ve.relativeTimeThreshold=function(t,e){return di[t]===n?!1:(di[t]=e,!0)},ve.lang=function(t,e){var i;return t?(e?A(N(t),e):null===e?(z(t),t="en"):Le[t]||P(t),i=ve.duration.fn._lang=ve.fn._lang=P(t),i._abbr):ve.fn._lang._abbr},ve.langData=function(t){return t&&t._lang&&t._lang._abbr&&(t=t._lang._abbr),P(t)},ve.isMoment=function(t){return t instanceof p||null!=t&&t.hasOwnProperty("_isAMomentObject")},ve.isDuration=function(t){return t instanceof u},be=ui.length-1;be>=0;--be)M(ui[be]);ve.normalizeUnits=function(t){return w(t)},ve.invalid=function(t){var e=ve.utc(0/0);return null!=t?f(e._pf,t):e._pf.userInvalidated=!0,e},ve.parseZone=function(){return ve.apply(null,arguments).parseZone()},ve.parseTwoDigitYear=function(t){return C(t)+(C(t)>68?1900:2e3)},f(ve.fn=p.prototype,{clone:function(){return ve(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var t=ve(this).utc();return 00:!1},parsingFlags:function(){return f({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(t){var e=H(this,t||ve.defaultFormat);return this.lang().postformat(e)},add:function(t,e){var i;return i="string"==typeof t&&"string"==typeof e?ve.duration(isNaN(+e)?+t:+e,isNaN(+e)?e:t):"string"==typeof t?ve.duration(+e,t):ve.duration(t,e),y(this,i,1),this},subtract:function(t,e){var i;return i="string"==typeof t&&"string"==typeof e?ve.duration(isNaN(+e)?+t:+e,isNaN(+e)?e:t):"string"==typeof t?ve.duration(+e,t):ve.duration(t,e),y(this,i,-1),this},diff:function(t,e,i){var s,o,n=I(t,this),r=6e4*(this.zone()-n.zone());return e=w(e),"year"===e||"month"===e?(s=432e5*(this.daysInMonth()+n.daysInMonth()),o=12*(this.year()-n.year())+(this.month()-n.month()),o+=(this-ve(this).startOf("month")-(n-ve(n).startOf("month")))/s,o-=6e4*(this.zone()-ve(this).startOf("month").zone()-(n.zone()-ve(n).startOf("month").zone()))/s,"year"===e&&(o/=12)):(s=this-n,o="second"===e?s/1e3:"minute"===e?s/6e4:"hour"===e?s/36e5:"day"===e?(s-r)/864e5:"week"===e?(s-r)/6048e5:s),i?o:m(o)},from:function(t,e){return ve.duration(this.diff(t)).lang(this.lang()._abbr).humanize(!e)},fromNow:function(t){return this.from(ve(),t)},calendar:function(t){var e=t||ve(),i=I(e,this).startOf("day"),s=this.diff(i,"days",!0),o=-6>s?"sameElse":-1>s?"lastWeek":0>s?"lastDay":1>s?"sameDay":2>s?"nextDay":7>s?"nextWeek":"sameElse";return this.format(this.lang().calendar(o,this))},isLeapYear:function(){return O(this.year())},isDST:function(){return this.zone()+ve(t).startOf(e)},isBefore:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)<+ve(t).startOf(e)},isSame:function(t,e){return e=e||"ms",+this.clone().startOf(e)===+I(t,this).startOf(e)},min:h("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(t){return t=ve.apply(null,arguments),this>t?this:t}),max:h("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(t){return t=ve.apply(null,arguments),t>this?this:t}),zone:function(t,e){var i=this._offset||0;return null==t?this._isUTC?i:this._d.getTimezoneOffset():("string"==typeof t&&(t=W(t)),Math.abs(t)<16&&(t=60*t),this._offset=t,this._isUTC=!0,i!==t&&(!e||this._changeInProgress?y(this,ve.duration(i-t,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,ve.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(t){return t=t?ve(t).zone():0,(this.zone()-t)%60===0},daysInMonth:function(){return E(this.year(),this.month())},dayOfYear:function(t){var e=we((ve(this).startOf("day")-ve(this).startOf("year"))/864e5)+1;return null==t?e:this.add("d",t-e)},quarter:function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},weekYear:function(t){var e=re(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==t?e:this.add("y",t-e)},isoWeekYear:function(t){var e=re(this,1,4).year;return null==t?e:this.add("y",t-e)},week:function(t){var e=this.lang().week(this);return null==t?e:this.add("d",7*(t-e))},isoWeek:function(t){var e=re(this,1,4).week;return null==t?e:this.add("d",7*(t-e))},weekday:function(t){var e=(this.day()+7-this.lang()._week.dow)%7;return null==t?e:this.add("d",t-e)},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},isoWeeksInYear:function(){return D(this.year(),1,4)},weeksInYear:function(){var t=this._lang._week;return D(this.year(),t.dow,t.doy)},get:function(t){return t=w(t),this[t]()},set:function(t,e){return t=w(t),"function"==typeof this[t]&&this[t](e),this},lang:function(t){return t===n?this._lang:(this._lang=P(t),this)}}),ve.fn.millisecond=ve.fn.milliseconds=ue("Milliseconds",!1),ve.fn.second=ve.fn.seconds=ue("Seconds",!1),ve.fn.minute=ve.fn.minutes=ue("Minutes",!1),ve.fn.hour=ve.fn.hours=ue("Hours",!0),ve.fn.date=ue("Date",!0),ve.fn.dates=h("dates accessor is deprecated. Use date instead.",ue("Date",!0)),ve.fn.year=ue("FullYear",!0),ve.fn.years=h("years accessor is deprecated. Use year instead.",ue("FullYear",!0)),ve.fn.days=ve.fn.day,ve.fn.months=ve.fn.month,ve.fn.weeks=ve.fn.week,ve.fn.isoWeeks=ve.fn.isoWeek,ve.fn.quarters=ve.fn.quarter,ve.fn.toJSON=ve.fn.toISOString,f(ve.duration.fn=u.prototype,{_bubble:function(){var t,e,i,s,o=this._milliseconds,n=this._days,r=this._months,a=this._data;a.milliseconds=o%1e3,t=m(o/1e3),a.seconds=t%60,e=m(t/60),a.minutes=e%60,i=m(e/60),a.hours=i%24,n+=m(i/24),a.days=n%30,r+=m(n/30),a.months=r%12,s=m(r/12),a.years=s},weeks:function(){return m(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*C(this._months/12)},humanize:function(t){var e=+this,i=ne(e,!t,this.lang());return t&&(i=this.lang().pastFuture(e,i)),this.lang().postformat(i)},add:function(t,e){var i=ve.duration(t,e);return this._milliseconds+=i._milliseconds,this._days+=i._days,this._months+=i._months,this._bubble(),this},subtract:function(t,e){var i=ve.duration(t,e);return this._milliseconds-=i._milliseconds,this._days-=i._days,this._months-=i._months,this._bubble(),this},get:function(t){return t=w(t),this[t.toLowerCase()+"s"]()},as:function(t){return t=w(t),this["as"+t.charAt(0).toUpperCase()+t.slice(1)+"s"]()},lang:ve.fn.lang,toIsoString:function(){var t=Math.abs(this.years()),e=Math.abs(this.months()),i=Math.abs(this.days()),s=Math.abs(this.hours()),o=Math.abs(this.minutes()),n=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(t?t+"Y":"")+(e?e+"M":"")+(i?i+"D":"")+(s||o||n?"T":"")+(s?s+"H":"")+(o?o+"M":"")+(n?n+"S":""):"P0D"}});for(be in ni)ni.hasOwnProperty(be)&&(ge(be,ni[be]),fe(be.toLowerCase()));ge("Weeks",6048e5),ve.duration.fn.asMonths=function(){return(+this-31536e6*this.years())/2592e6+12*this.years()},ve.lang("en",{ordinal:function(t){var e=t%10,i=1===C(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),Ne?o.exports=ve:(s=function(t,e,i){return i.config&&i.config()&&i.config().noGlobal===!0&&(xe.moment=ye),ve}.call(e,i,e,o),!(s!==n&&(o.exports=s)),me(!0))}).call(this)}).call(e,function(){return this}(),i(5)(t))},function(t,e,i){function s(t){return i(o(t))}function o(t){return n[t]||function(){throw new Error("Cannot find module '"+t+"'.")}()}var n={};s.keys=function(){return Object.keys(n)},s.resolve=o,t.exports=s},function(t){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}},function(t,e){e.prepareElements=function(t){for(var e in t)t.hasOwnProperty(e)&&(t[e].redundant=t[e].used,t[e].used=[])},e.cleanupElements=function(t){for(var e in t)if(t.hasOwnProperty(e)&&t[e].redundant){for(var i=0;i0?(s=e[t].redundant[0],e[t].redundant.shift()):(s=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(s)):(s=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(s)),e[t].used.push(s),s},e.getDOMElement=function(t,e,i){var s;return e.hasOwnProperty(t)?e[t].redundant.length>0?(s=e[t].redundant[0],e[t].redundant.shift()):(s=document.createElement(t),i.appendChild(s)):(s=document.createElement(t),e[t]={used:[],redundant:[]},i.appendChild(s)),e[t].used.push(s),s},e.drawPoint=function(t,i,s,o,n){var r;return"circle"==s.options.drawPoints.style?(r=e.getSVGElement("circle",o,n),r.setAttributeNS(null,"cx",t),r.setAttributeNS(null,"cy",i),r.setAttributeNS(null,"r",.5*s.options.drawPoints.size),r.setAttributeNS(null,"class",s.className+" point")):(r=e.getSVGElement("rect",o,n),r.setAttributeNS(null,"x",t-.5*s.options.drawPoints.size),r.setAttributeNS(null,"y",i-.5*s.options.drawPoints.size),r.setAttributeNS(null,"width",s.options.drawPoints.size),r.setAttributeNS(null,"height",s.options.drawPoints.size),r.setAttributeNS(null,"class",s.className+" point")),r},e.drawBar=function(t,i,s,o,n,r,a){var h=e.getSVGElement("rect",r,a);h.setAttributeNS(null,"x",t-.5*s),h.setAttributeNS(null,"y",i),h.setAttributeNS(null,"width",s),h.setAttributeNS(null,"height",o),h.setAttributeNS(null,"class",n)}},function(t,e,i){function s(t,e){if(!t||Array.isArray(t)||o.isDataTable(t)||(e=t,t=null),this._options=e||{},this._data={},this._fieldId=this._options.fieldId||"id",this._type={},this._options.type)for(var i in this._options.type)if(this._options.type.hasOwnProperty(i)){var s=this._options.type[i];this._type[i]="Date"==s||"ISODate"==s||"ASPDate"==s?"Date":s}if(this._options.convert)throw new Error('Option "convert" is deprecated. Use "type" instead.');this._subscribers={},t&&this.add(t)}var o=i(1);s.prototype.on=function(t,e){var i=this._subscribers[t];i||(i=[],this._subscribers[t]=i),i.push({callback:e})},s.prototype.subscribe=s.prototype.on,s.prototype.off=function(t,e){var i=this._subscribers[t];i&&(this._subscribers[t]=i.filter(function(t){return t.callback!=e}))},s.prototype.unsubscribe=s.prototype.off,s.prototype._trigger=function(t,e,i){if("*"==t)throw new Error("Cannot trigger event *");var s=[];t in this._subscribers&&(s=s.concat(this._subscribers[t])),"*"in this._subscribers&&(s=s.concat(this._subscribers["*"]));for(var o=0;or;r++)i=n._addItem(t[r]),s.push(i);else if(o.isDataTable(t))for(var h=this._getColumnNames(t),d=0,l=t.getNumberOfRows();l>d;d++){for(var c={},p=0,u=h.length;u>p;p++){var f=h[p];c[f]=t.getValue(d,p)}i=n._addItem(c),s.push(i)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");i=n._addItem(t),s.push(i)}return s.length&&this._trigger("add",{items:s},e),s},s.prototype.update=function(t,e){var i=[],s=[],n=this,r=n._fieldId,a=function(t){var e=t[r];n._data[e]?(e=n._updateItem(t),s.push(e)):(e=n._addItem(t),i.push(e))};if(Array.isArray(t))for(var h=0,d=t.length;d>h;h++)a(t[h]);else if(o.isDataTable(t))for(var l=this._getColumnNames(t),c=0,p=t.getNumberOfRows();p>c;c++){for(var u={},f=0,g=l.length;g>f;f++){var m=l[f];u[m]=t.getValue(c,f)}a(u)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");a(t)}return i.length&&this._trigger("add",{items:i},e),s.length&&this._trigger("update",{items:s},e),i.concat(s)},s.prototype.get=function(){var t,e,i,s,n=this,r=o.getType(arguments[0]);"String"==r||"Number"==r?(t=arguments[0],i=arguments[1],s=arguments[2]):"Array"==r?(e=arguments[0],i=arguments[1],s=arguments[2]):(i=arguments[0],s=arguments[1]);var a;if(i&&i.returnType){var h=["DataTable","Array","Object"];if(a=-1==h.indexOf(i.returnType)?"Array":i.returnType,s&&a!=o.getType(s))throw new Error('Type of parameter "data" ('+o.getType(s)+") does not correspond with specified options.type ("+i.type+")");if("DataTable"==a&&!o.isDataTable(s))throw new Error('Parameter "data" must be a DataTable when options.type is "DataTable"')}else a=s&&"DataTable"==o.getType(s)?"DataTable":"Array";var d,l,c,p,u=i&&i.type||this._options.type,f=i&&i.filter,g=[];if(void 0!=t)d=n._getItem(t,u),f&&!f(d)&&(d=null);else if(void 0!=e)for(c=0,p=e.length;p>c;c++)d=n._getItem(e[c],u),(!f||f(d))&&g.push(d);else for(l in this._data)this._data.hasOwnProperty(l)&&(d=n._getItem(l,u),(!f||f(d))&&g.push(d));if(i&&i.order&&void 0==t&&this._sort(g,i.order),i&&i.fields){var m=i.fields;if(void 0!=t)d=this._filterFields(d,m);else for(c=0,p=g.length;p>c;c++)g[c]=this._filterFields(g[c],m)}if("DataTable"==a){var v=this._getColumnNames(s);if(void 0!=t)n._appendRow(s,v,d);else for(c=0;cc;c++)s.push(g[c]);return s}return g},s.prototype.getIds=function(t){var e,i,s,o,n,r=this._data,a=t&&t.filter,h=t&&t.order,d=t&&t.type||this._options.type,l=[];if(a)if(h){n=[];for(s in r)r.hasOwnProperty(s)&&(o=this._getItem(s,d),a(o)&&n.push(o));for(this._sort(n,h),e=0,i=n.length;i>e;e++)l[e]=n[e][this._fieldId]}else for(s in r)r.hasOwnProperty(s)&&(o=this._getItem(s,d),a(o)&&l.push(o[this._fieldId]));else if(h){n=[];for(s in r)r.hasOwnProperty(s)&&n.push(r[s]);for(this._sort(n,h),e=0,i=n.length;i>e;e++)l[e]=n[e][this._fieldId]}else for(s in r)r.hasOwnProperty(s)&&(o=r[s],l.push(o[this._fieldId]));return l},s.prototype.getDataSet=function(){return this},s.prototype.forEach=function(t,e){var i,s,o=e&&e.filter,n=e&&e.type||this._options.type,r=this._data;if(e&&e.order)for(var a=this.get(e),h=0,d=a.length;d>h;h++)i=a[h],s=i[this._fieldId],t(i,s);else for(s in r)r.hasOwnProperty(s)&&(i=this._getItem(s,n),(!o||o(i))&&t(i,s))},s.prototype.map=function(t,e){var i,s=e&&e.filter,o=e&&e.type||this._options.type,n=[],r=this._data;for(var a in r)r.hasOwnProperty(a)&&(i=this._getItem(a,o),(!s||s(i))&&n.push(t(i,a)));return e&&e.order&&this._sort(n,e.order),n},s.prototype._filterFields=function(t,e){var i={};for(var s in t)t.hasOwnProperty(s)&&-1!=e.indexOf(s)&&(i[s]=t[s]);return i},s.prototype._sort=function(t,e){if(o.isString(e)){var i=e;t.sort(function(t,e){var s=t[i],o=e[i];return s>o?1:o>s?-1:0})}else{if("function"!=typeof e)throw new TypeError("Order must be a function or a string");t.sort(e)}},s.prototype.remove=function(t,e){var i,s,o,n=[];if(Array.isArray(t))for(i=0,s=t.length;s>i;i++)o=this._remove(t[i]),null!=o&&n.push(o);else o=this._remove(t),null!=o&&n.push(o);return n.length&&this._trigger("remove",{items:n},e),n},s.prototype._remove=function(t){if(o.isNumber(t)||o.isString(t)){if(this._data[t])return delete this._data[t],t}else if(t instanceof Object){var e=t[this._fieldId];if(e&&this._data[e])return delete this._data[e],e}return null},s.prototype.clear=function(t){var e=Object.keys(this._data);return this._data={},this._trigger("remove",{items:e},t),e},s.prototype.max=function(t){var e=this._data,i=null,s=null;for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],r=n[t];null!=r&&(!i||r>s)&&(i=n,s=r)}return i},s.prototype.min=function(t){var e=this._data,i=null,s=null;for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],r=n[t];null!=r&&(!i||s>r)&&(i=n,s=r)}return i},s.prototype.distinct=function(t){var e,i=this._data,s=[],n=this._options.type&&this._options.type[t]||null,r=0;for(var a in i)if(i.hasOwnProperty(a)){var h=i[a],d=h[t],l=!1;for(e=0;r>e;e++)if(s[e]==d){l=!0;break}l||void 0===d||(s[r]=d,r++)}if(n)for(e=0;ei;i++)e[i]=t.getColumnId(i)||t.getColumnLabel(i);return e},s.prototype._appendRow=function(t,e,i){for(var s=t.addRow(),o=0,n=e.length;n>o;o++){var r=e[o];t.setValue(s,o,i[r])}},t.exports=s},function(t,e,i){function s(t,e){this._data=null,this._ids={},this._options=e||{},this._fieldId="id",this._subscribers={};var i=this;this.listener=function(){i._onEvent.apply(i,arguments)},this.setData(t)}var o=i(1),n=i(7);s.prototype.setData=function(t){var e,i,s;if(this._data){this._data.unsubscribe&&this._data.unsubscribe("*",this.listener),e=[];for(var o in this._ids)this._ids.hasOwnProperty(o)&&e.push(o);this._ids={},this._trigger("remove",{items:e})}if(this._data=t,this._data){for(this._fieldId=this._options.fieldId||this._data&&this._data.options&&this._data.options.fieldId||"id",e=this._data.getIds({filter:this._options&&this._options.filter}),i=0,s=e.length;s>i;i++)o=e[i],this._ids[o]=!0;this._trigger("add",{items:e}),this._data.on&&this._data.on("*",this.listener)}},s.prototype.get=function(){var t,e,i,s=this,n=o.getType(arguments[0]);"String"==n||"Number"==n||"Array"==n?(t=arguments[0],e=arguments[1],i=arguments[2]):(e=arguments[0],i=arguments[1]);var r=o.extend({},this._options,e);this._options.filter&&e&&e.filter&&(r.filter=function(t){return s._options.filter(t)&&e.filter(t)});var a=[];return void 0!=t&&a.push(t),a.push(r),a.push(i),this._data&&this._data.get.apply(this._data,a)},s.prototype.getIds=function(t){var e;if(this._data){var i,s=this._options.filter;i=t&&t.filter?s?function(e){return s(e)&&t.filter(e)}:t.filter:s,e=this._data.getIds({filter:i,order:t&&t.order})}else e=[];return e},s.prototype.getDataSet=function(){for(var t=this;t instanceof s;)t=t._data;return t||null},s.prototype._onEvent=function(t,e,i){var s,o,n,r,a=e&&e.items,h=this._data,d=[],l=[],c=[];if(a&&h){switch(t){case"add":for(s=0,o=a.length;o>s;s++)n=a[s],r=this.get(n),r&&(this._ids[n]=!0,d.push(n));break;case"update":for(s=0,o=a.length;o>s;s++)n=a[s],r=this.get(n),r?this._ids[n]?l.push(n):(this._ids[n]=!0,d.push(n)):this._ids[n]&&(delete this._ids[n],c.push(n));break;case"remove":for(s=0,o=a.length;o>s;s++)n=a[s],this._ids[n]&&(delete this._ids[n],c.push(n))}d.length&&this._trigger("add",{items:d},i),l.length&&this._trigger("update",{items:l},i),c.length&&this._trigger("remove",{items:c},i)}},s.prototype.on=n.prototype.on,s.prototype.off=n.prototype.off,s.prototype._trigger=n.prototype._trigger,s.prototype.subscribe=s.prototype.on,s.prototype.unsubscribe=s.prototype.off,t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.width="400px",this.height="400px",this.margin=10,this.defaultXCenter="55%",this.defaultYCenter="50%",this.xLabel="x",this.yLabel="y",this.zLabel="z",this.filterLabel="time",this.legendLabel="value",this.style=s.STYLE.DOT,this.showPerspective=!0,this.showGrid=!0,this.keepAspectRatio=!0,this.showShadow=!1,this.showGrayBottom=!1,this.showTooltip=!1,this.verticalRatio=.5,this.animationInterval=1e3,this.animationPreload=!1,this.camera=new l,this.eye=new h(0,0,-1),this.dataTable=null,this.dataPoints=null,this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.colFilter=void 0,this.xMin=0,this.xStep=void 0,this.xMax=1,this.yMin=0,this.yStep=void 0,this.yMax=1,this.zMin=0,this.zStep=void 0,this.zMax=1,this.valueMin=0,this.valueMax=1,this.xBarWidth=1,this.yBarWidth=1,this.colorAxis="#4D4D4D",this.colorGrid="#D3D3D3",this.colorDot="#7DC1FF",this.colorDotBorder="#3267D2",this.create(),this.setOptions(i),e&&this.setData(e)}var o=i(10),n=i(7),r=i(8),a=i(1),h=i(11),d=i(12),l=i(13),c=i(14),p=i(15),u=i(16);o(s.prototype),s.prototype._setScale=function(){this.scale=new h(1/(this.xMax-this.xMin),1/(this.yMax-this.yMin),1/(this.zMax-this.zMin)),this.keepAspectRatio&&(this.scale.x3&&(this.colFilter=3);else{if(this.style!==s.STYLE.DOTCOLOR&&this.style!==s.STYLE.DOTSIZE&&this.style!==s.STYLE.BARCOLOR&&this.style!==s.STYLE.BARSIZE)throw'Unknown style "'+this.style+'"';this.colX=0,this.colY=1,this.colZ=2,this.colValue=3,t.getNumberOfColumns()>4&&(this.colFilter=4)}},s.prototype.getNumberOfRows=function(t){return t.length},s.prototype.getNumberOfColumns=function(t){var e=0;for(var i in t[0])t[0].hasOwnProperty(i)&&e++;return e},s.prototype.getDistinctValues=function(t,e){for(var i=[],s=0;st[s][e]&&(i.min=t[s][e]),i.maxt;t++){var g=(t-p)/(f-p),m=240*g,v=this._hsv2rgb(m,1,1);c.strokeStyle=v,c.beginPath(),c.moveTo(h,r+t),c.lineTo(a,r+t),c.stroke()}c.strokeStyle=this.colorAxis,c.strokeRect(h,r,i,n)}if(this.style===s.STYLE.DOTSIZE&&(c.strokeStyle=this.colorAxis,c.fillStyle=this.colorDot,c.beginPath(),c.moveTo(h,r),c.lineTo(a,r),c.lineTo(a-i+e,d),c.lineTo(h,d),c.closePath(),c.fill(),c.stroke()),this.style===s.STYLE.DOTCOLOR||this.style===s.STYLE.DOTSIZE){var y=5,b=new u(this.valueMin,this.valueMax,(this.valueMax-this.valueMin)/5,!0);for(b.start(),b.getCurrent()0?this.yMin:this.yMax,o=this._convert3Dto2D(new h(x,r,this.zMin)),Math.cos(2*_)>0?(m.textAlign="center",m.textBaseline="top",o.y+=b):Math.sin(2*_)<0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(" "+i.getCurrent()+" ",o.x,o.y),i.next()}for(m.lineWidth=1,s=void 0===this.defaultYStep,i=new u(this.yMin,this.yMax,this.yStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,o=this._convert3Dto2D(new h(n,i.getCurrent(),this.zMin)),Math.cos(2*_)<0?(m.textAlign="center",m.textBaseline="top",o.y+=b):Math.sin(2*_)>0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(" "+i.getCurrent()+" ",o.x,o.y),i.next();for(m.lineWidth=1,s=void 0===this.defaultZStep,i=new u(this.zMin,this.zMax,this.zStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax;!i.end();)t=this._convert3Dto2D(new h(n,r,i.getCurrent())),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(t.x-b,t.y),m.stroke(),m.textAlign="right",m.textBaseline="middle",m.fillStyle=this.colorAxis,m.fillText(i.getCurrent()+" ",t.x-5,t.y),i.next();m.lineWidth=1,t=this._convert3Dto2D(new h(n,r,this.zMin)),e=this._convert3Dto2D(new h(n,r,this.zMax)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(e.x,e.y),m.stroke(),m.lineWidth=1,p=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),f=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(p.x,p.y),m.lineTo(f.x,f.y),m.stroke(),p=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),f=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(p.x,p.y),m.lineTo(f.x,f.y),m.stroke(),m.lineWidth=1,t=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(e.x,e.y),m.stroke(),t=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(e.x,e.y),m.stroke();var w=this.xLabel;w.length>0&&(c=.1/this.scale.y,n=(this.xMin+this.xMax)/2,r=Math.cos(_)>0?this.yMin-c:this.yMax+c,o=this._convert3Dto2D(new h(n,r,this.zMin)),Math.cos(2*_)>0?(m.textAlign="center",m.textBaseline="top"):Math.sin(2*_)<0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(w,o.x,o.y));var S=this.yLabel;S.length>0&&(l=.1/this.scale.x,n=Math.sin(_)>0?this.xMin-l:this.xMax+l,r=(this.yMin+this.yMax)/2,o=this._convert3Dto2D(new h(n,r,this.zMin)),Math.cos(2*_)<0?(m.textAlign="center",m.textBaseline="top"):Math.sin(2*_)>0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(S,o.x,o.y));var M=this.zLabel;M.length>0&&(d=30,n=Math.cos(_)>0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax,a=(this.zMin+this.zMax)/2,o=this._convert3Dto2D(new h(n,r,a)),m.textAlign="right",m.textBaseline="middle",m.fillStyle=this.colorAxis,m.fillText(M,o.x-d,o.y))},s.prototype._hsv2rgb=function(t,e,i){var s,o,n,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:s=r,o=h,n=0;break;case 1:s=h,o=r,n=0;break;case 2:s=0,o=r,n=h;break;case 3:s=0,o=h,n=r;break;case 4:s=h,o=0,n=r;break;case 5:s=r,o=0,n=h;break;default:s=0,o=0,n=0}return"RGB("+parseInt(255*s)+","+parseInt(255*o)+","+parseInt(255*n)+")"},s.prototype._redrawDataGrid=function(){var t,e,i,o,n,r,a,d,l,c,p,u,f,g=this.frame.canvas,m=g.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(n=0;n0}else r=!0;r?(f=(t.point.z+e.point.z+i.point.z+o.point.z)/4,c=240*(1-(f-this.zMin)*this.scale.z/this.verticalRatio),p=1,this.showShadow?(u=Math.min(1+S.x/M/2,1),a=this._hsv2rgb(c,p,u),d=a):(u=1,a=this._hsv2rgb(c,p,u),d=this.colorAxis)):(a="gray",d=this.colorAxis),l=.5,m.lineWidth=l,m.fillStyle=a,m.strokeStyle=d,m.beginPath(),m.moveTo(t.screen.x,t.screen.y),m.lineTo(e.screen.x,e.screen.y),m.lineTo(o.screen.x,o.screen.y),m.lineTo(i.screen.x,i.screen.y),m.closePath(),m.fill(),m.stroke()}}else for(n=0;np&&(p=0);var u,f,g;this.style===s.STYLE.DOTCOLOR?(u=240*(1-(d.point.value-this.valueMin)*this.scale.value),f=this._hsv2rgb(u,1,1),g=this._hsv2rgb(u,1,.8)):this.style===s.STYLE.DOTSIZE?(f=this.colorDot,g=this.colorDotBorder):(u=240*(1-(d.point.z-this.zMin)*this.scale.z/this.verticalRatio),f=this._hsv2rgb(u,1,1),g=this._hsv2rgb(u,1,.8)),i.lineWidth=1,i.strokeStyle=g,i.fillStyle=f,i.beginPath(),i.arc(d.screen.x,d.screen.y,p,0,2*Math.PI,!0),i.fill(),i.stroke()}}},s.prototype._redrawDataBar=function(){var t,e,i,o,n=this.frame.canvas,r=n.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(t=0;t0&&(t=this.dataPoints[0],s.lineWidth=1,s.strokeStyle="blue",s.beginPath(),s.moveTo(t.screen.x,t.screen.y)),e=1;e0&&s.stroke()}},s.prototype._onMouseDown=function(t){if(t=t||window.event,this.leftButtonDown&&this._onMouseUp(t),this.leftButtonDown=t.which?1===t.which:1===t.button,this.leftButtonDown||this.touchDown){this.startMouseX=getMouseX(t),this.startMouseY=getMouseY(t),this.startStart=new Date(this.start),this.startEnd=new Date(this.end),this.startArmRotation=this.camera.getArmRotation(),this.frame.style.cursor="move";var e=this;this.onmousemove=function(t){e._onMouseMove(t)},this.onmouseup=function(t){e._onMouseUp(t)},a.addEventListener(document,"mousemove",e.onmousemove),a.addEventListener(document,"mouseup",e.onmouseup),a.preventDefault(t)}},s.prototype._onMouseMove=function(t){t=t||window.event;var e=parseFloat(getMouseX(t))-this.startMouseX,i=parseFloat(getMouseY(t))-this.startMouseY,s=this.startArmRotation.horizontal+e/200,o=this.startArmRotation.vertical+i/200,n=4,r=Math.sin(n/360*2*Math.PI);Math.abs(Math.sin(s))0?1:0>t?-1:0}var s=e[0],o=e[1],n=e[2],r=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x)),a=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),h=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},s.prototype._dataPointFromXY=function(t,e){var i,o=100,n=null,r=null,a=null,h=new d(t,e);if(this.style===s.STYLE.BAR||this.style===s.STYLE.BARCOLOR||this.style===s.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var l=n.surfaces;if(l)for(var c=l.length-1;c>=0;c--){var p=l[c],u=p.corners,f=[u[0].screen,u[1].screen,u[2].screen],g=[u[2].screen,u[3].screen,u[0].screen];if(this._insideTriangle(h,f)||this._insideTriangle(h,g))return n}}else for(i=0;ib)&&o>b&&(a=b,r=n)}}return r},s.prototype._showTooltip=function(t){var e,i,s;this.tooltip?(e=this.tooltip.dom.content,i=this.tooltip.dom.line,s=this.tooltip.dom.dot):(e=document.createElement("div"),e.style.position="absolute",e.style.padding="10px",e.style.border="1px solid #4d4d4d",e.style.color="#1a1a1a",e.style.background="rgba(255,255,255,0.7)",e.style.borderRadius="2px",e.style.boxShadow="5px 5px 10px rgba(128,128,128,0.5)",i=document.createElement("div"),i.style.position="absolute",i.style.height="40px",i.style.width="0",i.style.borderLeft="1px solid #4d4d4d",s=document.createElement("div"),s.style.position="absolute",s.style.height="0",s.style.width="0",s.style.border="5px solid #4d4d4d",s.style.borderRadius="5px",this.tooltip={dataPoint:null,dom:{content:e,line:i,dot:s}}),this._hideTooltip(),this.tooltip.dataPoint=t,e.innerHTML="function"==typeof this.showTooltip?this.showTooltip(t.point):"
x:"+t.point.x+"
y:"+t.point.y+"
z:"+t.point.z+"
",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(s);var o=e.offsetWidth,n=e.offsetHeight,r=i.offsetHeight,a=s.offsetWidth,h=s.offsetHeight,d=t.screen.x-o/2;d=Math.min(Math.max(d,10),this.frame.clientWidth-10-o),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=d+"px",e.style.top=t.screen.y-r-n+"px",s.style.left=t.screen.x-a/2+"px",s.style.top=t.screen.y-h/2+"px"},s.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},getMouseX=function(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0},getMouseY=function(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0},t.exports=s},function(t){function e(t){return t?i(t):void 0}function i(t){for(var i in e.prototype)t[i]=e.prototype[i];return t}t.exports=e,e.prototype.on=e.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},e.prototype.once=function(t,e){function i(){s.off(t,i),e.apply(this,arguments)}var s=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},e.prototype.off=e.prototype.removeListener=e.prototype.removeAllListeners=e.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var s,o=0;os;++s)i[s].apply(this,e)}return this},e.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},e.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t){function e(t,e,i){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0,this.z=void 0!==i?i:0}e.subtract=function(t,i){var s=new e;return s.x=t.x-i.x,s.y=t.y-i.y,s.z=t.z-i.z,s},e.add=function(t,i){var s=new e;return s.x=t.x+i.x,s.y=t.y+i.y,s.z=t.z+i.z,s},e.avg=function(t,i){return new e((t.x+i.x)/2,(t.y+i.y)/2,(t.z+i.z)/2)},e.crossProduct=function(t,i){var s=new e;return s.x=t.y*i.z-t.z*i.y,s.y=t.z*i.x-t.x*i.z,s.z=t.x*i.y-t.y*i.x,s},e.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},t.exports=e},function(t){Point2d=function(t,e){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0},t.exports=Point2d},function(t,e,i){var s=i(11);Camera=function(){this.armLocation=new s,this.armRotation={},this.armRotation.horizontal=0,this.armRotation.vertical=0,this.armLength=1.7,this.cameraLocation=new s,this.cameraRotation=new s(.5*Math.PI,0,0),this.calculateCameraOrientation()},Camera.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},Camera.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),(void 0!==t||void 0!==e)&&this.calculateCameraOrientation()},Camera.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},Camera.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.calculateCameraOrientation())},Camera.prototype.getArmLength=function(){return this.armLength},Camera.prototype.getCameraLocation=function(){return this.cameraLocation},Camera.prototype.getCameraRotation=function(){return this.cameraRotation},Camera.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal},t.exports=Camera},function(t,e,i){function s(t,e,i){this.data=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=i.getDistinctValues(t.get(),this.column),this.values.sort(function(t,e){return t>e?1:e>t?-1:0}),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var o=i(8);s.prototype.isLoaded=function(){return this.loaded},s.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},s.prototype.getLabel=function(){return this.graph.filterLabel},s.prototype.getColumn=function(){return this.column},s.prototype.getSelectedValue=function(){return void 0===this.index?void 0:this.values[this.index]},s.prototype.getValues=function(){return this.values},s.prototype.getValue=function(t){if(t>=this.values.length)throw"Error: index out of range";return this.values[t]},s.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var s=new o(this.data,{filter:function(t){return t[i.column]==i.value}}).get();e=this.graph._getDataPoints(s),this.dataPoints[t]=e}return e},s.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},s.prototype.selectValue=function(t){if(t>=this.values.length)throw"Error: index out of range";this.index=t,this.value=this.values[t]},s.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t0&&(t--,this.setIndex(t))},s.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},s.prototype.setIndex=function(t){if(!(ts&&(s=0),s>this.values.length-1&&(s=this.values.length-1),s},s.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10,i=t/(this.values.length-1)*e,s=i+3;return s},s.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,s=this.leftToIndex(i);this.setIndex(s),o.preventDefault()},s.prototype._onMouseUp=function(){this.frame.style.cursor="auto",o.removeEventListener(document,"mousemove",this.onmousemove),o.removeEventListener(document,"mouseup",this.onmouseup),o.preventDefault()},t.exports=s},function(t){function e(t,e,i,s){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,s)}e.prototype.setRange=function(t,e,i,s){this._start=t?t:0,this._end=e?e:0,this.setStep(i,s)},e.prototype.setStep=function(t,i){void 0===t||0>=t||(void 0!==i&&(this.prettyStep=i),this._step=this.prettyStep===!0?e.calculatePrettyStep(t):t)},e.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),s=2*Math.pow(10,Math.round(e(t/2))),o=5*Math.pow(10,Math.round(e(t/5))),n=i;return Math.abs(s-t)<=Math.abs(n-t)&&(n=s),Math.abs(o-t)<=Math.abs(n-t)&&(n=o),0>=n&&(n=1),n},e.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},e.prototype.getStep=function(){return this._step},e.prototype.start=function(){this._current=this._start-this._start%this._step},e.prototype.next=function(){this._current+=this._step},e.prototype.end=function(){return this._current>this._end},t.exports=e},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");var n=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},util:{snap:null,toScreen:n._toScreen.bind(n),toGlobalScreen:n._toGlobalScreen.bind(n),toTime:n._toTime.bind(n),toGlobalTime:n._toGlobalTime.bind(n)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.itemSet=new p(this.body),this.components.push(this.itemSet),this.itemsData=null,this.groupsData=null,i&&this.setOptions(i),e?this.setItems(e):this.redraw()}var o=(i(10),i(18),i(1)),n=i(7),r=i(8),a=i(20),h=i(23),d=i(24),l=i(26),c=i(28),p=i(29);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e),i&&("start"in this.options||"end"in this.options)){this.fit();var s="start"in this.options?o.convert(this.options.start,"Date"):null,a="end"in this.options?o.convert(this.options.end,"Date"):null;this.setWindow(s,a)}},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.itemSet.setGroups(e)},s.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t)},s.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},s.prototype.focus=function(t){if(this.itemsData&&void 0!=t){var e=Array.isArray(t)?t:[t],i=this.itemsData.getDataSet().get(e,{type:{start:"Date",end:"Date"}}),s=null,o=null;i.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===s||s>e)&&(s=e),(null===o||i>o)&&(o=i)});var n=(s+o)/2,r=Math.max(this.range.end-this.range.start,1.1*(o-s));this.range.setRange(n-r/2,n+r/2)}},s.prototype.getItemRange=function(){var t=this.itemsData.getDataSet(),e=null,i=null;if(t){var s=t.min("start");e=s?o.convert(s.start,"Date").valueOf():null;var n=t.max("start");n&&(i=o.convert(n.start,"Date").valueOf());var r=t.max("end");r&&(i=null==i?o.convert(r.end,"Date").valueOf():Math.max(i,o.convert(r.end,"Date").valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},t.exports=s},function(t,e,i){t.exports="undefined"!=typeof window?window.Hammer||i(19):function(){throw Error("hammer.js is only available in a browser, not in node.js.")}},function(t,e,i){var s;!function(o,n){"use strict";function r(){a.READY||(w.determineEventTypes(),x.each(a.gestures,function(t){M.register(t)}),w.onTouch(a.DOCUMENT,v,M.detect),w.onTouch(a.DOCUMENT,y,M.detect),a.READY=!0)}var a=function C(t,e){return new C.Instance(t,e||{})};a.VERSION="1.1.3",a.defaults={behavior:{userSelect:"none",touchAction:"pan-y",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},a.DOCUMENT=document,a.HAS_POINTEREVENTS=navigator.pointerEnabled||navigator.msPointerEnabled,a.HAS_TOUCHEVENTS="ontouchstart"in o,a.IS_MOBILE=/mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent),a.NO_MOUSEEVENTS=a.HAS_TOUCHEVENTS&&a.IS_MOBILE||a.HAS_POINTEREVENTS,a.CALCULATE_INTERVAL=25;var h={},d=a.DIRECTION_DOWN="down",l=a.DIRECTION_LEFT="left",c=a.DIRECTION_UP="up",p=a.DIRECTION_RIGHT="right",u=a.POINTER_MOUSE="mouse",f=a.POINTER_TOUCH="touch",g=a.POINTER_PEN="pen",m=a.EVENT_START="start",v=a.EVENT_MOVE="move",y=a.EVENT_END="end",b=a.EVENT_RELEASE="release",_=a.EVENT_TOUCH="touch";a.READY=!1,a.plugins=a.plugins||{},a.gestures=a.gestures||{};var x=a.utils={extend:function(t,e,i){for(var s in e)!e.hasOwnProperty(s)||t[s]!==n&&i||(t[s]=e[s]);return t},on:function(t,e,i){t.addEventListener(e,i,!1)},off:function(t,e,i){t.removeEventListener(e,i,!1)},each:function(t,e,i){var s,o;if("forEach"in t)t.forEach(e,i);else if(t.length!==n){for(s=0,o=t.length;o>s;s++)if(e.call(i,t[s],s,t)===!1)return}else for(s in t)if(t.hasOwnProperty(s)&&e.call(i,t[s],s,t)===!1)return},inStr:function(t,e){return t.indexOf(e)>-1},inArray:function(t,e){if(t.indexOf){var i=t.indexOf(e);return-1===i?!1:i}for(var s=0,o=t.length;o>s;s++)if(t[s]===e)return s;return!1},toArray:function(t){return Array.prototype.slice.call(t,0)},hasParent:function(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1},getCenter:function(t){var e=[],i=[],s=[],o=[],n=Math.min,r=Math.max;return 1===t.length?{pageX:t[0].pageX,pageY:t[0].pageY,clientX:t[0].clientX,clientY:t[0].clientY}:(x.each(t,function(t){e.push(t.pageX),i.push(t.pageY),s.push(t.clientX),o.push(t.clientY)}),{pageX:(n.apply(Math,e)+r.apply(Math,e))/2,pageY:(n.apply(Math,i)+r.apply(Math,i))/2,clientX:(n.apply(Math,s)+r.apply(Math,s))/2,clientY:(n.apply(Math,o)+r.apply(Math,o))/2})},getVelocity:function(t,e,i){return{x:Math.abs(e/t)||0,y:Math.abs(i/t)||0}},getAngle:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return 180*Math.atan2(s,i)/Math.PI},getDirection:function(t,e){var i=Math.abs(t.clientX-e.clientX),s=Math.abs(t.clientY-e.clientY);return i>=s?t.clientX-e.clientX>0?l:p:t.clientY-e.clientY>0?c:d},getDistance:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return Math.sqrt(i*i+s*s)},getScale:function(t,e){return t.length>=2&&e.length>=2?this.getDistance(e[0],e[1])/this.getDistance(t[0],t[1]):1},getRotation:function(t,e){return t.length>=2&&e.length>=2?this.getAngle(e[1],e[0])-this.getAngle(t[1],t[0]):0},isVertical:function(t){return t==c||t==d},setPrefixedCss:function(t,e,i,s){var o=["","Webkit","Moz","O","ms"];e=x.toCamelCase(e);for(var n=0;n0&&this.started&&(r=v),this.started=!0;var d=this.collectEventData(i,r,o,t);return e!=y&&s.call(M,d),a&&(d.changedLength=h,d.eventType=a,s.call(M,d),d.eventType=r,delete d.changedLength),r==y&&(s.call(M,d),this.started=!1),r},determineEventTypes:function(){var t;return t=a.HAS_POINTEREVENTS?o.PointerEvent?["pointerdown","pointermove","pointerup pointercancel lostpointercapture"]:["MSPointerDown","MSPointerMove","MSPointerUp MSPointerCancel MSLostPointerCapture"]:a.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],h[m]=t[0],h[v]=t[1],h[y]=t[2],h},getTouchList:function(t,e){if(a.HAS_POINTEREVENTS)return S.getTouchList();if(t.touches){if(e==v)return t.touches;var i=[],s=[].concat(x.toArray(t.touches),x.toArray(t.changedTouches)),o=[];return x.each(s,function(t){x.inArray(i,t.identifier)===!1&&o.push(t),i.push(t.identifier)}),o}return t.identifier=1,[t]},collectEventData:function(t,e,i,s){var o=f;return x.inStr(s.type,"mouse")||S.matchType(u,s)?o=u:S.matchType(g,s)&&(o=g),{center:x.getCenter(i),timeStamp:Date.now(),target:s.target,touches:i,eventType:e,pointerType:o,srcEvent:s,preventDefault:function(){var t=this.srcEvent;t.preventManipulation&&t.preventManipulation(),t.preventDefault&&t.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return M.stopDetect()}}}},S=a.PointerEvent={pointers:{},getTouchList:function(){var t=[];return x.each(this.pointers,function(e){t.push(e)}),t},updatePointer:function(t,e){t==y||t!=y&&1!==e.buttons?delete this.pointers[e.pointerId]:(e.identifier=e.pointerId,this.pointers[e.pointerId]=e)},matchType:function(t,e){if(!e.pointerType)return!1;var i=e.pointerType,s={};return s[u]=i===(e.MSPOINTER_TYPE_MOUSE||u),s[f]=i===(e.MSPOINTER_TYPE_TOUCH||f),s[g]=i===(e.MSPOINTER_TYPE_PEN||g),s[t]},reset:function(){this.pointers={}}},M=a.detection={gestures:[],current:null,previous:null,stopped:!1,startDetect:function(t,e){this.current||(this.stopped=!1,this.current={inst:t,startEvent:x.extend({},e),lastEvent:!1,lastCalcEvent:!1,futureCalcEvent:!1,lastCalcData:{},name:""},this.detect(e))},detect:function(t){if(this.current&&!this.stopped){t=this.extendEventData(t);var e=this.current.inst,i=e.options;return x.each(this.gestures,function(s){!this.stopped&&e.enabled&&i[s.name]&&s.handler.call(s,t,e)},this),this.current&&(this.current.lastEvent=t),t.eventType==y&&this.stopDetect(),t}},stopDetect:function(){this.previous=x.extend({},this.current),this.current=null,this.stopped=!0},getCalculatedData:function(t,e,i,s,o){var n=this.current,r=!1,h=n.lastCalcEvent,d=n.lastCalcData;h&&t.timeStamp-h.timeStamp>a.CALCULATE_INTERVAL&&(e=h.center,i=t.timeStamp-h.timeStamp,s=t.center.clientX-h.center.clientX,o=t.center.clientY-h.center.clientY,r=!0),(t.eventType==_||t.eventType==b)&&(n.futureCalcEvent=t),(!n.lastCalcEvent||r)&&(d.velocity=x.getVelocity(i,s,o),d.angle=x.getAngle(e,t.center),d.direction=x.getDirection(e,t.center),n.lastCalcEvent=n.futureCalcEvent||t,n.futureCalcEvent=t),t.velocityX=d.velocity.x,t.velocityY=d.velocity.y,t.interimAngle=d.angle,t.interimDirection=d.direction},extendEventData:function(t){var e=this.current,i=e.startEvent,s=e.lastEvent||i;(t.eventType==_||t.eventType==b)&&(i.touches=[],x.each(t.touches,function(t){i.touches.push({clientX:t.clientX,clientY:t.clientY})}));var o=t.timeStamp-i.timeStamp,n=t.center.clientX-i.center.clientX,r=t.center.clientY-i.center.clientY;return this.getCalculatedData(t,s.center,o,n,r),x.extend(t,{startEvent:i,deltaTime:o,deltaX:n,deltaY:r,distance:x.getDistance(i.center,t.center),angle:x.getAngle(i.center,t.center),direction:x.getDirection(i.center,t.center),scale:x.getScale(i.touches,t.touches),rotation:x.getRotation(i.touches,t.touches)}),t},register:function(t){var e=t.defaults||{};return e[t.name]===n&&(e[t.name]=!0),x.extend(a.defaults,e,!0),t.index=t.index||1e3,this.gestures.push(t),this.gestures.sort(function(t,e){return t.indexe.index?1:0}),this.gestures}};a.Instance=function(t,e){var i=this;r(),this.element=t,this.enabled=!0,x.each(e,function(t,i){delete e[i],e[x.toCamelCase(i)]=t}),this.options=x.extend(x.extend({},a.defaults),e||{}),this.options.behavior&&x.toggleBehavior(this.element,this.options.behavior,!0),this.eventStartHandler=w.onTouch(t,m,function(t){i.enabled&&t.eventType==m?M.startDetect(i,t):t.eventType==_&&M.detect(t)}),this.eventHandlers=[]},a.Instance.prototype={on:function(t,e){var i=this;return w.on(i.element,t,e,function(t){i.eventHandlers.push({gesture:t,handler:e})}),i},off:function(t,e){var i=this;return w.off(i.element,t,e,function(t){var s=x.inArray({gesture:t,handler:e});s!==!1&&i.eventHandlers.splice(s,1)}),i},trigger:function(t,e){e||(e={});var i=a.DOCUMENT.createEvent("Event");i.initEvent(t,!0,!0),i.gesture=e;var s=this.element;return x.hasParent(e.target,s)&&(s=e.target),s.dispatchEvent(i),this},enable:function(t){return this.enabled=t,this},dispose:function(){var t,e;for(x.toggleBehavior(this.element,this.options.behavior,!1),t=-1;e=this.eventHandlers[++t];)x.off(this.element,e.gesture,e.handler);return this.eventHandlers=[],w.off(this.element,h[m],this.eventStartHandler),null}},function(t){function e(e,s){var o=M.current;if(!(s.options.dragMaxTouches>0&&e.touches.length>s.options.dragMaxTouches))switch(e.eventType){case m:i=!1;break;case v:if(e.distance0)){var r=Math.abs(s.options.dragMinDistance/e.distance);n.pageX+=e.deltaX*r,n.pageY+=e.deltaY*r,n.clientX+=e.deltaX*r,n.clientY+=e.deltaY*r,e=M.extendEventData(e)}(o.lastEvent.dragLockToAxis||s.options.dragLockToAxis&&s.options.dragLockMinDistance<=e.distance)&&(e.dragLockToAxis=!0);var a=o.lastEvent.direction;e.dragLockToAxis&&a!==e.direction&&(e.direction=x.isVertical(a)?e.deltaY<0?c:d:e.deltaX<0?l:p),i||(s.trigger(t+"start",e),i=!0),s.trigger(t,e),s.trigger(t+e.direction,e);var h=x.isVertical(e.direction);(s.options.dragBlockVertical&&h||s.options.dragBlockHorizontal&&!h)&&e.preventDefault();break;case b:i&&e.changedLength<=s.options.dragMaxTouches&&(s.trigger(t+"end",e),i=!1);break;case y:i=!1}}var i=!1;a.gestures.Drag={name:t,index:50,handler:e,defaults:{dragMinDistance:10,dragDistanceCorrection:!0,dragMaxTouches:1,dragBlockHorizontal:!1,dragBlockVertical:!1,dragLockToAxis:!1,dragLockMinDistance:25}}}("drag"),a.gestures.Gesture={name:"gesture",index:1337,handler:function(t,e){e.trigger(this.name,t)}},function(t){function e(e,s){var o=s.options,n=M.current;switch(e.eventType){case m:clearTimeout(i),n.name=t,i=setTimeout(function(){n&&n.name==t&&s.trigger(t,e)},o.holdTimeout);break;case v:e.distance>o.holdThreshold&&clearTimeout(i);break;case b:clearTimeout(i)}}var i;a.gestures.Hold={name:t,index:10,defaults:{holdTimeout:500,holdThreshold:2},handler:e}}("hold"),a.gestures.Release={name:"release",index:1/0,handler:function(t,e){t.eventType==b&&e.trigger(this.name,t)}},a.gestures.Swipe={name:"swipe",index:40,defaults:{swipeMinTouches:1,swipeMaxTouches:1,swipeVelocityX:.6,swipeVelocityY:.6},handler:function(t,e){if(t.eventType==b){var i=t.touches.length,s=e.options;if(is.swipeMaxTouches)return;(t.velocityX>s.swipeVelocityX||t.velocityY>s.swipeVelocityY)&&(e.trigger(this.name,t),e.trigger(this.name+t.direction,t))}}},function(t){function e(e,s){var o,n,r=s.options,a=M.current,h=M.previous;switch(e.eventType){case m:i=!1;break;case v:i=i||e.distance>r.tapMaxDistance;break;case y:!x.inStr(e.srcEvent.type,"cancel")&&e.deltaTimes.options.transformMinRotation&&s.trigger("rotate",e),o>s.options.transformMinScale&&(s.trigger("pinch",e),s.trigger("pinch"+(e.scale<1?"in":"out"),e));break;case b:i&&e.changedLength<2&&(s.trigger(t+"end",e),i=!1)}}var i=!1;a.gestures.Transform={name:t,index:45,defaults:{transformMinScale:.01,transformMinRotation:1},handler:e}}("transform"),s=function(){return a}.call(e,i,e,t),!(s!==n&&(t.exports=s))}(window)},function(t,e,i){function s(t,e){var i=h().hours(0).minutes(0).seconds(0).milliseconds(0);this.start=i.clone().add("days",-3).valueOf(),this.end=i.clone().add("days",4).valueOf(),this.body=t,this.defaultOptions={start:null,end:null,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10},this.options=r.extend({},this.defaultOptions),this.props={touch:{}},this.body.emitter.on("dragstart",this._onDragStart.bind(this)),this.body.emitter.on("drag",this._onDrag.bind(this)),this.body.emitter.on("dragend",this._onDragEnd.bind(this)),this.body.emitter.on("hold",this._onHold.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("DOMMouseScroll",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.setOptions(e)}function o(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}function n(t,e){return{x:t.pageX-r.getAbsoluteLeft(e),y:t.pageY-r.getAbsoluteTop(e)}}var r=i(1),a=i(21),h=i(2),d=i(22);s.prototype=new d,s.prototype.setOptions=function(t){if(t){var e=["direction","min","max","zoomMin","zoomMax","moveable","zoomable"];r.selectiveExtend(e,this.options,t),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},s.prototype.setRange=function(t,e){var i=this._applyRange(t,e);if(i){var s={start:new Date(this.start),end:new Date(this.end)};this.body.emitter.emit("rangechange",s),this.body.emitter.emit("rangechanged",s)}},s.prototype._applyRange=function(t,e){var i,s=null!=t?r.convert(t,"Date").valueOf():this.start,o=null!=e?r.convert(e,"Date").valueOf():this.end,n=null!=this.options.max?r.convert(this.options.max,"Date").valueOf():null,a=null!=this.options.min?r.convert(this.options.min,"Date").valueOf():null;if(isNaN(s)||null===s)throw new Error('Invalid start "'+t+'"');if(isNaN(o)||null===o)throw new Error('Invalid end "'+e+'"');if(s>o&&(o=s),null!==a&&a>s&&(i=a-s,s+=i,o+=i,null!=n&&o>n&&(o=n)),null!==n&&o>n&&(i=o-n,s-=i,o-=i,null!=a&&a>s&&(s=a)),null!==this.options.zoomMin){var h=parseFloat(this.options.zoomMin);0>h&&(h=0),h>o-s&&(this.end-this.start===h?(s=this.start,o=this.end):(i=h-(o-s),s-=i/2,o+=i/2))}if(null!==this.options.zoomMax){var d=parseFloat(this.options.zoomMax);0>d&&(d=0),o-s>d&&(this.end-this.start===d?(s=this.start,o=this.end):(i=o-s-d,s+=i/2,o-=i/2))}var l=this.start!=s||this.end!=o;return this.start=s,this.end=o,l},s.prototype.getRange=function(){return{start:this.start,end:this.end}},s.prototype.conversion=function(t){return s.conversion(this.start,this.end,t)},s.conversion=function(t,e,i){return 0!=i&&e-t!=0?{offset:t,scale:i/(e-t)}:{offset:0,scale:1}},s.prototype._onDragStart=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.start=this.start,this.props.touch.end=this.end,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},s.prototype._onDrag=function(t){if(this.options.moveable){var e=this.options.direction;if(o(e),this.props.touch.allowDragging){var i="horizontal"==e?t.gesture.deltaX:t.gesture.deltaY,s=this.props.touch.end-this.props.touch.start,n="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height,r=-i/n*s;this._applyRange(this.props.touch.start+r,this.props.touch.end+r),this.body.emitter.emit("rangechange",{start:new Date(this.start),end:new Date(this.end)})}}},s.prototype._onDragEnd=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end)}))},s.prototype._onMouseWheel=function(t){if(this.options.zoomable&&this.options.moveable){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i;i=0>e?1-e/5:1/(1+e/5);var s=a.fakeGesture(this,t),o=n(s.center,this.body.dom.center),r=this._pointerToDate(o);this.zoom(i,r)}t.preventDefault()}},s.prototype._onTouch=function(){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null},s.prototype._onHold=function(){this.props.touch.allowDragging=!1},s.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable&&(this.props.touch.allowDragging=!1,t.gesture.touches.length>1)){this.props.touch.center||(this.props.touch.center=n(t.gesture.center,this.body.dom.center));var e=1/t.gesture.scale,i=this._pointerToDate(this.props.touch.center),s=parseInt(i+(this.props.touch.start-i)*e),o=parseInt(i+(this.props.touch.end-i)*e);this.setRange(s,o)}},s.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(o(i),"horizontal"==i){var s=this.body.domProps.center.width;return e=this.conversion(s),t.x/e.scale+e.offset}var n=this.body.domProps.center.height;return e=this.conversion(n),t.y/e.scale+e.offset},s.prototype.zoom=function(t,e){null==e&&(e=(this.start+this.end)/2);var i=e+(this.start-e)*t,s=e+(this.end-e)*t;this.setRange(i,s)},s.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,s=this.end+e*t;this.start=i,this.end=s},s.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,s=this.start-i,o=this.end-i;this.setRange(s,o)},t.exports=s},function(t,e,i){var s=i(18);e.fakeGesture=function(t,e){var i=null,o=s.event.getTouchList(e,i),n=s.event.collectEventData(this,i,o,e);return isNaN(n.center.pageX)&&(n.center.pageX=e.pageX),isNaN(n.center.pageY)&&(n.center.pageY=e.pageY),n}},function(t){function e(){this.options=null,this.props=null}e.prototype.setOptions=function(t){t&&util.extend(this.options,t)},e.prototype.redraw=function(){return!1},e.prototype.destroy=function(){},e.prototype._isResized=function(){var t=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;return this.props._previousWidth=this.props.width,this.props._previousHeight=this.props.height,t},t.exports=e},function(t,e,i){function s(){}var o=i(10),n=i(18),r=i(1),a=(i(7),i(8),i(20),i(24),i(26),i(28),i(29),i(36));o(s.prototype),s.prototype._create=function(t){this.dom={},this.dom.root=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.backgroundVertical=document.createElement("div"),this.dom.backgroundHorizontal=document.createElement("div"),this.dom.centerContainer=document.createElement("div"),this.dom.leftContainer=document.createElement("div"),this.dom.rightContainer=document.createElement("div"),this.dom.center=document.createElement("div"),this.dom.left=document.createElement("div"),this.dom.right=document.createElement("div"),this.dom.top=document.createElement("div"),this.dom.bottom=document.createElement("div"),this.dom.shadowTop=document.createElement("div"),this.dom.shadowBottom=document.createElement("div"),this.dom.shadowTopLeft=document.createElement("div"),this.dom.shadowBottomLeft=document.createElement("div"),this.dom.shadowTopRight=document.createElement("div"),this.dom.shadowBottomRight=document.createElement("div"),this.dom.root.className="vis timeline root",this.dom.background.className="vispanel background",this.dom.backgroundVertical.className="vispanel background vertical",this.dom.backgroundHorizontal.className="vispanel background horizontal",this.dom.centerContainer.className="vispanel center",this.dom.leftContainer.className="vispanel left",this.dom.rightContainer.className="vispanel right",this.dom.top.className="vispanel top",this.dom.bottom.className="vispanel bottom",this.dom.left.className="content",this.dom.center.className="content",this.dom.right.className="content",this.dom.shadowTop.className="shadow top",this.dom.shadowBottom.className="shadow bottom",this.dom.shadowTopLeft.className="shadow top",this.dom.shadowBottomLeft.className="shadow bottom",this.dom.shadowTopRight.className="shadow top",this.dom.shadowBottomRight.className="shadow bottom",this.dom.root.appendChild(this.dom.background),this.dom.root.appendChild(this.dom.backgroundVertical),this.dom.root.appendChild(this.dom.backgroundHorizontal),this.dom.root.appendChild(this.dom.centerContainer),this.dom.root.appendChild(this.dom.leftContainer),this.dom.root.appendChild(this.dom.rightContainer),this.dom.root.appendChild(this.dom.top),this.dom.root.appendChild(this.dom.bottom),this.dom.centerContainer.appendChild(this.dom.center),this.dom.leftContainer.appendChild(this.dom.left),this.dom.rightContainer.appendChild(this.dom.right),this.dom.centerContainer.appendChild(this.dom.shadowTop),this.dom.centerContainer.appendChild(this.dom.shadowBottom),this.dom.leftContainer.appendChild(this.dom.shadowTopLeft),this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft),this.dom.rightContainer.appendChild(this.dom.shadowTopRight),this.dom.rightContainer.appendChild(this.dom.shadowBottomRight),this.on("rangechange",this.redraw.bind(this)),this.on("change",this.redraw.bind(this)),this.on("touch",this._onTouch.bind(this)),this.on("pinch",this._onPinch.bind(this)),this.on("dragstart",this._onDragStart.bind(this)),this.on("drag",this._onDrag.bind(this)),this.hammer=n(this.dom.root,{prevent_default:!0}),this.listeners={};var e=this,i=["touch","pinch","tap","doubletap","hold","dragstart","drag","dragend","mousewheel","DOMMouseScroll"];if(i.forEach(function(t){var i=function(){var i=[t].concat(Array.prototype.slice.call(arguments,0));e.isActive()&&e.emit.apply(e,i)};e.hammer.on(t,i),e.listeners[t]=i}),this.props={root:{},background:{},centerContainer:{},leftContainer:{},rightContainer:{},center:{},left:{},right:{},top:{},bottom:{},border:{},scrollTop:0,scrollTopMin:0},this.touch={},!t)throw new Error("No container provided");t.appendChild(this.dom.root)},s.prototype.setOptions=function(t){if(t){var e=["width","height","minHeight","maxHeight","autoResize","start","end","orientation","clickToUse"];r.selectiveExtend(e,this.options,t),"clickToUse"in t&&(t.clickToUse?this.activator=new a(this.dom.root):this.activator&&(this.activator.destroy(),delete this.activator)),this._initAutoResize()}if(this.components.forEach(function(e){e.setOptions(t)}),t&&t.order)throw new Error("Option order is deprecated. There is no replacement for this feature.");this.redraw()},s.prototype.isActive=function(){return!this.activator||this.activator.active},s.prototype.destroy=function(){this.clear(),this.off(),this._stopAutoResize(),this.dom.root.parentNode&&this.dom.root.parentNode.removeChild(this.dom.root),this.dom=null,this.activator&&(this.activator.destroy(),delete this.activator);for(var t in this.listeners)this.listeners.hasOwnProperty(t)&&delete this.listeners[t];this.listeners=null,this.hammer=null,this.components.forEach(function(t){t.destroy()}),this.body=null},s.prototype.setCustomTime=function(t){if(!this.customTime)throw new Error("Cannot get custom time: Custom time bar is not enabled");this.customTime.setCustomTime(t)},s.prototype.getCustomTime=function(){if(!this.customTime)throw new Error("Cannot get custom time: Custom time bar is not enabled");return this.customTime.getCustomTime()},s.prototype.getVisibleItems=function(){return this.itemSet&&this.itemSet.getVisibleItems()||[]},s.prototype.clear=function(t){(!t||t.items)&&this.setItems(null),(!t||t.groups)&&this.setGroups(null),(!t||t.options)&&(this.components.forEach(function(t){t.setOptions(t.defaultOptions)}),this.setOptions(this.defaultOptions))},s.prototype.fit=function(){var t=this.getItemRange(),e=t.min,i=t.max;if(null!=e&&null!=i){var s=i.valueOf()-e.valueOf();0>=s&&(s=864e5),e=new Date(e.valueOf()-.05*s),i=new Date(i.valueOf()+.05*s)}(null!==e||null!==i)&&this.range.setRange(e,i)},s.prototype.setWindow=function(t,e){if(1==arguments.length){var i=arguments[0];this.range.setRange(i.start,i.end)}else this.range.setRange(t,e)},s.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},s.prototype.redraw=function(){var t=!1,e=this.options,i=this.props,s=this.dom;if(s){"top"==e.orientation?(r.addClassName(s.root,"top"),r.removeClassName(s.root,"bottom")):(r.removeClassName(s.root,"top"),r.addClassName(s.root,"bottom")),s.root.style.maxHeight=r.option.asSize(e.maxHeight,""),s.root.style.minHeight=r.option.asSize(e.minHeight,""),s.root.style.width=r.option.asSize(e.width,""),i.border.left=(s.centerContainer.offsetWidth-s.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(s.centerContainer.offsetHeight-s.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var o=s.root.offsetHeight-s.root.clientHeight,n=s.root.offsetWidth-s.root.clientWidth;i.center.height=s.center.offsetHeight,i.left.height=s.left.offsetHeight,i.right.height=s.right.offsetHeight,i.top.height=s.top.clientHeight||-i.border.top,i.bottom.height=s.bottom.clientHeight||-i.border.bottom;var a=Math.max(i.left.height,i.center.height,i.right.height),h=i.top.height+a+i.bottom.height+o+i.border.top+i.border.bottom; s.root.style.height=r.option.asSize(e.height,h+"px"),i.root.height=s.root.offsetHeight,i.background.height=i.root.height-o;var d=i.root.height-i.top.height-i.bottom.height-o;i.centerContainer.height=d,i.leftContainer.height=d,i.rightContainer.height=i.leftContainer.height,i.root.width=s.root.offsetWidth,i.background.width=i.root.width-n,i.left.width=s.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=s.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var l=i.root.width-i.left.width-i.right.width-n;i.center.width=l,i.centerContainer.width=l,i.top.width=l,i.bottom.width=l,s.background.style.height=i.background.height+"px",s.backgroundVertical.style.height=i.background.height+"px",s.backgroundHorizontal.style.height=i.centerContainer.height+"px",s.centerContainer.style.height=i.centerContainer.height+"px",s.leftContainer.style.height=i.leftContainer.height+"px",s.rightContainer.style.height=i.rightContainer.height+"px",s.background.style.width=i.background.width+"px",s.backgroundVertical.style.width=i.centerContainer.width+"px",s.backgroundHorizontal.style.width=i.background.width+"px",s.centerContainer.style.width=i.center.width+"px",s.top.style.width=i.top.width+"px",s.bottom.style.width=i.bottom.width+"px",s.background.style.left="0",s.background.style.top="0",s.backgroundVertical.style.left=i.left.width+"px",s.backgroundVertical.style.top="0",s.backgroundHorizontal.style.left="0",s.backgroundHorizontal.style.top=i.top.height+"px",s.centerContainer.style.left=i.left.width+"px",s.centerContainer.style.top=i.top.height+"px",s.leftContainer.style.left="0",s.leftContainer.style.top=i.top.height+"px",s.rightContainer.style.left=i.left.width+i.center.width+"px",s.rightContainer.style.top=i.top.height+"px",s.top.style.left=i.left.width+"px",s.top.style.top="0",s.bottom.style.left=i.left.width+"px",s.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var c=this.props.scrollTop;"bottom"==e.orientation&&(c+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),s.center.style.left="0",s.center.style.top=c+"px",s.left.style.left="0",s.left.style.top=c+"px",s.right.style.left="0",s.right.style.top=c+"px";var p=0==this.props.scrollTop?"hidden":"",u=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";s.shadowTop.style.visibility=p,s.shadowBottom.style.visibility=u,s.shadowTopLeft.style.visibility=p,s.shadowBottomLeft.style.visibility=u,s.shadowTopRight.style.visibility=p,s.shadowBottomRight.style.visibility=u,this.components.forEach(function(e){t=e.redraw()||t}),t&&this.redraw()}},s.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},s.prototype._toTime=function(t){var e=this.range.conversion(this.props.center.width);return new Date(t/e.scale+e.offset)},s.prototype._toGlobalTime=function(t){var e=this.range.conversion(this.props.root.width);return new Date(t/e.scale+e.offset)},s.prototype._toScreen=function(t){var e=this.range.conversion(this.props.center.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._toGlobalScreen=function(t){var e=this.range.conversion(this.props.root.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},s.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){return 1!=t.options.autoResize?void t._stopAutoResize():void(t.dom.root&&(t.dom.root.clientWidth!=t.props.lastWidth||t.dom.root.clientHeight!=t.props.lastHeight)&&(t.props.lastWidth=t.dom.root.clientWidth,t.props.lastHeight=t.dom.root.clientHeight,t.emit("change")))},r.addEventListener(window,"resize",this._onResize),this.watchTimer=setInterval(this._onResize,1e3)},s.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),r.removeEventListener(window,"resize",this._onResize),this._onResize=null},s.prototype._onTouch=function(){this.touch.allowDragging=!0},s.prototype._onPinch=function(){this.touch.allowDragging=!1},s.prototype._onDragStart=function(){this.touch.initialScrollTop=this.props.scrollTop},s.prototype._onDrag=function(t){if(this.touch.allowDragging){var e=t.gesture.deltaY,i=this._getScrollTop(),s=this._setScrollTop(this.touch.initialScrollTop+e);s!=i&&this.redraw()}},s.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},s.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("bottom"==this.options.orientation&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTopd;){d++;var l=n.getCurrent(),c=this.body.util.toScreen(l),p=n.isMajor();this.options.showMinorLabels&&this._repaintMinorText(c,n.getLabelMinor(),t),p&&this.options.showMajorLabels?(c>0&&(void 0==h&&(h=c),this._repaintMajorText(c,n.getLabelMajor(),t)),this._repaintMajorLine(c,t)):this._repaintMinorLine(c,t),n.next()}if(this.options.showMajorLabels){var u=this.body.util.toTime(0),f=n.getLabelMajor(u),g=f.length*(this.props.majorCharWidth||10)+10;(void 0==h||h>g)&&this._repaintMajorText(0,f,t)}o.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},s.prototype._repaintMinorText=function(t,e,i){var s=this.dom.redundant.minorTexts.shift();if(!s){var o=document.createTextNode("");s=document.createElement("div"),s.appendChild(o),s.className="text minor",this.dom.foreground.appendChild(s)}this.dom.minorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?this.props.majorLabelHeight+"px":"0",s.style.left=t+"px"},s.prototype._repaintMajorText=function(t,e,i){var s=this.dom.redundant.majorTexts.shift();if(!s){var o=document.createTextNode(e);s=document.createElement("div"),s.className="text major",s.appendChild(o),this.dom.foreground.appendChild(s)}this.dom.majorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?"0":this.props.minorLabelHeight+"px",s.style.left=t+"px"},s.prototype._repaintMinorLine=function(t,e){var i=this.dom.redundant.minorLines.shift();i||(i=document.createElement("div"),i.className="grid vertical minor",this.dom.background.appendChild(i)),this.dom.minorLines.push(i);var s=this.props;i.style.top="top"==e?s.majorLabelHeight+"px":this.body.domProps.top.height+"px",i.style.height=s.minorLineHeight+"px",i.style.left=t-s.minorLineWidth/2+"px"},s.prototype._repaintMajorLine=function(t,e){var i=this.dom.redundant.majorLines.shift();i||(i=document.createElement("DIV"),i.className="grid vertical major",this.dom.background.appendChild(i)),this.dom.majorLines.push(i);var s=this.props;i.style.top="top"==e?"0":this.body.domProps.top.height+"px",i.style.left=t-s.majorLineWidth/2+"px",i.style.height=s.majorLineHeight+"px"},s.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="text minor measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="text minor measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth},s.prototype.snap=function(t){return this.step.snap(t)},t.exports=s},function(t,e,i){function s(t,e,i){this.current=new Date,this._start=new Date,this._end=new Date,this.autoScale=!0,this.scale=s.SCALE.DAY,this.step=1,this.setRange(t,e,i)}var o=i(2);s.SCALE={MILLISECOND:1,SECOND:2,MINUTE:3,HOUR:4,DAY:5,WEEKDAY:6,MONTH:7,YEAR:8},s.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?new Date(t.valueOf()):new Date,this._end=void 0!=e?new Date(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},s.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},s.prototype.roundToMinor=function(){switch(this.scale){case s.SCALE.YEAR:this.current.setFullYear(this.step*Math.floor(this.current.getFullYear()/this.step)),this.current.setMonth(0);case s.SCALE.MONTH:this.current.setDate(1);case s.SCALE.DAY:case s.SCALE.WEEKDAY:this.current.setHours(0);case s.SCALE.HOUR:this.current.setMinutes(0);case s.SCALE.MINUTE:this.current.setSeconds(0);case s.SCALE.SECOND:this.current.setMilliseconds(0)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.setMilliseconds(this.current.getMilliseconds()-this.current.getMilliseconds()%this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()-this.current.getSeconds()%this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()-this.current.getMinutes()%this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()-this.current.getHours()%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()-1-(this.current.getDate()-1)%this.step+1);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()-this.current.getMonth()%this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()-this.current.getFullYear()%this.step)}},s.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},s.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current=new Date(this.current.valueOf()+1e3*this.step);break;case s.SCALE.MINUTE:this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case s.SCALE.HOUR:this.current=new Date(this.current.valueOf()+1e3*this.step*60*60);var e=this.current.getHours();this.current.setHours(e-e%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}else switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()+this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()+this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()+this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.getMilliseconds()0&&(this.step=e),this.autoScale=!1},s.prototype.setAutoScale=function(t){this.autoScale=t},s.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,o=864e5,n=36e5,r=6e4,a=1e3,h=1;1e3*e>t&&(this.scale=s.SCALE.YEAR,this.step=1e3),500*e>t&&(this.scale=s.SCALE.YEAR,this.step=500),100*e>t&&(this.scale=s.SCALE.YEAR,this.step=100),50*e>t&&(this.scale=s.SCALE.YEAR,this.step=50),10*e>t&&(this.scale=s.SCALE.YEAR,this.step=10),5*e>t&&(this.scale=s.SCALE.YEAR,this.step=5),e>t&&(this.scale=s.SCALE.YEAR,this.step=1),3*i>t&&(this.scale=s.SCALE.MONTH,this.step=3),i>t&&(this.scale=s.SCALE.MONTH,this.step=1),5*o>t&&(this.scale=s.SCALE.DAY,this.step=5),2*o>t&&(this.scale=s.SCALE.DAY,this.step=2),o>t&&(this.scale=s.SCALE.DAY,this.step=1),o/2>t&&(this.scale=s.SCALE.WEEKDAY,this.step=1),4*n>t&&(this.scale=s.SCALE.HOUR,this.step=4),n>t&&(this.scale=s.SCALE.HOUR,this.step=1),15*r>t&&(this.scale=s.SCALE.MINUTE,this.step=15),10*r>t&&(this.scale=s.SCALE.MINUTE,this.step=10),5*r>t&&(this.scale=s.SCALE.MINUTE,this.step=5),r>t&&(this.scale=s.SCALE.MINUTE,this.step=1),15*a>t&&(this.scale=s.SCALE.SECOND,this.step=15),10*a>t&&(this.scale=s.SCALE.SECOND,this.step=10),5*a>t&&(this.scale=s.SCALE.SECOND,this.step=5),a>t&&(this.scale=s.SCALE.SECOND,this.step=1),200*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=200),100*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=100),50*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=50),10*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=10),5*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=5),h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=1)}},s.prototype.snap=function(t){var e=new Date(t.valueOf());if(this.scale==s.SCALE.YEAR){var i=e.getFullYear()+Math.round(e.getMonth()/12);e.setFullYear(Math.round(i/this.step)*this.step),e.setMonth(0),e.setDate(0),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MONTH)e.getDate()>15?(e.setDate(1),e.setMonth(e.getMonth()+1)):e.setDate(1),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0);else if(this.scale==s.SCALE.DAY){switch(this.step){case 5:case 2:e.setHours(24*Math.round(e.getHours()/24));break;default:e.setHours(12*Math.round(e.getHours()/12))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.WEEKDAY){switch(this.step){case 5:case 2:e.setHours(12*Math.round(e.getHours()/12));break;default:e.setHours(6*Math.round(e.getHours()/6))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.HOUR){switch(this.step){case 4:e.setMinutes(60*Math.round(e.getMinutes()/60));break;default:e.setMinutes(30*Math.round(e.getMinutes()/30))}e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MINUTE){switch(this.step){case 15:case 10:e.setMinutes(5*Math.round(e.getMinutes()/5)),e.setSeconds(0);break;case 5:e.setSeconds(60*Math.round(e.getSeconds()/60));break;default:e.setSeconds(30*Math.round(e.getSeconds()/30))}e.setMilliseconds(0)}else if(this.scale==s.SCALE.SECOND)switch(this.step){case 15:case 10:e.setSeconds(5*Math.round(e.getSeconds()/5)),e.setMilliseconds(0);break;case 5:e.setMilliseconds(1e3*Math.round(e.getMilliseconds()/1e3));break;default:e.setMilliseconds(500*Math.round(e.getMilliseconds()/500))}else if(this.scale==s.SCALE.MILLISECOND){var o=this.step>5?this.step/2:1;e.setMilliseconds(Math.round(e.getMilliseconds()/o)*o)}return e},s.prototype.isMajor=function(){switch(this.scale){case s.SCALE.MILLISECOND:return 0==this.current.getMilliseconds();case s.SCALE.SECOND:return 0==this.current.getSeconds();case s.SCALE.MINUTE:return 0==this.current.getHours()&&0==this.current.getMinutes();case s.SCALE.HOUR:return 0==this.current.getHours();case s.SCALE.WEEKDAY:case s.SCALE.DAY:return 1==this.current.getDate();case s.SCALE.MONTH:return 0==this.current.getMonth();case s.SCALE.YEAR:return!1;default:return!1}},s.prototype.getLabelMinor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("SSS");case s.SCALE.SECOND:return o(t).format("s");case s.SCALE.MINUTE:return o(t).format("HH:mm");case s.SCALE.HOUR:return o(t).format("HH:mm");case s.SCALE.WEEKDAY:return o(t).format("ddd D");case s.SCALE.DAY:return o(t).format("D");case s.SCALE.MONTH:return o(t).format("MMM");case s.SCALE.YEAR:return o(t).format("YYYY");default:return""}},s.prototype.getLabelMajor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("HH:mm:ss");case s.SCALE.SECOND:return o(t).format("D MMMM HH:mm");case s.SCALE.MINUTE:case s.SCALE.HOUR:return o(t).format("ddd D MMMM");case s.SCALE.WEEKDAY:case s.SCALE.DAY:return o(t).format("MMMM YYYY");case s.SCALE.MONTH:return o(t).format("YYYY");case s.SCALE.YEAR:return"";default:return""}},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCurrentTime:!0,locales:a,locale:"en"},this.options=o.extend({},this.defaultOptions),this._create(),this.setOptions(e)}var o=i(1),n=i(22),r=i(2),a=i(27);s.prototype=new n,s.prototype._create=function(){var t=document.createElement("div");t.className="currenttime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},s.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},s.prototype.setOptions=function(t){t&&o.selectiveExtend(["showCurrentTime","locale","locales"],this.options,t)},s.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=new Date,i=this.body.util.toScreen(e),s=this.options.locales[this.options.locale],o=s.current+" "+s.time+": "+r(e).format("dddd, MMMM Do YYYY, H:mm:ss");o=o.charAt(0).toUpperCase()+o.substring(1),this.bar.style.left=i+"px",this.bar.title=o}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},s.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,s=1/i/10;30>s&&(s=30),s>1e3&&(s=1e3),e.redraw(),e.currentTimeTimer=setTimeout(t,s)}var e=this;t()},s.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},t.exports=s},function(t,e){e.en={current:"current",time:"time"},e.en_EN=e.en,e.en_US=e.en,e.nl={custom:"aangepaste",time:"tijd"},e.nl_NL=e.nl,e.nl_BE=e.nl},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCustomTime:!1,locales:h,locale:"en"},this.options=n.extend({},this.defaultOptions),this.customTime=new Date,this.eventParams={},this._create(),this.setOptions(e)}var o=i(18),n=i(1),r=i(22),a=i(2),h=i(27);s.prototype=new r,s.prototype.setOptions=function(t){t&&n.selectiveExtend(["showCustomTime","locale","locales"],this.options,t)},s.prototype._create=function(){var t=document.createElement("div");t.className="customtime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t;var e=document.createElement("div");e.style.position="relative",e.style.top="0px",e.style.left="-10px",e.style.height="100%",e.style.width="20px",t.appendChild(e),this.hammer=o(t,{prevent_default:!0}),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this))},s.prototype.destroy=function(){this.options.showCustomTime=!1,this.redraw(),this.hammer.enable(!1),this.hammer=null,this.body=null},s.prototype.redraw=function(){if(this.options.showCustomTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar));var e=this.body.util.toScreen(this.customTime),i=this.options.locales[this.options.locale],s=i.time+": "+a(this.customTime).format("dddd, MMMM Do YYYY, H:mm:ss");s=s.charAt(0).toUpperCase()+s.substring(1),this.bar.style.left=e+"px",this.bar.title=s}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar);return!1},s.prototype.setCustomTime=function(t){this.customTime=new Date(t.valueOf()),this.redraw()},s.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())},s.prototype._onDragStart=function(t){this.eventParams.dragging=!0,this.eventParams.customTime=this.customTime,t.stopPropagation(),t.preventDefault()},s.prototype._onDrag=function(t){if(this.eventParams.dragging){var e=t.gesture.deltaX,i=this.body.util.toScreen(this.eventParams.customTime)+e,s=this.body.util.toTime(i);this.setCustomTime(s),this.body.emitter.emit("timechange",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault()}},s.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.body.emitter.emit("timechanged",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault())},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={type:null,orientation:"bottom",align:"center",stack:!0,groupOrder:null,selectable:!0,editable:{updateTime:!1,updateGroup:!1,add:!1,remove:!1},onAdd:function(t,e){e(t)},onUpdate:function(t,e){e(t)},onMove:function(t,e){e(t)},onRemove:function(t,e){e(t)},margin:{item:{horizontal:10,vertical:10},axis:20},padding:5},this.options=r.extend({},this.defaultOptions),this.itemOptions={type:{start:"Date",end:"Date"}},this.conversion={toScreen:t.util.toScreen,toTime:t.util.toTime},this.dom={},this.props={},this.hammer=null;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.groups={},this.groupIds=[],this.selection=[],this.stackDirty=!0,this.touchParams={},this._create(),this.setOptions(e)}function o(t,e){if(e&&e.groupId!=t.data.group){var i=t.parent;i.remove(t),i.order(),e.add(t),e.order(),t.data.group=e.groupId}}var n=i(18),r=i(1),a=i(7),h=i(8),d=i(22),l=i(30),c=i(34),p=i(35),u=i(32),f="__ungrouped__";s.prototype=new d,s.types={box:c,range:u,point:p},s.prototype._create=function(){var t=document.createElement("div");t.className="itemset",t["timeline-itemset"]=this,this.dom.frame=t;var e=document.createElement("div");e.className="background",t.appendChild(e),this.dom.background=e;var i=document.createElement("div");i.className="foreground",t.appendChild(i),this.dom.foreground=i;var s=document.createElement("div");s.className="axis",this.dom.axis=s;var o=document.createElement("div");o.className="labelset",this.dom.labelSet=o,this._updateUngrouped(),this.hammer=n(this.body.dom.centerContainer,{prevent_default:!0}),this.hammer.on("touch",this._onTouch.bind(this)),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this)),this.hammer.on("tap",this._onSelectItem.bind(this)),this.hammer.on("hold",this._onMultiSelectItem.bind(this)),this.hammer.on("doubletap",this._onAddItem.bind(this)),this.show()},s.prototype.setOptions=function(t){if(t){var e=["type","align","orientation","padding","stack","selectable","groupOrder"];r.selectiveExtend(e,this.options,t),"margin"in t&&("number"==typeof t.margin?(this.options.margin.axis=t.margin,this.options.margin.item.horizontal=t.margin,this.options.margin.item.vertical=t.margin):"object"==typeof t.margin&&(r.selectiveExtend(["axis"],this.options.margin,t.margin),"item"in t.margin&&("number"==typeof t.margin.item?(this.options.margin.item.horizontal=t.margin.item,this.options.margin.item.vertical=t.margin.item):"object"==typeof t.margin.item&&r.selectiveExtend(["horizontal","vertical"],this.options.margin.item,t.margin.item)))),"editable"in t&&("boolean"==typeof t.editable?(this.options.editable.updateTime=t.editable,this.options.editable.updateGroup=t.editable,this.options.editable.add=t.editable,this.options.editable.remove=t.editable):"object"==typeof t.editable&&r.selectiveExtend(["updateTime","updateGroup","add","remove"],this.options.editable,t.editable));var i=function(e){if(e in t){var i=t[e];if(!(i instanceof Function))throw new Error("option "+e+" must be a function "+e+"(item, callback)");this.options[e]=i}}.bind(this);["onAdd","onUpdate","onRemove","onMove"].forEach(i),this.markDirty()}},s.prototype.markDirty=function(){this.groupIds=[],this.stackDirty=!0},s.prototype.destroy=function(){this.hide(),this.setItems(null),this.setGroups(null),this.hammer=null,this.body=null,this.conversion=null},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.axis.parentNode&&this.dom.axis.parentNode.removeChild(this.dom.axis),this.dom.labelSet.parentNode&&this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame),this.dom.axis.parentNode||this.body.dom.top.appendChild(this.dom.axis),this.dom.labelSet.parentNode||this.body.dom.left.appendChild(this.dom.labelSet)},s.prototype.setSelection=function(t){var e,i,s,o;for(void 0==t&&(t=[]),Array.isArray(t)||(t=[t]),e=0,i=this.selection.length;i>e;e++)s=this.selection[e],o=this.items[s],o&&o.unselect();for(this.selection=[],e=0,i=t.length;i>e;e++)s=t[e],o=this.items[s],o&&(this.selection.push(s),o.select())},s.prototype.getSelection=function(){return this.selection.concat([])},s.prototype.getVisibleItems=function(){var t=this.body.range.getRange(),e=this.body.util.toScreen(t.start),i=this.body.util.toScreen(t.end),s=[];for(var o in this.groups)if(this.groups.hasOwnProperty(o))for(var n=this.groups[o],r=n.visibleItems,a=0;ae&&s.push(h.id)}return s},s.prototype._deselect=function(t){for(var e=this.selection,i=0,s=e.length;s>i;i++)if(e[i]==t){e.splice(i,1);break}},s.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=r.option.asSize,s=this.options,o=s.orientation,n=!1,a=this.dom.frame,h=s.editable.updateTime||s.editable.updateGroup;a.className="itemset"+(h?" editable":""),n=this._orderGroups()||n;var d=e.end-e.start,l=d!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;l&&(this.stackDirty=!0),this.lastVisibleInterval=d,this.props.lastWidth=this.props.width;var c=this.stackDirty,p=this._firstGroup(),u={item:t.item,axis:t.axis},f={item:t.item,axis:t.item.vertical/2},g=0,m=t.axis+t.item.vertical;return r.forEach(this.groups,function(t){var i=t==p?u:f,s=t.redraw(e,i,c);n=s||n,g+=t.height}),g=Math.max(g,m),this.stackDirty=!1,a.style.height=i(g),this.props.top=a.offsetTop,this.props.left=a.offsetLeft,this.props.width=a.offsetWidth,this.props.height=g,this.dom.axis.style.top=i("top"==o?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.dom.axis.style.left="0",n=this._isResized()||n},s.prototype._firstGroup=function(){var t="top"==this.options.orientation?0:this.groupIds.length-1,e=this.groupIds[t],i=this.groups[e]||this.groups[f];return i||null},s.prototype._updateUngrouped=function(){var t=this.groups[f];if(this.groupsData)t&&(t.hide(),delete this.groups[f]);else if(!t){var e=null,i=null;t=new l(e,i,this),this.groups[f]=t;for(var s in this.items)this.items.hasOwnProperty(s)&&t.add(this.items[s]);t.show()}},s.prototype.getLabelSet=function(){return this.dom.labelSet},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof a||t instanceof h))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(r.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var o=this.id;r.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,o)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}},s.prototype.getItems=function(){return this.itemsData},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(r.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof a||t instanceof h))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;r.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("change")},s.prototype.getGroups=function(){return this.groupsData},s.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t) -})},s.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i=e.itemsData.get(t,e.itemOptions),o=e.items[t],n=i.type||e.options.type||(i.end?"range":"box"),r=s.types[n];if(o&&(r&&o instanceof r?e._updateItem(o,i):(e._removeItem(o),o=null)),!o){if(!r)throw new TypeError("rangeoverflow"==n?'Item type "rangeoverflow" is deprecated. Use css styling instead: .vis.timeline .item.range .content {overflow: visible;}':'Unknown item type "'+n+'"');o=new r(i,e.conversion,e.options),o.id=t,e._addItem(o)}}),this._order(),this.stackDirty=!0,this.body.emitter.emit("change")},s.prototype._onAdd=s.prototype._onUpdate,s.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var s=i.items[t];s&&(e++,i._removeItem(s))}),e&&(this._order(),this.stackDirty=!0,this.body.emitter.emit("change"))},s.prototype._order=function(){r.forEach(this.groups,function(t){t.order()})},s.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},s.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),s=e.groups[t];if(s)s.setData(i);else{if(t==f)throw new Error("Illegal group id. "+t+" is a reserved id.");var o=Object.create(e.options);r.extend(o,{height:null}),s=new l(t,i,e),e.groups[t]=s;for(var n in e.items)if(e.items.hasOwnProperty(n)){var a=e.items[n];a.data.group==t&&s.add(a)}s.order(),s.show()}}),this.body.emitter.emit("change")},s.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("change")},s.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder}),e=!r.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},s.prototype._addItem=function(t){this.items[t.id]=t;var e=this.groupsData?t.data.group:f,i=this.groups[e];i&&i.add(t)},s.prototype._updateItem=function(t,e){var i=t.data.group;if(t.data=e,t.displayed&&t.redraw(),i!=t.data.group){var s=this.groups[i];s&&s.remove(t);var o=this.groupsData?t.data.group:f,n=this.groups[o];n&&n.add(t)}},s.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1);var i=this.groupsData?t.data.group:f,s=this.groups[i];s&&s.remove(t)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0||o.length>0)&&this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}},s.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=this.body.util.snap||null,o=s.itemFromTarget(t);if(o){var n=e.itemsData.get(o.id);this.options.onUpdate(n,function(t){t&&e.itemsData.update(t)})}else{var a=r.getAbsoluteLeft(this.dom.frame),h=t.gesture.center.pageX-a,d=this.body.util.toTime(h),l={start:i?i(d):d,content:"new item"};if("range"===this.options.type){var c=this.body.util.toTime(h+this.props.width/5);l.end=i?i(c):c}l[this.itemsData.fieldId]=r.randomUUID();var p=s.groupFromTarget(t);p&&(l.group=p.groupId),this.options.onAdd(l,function(t){t&&e.itemsData.add(l)})}}},s.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e,i=s.itemFromTarget(t);if(i){e=this.getSelection();var o=e.indexOf(i.id);-1==o?e.push(i.id):e.splice(o,1),this.setSelection(e),this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}}},s.itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},s.groupFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-group"))return e["timeline-group"];e=e.parentNode}return null},s.itemSetFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-itemset"))return e["timeline-itemset"];e=e.parentNode}return null},t.exports=s},function(t,e,i){function s(t,e,i){this.groupId=t,this.itemSet=i,this.dom={},this.props={label:{width:0,height:0}},this.className=null,this.items={},this.visibleItems=[],this.orderedItems={byStart:[],byEnd:[]},this._create(),this.setData(e)}var o=i(1),n=i(31),r=i(32);s.prototype._create=function(){var t=document.createElement("div");t.className="vlabel",this.dom.label=t;var e=document.createElement("div");e.className="inner",t.appendChild(e),this.dom.inner=e;var i=document.createElement("div");i.className="group",i["timeline-group"]=this,this.dom.foreground=i,this.dom.background=document.createElement("div"),this.dom.background.className="group",this.dom.axis=document.createElement("div"),this.dom.axis.className="group",this.dom.marker=document.createElement("div"),this.dom.marker.style.visibility="hidden",this.dom.marker.innerHTML="?",this.dom.background.appendChild(this.dom.marker)},s.prototype.setData=function(t){var e=t&&t.content;e instanceof Element?this.dom.inner.appendChild(e):this.dom.inner.innerHTML=void 0!==e&&null!==e?e:this.groupId||"",this.dom.label.title=t&&t.title||"",this.dom.inner.firstChild?o.removeClassName(this.dom.inner,"hidden"):o.addClassName(this.dom.inner,"hidden");var i=t&&t.className||null;i!=this.className&&(this.className&&(o.removeClassName(this.dom.label,i),o.removeClassName(this.dom.foreground,i),o.removeClassName(this.dom.background,i),o.removeClassName(this.dom.axis,i)),o.addClassName(this.dom.label,i),o.addClassName(this.dom.foreground,i),o.addClassName(this.dom.background,i),o.addClassName(this.dom.axis,i))},s.prototype.getLabelWidth=function(){return this.props.label.width},s.prototype.redraw=function(t,e,i){var s=!1;this.visibleItems=this._updateVisibleItems(this.orderedItems,this.visibleItems,t);var r=this.dom.marker.clientHeight;r!=this.lastMarkerHeight&&(this.lastMarkerHeight=r,o.forEach(this.items,function(t){t.dirty=!0,t.displayed&&t.redraw()}),i=!0),this.itemSet.options.stack?n.stack(this.visibleItems,e,i):n.nostack(this.visibleItems,e);var a,h=this.visibleItems;if(h.length){var d=h[0].top,l=h[0].top+h[0].height;if(o.forEach(h,function(t){d=Math.min(d,t.top),l=Math.max(l,t.top+t.height)}),d>e.axis){var c=d-e.axis;l-=c,o.forEach(h,function(t){t.top-=c})}a=l+e.item.vertical/2}else a=e.axis+e.item.vertical;a=Math.max(a,this.props.label.height);var p=this.dom.foreground;this.top=p.offsetTop,this.left=p.offsetLeft,this.width=p.offsetWidth,s=o.updateProperty(this,"height",a)||s,s=o.updateProperty(this.props.label,"width",this.dom.inner.clientWidth)||s,s=o.updateProperty(this.props.label,"height",this.dom.inner.clientHeight)||s,this.dom.background.style.height=a+"px",this.dom.foreground.style.height=a+"px",this.dom.label.style.height=a+"px";for(var u=0,f=this.visibleItems.length;f>u;u++){var g=this.visibleItems[u];g.repositionY()}return s},s.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},s.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var s=this.dom.axis;s.parentNode&&s.parentNode.removeChild(s)},s.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},s.prototype.remove=function(t){delete this.items[t.id],t.setParent(this.itemSet);var e=this.visibleItems.indexOf(t);-1!=e&&this.visibleItems.splice(e,1)},s.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},s.prototype.order=function(){var t=o.toArray(this.items);this.orderedItems.byStart=t,this.orderedItems.byEnd=this._constructByEndArray(t),n.orderByStart(this.orderedItems.byStart),n.orderByEnd(this.orderedItems.byEnd)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0)for(n=0;n=0&&!this._checkIfInvisible(t.byStart[n],r,i);n--);for(n=s+1;n=0&&!this._checkIfInvisible(t.byEnd[n],r,i);n--);for(n=a+1;no;o++)t[o].top=null;for(o=0,n=t.length;n>o;o++){var r=t[o];if(null===r.top){r.top=i.axis;do{for(var a=null,h=0,d=t.length;d>h;h++){var l=t[h];if(null!==l.top&&l!==r&&e.collision(r,l,i.item)){a=l;break}}null!=a&&(r.top=a.top+a.height+i.item.vertical)}while(a)}}},e.nostack=function(t,e){var i,s;for(i=0,s=t.length;s>i;i++)t[i].top=e.axis},e.collision=function(t,e,s){return t.left-s.horizontal+ie.left&&t.top-s.vertical+ie.top}},function(t,e,i){function s(t,e,i){if(this.props={content:{width:0}},this.overflow=!1,t){if(void 0==t.start)throw new Error('Property "start" missing in item '+t.id);if(void 0==t.end)throw new Error('Property "end" missing in item '+t.id)}n.call(this,t,e,i)}var o=i(18),n=i(33);s.prototype=new n(null,null,null),s.prototype.baseClassName="item range",s.prototype.isVisible=function(t){return this.data.startt.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),t.box["timeline-item"]=this),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.foreground;if(!e)throw new Error("Cannot redraw time axis: parent has no foreground container element");e.appendChild(t.box)}if(this.displayed=!0,this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)t.content.innerHTML="",t.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);t.content.innerHTML=this.content}this.dirty=!0}this.data.title!=this.title&&(t.box.title=this.data.title,this.title=this.data.title);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");this.className!=i&&(this.className=i,t.box.className=this.baseClassName+i,this.dirty=!0),this.dirty&&(this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dirty=!1),this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},s.prototype.show=function(){this.displayed||this.redraw()},s.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.top=null,this.left=null,this.displayed=!1}},s.prototype.repositionX=function(){var t,e=this.props,i=this.parent.width,s=this.conversion.toScreen(this.data.start),o=this.conversion.toScreen(this.data.end),n=this.options.padding;-i>s&&(s=-i),o>2*i&&(o=2*i);var r=Math.max(o-s,1);this.overflow?(t=Math.max(-s,0),this.left=s,this.width=r+this.props.content.width):(t=0>s?Math.min(-s,o-s-e.content.width-2*n):0,this.left=s,this.width=r),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=r+"px",this.dom.content.style.left=t+"px"},s.prototype.repositionY=function(){var t=this.options.orientation,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},s.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="drag-left",t.dragLeftItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragLeft=t}else!this.selected&&this.dom.dragLeft&&(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},s.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="drag-right",t.dragRightItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragRight=t}else!this.selected&&this.dom.dragRight&&(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=s},function(t,e,i){function s(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.dirty=!0,this.top=null,this.left=null,this.width=null,this.height=null}var o=i(18);s.prototype.select=function(){this.selected=!0,this.displayed&&this.redraw()},s.prototype.unselect=function(){this.selected=!1,this.displayed&&this.redraw()},s.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},s.prototype.isVisible=function(){return!1},s.prototype.show=function(){return!1},s.prototype.hide=function(){return!1},s.prototype.redraw=function(){},s.prototype.repositionX=function(){},s.prototype.repositionY=function(){},s.prototype._repaintDeleteButton=function(t){if(this.selected&&this.options.editable.remove&&!this.dom.deleteButton){var e=this,i=document.createElement("div");i.className="delete",i.title="Delete this item",o(i,{preventDefault:!0}).on("tap",function(t){e.parent.removeFromDataSet(e),t.stopPropagation()}),t.appendChild(i),this.dom.deleteButton=i}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);o.call(this,t,e,i)}var o=i(33);s.prototype=new o(null,null,null),s.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.startt.start-e&&this.data.start-1?!1:"INPUT"==i||"SELECT"==i||"TEXTAREA"==i||e.contentEditable&&"true"==e.contentEditable}function o(t,e){return t.sort().join(",")===e.sort().join(",")}function n(t){t=t||{};var e,i=!1;for(e in E)t[e]?i=!0:E[e]=0;i||(T=!1)}function r(t,e,i,s,n){var r,a,h=[];if(!M[t])return[];for("keyup"==i&&c(t)&&(e=[t]),r=0;r95&&112>t||_.hasOwnProperty(t)&&(y[_[t]]=t)}return y}function f(t,e,i){return i||(i=u()[t]?"keydown":"keypress"),"keypress"==i&&e.length&&(i="keydown"),i}function g(t,e,s,o){E[t]=0,o||(o=f(e[0],[]));var r,a=function(){T=o,++E[t],p()},d=function(t){h(s,t),"keyup"!==o&&(D=i(t)),setTimeout(n,10)};for(r=0;r1)return g(t,d,e,i);for(h="+"===t?["+"]:t.split("+"),n=0;n":".","?":"/","|":"\\"},S={option:"alt",command:"meta","return":"enter",escape:"esc"},M={},C={},E={},D=!1,T=!1,O=1;20>O;++O)_[111+O]="f"+O;for(O=0;9>=O;++O)_[O+96]=O;e(document,"keypress",l),e(document,"keydown",l),e(document,"keyup",l);var L={bind:function(t,e,i){return v(t instanceof Array?t:[t],e,i),C[t+":"+i]=e,this},unbind:function(t,e){return C[t+":"+e]&&(delete C[t+":"+e],this.bind(t,function(){},e)),this},trigger:function(t,e){return C[t+":"+e](),this},reset:function(){return M={},C={},this}};t.exports=L},function(t,e,i){function s(t,e,i,s){var n=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},util:{snap:null,toScreen:n._toScreen.bind(n),toGlobalScreen:n._toGlobalScreen.bind(n),toTime:n._toTime.bind(n),toGlobalTime:n._toGlobalTime.bind(n)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.linegraph=new p(this.body),this.components.push(this.linegraph),this.itemsData=null,this.groupsData=null,i&&this.setOptions(i),s&&this.setGroups(s),e?this.setItems(e):this.redraw()}var o=(i(10),i(18),i(1)),n=i(7),r=i(8),a=i(20),h=i(23),d=i(24),l=i(26),c=i(28),p=i(39);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.linegraph&&this.linegraph.setItems(e),i&&("start"in this.options||"end"in this.options)){this.fit();var s="start"in this.options?o.convert(this.options.start,"Date"):null,a="end"in this.options?o.convert(this.options.end,"Date"):null;this.setWindow(s,a)}},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.linegraph.setGroups(e)},s.prototype.getLegend=function(t,e,i){return void 0===e&&(e=15),void 0===i&&(i=15),void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].getLegend(e,i):"cannot find group:"+t},s.prototype.isGroupVisible=function(t){return void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].visible&&(void 0===this.options.groups.visibility[t]||1==this.options.groups.visibility[t]):!1},s.prototype.getItemRange=function(){var t=null,e=null;for(var i in this.linegraph.groups)if(this.linegraph.groups.hasOwnProperty(i)&&1==this.linegraph.groups[i].visible)for(var s=0;sr?r:t,e=null==e?r:r>e?r:e}return{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},t.exports=s},function(t,e,i){function s(t,e){this.id=o.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,handleOverlap:"overlap",align:"center"},catmullRom:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:"40px",visible:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}}},legend:{enabled:!1,icons:!0,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}},groups:{visibility:{}}},this.options=o.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={},this.abortedGraphUpdate=!1;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechange",function(){if(0!=i.lastStart){var t=i.body.range.start-i.lastStart,e=i.body.range.end-i.body.range.start; -if(0!=i.width){var s=i.width/e,o=t*s;i.svg.style.left=-i.width-o+"px"}}}),this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=o.option.asSize(-i.width),i._updateGraph.apply(i)}),this._create(),this.body.emitter.emit("change")}var o=i(1),n=i(6),r=i(7),a=i(8),h=i(22),d=i(40),l=i(42),c=i(43),p="__ungrouped__";s.prototype=new h,s.prototype._create=function(){var t=document.createElement("div");t.className="LineGraph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),this.options.dataAxis.orientation="right",this.yAxisRight=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),delete this.options.dataAxis.orientation,this.legendLeft=new c(this.body,this.options.legend,"left",this.options.groups),this.legendRight=new c(this.body,this.options.legend,"right",this.options.groups),this.show()},s.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort","groups"];o.selectiveDeepExtend(e,this.options,t),o.mergeOptions(this.options,t,"catmullRom"),o.mergeOptions(this.options,t,"drawPoints"),o.mergeOptions(this.options,t,"shaded"),o.mergeOptions(this.options,t,"legend"),t.catmullRom&&"object"==typeof t.catmullRom&&t.catmullRom.parametrization&&("uniform"==t.catmullRom.parametrization?this.options.catmullRom.alpha=0:"chordal"==t.catmullRom.parametrization?this.options.catmullRom.alpha=1:(this.options.catmullRom.parametrization="centripetal",this.options.catmullRom.alpha=.5)),this.yAxisLeft&&void 0!==t.dataAxis&&(this.yAxisLeft.setOptions(this.options.dataAxis),this.yAxisRight.setOptions(this.options.dataAxis)),this.legendLeft&&void 0!==t.legend&&(this.legendLeft.setOptions(this.options.legend),this.legendRight.setOptions(this.options.legend)),this.groups.hasOwnProperty(p)&&this.groups[p].setOptions(t)}this.dom.frame&&this._updateGraph()},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(o.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;o.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e)}this._updateUngrouped(),this._updateGraph(),this.redraw()},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(o.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;o.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._onUpdate()},s.prototype._onUpdate=function(){this._updateUngrouped(),this._updateAllGroupData(),this._updateGraph(),this.redraw()},s.prototype._onAdd=function(t){this._onUpdate(t)},s.prototype._onRemove=function(t){this._onUpdate(t)},s.prototype._onUpdateGroups=function(t){for(var e=0;e0){var d=this.body.util.toGlobalTime(-this.body.domProps.root.width),l=this.body.util.toGlobalTime(2*this.body.domProps.root.width),c={};for(this._getRelevantData(a,c,d,l),e=0;e0)for(r=0;rs){d.push(h);break}d.push(h)}}else for(a=0;ai&&h.x0)for(var s=0;s0){var n=1,r=o.length,a=this.body.util.toGlobalScreen(o[o.length-1].x)-this.body.util.toGlobalScreen(o[0].x),h=r/a;n=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=[],l=0;r>l;l+=n)d.push(o[l]);e[t[s]]=d}}},s.prototype._getYRanges=function(t,e,i){var s,o,n,r,a,h=[],d=[];if(t.length>0){for(n=0;n0)if(o=this.groups[t[n]],"line"==o.options.style||"stack"!=o.options.barChart.handleOverlap){var l=s[0].y,c=s[0].y;for(r=0;rs[r].y?s[r].y:l,c=c0&&(h.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x}),p={},this._getDataIntersections(p,h),i.__barchartLeft=this._getStackedBarYRange(p,h),i.__barchartLeft.yAxisOrientation="left",t.push("__barchartLeft")),d.length>0&&(d.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x}),p={},this._getDataIntersections(p,d),i.__barchartRight=this._getStackedBarYRange(p,d),i.__barchartRight.yAxisOrientation="right",t.push("__barchartRight"))}},s.prototype._getStackedBarYRange=function(t,e){for(var i,s=e[0].y,o=e[0].y,n=0;ne[n].y?e[n].y:s,o=ot[r].accumulated?t[r].accumulated:s,o=o0){for(var c=0;ci?i:a,d=s>d?s:d):(r=!0,h=h>i?i:h,l=s>l?s:l));1==n&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}return o=this._toggleAxisVisiblity(n,this.yAxisLeft)||o,o=this._toggleAxisVisiblity(r,this.yAxisRight)||o,1==r&&1==n?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!n,0==this.yAxisRight.master?(this.yAxisLeft.lineOffset=1==r?this.yAxisRight.width:0,o=this.yAxisLeft.redraw()||o,this.yAxisRight.stepPixelsForced=this.yAxisLeft.stepPixels,o=this.yAxisRight.redraw()||o):o=this.yAxisRight.redraw()||o,-1!=t.indexOf("__barchartLeft")&&t.splice(t.indexOf("__barchartLeft"),1),-1!=t.indexOf("__barchartRight")&&t.splice(t.indexOf("__barchartRight"),1),o},s.prototype._toggleAxisVisiblity=function(t,e){var i=!1;return 0==t?e.dom.frame.parentNode&&(e.hide(),i=!0):e.dom.frame.parentNode||(e.show(),i=!0),i},s.prototype._drawBarGraphs=function(t,e){var i,s,o,r,a,h,d=[],l={},c=0;for(a=0;a0&&(i=Math.min(i,Math.abs(d[a-1].x-s))),o=this._getSafeDrawData(i,r,p);else{var f=a+(l[s].amount-l[s].resolved),g=a-(l[s].resolved+1);f0&&(i=Math.min(i,Math.abs(d[g].x-s))),o=this._getSafeDrawData(i,r,p),l[s].resolved+=1,"stack"==r.options.barChart.handleOverlap?(u=l[s].accumulated,l[s].accumulated+=r.zeroPosition-d[a].y):"sideBySide"==r.options.barChart.handleOverlap&&(o.width=o.width/l[s].amount,o.offset+=l[s].resolved*o.width-.5*o.width*(l[s].amount+1),"left"==r.options.barChart.align?o.offset-=.5*o.width:"right"==r.options.barChart.align&&(o.offset+=.5*o.width))}n.drawBar(d[a].x+o.offset,d[a].y-u,o.width,r.zeroPosition-d[a].y,r.className+" bar",this.svgElements,this.svg),1==r.options.drawPoints.enabled&&n.drawPoint(d[a].x+o.offset,d[a].y-u,r,this.svgElements,this.svg)}},s.prototype._getDataIntersections=function(t,e){for(var i,s=0;s0&&(i=Math.min(i,Math.abs(e[s-1].x-e[s].x))),0==i&&(void 0===t[e[s].x]&&(t[e[s].x]={amount:0,resolved:0,accumulated:0}),t[e[s].x].amount+=1)},s.prototype._getSafeDrawData=function(t,e,i){var s,o;return t0?(s=i>t?i:t,o=0,"left"==e.options.barChart.align?o-=.5*t:"right"==e.options.barChart.align&&(o+=.5*t)):(s=e.options.barChart.width,o=0,"left"==e.options.barChart.align?o-=.5*e.options.barChart.width:"right"==e.options.barChart.align&&(o+=.5*e.options.barChart.width)),{width:s,offset:o}},s.prototype._drawLineGraph=function(t,e){if(null!=t&&t.length>0){var i,s,o=Number(this.svg.style.height.replace("px",""));if(i=n.getSVGElement("path",this.svgElements,this.svg),i.setAttributeNS(null,"class",e.className),s=1==e.options.catmullRom.enabled?this._catmullRom(t,e):this._linear(t),1==e.options.shaded.enabled){var r,a=n.getSVGElement("path",this.svgElements,this.svg);r="top"==e.options.shaded.orientation?"M"+t[0].x+",0 "+s+"L"+t[t.length-1].x+",0":"M"+t[0].x+","+o+" "+s+"L"+t[t.length-1].x+","+o,a.setAttributeNS(null,"class",e.className+" fill"),a.setAttributeNS(null,"d",r)}i.setAttributeNS(null,"d","M"+s),1==e.options.drawPoints.enabled&&this._drawPoints(t,e,this.svgElements,this.svg)}},s.prototype._drawPoints=function(t,e,i,s,o){void 0===o&&(o=0);for(var r=0;rl;l++)e=0==l?t[0]:t[l-1],i=t[l],s=t[l+1],o=d>l+2?t[l+2]:s,n={x:(-e.x+6*i.x+s.x)*h,y:(-e.y+6*i.y+s.y)*h},r={x:(i.x+6*s.x-o.x)*h,y:(i.y+6*s.y-o.y)*h},a+="C"+n.x+","+n.y+" "+r.x+","+r.y+" "+s.x+","+s.y+" ";return a},s.prototype._catmullRom=function(t,e){var i=e.options.catmullRom.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);for(var s,o,n,r,a,h,d,l,c,p,u,f,g,m,v,y,b,_,x,w=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",S=t.length,M=0;S-1>M;M++)s=0==M?t[0]:t[M-1],o=t[M],n=t[M+1],r=S>M+2?t[M+2]:n,d=Math.sqrt(Math.pow(s.x-o.x,2)+Math.pow(s.y-o.y,2)),l=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),c=Math.sqrt(Math.pow(n.x-r.x,2)+Math.pow(n.y-r.y,2)),m=Math.pow(c,i),y=Math.pow(c,2*i),v=Math.pow(l,i),b=Math.pow(l,2*i),x=Math.pow(d,i),_=Math.pow(d,2*i),p=2*_+3*x*v+b,u=2*y+3*m*v+b,f=3*x*(x+v),f>0&&(f=1/f),g=3*m*(m+v),g>0&&(g=1/g),a={x:(-b*s.x+p*o.x+_*n.x)*f,y:(-b*s.y+p*o.y+_*n.y)*f},h={x:(y*o.x+u*n.x-b*r.x)*g,y:(y*o.y+u*n.y-b*r.y)*g},0==a.x&&0==a.y&&(a=o),0==h.x&&0==h.y&&(h=n),w+="C"+a.x+","+a.y+" "+h.x+","+h.y+" "+n.x+","+n.y+" ";return w},s.prototype._linear=function(t){for(var e="",i=0;ih;h++)i.previous();o=this.height/s}else o+=.25;this.valueAtZero=i.marginEnd;var d=0,l=1;this.maxLabelSize=0;for(var c=0;l=0&&this._redrawLabel(c-2,i.getCurrent(),t,"yAxis major",this.props.majorCharHeight),this._redrawLine(c,t,"grid horizontal major",this.options.majorLinesOffset,this.props.majorLineWidth)):this._redrawLine(c,t,"grid horizontal minor",this.options.minorLinesOffset,this.props.minorLineWidth),l++}this.conversionFactor=0==this.master?c/(this.valueAtZero-i.current):this.dom.frame.offsetHeight/i.marginRange;var u=1==this.options.icons?this.options.iconWidth+this.options.labelOffsetX+15:this.options.labelOffsetX+15;return this.maxLabelSize>this.width-u&&1==this.options.visible?(this.width=this.maxLabelSize+u,this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+u),this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):(n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),!1)},s.prototype.convertValue=function(t){var e=this.valueAtZero-t,i=e*this.conversionFactor;return i},s.prototype._redrawLabel=function(t,e,i,s,o){var r=n.getDOMElement("div",this.DOMelements.labels,this.dom.frame);r.className=s,r.innerHTML=e,"left"==i?(r.style.left="-"+this.options.labelOffsetX+"px",r.style.textAlign="right"):(r.style.right="-"+this.options.labelOffsetX+"px",r.style.textAlign="left"),r.style.top=t-.5*o+this.options.labelOffsetY+"px",e+="";var a=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSizen&&(h=n);for(var d=!1,l=h;Math.abs(l)<=Math.abs(n);l++){a=Math.pow(10,l);for(var c=0;c=o){d=!0,r=c;break}}if(1==d)break}this.stepIndex=r,this.scale=a,this.step=a*this.minorSteps[r]},e.prototype.setFirst=function(t){void 0===t&&(t={});var e=void 0===t.min?this._start-2*this.scale*this.minorSteps[this.stepIndex]:t.min,i=void 0===t.max?this._end+this.scale*this.minorSteps[this.stepIndex]:t.max;this.marginEnd=void 0===t.max?this.roundToMinor(i):t.max,this.marginStart=void 0===t.min?this.roundToMinor(e):t.min,this.deadSpace=this.roundToMinor(i)-i+this.roundToMinor(e)-e,this.marginRange=this.marginEnd-this.marginStart,this.current=this.marginEnd},e.prototype.roundToMinor=function(t){var e=t-t%(this.scale*this.minorSteps[this.stepIndex]);return t%(this.scale*this.minorSteps[this.stepIndex])>.5*this.scale*this.minorSteps[this.stepIndex]?e+this.scale*this.minorSteps[this.stepIndex]:e},e.prototype.hasNext=function(){return this.current>=this.marginStart},e.prototype.next=function(){var t=this.current;this.current-=this.step,this.current==t&&(this.current=this._end)},e.prototype.previous=function(){this.current+=this.step,this.marginEnd+=this.step,this.marginRange=this.marginEnd-this.marginStart},e.prototype.getCurrent=function(){for(var t=""+Number(this.current).toPrecision(5),e=t.length-1;e>0;e--){if("0"!=t[e]){if("."==t[e]||","==t[e]){t=t.slice(0,e);break}break}t=t.slice(0,e)}return t},e.prototype.snap=function(){},e.prototype.isMajor=function(){return this.current%(this.scale*this.majorSteps[this.stepIndex])==0},t.exports=e},function(t,e,i){function s(t,e,i,s){this.id=e;var n=["sampling","style","sort","yAxisOrientation","barChart","drawPoints","shaded","catmullRom"];this.options=o.selectiveBridgeObject(n,i),this.usingDefaultStyle=void 0===t.className,this.groupsUsingDefaultStyles=s,this.zeroPosition=0,this.update(t),1==this.usingDefaultStyle&&(this.groupsUsingDefaultStyles[0]+=1),this.itemsData=[],this.visible=void 0===t.visible?!0:t.visible}var o=i(1),n=i(6);s.prototype.setItems=function(t){null!=t?(this.itemsData=t,1==this.options.sort&&this.itemsData.sort(function(t,e){return t.x-e.x})):this.itemsData=[]},s.prototype.setZeroPosition=function(t){this.zeroPosition=t},s.prototype.setOptions=function(t){if(void 0!==t){var e=["sampling","style","sort","yAxisOrientation","barChart"];o.selectiveDeepExtend(e,this.options,t),o.mergeOptions(this.options,t,"catmullRom"),o.mergeOptions(this.options,t,"drawPoints"),o.mergeOptions(this.options,t,"shaded"),t.catmullRom&&"object"==typeof t.catmullRom&&t.catmullRom.parametrization&&("uniform"==t.catmullRom.parametrization?this.options.catmullRom.alpha=0:"chordal"==t.catmullRom.parametrization?this.options.catmullRom.alpha=1:(this.options.catmullRom.parametrization="centripetal",this.options.catmullRom.alpha=.5))}},s.prototype.update=function(t){this.group=t,this.content=t.content||"graph",this.className=t.className||this.className||"graphGroup"+this.groupsUsingDefaultStyles[0]%10,this.visible=void 0===t.visible?!0:t.visible,this.setOptions(t.options)},s.prototype.drawIcon=function(t,e,i,s,o,r){var a,h,d=.5*r,l=n.getSVGElement("rect",i,s);if(l.setAttributeNS(null,"x",t),l.setAttributeNS(null,"y",e-d),l.setAttributeNS(null,"width",o),l.setAttributeNS(null,"height",2*d),l.setAttributeNS(null,"class","outline"),"line"==this.options.style)a=n.getSVGElement("path",i,s),a.setAttributeNS(null,"class",this.className),a.setAttributeNS(null,"d","M"+t+","+e+" L"+(t+o)+","+e),1==this.options.shaded.enabled&&(h=n.getSVGElement("path",i,s),"top"==this.options.shaded.orientation?h.setAttributeNS(null,"d","M"+t+", "+(e-d)+"L"+t+","+e+" L"+(t+o)+","+e+" L"+(t+o)+","+(e-d)):h.setAttributeNS(null,"d","M"+t+","+e+" L"+t+","+(e+d)+" L"+(t+o)+","+(e+d)+"L"+(t+o)+","+e),h.setAttributeNS(null,"class",this.className+" iconFill")),1==this.options.drawPoints.enabled&&n.drawPoint(t+.5*o,e,this,i,s);else{var c=Math.round(.3*o),p=Math.round(.4*r),u=Math.round(.75*r),f=Math.round((o-2*c)/3);n.drawBar(t+.5*c+f,e+d-p-1,c,p,this.className+" bar",i,s),n.drawBar(t+1.5*c+f+2,e+d-u-1,c,u,this.className+" bar",i,s)}},s.prototype.getLegend=function(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg","svg");return this.drawIcon(0,.5*e,[],i,t,e),{icon:i,label:this.content,orientation:this.options.yAxisOrientation}},t.exports=s},function(t,e,i){function s(t,e,i,s){this.body=t,this.defaultOptions={enabled:!0,icons:!0,iconSize:20,iconSpacing:6,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-left"}},this.side=i,this.options=o.extend({},this.defaultOptions),this.linegraphOptions=s,this.svgElements={},this.dom={},this.groups={},this.amountOfGroups=0,this._create(),this.setOptions(e)}var o=i(1),n=i(6),r=i(22);s.prototype=new r,s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.className="legend",this.dom.frame.style.position="absolute",this.dom.frame.style.top="10px",this.dom.frame.style.display="block",this.dom.textArea=document.createElement("div"),this.dom.textArea.className="legendText",this.dom.textArea.style.position="relative",this.dom.textArea.style.top="0px",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.width=this.options.iconSize+5+"px",this.dom.frame.appendChild(this.svg),this.dom.frame.appendChild(this.dom.textArea)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setOptions=function(t){var e=["enabled","orientation","icons","left","right"];o.selectiveDeepExtend(e,this.options,t)},s.prototype.redraw=function(){var t=0;for(var e in this.groups)this.groups.hasOwnProperty(e)&&(1!=this.groups[e].visible||void 0!==this.linegraphOptions.visibility[e]&&1!=this.linegraphOptions.visibility[e]||t++);if(0==this.options[this.side].visible||0==this.amountOfGroups||0==this.options.enabled||0==t)this.hide();else{this.show(),"top-left"==this.options[this.side].position||"bottom-left"==this.options[this.side].position?(this.dom.frame.style.left="4px",this.dom.frame.style.textAlign="left",this.dom.textArea.style.textAlign="left",this.dom.textArea.style.left=this.options.iconSize+15+"px",this.dom.textArea.style.right="",this.svg.style.left="0px",this.svg.style.right=""):(this.dom.frame.style.right="4px",this.dom.frame.style.textAlign="right",this.dom.textArea.style.textAlign="right",this.dom.textArea.style.right=this.options.iconSize+15+"px",this.dom.textArea.style.left="",this.svg.style.right="0px",this.svg.style.left=""),"top-left"==this.options[this.side].position||"top-right"==this.options[this.side].position?(this.dom.frame.style.top=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.bottom=""):(this.dom.frame.style.bottom=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.top=""),0==this.options.icons?(this.dom.frame.style.width=this.dom.textArea.offsetWidth+10+"px",this.dom.textArea.style.right="",this.dom.textArea.style.left="",this.svg.style.width="0px"):(this.dom.frame.style.width=this.options.iconSize+15+this.dom.textArea.offsetWidth+10+"px",this.drawLegendIcons()); -var i="";for(var e in this.groups)this.groups.hasOwnProperty(e)&&(1!=this.groups[e].visible||void 0!==this.linegraphOptions.visibility[e]&&1!=this.linegraphOptions.visibility[e]||(i+=this.groups[e].content+"
"));this.dom.textArea.innerHTML=i,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},s.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){n.prepareElements(this.svgElements);var t=window.getComputedStyle(this.dom.frame).paddingTop,e=Number(t.replace("px","")),i=e,s=this.options.iconSize,o=.75*this.options.iconSize,r=e+.5*o+3;this.svg.style.width=s+5+e+"px";for(var a in this.groups)this.groups.hasOwnProperty(a)&&(1!=this.groups[a].visible||void 0!==this.linegraphOptions.visibility[a]&&1!=this.linegraphOptions.visibility[a]||(this.groups[a].drawIcon(i,r,this.svgElements,this.svg,s,o),r+=o+this.options.iconSpacing));n.cleanupElements(this.svgElements)}},t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this._initializeMixinLoaders(),this.containerElement=t,this.renderRefreshRate=60,this.renderTimestep=1e3/this.renderRefreshRate,this.renderTime=.5*this.renderTimestep,this.maxPhysicsTicksPerRender=3,this.physicsDiscreteStepsize=.5,this.initializing=!0,this.triggerFunctions={add:null,edit:null,editEdge:null,connect:null,del:null},this.defaultOptions={nodes:{mass:1,radiusMin:10,radiusMax:30,radius:10,shape:"ellipse",image:void 0,widthMin:16,widthMax:64,fixed:!1,fontColor:"black",fontSize:14,fontFace:"verdana",level:-1,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},borderColor:"#2B7CE9",backgroundColor:"#97C2FC",highlightColor:"#D2E5FF",group:void 0,borderWidth:1},edges:{widthMin:1,widthMax:15,width:1,widthSelectionMultiplier:2,hoverWidth:1.5,style:"line",color:{color:"#848484",highlight:"#848484",hover:"#848484"},fontColor:"#343434",fontSize:14,fontFace:"arial",fontFill:"white",arrowScaleFactor:1,dash:{length:10,gap:5,altLength:void 0},inheritColor:"from"},configurePhysics:!1,physics:{barnesHut:{enabled:!0,theta:1/.6,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09},repulsion:{centralGravity:0,springLength:200,springConstant:.05,nodeDistance:100,damping:.09},hierarchicalRepulsion:{enabled:!1,centralGravity:0,springLength:100,springConstant:.01,nodeDistance:150,damping:.09},damping:null,centralGravity:null,springLength:null,springConstant:null},clustering:{enabled:!1,initialMaxNodes:100,clusterThreshold:500,reduceToNodes:300,chainThreshold:.4,clusterEdgeThreshold:20,sectorThreshold:100,screenSizeThreshold:.2,fontSizeMultiplier:4,maxFontSize:1e3,forceAmplification:.1,distanceAmplification:.1,edgeGrowth:20,nodeScaling:{width:1,height:1,radius:1},maxNodeSizeIncrements:600,activeAreaBoxSize:80,clusterLevelDifference:2},navigation:{enabled:!1},keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02}},dataManipulation:{enabled:!1,initiallyVisible:!1},hierarchicalLayout:{enabled:!1,levelSeparation:150,nodeSpacing:100,direction:"UD"},freezeForStabilization:!1,smoothCurves:{enabled:!0,dynamic:!0,type:"continuous",roundness:.5},dynamicSmoothCurves:!0,maxVelocity:30,minVelocity:.1,stabilize:!0,stabilizationIterations:1e3,locale:"en",locales:_,tooltip:{delay:300,fontColor:"black",fontSize:14,fontFace:"verdana",color:{border:"#666",background:"#FFFFC6"}},dragNetwork:!0,dragNodes:!0,zoomable:!0,hover:!1,hideEdgesOnDrag:!1,hideNodesOnDrag:!1,width:"100%",height:"100%",selectable:!0},this.constants=a.extend({},this.defaultOptions),this.hoverObj={nodes:{},edges:{}},this.controlNodesActive=!1;var o=this;this.groups=new u,this.images=new f,this.images.setOnloadCallback(function(){o._redraw()}),this.xIncrement=0,this.yIncrement=0,this.zoomIncrement=0,this._loadPhysicsSystem(),this._create(),this._loadSectorSystem(),this._loadClusterSystem(),this._loadSelectionSystem(),this._loadHierarchySystem(),this._setTranslation(this.frame.clientWidth/2,this.frame.clientHeight/2),this._setScale(1),this.setOptions(i),this.freezeSimulation=!1,this.cachedFunctions={},this.calculationNodes={},this.calculationNodeIndices=[],this.nodeIndices=[],this.nodes={},this.edges={},this.canvasTopLeft={x:0,y:0},this.canvasBottomRight={x:0,y:0},this.pointerPosition={x:0,y:0},this.areaCenter={},this.scale=1,this.previousScale=this.scale,this.nodesData=null,this.edgesData=null,this.nodesListeners={add:function(t,e){o._addNodes(e.items),o.start()},update:function(t,e){o._updateNodes(e.items),o.start()},remove:function(t,e){o._removeNodes(e.items),o.start()}},this.edgesListeners={add:function(t,e){o._addEdges(e.items),o.start()},update:function(t,e){o._updateEdges(e.items),o.start()},remove:function(t,e){o._removeEdges(e.items),o.start()}},this.moving=!0,this.timer=void 0,this.setData(e,this.constants.clustering.enabled||this.constants.hierarchicalLayout.enabled),this.initializing=!1,1==this.constants.hierarchicalLayout.enabled?this._setupHierarchicalLayout():0==this.constants.stabilize&&this.zoomExtent(!0,this.constants.clustering.enabled),this.constants.clustering.enabled&&this.startWithClustering()}var o=i(10),n=i(18),r=i(37),a=i(1),h=i(21),d=i(7),l=i(8),c=i(45),p=i(46),u=i(47),f=i(48),g=i(49),m=i(50),v=i(51),y=i(52),b=i(36),_=i(63);i(64),o(s.prototype),s.prototype._getScriptPath=function(){for(var t=document.getElementsByTagName("script"),e=0;et.x&&(s=t.x),ot.y&&(e=t.y),i=this.constants.clustering.initialMaxNodes?49.07548/(o+142.05338)+91444e-8:12.662/(o+7.4147)+.0964822:1==this.constants.clustering.enabled&&o>=this.constants.clustering.initialMaxNodes?77.5271985/(o+187.266146)+476710517e-13:30.5062972/(o+19.93597763)+.08413486;var n=Math.min(this.frame.canvas.clientWidth/600,this.frame.canvas.clientHeight/600);i*=n}else{var r=1.1*(Math.abs(s.minX)+Math.abs(s.maxX)),a=1.1*(Math.abs(s.minY)+Math.abs(s.maxY)),h=this.frame.canvas.clientWidth/r,d=this.frame.canvas.clientHeight/a;i=d>=h?h:d}i>1&&(i=1),this._setScale(i),this._centerNetwork(s),0==e&&(this.moving=!0,this.start())},s.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},s.prototype.setData=function(t,e){if(void 0===e&&(e=!1),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){if(t&&t.dot){var i=c.DOTToGraph(t.dot);return void this.setData(i)}}else if(t&&t.gephi){if(t&&t.gephi){var s=p.parseGephi(t.gephi);return void this.setData(s)}}else this._setNodes(t&&t.nodes),this._setEdges(t&&t.edges);if(this._putDataInSector(),!e)if(this.constants.stabilize){var o=this;setTimeout(function(){o._stabilize(),o.start()},0)}else this.start()},s.prototype.setOptions=function(t){if(t){var e,i=["nodes","edges","smoothCurves","hierarchicalLayout","clustering","navigation","keyboard","dataManipulation","onAdd","onEdit","onEditEdge","onConnect","onDelete","clickToUse"];if(a.selectiveNotDeepExtend(i,this.constants,t),a.selectiveNotDeepExtend(["color"],this.constants.nodes,t.nodes),a.selectiveNotDeepExtend(["color","length"],this.constants.edges,t.edges),t.physics&&(a.mergeOptions(this.constants.physics,t.physics,"barnesHut"),a.mergeOptions(this.constants.physics,t.physics,"repulsion"),t.physics.hierarchicalRepulsion)){this.constants.hierarchicalLayout.enabled=!0,this.constants.physics.hierarchicalRepulsion.enabled=!0,this.constants.physics.barnesHut.enabled=!1;for(e in t.physics.hierarchicalRepulsion)t.physics.hierarchicalRepulsion.hasOwnProperty(e)&&(this.constants.physics.hierarchicalRepulsion[e]=t.physics.hierarchicalRepulsion[e])}if(t.onAdd&&(this.triggerFunctions.add=t.onAdd),t.onEdit&&(this.triggerFunctions.edit=t.onEdit),t.onEditEdge&&(this.triggerFunctions.editEdge=t.onEditEdge),t.onConnect&&(this.triggerFunctions.connect=t.onConnect),t.onDelete&&(this.triggerFunctions.del=t.onDelete),a.mergeOptions(this.constants,t,"smoothCurves"),a.mergeOptions(this.constants,t,"hierarchicalLayout"),a.mergeOptions(this.constants,t,"clustering"),a.mergeOptions(this.constants,t,"navigation"),a.mergeOptions(this.constants,t,"keyboard"),a.mergeOptions(this.constants,t,"dataManipulation"),t.dataManipulation&&(this.editMode=this.constants.dataManipulation.initiallyVisible),t.edges&&(void 0!==t.edges.color&&(a.isString(t.edges.color)?(this.constants.edges.color={},this.constants.edges.color.color=t.edges.color,this.constants.edges.color.highlight=t.edges.color,this.constants.edges.color.hover=t.edges.color):(void 0!==t.edges.color.color&&(this.constants.edges.color.color=t.edges.color.color),void 0!==t.edges.color.highlight&&(this.constants.edges.color.highlight=t.edges.color.highlight),void 0!==t.edges.color.hover&&(this.constants.edges.color.hover=t.edges.color.hover))),t.edges.fontColor||void 0!==t.edges.color&&(a.isString(t.edges.color)?this.constants.edges.fontColor=t.edges.color:void 0!==t.edges.color.color&&(this.constants.edges.fontColor=t.edges.color.color))),t.nodes&&t.nodes.color){var s=a.parseColor(t.nodes.color);this.constants.nodes.color.background=s.background,this.constants.nodes.color.border=s.border,this.constants.nodes.color.highlight.background=s.highlight.background,this.constants.nodes.color.highlight.border=s.highlight.border,this.constants.nodes.color.hover.background=s.hover.background,this.constants.nodes.color.hover.border=s.hover.border}if(t.groups)for(var o in t.groups)if(t.groups.hasOwnProperty(o)){var n=t.groups[o];this.groups.add(o,n)}if(t.tooltip){for(e in t.tooltip)t.tooltip.hasOwnProperty(e)&&(this.constants.tooltip[e]=t.tooltip[e]);t.tooltip.color&&(this.constants.tooltip.color=a.parseColor(t.tooltip.color))}if("clickToUse"in t&&(t.clickToUse?(this.activator=new b(this.frame),this.activator.on("change",this._createKeyBinds.bind(this))):this.activator&&(this.activator.destroy(),delete this.activator)),t.labels)throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.')}this._loadPhysicsSystem(),this._loadNavigationControls(),this._loadManipulationSystem(),this._configureSmoothCurves(),this._createKeyBinds(),this.setSize(this.constants.width,this.constants.height),this.moving=!0,this.start()},s.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis network-frame",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),!this.frame.canvas.getContext){var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}var e=this;this.drag={},this.pinch={},this.hammer=n(this.frame.canvas,{prevent_default:!0}),this.hammer.on("tap",e._onTap.bind(e)),this.hammer.on("doubletap",e._onDoubleTap.bind(e)),this.hammer.on("hold",e._onHold.bind(e)),this.hammer.on("pinch",e._onPinch.bind(e)),this.hammer.on("touch",e._onTouch.bind(e)),this.hammer.on("dragstart",e._onDragStart.bind(e)),this.hammer.on("drag",e._onDrag.bind(e)),this.hammer.on("dragend",e._onDragEnd.bind(e)),this.hammer.on("release",e._onRelease.bind(e)),this.hammer.on("mousewheel",e._onMouseWheel.bind(e)),this.hammer.on("DOMMouseScroll",e._onMouseWheel.bind(e)),this.hammer.on("mousemove",e._onMouseMoveTitle.bind(e)),this.containerElement.appendChild(this.frame)},s.prototype._createKeyBinds=function(){var t=this;this.mousetrap=r,this.mousetrap.reset(),this.constants.keyboard.enabled&&this.isActive()&&(this.mousetrap.bind("up",this._moveUp.bind(t),"keydown"),this.mousetrap.bind("up",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("down",this._moveDown.bind(t),"keydown"),this.mousetrap.bind("down",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("left",this._moveLeft.bind(t),"keydown"),this.mousetrap.bind("left",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("right",this._moveRight.bind(t),"keydown"),this.mousetrap.bind("right",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("=",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("=",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("-",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("-",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("[",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("[",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("]",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("]",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pageup",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("pageup",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pagedown",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("pagedown",this._stopZoom.bind(t),"keyup")),1==this.constants.dataManipulation.enabled&&(this.mousetrap.bind("escape",this._createManipulatorBar.bind(t)),this.mousetrap.bind("del",this._deleteSelected.bind(t)))},s.prototype._getPointer=function(t){return{x:t.pageX-a.getAbsoluteLeft(this.frame.canvas),y:t.pageY-a.getAbsoluteTop(this.frame.canvas)}},s.prototype._onTouch=function(t){this.drag.pointer=this._getPointer(t.gesture.center),this.drag.pinched=!1,this.pinch.scale=this._getScale(),this._handleTouch(this.drag.pointer)},s.prototype._onDragStart=function(){this._handleDragStart()},s.prototype._handleDragStart=function(){var t=this.drag,e=this._getNodeAt(t.pointer);if(t.dragging=!0,t.selection=[],t.translation=this._getTranslation(),t.nodeId=null,null!=e){t.nodeId=e.id,e.isSelected()||this._selectObject(e,!1);for(var i in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(i)){var s=this.selectionObj.nodes[i],o={id:s.id,node:s,x:s.x,y:s.y,xFixed:s.xFixed,yFixed:s.yFixed};s.xFixed=!0,s.yFixed=!0,t.selection.push(o)}}},s.prototype._onDrag=function(t){this._handleOnDrag(t)},s.prototype._handleOnDrag=function(t){if(!this.drag.pinched){var e=this._getPointer(t.gesture.center),i=this,s=this.drag,o=s.selection;if(o&&o.length&&1==this.constants.dragNodes){var n=e.x-s.pointer.x,r=e.y-s.pointer.y;o.forEach(function(t){var e=t.node;t.xFixed||(e.x=i._XconvertDOMtoCanvas(i._XconvertCanvasToDOM(t.x)+n)),t.yFixed||(e.y=i._YconvertDOMtoCanvas(i._YconvertCanvasToDOM(t.y)+r))}),this.moving||(this.moving=!0,this.start())}else if(1==this.constants.dragNetwork){var a=e.x-this.drag.pointer.x,h=e.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+a,this.drag.translation.y+h),this._redraw()}}},s.prototype._onDragEnd=function(){this.drag.dragging=!1;var t=this.drag.selection;t&&t.length?(t.forEach(function(t){t.node.xFixed=t.xFixed,t.node.yFixed=t.yFixed}),this.moving=!0,this.start()):this._redraw()},s.prototype._onTap=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleTap(e)},s.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.center);this._handleDoubleTap(e)},s.prototype._onHold=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleOnHold(e)},s.prototype._onRelease=function(t){var e=this._getPointer(t.gesture.center);this._handleOnRelease(e)},s.prototype._onPinch=function(t){var e=this._getPointer(t.gesture.center);this.drag.pinched=!0,"scale"in this.pinch||(this.pinch.scale=1);var i=this.pinch.scale*t.gesture.scale;this._zoom(i,e)},s.prototype._zoom=function(t,e){if(1==this.constants.zoomable){var i=this._getScale();1e-5>t&&(t=1e-5),t>10&&(t=10);var s=null;void 0!==this.drag&&1==this.drag.dragging&&(s=this.DOMtoCanvas(this.drag.pointer));var o=this._getTranslation(),n=t/i,r=(1-n)*e.x+o.x*n,a=(1-n)*e.y+o.y*n;if(this.areaCenter={x:this._XconvertDOMtoCanvas(e.x),y:this._YconvertDOMtoCanvas(e.y)},this._setScale(t),this._setTranslation(r,a),this.updateClustersDefault(),null!=s){var h=this.canvasToDOM(s);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}return this._redraw(),t>i?this.emit("zoom",{direction:"+"}):this.emit("zoom",{direction:"-"}),t}},s.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i=this._getScale(),s=e/10;0>e&&(s/=1-s),i*=1+s;var o=h.fakeGesture(this,t),n=this._getPointer(o.center);this._zoom(i,n)}t.preventDefault()},s.prototype._onMouseMoveTitle=function(t){var e=h.fakeGesture(this,t),i=this._getPointer(e.center);this.popupObj&&this._checkHidePopup(i);var s=this,o=function(){s._checkShowPopup(i)};if(this.popupTimer&&clearInterval(this.popupTimer),this.drag.dragging||(this.popupTimer=setTimeout(o,this.constants.tooltip.delay)),1==this.constants.hover){for(var n in this.hoverObj.edges)this.hoverObj.edges.hasOwnProperty(n)&&(this.hoverObj.edges[n].hover=!1,delete this.hoverObj.edges[n]);var r=this._getNodeAt(i);null==r&&(r=this._getEdgeAt(i)),null!=r&&this._hoverObject(r);for(var a in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(a)&&(r instanceof g&&r.id!=a||r instanceof m||null==r)&&(this._blurObject(this.hoverObj.nodes[a]),delete this.hoverObj.nodes[a]);this.redraw()}},s.prototype._checkShowPopup=function(t){var e,i={left:this._XconvertDOMtoCanvas(t.x),top:this._YconvertDOMtoCanvas(t.y),right:this._XconvertDOMtoCanvas(t.x),bottom:this._YconvertDOMtoCanvas(t.y)},s=this.popupObj;if(void 0==this.popupObj){var o=this.nodes;for(e in o)if(o.hasOwnProperty(e)){var n=o[e];if(void 0!==n.getTitle()&&n.isOverlappingWith(i)){this.popupObj=n;break}}}if(void 0===this.popupObj){var r=this.edges;for(e in r)if(r.hasOwnProperty(e)){var a=r[e];if(a.connected&&void 0!==a.getTitle()&&a.isOverlappingWith(i)){this.popupObj=a;break}}}if(this.popupObj){if(this.popupObj!=s){var h=this;h.popup||(h.popup=new v(h.frame,h.constants.tooltip)),h.popup.setPosition(t.x-3,t.y-3),h.popup.setText(h.popupObj.getTitle()),h.popup.show()}}else this.popup&&this.popup.hide()},s.prototype._checkHidePopup=function(t){this.popupObj&&this._getNodeAt(t)||(this.popupObj=void 0,this.popup&&this.popup.hide())},s.prototype.setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,this.emit("resize",{width:this.frame.canvas.width,height:this.frame.canvas.height})},s.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof d||t instanceof l)this.nodesData=t;else if(t instanceof Array)this.nodesData=new d,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new d}if(e&&a.forEach(this.nodesListeners,function(t,i){e.off(i,t)}),this.nodes={},this.nodesData){var i=this;a.forEach(this.nodesListeners,function(t,e){i.nodesData.on(e,t)});var s=this.nodesData.getIds();this._addNodes(s)}this._updateSelection()},s.prototype._addNodes=function(t){for(var e,i=0,s=t.length;s>i;i++){e=t[i];var o=this.nodesData.get(e),n=new g(o,this.images,this.groups,this.constants);if(this.nodes[e]=n,!(0!=n.xFixed&&0!=n.yFixed||null!==n.x&&null!==n.y)){var r=1*t.length+10,a=2*Math.PI*Math.random();0==n.xFixed&&(n.x=r*Math.cos(a)),0==n.yFixed&&(n.y=r*Math.sin(a))}this.moving=!0}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateValueRange(this.nodes),this.updateLabels()},s.prototype._updateNodes=function(t){for(var e=this.nodes,i=this.nodesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n],a=i.get(n);r?r.setProperties(a,this.constants):(r=new g(properties,this.images,this.groups,this.constants),e[n]=r)}this.moving=!0,1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateNodeIndexList(),this._reconnectEdges(),this._updateValueRange(e)},s.prototype._removeNodes=function(t){for(var e=this.nodes,i=0,s=t.length;s>i;i++){var o=t[i];delete e[o]}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateSelection(),this._updateValueRange(e)},s.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof d||t instanceof l)this.edgesData=t;else if(t instanceof Array)this.edgesData=new d,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new d}if(e&&a.forEach(this.edgesListeners,function(t,i){e.off(i,t)}),this.edges={},this.edgesData){var i=this;a.forEach(this.edgesListeners,function(t,e){i.edgesData.on(e,t)});var s=this.edgesData.getIds();this._addEdges(s)}this._reconnectEdges()},s.prototype._addEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n];r&&r.disconnect();var a=i.get(n,{showInternalIds:!0});e[n]=new m(a,this,this.constants)}this.moving=!0,this._updateValueRange(e),this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._updateEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=i.get(n),a=e[n];a?(a.disconnect(),a.setProperties(r,this.constants),a.connect()):(a=new m(r,this,this.constants),this.edges[n]=a)}this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this.moving=!0,this._updateValueRange(e)},s.prototype._removeEdges=function(t){for(var e=this.edges,i=0,s=t.length;s>i;i++){var o=t[i],n=e[o];n&&(null!=n.via&&delete this.sectors.support.nodes[n.via.id],n.disconnect(),delete e[o])}this.moving=!0,this._updateValueRange(e),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._reconnectEdges=function(){var t,e=this.nodes,i=this.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var s=i[t];s.from=null,s.to=null,s.connect()}},s.prototype._updateValueRange=function(t){var e,i=void 0,s=void 0;for(e in t)if(t.hasOwnProperty(e)){var o=t[e].getValue();void 0!==o&&(i=void 0===i?o:Math.min(o,i),s=void 0===s?o:Math.max(o,s))}if(void 0!==i&&void 0!==s)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,s)},s.prototype.redraw=function(){this.setSize(this.constants.width,this.constants.height),this._redraw()},s.prototype._redraw=function(){var t=this.frame.canvas.getContext("2d"),e=this.frame.canvas.width,i=this.frame.canvas.height;t.clearRect(0,0,e,i),t.save(),t.translate(this.translation.x,this.translation.y),t.scale(this.scale,this.scale),this.canvasTopLeft={x:this._XconvertDOMtoCanvas(0),y:this._YconvertDOMtoCanvas(0)},this.canvasBottomRight={x:this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth),y:this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight)},this._doInAllSectors("_drawAllSectorNodes",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideEdgesOnDrag)&&this._doInAllSectors("_drawEdges",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideNodesOnDrag)&&this._doInAllSectors("_drawNodes",t,!1),1==this.controlNodesActive&&this._doInAllSectors("_drawControlNodes",t),t.restore()},s.prototype._setTranslation=function(t,e){void 0===this.translation&&(this.translation={x:0,y:0}),void 0!==t&&(this.translation.x=t),void 0!==e&&(this.translation.y=e),this.emit("viewChanged")},s.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},s.prototype._setScale=function(t){this.scale=t},s.prototype._getScale=function(){return this.scale},s.prototype._XconvertDOMtoCanvas=function(t){return(t-this.translation.x)/this.scale},s.prototype._XconvertCanvasToDOM=function(t){return t*this.scale+this.translation.x},s.prototype._YconvertDOMtoCanvas=function(t){return(t-this.translation.y)/this.scale},s.prototype._YconvertCanvasToDOM=function(t){return t*this.scale+this.translation.y},s.prototype.canvasToDOM=function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}},s.prototype.DOMtoCanvas=function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}},s.prototype._drawNodes=function(t,e){void 0===e&&(e=!1);var i=this.nodes,s=[];for(var o in i)i.hasOwnProperty(o)&&(i[o].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight),i[o].isSelected()?s.push(o):(i[o].inArea()||e)&&i[o].draw(t));for(var n=0,r=s.length;r>n;n++)(i[s[n]].inArea()||e)&&i[s[n]].draw(t)},s.prototype._drawEdges=function(t){var e=this.edges;for(var i in e)if(e.hasOwnProperty(i)){var s=e[i];s.setScale(this.scale),s.connected&&e[i].draw(t)}},s.prototype._drawControlNodes=function(t){var e=this.edges;for(var i in e)e.hasOwnProperty(i)&&e[i]._drawControlNodes(t)},s.prototype._stabilize=function(){1==this.constants.freezeForStabilization&&this._freezeDefinedNodes();for(var t=0;this.moving&&t0)for(e in s)s.hasOwnProperty(e)&&(s[e].discreteStepLimited(i,this.constants.maxVelocity),o=!0);else for(e in s)s.hasOwnProperty(e)&&(s[e].discreteStep(i),o=!0);if(1==o&&(void 0===t||1==t)){var n=this.constants.minVelocity/Math.max(this.scale,.05);n>.5*this.constants.maxVelocity?this.moving=!0:(this.moving=this._isMoving(n),0==this.moving&&this.emit("stabilized",{iterations:null}),this.moving=this.moving||this.configurePhysics)}},s.prototype._physicsTick=function(){this.freezeSimulation||1==this.moving&&(this._doInAllActiveSectors("_initializeForceCalculation"),this._doInAllActiveSectors("_discreteStepNodes"),1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic&&this._doInSupportSector("_discreteStepNodes",!1),this._findCenter(this._getRange()))},s.prototype._animationStep=function(){this.timer=void 0,this._handleNavigation(),this.start();var t=Date.now(),e=1;this._physicsTick();for(var i=Date.now()-t;i<.9*(this.renderTimestep-this.renderTime)&&ei;i++)if(e.id===r.nodes[i].id){o=r.nodes[i];break}for(o||(o={id:e.id},t.node&&(o.attr=a(o.attr,t.node))),i=n.length-1;i>=0;i--){var h=n[i];h.nodes||(h.nodes=[]),-1==h.nodes.indexOf(o)&&h.nodes.push(o)}e.attr&&(o.attr=a(o.attr,e.attr))}function l(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=a({},t.edge);e.attr=a(i,e.attr)}}function c(t,e,i,s,o){var n={from:e,to:i,type:s}; -return t.edge&&(n.attr=a({},t.edge)),n.attr=a(n.attr||{},o),n}function p(){for(k=C.NULL,L="";" "==O||" "==O||"\n"==O||"\r"==O;)o();do{var t=!1;if("#"==O){for(var e=T-1;" "==D.charAt(e)||" "==D.charAt(e);)e--;if("\n"==D.charAt(e)||""==D.charAt(e)){for(;""!=O&&"\n"!=O;)o();t=!0}}if("/"==O&&"/"==n()){for(;""!=O&&"\n"!=O;)o();t=!0}if("/"==O&&"*"==n()){for(;""!=O;){if("*"==O&&"/"==n()){o(),o();break}o()}t=!0}for(;" "==O||" "==O||"\n"==O||"\r"==O;)o()}while(t);if(""==O)return void(k=C.DELIMITER);var i=O+n();if(E[i])return k=C.DELIMITER,L=i,o(),void o();if(E[O])return k=C.DELIMITER,L=O,void o();if(r(O)||"-"==O){for(L+=O,o();r(O);)L+=O,o();return"false"==L?L=!1:"true"==L?L=!0:isNaN(Number(L))||(L=Number(L)),void(k=C.IDENTIFIER)}if('"'==O){for(o();""!=O&&('"'!=O||'"'==O&&'"'==n());)L+=O,'"'==O&&o(),o();if('"'!=O)throw x('End of string " expected');return o(),void(k=C.IDENTIFIER)}for(k=C.UNKNOWN;""!=O;)L+=O,o();throw new SyntaxError('Syntax error in part "'+w(L,30)+'"')}function u(){var t={};if(s(),p(),"strict"==L&&(t.strict=!0,p()),("graph"==L||"digraph"==L)&&(t.type=L,p()),k==C.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),f(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function f(t){for(;""!==L&&"}"!=L;)g(t),";"==L&&p()}function g(t){var e=m(t);if(e)return void b(t,e);var i=v(t);if(!i){if(k!=C.IDENTIFIER)throw x("Identifier expected");var s=L;if(p(),"="==L){if(p(),k!=C.IDENTIFIER)throw x("Identifier expected");t[s]=L,p()}else y(t,s)}}function m(t){var e=null;if("subgraph"==L&&(e={},e.type="subgraph",p(),k==C.IDENTIFIER&&(e.id=L,p())),"{"==L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,f(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function v(t){return"node"==L?(p(),t.node=_(),"node"):"edge"==L?(p(),t.edge=_(),"edge"):"graph"==L?(p(),t.graph=_(),"graph"):null}function y(t,e){var i={id:e},s=_();s&&(i.attr=s),d(t,i),b(t,e)}function b(t,e){for(;"->"==L||"--"==L;){var i,s=L;p();var o=m(t);if(o)i=o;else{if(k!=C.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,d(t,{id:i}),p()}var n=_(),r=c(t,e,i,s,n);l(t,r),e=i}}function _(){for(var t=null;"["==L;){for(p(),t={};""!==L&&"]"!=L;){if(k!=C.IDENTIFIER)throw x("Attribute name expected");var e=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),k!=C.IDENTIFIER)throw x("Attribute value expected");var i=L;h(t,e,i),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+w(L,30)+'" (char '+T+")")}function w(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){t instanceof Array?t.forEach(function(t){e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}):e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}function M(t){function e(t){var e={from:t.from,to:t.to};return a(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var s=i(t),o={nodes:[],edges:[],options:{}};return s.nodes&&s.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};a(e,t.attr),e.image&&(e.shape="image"),o.nodes.push(e)}),s.edges&&s.edges.forEach(function(t){var i,s;i=t.from instanceof Object?t.from.nodes:{id:t.from},s=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var i=e(t);o.edges.push(i)}),S(i,s,function(i,s){var n=c(o,i.id,s.id,t.type,t.attr),r=e(n);o.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var i=e(t);o.edges.push(i)})}),s.attr&&(o.options=s.attr),o}var C={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},E={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},D="",T=0,O="",L="",k=C.NULL,N=/[a-zA-Z_0-9.:#]/;e.parseDOT=i,e.DOTToGraph=M},function(t,e){function i(t,e){var i=[],s=[];this.options={edges:{inheritColor:!0},nodes:{allowedToMove:!1,parseColor:!1}},void 0!==e&&(this.options.nodes.allowedToMove=e.allowedToMove|!1,this.options.nodes.parseColor=e.parseColor|!1,this.options.edges.inheritColor=e.inheritColor|!0);for(var o=t.edges,n=t.nodes,r=0;re?this.vx>0?e:-e:this.vx,this.x+=this.vx*t}if(this.yFixed)this.fy=0;else{var o=this.damping*this.vy,n=(this.fy-o)/this.options.mass;this.vy+=n*t,this.vy=Math.abs(this.vy)>e?this.vy>0?e:-e:this.vy,this.y+=this.vy*t}},s.prototype.isFixed=function(){return this.xFixed&&this.yFixed},s.prototype.isMoving=function(t){var e=Math.sqrt(Math.pow(this.vx,2)+Math.pow(this.vy,2));return e>t},s.prototype.isSelected=function(){return this.selected},s.prototype.getValue=function(){return this.value},s.prototype.getDistance=function(t,e){var i=this.x-t,s=this.y-e;return Math.sqrt(i*i+s*s)},s.prototype.setValueRange=function(t,e){if(!this.radiusFixed&&void 0!==this.value)if(e==t)this.options.radius=(this.options.radiusMin+this.options.radiusMax)/2;else{var i=(this.options.radiusMax-this.options.radiusMin)/(e-t);this.options.radius=(this.value-t)*i+this.options.radiusMin}this.baseRadiusValue=this.options.radius},s.prototype.draw=function(){throw"Draw method not initialized for node"},s.prototype.resize=function(){throw"Resize method not initialized for node"},s.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},s.prototype._resizeImage=function(){if(!this.width||!this.height){var t,e;if(this.value){this.options.radius=this.baseRadiusValue;var i=this.imageObj.height/this.imageObj.width;void 0!==i?(t=this.options.radius||this.imageObj.width,e=this.options.radius*i||this.imageObj.height):(t=0,e=0)}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.growthIndicator=0,this.width>0&&this.height>0&&(this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t)}},s.prototype._drawImage=function(t){this._resizeImage(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e;if(0!=this.imageObj.width){if(this.clusterSize>1){var i=this.clusterSize>1?10:0;i*=this.networkScaleInv,i=Math.min(.2*this.width,i),t.globalAlpha=.5,t.drawImage(this.imageObj,this.left-i,this.top-i,this.width+2*i,this.height+2*i)}t.globalAlpha=1,t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),e=this.y+this.height/2}else e=this.y;this._label(t,this.label,this.x,e,void 0,"top")},s.prototype._resizeBox=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawBox=function(t){this._resizeBox(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.roundRect(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth,this.options.radius),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.options.color.background,t.roundRect(this.left,this.top,this.width,this.height,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeDatabase=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=i.width+2*e;this.width=s,this.height=s,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-s}},s.prototype._drawDatabase=function(t){this._resizeDatabase(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.database(this.x-this.width/2-2*t.lineWidth,this.y-.5*this.height-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.database(this.x-this.width/2,this.y-.5*this.height,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeCircle=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=Math.max(i.width,i.height)+2*e;this.options.radius=s/2,this.width=s,this.height=s,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.options.radius-.5*s}},s.prototype._drawCircle=function(t){this._resizeCircle(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.circle(this.x,this.y,this.options.radius+2*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.circle(this.x,this.y,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeEllipse=function(t){if(!this.width){var e=this.getTextSize(t);this.width=1.5*e.width,this.height=2*e.height,this.width1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.ellipse(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.ellipse(this.left,this.top,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._drawDot=function(t){this._drawShape(t,"circle")},s.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},s.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},s.prototype._drawSquare=function(t){this._drawShape(t,"square")},s.prototype._drawStar=function(t){this._drawShape(t,"star")},s.prototype._resizeShape=function(){if(!this.width){this.options.radius=this.baseRadiusValue;var t=2*this.options.radius;this.width=t,this.height=t,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t}},s.prototype._drawShape=function(t,e){this._resizeShape(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var i=2.5,s=this.options.borderWidth,o=this.options.borderWidthSelected||2*this.options.borderWidth,n=2;switch(e){case"dot":n=2;break;case"square":n=2;break;case"triangle":n=3;break;case"triangleDown":n=3;break;case"star":n=4}t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t[e](this.x,this.y,this.options.radius+n*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t[e](this.x,this.y,this.options.radius),t.fill(),t.stroke(),this.label&&this._label(t,this.label,this.x,this.y+this.height/2,void 0,"top",!0)},s.prototype._resizeText=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawText=function(t){this._resizeText(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,this._label(t,this.label,this.x,this.y)},s.prototype._label=function(t,e,i,s,o,n,r){if(e&&Number(this.options.fontSize)*this.networkScale>this.fontDrawThreshold){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace,t.fillStyle=this.options.fontColor||"black",t.textAlign=o||"center",t.textBaseline=n||"middle";var a=e.split("\n"),h=a.length,d=Number(this.options.fontSize)+4,l=s+(1-h)/2*d;1==r&&(l=s+(1-h)/(2*d));for(var c=0;h>c;c++)t.fillText(a[c],i,l),l+=d}},s.prototype.getTextSize=function(t){if(void 0!==this.label){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace;for(var e=this.label.split("\n"),i=(Number(this.options.fontSize)+4)*e.length,s=0,o=0,n=e.length;n>o;o++)s=Math.max(s,t.measureText(e[o]).width);return{width:s,height:i}}return{width:0,height:0}},s.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.networkScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.networkScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.networkScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.yh}return!1},s.prototype._getColor=function(){var t=this.options.color;return"to"==this.options.inheritColor?t={highlight:this.to.options.color.highlight.border,hover:this.to.options.color.hover.border,color:this.to.options.color.border}:("from"==this.options.inheritColor||1==this.options.inheritColor)&&(t={highlight:this.from.options.color.highlight.border,hover:this.from.options.color.hover.border,color:this.from.options.color.border}),1==this.selected?t.highlight:1==this.hover?t.hover:t.color},s.prototype._drawLine=function(t){if(t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth(),this.from!=this.to){var e,i=this._line(t);if(this.label){if(1==this.options.smoothCurves.enabled&&null!=i){var s=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),o=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y));e={x:s,y:o}}else e=this._pointOnLine(.5);this._label(t,this.label,e.x,e.y)}}else{var n,r,a=this.physics.springLength/4,h=this.from;h.width||h.resize(t),h.width>h.height?(n=h.x+h.width/2,r=h.y-a):(n=h.x+a,r=h.y-h.height/2),this._circle(t,n,r,a),e=this._pointOnCircle(n,r,a,.5),this._label(t,this.label,e.x,e.y)}},s.prototype._getLineWidth=function(){return 1==this.selected?Math.min(this.widthSelected,this.options.widthMax)*this.networkScaleInv:1==this.hover?Math.min(this.options.hoverWidth,this.options.widthMax)*this.networkScaleInv:this.options.width*this.networkScaleInv},s.prototype._getViaCoordinates=function(){var t=null,e=null,i=this.options.smoothCurves.roundness,s=this.options.smoothCurves.type,o=Math.abs(this.from.x-this.to.x),n=Math.abs(this.from.y-this.to.y);return"discrete"==s||"diagonalCross"==s?Math.abs(this.from.x-this.to.x)this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n)),"discrete"==s&&(t=i*n>o?this.from.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o)),"discrete"==s&&(e=i*o>n?this.from.y:e)):"straightCross"==s?Math.abs(this.from.x-this.to.x)Math.abs(this.from.y-this.to.y)&&(t=this.from.xthis.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n,t=this.to.x>t?this.to.x:t):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n,t=this.to.x>t?this.to.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xe?this.to.y:e):this.from.x>this.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o,e=this.to.y>e?this.to.y:e):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o,e=this.to.y0||o.length>0)&&this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}},s.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=this.body.util.snap||null,o=s.itemFromTarget(t);if(o){var n=e.itemsData.get(o.id);this.options.onUpdate(n,function(t){t&&e.itemsData.update(t)})}else{var a=r.getAbsoluteLeft(this.dom.frame),h=t.gesture.center.pageX-a,d=this.body.util.toTime(h),l={start:i?i(d):d,content:"new item"};if("range"===this.options.type){var c=this.body.util.toTime(h+this.props.width/5);l.end=i?i(c):c}l[this.itemsData.fieldId]=r.randomUUID();var p=s.groupFromTarget(t);p&&(l.group=p.groupId),this.options.onAdd(l,function(t){t&&e.itemsData.add(l)})}}},s.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e,i=s.itemFromTarget(t);if(i){e=this.getSelection();var o=e.indexOf(i.id);-1==o?e.push(i.id):e.splice(o,1),this.setSelection(e),this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}}},s.itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},s.groupFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-group"))return e["timeline-group"];e=e.parentNode}return null},s.itemSetFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-itemset"))return e["timeline-itemset"];e=e.parentNode}return null},t.exports=s},function(t,e,i){function s(t,e,i){this.groupId=t,this.itemSet=i,this.dom={},this.props={label:{width:0,height:0}},this.className=null,this.items={},this.visibleItems=[],this.orderedItems={byStart:[],byEnd:[]},this._create(),this.setData(e)}var o=i(1),n=i(31),r=i(32);s.prototype._create=function(){var t=document.createElement("div");t.className="vlabel",this.dom.label=t;var e=document.createElement("div");e.className="inner",t.appendChild(e),this.dom.inner=e;var i=document.createElement("div");i.className="group",i["timeline-group"]=this,this.dom.foreground=i,this.dom.background=document.createElement("div"),this.dom.background.className="group",this.dom.axis=document.createElement("div"),this.dom.axis.className="group",this.dom.marker=document.createElement("div"),this.dom.marker.style.visibility="hidden",this.dom.marker.innerHTML="?",this.dom.background.appendChild(this.dom.marker)},s.prototype.setData=function(t){var e=t&&t.content;e instanceof Element?this.dom.inner.appendChild(e):this.dom.inner.innerHTML=void 0!==e&&null!==e?e:this.groupId||"",this.dom.label.title=t&&t.title||"",this.dom.inner.firstChild?o.removeClassName(this.dom.inner,"hidden"):o.addClassName(this.dom.inner,"hidden");var i=t&&t.className||null;i!=this.className&&(this.className&&(o.removeClassName(this.dom.label,i),o.removeClassName(this.dom.foreground,i),o.removeClassName(this.dom.background,i),o.removeClassName(this.dom.axis,i)),o.addClassName(this.dom.label,i),o.addClassName(this.dom.foreground,i),o.addClassName(this.dom.background,i),o.addClassName(this.dom.axis,i))},s.prototype.getLabelWidth=function(){return this.props.label.width},s.prototype.redraw=function(t,e,i){var s=!1;this.visibleItems=this._updateVisibleItems(this.orderedItems,this.visibleItems,t);var r=this.dom.marker.clientHeight;r!=this.lastMarkerHeight&&(this.lastMarkerHeight=r,o.forEach(this.items,function(t){t.dirty=!0,t.displayed&&t.redraw()}),i=!0),this.itemSet.options.stack?n.stack(this.visibleItems,e,i):n.nostack(this.visibleItems,e);var a,h=this.visibleItems;if(h.length){var d=h[0].top,l=h[0].top+h[0].height;if(o.forEach(h,function(t){d=Math.min(d,t.top),l=Math.max(l,t.top+t.height)}),d>e.axis){var c=d-e.axis;l-=c,o.forEach(h,function(t){t.top-=c})}a=l+e.item.vertical/2}else a=e.axis+e.item.vertical;a=Math.max(a,this.props.label.height);var p=this.dom.foreground;this.top=p.offsetTop,this.left=p.offsetLeft,this.width=p.offsetWidth,s=o.updateProperty(this,"height",a)||s,s=o.updateProperty(this.props.label,"width",this.dom.inner.clientWidth)||s,s=o.updateProperty(this.props.label,"height",this.dom.inner.clientHeight)||s,this.dom.background.style.height=a+"px",this.dom.foreground.style.height=a+"px",this.dom.label.style.height=a+"px";for(var u=0,f=this.visibleItems.length;f>u;u++){var g=this.visibleItems[u];g.repositionY()}return s},s.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},s.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var s=this.dom.axis;s.parentNode&&s.parentNode.removeChild(s)},s.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},s.prototype.remove=function(t){delete this.items[t.id],t.setParent(this.itemSet);var e=this.visibleItems.indexOf(t);-1!=e&&this.visibleItems.splice(e,1)},s.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},s.prototype.order=function(){var t=o.toArray(this.items);this.orderedItems.byStart=t,this.orderedItems.byEnd=this._constructByEndArray(t),n.orderByStart(this.orderedItems.byStart),n.orderByEnd(this.orderedItems.byEnd)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0)for(n=0;n=0&&!this._checkIfInvisible(t.byStart[n],r,i);n--);for(n=s+1;n=0&&!this._checkIfInvisible(t.byEnd[n],r,i);n--);for(n=a+1;no;o++)t[o].top=null;for(o=0,n=t.length;n>o;o++){var r=t[o];if(null===r.top){r.top=i.axis;do{for(var a=null,h=0,d=t.length;d>h;h++){var l=t[h];if(null!==l.top&&l!==r&&e.collision(r,l,i.item)){a=l;break}}null!=a&&(r.top=a.top+a.height+i.item.vertical)}while(a)}}},e.nostack=function(t,e){var i,s;for(i=0,s=t.length;s>i;i++)t[i].top=e.axis},e.collision=function(t,e,s){return t.left-s.horizontal+ie.left&&t.top-s.vertical+ie.top}},function(t,e,i){function s(t,e,i){if(this.props={content:{width:0}},this.overflow=!1,t){if(void 0==t.start)throw new Error('Property "start" missing in item '+t.id);if(void 0==t.end)throw new Error('Property "end" missing in item '+t.id)}n.call(this,t,e,i)}var o=i(18),n=i(33);s.prototype=new n(null,null,null),s.prototype.baseClassName="item range",s.prototype.isVisible=function(t){return this.data.startt.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),t.box["timeline-item"]=this),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.foreground;if(!e)throw new Error("Cannot redraw time axis: parent has no foreground container element");e.appendChild(t.box)}if(this.displayed=!0,this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)t.content.innerHTML="",t.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);t.content.innerHTML=this.content}this.dirty=!0}this.data.title!=this.title&&(t.box.title=this.data.title,this.title=this.data.title);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");this.className!=i&&(this.className=i,t.box.className=this.baseClassName+i,this.dirty=!0),this.dirty&&(this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dirty=!1),this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},s.prototype.show=function(){this.displayed||this.redraw()},s.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.top=null,this.left=null,this.displayed=!1}},s.prototype.repositionX=function(){var t,e=this.props,i=this.parent.width,s=this.conversion.toScreen(this.data.start),o=this.conversion.toScreen(this.data.end),n=this.options.padding;-i>s&&(s=-i),o>2*i&&(o=2*i);var r=Math.max(o-s,1);this.overflow?(t=Math.max(-s,0),this.left=s,this.width=r+this.props.content.width):(t=0>s?Math.min(-s,o-s-e.content.width-2*n):0,this.left=s,this.width=r),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=r+"px",this.dom.content.style.left=t+"px"},s.prototype.repositionY=function(){var t=this.options.orientation,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},s.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="drag-left",t.dragLeftItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragLeft=t}else!this.selected&&this.dom.dragLeft&&(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},s.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="drag-right",t.dragRightItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragRight=t}else!this.selected&&this.dom.dragRight&&(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=s},function(t,e,i){function s(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.dirty=!0,this.top=null,this.left=null,this.width=null,this.height=null}var o=i(18);s.prototype.select=function(){this.selected=!0,this.displayed&&this.redraw()},s.prototype.unselect=function(){this.selected=!1,this.displayed&&this.redraw()},s.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},s.prototype.isVisible=function(){return!1},s.prototype.show=function(){return!1},s.prototype.hide=function(){return!1},s.prototype.redraw=function(){},s.prototype.repositionX=function(){},s.prototype.repositionY=function(){},s.prototype._repaintDeleteButton=function(t){if(this.selected&&this.options.editable.remove&&!this.dom.deleteButton){var e=this,i=document.createElement("div");i.className="delete",i.title="Delete this item",o(i,{preventDefault:!0}).on("tap",function(t){e.parent.removeFromDataSet(e),t.stopPropagation()}),t.appendChild(i),this.dom.deleteButton=i}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);o.call(this,t,e,i)}var o=i(33);s.prototype=new o(null,null,null),s.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.startt.start-e&&this.data.start-1?!1:"INPUT"==i||"SELECT"==i||"TEXTAREA"==i||e.contentEditable&&"true"==e.contentEditable}function o(t,e){return t.sort().join(",")===e.sort().join(",")}function n(t){t=t||{};var e,i=!1;for(e in E)t[e]?i=!0:E[e]=0;i||(T=!1)}function r(t,e,i,s,n){var r,a,h=[];if(!M[t])return[];for("keyup"==i&&c(t)&&(e=[t]),r=0;r95&&112>t||_.hasOwnProperty(t)&&(y[_[t]]=t)}return y}function f(t,e,i){return i||(i=u()[t]?"keydown":"keypress"),"keypress"==i&&e.length&&(i="keydown"),i}function g(t,e,s,o){E[t]=0,o||(o=f(e[0],[]));var r,a=function(){T=o,++E[t],p()},d=function(t){h(s,t),"keyup"!==o&&(D=i(t)),setTimeout(n,10)};for(r=0;r1)return g(t,d,e,i);for(h="+"===t?["+"]:t.split("+"),n=0;n":".","?":"/","|":"\\"},S={option:"alt",command:"meta","return":"enter",escape:"esc"},M={},C={},E={},D=!1,T=!1,O=1;20>O;++O)_[111+O]="f"+O;for(O=0;9>=O;++O)_[O+96]=O;e(document,"keypress",l),e(document,"keydown",l),e(document,"keyup",l);var L={bind:function(t,e,i){return v(t instanceof Array?t:[t],e,i),C[t+":"+i]=e,this},unbind:function(t,e){return C[t+":"+e]&&(delete C[t+":"+e],this.bind(t,function(){},e)),this},trigger:function(t,e){return C[t+":"+e](),this},reset:function(){return M={},C={},this}};t.exports=L},function(t,e,i){function s(t,e,i,s){var n=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},util:{snap:null,toScreen:n._toScreen.bind(n),toGlobalScreen:n._toGlobalScreen.bind(n),toTime:n._toTime.bind(n),toGlobalTime:n._toGlobalTime.bind(n)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.linegraph=new p(this.body),this.components.push(this.linegraph),this.itemsData=null,this.groupsData=null,i&&this.setOptions(i),s&&this.setGroups(s),e?this.setItems(e):this.redraw()}var o=(i(10),i(18),i(1)),n=i(7),r=i(8),a=i(20),h=i(23),d=i(24),l=i(26),c=i(28),p=i(43);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.linegraph&&this.linegraph.setItems(e),i&&("start"in this.options||"end"in this.options)){this.fit();var s="start"in this.options?o.convert(this.options.start,"Date"):null,a="end"in this.options?o.convert(this.options.end,"Date"):null;this.setWindow(s,a)}},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.linegraph.setGroups(e)},s.prototype.getLegend=function(t,e,i){return void 0===e&&(e=15),void 0===i&&(i=15),void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].getLegend(e,i):"cannot find group:"+t},s.prototype.isGroupVisible=function(t){return void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].visible&&(void 0===this.linegraph.options.groups.visibility[t]||1==this.linegraph.options.groups.visibility[t]):!1},s.prototype.getItemRange=function(){var t=null,e=null;for(var i in this.linegraph.groups)if(this.linegraph.groups.hasOwnProperty(i)&&1==this.linegraph.groups[i].visible)for(var s=0;sr?r:t,e=null==e?r:r>e?r:e}return{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},t.exports=s},function(t){function e(t,e,i,s,o){this.current=0,this.autoScale=!0,this.stepIndex=0,this.step=1,this.scale=1,this.marginStart,this.marginEnd,this.deadSpace=0,this.majorSteps=[1,2,5,10],this.minorSteps=[.25,.5,1,2],this.setRange(t,e,i,s,o)}e.prototype.setRange=function(t,e,i,s,o){this._start=void 0===o.min?t:o.min,this._end=void 0===o.max?e:o.max,t==e&&(this._start=t-.75,this._end=e+1),this.autoScale&&this.setMinimumStep(i,s),this.setFirst(o)},e.prototype.setMinimumStep=function(t,e){var i=this._end-this._start,s=1.2*i,o=t*(s/e),n=Math.round(Math.log(s)/Math.LN10),r=-1,a=Math.pow(10,n),h=0;0>n&&(h=n);for(var d=!1,l=h;Math.abs(l)<=Math.abs(n);l++){a=Math.pow(10,l);for(var c=0;c=o){d=!0,r=c;break}}if(1==d)break}this.stepIndex=r,this.scale=a,this.step=a*this.minorSteps[r]},e.prototype.setFirst=function(t){void 0===t&&(t={});var e=void 0===t.min?this._start-2*this.scale*this.minorSteps[this.stepIndex]:t.min,i=void 0===t.max?this._end+this.scale*this.minorSteps[this.stepIndex]:t.max;this.marginEnd=void 0===t.max?this.roundToMinor(i):t.max,this.marginStart=void 0===t.min?this.roundToMinor(e):t.min,this.deadSpace=this.roundToMinor(i)-i+this.roundToMinor(e)-e,this.marginRange=this.marginEnd-this.marginStart,this.current=this.marginEnd +},e.prototype.roundToMinor=function(t){var e=t-t%(this.scale*this.minorSteps[this.stepIndex]);return t%(this.scale*this.minorSteps[this.stepIndex])>.5*this.scale*this.minorSteps[this.stepIndex]?e+this.scale*this.minorSteps[this.stepIndex]:e},e.prototype.hasNext=function(){return this.current>=this.marginStart},e.prototype.next=function(){var t=this.current;this.current-=this.step,this.current==t&&(this.current=this._end)},e.prototype.previous=function(){this.current+=this.step,this.marginEnd+=this.step,this.marginRange=this.marginEnd-this.marginStart},e.prototype.getCurrent=function(){for(var t=""+Number(this.current).toPrecision(5),e=t.length-1;e>0;e--){if("0"!=t[e]){if("."==t[e]||","==t[e]){t=t.slice(0,e);break}break}t=t.slice(0,e)}return t},e.prototype.snap=function(){},e.prototype.isMajor=function(){return this.current%(this.scale*this.majorSteps[this.stepIndex])==0},t.exports=e},function(t,e,i){function s(t,e,i,s){this.id=o.randomUUID(),this.body=t,this.defaultOptions={orientation:"left",showMinorLabels:!0,showMajorLabels:!0,icons:!0,majorLinesOffset:7,minorLinesOffset:4,labelOffsetX:10,labelOffsetY:2,iconWidth:20,width:"40px",visible:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}}},this.linegraphOptions=s,this.linegraphSVG=i,this.props={},this.DOMelements={lines:{},labels:{}},this.dom={},this.range={start:0,end:0},this.options=o.extend({},this.defaultOptions),this.conversionFactor=1,this.setOptions(e),this.width=Number((""+this.options.width).replace("px","")),this.minWidth=this.width,this.height=this.linegraphSVG.offsetHeight,this.stepPixels=25,this.stepPixelsForced=25,this.lineOffset=0,this.master=!0,this.svgElements={},this.groups={},this.amountOfGroups=0,this._create()}var o=i(1),n=i(6),r=i(22),a=i(39);s.prototype=new r,s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype.setOptions=function(t){if(t){var e=!1;this.options.orientation!=t.orientation&&void 0!==t.orientation&&(e=!0);var i=["orientation","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","width","visible","customRange"];o.selectiveExtend(i,this.options,t),this.minWidth=Number((""+this.options.width).replace("px","")),1==e&&this.dom.frame&&(this.hide(),this.show())}},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.style.width=this.options.width,this.dom.frame.style.height=this.height,this.dom.lineContainer=document.createElement("div"),this.dom.lineContainer.style.width="100%",this.dom.lineContainer.style.height=this.height,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.height="100%",this.svg.style.width="100%",this.svg.style.display="block",this.dom.frame.appendChild(this.svg)},s.prototype._redrawGroupIcons=function(){n.prepareElements(this.svgElements);var t,e=this.options.iconWidth,i=15,s=4,o=s+.5*i;t="left"==this.options.orientation?s:this.width-e-s;for(var r in this.groups)this.groups.hasOwnProperty(r)&&(1!=this.groups[r].visible||void 0!==this.linegraphOptions.visibility[r]&&1!=this.linegraphOptions.visibility[r]||(this.groups[r].drawIcon(t,o,this.svgElements,this.svg,e,i),o+=i+s));n.cleanupElements(this.svgElements)},s.prototype.show=function(){this.dom.frame.parentNode||("left"==this.options.orientation?this.body.dom.left.appendChild(this.dom.frame):this.body.dom.right.appendChild(this.dom.frame)),this.dom.lineContainer.parentNode||this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.lineContainer.parentNode&&this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer)},s.prototype.setRange=function(t,e){this.range.start=t,this.range.end=e},s.prototype.redraw=function(){var t=!1,e=0;for(var i in this.groups)this.groups.hasOwnProperty(i)&&(1!=this.groups[i].visible||void 0!==this.linegraphOptions.visibility[i]&&1!=this.linegraphOptions.visibility[i]||e++);if(0==this.amountOfGroups||0==e)this.hide();else{this.show(),this.height=Number(this.linegraphSVG.style.height.replace("px","")),this.dom.lineContainer.style.height=this.height+"px",this.width=1==this.options.visible?Number((""+this.options.width).replace("px","")):0;var s=this.props,o=this.dom.frame;o.className="dataaxis",this._calculateCharSize();var n=this.options.orientation,r=this.options.showMinorLabels,a=this.options.showMajorLabels;s.minorLabelHeight=r?s.minorCharHeight:0,s.majorLabelHeight=a?s.majorCharHeight:0,s.minorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.minorLinesOffset,s.minorLineHeight=1,s.majorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.majorLinesOffset,s.majorLineHeight=1,"left"==n?(o.style.top="0",o.style.left="0",o.style.bottom="",o.style.width=this.width+"px",o.style.height=this.height+"px"):(o.style.top="",o.style.bottom="0",o.style.left="0",o.style.width=this.width+"px",o.style.height=this.height+"px"),t=this._redrawLabels(),1==this.options.icons&&this._redrawGroupIcons()}return t},s.prototype._redrawLabels=function(){n.prepareElements(this.DOMelements.lines),n.prepareElements(this.DOMelements.labels);var t=this.options.orientation,e=this.master?this.props.majorCharHeight||10:this.stepPixelsForced,i=new a(this.range.start,this.range.end,e,this.dom.frame.offsetHeight,this.options.customRange[this.options.orientation]);this.step=i;var s=(this.dom.frame.offsetHeight-i.deadSpace*(this.dom.frame.offsetHeight/i.marginRange))/((i.marginRange-i.deadSpace)/i.step);this.stepPixels=s;var o=this.height/s,r=0;if(0==this.master){s=this.stepPixelsForced,r=Math.round(this.dom.frame.offsetHeight/s-o);for(var h=0;.5*r>h;h++)i.previous();o=this.height/s}else o+=.25;this.valueAtZero=i.marginEnd;var d=0,l=1;this.maxLabelSize=0;for(var c=0;l=0&&this._redrawLabel(c-2,i.getCurrent(),t,"yAxis major",this.props.majorCharHeight),this._redrawLine(c,t,"grid horizontal major",this.options.majorLinesOffset,this.props.majorLineWidth)):this._redrawLine(c,t,"grid horizontal minor",this.options.minorLinesOffset,this.props.minorLineWidth),l++}this.conversionFactor=0==this.master?c/(this.valueAtZero-i.current):this.dom.frame.offsetHeight/i.marginRange;var u=1==this.options.icons?this.options.iconWidth+this.options.labelOffsetX+15:this.options.labelOffsetX+15;return this.maxLabelSize>this.width-u&&1==this.options.visible?(this.width=this.maxLabelSize+u,this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+u),this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):(n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),!1)},s.prototype.convertValue=function(t){var e=this.valueAtZero-t,i=e*this.conversionFactor;return i},s.prototype._redrawLabel=function(t,e,i,s,o){var r=n.getDOMElement("div",this.DOMelements.labels,this.dom.frame);r.className=s,r.innerHTML=e,"left"==i?(r.style.left="-"+this.options.labelOffsetX+"px",r.style.textAlign="right"):(r.style.right="-"+this.options.labelOffsetX+"px",r.style.textAlign="left"),r.style.top=t-.5*o+this.options.labelOffsetY+"px",e+="";var a=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSize"));this.dom.textArea.innerHTML=i,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},s.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){n.prepareElements(this.svgElements);var t=window.getComputedStyle(this.dom.frame).paddingTop,e=Number(t.replace("px","")),i=e,s=this.options.iconSize,o=.75*this.options.iconSize,r=e+.5*o+3;this.svg.style.width=s+5+e+"px";for(var a in this.groups)this.groups.hasOwnProperty(a)&&(1!=this.groups[a].visible||void 0!==this.linegraphOptions.visibility[a]&&1!=this.linegraphOptions.visibility[a]||(this.groups[a].drawIcon(i,r,this.svgElements,this.svg,s,o),r+=o+this.options.iconSpacing));n.cleanupElements(this.svgElements)}},t.exports=s},function(t,e,i){function s(t,e){this.id=o.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,handleOverlap:"overlap",align:"center"},catmullRom:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:"40px",visible:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}}},legend:{enabled:!1,icons:!0,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}},groups:{visibility:{}}},this.options=o.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={},this.abortedGraphUpdate=!1;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechange",function(){if(0!=i.lastStart){var t=i.body.range.start-i.lastStart,e=i.body.range.end-i.body.range.start;if(0!=i.width){var s=i.width/e,o=t*s;i.svg.style.left=-i.width-o+"px"}}}),this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=o.option.asSize(-i.width),i._updateGraph.apply(i)}),this._create(),this.body.emitter.emit("change")}var o=i(1),n=i(6),r=i(7),a=i(8),h=i(22),d=i(40),l=i(41),c=i(42),p="__ungrouped__";s.prototype=new h,s.prototype._create=function(){var t=document.createElement("div");t.className="LineGraph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),this.options.dataAxis.orientation="right",this.yAxisRight=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),delete this.options.dataAxis.orientation,this.legendLeft=new c(this.body,this.options.legend,"left",this.options.groups),this.legendRight=new c(this.body,this.options.legend,"right",this.options.groups),this.show()},s.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort","groups"];o.selectiveDeepExtend(e,this.options,t),o.mergeOptions(this.options,t,"catmullRom"),o.mergeOptions(this.options,t,"drawPoints"),o.mergeOptions(this.options,t,"shaded"),o.mergeOptions(this.options,t,"legend"),t.catmullRom&&"object"==typeof t.catmullRom&&t.catmullRom.parametrization&&("uniform"==t.catmullRom.parametrization?this.options.catmullRom.alpha=0:"chordal"==t.catmullRom.parametrization?this.options.catmullRom.alpha=1:(this.options.catmullRom.parametrization="centripetal",this.options.catmullRom.alpha=.5)),this.yAxisLeft&&void 0!==t.dataAxis&&(this.yAxisLeft.setOptions(this.options.dataAxis),this.yAxisRight.setOptions(this.options.dataAxis)),this.legendLeft&&void 0!==t.legend&&(this.legendLeft.setOptions(this.options.legend),this.legendRight.setOptions(this.options.legend)),this.groups.hasOwnProperty(p)&&this.groups[p].setOptions(t)}this.dom.frame&&this._updateGraph()},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(o.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;o.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e)}this._updateUngrouped(),this._updateGraph(),this.redraw()},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(o.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;o.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._onUpdate()},s.prototype._onUpdate=function(){this._updateUngrouped(),this._updateAllGroupData(),this._updateGraph(),this.redraw()},s.prototype._onAdd=function(t){this._onUpdate(t)},s.prototype._onRemove=function(t){this._onUpdate(t)},s.prototype._onUpdateGroups=function(t){for(var e=0;e0){var d=this.body.util.toGlobalTime(-this.body.domProps.root.width),l=this.body.util.toGlobalTime(2*this.body.domProps.root.width),c={};for(this._getRelevantData(a,c,d,l),e=0;e0)for(r=0;rs){d.push(h);break}d.push(h)}}else for(a=0;ai&&h.x0)for(var s=0;s0){var n=1,r=o.length,a=this.body.util.toGlobalScreen(o[o.length-1].x)-this.body.util.toGlobalScreen(o[0].x),h=r/a;n=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=[],l=0;r>l;l+=n)d.push(o[l]);e[t[s]]=d}}},s.prototype._getYRanges=function(t,e,i){var s,o,n,r,a,h=[],d=[];if(t.length>0){for(n=0;n0)if(o=this.groups[t[n]],"line"==o.options.style||"stack"!=o.options.barChart.handleOverlap){var l=s[0].y,c=s[0].y;for(r=0;rs[r].y?s[r].y:l,c=c0&&(h.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x}),p={},this._getDataIntersections(p,h),i.__barchartLeft=this._getStackedBarYRange(p,h),i.__barchartLeft.yAxisOrientation="left",t.push("__barchartLeft")),d.length>0&&(d.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x}),p={},this._getDataIntersections(p,d),i.__barchartRight=this._getStackedBarYRange(p,d),i.__barchartRight.yAxisOrientation="right",t.push("__barchartRight"))}},s.prototype._getStackedBarYRange=function(t,e){for(var i,s=e[0].y,o=e[0].y,n=0;ne[n].y?e[n].y:s,o=ot[r].accumulated?t[r].accumulated:s,o=o0){for(var c=0;ci?i:a,d=s>d?s:d):(r=!0,h=h>i?i:h,l=s>l?s:l));1==n&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}return o=this._toggleAxisVisiblity(n,this.yAxisLeft)||o,o=this._toggleAxisVisiblity(r,this.yAxisRight)||o,1==r&&1==n?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!n,0==this.yAxisRight.master?(this.yAxisLeft.lineOffset=1==r?this.yAxisRight.width:0,o=this.yAxisLeft.redraw()||o,this.yAxisRight.stepPixelsForced=this.yAxisLeft.stepPixels,o=this.yAxisRight.redraw()||o):o=this.yAxisRight.redraw()||o,-1!=t.indexOf("__barchartLeft")&&t.splice(t.indexOf("__barchartLeft"),1),-1!=t.indexOf("__barchartRight")&&t.splice(t.indexOf("__barchartRight"),1),o},s.prototype._toggleAxisVisiblity=function(t,e){var i=!1;return 0==t?e.dom.frame.parentNode&&(e.hide(),i=!0):e.dom.frame.parentNode||(e.show(),i=!0),i},s.prototype._drawBarGraphs=function(t,e){var i,s,o,r,a,h,d=[],l={},c=0;for(a=0;a0&&(i=Math.min(i,Math.abs(d[a-1].x-s))),o=this._getSafeDrawData(i,r,p);else{var f=a+(l[s].amount-l[s].resolved),g=a-(l[s].resolved+1);f0&&(i=Math.min(i,Math.abs(d[g].x-s))),o=this._getSafeDrawData(i,r,p),l[s].resolved+=1,"stack"==r.options.barChart.handleOverlap?(u=l[s].accumulated,l[s].accumulated+=r.zeroPosition-d[a].y):"sideBySide"==r.options.barChart.handleOverlap&&(o.width=o.width/l[s].amount,o.offset+=l[s].resolved*o.width-.5*o.width*(l[s].amount+1),"left"==r.options.barChart.align?o.offset-=.5*o.width:"right"==r.options.barChart.align&&(o.offset+=.5*o.width))}n.drawBar(d[a].x+o.offset,d[a].y-u,o.width,r.zeroPosition-d[a].y,r.className+" bar",this.svgElements,this.svg),1==r.options.drawPoints.enabled&&n.drawPoint(d[a].x+o.offset,d[a].y-u,r,this.svgElements,this.svg)}},s.prototype._getDataIntersections=function(t,e){for(var i,s=0;s0&&(i=Math.min(i,Math.abs(e[s-1].x-e[s].x))),0==i&&(void 0===t[e[s].x]&&(t[e[s].x]={amount:0,resolved:0,accumulated:0}),t[e[s].x].amount+=1)},s.prototype._getSafeDrawData=function(t,e,i){var s,o;return t0?(s=i>t?i:t,o=0,"left"==e.options.barChart.align?o-=.5*t:"right"==e.options.barChart.align&&(o+=.5*t)):(s=e.options.barChart.width,o=0,"left"==e.options.barChart.align?o-=.5*e.options.barChart.width:"right"==e.options.barChart.align&&(o+=.5*e.options.barChart.width)),{width:s,offset:o}},s.prototype._drawLineGraph=function(t,e){if(null!=t&&t.length>0){var i,s,o=Number(this.svg.style.height.replace("px",""));if(i=n.getSVGElement("path",this.svgElements,this.svg),i.setAttributeNS(null,"class",e.className),s=1==e.options.catmullRom.enabled?this._catmullRom(t,e):this._linear(t),1==e.options.shaded.enabled){var r,a=n.getSVGElement("path",this.svgElements,this.svg);r="top"==e.options.shaded.orientation?"M"+t[0].x+",0 "+s+"L"+t[t.length-1].x+",0":"M"+t[0].x+","+o+" "+s+"L"+t[t.length-1].x+","+o,a.setAttributeNS(null,"class",e.className+" fill"),a.setAttributeNS(null,"d",r)}i.setAttributeNS(null,"d","M"+s),1==e.options.drawPoints.enabled&&this._drawPoints(t,e,this.svgElements,this.svg)}},s.prototype._drawPoints=function(t,e,i,s,o){void 0===o&&(o=0);for(var r=0;rl;l++)e=0==l?t[0]:t[l-1],i=t[l],s=t[l+1],o=d>l+2?t[l+2]:s,n={x:(-e.x+6*i.x+s.x)*h,y:(-e.y+6*i.y+s.y)*h},r={x:(i.x+6*s.x-o.x)*h,y:(i.y+6*s.y-o.y)*h},a+="C"+n.x+","+n.y+" "+r.x+","+r.y+" "+s.x+","+s.y+" ";return a},s.prototype._catmullRom=function(t,e){var i=e.options.catmullRom.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);for(var s,o,n,r,a,h,d,l,c,p,u,f,g,m,v,y,b,_,x,w=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",S=t.length,M=0;S-1>M;M++)s=0==M?t[0]:t[M-1],o=t[M],n=t[M+1],r=S>M+2?t[M+2]:n,d=Math.sqrt(Math.pow(s.x-o.x,2)+Math.pow(s.y-o.y,2)),l=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),c=Math.sqrt(Math.pow(n.x-r.x,2)+Math.pow(n.y-r.y,2)),m=Math.pow(c,i),y=Math.pow(c,2*i),v=Math.pow(l,i),b=Math.pow(l,2*i),x=Math.pow(d,i),_=Math.pow(d,2*i),p=2*_+3*x*v+b,u=2*y+3*m*v+b,f=3*x*(x+v),f>0&&(f=1/f),g=3*m*(m+v),g>0&&(g=1/g),a={x:(-b*s.x+p*o.x+_*n.x)*f,y:(-b*s.y+p*o.y+_*n.y)*f},h={x:(y*o.x+u*n.x-b*r.x)*g,y:(y*o.y+u*n.y-b*r.y)*g},0==a.x&&0==a.y&&(a=o),0==h.x&&0==h.y&&(h=n),w+="C"+a.x+","+a.y+" "+h.x+","+h.y+" "+n.x+","+n.y+" ";return w},s.prototype._linear=function(t){for(var e="",i=0;it.x&&(s=t.x),ot.y&&(e=t.y),i=this.constants.clustering.initialMaxNodes?49.07548/(o+142.05338)+91444e-8:12.662/(o+7.4147)+.0964822:1==this.constants.clustering.enabled&&o>=this.constants.clustering.initialMaxNodes?77.5271985/(o+187.266146)+476710517e-13:30.5062972/(o+19.93597763)+.08413486;var n=Math.min(this.frame.canvas.clientWidth/600,this.frame.canvas.clientHeight/600);i*=n}else{var r=1.1*(Math.abs(s.minX)+Math.abs(s.maxX)),a=1.1*(Math.abs(s.minY)+Math.abs(s.maxY)),h=this.frame.canvas.clientWidth/r,d=this.frame.canvas.clientHeight/a;i=d>=h?h:d}i>1&&(i=1),this._setScale(i),this._centerNetwork(s),0==e&&(this.moving=!0,this.start())},s.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},s.prototype.setData=function(t,e){if(void 0===e&&(e=!1),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){if(t&&t.dot){var i=c.DOTToGraph(t.dot);return void this.setData(i)}}else if(t&&t.gephi){if(t&&t.gephi){var s=p.parseGephi(t.gephi);return void this.setData(s)}}else this._setNodes(t&&t.nodes),this._setEdges(t&&t.edges);if(this._putDataInSector(),!e)if(this.constants.stabilize){var o=this;setTimeout(function(){o._stabilize(),o.start()},0)}else this.start()},s.prototype.setOptions=function(t){if(t){var e,i=["nodes","edges","smoothCurves","hierarchicalLayout","clustering","navigation","keyboard","dataManipulation","onAdd","onEdit","onEditEdge","onConnect","onDelete","clickToUse"];if(a.selectiveNotDeepExtend(i,this.constants,t),a.selectiveNotDeepExtend(["color"],this.constants.nodes,t.nodes),a.selectiveNotDeepExtend(["color","length"],this.constants.edges,t.edges),t.physics&&(a.mergeOptions(this.constants.physics,t.physics,"barnesHut"),a.mergeOptions(this.constants.physics,t.physics,"repulsion"),t.physics.hierarchicalRepulsion)){this.constants.hierarchicalLayout.enabled=!0,this.constants.physics.hierarchicalRepulsion.enabled=!0,this.constants.physics.barnesHut.enabled=!1;for(e in t.physics.hierarchicalRepulsion)t.physics.hierarchicalRepulsion.hasOwnProperty(e)&&(this.constants.physics.hierarchicalRepulsion[e]=t.physics.hierarchicalRepulsion[e])}if(t.onAdd&&(this.triggerFunctions.add=t.onAdd),t.onEdit&&(this.triggerFunctions.edit=t.onEdit),t.onEditEdge&&(this.triggerFunctions.editEdge=t.onEditEdge),t.onConnect&&(this.triggerFunctions.connect=t.onConnect),t.onDelete&&(this.triggerFunctions.del=t.onDelete),a.mergeOptions(this.constants,t,"smoothCurves"),a.mergeOptions(this.constants,t,"hierarchicalLayout"),a.mergeOptions(this.constants,t,"clustering"),a.mergeOptions(this.constants,t,"navigation"),a.mergeOptions(this.constants,t,"keyboard"),a.mergeOptions(this.constants,t,"dataManipulation"),t.dataManipulation&&(this.editMode=this.constants.dataManipulation.initiallyVisible),t.edges&&(void 0!==t.edges.color&&(a.isString(t.edges.color)?(this.constants.edges.color={},this.constants.edges.color.color=t.edges.color,this.constants.edges.color.highlight=t.edges.color,this.constants.edges.color.hover=t.edges.color):(void 0!==t.edges.color.color&&(this.constants.edges.color.color=t.edges.color.color),void 0!==t.edges.color.highlight&&(this.constants.edges.color.highlight=t.edges.color.highlight),void 0!==t.edges.color.hover&&(this.constants.edges.color.hover=t.edges.color.hover))),t.edges.fontColor||void 0!==t.edges.color&&(a.isString(t.edges.color)?this.constants.edges.fontColor=t.edges.color:void 0!==t.edges.color.color&&(this.constants.edges.fontColor=t.edges.color.color))),t.nodes&&t.nodes.color){var s=a.parseColor(t.nodes.color);this.constants.nodes.color.background=s.background,this.constants.nodes.color.border=s.border,this.constants.nodes.color.highlight.background=s.highlight.background,this.constants.nodes.color.highlight.border=s.highlight.border,this.constants.nodes.color.hover.background=s.hover.background,this.constants.nodes.color.hover.border=s.hover.border}if(t.groups)for(var o in t.groups)if(t.groups.hasOwnProperty(o)){var n=t.groups[o];this.groups.add(o,n)}if(t.tooltip){for(e in t.tooltip)t.tooltip.hasOwnProperty(e)&&(this.constants.tooltip[e]=t.tooltip[e]);t.tooltip.color&&(this.constants.tooltip.color=a.parseColor(t.tooltip.color))}if("clickToUse"in t&&(t.clickToUse?(this.activator=new b(this.frame),this.activator.on("change",this._createKeyBinds.bind(this))):this.activator&&(this.activator.destroy(),delete this.activator)),t.labels)throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.')}this._loadPhysicsSystem(),this._loadNavigationControls(),this._loadManipulationSystem(),this._configureSmoothCurves(),this._createKeyBinds(),this.setSize(this.constants.width,this.constants.height),this.moving=!0,this.start()},s.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis network-frame",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),!this.frame.canvas.getContext){var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}var e=this;this.drag={},this.pinch={},this.hammer=n(this.frame.canvas,{prevent_default:!0}),this.hammer.on("tap",e._onTap.bind(e)),this.hammer.on("doubletap",e._onDoubleTap.bind(e)),this.hammer.on("hold",e._onHold.bind(e)),this.hammer.on("pinch",e._onPinch.bind(e)),this.hammer.on("touch",e._onTouch.bind(e)),this.hammer.on("dragstart",e._onDragStart.bind(e)),this.hammer.on("drag",e._onDrag.bind(e)),this.hammer.on("dragend",e._onDragEnd.bind(e)),this.hammer.on("release",e._onRelease.bind(e)),this.hammer.on("mousewheel",e._onMouseWheel.bind(e)),this.hammer.on("DOMMouseScroll",e._onMouseWheel.bind(e)),this.hammer.on("mousemove",e._onMouseMoveTitle.bind(e)),this.containerElement.appendChild(this.frame)},s.prototype._createKeyBinds=function(){var t=this;this.mousetrap=r,this.mousetrap.reset(),this.constants.keyboard.enabled&&this.isActive()&&(this.mousetrap.bind("up",this._moveUp.bind(t),"keydown"),this.mousetrap.bind("up",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("down",this._moveDown.bind(t),"keydown"),this.mousetrap.bind("down",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("left",this._moveLeft.bind(t),"keydown"),this.mousetrap.bind("left",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("right",this._moveRight.bind(t),"keydown"),this.mousetrap.bind("right",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("=",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("=",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("-",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("-",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("[",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("[",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("]",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("]",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pageup",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("pageup",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pagedown",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("pagedown",this._stopZoom.bind(t),"keyup")),1==this.constants.dataManipulation.enabled&&(this.mousetrap.bind("escape",this._createManipulatorBar.bind(t)),this.mousetrap.bind("del",this._deleteSelected.bind(t)))},s.prototype._getPointer=function(t){return{x:t.pageX-a.getAbsoluteLeft(this.frame.canvas),y:t.pageY-a.getAbsoluteTop(this.frame.canvas)}},s.prototype._onTouch=function(t){this.drag.pointer=this._getPointer(t.gesture.center),this.drag.pinched=!1,this.pinch.scale=this._getScale(),this._handleTouch(this.drag.pointer)},s.prototype._onDragStart=function(){this._handleDragStart()},s.prototype._handleDragStart=function(){var t=this.drag,e=this._getNodeAt(t.pointer);if(t.dragging=!0,t.selection=[],t.translation=this._getTranslation(),t.nodeId=null,null!=e){t.nodeId=e.id,e.isSelected()||this._selectObject(e,!1);for(var i in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(i)){var s=this.selectionObj.nodes[i],o={id:s.id,node:s,x:s.x,y:s.y,xFixed:s.xFixed,yFixed:s.yFixed};s.xFixed=!0,s.yFixed=!0,t.selection.push(o)}}},s.prototype._onDrag=function(t){this._handleOnDrag(t)},s.prototype._handleOnDrag=function(t){if(!this.drag.pinched){var e=this._getPointer(t.gesture.center),i=this,s=this.drag,o=s.selection;if(o&&o.length&&1==this.constants.dragNodes){var n=e.x-s.pointer.x,r=e.y-s.pointer.y;o.forEach(function(t){var e=t.node;t.xFixed||(e.x=i._XconvertDOMtoCanvas(i._XconvertCanvasToDOM(t.x)+n)),t.yFixed||(e.y=i._YconvertDOMtoCanvas(i._YconvertCanvasToDOM(t.y)+r))}),this.moving||(this.moving=!0,this.start())}else if(1==this.constants.dragNetwork){var a=e.x-this.drag.pointer.x,h=e.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+a,this.drag.translation.y+h),this._redraw()}}},s.prototype._onDragEnd=function(){this.drag.dragging=!1;var t=this.drag.selection;t&&t.length?(t.forEach(function(t){t.node.xFixed=t.xFixed,t.node.yFixed=t.yFixed}),this.moving=!0,this.start()):this._redraw()},s.prototype._onTap=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleTap(e)},s.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.center);this._handleDoubleTap(e)},s.prototype._onHold=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleOnHold(e)},s.prototype._onRelease=function(t){var e=this._getPointer(t.gesture.center);this._handleOnRelease(e)},s.prototype._onPinch=function(t){var e=this._getPointer(t.gesture.center);this.drag.pinched=!0,"scale"in this.pinch||(this.pinch.scale=1);var i=this.pinch.scale*t.gesture.scale;this._zoom(i,e)},s.prototype._zoom=function(t,e){if(1==this.constants.zoomable){var i=this._getScale();1e-5>t&&(t=1e-5),t>10&&(t=10);var s=null;void 0!==this.drag&&1==this.drag.dragging&&(s=this.DOMtoCanvas(this.drag.pointer));var o=this._getTranslation(),n=t/i,r=(1-n)*e.x+o.x*n,a=(1-n)*e.y+o.y*n;if(this.areaCenter={x:this._XconvertDOMtoCanvas(e.x),y:this._YconvertDOMtoCanvas(e.y)},this._setScale(t),this._setTranslation(r,a),this.updateClustersDefault(),null!=s){var h=this.canvasToDOM(s);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}return this._redraw(),t>i?this.emit("zoom",{direction:"+"}):this.emit("zoom",{direction:"-"}),t}},s.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i=this._getScale(),s=e/10;0>e&&(s/=1-s),i*=1+s;var o=h.fakeGesture(this,t),n=this._getPointer(o.center);this._zoom(i,n)}t.preventDefault()},s.prototype._onMouseMoveTitle=function(t){var e=h.fakeGesture(this,t),i=this._getPointer(e.center);this.popupObj&&this._checkHidePopup(i);var s=this,o=function(){s._checkShowPopup(i)};if(this.popupTimer&&clearInterval(this.popupTimer),this.drag.dragging||(this.popupTimer=setTimeout(o,this.constants.tooltip.delay)),1==this.constants.hover){for(var n in this.hoverObj.edges)this.hoverObj.edges.hasOwnProperty(n)&&(this.hoverObj.edges[n].hover=!1,delete this.hoverObj.edges[n]);var r=this._getNodeAt(i);null==r&&(r=this._getEdgeAt(i)),null!=r&&this._hoverObject(r);for(var a in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(a)&&(r instanceof g&&r.id!=a||r instanceof m||null==r)&&(this._blurObject(this.hoverObj.nodes[a]),delete this.hoverObj.nodes[a]);this.redraw()}},s.prototype._checkShowPopup=function(t){var e,i={left:this._XconvertDOMtoCanvas(t.x),top:this._YconvertDOMtoCanvas(t.y),right:this._XconvertDOMtoCanvas(t.x),bottom:this._YconvertDOMtoCanvas(t.y)},s=this.popupObj;if(void 0==this.popupObj){var o=this.nodes;for(e in o)if(o.hasOwnProperty(e)){var n=o[e];if(void 0!==n.getTitle()&&n.isOverlappingWith(i)){this.popupObj=n;break}}}if(void 0===this.popupObj){var r=this.edges;for(e in r)if(r.hasOwnProperty(e)){var a=r[e];if(a.connected&&void 0!==a.getTitle()&&a.isOverlappingWith(i)){this.popupObj=a;break}}}if(this.popupObj){if(this.popupObj!=s){var h=this;h.popup||(h.popup=new v(h.frame,h.constants.tooltip)),h.popup.setPosition(t.x-3,t.y-3),h.popup.setText(h.popupObj.getTitle()),h.popup.show()}}else this.popup&&this.popup.hide()},s.prototype._checkHidePopup=function(t){this.popupObj&&this._getNodeAt(t)||(this.popupObj=void 0,this.popup&&this.popup.hide())},s.prototype.setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,this.emit("resize",{width:this.frame.canvas.width,height:this.frame.canvas.height})},s.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof d||t instanceof l)this.nodesData=t;else if(t instanceof Array)this.nodesData=new d,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new d}if(e&&a.forEach(this.nodesListeners,function(t,i){e.off(i,t)}),this.nodes={},this.nodesData){var i=this;a.forEach(this.nodesListeners,function(t,e){i.nodesData.on(e,t)});var s=this.nodesData.getIds();this._addNodes(s)}this._updateSelection()},s.prototype._addNodes=function(t){for(var e,i=0,s=t.length;s>i;i++){e=t[i];var o=this.nodesData.get(e),n=new g(o,this.images,this.groups,this.constants);if(this.nodes[e]=n,!(0!=n.xFixed&&0!=n.yFixed||null!==n.x&&null!==n.y)){var r=1*t.length+10,a=2*Math.PI*Math.random();0==n.xFixed&&(n.x=r*Math.cos(a)),0==n.yFixed&&(n.y=r*Math.sin(a))}this.moving=!0}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateValueRange(this.nodes),this.updateLabels()},s.prototype._updateNodes=function(t){for(var e=this.nodes,i=this.nodesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n],a=i.get(n);r?r.setProperties(a,this.constants):(r=new g(properties,this.images,this.groups,this.constants),e[n]=r)}this.moving=!0,1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateNodeIndexList(),this._reconnectEdges(),this._updateValueRange(e)},s.prototype._removeNodes=function(t){for(var e=this.nodes,i=0,s=t.length;s>i;i++){var o=t[i];delete e[o]}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateSelection(),this._updateValueRange(e)},s.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof d||t instanceof l)this.edgesData=t;else if(t instanceof Array)this.edgesData=new d,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new d}if(e&&a.forEach(this.edgesListeners,function(t,i){e.off(i,t)}),this.edges={},this.edgesData){var i=this;a.forEach(this.edgesListeners,function(t,e){i.edgesData.on(e,t)});var s=this.edgesData.getIds();this._addEdges(s)}this._reconnectEdges()},s.prototype._addEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n];r&&r.disconnect();var a=i.get(n,{showInternalIds:!0});e[n]=new m(a,this,this.constants)}this.moving=!0,this._updateValueRange(e),this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._updateEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=i.get(n),a=e[n];a?(a.disconnect(),a.setProperties(r,this.constants),a.connect()):(a=new m(r,this,this.constants),this.edges[n]=a)}this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this.moving=!0,this._updateValueRange(e)},s.prototype._removeEdges=function(t){for(var e=this.edges,i=0,s=t.length;s>i;i++){var o=t[i],n=e[o];n&&(null!=n.via&&delete this.sectors.support.nodes[n.via.id],n.disconnect(),delete e[o])}this.moving=!0,this._updateValueRange(e),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._reconnectEdges=function(){var t,e=this.nodes,i=this.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var s=i[t];s.from=null,s.to=null,s.connect()}},s.prototype._updateValueRange=function(t){var e,i=void 0,s=void 0;for(e in t)if(t.hasOwnProperty(e)){var o=t[e].getValue();void 0!==o&&(i=void 0===i?o:Math.min(o,i),s=void 0===s?o:Math.max(o,s))}if(void 0!==i&&void 0!==s)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,s)},s.prototype.redraw=function(){this.setSize(this.constants.width,this.constants.height),this._redraw()},s.prototype._redraw=function(){var t=this.frame.canvas.getContext("2d"),e=this.frame.canvas.width,i=this.frame.canvas.height;t.clearRect(0,0,e,i),t.save(),t.translate(this.translation.x,this.translation.y),t.scale(this.scale,this.scale),this.canvasTopLeft={x:this._XconvertDOMtoCanvas(0),y:this._YconvertDOMtoCanvas(0)},this.canvasBottomRight={x:this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth),y:this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight)},this._doInAllSectors("_drawAllSectorNodes",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideEdgesOnDrag)&&this._doInAllSectors("_drawEdges",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideNodesOnDrag)&&this._doInAllSectors("_drawNodes",t,!1),1==this.controlNodesActive&&this._doInAllSectors("_drawControlNodes",t),t.restore()},s.prototype._setTranslation=function(t,e){void 0===this.translation&&(this.translation={x:0,y:0}),void 0!==t&&(this.translation.x=t),void 0!==e&&(this.translation.y=e),this.emit("viewChanged")},s.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},s.prototype._setScale=function(t){this.scale=t},s.prototype._getScale=function(){return this.scale},s.prototype._XconvertDOMtoCanvas=function(t){return(t-this.translation.x)/this.scale},s.prototype._XconvertCanvasToDOM=function(t){return t*this.scale+this.translation.x},s.prototype._YconvertDOMtoCanvas=function(t){return(t-this.translation.y)/this.scale},s.prototype._YconvertCanvasToDOM=function(t){return t*this.scale+this.translation.y},s.prototype.canvasToDOM=function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}},s.prototype.DOMtoCanvas=function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}},s.prototype._drawNodes=function(t,e){void 0===e&&(e=!1);var i=this.nodes,s=[];for(var o in i)i.hasOwnProperty(o)&&(i[o].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight),i[o].isSelected()?s.push(o):(i[o].inArea()||e)&&i[o].draw(t));for(var n=0,r=s.length;r>n;n++)(i[s[n]].inArea()||e)&&i[s[n]].draw(t)},s.prototype._drawEdges=function(t){var e=this.edges;for(var i in e)if(e.hasOwnProperty(i)){var s=e[i];s.setScale(this.scale),s.connected&&e[i].draw(t)}},s.prototype._drawControlNodes=function(t){var e=this.edges;for(var i in e)e.hasOwnProperty(i)&&e[i]._drawControlNodes(t)},s.prototype._stabilize=function(){1==this.constants.freezeForStabilization&&this._freezeDefinedNodes();for(var t=0;this.moving&&t0)for(e in s)s.hasOwnProperty(e)&&(s[e].discreteStepLimited(i,this.constants.maxVelocity),o=!0);else for(e in s)s.hasOwnProperty(e)&&(s[e].discreteStep(i),o=!0);if(1==o&&(void 0===t||1==t)){var n=this.constants.minVelocity/Math.max(this.scale,.05);n>.5*this.constants.maxVelocity?this.moving=!0:(this.moving=this._isMoving(n),0==this.moving&&this.emit("stabilized",{iterations:null}),this.moving=this.moving||this.configurePhysics)}},s.prototype._physicsTick=function(){this.freezeSimulation||1==this.moving&&(this._doInAllActiveSectors("_initializeForceCalculation"),this._doInAllActiveSectors("_discreteStepNodes"),1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic&&this._doInSupportSector("_discreteStepNodes",!1),this._findCenter(this._getRange()))},s.prototype._animationStep=function(){this.timer=void 0,this._handleNavigation(),this.start();var t=Date.now(),e=1;this._physicsTick();for(var i=Date.now()-t;i<.9*(this.renderTimestep-this.renderTime)&&ei;i++)if(e.id===r.nodes[i].id){o=r.nodes[i];break}for(o||(o={id:e.id},t.node&&(o.attr=a(o.attr,t.node))),i=n.length-1;i>=0;i--){var h=n[i];h.nodes||(h.nodes=[]),-1==h.nodes.indexOf(o)&&h.nodes.push(o)}e.attr&&(o.attr=a(o.attr,e.attr))}function l(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=a({},t.edge);e.attr=a(i,e.attr)}}function c(t,e,i,s,o){var n={from:e,to:i,type:s};return t.edge&&(n.attr=a({},t.edge)),n.attr=a(n.attr||{},o),n}function p(){for(k=C.NULL,L="";" "==O||" "==O||"\n"==O||"\r"==O;)o();do{var t=!1;if("#"==O){for(var e=T-1;" "==D.charAt(e)||" "==D.charAt(e);)e--;if("\n"==D.charAt(e)||""==D.charAt(e)){for(;""!=O&&"\n"!=O;)o();t=!0}}if("/"==O&&"/"==n()){for(;""!=O&&"\n"!=O;)o();t=!0}if("/"==O&&"*"==n()){for(;""!=O;){if("*"==O&&"/"==n()){o(),o();break}o()}t=!0}for(;" "==O||" "==O||"\n"==O||"\r"==O;)o()}while(t);if(""==O)return void(k=C.DELIMITER);var i=O+n();if(E[i])return k=C.DELIMITER,L=i,o(),void o();if(E[O])return k=C.DELIMITER,L=O,void o();if(r(O)||"-"==O){for(L+=O,o();r(O);)L+=O,o();return"false"==L?L=!1:"true"==L?L=!0:isNaN(Number(L))||(L=Number(L)),void(k=C.IDENTIFIER)}if('"'==O){for(o();""!=O&&('"'!=O||'"'==O&&'"'==n());)L+=O,'"'==O&&o(),o();if('"'!=O)throw x('End of string " expected');return o(),void(k=C.IDENTIFIER)}for(k=C.UNKNOWN;""!=O;)L+=O,o();throw new SyntaxError('Syntax error in part "'+w(L,30)+'"')}function u(){var t={};if(s(),p(),"strict"==L&&(t.strict=!0,p()),("graph"==L||"digraph"==L)&&(t.type=L,p()),k==C.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),f(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function f(t){for(;""!==L&&"}"!=L;)g(t),";"==L&&p()}function g(t){var e=m(t);if(e)return void b(t,e);var i=v(t);if(!i){if(k!=C.IDENTIFIER)throw x("Identifier expected");var s=L;if(p(),"="==L){if(p(),k!=C.IDENTIFIER)throw x("Identifier expected");t[s]=L,p()}else y(t,s)}}function m(t){var e=null;if("subgraph"==L&&(e={},e.type="subgraph",p(),k==C.IDENTIFIER&&(e.id=L,p())),"{"==L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,f(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function v(t){return"node"==L?(p(),t.node=_(),"node"):"edge"==L?(p(),t.edge=_(),"edge"):"graph"==L?(p(),t.graph=_(),"graph"):null}function y(t,e){var i={id:e},s=_();s&&(i.attr=s),d(t,i),b(t,e)}function b(t,e){for(;"->"==L||"--"==L;){var i,s=L;p();var o=m(t);if(o)i=o;else{if(k!=C.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,d(t,{id:i}),p()}var n=_(),r=c(t,e,i,s,n);l(t,r),e=i}}function _(){for(var t=null;"["==L;){for(p(),t={};""!==L&&"]"!=L;){if(k!=C.IDENTIFIER)throw x("Attribute name expected");var e=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),k!=C.IDENTIFIER)throw x("Attribute value expected");var i=L;h(t,e,i),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+w(L,30)+'" (char '+T+")")}function w(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){t instanceof Array?t.forEach(function(t){e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}):e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}function M(t){function e(t){var e={from:t.from,to:t.to};return a(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var s=i(t),o={nodes:[],edges:[],options:{}};return s.nodes&&s.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};a(e,t.attr),e.image&&(e.shape="image"),o.nodes.push(e)}),s.edges&&s.edges.forEach(function(t){var i,s;i=t.from instanceof Object?t.from.nodes:{id:t.from},s=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var i=e(t);o.edges.push(i)}),S(i,s,function(i,s){var n=c(o,i.id,s.id,t.type,t.attr),r=e(n);o.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var i=e(t);o.edges.push(i)})}),s.attr&&(o.options=s.attr),o}var C={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},E={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},D="",T=0,O="",L="",k=C.NULL,N=/[a-zA-Z_0-9.:#]/;e.parseDOT=i,e.DOTToGraph=M},function(t,e){function i(t,e){var i=[],s=[];this.options={edges:{inheritColor:!0},nodes:{allowedToMove:!1,parseColor:!1}},void 0!==e&&(this.options.nodes.allowedToMove=e.allowedToMove|!1,this.options.nodes.parseColor=e.parseColor|!1,this.options.edges.inheritColor=e.inheritColor|!0);for(var o=t.edges,n=t.nodes,r=0;re?this.vx>0?e:-e:this.vx,this.x+=this.vx*t}if(this.yFixed)this.fy=0;else{var o=this.damping*this.vy,n=(this.fy-o)/this.options.mass;this.vy+=n*t,this.vy=Math.abs(this.vy)>e?this.vy>0?e:-e:this.vy,this.y+=this.vy*t}},s.prototype.isFixed=function(){return this.xFixed&&this.yFixed},s.prototype.isMoving=function(t){var e=Math.sqrt(Math.pow(this.vx,2)+Math.pow(this.vy,2));return e>t},s.prototype.isSelected=function(){return this.selected},s.prototype.getValue=function(){return this.value},s.prototype.getDistance=function(t,e){var i=this.x-t,s=this.y-e;return Math.sqrt(i*i+s*s)},s.prototype.setValueRange=function(t,e){if(!this.radiusFixed&&void 0!==this.value)if(e==t)this.options.radius=(this.options.radiusMin+this.options.radiusMax)/2;else{var i=(this.options.radiusMax-this.options.radiusMin)/(e-t);this.options.radius=(this.value-t)*i+this.options.radiusMin}this.baseRadiusValue=this.options.radius},s.prototype.draw=function(){throw"Draw method not initialized for node"},s.prototype.resize=function(){throw"Resize method not initialized for node"},s.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},s.prototype._resizeImage=function(){if(!this.width||!this.height){var t,e;if(this.value){this.options.radius=this.baseRadiusValue;var i=this.imageObj.height/this.imageObj.width;void 0!==i?(t=this.options.radius||this.imageObj.width,e=this.options.radius*i||this.imageObj.height):(t=0,e=0)}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.growthIndicator=0,this.width>0&&this.height>0&&(this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t)}},s.prototype._drawImage=function(t){this._resizeImage(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e;if(0!=this.imageObj.width){if(this.clusterSize>1){var i=this.clusterSize>1?10:0;i*=this.networkScaleInv,i=Math.min(.2*this.width,i),t.globalAlpha=.5,t.drawImage(this.imageObj,this.left-i,this.top-i,this.width+2*i,this.height+2*i)}t.globalAlpha=1,t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),e=this.y+this.height/2}else e=this.y;this._label(t,this.label,this.x,e,void 0,"top")},s.prototype._resizeBox=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawBox=function(t){this._resizeBox(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.roundRect(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth,this.options.radius),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.options.color.background,t.roundRect(this.left,this.top,this.width,this.height,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeDatabase=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=i.width+2*e;this.width=s,this.height=s,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-s}},s.prototype._drawDatabase=function(t){this._resizeDatabase(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.database(this.x-this.width/2-2*t.lineWidth,this.y-.5*this.height-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.database(this.x-this.width/2,this.y-.5*this.height,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeCircle=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=Math.max(i.width,i.height)+2*e;this.options.radius=s/2,this.width=s,this.height=s,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.options.radius-.5*s}},s.prototype._drawCircle=function(t){this._resizeCircle(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.circle(this.x,this.y,this.options.radius+2*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.circle(this.x,this.y,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeEllipse=function(t){if(!this.width){var e=this.getTextSize(t);this.width=1.5*e.width,this.height=2*e.height,this.width1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.ellipse(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.ellipse(this.left,this.top,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._drawDot=function(t){this._drawShape(t,"circle")},s.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},s.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},s.prototype._drawSquare=function(t){this._drawShape(t,"square")},s.prototype._drawStar=function(t){this._drawShape(t,"star")},s.prototype._resizeShape=function(){if(!this.width){this.options.radius=this.baseRadiusValue;var t=2*this.options.radius;this.width=t,this.height=t,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t}},s.prototype._drawShape=function(t,e){this._resizeShape(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var i=2.5,s=this.options.borderWidth,o=this.options.borderWidthSelected||2*this.options.borderWidth,n=2;switch(e){case"dot":n=2;break;case"square":n=2;break;case"triangle":n=3;break;case"triangleDown":n=3;break;case"star":n=4}t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t[e](this.x,this.y,this.options.radius+n*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t[e](this.x,this.y,this.options.radius),t.fill(),t.stroke(),this.label&&this._label(t,this.label,this.x,this.y+this.height/2,void 0,"top",!0)},s.prototype._resizeText=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawText=function(t){this._resizeText(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,this._label(t,this.label,this.x,this.y)},s.prototype._label=function(t,e,i,s,o,n,r){if(e&&Number(this.options.fontSize)*this.networkScale>this.fontDrawThreshold){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace,t.fillStyle=this.options.fontColor||"black",t.textAlign=o||"center",t.textBaseline=n||"middle";var a=e.split("\n"),h=a.length,d=Number(this.options.fontSize)+4,l=s+(1-h)/2*d;1==r&&(l=s+(1-h)/(2*d));for(var c=0;h>c;c++)t.fillText(a[c],i,l),l+=d}},s.prototype.getTextSize=function(t){if(void 0!==this.label){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace;for(var e=this.label.split("\n"),i=(Number(this.options.fontSize)+4)*e.length,s=0,o=0,n=e.length;n>o;o++)s=Math.max(s,t.measureText(e[o]).width);return{width:s,height:i}}return{width:0,height:0}},s.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.networkScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.networkScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.networkScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.yh}return!1},s.prototype._getColor=function(){var t=this.options.color;return"to"==this.options.inheritColor?t={highlight:this.to.options.color.highlight.border,hover:this.to.options.color.hover.border,color:this.to.options.color.border}:("from"==this.options.inheritColor||1==this.options.inheritColor)&&(t={highlight:this.from.options.color.highlight.border,hover:this.from.options.color.hover.border,color:this.from.options.color.border}),1==this.selected?t.highlight:1==this.hover?t.hover:t.color},s.prototype._drawLine=function(t){if(t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth(),this.from!=this.to){var e,i=this._line(t);if(this.label){if(1==this.options.smoothCurves.enabled&&null!=i){var s=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),o=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y));e={x:s,y:o}}else e=this._pointOnLine(.5);this._label(t,this.label,e.x,e.y)}}else{var n,r,a=this.physics.springLength/4,h=this.from;h.width||h.resize(t),h.width>h.height?(n=h.x+h.width/2,r=h.y-a):(n=h.x+a,r=h.y-h.height/2),this._circle(t,n,r,a),e=this._pointOnCircle(n,r,a,.5),this._label(t,this.label,e.x,e.y)}},s.prototype._getLineWidth=function(){return 1==this.selected?Math.min(this.widthSelected,this.options.widthMax)*this.networkScaleInv:1==this.hover?Math.min(this.options.hoverWidth,this.options.widthMax)*this.networkScaleInv:this.options.width*this.networkScaleInv},s.prototype._getViaCoordinates=function(){var t=null,e=null,i=this.options.smoothCurves.roundness,s=this.options.smoothCurves.type,o=Math.abs(this.from.x-this.to.x),n=Math.abs(this.from.y-this.to.y);return"discrete"==s||"diagonalCross"==s?Math.abs(this.from.x-this.to.x)this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n)),"discrete"==s&&(t=i*n>o?this.from.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o)),"discrete"==s&&(e=i*o>n?this.from.y:e)):"straightCross"==s?Math.abs(this.from.x-this.to.x)Math.abs(this.from.y-this.to.y)&&(t=this.from.xthis.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n,t=this.to.x>t?this.to.x:t):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n,t=this.to.x>t?this.to.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xe?this.to.y:e):this.from.x>this.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o,e=this.to.y>e?this.to.y:e):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o,e=this.to.yl.height?(a=l.x+.5*l.width,h=l.y-d):(a=l.x+d,h=l.y-.5*l.height),this._circle(t,a,h,d);var s=.2*Math.PI,o=(10+5*this.options.width)*this.options.arrowScaleFactor;e=this._pointOnCircle(a,h,d,.5),t.arrow(e.x,e.y,s,o),t.fill(),t.stroke(),this.label&&(e=this._pointOnCircle(a,h,d,.5),this._label(t,this.label,e.x,e.y))}},s.prototype._drawArrow=function(t){1==this.selected?(t.strokeStyle=this.options.color.highlight,t.fillStyle=this.options.color.highlight):1==this.hover?(t.strokeStyle=this.options.color.hover,t.fillStyle=this.options.color.hover):(t.strokeStyle=this.options.color.color,t.fillStyle=this.options.color.color),t.lineWidth=this._getLineWidth();var e,i;if(this.from!=this.to){e=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var s,o=this.to.x-this.from.x,n=this.to.y-this.from.y,r=Math.sqrt(o*o+n*n),a=this.from.distanceToBorder(t,e+Math.PI),h=(r-a)/r,d=h*this.from.x+(1-h)*this.to.x,l=h*this.from.y+(1-h)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?s=this.via:1==this.options.smoothCurves.enabled&&(s=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=s.x&&(e=Math.atan2(this.to.y-s.y,this.to.x-s.x),o=this.to.x-s.x,n=this.to.y-s.y,r=Math.sqrt(o*o+n*n));var c,p,u=this.to.distanceToBorder(t,e),f=(r-u)/r;if(1==this.options.smoothCurves.enabled&&null!=s.x?(c=(1-f)*s.x+f*this.to.x,p=(1-f)*s.y+f*this.to.y):(c=(1-f)*this.from.x+f*this.to.x,p=(1-f)*this.from.y+f*this.to.y),t.beginPath(),t.moveTo(d,l),1==this.options.smoothCurves.enabled&&null!=s.x?t.quadraticCurveTo(s.x,s.y,c,p):t.lineTo(c,p),t.stroke(),i=(10+5*this.options.width)*this.options.arrowScaleFactor,t.arrow(c,p,e,i),t.fill(),t.stroke(),this.label){var g;if(1==this.options.smoothCurves.enabled&&null!=s){var m=.5*(.5*(this.from.x+s.x)+.5*(this.to.x+s.x)),v=.5*(.5*(this.from.y+s.y)+.5*(this.to.y+s.y));g={x:m,y:v}}else g=this._pointOnLine(.5);this._label(t,this.label,g.x,g.y)}}else{var y,b,_,x=this.from,w=.25*Math.max(100,this.physics.springLength);x.width||x.resize(t),x.width>x.height?(y=x.x+.5*x.width,b=x.y-w,_={x:y,y:x.y,angle:.9*Math.PI}):(y=x.x+w,b=x.y-.5*x.height,_={x:x.x,y:b,angle:.6*Math.PI}),t.beginPath(),t.arc(y,b,w,0,2*Math.PI,!1),t.stroke();var i=(10+5*this.options.width)*this.options.arrowScaleFactor;t.arrow(_.x,_.y,_.angle,i),t.fill(),t.stroke(),this.label&&(g=this._pointOnCircle(y,b,w,.5),this._label(t,this.label,g.x,g.y))}},s.prototype._getDistanceToEdge=function(t,e,i,s,o,n){if(this.from!=this.to){if(1==this.options.smoothCurves.enabled){var r,a;if(1==this.options.smoothCurves.enabled&&1==this.options.smoothCurves.dynamic)r=this.via.x,a=this.via.y;else{var h=this._getViaCoordinates();r=h.x,a=h.y}var d,l,c,p,u,f,g,m=1e9;for(l=0;10>l;l++)c=.1*l,p=Math.pow(1-c,2)*t+2*c*(1-c)*r+Math.pow(c,2)*i,u=Math.pow(1-c,2)*e+2*c*(1-c)*a+Math.pow(c,2)*s,l>0&&(d=this._getDistanceToLine(f,g,p,u,o,n),m=m>d?d:m),f=p,g=u;return m}return this._getDistanceToLine(t,e,i,s,o,n)}var p,u,v,y,b=.25*this.physics.springLength,_=this.from;return _.width>_.height?(p=_.x+.5*_.width,u=_.y-b):(p=_.x+b,u=_.y-.5*_.height),v=p-o,y=u-n,Math.abs(Math.sqrt(v*v+y*y)-b)},s.prototype._getDistanceToLine=function(t,e,i,s,o,n){var r=i-t,a=s-e,h=r*r+a*a,d=((o-t)*r+(n-e)*a)/h;d>1?d=1:0>d&&(d=0);var l=t+d*r,c=e+d*a,p=l-o,u=c-n;return Math.sqrt(p*p+u*u)},s.prototype.setScale=function(t){this.networkScaleInv=1/t},s.prototype.select=function(){this.selected=!0},s.prototype.unselect=function(){this.selected=!1},s.prototype.positionBezierNode=function(){null!==this.via&&null!==this.from&&null!==this.to&&(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y))},s.prototype._drawControlNodes=function(t){if(1==this.controlNodesEnabled){if(null===this.controlNodes.from&&null===this.controlNodes.to){var e="edgeIdFrom:".concat(this.id),i="edgeIdTo:".concat(this.id),s={nodes:{group:"",radius:8},physics:{damping:0},clustering:{maxNodeSizeIncrements:0,nodeScaling:{width:0,height:0,radius:0}}};this.controlNodes.from=new n({id:e,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s),this.controlNodes.to=new n({id:i,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s)}0==this.controlNodes.from.selected&&0==this.controlNodes.to.selected&&(this.controlNodes.positions=this.getControlNodePositions(t),this.controlNodes.from.x=this.controlNodes.positions.from.x,this.controlNodes.from.y=this.controlNodes.positions.from.y,this.controlNodes.to.x=this.controlNodes.positions.to.x,this.controlNodes.to.y=this.controlNodes.positions.to.y),this.controlNodes.from.draw(t),this.controlNodes.to.draw(t)}else this.controlNodes={from:null,to:null,positions:{}}},s.prototype._enableControlNodes=function(){this.controlNodesEnabled=!0},s.prototype._disableControlNodes=function(){this.controlNodesEnabled=!1},s.prototype._getSelectedControlNode=function(t,e){var i=this.controlNodes.positions,s=Math.sqrt(Math.pow(t-i.from.x,2)+Math.pow(e-i.from.y,2)),o=Math.sqrt(Math.pow(t-i.to.x,2)+Math.pow(e-i.to.y,2));return 15>s?(this.connectedNode=this.from,this.from=this.controlNodes.from,this.controlNodes.from):15>o?(this.connectedNode=this.to,this.to=this.controlNodes.to,this.controlNodes.to):null},s.prototype._restoreControlNodes=function(){1==this.controlNodes.from.selected&&(this.from=this.connectedNode,this.connectedNode=null,this.controlNodes.from.unselect()),1==this.controlNodes.to.selected&&(this.to=this.connectedNode,this.connectedNode=null,this.controlNodes.to.unselect())},s.prototype.getControlNodePositions=function(t){var e,i=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),s=this.to.x-this.from.x,o=this.to.y-this.from.y,n=Math.sqrt(s*s+o*o),r=this.from.distanceToBorder(t,i+Math.PI),a=(n-r)/n,h=a*this.from.x+(1-a)*this.to.x,d=a*this.from.y+(1-a)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?e=this.via:1==this.options.smoothCurves.enabled&&(e=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=e.x&&(i=Math.atan2(this.to.y-e.y,this.to.x-e.x),s=this.to.x-e.x,o=this.to.y-e.y,n=Math.sqrt(s*s+o*o));var l,c,p=this.to.distanceToBorder(t,i),u=(n-p)/n;return 1==this.options.smoothCurves.enabled&&null!=e.x?(l=(1-u)*e.x+u*this.to.x,c=(1-u)*e.y+u*this.to.y):(l=(1-u)*this.from.x+u*this.to.x,c=(1-u)*this.from.y+u*this.to.y),{from:{x:h,y:d},to:{x:l,y:c}}},t.exports=s},function(t){function e(t,e,i,s,o){this.container=t?t:document.body,void 0===o&&("object"==typeof e?(o=e,e=void 0):"object"==typeof s?(o=s,s=void 0):o={fontColor:"black",fontSize:14,fontFace:"verdana",color:{border:"#666",background:"#FFFFC6"}}),this.x=0,this.y=0,this.padding=5,void 0!==e&&void 0!==i&&this.setPosition(e,i),void 0!==s&&this.setText(s),this.frame=document.createElement("div");var n=this.frame.style;n.position="absolute",n.visibility="hidden",n.border="1px solid "+o.color.border,n.color=o.fontColor,n.fontSize=o.fontSize+"px",n.fontFamily=o.fontFace,n.padding=this.padding+"px",n.backgroundColor=o.color.background,n.borderRadius="3px",n.MozBorderRadius="3px",n.WebkitBorderRadius="3px",n.boxShadow="3px 3px 10px rgba(128, 128, 128, 0.5)",n.whiteSpace="nowrap",this.container.appendChild(this.frame)}e.prototype.setPosition=function(t,e){this.x=parseInt(t),this.y=parseInt(e)},e.prototype.setText=function(t){this.frame.innerHTML=t},e.prototype.show=function(t){if(void 0===t&&(t=!0),t){var e=this.frame.clientHeight,i=this.frame.clientWidth,s=this.frame.parentNode.clientHeight,o=this.frame.parentNode.clientWidth,n=this.y-e;n+e+this.padding>s&&(n=s-e-this.padding),no&&(r=o-i-this.padding),rthis.constants.clustering.clusterThreshold&&1==this.constants.clustering.enabled&&this.clusterToFit(this.constants.clustering.reduceToNodes,!1),this._calculateForces())},e._calculateForces=function(){this._calculateGravitationalForces(),this._calculateNodeForces(),this.constants.physics.springConstant>0&&(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic?this._calculateSpringForcesWithSupport():1==this.constants.physics.hierarchicalRepulsion.enabled?this._calculateHierarchicalSpringForces():this._calculateSpringForces())},e._updateCalculationNodes=function(){if(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic){this.calculationNodes={},this.calculationNodeIndices=[];for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.calculationNodes[t]=this.nodes[t]);var e=this.sectors.support.nodes;for(var i in e)e.hasOwnProperty(i)&&(this.edges.hasOwnProperty(e[i].parentEdgeId)?this.calculationNodes[i]=e[i]:e[i]._setForce(0,0));for(var s in this.calculationNodes)this.calculationNodes.hasOwnProperty(s)&&this.calculationNodeIndices.push(s)}else this.calculationNodes=this.nodes,this.calculationNodeIndices=this.nodeIndices},e._calculateGravitationalForces=function(){var t,e,i,s,o,n=this.calculationNodes,r=this.constants.physics.centralGravity,a=0;for(o=0;oSimulation Mode:Barnes HutRepulsionHierarchical
Options:
',this.containerElement.parentElement.insertBefore(this.physicsConfiguration,this.containerElement),this.optionsDiv=document.createElement("div"),this.optionsDiv.style.fontSize="14px",this.optionsDiv.style.fontFamily="verdana",this.containerElement.parentElement.insertBefore(this.optionsDiv,this.containerElement); var e;e=document.getElementById("graph_BH_gc"),e.onchange=a.bind(this,"graph_BH_gc",-1,"physics_barnesHut_gravitationalConstant"),e=document.getElementById("graph_BH_cg"),e.onchange=a.bind(this,"graph_BH_cg",1,"physics_centralGravity"),e=document.getElementById("graph_BH_sc"),e.onchange=a.bind(this,"graph_BH_sc",1,"physics_springConstant"),e=document.getElementById("graph_BH_sl"),e.onchange=a.bind(this,"graph_BH_sl",1,"physics_springLength"),e=document.getElementById("graph_BH_damp"),e.onchange=a.bind(this,"graph_BH_damp",1,"physics_damping"),e=document.getElementById("graph_R_nd"),e.onchange=a.bind(this,"graph_R_nd",1,"physics_repulsion_nodeDistance"),e=document.getElementById("graph_R_cg"),e.onchange=a.bind(this,"graph_R_cg",1,"physics_centralGravity"),e=document.getElementById("graph_R_sc"),e.onchange=a.bind(this,"graph_R_sc",1,"physics_springConstant"),e=document.getElementById("graph_R_sl"),e.onchange=a.bind(this,"graph_R_sl",1,"physics_springLength"),e=document.getElementById("graph_R_damp"),e.onchange=a.bind(this,"graph_R_damp",1,"physics_damping"),e=document.getElementById("graph_H_nd"),e.onchange=a.bind(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),e=document.getElementById("graph_H_cg"),e.onchange=a.bind(this,"graph_H_cg",1,"physics_centralGravity"),e=document.getElementById("graph_H_sc"),e.onchange=a.bind(this,"graph_H_sc",1,"physics_springConstant"),e=document.getElementById("graph_H_sl"),e.onchange=a.bind(this,"graph_H_sl",1,"physics_springLength"),e=document.getElementById("graph_H_damp"),e.onchange=a.bind(this,"graph_H_damp",1,"physics_damping"),e=document.getElementById("graph_H_direction"),e.onchange=a.bind(this,"graph_H_direction",t,"hierarchicalLayout_direction"),e=document.getElementById("graph_H_levsep"),e.onchange=a.bind(this,"graph_H_levsep",1,"hierarchicalLayout_levelSeparation"),e=document.getElementById("graph_H_nspac"),e.onchange=a.bind(this,"graph_H_nspac",1,"hierarchicalLayout_nodeSpacing");var i=document.getElementById("graph_physicsMethod1"),d=document.getElementById("graph_physicsMethod2"),l=document.getElementById("graph_physicsMethod3");d.checked=!0,this.constants.physics.barnesHut.enabled&&(i.checked=!0),this.constants.hierarchicalLayout.enabled&&(l.checked=!0);var c=document.getElementById("graph_toggleSmooth"),p=document.getElementById("graph_repositionNodes"),u=document.getElementById("graph_generateOptions");c.onclick=s.bind(this),p.onclick=o.bind(this),u.onclick=n.bind(this),c.style.background=1==this.constants.smoothCurves&&0==this.constants.dynamicSmoothCurves?"#A4FF56":"#FF8532",r.apply(this),i.onchange=r.bind(this),d.onchange=r.bind(this),l.onchange=r.bind(this)}},e._overWriteGraphConstants=function(t,e){var i=t.split("_");1==i.length?this.constants[i[0]]=e:2==i.length?this.constants[i[0]][i[1]]=e:3==i.length&&(this.constants[i[0]][i[1]][i[2]]=e)}},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l,c=this.calculationNodes,p=this.calculationNodeIndices,u=-2/3,f=4/3,g=this.constants.physics.repulsion.nodeDistance,m=g;for(d=0;di&&(r=.5*m>i?1:v*i+f,r*=0==n?1:1+n*this.constants.clustering.forceAmplification,r/=i,s=t*r,o=e*r,a.fx-=s,a.fy-=o,h.fx+=s,h.fy+=o)}}},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l=this.calculationNodes,c=this.calculationNodeIndices,p=this.constants.physics.hierarchicalRepulsion.nodeDistance;for(h=0;hi?-Math.pow(u*i,2)+Math.pow(u*p,2):0,0==i?i=.01:n/=i,s=t*n,o=e*n,r.fx-=s,r.fy-=o,a.fx+=s,a.fy+=o}},e._calculateHierarchicalSpringForces=function(){for(var t,e,i,s,o,n,r,a,h,d=this.edges,l=this.calculationNodes,c=this.calculationNodeIndices,p=0;pn;n++)t=e[i[n]],t.options.mass>0&&(this._getForceContribution(o.root.children.NW,t),this._getForceContribution(o.root.children.NE,t),this._getForceContribution(o.root.children.SW,t),this._getForceContribution(o.root.children.SE,t))}},e._getForceContribution=function(t,e){if(t.childrenCount>0){var i,s,o;if(i=t.centerOfMass.x-e.x,s=t.centerOfMass.y-e.y,o=Math.sqrt(i*i+s*s),o*t.calcSize>this.constants.physics.barnesHut.theta){0==o&&(o=.1*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}else if(4==t.childrenCount)this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e);else if(t.children.data.id!=e.id){0==o&&(o=.5*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}}},e._formBarnesHutTree=function(t,e){for(var i,s=e.length,o=Number.MAX_VALUE,n=Number.MAX_VALUE,r=-Number.MAX_VALUE,a=-Number.MAX_VALUE,h=0;s>h;h++){var d=t[e[h]].x,l=t[e[h]].y;t[e[h]].options.mass>0&&(o>d&&(o=d),d>r&&(r=d),n>l&&(n=l),l>a&&(a=l))}var c=Math.abs(r-o)-Math.abs(a-n);c>0?(n-=.5*c,a+=.5*c):(o+=.5*c,r-=.5*c);var p=1e-5,u=Math.max(p,Math.abs(r-o)),f=.5*u,g=.5*(o+r),m=.5*(n+a),v={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:g-f,maxX:g+f,minY:m-f,maxY:m+f},size:u,calcSize:1/u,children:{data:null},maxWidth:0,level:0,childrenCount:4}};for(this._splitBranch(v.root),h=0;s>h;h++)i=t[e[h]],i.options.mass>0&&this._placeInTree(v.root,i);this.barnesHutTree=v},e._updateBranchMass=function(t,e){var i=t.mass+e.options.mass,s=1/i;t.centerOfMass.x=t.centerOfMass.x*t.mass+e.x*e.options.mass,t.centerOfMass.x*=s,t.centerOfMass.y=t.centerOfMass.y*t.mass+e.y*e.options.mass,t.centerOfMass.y*=s,t.mass=i;var o=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NW"):this._placeInRegion(t,e,"SW"):t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NE"):this._placeInRegion(t,e,"SE")},e._placeInRegion=function(t,e,i){switch(t.children[i].childrenCount){case 0:t.children[i].children.data=e,t.children[i].childrenCount=1,this._updateBranchMass(t.children[i],e);break;case 1:t.children[i].children.data.x==e.x&&t.children[i].children.data.y==e.y?(e.x+=Math.random(),e.y+=Math.random()):(this._splitBranch(t.children[i]),this._placeInTree(t.children[i],e));break;case 4:this._placeInTree(t.children[i],e)}},e._splitBranch=function(t){var e=null;1==t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)},e._insertRegion=function(t,e){var i,s,o,n,r=.5*t.size;switch(e){case"NW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY,n=t.range.minY+r;break;case"NE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY,n=t.range.minY+r;break;case"SW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY+r,n=t.range.maxY;break;case"SE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY+r,n=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:s,minY:o,maxY:n},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}},e._drawTree=function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))},e._drawBranch=function(t,e,i){void 0===i&&(i="#FF0000"),4==t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}},function(t,e){e.startWithClustering=function(){this.clusterToFit(this.constants.clustering.initialMaxNodes,!0),this.updateLabels(),this.stabilize&&this._stabilize(),this.start()},e.clusterToFit=function(t,e){for(var i=this.nodeIndices.length,s=50,o=0;i>t&&s>o;)o%3==0?(this.forceAggregateHubs(!0),this.normalizeClusterLevels()):this.increaseClusterLevel(),i=this.nodeIndices.length,o+=1;o>0&&1==e&&this.repositionNodes(),this._updateCalculationNodes()},e.openCluster=function(t){var e=this.moving;if(t.clusterSize>this.constants.clustering.sectorThreshold&&this._nodeInActiveArea(t)&&("default"!=this._sector()||1!=this.nodeIndices.length)){this._addSector(t);for(var i=0;this.nodeIndices.lengthi;)this.decreaseClusterLevel(),i+=1}else this._expandClusterNode(t,!1,!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this._updateCalculationNodes(),this.updateLabels();this.moving!=e&&this.start()},e.updateClustersDefault=function(){1==this.constants.clustering.enabled&&this.updateClusters(0,!1,!1)},e.increaseClusterLevel=function(){this.updateClusters(-1,!1,!0)},e.decreaseClusterLevel=function(){this.updateClusters(1,!1,!0)},e.updateClusters=function(t,e,i,s){var o=this.moving,n=this.nodeIndices.length;this.previousScale>this.scale&&0==t&&this._collapseSector(),this.previousScale>this.scale||-1==t?this._formClusters(i):(this.previousScalethis.scale||-1==t)&&(this._aggregateHubs(i),this._updateNodeIndexList()),(this.previousScale>this.scale||-1==t)&&(this.handleChains(),this._updateNodeIndexList()),this.previousScale=this.scale,this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.lengththis.constants.clustering.chainThreshold&&this._reduceAmountOfChains(1-this.constants.clustering.chainThreshold/t)},e._aggregateHubs=function(t){this._getHubSize(),this._formClustersByHub(t,!1)},e.forceAggregateHubs=function(t){var e=this.moving,i=this.nodeIndices.length;this._aggregateHubs(!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.length!=i&&(this.clusterSession+=1),(0==t||void 0===t)&&this.moving!=e&&this.start()},e._openClustersBySize=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];1==e.inView()&&(e.width*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientWidth||e.height*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientHeight)&&this.openCluster(e)}},e._openClusters=function(t,e){for(var i=0;i1&&(t.clusterSizei)){var r=n.from,a=n.to;n.to.options.mass>n.from.options.mass&&(r=n.to,a=n.from),1==a.dynamicEdgesLength?this._addToCluster(r,a,!1):1==r.dynamicEdgesLength&&this._addToCluster(a,r,!1)}}},e._forceClustersByZoom=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];if(1==e.dynamicEdgesLength&&0!=e.dynamicEdges.length){var i=e.dynamicEdges[0],s=i.toId==e.id?this.nodes[i.fromId]:this.nodes[i.toId];e.id!=s.id&&(s.options.mass>e.options.mass?this._addToCluster(s,e,!0):this._addToCluster(e,s,!0))}}},e._clusterToSmallestNeighbour=function(t){for(var e=-1,i=null,s=0;so.clusterSessions.length&&(e=o.clusterSessions.length,i=o)}null!=o&&void 0!==this.nodes[o.id]&&this._addToCluster(o,t,!0)},e._formClustersByHub=function(t,e){for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&this._formClusterFromHub(this.nodes[i],t,e)},e._formClusterFromHub=function(t,e,i,s){if(void 0===s&&(s=0),t.dynamicEdgesLength>=this.hubThreshold&&0==i||t.dynamicEdgesLength==this.hubThreshold&&1==i){for(var o,n,r,a=this.constants.clustering.clusterEdgeThreshold/this.scale,h=!1,d=[],l=t.dynamicEdges.length,c=0;l>c;c++)d.push(t.dynamicEdges[c].id);if(0==e)for(h=!1,c=0;l>c;c++){var p=this.edges[d[c]];if(void 0!==p&&p.connected&&p.toId!=p.fromId&&(o=p.to.x-p.from.x,n=p.to.y-p.from.y,r=Math.sqrt(o*o+n*n),a>r)){h=!0;break}}if(!e&&h||e)for(c=0;l>c;c++)if(p=this.edges[d[c]],void 0!==p){var u=this.nodes[p.fromId==t.id?p.toId:p.fromId];u.dynamicEdges.length<=this.hubThreshold+s&&u.id!=t.id&&this._addToCluster(t,u,e)}}},e._addToCluster=function(t,e,i){t.containedNodes[e.id]=e;for(var s=0;s1)for(var s=0;s1&&(e.label="[".concat(String(e.clusterSize),"]"))}for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(e=this.nodes[t],1==e.clusterSize&&(e.label=void 0!==e.originalLabel?e.originalLabel:String(e.id)))},e.normalizeClusterLevels=function(){var t,e=0,i=1e9,s=0;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(s=this.nodes[t].clusterSessions.length,s>e&&(e=s),i>s&&(i=s));if(e-i>this.constants.clustering.clusterLevelDifference){var o=this.nodeIndices.length,n=e-this.constants.clustering.clusterLevelDifference;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodes[t].clusterSessions.lengths&&(s=n.dynamicEdgesLength),t+=n.dynamicEdgesLength,e+=Math.pow(n.dynamicEdgesLength,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r);this.hubThreshold=Math.floor(t+2*a),this.hubThreshold>s&&(this.hubThreshold=s)},e._reduceAmountOfChains=function(t){this.hubThreshold=2;var e=Math.floor(this.nodeIndices.length*t);for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&e>0&&(this._formClusterFromHub(this.nodes[i],!0,!0,1),e-=1)},e._getChainFraction=function(){var t=0,e=0;for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&(2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&(t+=1),e+=1);return t/e}},function(t,e,i){var s=i(1);e._putDataInSector=function(){this.sectors.active[this._sector()].nodes=this.nodes,this.sectors.active[this._sector()].edges=this.edges,this.sectors.active[this._sector()].nodeIndices=this.nodeIndices},e._switchToSector=function(t,e){void 0===e||"active"==e?this._switchToActiveSector(t):this._switchToFrozenSector(t)},e._switchToActiveSector=function(t){this.nodeIndices=this.sectors.active[t].nodeIndices,this.nodes=this.sectors.active[t].nodes,this.edges=this.sectors.active[t].edges},e._switchToSupportSector=function(){this.nodeIndices=this.sectors.support.nodeIndices,this.nodes=this.sectors.support.nodes,this.edges=this.sectors.support.edges},e._switchToFrozenSector=function(t){this.nodeIndices=this.sectors.frozen[t].nodeIndices,this.nodes=this.sectors.frozen[t].nodes,this.edges=this.sectors.frozen[t].edges},e._loadLatestSector=function(){this._switchToSector(this._sector())},e._sector=function(){return this.activeSector[this.activeSector.length-1]},e._previousSector=function(){if(this.activeSector.length>1)return this.activeSector[this.activeSector.length-2];throw new TypeError("there are not enough sectors in the this.activeSector array.")},e._setActiveSector=function(t){this.activeSector.push(t)},e._forgetLastSector=function(){this.activeSector.pop()},e._createNewSector=function(t){this.sectors.active[t]={nodes:{},edges:{},nodeIndices:[],formationScale:this.scale,drawingNode:void 0},this.sectors.active[t].drawingNode=new Node({id:t,color:{background:"#eaefef",border:"495c5e"}},{},{},this.constants),this.sectors.active[t].drawingNode.clusterSize=2},e._deleteActiveSector=function(t){delete this.sectors.active[t]},e._deleteFrozenSector=function(t){delete this.sectors.frozen[t]},e._freezeSector=function(t){this.sectors.frozen[t]=this.sectors.active[t],this._deleteActiveSector(t)},e._activateSector=function(t){this.sectors.active[t]=this.sectors.frozen[t],this._deleteFrozenSector(t)},e._mergeThisWithFrozen=function(t){for(var e in this.nodes)this.nodes.hasOwnProperty(e)&&(this.sectors.frozen[t].nodes[e]=this.nodes[e]);for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.sectors.frozen[t].edges[i]=this.edges[i]);for(var s=0;s1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInSupportSector=function(t,e){if(void 0===e)this._switchToSupportSector(),this[t]();else{this._switchToSupportSector();var i=Array.prototype.splice.call(arguments,1);i.length>1?this[t](i[0],i[1]):this[t](e)}this._loadLatestSector()},e._doInAllFrozenSectors=function(t,e){if(void 0===e)for(var i in this.sectors.frozen)this.sectors.frozen.hasOwnProperty(i)&&(this._switchToFrozenSector(i),this[t]());else for(var i in this.sectors.frozen)if(this.sectors.frozen.hasOwnProperty(i)){this._switchToFrozenSector(i);var s=Array.prototype.splice.call(arguments,1);s.length>1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInAllSectors=function(t,e){var i=Array.prototype.splice.call(arguments,1);void 0===e?(this._doInAllActiveSectors(t),this._doInAllFrozenSectors(t)):i.length>1?(this._doInAllActiveSectors(t,i[0],i[1]),this._doInAllFrozenSectors(t,i[0],i[1])):(this._doInAllActiveSectors(t,e),this._doInAllFrozenSectors(t,e))},e._clearNodeIndexList=function(){var t=this._sector();this.sectors.active[t].nodeIndices=[],this.nodeIndices=this.sectors.active[t].nodeIndices},e._drawSectorNodes=function(t,e){var i,s=1e9,o=-1e9,n=1e9,r=-1e9;for(var a in this.sectors[e])if(this.sectors[e].hasOwnProperty(a)&&void 0!==this.sectors[e][a].drawingNode){this._switchToSector(a,e),s=1e9,o=-1e9,n=1e9,r=-1e9;for(var h in this.nodes)this.nodes.hasOwnProperty(h)&&(i=this.nodes[h],i.resize(t),n>i.x-.5*i.width&&(n=i.x-.5*i.width),ri.y-.5*i.height&&(s=i.y-.5*i.height),o0?this.nodes[i[i.length-1]]:null},e._getEdgesOverlappingWith=function(t,e){var i=this.edges;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},e._getAllEdgesOverlappingWith=function(t){var e=[];return this._doInAllActiveSectors("_getEdgesOverlappingWith",t,e),e},e._getEdgeAt=function(t){var e=this._pointerToPositionObject(t),i=this._getAllEdgesOverlappingWith(e);return i.length>0?this.edges[i[i.length-1]]:null},e._addToSelection=function(t){t instanceof s?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t},e._addToHover=function(t){t instanceof s?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t},e._removeFromSelection=function(t){t instanceof s?delete this.selectionObj.nodes[t.id]:delete this.selectionObj.edges[t.id]},e._unselectAll=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].unselect();for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&this.selectionObj.edges[i].unselect();this.selectionObj={nodes:{},edges:{}},0==t&&this.emit("select",this.getSelection())},e._unselectClusters=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].clusterSize>1&&(this.selectionObj.nodes[e].unselect(),this._removeFromSelection(this.selectionObj.nodes[e]));0==t&&this.emit("select",this.getSelection())},e._getSelectedNodeCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedNode=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t];return null},e._getSelectedEdge=function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t];return null},e._getSelectedEdgeCount=function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedObjectCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t},e._selectionIsEmpty=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0},e._clusterInSelection=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1},e._selectConnectedEdges=function(t){for(var e=0;ee;e++){s=t[e];var o=this.nodes[s];if(!o)throw new RangeError('Node with id "'+s+'" not found');this._selectObject(o,!0,!0)}console.log("setSelection is deprecated. Please use selectNodes instead."),this.redraw()},e.selectNodes=function(t,e){var i,s,o;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),i=0,s=t.length;s>i;i++){o=t[i];var n=this.nodes[o];if(!n)throw new RangeError('Node with id "'+o+'" not found');this._selectObject(n,!0,!0,e)}this.redraw()},e.selectEdges=function(t){var e,i,s;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),e=0,i=t.length;i>e;e++){s=t[e];var o=this.edges[s];if(!o)throw new RangeError('Edge with id "'+s+'" not found');this._selectObject(o,!0,!0,highlightEdges)}this.redraw()},e._updateSelection=function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},function(t,e,i){var s=i(1),o=i(49),n=i(50);e._clearManipulatorBar=function(){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild)},e._restoreOverloadedFunctions=function(){for(var t in this.cachedFunctions)this.cachedFunctions.hasOwnProperty(t)&&(this[t]=this.cachedFunctions[t])},e._toggleEditMode=function(){this.editMode=!this.editMode;var t=document.getElementById("network-manipulationDiv"),e=document.getElementById("network-manipulation-closeDiv"),i=document.getElementById("network-manipulation-editMode");1==this.editMode?(t.style.display="block",e.style.display="block",i.style.display="none",e.onclick=this._toggleEditMode.bind(this)):(t.style.display="none",e.style.display="none",i.style.display="block",e.onclick=null),this._createManipulatorBar()},e._createManipulatorBar=function(){this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];if(void 0!==this.edgeBeingEdited&&(this.edgeBeingEdited._disableControlNodes(),this.edgeBeingEdited=void 0,this.selectedControlNode=null,this.controlNodesActive=!1),this._restoreOverloadedFunctions(),this.freezeSimulation=!1,this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,1==this.editMode){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDiv.innerHTML=""+t.addNode+"
"+t.addEdge+"",1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?this.manipulationDiv.innerHTML+="
"+t.editNode+"":1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDiv.innerHTML+="
"+t.editEdge+""),0==this._selectionIsEmpty()&&(this.manipulationDiv.innerHTML+="
"+t.del+"");var e=document.getElementById("network-manipulate-addNode");e.onclick=this._createAddNodeToolbar.bind(this);var i=document.getElementById("network-manipulate-connectNode");if(i.onclick=this._createAddEdgeToolbar.bind(this),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit){var s=document.getElementById("network-manipulate-editNode");s.onclick=this._editNode.bind(this)}else if(1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()){var s=document.getElementById("network-manipulate-editEdge");s.onclick=this._createEditEdgeToolbar.bind(this)}if(0==this._selectionIsEmpty()){var o=document.getElementById("network-manipulate-delete");o.onclick=this._deleteSelected.bind(this)}var n=document.getElementById("network-manipulation-closeDiv");n.onclick=this._toggleEditMode.bind(this),this.boundFunction=this._createManipulatorBar.bind(this),this.on("select",this.boundFunction)}else{this.editModeDiv.innerHTML=""+t.edit+"";var r=document.getElementById("network-manipulate-editModeButton");r.onclick=this._toggleEditMode.bind(this)}},e._createAddNodeToolbar=function(){this._clearManipulatorBar(),this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];this.manipulationDiv.innerHTML=""+t.back+"
"+t.addDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._addNode.bind(this),this.on("select",this.boundFunction)},e._createAddEdgeToolbar=function(){this._clearManipulatorBar(),this._unselectAll(!0),this.freezeSimulation=!0;var t=this.constants.locales[this.constants.locale];this.boundFunction&&this.off("select",this.boundFunction),this._unselectAll(),this.forceAppendSelection=!1,this.blockConnectingEdgeSelection=!0,this.manipulationDiv.innerHTML=""+t.back+"
"+t.edgeDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._handleConnect.bind(this),this.on("select",this.boundFunction),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._handleOnRelease=this._handleOnRelease,this._handleTouch=this._handleConnect,this._handleOnRelease=this._finishConnect,this._redraw()},e._createEditEdgeToolbar=function(){this._clearManipulatorBar(),this.controlNodesActive=!0,this.boundFunction&&this.off("select",this.boundFunction),this.edgeBeingEdited=this._getSelectedEdge(),this.edgeBeingEdited._enableControlNodes();var t=this.constants.locales[this.constants.locale];this.manipulationDiv.innerHTML=""+t.back+"
"+t.editEdgeDescription+"";var e=document.getElementById("network-manipulate-back");e.onclick=this._createManipulatorBar.bind(this),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._handleOnRelease=this._handleOnRelease,this.cachedFunctions._handleTap=this._handleTap,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleTouch=this._selectControlNode,this._handleTap=function(){},this._handleOnDrag=this._controlNodeDrag,this._handleDragStart=function(){},this._handleOnRelease=this._releaseControlNode,this._redraw()},e._selectControlNode=function(t){this.edgeBeingEdited.controlNodes.from.unselect(),this.edgeBeingEdited.controlNodes.to.unselect(),this.selectedControlNode=this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(t.x),this._YconvertDOMtoCanvas(t.y)),null!==this.selectedControlNode&&(this.selectedControlNode.select(),this.freezeSimulation=!0),this._redraw()},e._controlNodeDrag=function(t){var e=this._getPointer(t.gesture.center);null!==this.selectedControlNode&&void 0!==this.selectedControlNode&&(this.selectedControlNode.x=this._XconvertDOMtoCanvas(e.x),this.selectedControlNode.y=this._YconvertDOMtoCanvas(e.y)),this._redraw()},e._releaseControlNode=function(t){var e=this._getNodeAt(t);null!=e?(1==this.edgeBeingEdited.controlNodes.from.selected&&(this._editEdge(e.id,this.edgeBeingEdited.to.id),this.edgeBeingEdited.controlNodes.from.unselect()),1==this.edgeBeingEdited.controlNodes.to.selected&&(this._editEdge(this.edgeBeingEdited.from.id,e.id),this.edgeBeingEdited.controlNodes.to.unselect())):this.edgeBeingEdited._restoreControlNodes(),this.freezeSimulation=!1,this._redraw()},e._handleConnect=function(t){if(0==this._getSelectedNodeCount()){var e=this._getNodeAt(t);null!=e&&(e.clusterSize>1?alert(this.constants.locales[this.constants.locale].createEdgeError):(this._selectObject(e,!1),this.sectors.support.nodes.targetNode=new o({id:"targetNode"},{},{},this.constants),this.sectors.support.nodes.targetNode.x=e.x,this.sectors.support.nodes.targetNode.y=e.y,this.sectors.support.nodes.targetViaNode=new o({id:"targetViaNode"},{},{},this.constants),this.sectors.support.nodes.targetViaNode.x=e.x,this.sectors.support.nodes.targetViaNode.y=e.y,this.sectors.support.nodes.targetViaNode.parentEdgeId="connectionEdge",this.edges.connectionEdge=new n({id:"connectionEdge",from:e.id,to:this.sectors.support.nodes.targetNode.id},this,this.constants),this.edges.connectionEdge.from=e,this.edges.connectionEdge.connected=!0,this.edges.connectionEdge.smooth=!0,this.edges.connectionEdge.selected=!0,this.edges.connectionEdge.to=this.sectors.support.nodes.targetNode,this.edges.connectionEdge.via=this.sectors.support.nodes.targetViaNode,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleOnDrag=function(t){var e=this._getPointer(t.gesture.center);this.sectors.support.nodes.targetNode.x=this._XconvertDOMtoCanvas(e.x),this.sectors.support.nodes.targetNode.y=this._YconvertDOMtoCanvas(e.y),this.sectors.support.nodes.targetViaNode.x=.5*(this._XconvertDOMtoCanvas(e.x)+this.edges.connectionEdge.from.x),this.sectors.support.nodes.targetViaNode.y=this._YconvertDOMtoCanvas(e.y)},this.moving=!0,this.start()))}},e._finishConnect=function(t){if(1==this._getSelectedNodeCount()){this._handleOnDrag=this.cachedFunctions._handleOnDrag,delete this.cachedFunctions._handleOnDrag;var e=this.edges.connectionEdge.fromId;delete this.edges.connectionEdge,delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode;var i=this._getNodeAt(t);null!=i&&(i.clusterSize>1?alert(this.constants.locales[this.constants.locale].createEdgeError):(this._createEdge(e,i.id),this._createManipulatorBar())),this._unselectAll()}},e._addNode=function(){if(this._selectionIsEmpty()&&1==this.editMode){var t=this._pointerToPositionObject(this.pointerPosition),e={id:s.randomUUID(),x:t.left,y:t.top,label:"new",allowedToMoveX:!0,allowedToMoveY:!0};if(this.triggerFunctions.add){if(2!=this.triggerFunctions.add.length)throw new Error("The function for add does not support two arguments (data,callback)");var i=this;this.triggerFunctions.add(e,function(t){i.nodesData.add(t),i._createManipulatorBar(),i.moving=!0,i.start()})}else this.nodesData.add(e),this._createManipulatorBar(),this.moving=!0,this.start()}},e._createEdge=function(t,e){if(1==this.editMode){var i={from:t,to:e};if(this.triggerFunctions.connect){if(2!=this.triggerFunctions.connect.length)throw new Error("The function for connect does not support two arguments (data,callback)");var s=this;this.triggerFunctions.connect(i,function(t){s.edgesData.add(t),s.moving=!0,s.start()})}else this.edgesData.add(i),this.moving=!0,this.start()}},e._editEdge=function(t,e){if(1==this.editMode){var i={id:this.edgeBeingEdited.id,from:t,to:e};if(this.triggerFunctions.editEdge){if(2!=this.triggerFunctions.editEdge.length)throw new Error("The function for edit does not support two arguments (data, callback)");var s=this;this.triggerFunctions.editEdge(i,function(t){s.edgesData.update(t),s.moving=!0,s.start()})}else this.edgesData.update(i),this.moving=!0,this.start()}},e._editNode=function(){if(!this.triggerFunctions.edit||1!=this.editMode)throw new Error("No edit function has been bound to this button");var t=this._getSelectedNode(),e={id:t.id,label:t.label,group:t.options.group,shape:t.options.shape,color:{background:t.options.color.background,border:t.options.color.border,highlight:{background:t.options.color.highlight.background,border:t.options.color.highlight.border}}};if(2!=this.triggerFunctions.edit.length)throw new Error("The function for edit does not support two arguments (data, callback)");var i=this;this.triggerFunctions.edit(e,function(t){i.nodesData.update(t),i._createManipulatorBar(),i.moving=!0,i.start()})},e._deleteSelected=function(){if(!this._selectionIsEmpty()&&1==this.editMode)if(this._clusterInSelection())alert(this.constants.locales[this.constants.locale].deleteClusterError);else{var t=this.getSelectedNodes(),e=this.getSelectedEdges();if(this.triggerFunctions.del){var i=this,s={nodes:t,edges:e};if(!(this.triggerFunctions.del.length=2))throw new Error("The function for delete does not support two arguments (data, callback)");this.triggerFunctions.del(s,function(t){i.edgesData.remove(t.edges),i.nodesData.remove(t.nodes),i._unselectAll(),i.moving=!0,i.start()})}else this.edgesData.remove(e),this.nodesData.remove(t),this._unselectAll(),this.moving=!0,this.start()}}},function(t,e,i){var s=(i(1),i(18));e._cleanNavigation=function(){var t=document.getElementById("network-navigation_wrapper");t&&t.parentNode&&t.parentNode.removeChild(t),document.onmouseup=null},e._loadNavigationElements=function(){this._cleanNavigation(),this.navigationDivs={};var t=["up","down","left","right","zoomIn","zoomOut","zoomExtends"],e=["_moveUp","_moveDown","_moveLeft","_moveRight","_zoomIn","_zoomOut","zoomExtent"];this.navigationDivs.wrapper=document.createElement("div"),this.navigationDivs.wrapper.id="network-navigation_wrapper",this.frame.appendChild(this.navigationDivs.wrapper);for(var i=this,o=0;o0){"RL"==this.constants.hierarchicalLayout.direction||"DU"==this.constants.hierarchicalLayout.direction?this.constants.hierarchicalLayout.levelSeparation*=-1:this.constants.hierarchicalLayout.levelSeparation=Math.abs(this.constants.hierarchicalLayout.levelSeparation),"RL"==this.constants.hierarchicalLayout.direction||"LR"==this.constants.hierarchicalLayout.direction?1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="vertical"):1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="horizontal");var t,e,i=0,s=!1,o=!1;for(e in this.nodes)this.nodes.hasOwnProperty(e)&&(t=this.nodes[e],-1!=t.level?s=!0:o=!0,is&&(n.xFixed=!1,n.x=i[n.level].minPos,r=!0):n.yFixed&&n.level>s&&(n.yFixed=!1,n.y=i[n.level].minPos,r=!0),1==r&&(i[n.level].minPos+=i[n.level].nodeSpacing,n.edges.length>1&&this._placeBranchNodes(n.edges,n.id,i,n.level))}},e._setLevel=function(t,e,i){for(var s=0;st)&&(o.level=t,e.length>1&&this._setLevel(t+1,o.edges,o.id))}},e._restoreNodes=function(){for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.nodes[t].xFixed=!1,this.nodes[t].yFixed=!1)}},function(t,e){e.en={edit:"Edit",del:"Delete selected",back:"Back",addNode:"Add Node",addEdge:"Add Edge",editNode:"Edit Node",editEdge:"Edit Edge",addDescription:"Click in an empty space to place a new node.",edgeDescription:"Click on a node and drag the edge to another node to connect them.",editEdgeDescription:"Click on the control points and drag them to a node to connect to it.",createEdgeError:"Cannot link edges to a cluster.",deleteClusterError:"Clusters cannot be deleted."},e.en_EN=e.en,e.en_US=e.en,e.nl={edit:"Wijzigen",del:"Selectie verwijderen",back:"Terug",addNode:"Node toevoegen",addEdge:"Link toevoegen",editNode:"Node wijzigen",editEdge:"Link wijzigen",addDescription:"Klik op een leeg gebied om een nieuwe node te maken.",edgeDescription:"Klik op een node en sleep de link naar een andere node om ze te verbinden.",editEdgeDescription:"Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.",createEdgeError:"Kan geen link maken naar een cluster.",deleteClusterError:"Clusters kunnen niet worden verwijderd."},e.nl_NL=e.nl,e.nl_BE=e.nl},function(){"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.circle=function(t,e,i){this.beginPath(),this.arc(t,e,i,0,2*Math.PI,!1)},CanvasRenderingContext2D.prototype.square=function(t,e,i){this.beginPath(),this.rect(t-i,e-i,2*i,2*i)},CanvasRenderingContext2D.prototype.triangle=function(t,e,i){this.beginPath();var s=2*i,o=s/2,n=Math.sqrt(3)/6*s,r=Math.sqrt(s*s-o*o);this.moveTo(t,e-(r-n)),this.lineTo(t+o,e+n),this.lineTo(t-o,e+n),this.lineTo(t,e-(r-n)),this.closePath()},CanvasRenderingContext2D.prototype.triangleDown=function(t,e,i){this.beginPath();var s=2*i,o=s/2,n=Math.sqrt(3)/6*s,r=Math.sqrt(s*s-o*o);this.moveTo(t,e+(r-n)),this.lineTo(t+o,e-n),this.lineTo(t-o,e-n),this.lineTo(t,e+(r-n)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath();for(var s=0;10>s;s++){var o=s%2===0?1.3*i:.5*i;this.lineTo(t+o*Math.sin(2*s*Math.PI/10),e-o*Math.cos(2*s*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,s,o){var n=Math.PI/180;0>i-2*o&&(o=i/2),0>s-2*o&&(o=s/2),this.beginPath(),this.moveTo(t+o,e),this.lineTo(t+i-o,e),this.arc(t+i-o,e+o,o,270*n,360*n,!1),this.lineTo(t+i,e+s-o),this.arc(t+i-o,e+s-o,o,0,90*n,!1),this.lineTo(t+o,e+s),this.arc(t+o,e+s-o,o,90*n,180*n,!1),this.lineTo(t,e+o),this.arc(t+o,e+o,o,180*n,270*n,!1)},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,s){var o=.5522848,n=i/2*o,r=s/2*o,a=t+i,h=e+s,d=t+i/2,l=e+s/2;this.beginPath(),this.moveTo(t,l),this.bezierCurveTo(t,l-r,d-n,e,d,e),this.bezierCurveTo(d+n,e,a,l-r,a,l),this.bezierCurveTo(a,l+r,d+n,h,d,h),this.bezierCurveTo(d-n,h,t,l+r,t,l)},CanvasRenderingContext2D.prototype.database=function(t,e,i,s){var o=1/3,n=i,r=s*o,a=.5522848,h=n/2*a,d=r/2*a,l=t+n,c=e+r,p=t+n/2,u=e+r/2,f=e+(s-r/2),g=e+s;this.beginPath(),this.moveTo(l,u),this.bezierCurveTo(l,u+d,p+h,c,p,c),this.bezierCurveTo(p-h,c,t,u+d,t,u),this.bezierCurveTo(t,u-d,p-h,e,p,e),this.bezierCurveTo(p+h,e,l,u-d,l,u),this.lineTo(l,f),this.bezierCurveTo(l,f+d,p+h,g,p,g),this.bezierCurveTo(p-h,g,t,f+d,t,f),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,s){var o=t-s*Math.cos(i),n=e-s*Math.sin(i),r=t-.9*s*Math.cos(i),a=e-.9*s*Math.sin(i),h=o+s/3*Math.cos(i+.5*Math.PI),d=n+s/3*Math.sin(i+.5*Math.PI),l=o+s/3*Math.cos(i-.5*Math.PI),c=n+s/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(r,a),this.lineTo(l,c),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,s,o){o||(o=[10,5]),0==p&&(p=.001);var n=o.length;this.moveTo(t,e);for(var r=i-t,a=s-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,c=!0;d>=.1;){var p=o[l++%n];p>d&&(p=d);var u=Math.sqrt(p*p/(1+h*h));0>r&&(u=-u),t+=u,e+=h*u,this[c?"lineTo":"moveTo"](t,e),d-=p,c=!c}})}])}); diff --git a/lib/timeline/Graph2d.js b/lib/timeline/Graph2d.js index b165d162..5874e5b7 100644 --- a/lib/timeline/Graph2d.js +++ b/lib/timeline/Graph2d.js @@ -190,7 +190,7 @@ Graph2d.prototype.getLegend = function(groupId, width, height) { */ Graph2d.prototype.isGroupVisible = function(groupId) { if (this.linegraph.groups[groupId] !== undefined) { - return (this.linegraph.groups[groupId].visible && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)); + return (this.linegraph.groups[groupId].visible && (this.linegraph.options.groups.visibility[groupId] === undefined || this.linegraph.options.groups.visibility[groupId] == true)); } else { return false;