diff --git a/Readme.md b/Readme.md
index 0b87aec..70a92f6 100644
--- a/Readme.md
+++ b/Readme.md
@@ -54,7 +54,7 @@
   frequencyQuery(query, paste(vc, years), as.alternatives = as.alternatives) %>%
   hc_freq_by_year_ci(as.alternatives)
 ```
-[![Proportion of "ergibt … Sinn"  versus "macht … Sinn" between 1980 and 2010 in newspapers and magazines](man/figures/Readme-Example-2.png)<!-- -->](https://raw.githubusercontent.com/KorAP/RKorAPClient/master/man/figures/Readme-Example-2.html)
+[![Proportion of "ergibt … Sinn"  versus "macht … Sinn" between 1980 and 2010 in newspapers and magazines](man/figures/Readme-Example-2.png)<!-- -->](https://korap.github.io/RKorAPClient/man/figures/Readme-Example-2.html)
 
 ## Demos
 
diff --git a/man/figures/Readme-Example-2.html b/man/figures/Readme-Example-2.html
deleted file mode 100644
index 5048531..0000000
--- a/man/figures/Readme-Example-2.html
+++ /dev/null
@@ -1,4306 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8" />
-<style>body{background-color:white;}</style>
-<script>(function() {
-  // If window.HTMLWidgets is already defined, then use it; otherwise create a
-  // new object. This allows preceding code to set options that affect the
-  // initialization process (though none currently exist).
-  window.HTMLWidgets = window.HTMLWidgets || {};
-
-  // See if we're running in a viewer pane. If not, we're in a web browser.
-  var viewerMode = window.HTMLWidgets.viewerMode =
-      /\bviewer_pane=1\b/.test(window.location);
-
-  // See if we're running in Shiny mode. If not, it's a static document.
-  // Note that static widgets can appear in both Shiny and static modes, but
-  // obviously, Shiny widgets can only appear in Shiny apps/documents.
-  var shinyMode = window.HTMLWidgets.shinyMode =
-      typeof(window.Shiny) !== "undefined" && !!window.Shiny.outputBindings;
-
-  // We can't count on jQuery being available, so we implement our own
-  // version if necessary.
-  function querySelectorAll(scope, selector) {
-    if (typeof(jQuery) !== "undefined" && scope instanceof jQuery) {
-      return scope.find(selector);
-    }
-    if (scope.querySelectorAll) {
-      return scope.querySelectorAll(selector);
-    }
-  }
-
-  function asArray(value) {
-    if (value === null)
-      return [];
-    if ($.isArray(value))
-      return value;
-    return [value];
-  }
-
-  // Implement jQuery's extend
-  function extend(target /*, ... */) {
-    if (arguments.length == 1) {
-      return target;
-    }
-    for (var i = 1; i < arguments.length; i++) {
-      var source = arguments[i];
-      for (var prop in source) {
-        if (source.hasOwnProperty(prop)) {
-          target[prop] = source[prop];
-        }
-      }
-    }
-    return target;
-  }
-
-  // IE8 doesn't support Array.forEach.
-  function forEach(values, callback, thisArg) {
-    if (values.forEach) {
-      values.forEach(callback, thisArg);
-    } else {
-      for (var i = 0; i < values.length; i++) {
-        callback.call(thisArg, values[i], i, values);
-      }
-    }
-  }
-
-  // Replaces the specified method with the return value of funcSource.
-  //
-  // Note that funcSource should not BE the new method, it should be a function
-  // that RETURNS the new method. funcSource receives a single argument that is
-  // the overridden method, it can be called from the new method. The overridden
-  // method can be called like a regular function, it has the target permanently
-  // bound to it so "this" will work correctly.
-  function overrideMethod(target, methodName, funcSource) {
-    var superFunc = target[methodName] || function() {};
-    var superFuncBound = function() {
-      return superFunc.apply(target, arguments);
-    };
-    target[methodName] = funcSource(superFuncBound);
-  }
-
-  // Add a method to delegator that, when invoked, calls
-  // delegatee.methodName. If there is no such method on
-  // the delegatee, but there was one on delegator before
-  // delegateMethod was called, then the original version
-  // is invoked instead.
-  // For example:
-  //
-  // var a = {
-  //   method1: function() { console.log('a1'); }
-  //   method2: function() { console.log('a2'); }
-  // };
-  // var b = {
-  //   method1: function() { console.log('b1'); }
-  // };
-  // delegateMethod(a, b, "method1");
-  // delegateMethod(a, b, "method2");
-  // a.method1();
-  // a.method2();
-  //
-  // The output would be "b1", "a2".
-  function delegateMethod(delegator, delegatee, methodName) {
-    var inherited = delegator[methodName];
-    delegator[methodName] = function() {
-      var target = delegatee;
-      var method = delegatee[methodName];
-
-      // The method doesn't exist on the delegatee. Instead,
-      // call the method on the delegator, if it exists.
-      if (!method) {
-        target = delegator;
-        method = inherited;
-      }
-
-      if (method) {
-        return method.apply(target, arguments);
-      }
-    };
-  }
-
-  // Implement a vague facsimilie of jQuery's data method
-  function elementData(el, name, value) {
-    if (arguments.length == 2) {
-      return el["htmlwidget_data_" + name];
-    } else if (arguments.length == 3) {
-      el["htmlwidget_data_" + name] = value;
-      return el;
-    } else {
-      throw new Error("Wrong number of arguments for elementData: " +
-        arguments.length);
-    }
-  }
-
-  // http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
-  function escapeRegExp(str) {
-    return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
-  }
-
-  function hasClass(el, className) {
-    var re = new RegExp("\\b" + escapeRegExp(className) + "\\b");
-    return re.test(el.className);
-  }
-
-  // elements - array (or array-like object) of HTML elements
-  // className - class name to test for
-  // include - if true, only return elements with given className;
-  //   if false, only return elements *without* given className
-  function filterByClass(elements, className, include) {
-    var results = [];
-    for (var i = 0; i < elements.length; i++) {
-      if (hasClass(elements[i], className) == include)
-        results.push(elements[i]);
-    }
-    return results;
-  }
-
-  function on(obj, eventName, func) {
-    if (obj.addEventListener) {
-      obj.addEventListener(eventName, func, false);
-    } else if (obj.attachEvent) {
-      obj.attachEvent(eventName, func);
-    }
-  }
-
-  function off(obj, eventName, func) {
-    if (obj.removeEventListener)
-      obj.removeEventListener(eventName, func, false);
-    else if (obj.detachEvent) {
-      obj.detachEvent(eventName, func);
-    }
-  }
-
-  // Translate array of values to top/right/bottom/left, as usual with
-  // the "padding" CSS property
-  // https://developer.mozilla.org/en-US/docs/Web/CSS/padding
-  function unpackPadding(value) {
-    if (typeof(value) === "number")
-      value = [value];
-    if (value.length === 1) {
-      return {top: value[0], right: value[0], bottom: value[0], left: value[0]};
-    }
-    if (value.length === 2) {
-      return {top: value[0], right: value[1], bottom: value[0], left: value[1]};
-    }
-    if (value.length === 3) {
-      return {top: value[0], right: value[1], bottom: value[2], left: value[1]};
-    }
-    if (value.length === 4) {
-      return {top: value[0], right: value[1], bottom: value[2], left: value[3]};
-    }
-  }
-
-  // Convert an unpacked padding object to a CSS value
-  function paddingToCss(paddingObj) {
-    return paddingObj.top + "px " + paddingObj.right + "px " + paddingObj.bottom + "px " + paddingObj.left + "px";
-  }
-
-  // Makes a number suitable for CSS
-  function px(x) {
-    if (typeof(x) === "number")
-      return x + "px";
-    else
-      return x;
-  }
-
-  // Retrieves runtime widget sizing information for an element.
-  // The return value is either null, or an object with fill, padding,
-  // defaultWidth, defaultHeight fields.
-  function sizingPolicy(el) {
-    var sizingEl = document.querySelector("script[data-for='" + el.id + "'][type='application/htmlwidget-sizing']");
-    if (!sizingEl)
-      return null;
-    var sp = JSON.parse(sizingEl.textContent || sizingEl.text || "{}");
-    if (viewerMode) {
-      return sp.viewer;
-    } else {
-      return sp.browser;
-    }
-  }
-
-  // @param tasks Array of strings (or falsy value, in which case no-op).
-  //   Each element must be a valid JavaScript expression that yields a
-  //   function. Or, can be an array of objects with "code" and "data"
-  //   properties; in this case, the "code" property should be a string
-  //   of JS that's an expr that yields a function, and "data" should be
-  //   an object that will be added as an additional argument when that
-  //   function is called.
-  // @param target The object that will be "this" for each function
-  //   execution.
-  // @param args Array of arguments to be passed to the functions. (The
-  //   same arguments will be passed to all functions.)
-  function evalAndRun(tasks, target, args) {
-    if (tasks) {
-      forEach(tasks, function(task) {
-        var theseArgs = args;
-        if (typeof(task) === "object") {
-          theseArgs = theseArgs.concat([task.data]);
-          task = task.code;
-        }
-        var taskFunc = tryEval(task);
-        if (typeof(taskFunc) !== "function") {
-          throw new Error("Task must be a function! Source:\n" + task);
-        }
-        taskFunc.apply(target, theseArgs);
-      });
-    }
-  }
-
-  // Attempt eval() both with and without enclosing in parentheses.
-  // Note that enclosing coerces a function declaration into
-  // an expression that eval() can parse
-  // (otherwise, a SyntaxError is thrown)
-  function tryEval(code) {
-    var result = null;
-    try {
-      result = eval(code);
-    } catch(error) {
-      if (!error instanceof SyntaxError) {
-        throw error;
-      }
-      try {
-        result = eval("(" + code + ")");
-      } catch(e) {
-        if (e instanceof SyntaxError) {
-          throw error;
-        } else {
-          throw e;
-        }
-      }
-    }
-    return result;
-  }
-
-  function initSizing(el) {
-    var sizing = sizingPolicy(el);
-    if (!sizing)
-      return;
-
-    var cel = document.getElementById("htmlwidget_container");
-    if (!cel)
-      return;
-
-    if (typeof(sizing.padding) !== "undefined") {
-      document.body.style.margin = "0";
-      document.body.style.padding = paddingToCss(unpackPadding(sizing.padding));
-    }
-
-    if (sizing.fill) {
-      document.body.style.overflow = "hidden";
-      document.body.style.width = "100%";
-      document.body.style.height = "100%";
-      document.documentElement.style.width = "100%";
-      document.documentElement.style.height = "100%";
-      if (cel) {
-        cel.style.position = "absolute";
-        var pad = unpackPadding(sizing.padding);
-        cel.style.top = pad.top + "px";
-        cel.style.right = pad.right + "px";
-        cel.style.bottom = pad.bottom + "px";
-        cel.style.left = pad.left + "px";
-        el.style.width = "100%";
-        el.style.height = "100%";
-      }
-
-      return {
-        getWidth: function() { return cel.offsetWidth; },
-        getHeight: function() { return cel.offsetHeight; }
-      };
-
-    } else {
-      el.style.width = px(sizing.width);
-      el.style.height = px(sizing.height);
-
-      return {
-        getWidth: function() { return el.offsetWidth; },
-        getHeight: function() { return el.offsetHeight; }
-      };
-    }
-  }
-
-  // Default implementations for methods
-  var defaults = {
-    find: function(scope) {
-      return querySelectorAll(scope, "." + this.name);
-    },
-    renderError: function(el, err) {
-      var $el = $(el);
-
-      this.clearError(el);
-
-      // Add all these error classes, as Shiny does
-      var errClass = "shiny-output-error";
-      if (err.type !== null) {
-        // use the classes of the error condition as CSS class names
-        errClass = errClass + " " + $.map(asArray(err.type), function(type) {
-          return errClass + "-" + type;
-        }).join(" ");
-      }
-      errClass = errClass + " htmlwidgets-error";
-
-      // Is el inline or block? If inline or inline-block, just display:none it
-      // and add an inline error.
-      var display = $el.css("display");
-      $el.data("restore-display-mode", display);
-
-      if (display === "inline" || display === "inline-block") {
-        $el.hide();
-        if (err.message !== "") {
-          var errorSpan = $("<span>").addClass(errClass);
-          errorSpan.text(err.message);
-          $el.after(errorSpan);
-        }
-      } else if (display === "block") {
-        // If block, add an error just after the el, set visibility:none on the
-        // el, and position the error to be on top of the el.
-        // Mark it with a unique ID and CSS class so we can remove it later.
-        $el.css("visibility", "hidden");
-        if (err.message !== "") {
-          var errorDiv = $("<div>").addClass(errClass).css("position", "absolute")
-            .css("top", el.offsetTop)
-            .css("left", el.offsetLeft)
-            // setting width can push out the page size, forcing otherwise
-            // unnecessary scrollbars to appear and making it impossible for
-            // the element to shrink; so use max-width instead
-            .css("maxWidth", el.offsetWidth)
-            .css("height", el.offsetHeight);
-          errorDiv.text(err.message);
-          $el.after(errorDiv);
-
-          // Really dumb way to keep the size/position of the error in sync with
-          // the parent element as the window is resized or whatever.
-          var intId = setInterval(function() {
-            if (!errorDiv[0].parentElement) {
-              clearInterval(intId);
-              return;
-            }
-            errorDiv
-              .css("top", el.offsetTop)
-              .css("left", el.offsetLeft)
-              .css("maxWidth", el.offsetWidth)
-              .css("height", el.offsetHeight);
-          }, 500);
-        }
-      }
-    },
-    clearError: function(el) {
-      var $el = $(el);
-      var display = $el.data("restore-display-mode");
-      $el.data("restore-display-mode", null);
-
-      if (display === "inline" || display === "inline-block") {
-        if (display)
-          $el.css("display", display);
-        $(el.nextSibling).filter(".htmlwidgets-error").remove();
-      } else if (display === "block"){
-        $el.css("visibility", "inherit");
-        $(el.nextSibling).filter(".htmlwidgets-error").remove();
-      }
-    },
-    sizing: {}
-  };
-
-  // Called by widget bindings to register a new type of widget. The definition
-  // object can contain the following properties:
-  // - name (required) - A string indicating the binding name, which will be
-  //   used by default as the CSS classname to look for.
-  // - initialize (optional) - A function(el) that will be called once per
-  //   widget element; if a value is returned, it will be passed as the third
-  //   value to renderValue.
-  // - renderValue (required) - A function(el, data, initValue) that will be
-  //   called with data. Static contexts will cause this to be called once per
-  //   element; Shiny apps will cause this to be called multiple times per
-  //   element, as the data changes.
-  window.HTMLWidgets.widget = function(definition) {
-    if (!definition.name) {
-      throw new Error("Widget must have a name");
-    }
-    if (!definition.type) {
-      throw new Error("Widget must have a type");
-    }
-    // Currently we only support output widgets
-    if (definition.type !== "output") {
-      throw new Error("Unrecognized widget type '" + definition.type + "'");
-    }
-    // TODO: Verify that .name is a valid CSS classname
-
-    // Support new-style instance-bound definitions. Old-style class-bound
-    // definitions have one widget "object" per widget per type/class of
-    // widget; the renderValue and resize methods on such widget objects
-    // take el and instance arguments, because the widget object can't
-    // store them. New-style instance-bound definitions have one widget
-    // object per widget instance; the definition that's passed in doesn't
-    // provide renderValue or resize methods at all, just the single method
-    //   factory(el, width, height)
-    // which returns an object that has renderValue(x) and resize(w, h).
-    // This enables a far more natural programming style for the widget
-    // author, who can store per-instance state using either OO-style
-    // instance fields or functional-style closure variables (I guess this
-    // is in contrast to what can only be called C-style pseudo-OO which is
-    // what we required before).
-    if (definition.factory) {
-      definition = createLegacyDefinitionAdapter(definition);
-    }
-
-    if (!definition.renderValue) {
-      throw new Error("Widget must have a renderValue function");
-    }
-
-    // For static rendering (non-Shiny), use a simple widget registration
-    // scheme. We also use this scheme for Shiny apps/documents that also
-    // contain static widgets.
-    window.HTMLWidgets.widgets = window.HTMLWidgets.widgets || [];
-    // Merge defaults into the definition; don't mutate the original definition.
-    var staticBinding = extend({}, defaults, definition);
-    overrideMethod(staticBinding, "find", function(superfunc) {
-      return function(scope) {
-        var results = superfunc(scope);
-        // Filter out Shiny outputs, we only want the static kind
-        return filterByClass(results, "html-widget-output", false);
-      };
-    });
-    window.HTMLWidgets.widgets.push(staticBinding);
-
-    if (shinyMode) {
-      // Shiny is running. Register the definition with an output binding.
-      // The definition itself will not be the output binding, instead
-      // we will make an output binding object that delegates to the
-      // definition. This is because we foolishly used the same method
-      // name (renderValue) for htmlwidgets definition and Shiny bindings
-      // but they actually have quite different semantics (the Shiny
-      // bindings receive data that includes lots of metadata that it
-      // strips off before calling htmlwidgets renderValue). We can't
-      // just ignore the difference because in some widgets it's helpful
-      // to call this.renderValue() from inside of resize(), and if
-      // we're not delegating, then that call will go to the Shiny
-      // version instead of the htmlwidgets version.
-
-      // Merge defaults with definition, without mutating either.
-      var bindingDef = extend({}, defaults, definition);
-
-      // This object will be our actual Shiny binding.
-      var shinyBinding = new Shiny.OutputBinding();
-
-      // With a few exceptions, we'll want to simply use the bindingDef's
-      // version of methods if they are available, otherwise fall back to
-      // Shiny's defaults. NOTE: If Shiny's output bindings gain additional
-      // methods in the future, and we want them to be overrideable by
-      // HTMLWidget binding definitions, then we'll need to add them to this
-      // list.
-      delegateMethod(shinyBinding, bindingDef, "getId");
-      delegateMethod(shinyBinding, bindingDef, "onValueChange");
-      delegateMethod(shinyBinding, bindingDef, "onValueError");
-      delegateMethod(shinyBinding, bindingDef, "renderError");
-      delegateMethod(shinyBinding, bindingDef, "clearError");
-      delegateMethod(shinyBinding, bindingDef, "showProgress");
-
-      // The find, renderValue, and resize are handled differently, because we
-      // want to actually decorate the behavior of the bindingDef methods.
-
-      shinyBinding.find = function(scope) {
-        var results = bindingDef.find(scope);
-
-        // Only return elements that are Shiny outputs, not static ones
-        var dynamicResults = results.filter(".html-widget-output");
-
-        // It's possible that whatever caused Shiny to think there might be
-        // new dynamic outputs, also caused there to be new static outputs.
-        // Since there might be lots of different htmlwidgets bindings, we
-        // schedule execution for later--no need to staticRender multiple
-        // times.
-        if (results.length !== dynamicResults.length)
-          scheduleStaticRender();
-
-        return dynamicResults;
-      };
-
-      // Wrap renderValue to handle initialization, which unfortunately isn't
-      // supported natively by Shiny at the time of this writing.
-
-      shinyBinding.renderValue = function(el, data) {
-        Shiny.renderDependencies(data.deps);
-        // Resolve strings marked as javascript literals to objects
-        if (!(data.evals instanceof Array)) data.evals = [data.evals];
-        for (var i = 0; data.evals && i < data.evals.length; i++) {
-          window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]);
-        }
-        if (!bindingDef.renderOnNullValue) {
-          if (data.x === null) {
-            el.style.visibility = "hidden";
-            return;
-          } else {
-            el.style.visibility = "inherit";
-          }
-        }
-        if (!elementData(el, "initialized")) {
-          initSizing(el);
-
-          elementData(el, "initialized", true);
-          if (bindingDef.initialize) {
-            var result = bindingDef.initialize(el, el.offsetWidth,
-              el.offsetHeight);
-            elementData(el, "init_result", result);
-          }
-        }
-        bindingDef.renderValue(el, data.x, elementData(el, "init_result"));
-        evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]);
-      };
-
-      // Only override resize if bindingDef implements it
-      if (bindingDef.resize) {
-        shinyBinding.resize = function(el, width, height) {
-          // Shiny can call resize before initialize/renderValue have been
-          // called, which doesn't make sense for widgets.
-          if (elementData(el, "initialized")) {
-            bindingDef.resize(el, width, height, elementData(el, "init_result"));
-          }
-        };
-      }
-
-      Shiny.outputBindings.register(shinyBinding, bindingDef.name);
-    }
-  };
-
-  var scheduleStaticRenderTimerId = null;
-  function scheduleStaticRender() {
-    if (!scheduleStaticRenderTimerId) {
-      scheduleStaticRenderTimerId = setTimeout(function() {
-        scheduleStaticRenderTimerId = null;
-        window.HTMLWidgets.staticRender();
-      }, 1);
-    }
-  }
-
-  // Render static widgets after the document finishes loading
-  // Statically render all elements that are of this widget's class
-  window.HTMLWidgets.staticRender = function() {
-    var bindings = window.HTMLWidgets.widgets || [];
-    forEach(bindings, function(binding) {
-      var matches = binding.find(document.documentElement);
-      forEach(matches, function(el) {
-        var sizeObj = initSizing(el, binding);
-
-        if (hasClass(el, "html-widget-static-bound"))
-          return;
-        el.className = el.className + " html-widget-static-bound";
-
-        var initResult;
-        if (binding.initialize) {
-          initResult = binding.initialize(el,
-            sizeObj ? sizeObj.getWidth() : el.offsetWidth,
-            sizeObj ? sizeObj.getHeight() : el.offsetHeight
-          );
-          elementData(el, "init_result", initResult);
-        }
-
-        if (binding.resize) {
-          var lastSize = {
-            w: sizeObj ? sizeObj.getWidth() : el.offsetWidth,
-            h: sizeObj ? sizeObj.getHeight() : el.offsetHeight
-          };
-          var resizeHandler = function(e) {
-            var size = {
-              w: sizeObj ? sizeObj.getWidth() : el.offsetWidth,
-              h: sizeObj ? sizeObj.getHeight() : el.offsetHeight
-            };
-            if (size.w === 0 && size.h === 0)
-              return;
-            if (size.w === lastSize.w && size.h === lastSize.h)
-              return;
-            lastSize = size;
-            binding.resize(el, size.w, size.h, initResult);
-          };
-
-          on(window, "resize", resizeHandler);
-
-          // This is needed for cases where we're running in a Shiny
-          // app, but the widget itself is not a Shiny output, but
-          // rather a simple static widget. One example of this is
-          // an rmarkdown document that has runtime:shiny and widget
-          // that isn't in a render function. Shiny only knows to
-          // call resize handlers for Shiny outputs, not for static
-          // widgets, so we do it ourselves.
-          if (window.jQuery) {
-            window.jQuery(document).on(
-              "shown.htmlwidgets shown.bs.tab.htmlwidgets shown.bs.collapse.htmlwidgets",
-              resizeHandler
-            );
-            window.jQuery(document).on(
-              "hidden.htmlwidgets hidden.bs.tab.htmlwidgets hidden.bs.collapse.htmlwidgets",
-              resizeHandler
-            );
-          }
-
-          // This is needed for the specific case of ioslides, which
-          // flips slides between display:none and display:block.
-          // Ideally we would not have to have ioslide-specific code
-          // here, but rather have ioslides raise a generic event,
-          // but the rmarkdown package just went to CRAN so the
-          // window to getting that fixed may be long.
-          if (window.addEventListener) {
-            // It's OK to limit this to window.addEventListener
-            // browsers because ioslides itself only supports
-            // such browsers.
-            on(document, "slideenter", resizeHandler);
-            on(document, "slideleave", resizeHandler);
-          }
-        }
-
-        var scriptData = document.querySelector("script[data-for='" + el.id + "'][type='application/json']");
-        if (scriptData) {
-          var data = JSON.parse(scriptData.textContent || scriptData.text);
-          // Resolve strings marked as javascript literals to objects
-          if (!(data.evals instanceof Array)) data.evals = [data.evals];
-          for (var k = 0; data.evals && k < data.evals.length; k++) {
-            window.HTMLWidgets.evaluateStringMember(data.x, data.evals[k]);
-          }
-          binding.renderValue(el, data.x, initResult);
-          evalAndRun(data.jsHooks.render, initResult, [el, data.x]);
-        }
-      });
-    });
-
-    invokePostRenderHandlers();
-  }
-
-
-  function has_jQuery3() {
-    if (!window.jQuery) {
-      return false;
-    }
-    var $version = window.jQuery.fn.jquery;
-    var $major_version = parseInt($version.split(".")[0]);
-    return $major_version >= 3;
-  }
-
-  /*
-  / Shiny 1.4 bumped jQuery from 1.x to 3.x which means jQuery's
-  / on-ready handler (i.e., $(fn)) is now asyncronous (i.e., it now
-  / really means $(setTimeout(fn)).
-  / https://jquery.com/upgrade-guide/3.0/#breaking-change-document-ready-handlers-are-now-asynchronous
-  /
-  / Since Shiny uses $() to schedule initShiny, shiny>=1.4 calls initShiny
-  / one tick later than it did before, which means staticRender() is
-  / called renderValue() earlier than (advanced) widget authors might be expecting.
-  / https://github.com/rstudio/shiny/issues/2630
-  /
-  / For a concrete example, leaflet has some methods (e.g., updateBounds)
-  / which reference Shiny methods registered in initShiny (e.g., setInputValue).
-  / Since leaflet is privy to this life-cycle, it knows to use setTimeout() to
-  / delay execution of those methods (until Shiny methods are ready)
-  / https://github.com/rstudio/leaflet/blob/18ec981/javascript/src/index.js#L266-L268
-  /
-  / Ideally widget authors wouldn't need to use this setTimeout() hack that
-  / leaflet uses to call Shiny methods on a staticRender(). In the long run,
-  / the logic initShiny should be broken up so that method registration happens
-  / right away, but binding happens later.
-  */
-  function maybeStaticRenderLater() {
-    if (shinyMode && has_jQuery3()) {
-      window.jQuery(window.HTMLWidgets.staticRender);
-    } else {
-      window.HTMLWidgets.staticRender();
-    }
-  }
-
-  if (document.addEventListener) {
-    document.addEventListener("DOMContentLoaded", function() {
-      document.removeEventListener("DOMContentLoaded", arguments.callee, false);
-      maybeStaticRenderLater();
-    }, false);
-  } else if (document.attachEvent) {
-    document.attachEvent("onreadystatechange", function() {
-      if (document.readyState === "complete") {
-        document.detachEvent("onreadystatechange", arguments.callee);
-        maybeStaticRenderLater();
-      }
-    });
-  }
-
-
-  window.HTMLWidgets.getAttachmentUrl = function(depname, key) {
-    // If no key, default to the first item
-    if (typeof(key) === "undefined")
-      key = 1;
-
-    var link = document.getElementById(depname + "-" + key + "-attachment");
-    if (!link) {
-      throw new Error("Attachment " + depname + "/" + key + " not found in document");
-    }
-    return link.getAttribute("href");
-  };
-
-  window.HTMLWidgets.dataframeToD3 = function(df) {
-    var names = [];
-    var length;
-    for (var name in df) {
-        if (df.hasOwnProperty(name))
-            names.push(name);
-        if (typeof(df[name]) !== "object" || typeof(df[name].length) === "undefined") {
-            throw new Error("All fields must be arrays");
-        } else if (typeof(length) !== "undefined" && length !== df[name].length) {
-            throw new Error("All fields must be arrays of the same length");
-        }
-        length = df[name].length;
-    }
-    var results = [];
-    var item;
-    for (var row = 0; row < length; row++) {
-        item = {};
-        for (var col = 0; col < names.length; col++) {
-            item[names[col]] = df[names[col]][row];
-        }
-        results.push(item);
-    }
-    return results;
-  };
-
-  window.HTMLWidgets.transposeArray2D = function(array) {
-      if (array.length === 0) return array;
-      var newArray = array[0].map(function(col, i) {
-          return array.map(function(row) {
-              return row[i]
-          })
-      });
-      return newArray;
-  };
-  // Split value at splitChar, but allow splitChar to be escaped
-  // using escapeChar. Any other characters escaped by escapeChar
-  // will be included as usual (including escapeChar itself).
-  function splitWithEscape(value, splitChar, escapeChar) {
-    var results = [];
-    var escapeMode = false;
-    var currentResult = "";
-    for (var pos = 0; pos < value.length; pos++) {
-      if (!escapeMode) {
-        if (value[pos] === splitChar) {
-          results.push(currentResult);
-          currentResult = "";
-        } else if (value[pos] === escapeChar) {
-          escapeMode = true;
-        } else {
-          currentResult += value[pos];
-        }
-      } else {
-        currentResult += value[pos];
-        escapeMode = false;
-      }
-    }
-    if (currentResult !== "") {
-      results.push(currentResult);
-    }
-    return results;
-  }
-  // Function authored by Yihui/JJ Allaire
-  window.HTMLWidgets.evaluateStringMember = function(o, member) {
-    var parts = splitWithEscape(member, '.', '\\');
-    for (var i = 0, l = parts.length; i < l; i++) {
-      var part = parts[i];
-      // part may be a character or 'numeric' member name
-      if (o !== null && typeof o === "object" && part in o) {
-        if (i == (l - 1)) { // if we are at the end of the line then evalulate
-          if (typeof o[part] === "string")
-            o[part] = tryEval(o[part]);
-        } else { // otherwise continue to next embedded object
-          o = o[part];
-        }
-      }
-    }
-  };
-
-  // Retrieve the HTMLWidget instance (i.e. the return value of an
-  // HTMLWidget binding's initialize() or factory() function)
-  // associated with an element, or null if none.
-  window.HTMLWidgets.getInstance = function(el) {
-    return elementData(el, "init_result");
-  };
-
-  // Finds the first element in the scope that matches the selector,
-  // and returns the HTMLWidget instance (i.e. the return value of
-  // an HTMLWidget binding's initialize() or factory() function)
-  // associated with that element, if any. If no element matches the
-  // selector, or the first matching element has no HTMLWidget
-  // instance associated with it, then null is returned.
-  //
-  // The scope argument is optional, and defaults to window.document.
-  window.HTMLWidgets.find = function(scope, selector) {
-    if (arguments.length == 1) {
-      selector = scope;
-      scope = document;
-    }
-
-    var el = scope.querySelector(selector);
-    if (el === null) {
-      return null;
-    } else {
-      return window.HTMLWidgets.getInstance(el);
-    }
-  };
-
-  // Finds all elements in the scope that match the selector, and
-  // returns the HTMLWidget instances (i.e. the return values of
-  // an HTMLWidget binding's initialize() or factory() function)
-  // associated with the elements, in an array. If elements that
-  // match the selector don't have an associated HTMLWidget
-  // instance, the returned array will contain nulls.
-  //
-  // The scope argument is optional, and defaults to window.document.
-  window.HTMLWidgets.findAll = function(scope, selector) {
-    if (arguments.length == 1) {
-      selector = scope;
-      scope = document;
-    }
-
-    var nodes = scope.querySelectorAll(selector);
-    var results = [];
-    for (var i = 0; i < nodes.length; i++) {
-      results.push(window.HTMLWidgets.getInstance(nodes[i]));
-    }
-    return results;
-  };
-
-  var postRenderHandlers = [];
-  function invokePostRenderHandlers() {
-    while (postRenderHandlers.length) {
-      var handler = postRenderHandlers.shift();
-      if (handler) {
-        handler();
-      }
-    }
-  }
-
-  // Register the given callback function to be invoked after the
-  // next time static widgets are rendered.
-  window.HTMLWidgets.addPostRenderHandler = function(callback) {
-    postRenderHandlers.push(callback);
-  };
-
-  // Takes a new-style instance-bound definition, and returns an
-  // old-style class-bound definition. This saves us from having
-  // to rewrite all the logic in this file to accomodate both
-  // types of definitions.
-  function createLegacyDefinitionAdapter(defn) {
-    var result = {
-      name: defn.name,
-      type: defn.type,
-      initialize: function(el, width, height) {
-        return defn.factory(el, width, height);
-      },
-      renderValue: function(el, x, instance) {
-        return instance.renderValue(x);
-      },
-      resize: function(el, width, height, instance) {
-        return instance.resize(width, height);
-      }
-    };
-
-    if (defn.find)
-      result.find = defn.find;
-    if (defn.renderError)
-      result.renderError = defn.renderError;
-    if (defn.clearError)
-      result.clearError = defn.clearError;
-
-    return result;
-  }
-})();
-
-</script>
-<script>/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
-!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;
-if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")
-},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
-</script>
-<script>!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.proj4=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({"./includedProjections":[function(a,b,c){var d=[a("./lib/projections/tmerc"),a("./lib/projections/utm"),a("./lib/projections/sterea"),a("./lib/projections/stere"),a("./lib/projections/somerc"),a("./lib/projections/omerc"),a("./lib/projections/lcc"),a("./lib/projections/krovak"),a("./lib/projections/cass"),a("./lib/projections/laea"),a("./lib/projections/aea"),a("./lib/projections/gnom"),a("./lib/projections/cea"),a("./lib/projections/eqc"),a("./lib/projections/poly"),a("./lib/projections/nzmg"),a("./lib/projections/mill"),a("./lib/projections/sinu"),a("./lib/projections/moll"),a("./lib/projections/eqdc"),a("./lib/projections/vandg"),a("./lib/projections/aeqd"),a("./lib/projections/ortho")];b.exports=function(proj4){d.forEach(function(a){proj4.Proj.projections.add(a)})}},{"./lib/projections/aea":40,"./lib/projections/aeqd":41,"./lib/projections/cass":42,"./lib/projections/cea":43,"./lib/projections/eqc":44,"./lib/projections/eqdc":45,"./lib/projections/gnom":47,"./lib/projections/krovak":48,"./lib/projections/laea":49,"./lib/projections/lcc":50,"./lib/projections/mill":53,"./lib/projections/moll":54,"./lib/projections/nzmg":55,"./lib/projections/omerc":56,"./lib/projections/ortho":57,"./lib/projections/poly":58,"./lib/projections/sinu":59,"./lib/projections/somerc":60,"./lib/projections/stere":61,"./lib/projections/sterea":62,"./lib/projections/tmerc":63,"./lib/projections/utm":64,"./lib/projections/vandg":65}],1:[function(a,b,c){function Point(a,b,c){if(!(this instanceof Point))return new Point(a,b,c);if(Array.isArray(a))this.x=a[0],this.y=a[1],this.z=a[2]||0;else if("object"==typeof a)this.x=a.x,this.y=a.y,this.z=a.z||0;else if("string"==typeof a&&"undefined"==typeof b){var d=a.split(",");this.x=parseFloat(d[0],10),this.y=parseFloat(d[1],10),this.z=parseFloat(d[2],10)||0}else this.x=a,this.y=b,this.z=c||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}var d=a("mgrs");Point.fromMGRS=function(a){return new Point(d.toPoint(a))},Point.prototype.toMGRS=function(a){return d.forward([this.x,this.y],a)},b.exports=Point},{mgrs:68}],2:[function(a,b,c){function Projection(a,b){if(!(this instanceof Projection))return new Projection(a);b=b||function(a){if(a)throw a};var c=d(a);if("object"!=typeof c)return void b(a);var f=g(c),h=Projection.projections.get(f.projName);h?(e(this,f),e(this,h),this.init(),b(null,this)):b(a)}var d=a("./parseCode"),e=a("./extend"),f=a("./projections"),g=a("./deriveConstants");Projection.projections=f,Projection.projections.start(),b.exports=Projection},{"./deriveConstants":33,"./extend":34,"./parseCode":37,"./projections":39}],3:[function(a,b,c){b.exports=function(a,b,c){var d,e,f,g=c.x,h=c.y,i=c.z||0;for(f=0;3>f;f++)if(!b||2!==f||void 0!==c.z)switch(0===f?(d=g,e="x"):1===f?(d=h,e="y"):(d=i,e="z"),a.axis[f]){case"e":c[e]=d;break;case"w":c[e]=-d;break;case"n":c[e]=d;break;case"s":c[e]=-d;break;case"u":void 0!==c[e]&&(c.z=d);break;case"d":void 0!==c[e]&&(c.z=-d);break;default:return null}return c}},{}],4:[function(a,b,c){var d=Math.PI/2,e=a("./sign");b.exports=function(a){return Math.abs(a)<d?a:a-e(a)*Math.PI}},{"./sign":21}],5:[function(a,b,c){var d=2*Math.PI,e=3.14159265359,f=a("./sign");b.exports=function(a){return Math.abs(a)<=e?a:a-f(a)*d}},{"./sign":21}],6:[function(a,b,c){b.exports=function(a){return Math.abs(a)>1&&(a=a>1?1:-1),Math.asin(a)}},{}],7:[function(a,b,c){b.exports=function(a){return 1-.25*a*(1+a/16*(3+1.25*a))}},{}],8:[function(a,b,c){b.exports=function(a){return.375*a*(1+.25*a*(1+.46875*a))}},{}],9:[function(a,b,c){b.exports=function(a){return.05859375*a*a*(1+.75*a)}},{}],10:[function(a,b,c){b.exports=function(a){return a*a*a*(35/3072)}},{}],11:[function(a,b,c){b.exports=function(a,b,c){var d=b*c;return a/Math.sqrt(1-d*d)}},{}],12:[function(a,b,c){b.exports=function(a,b,c,d,e){var f,g;f=a/b;for(var h=0;15>h;h++)if(g=(a-(b*f-c*Math.sin(2*f)+d*Math.sin(4*f)-e*Math.sin(6*f)))/(b-2*c*Math.cos(2*f)+4*d*Math.cos(4*f)-6*e*Math.cos(6*f)),f+=g,Math.abs(g)<=1e-10)return f;return NaN}},{}],13:[function(a,b,c){var d=Math.PI/2;b.exports=function(a,b){var c=1-(1-a*a)/(2*a)*Math.log((1-a)/(1+a));if(Math.abs(Math.abs(b)-c)<1e-6)return 0>b?-1*d:d;for(var e,f,g,h,i=Math.asin(.5*b),j=0;30>j;j++)if(f=Math.sin(i),g=Math.cos(i),h=a*f,e=Math.pow(1-h*h,2)/(2*g)*(b/(1-a*a)-f/(1-h*h)+.5/a*Math.log((1-h)/(1+h))),i+=e,Math.abs(e)<=1e-10)return i;return NaN}},{}],14:[function(a,b,c){b.exports=function(a,b,c,d,e){return a*e-b*Math.sin(2*e)+c*Math.sin(4*e)-d*Math.sin(6*e)}},{}],15:[function(a,b,c){b.exports=function(a,b,c){var d=a*b;return c/Math.sqrt(1-d*d)}},{}],16:[function(a,b,c){var d=Math.PI/2;b.exports=function(a,b){for(var c,e,f=.5*a,g=d-2*Math.atan(b),h=0;15>=h;h++)if(c=a*Math.sin(g),e=d-2*Math.atan(b*Math.pow((1-c)/(1+c),f))-g,g+=e,Math.abs(e)<=1e-10)return g;return-9999}},{}],17:[function(a,b,c){var d=1,e=.25,f=.046875,g=.01953125,h=.01068115234375,i=.75,j=.46875,k=.013020833333333334,l=.007120768229166667,m=.3645833333333333,n=.005696614583333333,o=.3076171875;b.exports=function(a){var b=[];b[0]=d-a*(e+a*(f+a*(g+a*h))),b[1]=a*(i-a*(f+a*(g+a*h)));var c=a*a;return b[2]=c*(j-a*(k+a*l)),c*=a,b[3]=c*(m-a*n),b[4]=c*a*o,b}},{}],18:[function(a,b,c){var d=a("./pj_mlfn"),e=1e-10,f=20;b.exports=function(a,b,c){for(var g=1/(1-b),h=a,i=f;i;--i){var j=Math.sin(h),k=1-b*j*j;if(k=(d(h,j,Math.cos(h),c)-a)*(k*Math.sqrt(k))*g,h-=k,Math.abs(k)<e)return h}return h}},{"./pj_mlfn":19}],19:[function(a,b,c){b.exports=function(a,b,c,d){return c*=b,b*=b,d[0]*a-c*(d[1]+b*(d[2]+b*(d[3]+b*d[4])))}},{}],20:[function(a,b,c){b.exports=function(a,b){var c;return a>1e-7?(c=a*b,(1-a*a)*(b/(1-c*c)-.5/a*Math.log((1-c)/(1+c)))):2*b}},{}],21:[function(a,b,c){b.exports=function(a){return 0>a?-1:1}},{}],22:[function(a,b,c){b.exports=function(a,b){return Math.pow((1-a)/(1+a),b)}},{}],23:[function(a,b,c){b.exports=function(a){var b={x:a[0],y:a[1]};return a.length>2&&(b.z=a[2]),a.length>3&&(b.m=a[3]),b}},{}],24:[function(a,b,c){var d=Math.PI/2;b.exports=function(a,b,c){var e=a*c,f=.5*a;return e=Math.pow((1-e)/(1+e),f),Math.tan(.5*(d-b))/e}},{}],25:[function(a,b,c){c.wgs84={towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},c.ch1903={towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},c.ggrs87={towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},c.nad83={towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},c.nad27={nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},c.potsdam={towgs84:"606.0,23.0,413.0",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},c.carthage={towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},c.hermannskogel={towgs84:"653.0,-212.0,449.0",ellipse:"bessel",datumName:"Hermannskogel"},c.ire65={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},c.rassadiran={towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},c.nzgd49={towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},c.osgb36={towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},c.s_jtsk={towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},c.beduaram={towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},c.gunung_segara={towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},c.rnb72={towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"}},{}],26:[function(a,b,c){c.MERIT={a:6378137,rf:298.257,ellipseName:"MERIT 1983"},c.SGS85={a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},c.GRS80={a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},c.IAU76={a:6378140,rf:298.257,ellipseName:"IAU 1976"},c.airy={a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},c.APL4={a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},c.NWL9D={a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},c.mod_airy={a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},c.andrae={a:6377104.43,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},c.aust_SA={a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},c.GRS67={a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},c.bessel={a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},c.bess_nam={a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},c.clrk66={a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},c.clrk80={a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},c.clrk58={a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},c.CPM={a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},c.delmbr={a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},c.engelis={a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},c.evrst30={a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},c.evrst48={a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},c.evrst56={a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},c.evrst69={a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},c.evrstSS={a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},c.fschr60={a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},c.fschr60m={a:6378155,rf:298.3,ellipseName:"Fischer 1960"},c.fschr68={a:6378150,rf:298.3,ellipseName:"Fischer 1968"},c.helmert={a:6378200,rf:298.3,ellipseName:"Helmert 1906"},c.hough={a:6378270,rf:297,ellipseName:"Hough"},c.intl={a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},c.kaula={a:6378163,rf:298.24,ellipseName:"Kaula 1961"},c.lerch={a:6378139,rf:298.257,ellipseName:"Lerch 1979"},c.mprts={a:6397300,rf:191,ellipseName:"Maupertius 1738"},c.new_intl={a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},c.plessis={a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},c.krass={a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},c.SEasia={a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},c.walbeck={a:6376896,b:6355834.8467,ellipseName:"Walbeck"},c.WGS60={a:6378165,rf:298.3,ellipseName:"WGS 60"},c.WGS66={a:6378145,rf:298.25,ellipseName:"WGS 66"},c.WGS7={a:6378135,rf:298.26,ellipseName:"WGS 72"},c.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"},c.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"}},{}],27:[function(a,b,c){c.greenwich=0,c.lisbon=-9.131906111111,c.paris=2.337229166667,c.bogota=-74.080916666667,c.madrid=-3.687938888889,c.rome=12.452333333333,c.bern=7.439583333333,c.jakarta=106.807719444444,c.ferro=-17.666666666667,c.brussels=4.367975,c.stockholm=18.058277777778,c.athens=23.7163375,c.oslo=10.722916666667},{}],28:[function(a,b,c){c.ft={to_meter:.3048},c["us-ft"]={to_meter:1200/3937}},{}],29:[function(a,b,c){function d(a,b,c){var d;return Array.isArray(c)?(d=g(a,b,c),3===c.length?[d.x,d.y,d.z]:[d.x,d.y]):g(a,b,c)}function e(a){return a instanceof f?a:a.oProj?a.oProj:f(a)}function proj4(a,b,c){a=e(a);var f,g=!1;return"undefined"==typeof b?(b=a,a=h,g=!0):("undefined"!=typeof b.x||Array.isArray(b))&&(c=b,b=a,a=h,g=!0),b=e(b),c?d(a,b,c):(f={forward:function(c){return d(a,b,c)},inverse:function(c){return d(b,a,c)}},g&&(f.oProj=b),f)}var f=a("./Proj"),g=a("./transform"),h=f("WGS84");b.exports=proj4},{"./Proj":2,"./transform":66}],30:[function(a,b,c){var d=Math.PI/2,e=1,f=2,g=3,h=4,i=5,j=484813681109536e-20,k=1.0026,l=.3826834323650898,m=function(a){return this instanceof m?(this.datum_type=h,void(a&&(a.datumCode&&"none"===a.datumCode&&(this.datum_type=i),a.datum_params&&(this.datum_params=a.datum_params.map(parseFloat),0===this.datum_params[0]&&0===this.datum_params[1]&&0===this.datum_params[2]||(this.datum_type=e),this.datum_params.length>3&&(0===this.datum_params[3]&&0===this.datum_params[4]&&0===this.datum_params[5]&&0===this.datum_params[6]||(this.datum_type=f,this.datum_params[3]*=j,this.datum_params[4]*=j,this.datum_params[5]*=j,this.datum_params[6]=this.datum_params[6]/1e6+1))),this.datum_type=a.grids?g:this.datum_type,this.a=a.a,this.b=a.b,this.es=a.es,this.ep2=a.ep2,this.datum_type===g&&(this.grids=a.grids)))):new m(a)};m.prototype={compare_datums:function(a){return this.datum_type!==a.datum_type?!1:this.a!==a.a||Math.abs(this.es-a.es)>5e-11?!1:this.datum_type===e?this.datum_params[0]===a.datum_params[0]&&this.datum_params[1]===a.datum_params[1]&&this.datum_params[2]===a.datum_params[2]:this.datum_type===f?this.datum_params[0]===a.datum_params[0]&&this.datum_params[1]===a.datum_params[1]&&this.datum_params[2]===a.datum_params[2]&&this.datum_params[3]===a.datum_params[3]&&this.datum_params[4]===a.datum_params[4]&&this.datum_params[5]===a.datum_params[5]&&this.datum_params[6]===a.datum_params[6]:this.datum_type===g||a.datum_type===g?this.nadgrids===a.nadgrids:!0},geodetic_to_geocentric:function(a){var b,c,e,f,g,h,i,j=a.x,k=a.y,l=a.z?a.z:0,m=0;if(-d>k&&k>-1.001*d)k=-d;else if(k>d&&1.001*d>k)k=d;else if(-d>k||k>d)return null;return j>Math.PI&&(j-=2*Math.PI),g=Math.sin(k),i=Math.cos(k),h=g*g,f=this.a/Math.sqrt(1-this.es*h),b=(f+l)*i*Math.cos(j),c=(f+l)*i*Math.sin(j),e=(f*(1-this.es)+l)*g,a.x=b,a.y=c,a.z=e,m},geocentric_to_geodetic:function(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t=1e-12,u=t*t,v=30,w=a.x,x=a.y,y=a.z?a.z:0;if(o=!1,b=Math.sqrt(w*w+x*x),c=Math.sqrt(w*w+x*x+y*y),b/this.a<t){if(o=!0,q=0,c/this.a<t)return r=d,void(s=-this.b)}else q=Math.atan2(x,w);e=y/c,f=b/c,g=1/Math.sqrt(1-this.es*(2-this.es)*f*f),j=f*(1-this.es)*g,k=e*g,p=0;do p++,i=this.a/Math.sqrt(1-this.es*k*k),s=b*j+y*k-i*(1-this.es*k*k),h=this.es*i/(i+s),g=1/Math.sqrt(1-h*(2-h)*f*f),l=f*(1-h)*g,m=e*g,n=m*j-l*k,j=l,k=m;while(n*n>u&&v>p);return r=Math.atan(m/Math.abs(l)),a.x=q,a.y=r,a.z=s,a},geocentric_to_geodetic_noniter:function(a){var b,c,e,f,g,h,i,j,m,n,o,p,q,r,s,t,u,v=a.x,w=a.y,x=a.z?a.z:0;if(v=parseFloat(v),w=parseFloat(w),x=parseFloat(x),u=!1,0!==v)b=Math.atan2(w,v);else if(w>0)b=d;else if(0>w)b=-d;else if(u=!0,b=0,x>0)c=d;else{if(!(0>x))return c=d,void(e=-this.b);c=-d}return g=v*v+w*w,f=Math.sqrt(g),h=x*k,j=Math.sqrt(h*h+g),n=h/j,p=f/j,o=n*n*n,i=x+this.b*this.ep2*o,t=f-this.a*this.es*p*p*p,m=Math.sqrt(i*i+t*t),q=i/m,r=t/m,s=this.a/Math.sqrt(1-this.es*q*q),e=r>=l?f/r-s:-l>=r?f/-r-s:x/q+s*(this.es-1),u===!1&&(c=Math.atan(q/r)),a.x=b,a.y=c,a.z=e,a},geocentric_to_wgs84:function(a){if(this.datum_type===e)a.x+=this.datum_params[0],a.y+=this.datum_params[1],a.z+=this.datum_params[2];else if(this.datum_type===f){var b=this.datum_params[0],c=this.datum_params[1],d=this.datum_params[2],g=this.datum_params[3],h=this.datum_params[4],i=this.datum_params[5],j=this.datum_params[6],k=j*(a.x-i*a.y+h*a.z)+b,l=j*(i*a.x+a.y-g*a.z)+c,m=j*(-h*a.x+g*a.y+a.z)+d;a.x=k,a.y=l,a.z=m}},geocentric_from_wgs84:function(a){if(this.datum_type===e)a.x-=this.datum_params[0],a.y-=this.datum_params[1],a.z-=this.datum_params[2];else if(this.datum_type===f){var b=this.datum_params[0],c=this.datum_params[1],d=this.datum_params[2],g=this.datum_params[3],h=this.datum_params[4],i=this.datum_params[5],j=this.datum_params[6],k=(a.x-b)/j,l=(a.y-c)/j,m=(a.z-d)/j;a.x=k+i*l-h*m,a.y=-i*k+l+g*m,a.z=h*k-g*l+m}}},b.exports=m},{}],31:[function(a,b,c){var d=1,e=2,f=3,g=5,h=6378137,i=.006694379990141316;b.exports=function(a,b,c){function j(a){return a===d||a===e}var k,l,m;if(a.compare_datums(b))return c;if(a.datum_type===g||b.datum_type===g)return c;var n=a.a,o=a.es,p=b.a,q=b.es,r=a.datum_type;if(r===f)if(0===this.apply_gridshift(a,0,c))a.a=h,a.es=i;else{if(!a.datum_params)return a.a=n,a.es=a.es,c;for(k=1,l=0,m=a.datum_params.length;m>l;l++)k*=a.datum_params[l];if(0===k)return a.a=n,a.es=a.es,c;r=a.datum_params.length>3?e:d}return b.datum_type===f&&(b.a=h,b.es=i),(a.es!==b.es||a.a!==b.a||j(r)||j(b.datum_type))&&(a.geodetic_to_geocentric(c),j(a.datum_type)&&a.geocentric_to_wgs84(c),j(b.datum_type)&&b.geocentric_from_wgs84(c),b.geocentric_to_geodetic(c)),b.datum_type===f&&this.apply_gridshift(b,1,c),a.a=n,a.es=o,b.a=p,b.es=q,c}},{}],32:[function(a,b,c){function d(a){var b=this;if(2===arguments.length){var c=arguments[1];"string"==typeof c?"+"===c.charAt(0)?d[a]=f(arguments[1]):d[a]=g(arguments[1]):d[a]=c}else if(1===arguments.length){if(Array.isArray(a))return a.map(function(a){Array.isArray(a)?d.apply(b,a):d(a)});if("string"==typeof a){if(a in d)return d[a]}else"EPSG"in a?d["EPSG:"+a.EPSG]=a:"ESRI"in a?d["ESRI:"+a.ESRI]=a:"IAU2000"in a?d["IAU2000:"+a.IAU2000]=a:console.log(a);return}}var e=a("./global"),f=a("./projString"),g=a("./wkt");e(d),b.exports=d},{"./global":35,"./projString":38,"./wkt":67}],33:[function(a,b,c){var d=a("./constants/Datum"),e=a("./constants/Ellipsoid"),f=a("./extend"),g=a("./datum"),h=1e-10,i=.16666666666666666,j=.04722222222222222,k=.022156084656084655;b.exports=function(a){if(a.datumCode&&"none"!==a.datumCode){var b=d[a.datumCode];b&&(a.datum_params=b.towgs84?b.towgs84.split(","):null,a.ellps=b.ellipse,a.datumName=b.datumName?b.datumName:a.datumCode)}if(!a.a){var c=e[a.ellps]?e[a.ellps]:e.WGS84;f(a,c)}return a.rf&&!a.b&&(a.b=(1-1/a.rf)*a.a),(0===a.rf||Math.abs(a.a-a.b)<h)&&(a.sphere=!0,a.b=a.a),a.a2=a.a*a.a,a.b2=a.b*a.b,a.es=(a.a2-a.b2)/a.a2,a.e=Math.sqrt(a.es),a.R_A&&(a.a*=1-a.es*(i+a.es*(j+a.es*k)),a.a2=a.a*a.a,a.b2=a.b*a.b,a.es=0),a.ep2=(a.a2-a.b2)/a.b2,a.k0||(a.k0=1),a.axis||(a.axis="enu"),a.datum||(a.datum=g(a)),a}},{"./constants/Datum":25,"./constants/Ellipsoid":26,"./datum":30,"./extend":34}],34:[function(a,b,c){b.exports=function(a,b){a=a||{};var c,d;if(!b)return a;for(d in b)c=b[d],void 0!==c&&(a[d]=c);return a}},{}],35:[function(a,b,c){b.exports=function(a){a("EPSG:4326","+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"),a("EPSG:4269","+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"),a("EPSG:3857","+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"),a.WGS84=a["EPSG:4326"],a["EPSG:3785"]=a["EPSG:3857"],a.GOOGLE=a["EPSG:3857"],a["EPSG:900913"]=a["EPSG:3857"],a["EPSG:102113"]=a["EPSG:3857"]}},{}],36:[function(a,b,c){var proj4=a("./core");proj4.defaultDatum="WGS84",proj4.Proj=a("./Proj"),proj4.WGS84=new proj4.Proj("WGS84"),proj4.Point=a("./Point"),proj4.toPoint=a("./common/toPoint"),proj4.defs=a("./defs"),proj4.transform=a("./transform"),proj4.mgrs=a("mgrs"),proj4.version=a("../package.json").version,a("./includedProjections")(proj4),b.exports=proj4},{"../package.json":69,"./Point":1,"./Proj":2,"./common/toPoint":23,"./core":29,"./defs":32,"./includedProjections":"./includedProjections","./transform":66,mgrs:68}],37:[function(a,b,c){function d(a){return"string"==typeof a}function e(a){return a in i}function f(a){var b=["GEOGCS","GEOCCS","PROJCS","LOCAL_CS"];return b.reduce(function(b,c){return b+1+a.indexOf(c)},0)}function g(a){return"+"===a[0]}function h(a){return d(a)?e(a)?i[a]:f(a)?j(a):g(a)?k(a):void 0:a}var i=a("./defs"),j=a("./wkt"),k=a("./projString");b.exports=h},{"./defs":32,"./projString":38,"./wkt":67}],38:[function(a,b,c){var d=.017453292519943295,e=a("./constants/PrimeMeridian"),f=a("./constants/units");b.exports=function(a){var b={},c={};a.split("+").map(function(a){return a.trim()}).filter(function(a){return a}).forEach(function(a){var b=a.split("=");b.push(!0),c[b[0].toLowerCase()]=b[1]});var g,h,i,j={proj:"projName",datum:"datumCode",rf:function(a){b.rf=parseFloat(a)},lat_0:function(a){b.lat0=a*d},lat_1:function(a){b.lat1=a*d},lat_2:function(a){b.lat2=a*d},lat_ts:function(a){b.lat_ts=a*d},lon_0:function(a){b.long0=a*d},lon_1:function(a){b.long1=a*d},lon_2:function(a){b.long2=a*d},alpha:function(a){b.alpha=parseFloat(a)*d},lonc:function(a){b.longc=a*d},x_0:function(a){b.x0=parseFloat(a)},y_0:function(a){b.y0=parseFloat(a)},k_0:function(a){b.k0=parseFloat(a)},k:function(a){b.k0=parseFloat(a)},a:function(a){b.a=parseFloat(a)},b:function(a){b.b=parseFloat(a)},r_a:function(){b.R_A=!0},zone:function(a){b.zone=parseInt(a,10)},south:function(){b.utmSouth=!0},towgs84:function(a){b.datum_params=a.split(",").map(function(a){return parseFloat(a)})},to_meter:function(a){b.to_meter=parseFloat(a)},units:function(a){b.units=a,f[a]&&(b.to_meter=f[a].to_meter)},from_greenwich:function(a){b.from_greenwich=a*d},pm:function(a){b.from_greenwich=(e[a]?e[a]:parseFloat(a))*d},nadgrids:function(a){"@null"===a?b.datumCode="none":b.nadgrids=a},axis:function(a){var c="ewnsud";3===a.length&&-1!==c.indexOf(a.substr(0,1))&&-1!==c.indexOf(a.substr(1,1))&&-1!==c.indexOf(a.substr(2,1))&&(b.axis=a)}};for(g in c)h=c[g],g in j?(i=j[g],"function"==typeof i?i(h):b[i]=h):b[g]=h;return"string"==typeof b.datumCode&&"WGS84"!==b.datumCode&&(b.datumCode=b.datumCode.toLowerCase()),b}},{"./constants/PrimeMeridian":27,"./constants/units":28}],39:[function(a,b,c){function d(a,b){var c=g.length;return a.names?(g[c]=a,a.names.forEach(function(a){f[a.toLowerCase()]=c}),this):(console.log(b),!0)}var e=[a("./projections/merc"),a("./projections/longlat")],f={},g=[];c.add=d,c.get=function(a){if(!a)return!1;var b=a.toLowerCase();return"undefined"!=typeof f[b]&&g[f[b]]?g[f[b]]:void 0},c.start=function(){e.forEach(d)}},{"./projections/longlat":51,"./projections/merc":52}],40:[function(a,b,c){var d=1e-10,e=a("../common/msfnz"),f=a("../common/qsfnz"),g=a("../common/adjust_lon"),h=a("../common/asinz");c.init=function(){Math.abs(this.lat1+this.lat2)<d||(this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e3=Math.sqrt(this.es),this.sin_po=Math.sin(this.lat1),this.cos_po=Math.cos(this.lat1),this.t1=this.sin_po,this.con=this.sin_po,this.ms1=e(this.e3,this.sin_po,this.cos_po),this.qs1=f(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat2),this.cos_po=Math.cos(this.lat2),this.t2=this.sin_po,this.ms2=e(this.e3,this.sin_po,this.cos_po),this.qs2=f(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat0),this.cos_po=Math.cos(this.lat0),this.t3=this.sin_po,this.qs0=f(this.e3,this.sin_po,this.cos_po),Math.abs(this.lat1-this.lat2)>d?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},c.forward=function(a){var b=a.x,c=a.y;this.sin_phi=Math.sin(c),this.cos_phi=Math.cos(c);var d=f(this.e3,this.sin_phi,this.cos_phi),e=this.a*Math.sqrt(this.c-this.ns0*d)/this.ns0,h=this.ns0*g(b-this.long0),i=e*Math.sin(h)+this.x0,j=this.rh-e*Math.cos(h)+this.y0;return a.x=i,a.y=j,a},c.inverse=function(a){var b,c,d,e,f,h;return a.x-=this.x0,a.y=this.rh-a.y+this.y0,this.ns0>=0?(b=Math.sqrt(a.x*a.x+a.y*a.y),d=1):(b=-Math.sqrt(a.x*a.x+a.y*a.y),d=-1),e=0,0!==b&&(e=Math.atan2(d*a.x,d*a.y)),d=b*this.ns0/this.a,this.sphere?h=Math.asin((this.c-d*d)/(2*this.ns0)):(c=(this.c-d*d)/this.ns0,h=this.phi1z(this.e3,c)),f=g(e/this.ns0+this.long0),a.x=f,a.y=h,a},c.phi1z=function(a,b){var c,e,f,g,i,j=h(.5*b);if(d>a)return j;for(var k=a*a,l=1;25>=l;l++)if(c=Math.sin(j),e=Math.cos(j),f=a*c,g=1-f*f,i=.5*g*g/e*(b/(1-k)-c/g+.5/a*Math.log((1-f)/(1+f))),j+=i,Math.abs(i)<=1e-7)return j;return null},c.names=["Albers_Conic_Equal_Area","Albers","aea"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/msfnz":15,"../common/qsfnz":20}],41:[function(a,b,c){var d=a("../common/adjust_lon"),e=Math.PI/2,f=1e-10,g=a("../common/mlfn"),h=a("../common/e0fn"),i=a("../common/e1fn"),j=a("../common/e2fn"),k=a("../common/e3fn"),l=a("../common/gN"),m=a("../common/asinz"),n=a("../common/imlfn");c.init=function(){this.sin_p12=Math.sin(this.lat0),this.cos_p12=Math.cos(this.lat0)},c.forward=function(a){var b,c,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H=a.x,I=a.y,J=Math.sin(a.y),K=Math.cos(a.y),L=d(H-this.long0);return this.sphere?Math.abs(this.sin_p12-1)<=f?(a.x=this.x0+this.a*(e-I)*Math.sin(L),a.y=this.y0-this.a*(e-I)*Math.cos(L),a):Math.abs(this.sin_p12+1)<=f?(a.x=this.x0+this.a*(e+I)*Math.sin(L),a.y=this.y0+this.a*(e+I)*Math.cos(L),a):(B=this.sin_p12*J+this.cos_p12*K*Math.cos(L),z=Math.acos(B),A=z/Math.sin(z),a.x=this.x0+this.a*A*K*Math.sin(L),a.y=this.y0+this.a*A*(this.cos_p12*J-this.sin_p12*K*Math.cos(L)),a):(b=h(this.es),c=i(this.es),m=j(this.es),n=k(this.es),Math.abs(this.sin_p12-1)<=f?(o=this.a*g(b,c,m,n,e),p=this.a*g(b,c,m,n,I),a.x=this.x0+(o-p)*Math.sin(L),a.y=this.y0-(o-p)*Math.cos(L),a):Math.abs(this.sin_p12+1)<=f?(o=this.a*g(b,c,m,n,e),p=this.a*g(b,c,m,n,I),a.x=this.x0+(o+p)*Math.sin(L),a.y=this.y0+(o+p)*Math.cos(L),a):(q=J/K,r=l(this.a,this.e,this.sin_p12),s=l(this.a,this.e,J),t=Math.atan((1-this.es)*q+this.es*r*this.sin_p12/(s*K)),u=Math.atan2(Math.sin(L),this.cos_p12*Math.tan(t)-this.sin_p12*Math.cos(L)),C=0===u?Math.asin(this.cos_p12*Math.sin(t)-this.sin_p12*Math.cos(t)):Math.abs(Math.abs(u)-Math.PI)<=f?-Math.asin(this.cos_p12*Math.sin(t)-this.sin_p12*Math.cos(t)):Math.asin(Math.sin(L)*Math.cos(t)/Math.sin(u)),v=this.e*this.sin_p12/Math.sqrt(1-this.es),w=this.e*this.cos_p12*Math.cos(u)/Math.sqrt(1-this.es),x=v*w,y=w*w,D=C*C,E=D*C,F=E*C,G=F*C,z=r*C*(1-D*y*(1-y)/6+E/8*x*(1-2*y)+F/120*(y*(4-7*y)-3*v*v*(1-7*y))-G/48*x),a.x=this.x0+z*Math.sin(u),a.y=this.y0+z*Math.cos(u),a))},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I;if(this.sphere){if(b=Math.sqrt(a.x*a.x+a.y*a.y),b>2*e*this.a)return;return c=b/this.a,o=Math.sin(c),p=Math.cos(c),q=this.long0,Math.abs(b)<=f?r=this.lat0:(r=m(p*this.sin_p12+a.y*o*this.cos_p12/b),s=Math.abs(this.lat0)-e,q=d(Math.abs(s)<=f?this.lat0>=0?this.long0+Math.atan2(a.x,-a.y):this.long0-Math.atan2(-a.x,a.y):this.long0+Math.atan2(a.x*o,b*this.cos_p12*p-a.y*this.sin_p12*o))),a.x=q,a.y=r,a}return t=h(this.es),u=i(this.es),v=j(this.es),w=k(this.es),Math.abs(this.sin_p12-1)<=f?(x=this.a*g(t,u,v,w,e),b=Math.sqrt(a.x*a.x+a.y*a.y),y=x-b,r=n(y/this.a,t,u,v,w),q=d(this.long0+Math.atan2(a.x,-1*a.y)),a.x=q,a.y=r,a):Math.abs(this.sin_p12+1)<=f?(x=this.a*g(t,u,v,w,e),b=Math.sqrt(a.x*a.x+a.y*a.y),y=b-x,r=n(y/this.a,t,u,v,w),q=d(this.long0+Math.atan2(a.x,a.y)),a.x=q,a.y=r,a):(b=Math.sqrt(a.x*a.x+a.y*a.y),B=Math.atan2(a.x,a.y),z=l(this.a,this.e,this.sin_p12),C=Math.cos(B),D=this.e*this.cos_p12*C,E=-D*D/(1-this.es),F=3*this.es*(1-E)*this.sin_p12*this.cos_p12*C/(1-this.es),G=b/z,H=G-E*(1+E)*Math.pow(G,3)/6-F*(1+3*E)*Math.pow(G,4)/24,I=1-E*H*H/2-G*H*H*H/6,A=Math.asin(this.sin_p12*Math.cos(H)+this.cos_p12*Math.sin(H)*C),q=d(this.long0+Math.asin(Math.sin(B)*Math.sin(H)/Math.cos(A))),r=Math.atan((1-this.es*I*this.sin_p12/Math.sin(A))*Math.tan(A)/(1-this.es)),a.x=q,a.y=r,a)},c.names=["Azimuthal_Equidistant","aeqd"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/imlfn":12,"../common/mlfn":14}],42:[function(a,b,c){var d=a("../common/mlfn"),e=a("../common/e0fn"),f=a("../common/e1fn"),g=a("../common/e2fn"),h=a("../common/e3fn"),i=a("../common/gN"),j=a("../common/adjust_lon"),k=a("../common/adjust_lat"),l=a("../common/imlfn"),m=Math.PI/2,n=1e-10;c.init=function(){this.sphere||(this.e0=e(this.es),this.e1=f(this.es),this.e2=g(this.es),this.e3=h(this.es),this.ml0=this.a*d(this.e0,this.e1,this.e2,this.e3,this.lat0))},c.forward=function(a){var b,c,e=a.x,f=a.y;if(e=j(e-this.long0),this.sphere)b=this.a*Math.asin(Math.cos(f)*Math.sin(e)),c=this.a*(Math.atan2(Math.tan(f),Math.cos(e))-this.lat0);else{var g=Math.sin(f),h=Math.cos(f),k=i(this.a,this.e,g),l=Math.tan(f)*Math.tan(f),m=e*Math.cos(f),n=m*m,o=this.es*h*h/(1-this.es),p=this.a*d(this.e0,this.e1,this.e2,this.e3,f);b=k*m*(1-n*l*(1/6-(8-l+8*o)*n/120)),c=p-this.ml0+k*g/h*n*(.5+(5-l+6*o)*n/24)}return a.x=b+this.x0,a.y=c+this.y0,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,d=a.x/this.a,e=a.y/this.a;if(this.sphere){var f=e+this.lat0;b=Math.asin(Math.sin(f)*Math.cos(d)),c=Math.atan2(Math.tan(d),Math.cos(f))}else{var g=this.ml0/this.a+e,h=l(g,this.e0,this.e1,this.e2,this.e3);if(Math.abs(Math.abs(h)-m)<=n)return a.x=this.long0,a.y=m,0>e&&(a.y*=-1),a;var o=i(this.a,this.e,Math.sin(h)),p=o*o*o/this.a/this.a*(1-this.es),q=Math.pow(Math.tan(h),2),r=d*this.a/o,s=r*r;b=h-o*Math.tan(h)/p*r*r*(.5-(1+3*q)*r*r/24),c=r*(1-s*(q/3+(1+3*q)*q*s/15))/Math.cos(h)}return a.x=j(c+this.long0),a.y=k(b),a},c.names=["Cassini","Cassini_Soldner","cass"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/imlfn":12,"../common/mlfn":14}],43:[function(a,b,c){var d=a("../common/adjust_lon"),e=a("../common/qsfnz"),f=a("../common/msfnz"),g=a("../common/iqsfnz");c.init=function(){this.sphere||(this.k0=f(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},c.forward=function(a){var b,c,f=a.x,g=a.y,h=d(f-this.long0);if(this.sphere)b=this.x0+this.a*h*Math.cos(this.lat_ts),c=this.y0+this.a*Math.sin(g)/Math.cos(this.lat_ts);else{var i=e(this.e,Math.sin(g));b=this.x0+this.a*this.k0*h,c=this.y0+this.a*i*.5/this.k0}return a.x=b,a.y=c,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c;return this.sphere?(b=d(this.long0+a.x/this.a/Math.cos(this.lat_ts)),c=Math.asin(a.y/this.a*Math.cos(this.lat_ts))):(c=g(this.e,2*a.y*this.k0/this.a),b=d(this.long0+a.x/(this.a*this.k0))),a.x=b,a.y=c,a},c.names=["cea"]},{"../common/adjust_lon":5,"../common/iqsfnz":13,"../common/msfnz":15,"../common/qsfnz":20}],44:[function(a,b,c){var d=a("../common/adjust_lon"),e=a("../common/adjust_lat");c.init=function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},c.forward=function(a){var b=a.x,c=a.y,f=d(b-this.long0),g=e(c-this.lat0);return a.x=this.x0+this.a*f*this.rc,a.y=this.y0+this.a*g,a},c.inverse=function(a){var b=a.x,c=a.y;return a.x=d(this.long0+(b-this.x0)/(this.a*this.rc)),a.y=e(this.lat0+(c-this.y0)/this.a),a},c.names=["Equirectangular","Equidistant_Cylindrical","eqc"]},{"../common/adjust_lat":4,"../common/adjust_lon":5}],45:[function(a,b,c){var d=a("../common/e0fn"),e=a("../common/e1fn"),f=a("../common/e2fn"),g=a("../common/e3fn"),h=a("../common/msfnz"),i=a("../common/mlfn"),j=a("../common/adjust_lon"),k=a("../common/adjust_lat"),l=a("../common/imlfn"),m=1e-10;c.init=function(){Math.abs(this.lat1+this.lat2)<m||(this.lat2=this.lat2||this.lat1,this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=d(this.es),this.e1=e(this.es),this.e2=f(this.es),this.e3=g(this.es),this.sinphi=Math.sin(this.lat1),this.cosphi=Math.cos(this.lat1),this.ms1=h(this.e,this.sinphi,this.cosphi),this.ml1=i(this.e0,this.e1,this.e2,this.e3,this.lat1),Math.abs(this.lat1-this.lat2)<m?this.ns=this.sinphi:(this.sinphi=Math.sin(this.lat2),this.cosphi=Math.cos(this.lat2),this.ms2=h(this.e,this.sinphi,this.cosphi),this.ml2=i(this.e0,this.e1,this.e2,this.e3,this.lat2),this.ns=(this.ms1-this.ms2)/(this.ml2-this.ml1)),this.g=this.ml1+this.ms1/this.ns,this.ml0=i(this.e0,this.e1,this.e2,this.e3,this.lat0),this.rh=this.a*(this.g-this.ml0))},c.forward=function(a){var b,c=a.x,d=a.y;if(this.sphere)b=this.a*(this.g-d);else{var e=i(this.e0,this.e1,this.e2,this.e3,d);b=this.a*(this.g-e)}var f=this.ns*j(c-this.long0),g=this.x0+b*Math.sin(f),h=this.y0+this.rh-b*Math.cos(f);return a.x=g,a.y=h,a},c.inverse=function(a){a.x-=this.x0,a.y=this.rh-a.y+this.y0;var b,c,d,e;this.ns>=0?(c=Math.sqrt(a.x*a.x+a.y*a.y),
-b=1):(c=-Math.sqrt(a.x*a.x+a.y*a.y),b=-1);var f=0;if(0!==c&&(f=Math.atan2(b*a.x,b*a.y)),this.sphere)return e=j(this.long0+f/this.ns),d=k(this.g-c/this.a),a.x=e,a.y=d,a;var g=this.g-c/this.a;return d=l(g,this.e0,this.e1,this.e2,this.e3),e=j(this.long0+f/this.ns),a.x=e,a.y=d,a},c.names=["Equidistant_Conic","eqdc"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/imlfn":12,"../common/mlfn":14,"../common/msfnz":15}],46:[function(a,b,c){var d=Math.PI/4,e=a("../common/srat"),f=Math.PI/2,g=20;c.init=function(){var a=Math.sin(this.lat0),b=Math.cos(this.lat0);b*=b,this.rc=Math.sqrt(1-this.es)/(1-this.es*a*a),this.C=Math.sqrt(1+this.es*b*b/(1-this.es)),this.phic0=Math.asin(a/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+d)/(Math.pow(Math.tan(.5*this.lat0+d),this.C)*e(this.e*a,this.ratexp))},c.forward=function(a){var b=a.x,c=a.y;return a.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*c+d),this.C)*e(this.e*Math.sin(c),this.ratexp))-f,a.x=this.C*b,a},c.inverse=function(a){for(var b=1e-14,c=a.x/this.C,h=a.y,i=Math.pow(Math.tan(.5*h+d)/this.K,1/this.C),j=g;j>0&&(h=2*Math.atan(i*e(this.e*Math.sin(a.y),-.5*this.e))-f,!(Math.abs(h-a.y)<b));--j)a.y=h;return j?(a.x=c,a.y=h,a):null},c.names=["gauss"]},{"../common/srat":22}],47:[function(a,b,c){var d=a("../common/adjust_lon"),e=1e-10,f=a("../common/asinz");c.init=function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0),this.infinity_dist=1e3*this.a,this.rc=1},c.forward=function(a){var b,c,f,g,h,i,j,k,l=a.x,m=a.y;return f=d(l-this.long0),b=Math.sin(m),c=Math.cos(m),g=Math.cos(f),i=this.sin_p14*b+this.cos_p14*c*g,h=1,i>0||Math.abs(i)<=e?(j=this.x0+this.a*h*c*Math.sin(f)/i,k=this.y0+this.a*h*(this.cos_p14*b-this.sin_p14*c*g)/i):(j=this.x0+this.infinity_dist*c*Math.sin(f),k=this.y0+this.infinity_dist*(this.cos_p14*b-this.sin_p14*c*g)),a.x=j,a.y=k,a},c.inverse=function(a){var b,c,e,g,h,i;return a.x=(a.x-this.x0)/this.a,a.y=(a.y-this.y0)/this.a,a.x/=this.k0,a.y/=this.k0,(b=Math.sqrt(a.x*a.x+a.y*a.y))?(g=Math.atan2(b,this.rc),c=Math.sin(g),e=Math.cos(g),i=f(e*this.sin_p14+a.y*c*this.cos_p14/b),h=Math.atan2(a.x*c,b*this.cos_p14*e-a.y*this.sin_p14*c),h=d(this.long0+h)):(i=this.phic0,h=0),a.x=h,a.y=i,a},c.names=["gnom"]},{"../common/adjust_lon":5,"../common/asinz":6}],48:[function(a,b,c){var d=a("../common/adjust_lon");c.init=function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},c.forward=function(a){var b,c,e,f,g,h,i,j=a.x,k=a.y,l=d(j-this.long0);return b=Math.pow((1+this.e*Math.sin(k))/(1-this.e*Math.sin(k)),this.alfa*this.e/2),c=2*(Math.atan(this.k*Math.pow(Math.tan(k/2+this.s45),this.alfa)/b)-this.s45),e=-l*this.alfa,f=Math.asin(Math.cos(this.ad)*Math.sin(c)+Math.sin(this.ad)*Math.cos(c)*Math.cos(e)),g=Math.asin(Math.cos(c)*Math.sin(e)/Math.cos(f)),h=this.n*g,i=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(f/2+this.s45),this.n),a.y=i*Math.cos(h)/1,a.x=i*Math.sin(h)/1,this.czech||(a.y*=-1,a.x*=-1),a},c.inverse=function(a){var b,c,d,e,f,g,h,i,j=a.x;a.x=a.y,a.y=j,this.czech||(a.y*=-1,a.x*=-1),g=Math.sqrt(a.x*a.x+a.y*a.y),f=Math.atan2(a.y,a.x),e=f/Math.sin(this.s0),d=2*(Math.atan(Math.pow(this.ro0/g,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),b=Math.asin(Math.cos(this.ad)*Math.sin(d)-Math.sin(this.ad)*Math.cos(d)*Math.cos(e)),c=Math.asin(Math.cos(d)*Math.sin(e)/Math.cos(b)),a.x=this.long0-c/this.alfa,h=b,i=0;var k=0;do a.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(b/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(h))/(1-this.e*Math.sin(h)),this.e/2))-this.s45),Math.abs(h-a.y)<1e-10&&(i=1),h=a.y,k+=1;while(0===i&&15>k);return k>=15?null:a},c.names=["Krovak","krovak"]},{"../common/adjust_lon":5}],49:[function(a,b,c){var d=Math.PI/2,e=Math.PI/4,f=1e-10,g=a("../common/qsfnz"),h=a("../common/adjust_lon");c.S_POLE=1,c.N_POLE=2,c.EQUIT=3,c.OBLIQ=4,c.init=function(){var a=Math.abs(this.lat0);if(Math.abs(a-d)<f?this.mode=this.lat0<0?this.S_POLE:this.N_POLE:Math.abs(a)<f?this.mode=this.EQUIT:this.mode=this.OBLIQ,this.es>0){var b;switch(this.qp=g(this.e,1),this.mmf=.5/(1-this.es),this.apa=this.authset(this.es),this.mode){case this.N_POLE:this.dd=1;break;case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),b=Math.sin(this.lat0),this.sinb1=g(this.e,b)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*b*b)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},c.forward=function(a){var b,c,i,j,k,l,m,n,o,p,q=a.x,r=a.y;if(q=h(q-this.long0),this.sphere){if(k=Math.sin(r),p=Math.cos(r),i=Math.cos(q),this.mode===this.OBLIQ||this.mode===this.EQUIT){if(c=this.mode===this.EQUIT?1+p*i:1+this.sinph0*k+this.cosph0*p*i,f>=c)return null;c=Math.sqrt(2/c),b=c*p*Math.sin(q),c*=this.mode===this.EQUIT?k:this.cosph0*k-this.sinph0*p*i}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(i=-i),Math.abs(r+this.phi0)<f)return null;c=e-.5*r,c=2*(this.mode===this.S_POLE?Math.cos(c):Math.sin(c)),b=c*Math.sin(q),c*=i}}else{switch(m=0,n=0,o=0,i=Math.cos(q),j=Math.sin(q),k=Math.sin(r),l=g(this.e,k),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(m=l/this.qp,n=Math.sqrt(1-m*m)),this.mode){case this.OBLIQ:o=1+this.sinb1*m+this.cosb1*n*i;break;case this.EQUIT:o=1+n*i;break;case this.N_POLE:o=d+r,l=this.qp-l;break;case this.S_POLE:o=r-d,l=this.qp+l}if(Math.abs(o)<f)return null;switch(this.mode){case this.OBLIQ:case this.EQUIT:o=Math.sqrt(2/o),c=this.mode===this.OBLIQ?this.ymf*o*(this.cosb1*m-this.sinb1*n*i):(o=Math.sqrt(2/(1+n*i)))*m*this.ymf,b=this.xmf*o*n*j;break;case this.N_POLE:case this.S_POLE:l>=0?(b=(o=Math.sqrt(l))*j,c=i*(this.mode===this.S_POLE?o:-o)):b=c=0}}return a.x=this.a*b+this.x0,a.y=this.a*c+this.y0,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,e,g,i,j,k,l=a.x/this.a,m=a.y/this.a;if(this.sphere){var n,o=0,p=0;if(n=Math.sqrt(l*l+m*m),c=.5*n,c>1)return null;switch(c=2*Math.asin(c),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(p=Math.sin(c),o=Math.cos(c)),this.mode){case this.EQUIT:c=Math.abs(n)<=f?0:Math.asin(m*p/n),l*=p,m=o*n;break;case this.OBLIQ:c=Math.abs(n)<=f?this.phi0:Math.asin(o*this.sinph0+m*p*this.cosph0/n),l*=p*this.cosph0,m=(o-Math.sin(c)*this.sinph0)*n;break;case this.N_POLE:m=-m,c=d-c;break;case this.S_POLE:c-=d}b=0!==m||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(l,m):0}else{if(k=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(l/=this.dd,m*=this.dd,j=Math.sqrt(l*l+m*m),f>j)return a.x=0,a.y=this.phi0,a;g=2*Math.asin(.5*j/this.rq),e=Math.cos(g),l*=g=Math.sin(g),this.mode===this.OBLIQ?(k=e*this.sinb1+m*g*this.cosb1/j,i=this.qp*k,m=j*this.cosb1*e-m*this.sinb1*g):(k=m*g/j,i=this.qp*k,m=j*e)}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(m=-m),i=l*l+m*m,!i)return a.x=0,a.y=this.phi0,a;k=1-i/this.qp,this.mode===this.S_POLE&&(k=-k)}b=Math.atan2(l,m),c=this.authlat(Math.asin(k),this.apa)}return a.x=h(this.long0+b),a.y=c,a},c.P00=.3333333333333333,c.P01=.17222222222222222,c.P02=.10257936507936508,c.P10=.06388888888888888,c.P11=.0664021164021164,c.P20=.016415012942191543,c.authset=function(a){var b,c=[];return c[0]=a*this.P00,b=a*a,c[0]+=b*this.P01,c[1]=b*this.P10,b*=a,c[0]+=b*this.P02,c[1]+=b*this.P11,c[2]=b*this.P20,c},c.authlat=function(a,b){var c=a+a;return a+b[0]*Math.sin(c)+b[1]*Math.sin(c+c)+b[2]*Math.sin(c+c+c)},c.names=["Lambert Azimuthal Equal Area","Lambert_Azimuthal_Equal_Area","laea"]},{"../common/adjust_lon":5,"../common/qsfnz":20}],50:[function(a,b,c){var d=1e-10,e=a("../common/msfnz"),f=a("../common/tsfnz"),g=Math.PI/2,h=a("../common/sign"),i=a("../common/adjust_lon"),j=a("../common/phi2z");c.init=function(){if(this.lat2||(this.lat2=this.lat1),this.k0||(this.k0=1),this.x0=this.x0||0,this.y0=this.y0||0,!(Math.abs(this.lat1+this.lat2)<d)){var a=this.b/this.a;this.e=Math.sqrt(1-a*a);var b=Math.sin(this.lat1),c=Math.cos(this.lat1),g=e(this.e,b,c),h=f(this.e,this.lat1,b),i=Math.sin(this.lat2),j=Math.cos(this.lat2),k=e(this.e,i,j),l=f(this.e,this.lat2,i),m=f(this.e,this.lat0,Math.sin(this.lat0));Math.abs(this.lat1-this.lat2)>d?this.ns=Math.log(g/k)/Math.log(h/l):this.ns=b,isNaN(this.ns)&&(this.ns=b),this.f0=g/(this.ns*Math.pow(h,this.ns)),this.rh=this.a*this.f0*Math.pow(m,this.ns),this.title||(this.title="Lambert Conformal Conic")}},c.forward=function(a){var b=a.x,c=a.y;Math.abs(2*Math.abs(c)-Math.PI)<=d&&(c=h(c)*(g-2*d));var e,j,k=Math.abs(Math.abs(c)-g);if(k>d)e=f(this.e,c,Math.sin(c)),j=this.a*this.f0*Math.pow(e,this.ns);else{if(k=c*this.ns,0>=k)return null;j=0}var l=this.ns*i(b-this.long0);return a.x=this.k0*(j*Math.sin(l))+this.x0,a.y=this.k0*(this.rh-j*Math.cos(l))+this.y0,a},c.inverse=function(a){var b,c,d,e,f,h=(a.x-this.x0)/this.k0,k=this.rh-(a.y-this.y0)/this.k0;this.ns>0?(b=Math.sqrt(h*h+k*k),c=1):(b=-Math.sqrt(h*h+k*k),c=-1);var l=0;if(0!==b&&(l=Math.atan2(c*h,c*k)),0!==b||this.ns>0){if(c=1/this.ns,d=Math.pow(b/(this.a*this.f0),c),e=j(this.e,d),-9999===e)return null}else e=-g;return f=i(l/this.ns+this.long0),a.x=f,a.y=e,a},c.names=["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_2SP","lcc"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/sign":21,"../common/tsfnz":24}],51:[function(a,b,c){function d(a){return a}c.init=function(){},c.forward=d,c.inverse=d,c.names=["longlat","identity"]},{}],52:[function(a,b,c){var d=a("../common/msfnz"),e=Math.PI/2,f=1e-10,g=57.29577951308232,h=a("../common/adjust_lon"),i=Math.PI/4,j=a("../common/tsfnz"),k=a("../common/phi2z");c.init=function(){var a=this.b/this.a;this.es=1-a*a,"x0"in this||(this.x0=0),"y0"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.sphere?this.k0=Math.cos(this.lat_ts):this.k0=d(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k?this.k0=this.k:this.k0=1)},c.forward=function(a){var b=a.x,c=a.y;if(c*g>90&&-90>c*g&&b*g>180&&-180>b*g)return null;var d,k;if(Math.abs(Math.abs(c)-e)<=f)return null;if(this.sphere)d=this.x0+this.a*this.k0*h(b-this.long0),k=this.y0+this.a*this.k0*Math.log(Math.tan(i+.5*c));else{var l=Math.sin(c),m=j(this.e,c,l);d=this.x0+this.a*this.k0*h(b-this.long0),k=this.y0-this.a*this.k0*Math.log(m)}return a.x=d,a.y=k,a},c.inverse=function(a){var b,c,d=a.x-this.x0,f=a.y-this.y0;if(this.sphere)c=e-2*Math.atan(Math.exp(-f/(this.a*this.k0)));else{var g=Math.exp(-f/(this.a*this.k0));if(c=k(this.e,g),-9999===c)return null}return b=h(this.long0+d/(this.a*this.k0)),a.x=b,a.y=c,a},c.names=["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/tsfnz":24}],53:[function(a,b,c){var d=a("../common/adjust_lon");c.init=function(){},c.forward=function(a){var b=a.x,c=a.y,e=d(b-this.long0),f=this.x0+this.a*e,g=this.y0+this.a*Math.log(Math.tan(Math.PI/4+c/2.5))*1.25;return a.x=f,a.y=g,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b=d(this.long0+a.x/this.a),c=2.5*(Math.atan(Math.exp(.8*a.y/this.a))-Math.PI/4);return a.x=b,a.y=c,a},c.names=["Miller_Cylindrical","mill"]},{"../common/adjust_lon":5}],54:[function(a,b,c){var d=a("../common/adjust_lon"),e=1e-10;c.init=function(){},c.forward=function(a){for(var b=a.x,c=a.y,f=d(b-this.long0),g=c,h=Math.PI*Math.sin(c),i=0;!0;i++){var j=-(g+Math.sin(g)-h)/(1+Math.cos(g));if(g+=j,Math.abs(j)<e)break}g/=2,Math.PI/2-Math.abs(c)<e&&(f=0);var k=.900316316158*this.a*f*Math.cos(g)+this.x0,l=1.4142135623731*this.a*Math.sin(g)+this.y0;return a.x=k,a.y=l,a},c.inverse=function(a){var b,c;a.x-=this.x0,a.y-=this.y0,c=a.y/(1.4142135623731*this.a),Math.abs(c)>.999999999999&&(c=.999999999999),b=Math.asin(c);var e=d(this.long0+a.x/(.900316316158*this.a*Math.cos(b)));e<-Math.PI&&(e=-Math.PI),e>Math.PI&&(e=Math.PI),c=(2*b+Math.sin(2*b))/Math.PI,Math.abs(c)>1&&(c=1);var f=Math.asin(c);return a.x=e,a.y=f,a},c.names=["Mollweide","moll"]},{"../common/adjust_lon":5}],55:[function(a,b,c){var d=484813681109536e-20;c.iterations=1,c.init=function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},c.forward=function(a){var b,c=a.x,e=a.y,f=e-this.lat0,g=c-this.long0,h=f/d*1e-5,i=g,j=1,k=0;for(b=1;10>=b;b++)j*=h,k+=this.A[b]*j;var l,m,n=k,o=i,p=1,q=0,r=0,s=0;for(b=1;6>=b;b++)l=p*n-q*o,m=q*n+p*o,p=l,q=m,r=r+this.B_re[b]*p-this.B_im[b]*q,s=s+this.B_im[b]*p+this.B_re[b]*q;return a.x=s*this.a+this.x0,a.y=r*this.a+this.y0,a},c.inverse=function(a){var b,c,e,f=a.x,g=a.y,h=f-this.x0,i=g-this.y0,j=i/this.a,k=h/this.a,l=1,m=0,n=0,o=0;for(b=1;6>=b;b++)c=l*j-m*k,e=m*j+l*k,l=c,m=e,n=n+this.C_re[b]*l-this.C_im[b]*m,o=o+this.C_im[b]*l+this.C_re[b]*m;for(var p=0;p<this.iterations;p++){var q,r,s=n,t=o,u=j,v=k;for(b=2;6>=b;b++)q=s*n-t*o,r=t*n+s*o,s=q,t=r,u+=(b-1)*(this.B_re[b]*s-this.B_im[b]*t),v+=(b-1)*(this.B_im[b]*s+this.B_re[b]*t);s=1,t=0;var w=this.B_re[1],x=this.B_im[1];for(b=2;6>=b;b++)q=s*n-t*o,r=t*n+s*o,s=q,t=r,w+=b*(this.B_re[b]*s-this.B_im[b]*t),x+=b*(this.B_im[b]*s+this.B_re[b]*t);var y=w*w+x*x;n=(u*w+v*x)/y,o=(v*w-u*x)/y}var z=n,A=o,B=1,C=0;for(b=1;9>=b;b++)B*=z,C+=this.D[b]*B;var D=this.lat0+C*d*1e5,E=this.long0+A;return a.x=E,a.y=D,a},c.names=["New_Zealand_Map_Grid","nzmg"]},{}],56:[function(a,b,c){var d=a("../common/tsfnz"),e=a("../common/adjust_lon"),f=a("../common/phi2z"),g=Math.PI/2,h=Math.PI/4,i=1e-10;c.init=function(){this.no_off=this.no_off||!1,this.no_rot=this.no_rot||!1,isNaN(this.k0)&&(this.k0=1);var a=Math.sin(this.lat0),b=Math.cos(this.lat0),c=this.e*a;this.bl=Math.sqrt(1+this.es/(1-this.es)*Math.pow(b,4)),this.al=this.a*this.bl*this.k0*Math.sqrt(1-this.es)/(1-c*c);var f=d(this.e,this.lat0,a),g=this.bl/b*Math.sqrt((1-this.es)/(1-c*c));1>g*g&&(g=1);var h,i;if(isNaN(this.longc)){var j=d(this.e,this.lat1,Math.sin(this.lat1)),k=d(this.e,this.lat2,Math.sin(this.lat2));this.lat0>=0?this.el=(g+Math.sqrt(g*g-1))*Math.pow(f,this.bl):this.el=(g-Math.sqrt(g*g-1))*Math.pow(f,this.bl);var l=Math.pow(j,this.bl),m=Math.pow(k,this.bl);h=this.el/l,i=.5*(h-1/h);var n=(this.el*this.el-m*l)/(this.el*this.el+m*l),o=(m-l)/(m+l),p=e(this.long1-this.long2);this.long0=.5*(this.long1+this.long2)-Math.atan(n*Math.tan(.5*this.bl*p)/o)/this.bl,this.long0=e(this.long0);var q=e(this.long1-this.long0);this.gamma0=Math.atan(Math.sin(this.bl*q)/i),this.alpha=Math.asin(g*Math.sin(this.gamma0))}else h=this.lat0>=0?g+Math.sqrt(g*g-1):g-Math.sqrt(g*g-1),this.el=h*Math.pow(f,this.bl),i=.5*(h-1/h),this.gamma0=Math.asin(Math.sin(this.alpha)/g),this.long0=this.longc-Math.asin(i*Math.tan(this.gamma0))/this.bl;this.no_off?this.uc=0:this.lat0>=0?this.uc=this.al/this.bl*Math.atan2(Math.sqrt(g*g-1),Math.cos(this.alpha)):this.uc=-1*this.al/this.bl*Math.atan2(Math.sqrt(g*g-1),Math.cos(this.alpha))},c.forward=function(a){var b,c,f,j=a.x,k=a.y,l=e(j-this.long0);if(Math.abs(Math.abs(k)-g)<=i)f=k>0?-1:1,c=this.al/this.bl*Math.log(Math.tan(h+f*this.gamma0*.5)),b=-1*f*g*this.al/this.bl;else{var m=d(this.e,k,Math.sin(k)),n=this.el/Math.pow(m,this.bl),o=.5*(n-1/n),p=.5*(n+1/n),q=Math.sin(this.bl*l),r=(o*Math.sin(this.gamma0)-q*Math.cos(this.gamma0))/p;c=Math.abs(Math.abs(r)-1)<=i?Number.POSITIVE_INFINITY:.5*this.al*Math.log((1-r)/(1+r))/this.bl,b=Math.abs(Math.cos(this.bl*l))<=i?this.al*this.bl*l:this.al*Math.atan2(o*Math.cos(this.gamma0)+q*Math.sin(this.gamma0),Math.cos(this.bl*l))/this.bl}return this.no_rot?(a.x=this.x0+b,a.y=this.y0+c):(b-=this.uc,a.x=this.x0+c*Math.cos(this.alpha)+b*Math.sin(this.alpha),a.y=this.y0+b*Math.cos(this.alpha)-c*Math.sin(this.alpha)),a},c.inverse=function(a){var b,c;this.no_rot?(c=a.y-this.y0,b=a.x-this.x0):(c=(a.x-this.x0)*Math.cos(this.alpha)-(a.y-this.y0)*Math.sin(this.alpha),b=(a.y-this.y0)*Math.cos(this.alpha)+(a.x-this.x0)*Math.sin(this.alpha),b+=this.uc);var d=Math.exp(-1*this.bl*c/this.al),h=.5*(d-1/d),j=.5*(d+1/d),k=Math.sin(this.bl*b/this.al),l=(k*Math.cos(this.gamma0)+h*Math.sin(this.gamma0))/j,m=Math.pow(this.el/Math.sqrt((1+l)/(1-l)),1/this.bl);return Math.abs(l-1)<i?(a.x=this.long0,a.y=g):Math.abs(l+1)<i?(a.x=this.long0,a.y=-1*g):(a.y=f(this.e,m),a.x=e(this.long0-Math.atan2(h*Math.cos(this.gamma0)-k*Math.sin(this.gamma0),Math.cos(this.bl*b/this.al))/this.bl)),a},c.names=["Hotine_Oblique_Mercator","Hotine Oblique Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin","Hotine_Oblique_Mercator_Azimuth_Center","omerc"]},{"../common/adjust_lon":5,"../common/phi2z":16,"../common/tsfnz":24}],57:[function(a,b,c){var d=a("../common/adjust_lon"),e=1e-10,f=a("../common/asinz"),g=Math.PI/2;c.init=function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},c.forward=function(a){var b,c,f,g,h,i,j,k,l=a.x,m=a.y;return f=d(l-this.long0),b=Math.sin(m),c=Math.cos(m),g=Math.cos(f),i=this.sin_p14*b+this.cos_p14*c*g,h=1,(i>0||Math.abs(i)<=e)&&(j=this.a*h*c*Math.sin(f),k=this.y0+this.a*h*(this.cos_p14*b-this.sin_p14*c*g)),a.x=j,a.y=k,a},c.inverse=function(a){var b,c,h,i,j,k,l;return a.x-=this.x0,a.y-=this.y0,b=Math.sqrt(a.x*a.x+a.y*a.y),c=f(b/this.a),h=Math.sin(c),i=Math.cos(c),k=this.long0,Math.abs(b)<=e?(l=this.lat0,a.x=k,a.y=l,a):(l=f(i*this.sin_p14+a.y*h*this.cos_p14/b),j=Math.abs(this.lat0)-g,Math.abs(j)<=e?(k=d(this.lat0>=0?this.long0+Math.atan2(a.x,-a.y):this.long0-Math.atan2(-a.x,a.y)),a.x=k,a.y=l,a):(k=d(this.long0+Math.atan2(a.x*h,b*this.cos_p14*i-a.y*this.sin_p14*h)),a.x=k,a.y=l,a))},c.names=["ortho"]},{"../common/adjust_lon":5,"../common/asinz":6}],58:[function(a,b,c){var d=a("../common/e0fn"),e=a("../common/e1fn"),f=a("../common/e2fn"),g=a("../common/e3fn"),h=a("../common/adjust_lon"),i=a("../common/adjust_lat"),j=a("../common/mlfn"),k=1e-10,l=a("../common/gN"),m=20;c.init=function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=d(this.es),this.e1=e(this.es),this.e2=f(this.es),this.e3=g(this.es),this.ml0=this.a*j(this.e0,this.e1,this.e2,this.e3,this.lat0)},c.forward=function(a){var b,c,d,e=a.x,f=a.y,g=h(e-this.long0);if(d=g*Math.sin(f),this.sphere)Math.abs(f)<=k?(b=this.a*g,c=-1*this.a*this.lat0):(b=this.a*Math.sin(d)/Math.tan(f),c=this.a*(i(f-this.lat0)+(1-Math.cos(d))/Math.tan(f)));else if(Math.abs(f)<=k)b=this.a*g,c=-1*this.ml0;else{var m=l(this.a,this.e,Math.sin(f))/Math.tan(f);b=m*Math.sin(d),c=this.a*j(this.e0,this.e1,this.e2,this.e3,f)-this.ml0+m*(1-Math.cos(d))}return a.x=b+this.x0,a.y=c+this.y0,a},c.inverse=function(a){var b,c,d,e,f,g,i,l,n;if(d=a.x-this.x0,e=a.y-this.y0,this.sphere)if(Math.abs(e+this.a*this.lat0)<=k)b=h(d/this.a+this.long0),c=0;else{g=this.lat0+e/this.a,i=d*d/this.a/this.a+g*g,l=g;var o;for(f=m;f;--f)if(o=Math.tan(l),n=-1*(g*(l*o+1)-l-.5*(l*l+i)*o)/((l-g)/o-1),l+=n,Math.abs(n)<=k){c=l;break}b=h(this.long0+Math.asin(d*Math.tan(l)/this.a)/Math.sin(c))}else if(Math.abs(e+this.ml0)<=k)c=0,b=h(this.long0+d/this.a);else{g=(this.ml0+e)/this.a,i=d*d/this.a/this.a+g*g,l=g;var p,q,r,s,t;for(f=m;f;--f)if(t=this.e*Math.sin(l),p=Math.sqrt(1-t*t)*Math.tan(l),q=this.a*j(this.e0,this.e1,this.e2,this.e3,l),r=this.e0-2*this.e1*Math.cos(2*l)+4*this.e2*Math.cos(4*l)-6*this.e3*Math.cos(6*l),s=q/this.a,n=(g*(p*s+1)-s-.5*p*(s*s+i))/(this.es*Math.sin(2*l)*(s*s+i-2*g*s)/(4*p)+(g-s)*(p*r-2/Math.sin(2*l))-r),l-=n,Math.abs(n)<=k){c=l;break}p=Math.sqrt(1-this.es*Math.pow(Math.sin(c),2))*Math.tan(c),b=h(this.long0+Math.asin(d*p/this.a)/Math.sin(c))}return a.x=b,a.y=c,a},c.names=["Polyconic","poly"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/mlfn":14}],59:[function(a,b,c){var d=a("../common/adjust_lon"),e=a("../common/adjust_lat"),f=a("../common/pj_enfn"),g=20,h=a("../common/pj_mlfn"),i=a("../common/pj_inv_mlfn"),j=Math.PI/2,k=1e-10,l=a("../common/asinz");c.init=function(){this.sphere?(this.n=1,this.m=0,this.es=0,this.C_y=Math.sqrt((this.m+1)/this.n),this.C_x=this.C_y/(this.m+1)):this.en=f(this.es)},c.forward=function(a){var b,c,e=a.x,f=a.y;if(e=d(e-this.long0),this.sphere){if(this.m)for(var i=this.n*Math.sin(f),j=g;j;--j){var l=(this.m*f+Math.sin(f)-i)/(this.m+Math.cos(f));if(f-=l,Math.abs(l)<k)break}else f=1!==this.n?Math.asin(this.n*Math.sin(f)):f;b=this.a*this.C_x*e*(this.m+Math.cos(f)),c=this.a*this.C_y*f}else{var m=Math.sin(f),n=Math.cos(f);c=this.a*h(f,m,n,this.en),b=this.a*e*n/Math.sqrt(1-this.es*m*m)}return a.x=b,a.y=c,a},c.inverse=function(a){var b,c,f,g;return a.x-=this.x0,f=a.x/this.a,a.y-=this.y0,b=a.y/this.a,this.sphere?(b/=this.C_y,f/=this.C_x*(this.m+Math.cos(b)),this.m?b=l((this.m*b+Math.sin(b))/this.n):1!==this.n&&(b=l(Math.sin(b)/this.n)),f=d(f+this.long0),b=e(b)):(b=i(a.y/this.a,this.es,this.en),g=Math.abs(b),j>g?(g=Math.sin(b),c=this.long0+a.x*Math.sqrt(1-this.es*g*g)/(this.a*Math.cos(b)),f=d(c)):j>g-k&&(f=this.long0)),a.x=f,a.y=b,a},c.names=["Sinusoidal","sinu"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/asinz":6,"../common/pj_enfn":17,"../common/pj_inv_mlfn":18,"../common/pj_mlfn":19}],60:[function(a,b,c){c.init=function(){var a=this.lat0;this.lambda0=this.long0;var b=Math.sin(a),c=this.a,d=this.rf,e=1/d,f=2*e-Math.pow(e,2),g=this.e=Math.sqrt(f);this.R=this.k0*c*Math.sqrt(1-f)/(1-f*Math.pow(b,2)),this.alpha=Math.sqrt(1+f/(1-f)*Math.pow(Math.cos(a),4)),this.b0=Math.asin(b/this.alpha);var h=Math.log(Math.tan(Math.PI/4+this.b0/2)),i=Math.log(Math.tan(Math.PI/4+a/2)),j=Math.log((1+g*b)/(1-g*b));this.K=h-this.alpha*i+this.alpha*g/2*j},c.forward=function(a){var b=Math.log(Math.tan(Math.PI/4-a.y/2)),c=this.e/2*Math.log((1+this.e*Math.sin(a.y))/(1-this.e*Math.sin(a.y))),d=-this.alpha*(b+c)+this.K,e=2*(Math.atan(Math.exp(d))-Math.PI/4),f=this.alpha*(a.x-this.lambda0),g=Math.atan(Math.sin(f)/(Math.sin(this.b0)*Math.tan(e)+Math.cos(this.b0)*Math.cos(f))),h=Math.asin(Math.cos(this.b0)*Math.sin(e)-Math.sin(this.b0)*Math.cos(e)*Math.cos(f));return a.y=this.R/2*Math.log((1+Math.sin(h))/(1-Math.sin(h)))+this.y0,a.x=this.R*g+this.x0,a},c.inverse=function(a){for(var b=a.x-this.x0,c=a.y-this.y0,d=b/this.R,e=2*(Math.atan(Math.exp(c/this.R))-Math.PI/4),f=Math.asin(Math.cos(this.b0)*Math.sin(e)+Math.sin(this.b0)*Math.cos(e)*Math.cos(d)),g=Math.atan(Math.sin(d)/(Math.cos(this.b0)*Math.cos(d)-Math.sin(this.b0)*Math.tan(e))),h=this.lambda0+g/this.alpha,i=0,j=f,k=-1e3,l=0;Math.abs(j-k)>1e-7;){if(++l>20)return;i=1/this.alpha*(Math.log(Math.tan(Math.PI/4+f/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(j))/2)),k=j,j=2*Math.atan(Math.exp(i))-Math.PI/2}return a.x=h,a.y=j,a},c.names=["somerc"]},{}],61:[function(a,b,c){var d=Math.PI/2,e=1e-10,f=a("../common/sign"),g=a("../common/msfnz"),h=a("../common/tsfnz"),i=a("../common/phi2z"),j=a("../common/adjust_lon");c.ssfn_=function(a,b,c){return b*=c,Math.tan(.5*(d+a))*Math.pow((1-b)/(1+b),.5*c)},c.init=function(){this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=e&&(this.k0=.5*(1+f(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=e&&(this.lat0>0?this.con=1:this.con=-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=e&&(this.k0=.5*this.cons*g(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/h(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=g(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-d,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},c.forward=function(a){var b,c,f,g,i,k,l=a.x,m=a.y,n=Math.sin(m),o=Math.cos(m),p=j(l-this.long0);return Math.abs(Math.abs(l-this.long0)-Math.PI)<=e&&Math.abs(m+this.lat0)<=e?(a.x=NaN,a.y=NaN,a):this.sphere?(b=2*this.k0/(1+this.sinlat0*n+this.coslat0*o*Math.cos(p)),a.x=this.a*b*o*Math.sin(p)+this.x0,a.y=this.a*b*(this.coslat0*n-this.sinlat0*o*Math.cos(p))+this.y0,a):(c=2*Math.atan(this.ssfn_(m,n,this.e))-d,g=Math.cos(c),f=Math.sin(c),Math.abs(this.coslat0)<=e?(i=h(this.e,m*this.con,this.con*n),k=2*this.a*this.k0*i/this.cons,a.x=this.x0+k*Math.sin(l-this.long0),a.y=this.y0-this.con*k*Math.cos(l-this.long0),a):(Math.abs(this.sinlat0)<e?(b=2*this.a*this.k0/(1+g*Math.cos(p)),a.y=b*f):(b=2*this.a*this.k0*this.ms1/(this.cosX0*(1+this.sinX0*f+this.cosX0*g*Math.cos(p))),a.y=b*(this.cosX0*f-this.sinX0*g*Math.cos(p))+this.y0),a.x=b*g*Math.sin(p)+this.x0,a))},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,f,g,h,k=Math.sqrt(a.x*a.x+a.y*a.y);if(this.sphere){var l=2*Math.atan(k/(.5*this.a*this.k0));return b=this.long0,c=this.lat0,e>=k?(a.x=b,a.y=c,a):(c=Math.asin(Math.cos(l)*this.sinlat0+a.y*Math.sin(l)*this.coslat0/k),b=j(Math.abs(this.coslat0)<e?this.lat0>0?this.long0+Math.atan2(a.x,-1*a.y):this.long0+Math.atan2(a.x,a.y):this.long0+Math.atan2(a.x*Math.sin(l),k*this.coslat0*Math.cos(l)-a.y*this.sinlat0*Math.sin(l))),a.x=b,a.y=c,a)}if(Math.abs(this.coslat0)<=e){if(e>=k)return c=this.lat0,b=this.long0,a.x=b,a.y=c,a;a.x*=this.con,a.y*=this.con,f=k*this.cons/(2*this.a*this.k0),c=this.con*i(this.e,f),b=this.con*j(this.con*this.long0+Math.atan2(a.x,-1*a.y))}else g=2*Math.atan(k*this.cosX0/(2*this.a*this.k0*this.ms1)),b=this.long0,e>=k?h=this.X0:(h=Math.asin(Math.cos(g)*this.sinX0+a.y*Math.sin(g)*this.cosX0/k),b=j(this.long0+Math.atan2(a.x*Math.sin(g),k*this.cosX0*Math.cos(g)-a.y*this.sinX0*Math.sin(g)))),c=-1*i(this.e,Math.tan(.5*(d+h)));return a.x=b,a.y=c,a},c.names=["stere","Stereographic_South_Pole","Polar Stereographic (variant B)"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/sign":21,"../common/tsfnz":24}],62:[function(a,b,c){var d=a("./gauss"),e=a("../common/adjust_lon");c.init=function(){d.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},c.forward=function(a){var b,c,f,g;return a.x=e(a.x-this.long0),d.forward.apply(this,[a]),b=Math.sin(a.y),c=Math.cos(a.y),f=Math.cos(a.x),g=this.k0*this.R2/(1+this.sinc0*b+this.cosc0*c*f),a.x=g*c*Math.sin(a.x),a.y=g*(this.cosc0*b-this.sinc0*c*f),a.x=this.a*a.x+this.x0,a.y=this.a*a.y+this.y0,a},c.inverse=function(a){var b,c,f,g,h;if(a.x=(a.x-this.x0)/this.a,a.y=(a.y-this.y0)/this.a,a.x/=this.k0,a.y/=this.k0,h=Math.sqrt(a.x*a.x+a.y*a.y)){var i=2*Math.atan2(h,this.R2);b=Math.sin(i),c=Math.cos(i),g=Math.asin(c*this.sinc0+a.y*b*this.cosc0/h),f=Math.atan2(a.x*b,h*this.cosc0*c-a.y*this.sinc0*b)}else g=this.phic0,f=0;return a.x=f,a.y=g,d.inverse.apply(this,[a]),a.x=e(a.x+this.long0),a},c.names=["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative"]},{"../common/adjust_lon":5,"./gauss":46}],63:[function(a,b,c){var d=a("../common/e0fn"),e=a("../common/e1fn"),f=a("../common/e2fn"),g=a("../common/e3fn"),h=a("../common/mlfn"),i=a("../common/adjust_lon"),j=Math.PI/2,k=1e-10,l=a("../common/sign"),m=a("../common/asinz");c.init=function(){this.e0=d(this.es),this.e1=e(this.es),this.e2=f(this.es),this.e3=g(this.es),this.ml0=this.a*h(this.e0,this.e1,this.e2,this.e3,this.lat0)},c.forward=function(a){var b,c,d,e=a.x,f=a.y,g=i(e-this.long0),j=Math.sin(f),k=Math.cos(f);if(this.sphere){var l=k*Math.sin(g);if(Math.abs(Math.abs(l)-1)<1e-10)return 93;c=.5*this.a*this.k0*Math.log((1+l)/(1-l)),b=Math.acos(k*Math.cos(g)/Math.sqrt(1-l*l)),0>f&&(b=-b),d=this.a*this.k0*(b-this.lat0)}else{var m=k*g,n=Math.pow(m,2),o=this.ep2*Math.pow(k,2),p=Math.tan(f),q=Math.pow(p,2);b=1-this.es*Math.pow(j,2);var r=this.a/Math.sqrt(b),s=this.a*h(this.e0,this.e1,this.e2,this.e3,f);c=this.k0*r*m*(1+n/6*(1-q+o+n/20*(5-18*q+Math.pow(q,2)+72*o-58*this.ep2)))+this.x0,d=this.k0*(s-this.ml0+r*p*(n*(.5+n/24*(5-q+9*o+4*Math.pow(o,2)+n/30*(61-58*q+Math.pow(q,2)+600*o-330*this.ep2)))))+this.y0}return a.x=c,a.y=d,a},c.inverse=function(a){var b,c,d,e,f,g,h=6;if(this.sphere){var n=Math.exp(a.x/(this.a*this.k0)),o=.5*(n-1/n),p=this.lat0+a.y/(this.a*this.k0),q=Math.cos(p);b=Math.sqrt((1-q*q)/(1+o*o)),f=m(b),0>p&&(f=-f),g=0===o&&0===q?this.long0:i(Math.atan2(o,q)+this.long0)}else{var r=a.x-this.x0,s=a.y-this.y0;for(b=(this.ml0+s/this.k0)/this.a,c=b,e=0;!0&&(d=(b+this.e1*Math.sin(2*c)-this.e2*Math.sin(4*c)+this.e3*Math.sin(6*c))/this.e0-c,c+=d,!(Math.abs(d)<=k));e++)if(e>=h)return 95;if(Math.abs(c)<j){var t=Math.sin(c),u=Math.cos(c),v=Math.tan(c),w=this.ep2*Math.pow(u,2),x=Math.pow(w,2),y=Math.pow(v,2),z=Math.pow(y,2);b=1-this.es*Math.pow(t,2);var A=this.a/Math.sqrt(b),B=A*(1-this.es)/b,C=r/(A*this.k0),D=Math.pow(C,2);f=c-A*v*D/B*(.5-D/24*(5+3*y+10*w-4*x-9*this.ep2-D/30*(61+90*y+298*w+45*z-252*this.ep2-3*x))),g=i(this.long0+C*(1-D/6*(1+2*y+w-D/20*(5-2*w+28*y-3*x+8*this.ep2+24*z)))/u)}else f=j*l(s),g=this.long0}return a.x=g,a.y=f,a},c.names=["Transverse_Mercator","Transverse Mercator","tmerc"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/mlfn":14,"../common/sign":21}],64:[function(a,b,c){var d=.017453292519943295,e=a("./tmerc");c.dependsOn="tmerc",c.init=function(){this.zone&&(this.lat0=0,this.long0=(6*Math.abs(this.zone)-183)*d,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,e.init.apply(this),this.forward=e.forward,this.inverse=e.inverse)},c.names=["Universal Transverse Mercator System","utm"]},{"./tmerc":63}],65:[function(a,b,c){var d=a("../common/adjust_lon"),e=Math.PI/2,f=1e-10,g=a("../common/asinz");c.init=function(){this.R=this.a},c.forward=function(a){var b,c,h=a.x,i=a.y,j=d(h-this.long0);Math.abs(i)<=f&&(b=this.x0+this.R*j,c=this.y0);var k=g(2*Math.abs(i/Math.PI));(Math.abs(j)<=f||Math.abs(Math.abs(i)-e)<=f)&&(b=this.x0,c=i>=0?this.y0+Math.PI*this.R*Math.tan(.5*k):this.y0+Math.PI*this.R*-Math.tan(.5*k));var l=.5*Math.abs(Math.PI/j-j/Math.PI),m=l*l,n=Math.sin(k),o=Math.cos(k),p=o/(n+o-1),q=p*p,r=p*(2/n-1),s=r*r,t=Math.PI*this.R*(l*(p-s)+Math.sqrt(m*(p-s)*(p-s)-(s+m)*(q-s)))/(s+m);0>j&&(t=-t),b=this.x0+t;var u=m+p;return t=Math.PI*this.R*(r*u-l*Math.sqrt((s+m)*(m+1)-u*u))/(s+m),c=i>=0?this.y0+t:this.y0-t,a.x=b,a.y=c,a},c.inverse=function(a){var b,c,e,g,h,i,j,k,l,m,n,o,p;return a.x-=this.x0,a.y-=this.y0,n=Math.PI*this.R,e=a.x/n,g=a.y/n,h=e*e+g*g,i=-Math.abs(g)*(1+h),
-j=i-2*g*g+e*e,k=-2*i+1+2*g*g+h*h,p=g*g/k+(2*j*j*j/k/k/k-9*i*j/k/k)/27,l=(i-j*j/3/k)/k,m=2*Math.sqrt(-l/3),n=3*p/l/m,Math.abs(n)>1&&(n=n>=0?1:-1),o=Math.acos(n)/3,c=a.y>=0?(-m*Math.cos(o+Math.PI/3)-j/3/k)*Math.PI:-(-m*Math.cos(o+Math.PI/3)-j/3/k)*Math.PI,b=Math.abs(e)<f?this.long0:d(this.long0+Math.PI*(h-1+Math.sqrt(1+2*(e*e-g*g)+h*h))/2/e),a.x=b,a.y=c,a},c.names=["Van_der_Grinten_I","VanDerGrinten","vandg"]},{"../common/adjust_lon":5,"../common/asinz":6}],66:[function(a,b,c){var d=.017453292519943295,e=57.29577951308232,f=1,g=2,h=a("./datum_transform"),i=a("./adjust_axis"),j=a("./Proj"),k=a("./common/toPoint");b.exports=function l(a,b,c){function m(a,b){return(a.datum.datum_type===f||a.datum.datum_type===g)&&"WGS84"!==b.datumCode}var n;return Array.isArray(c)&&(c=k(c)),a.datum&&b.datum&&(m(a,b)||m(b,a))&&(n=new j("WGS84"),l(a,n,c),a=n),"enu"!==a.axis&&i(a,!1,c),"longlat"===a.projName?(c.x*=d,c.y*=d):(a.to_meter&&(c.x*=a.to_meter,c.y*=a.to_meter),a.inverse(c)),a.from_greenwich&&(c.x+=a.from_greenwich),c=h(a.datum,b.datum,c),b.from_greenwich&&(c.x-=b.from_greenwich),"longlat"===b.projName?(c.x*=e,c.y*=e):(b.forward(c),b.to_meter&&(c.x/=b.to_meter,c.y/=b.to_meter)),"enu"!==b.axis&&i(b,!0,c),c}},{"./Proj":2,"./adjust_axis":3,"./common/toPoint":23,"./datum_transform":31}],67:[function(a,b,c){function d(a,b,c){a[b]=c.map(function(a){var b={};return e(a,b),b}).reduce(function(a,b){return j(a,b)},{})}function e(a,b){var c;return Array.isArray(a)?(c=a.shift(),"PARAMETER"===c&&(c=a.shift()),1===a.length?Array.isArray(a[0])?(b[c]={},e(a[0],b[c])):b[c]=a[0]:a.length?"TOWGS84"===c?b[c]=a:(b[c]={},["UNIT","PRIMEM","VERT_DATUM"].indexOf(c)>-1?(b[c]={name:a[0].toLowerCase(),convert:a[1]},3===a.length&&(b[c].auth=a[2])):"SPHEROID"===c?(b[c]={name:a[0],a:a[1],rf:a[2]},4===a.length&&(b[c].auth=a[3])):["GEOGCS","GEOCCS","DATUM","VERT_CS","COMPD_CS","LOCAL_CS","FITTED_CS","LOCAL_DATUM"].indexOf(c)>-1?(a[0]=["name",a[0]],d(b,c,a)):a.every(function(a){return Array.isArray(a)})?d(b,c,a):e(a,b[c])):b[c]=!0,void 0):void(b[a]=!0)}function f(a,b){var c=b[0],d=b[1];!(c in a)&&d in a&&(a[c]=a[d],3===b.length&&(a[c]=b[2](a[c])))}function g(a){return a*i}function h(a){function b(b){var c=a.to_meter||1;return parseFloat(b,10)*c}"GEOGCS"===a.type?a.projName="longlat":"LOCAL_CS"===a.type?(a.projName="identity",a.local=!0):"object"==typeof a.PROJECTION?a.projName=Object.keys(a.PROJECTION)[0]:a.projName=a.PROJECTION,a.UNIT&&(a.units=a.UNIT.name.toLowerCase(),"metre"===a.units&&(a.units="meter"),a.UNIT.convert&&("GEOGCS"===a.type?a.DATUM&&a.DATUM.SPHEROID&&(a.to_meter=parseFloat(a.UNIT.convert,10)*a.DATUM.SPHEROID.a):a.to_meter=parseFloat(a.UNIT.convert,10))),a.GEOGCS&&(a.GEOGCS.DATUM?a.datumCode=a.GEOGCS.DATUM.name.toLowerCase():a.datumCode=a.GEOGCS.name.toLowerCase(),"d_"===a.datumCode.slice(0,2)&&(a.datumCode=a.datumCode.slice(2)),"new_zealand_geodetic_datum_1949"!==a.datumCode&&"new_zealand_1949"!==a.datumCode||(a.datumCode="nzgd49"),"wgs_1984"===a.datumCode&&("Mercator_Auxiliary_Sphere"===a.PROJECTION&&(a.sphere=!0),a.datumCode="wgs84"),"_ferro"===a.datumCode.slice(-6)&&(a.datumCode=a.datumCode.slice(0,-6)),"_jakarta"===a.datumCode.slice(-8)&&(a.datumCode=a.datumCode.slice(0,-8)),~a.datumCode.indexOf("belge")&&(a.datumCode="rnb72"),a.GEOGCS.DATUM&&a.GEOGCS.DATUM.SPHEROID&&(a.ellps=a.GEOGCS.DATUM.SPHEROID.name.replace("_19","").replace(/[Cc]larke\_18/,"clrk"),"international"===a.ellps.toLowerCase().slice(0,13)&&(a.ellps="intl"),a.a=a.GEOGCS.DATUM.SPHEROID.a,a.rf=parseFloat(a.GEOGCS.DATUM.SPHEROID.rf,10)),~a.datumCode.indexOf("osgb_1936")&&(a.datumCode="osgb36")),a.b&&!isFinite(a.b)&&(a.b=a.a);var c=function(b){return f(a,b)},d=[["standard_parallel_1","Standard_Parallel_1"],["standard_parallel_2","Standard_Parallel_2"],["false_easting","False_Easting"],["false_northing","False_Northing"],["central_meridian","Central_Meridian"],["latitude_of_origin","Latitude_Of_Origin"],["latitude_of_origin","Central_Parallel"],["scale_factor","Scale_Factor"],["k0","scale_factor"],["latitude_of_center","Latitude_of_center"],["lat0","latitude_of_center",g],["longitude_of_center","Longitude_Of_Center"],["longc","longitude_of_center",g],["x0","false_easting",b],["y0","false_northing",b],["long0","central_meridian",g],["lat0","latitude_of_origin",g],["lat0","standard_parallel_1",g],["lat1","standard_parallel_1",g],["lat2","standard_parallel_2",g],["alpha","azimuth",g],["srsCode","name"]];d.forEach(c),a.long0||!a.longc||"Albers_Conic_Equal_Area"!==a.projName&&"Lambert_Azimuthal_Equal_Area"!==a.projName||(a.long0=a.longc),a.lat_ts||!a.lat1||"Stereographic_South_Pole"!==a.projName&&"Polar Stereographic (variant B)"!==a.projName||(a.lat0=g(a.lat1>0?90:-90),a.lat_ts=a.lat1)}var i=.017453292519943295,j=a("./extend");b.exports=function(a,b){var c=JSON.parse((","+a).replace(/\s*\,\s*([A-Z_0-9]+?)(\[)/g,',["$1",').slice(1).replace(/\s*\,\s*([A-Z_0-9]+?)\]/g,',"$1"]').replace(/,\["VERTCS".+/,"")),d=c.shift(),f=c.shift();c.unshift(["name",f]),c.unshift(["type",d]),c.unshift("output");var g={};return e(c,g),h(g.output),j(b,g.output)}},{"./extend":34}],68:[function(a,b,c){function d(a){return a*(Math.PI/180)}function e(a){return 180*(a/Math.PI)}function f(a){var b,c,e,f,g,i,j,k,l,m=a.lat,n=a.lon,o=6378137,p=.00669438,q=.9996,r=d(m),s=d(n);l=Math.floor((n+180)/6)+1,180===n&&(l=60),m>=56&&64>m&&n>=3&&12>n&&(l=32),m>=72&&84>m&&(n>=0&&9>n?l=31:n>=9&&21>n?l=33:n>=21&&33>n?l=35:n>=33&&42>n&&(l=37)),b=6*(l-1)-180+3,k=d(b),c=p/(1-p),e=o/Math.sqrt(1-p*Math.sin(r)*Math.sin(r)),f=Math.tan(r)*Math.tan(r),g=c*Math.cos(r)*Math.cos(r),i=Math.cos(r)*(s-k),j=o*((1-p/4-3*p*p/64-5*p*p*p/256)*r-(3*p/8+3*p*p/32+45*p*p*p/1024)*Math.sin(2*r)+(15*p*p/256+45*p*p*p/1024)*Math.sin(4*r)-35*p*p*p/3072*Math.sin(6*r));var t=q*e*(i+(1-f+g)*i*i*i/6+(5-18*f+f*f+72*g-58*c)*i*i*i*i*i/120)+5e5,u=q*(j+e*Math.tan(r)*(i*i/2+(5-f+9*g+4*g*g)*i*i*i*i/24+(61-58*f+f*f+600*g-330*c)*i*i*i*i*i*i/720));return 0>m&&(u+=1e7),{northing:Math.round(u),easting:Math.round(t),zoneNumber:l,zoneLetter:h(m)}}function g(a){var b=a.northing,c=a.easting,d=a.zoneLetter,f=a.zoneNumber;if(0>f||f>60)return null;var h,i,j,k,l,m,n,o,p,q,r=.9996,s=6378137,t=.00669438,u=(1-Math.sqrt(1-t))/(1+Math.sqrt(1-t)),v=c-5e5,w=b;"N">d&&(w-=1e7),o=6*(f-1)-180+3,h=t/(1-t),n=w/r,p=n/(s*(1-t/4-3*t*t/64-5*t*t*t/256)),q=p+(3*u/2-27*u*u*u/32)*Math.sin(2*p)+(21*u*u/16-55*u*u*u*u/32)*Math.sin(4*p)+151*u*u*u/96*Math.sin(6*p),i=s/Math.sqrt(1-t*Math.sin(q)*Math.sin(q)),j=Math.tan(q)*Math.tan(q),k=h*Math.cos(q)*Math.cos(q),l=s*(1-t)/Math.pow(1-t*Math.sin(q)*Math.sin(q),1.5),m=v/(i*r);var x=q-i*Math.tan(q)/l*(m*m/2-(5+3*j+10*k-4*k*k-9*h)*m*m*m*m/24+(61+90*j+298*k+45*j*j-252*h-3*k*k)*m*m*m*m*m*m/720);x=e(x);var y=(m-(1+2*j+k)*m*m*m/6+(5-2*k+28*j-3*k*k+8*h+24*j*j)*m*m*m*m*m/120)/Math.cos(q);y=o+e(y);var z;if(a.accuracy){var A=g({northing:a.northing+a.accuracy,easting:a.easting+a.accuracy,zoneLetter:a.zoneLetter,zoneNumber:a.zoneNumber});z={top:A.lat,right:A.lon,bottom:x,left:y}}else z={lat:x,lon:y};return z}function h(a){var b="Z";return 84>=a&&a>=72?b="X":72>a&&a>=64?b="W":64>a&&a>=56?b="V":56>a&&a>=48?b="U":48>a&&a>=40?b="T":40>a&&a>=32?b="S":32>a&&a>=24?b="R":24>a&&a>=16?b="Q":16>a&&a>=8?b="P":8>a&&a>=0?b="N":0>a&&a>=-8?b="M":-8>a&&a>=-16?b="L":-16>a&&a>=-24?b="K":-24>a&&a>=-32?b="J":-32>a&&a>=-40?b="H":-40>a&&a>=-48?b="G":-48>a&&a>=-56?b="F":-56>a&&a>=-64?b="E":-64>a&&a>=-72?b="D":-72>a&&a>=-80&&(b="C"),b}function i(a,b){var c="00000"+a.easting,d="00000"+a.northing;return a.zoneNumber+a.zoneLetter+j(a.easting,a.northing,a.zoneNumber)+c.substr(c.length-5,b)+d.substr(d.length-5,b)}function j(a,b,c){var d=k(c),e=Math.floor(a/1e5),f=Math.floor(b/1e5)%20;return l(e,f,d)}function k(a){var b=a%q;return 0===b&&(b=q),b}function l(a,b,c){var d=c-1,e=r.charCodeAt(d),f=s.charCodeAt(d),g=e+a-1,h=f+b,i=!1;g>x&&(g=g-x+t-1,i=!0),(g===u||u>e&&g>u||(g>u||u>e)&&i)&&g++,(g===v||v>e&&g>v||(g>v||v>e)&&i)&&(g++,g===u&&g++),g>x&&(g=g-x+t-1),h>w?(h=h-w+t-1,i=!0):i=!1,(h===u||u>f&&h>u||(h>u||u>f)&&i)&&h++,(h===v||v>f&&h>v||(h>v||v>f)&&i)&&(h++,h===u&&h++),h>w&&(h=h-w+t-1);var j=String.fromCharCode(g)+String.fromCharCode(h);return j}function m(a){if(a&&0===a.length)throw"MGRSPoint coverting from nothing";for(var b,c=a.length,d=null,e="",f=0;!/[A-Z]/.test(b=a.charAt(f));){if(f>=2)throw"MGRSPoint bad conversion from: "+a;e+=b,f++}var g=parseInt(e,10);if(0===f||f+3>c)throw"MGRSPoint bad conversion from: "+a;var h=a.charAt(f++);if("A">=h||"B"===h||"Y"===h||h>="Z"||"I"===h||"O"===h)throw"MGRSPoint zone letter "+h+" not handled: "+a;d=a.substring(f,f+=2);for(var i=k(g),j=n(d.charAt(0),i),l=o(d.charAt(1),i);l<p(h);)l+=2e6;var m=c-f;if(m%2!==0)throw"MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters"+a;var q,r,s,t,u,v=m/2,w=0,x=0;return v>0&&(q=1e5/Math.pow(10,v),r=a.substring(f,f+v),w=parseFloat(r)*q,s=a.substring(f+v),x=parseFloat(s)*q),t=w+j,u=x+l,{easting:t,northing:u,zoneLetter:h,zoneNumber:g,accuracy:q}}function n(a,b){for(var c=r.charCodeAt(b-1),d=1e5,e=!1;c!==a.charCodeAt(0);){if(c++,c===u&&c++,c===v&&c++,c>x){if(e)throw"Bad character: "+a;c=t,e=!0}d+=1e5}return d}function o(a,b){if(a>"V")throw"MGRSPoint given invalid Northing "+a;for(var c=s.charCodeAt(b-1),d=0,e=!1;c!==a.charCodeAt(0);){if(c++,c===u&&c++,c===v&&c++,c>w){if(e)throw"Bad character: "+a;c=t,e=!0}d+=1e5}return d}function p(a){var b;switch(a){case"C":b=11e5;break;case"D":b=2e6;break;case"E":b=28e5;break;case"F":b=37e5;break;case"G":b=46e5;break;case"H":b=55e5;break;case"J":b=64e5;break;case"K":b=73e5;break;case"L":b=82e5;break;case"M":b=91e5;break;case"N":b=0;break;case"P":b=8e5;break;case"Q":b=17e5;break;case"R":b=26e5;break;case"S":b=35e5;break;case"T":b=44e5;break;case"U":b=53e5;break;case"V":b=62e5;break;case"W":b=7e6;break;case"X":b=79e5;break;default:b=-1}if(b>=0)return b;throw"Invalid zone letter: "+a}var q=6,r="AJSAJS",s="AFAFAF",t=65,u=73,v=79,w=86,x=90;c.forward=function(a,b){return b=b||5,i(f({lat:a[1],lon:a[0]}),b)},c.inverse=function(a){var b=g(m(a.toUpperCase()));return b.lat&&b.lon?[b.lon,b.lat,b.lon,b.lat]:[b.left,b.bottom,b.right,b.top]},c.toPoint=function(a){var b=g(m(a.toUpperCase()));return b.lat&&b.lon?[b.lon,b.lat]:[(b.left+b.right)/2,(b.top+b.bottom)/2]}},{}],69:[function(a,b,c){b.exports={name:"proj4",version:"2.3.15",description:"Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.",main:"lib/index.js",directories:{test:"test",doc:"docs"},scripts:{test:"./node_modules/istanbul/lib/cli.js test ./node_modules/mocha/bin/_mocha test/test.js"},repository:{type:"git",url:"git://github.com/proj4js/proj4js.git"},author:"",license:"MIT",jam:{main:"dist/proj4.js",include:["dist/proj4.js","README.md","AUTHORS","LICENSE.md"]},devDependencies:{"grunt-cli":"~0.1.13",grunt:"~0.4.2","grunt-contrib-connect":"~0.6.0","grunt-contrib-jshint":"~0.8.0",chai:"~1.8.1",mocha:"~1.17.1","grunt-mocha-phantomjs":"~0.4.0",browserify:"~12.0.1","grunt-browserify":"~4.0.1","grunt-contrib-uglify":"~0.11.1",curl:"git://github.com/cujojs/curl.git",istanbul:"~0.2.4",tin:"~0.4.0"},dependencies:{mgrs:"~0.0.2"}}},{}]},{},[36])(36)});</script>
-<style type="text/css">.loading {margin-top: 10em;text-align: center;color: gray;}#play-controls {position: absolute;bottom: 0;text-align: center;min-width: 310px;max-width: 800px;margin: 0 auto;padding: 5px 0 1em 0;}#play-controls * {display: inline-block;vertical-align: middle;}#play-pause-button {color: #666666;width: 30px;height: 30px;text-align: center;font-size: 15px;cursor: pointer;border: 1px solid silver;border-radius: 3px;background: #f8f8f8;}#play-range {margin: 2.5%;width: 70%;}#play-output {color: #666666;font-family: Arial, Helvetica, sans-serif;}</style>
-<style type="text/css">*, *:after, *:before {-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;}body {margin: 0;}[class*='col-'] {float: left;min-height: 1px;padding-right: 0px; }.grid {width: 100%;margin: 0 auto;overflow: hidden;}.grid:after {content: "";display: table;clear: both;}.grid-pad {padding-top: 0px;padding-left: 0px; padding-right: 0; }.push-right {float: right;}.col-1-1 {width: 100%;}.col-2-3, .col-8-12 {width: 66.66%;}.col-1-2, .col-6-12 {width: 50%;}.col-1-3, .col-4-12 {width: 33.33%;}.col-1-4, .col-3-12 {width: 25%;}.col-1-5 {width: 20%;}.col-1-6, .col-2-12 {width: 16.667%;}.col-1-7 {width: 14.28%;}.col-1-8 {width: 12.5%;}.col-1-9 {width: 11.1%;}.col-1-10 {width: 10%;}.col-1-11 {width: 9.09%;}.col-1-12 {width: 8.33%}.col-11-12 {width: 91.66%}.col-10-12 {width: 83.333%;}.col-9-12 {width: 75%;}.col-5-12 {width: 41.66%;}.col-7-12 {width: 58.33%}.push-2-3, .push-8-12 {margin-left: 66.66%;}.push-1-2, .push-6-12 {margin-left: 50%;}.push-1-3, .push-4-12 {margin-left: 33.33%;}.push-1-4, .push-3-12 {margin-left: 25%;}.push-1-5 {margin-left: 20%;}.push-1-6, .push-2-12 {margin-left: 16.667%;}.push-1-7 {margin-left: 14.28%;}.push-1-8 {margin-left: 12.5%;}.push-1-9 {margin-left: 11.1%;}.push-1-10 {margin-left: 10%;}.push-1-11 {margin-left: 9.09%;}.push-1-12 {margin-left: 8.33%}@media handheld, only screen and (max-width: 767px) {.grid {width: 100%;min-width: 0;margin-left: 0;margin-right: 0;padding-left: 20px; padding-right: 10px; }[class*='col-'] {width: auto;float: none;margin: 10px 0;padding-left: 0;padding-right: 10px; }[class*='mobile-col-'] {float: left;margin: 0 0 10px;padding-left: 0;padding-right: 10px; padding-bottom: 0;}.mobile-col-1-1 {width: 100%;}.mobile-col-2-3, .mobile-col-8-12 {width: 66.66%;}.mobile-col-1-2, .mobile-col-6-12 {width: 50%;}.mobile-col-1-3, .mobile-col-4-12 {width: 33.33%;}.mobile-col-1-4, .mobile-col-3-12 {width: 25%;}.mobile-col-1-5 {width: 20%;}.mobile-col-1-6, .mobile-col-2-12 {width: 16.667%;}.mobile-col-1-7 {width: 14.28%;}.mobile-col-1-8 {width: 12.5%;}.mobile-col-1-9 {width: 11.1%;}.mobile-col-1-10 {width: 10%;}.mobile-col-1-11 {width: 9.09%;}.mobile-col-1-12 {width: 8.33%}.mobile-col-11-12 {width: 91.66%}.mobile-col-10-12 {width: 83.333%;}.mobile-col-9-12 {width: 75%;}.mobile-col-5-12 {width: 41.66%;}.mobile-col-7-12 {width: 58.33%}.hide-on-mobile {display: none !important;width: 0;height: 0;}}</style>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
-
- (c) 2009-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(O,J){"object"===typeof module&&module.exports?module.exports=O.document?J(O):J:"function"===typeof define&&define.amd?define(function(){return J(O)}):O.Highcharts=J(O)})("undefined"!==typeof window?window:this,function(O){var J=function(){var a="undefined"===typeof O?window:O,y=a.document,G=a.navigator&&a.navigator.userAgent||"",E=y&&y.createElementNS&&!!y.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,h=/(edge|msie|trident)/i.test(G)&&!a.opera,c=-1!==G.indexOf("Firefox"),
-r=-1!==G.indexOf("Chrome"),u=c&&4>parseInt(G.split("Firefox/")[1],10);return a.Highcharts?a.Highcharts.error(16,!0):{product:"Highcharts",version:"7.0.1",deg2rad:2*Math.PI/360,doc:y,hasBidiBug:u,hasTouch:y&&void 0!==y.documentElement.ontouchstart,isMS:h,isWebKit:-1!==G.indexOf("AppleWebKit"),isFirefox:c,isChrome:r,isSafari:!r&&-1!==G.indexOf("Safari"),isTouchDevice:/(Mobile|Android|Windows Phone)/.test(G),SVG_NS:"http://www.w3.org/2000/svg",chartCount:0,seriesTypes:{},symbolSizes:{},svg:E,win:a,marginNames:["plotTop",
-"marginRight","marginBottom","plotLeft"],noop:function(){},charts:[]}}();(function(a){a.timers=[];var y=a.charts,G=a.doc,E=a.win;a.error=function(h,c,r){var u=a.isNumber(h)?"Highcharts error #"+h+": www.highcharts.com/errors/"+h:h;r&&a.fireEvent(r,"displayError",{code:h});if(c)throw Error(u);E.console&&console.log(u)};a.Fx=function(a,c,r){this.options=c;this.elem=a;this.prop=r};a.Fx.prototype={dSetter:function(){var a=this.paths[0],c=this.paths[1],r=[],u=this.now,v=a.length,w;if(1===u)r=this.toD;
-else if(v===c.length&&1>u)for(;v--;)w=parseFloat(a[v]),r[v]=isNaN(w)?c[v]:u*parseFloat(c[v]-w)+w;else r=c;this.elem.attr("d",r,null,!0)},update:function(){var a=this.elem,c=this.prop,r=this.now,u=this.options.step;if(this[c+"Setter"])this[c+"Setter"]();else a.attr?a.element&&a.attr(c,r,null,!0):a.style[c]=r+this.unit;u&&u.call(a,r,this)},run:function(h,c,r){var u=this,v=u.options,w=function(a){return w.stopped?!1:u.step(a)},n=E.requestAnimationFrame||function(a){setTimeout(a,13)},g=function(){for(var d=
-0;d<a.timers.length;d++)a.timers[d]()||a.timers.splice(d--,1);a.timers.length&&n(g)};h!==c||this.elem["forceAnimate:"+this.prop]?(this.startTime=+new Date,this.start=h,this.end=c,this.unit=r,this.now=this.start,this.pos=0,w.elem=this.elem,w.prop=this.prop,w()&&1===a.timers.push(w)&&n(g)):(delete v.curAnim[this.prop],v.complete&&0===Object.keys(v.curAnim).length&&v.complete.call(this.elem))},step:function(h){var c=+new Date,r,u=this.options,v=this.elem,w=u.complete,n=u.duration,g=u.curAnim;v.attr&&
-!v.element?h=!1:h||c>=n+this.startTime?(this.now=this.end,this.pos=1,this.update(),r=g[this.prop]=!0,a.objectEach(g,function(a){!0!==a&&(r=!1)}),r&&w&&w.call(v),h=!1):(this.pos=u.easing((c-this.startTime)/n),this.now=this.start+(this.end-this.start)*this.pos,this.update(),h=!0);return h},initPath:function(h,c,r){function u(a){var b,k;for(f=a.length;f--;)b="M"===a[f]||"L"===a[f],k=/[a-zA-Z]/.test(a[f+3]),b&&k&&a.splice(f+1,0,a[f+1],a[f+2],a[f+1],a[f+2])}function v(a,l){for(;a.length<b;){a[0]=l[b-a.length];
-var k=a.slice(0,p);[].splice.apply(a,[0,0].concat(k));x&&(k=a.slice(a.length-p),[].splice.apply(a,[a.length,0].concat(k)),f--)}a[0]="M"}function w(a,f){for(var k=(b-a.length)/p;0<k&&k--;)l=a.slice().splice(a.length/t-p,p*t),l[0]=f[b-p-k*p],m&&(l[p-6]=l[p-2],l[p-5]=l[p-1]),[].splice.apply(a,[a.length/t,0].concat(l)),x&&k--}c=c||"";var n,g=h.startX,d=h.endX,m=-1<c.indexOf("C"),p=m?7:3,b,l,f;c=c.split(" ");r=r.slice();var x=h.isArea,t=x?2:1,H;m&&(u(c),u(r));if(g&&d){for(f=0;f<g.length;f++)if(g[f]===
-d[0]){n=f;break}else if(g[0]===d[d.length-g.length+f]){n=f;H=!0;break}void 0===n&&(c=[])}c.length&&a.isNumber(n)&&(b=r.length+n*t*p,H?(v(c,r),w(r,c)):(v(r,c),w(c,r)));return[c,r]},fillSetter:function(){a.Fx.prototype.strokeSetter.apply(this,arguments)},strokeSetter:function(){this.elem.attr(this.prop,a.color(this.start).tweenTo(a.color(this.end),this.pos),null,!0)}};a.merge=function(){var h,c=arguments,r,u={},v=function(c,n){"object"!==typeof c&&(c={});a.objectEach(n,function(g,d){!a.isObject(g,!0)||
-a.isClass(g)||a.isDOMElement(g)?c[d]=n[d]:c[d]=v(c[d]||{},g)});return c};!0===c[0]&&(u=c[1],c=Array.prototype.slice.call(c,2));r=c.length;for(h=0;h<r;h++)u=v(u,c[h]);return u};a.pInt=function(a,c){return parseInt(a,c||10)};a.isString=function(a){return"string"===typeof a};a.isArray=function(a){a=Object.prototype.toString.call(a);return"[object Array]"===a||"[object Array Iterator]"===a};a.isObject=function(h,c){return!!h&&"object"===typeof h&&(!c||!a.isArray(h))};a.isDOMElement=function(h){return a.isObject(h)&&
-"number"===typeof h.nodeType};a.isClass=function(h){var c=h&&h.constructor;return!(!a.isObject(h,!0)||a.isDOMElement(h)||!c||!c.name||"Object"===c.name)};a.isNumber=function(a){return"number"===typeof a&&!isNaN(a)&&Infinity>a&&-Infinity<a};a.erase=function(a,c){for(var h=a.length;h--;)if(a[h]===c){a.splice(h,1);break}};a.defined=function(a){return void 0!==a&&null!==a};a.attr=function(h,c,r){var u;a.isString(c)?a.defined(r)?h.setAttribute(c,r):h&&h.getAttribute&&((u=h.getAttribute(c))||"class"!==
-c||(u=h.getAttribute(c+"Name"))):a.defined(c)&&a.isObject(c)&&a.objectEach(c,function(a,c){h.setAttribute(c,a)});return u};a.splat=function(h){return a.isArray(h)?h:[h]};a.syncTimeout=function(a,c,r){if(c)return setTimeout(a,c,r);a.call(0,r)};a.clearTimeout=function(h){a.defined(h)&&clearTimeout(h)};a.extend=function(a,c){var h;a||(a={});for(h in c)a[h]=c[h];return a};a.pick=function(){var a=arguments,c,r,u=a.length;for(c=0;c<u;c++)if(r=a[c],void 0!==r&&null!==r)return r};a.css=function(h,c){a.isMS&&
-!a.svg&&c&&void 0!==c.opacity&&(c.filter="alpha(opacity\x3d"+100*c.opacity+")");a.extend(h.style,c)};a.createElement=function(h,c,r,u,v){h=G.createElement(h);var w=a.css;c&&a.extend(h,c);v&&w(h,{padding:0,border:"none",margin:0});r&&w(h,r);u&&u.appendChild(h);return h};a.extendClass=function(h,c){var r=function(){};r.prototype=new h;a.extend(r.prototype,c);return r};a.pad=function(a,c,r){return Array((c||2)+1-String(a).replace("-","").length).join(r||0)+a};a.relativeLength=function(a,c,r){return/%$/.test(a)?
-c*parseFloat(a)/100+(r||0):parseFloat(a)};a.wrap=function(a,c,r){var h=a[c];a[c]=function(){var a=Array.prototype.slice.call(arguments),c=arguments,n=this;n.proceed=function(){h.apply(n,arguments.length?arguments:c)};a.unshift(h);a=r.apply(this,a);n.proceed=null;return a}};a.datePropsToTimestamps=function(h){a.objectEach(h,function(c,r){a.isObject(c)&&"function"===typeof c.getTime?h[r]=c.getTime():(a.isObject(c)||a.isArray(c))&&a.datePropsToTimestamps(c)})};a.formatSingle=function(h,c,r){var u=/\.([0-9])/,
-v=a.defaultOptions.lang;/f$/.test(h)?(r=(r=h.match(u))?r[1]:-1,null!==c&&(c=a.numberFormat(c,r,v.decimalPoint,-1<h.indexOf(",")?v.thousandsSep:""))):c=(r||a.time).dateFormat(h,c);return c};a.format=function(h,c,r){for(var u="{",v=!1,w,n,g,d,m=[],p;h;){u=h.indexOf(u);if(-1===u)break;w=h.slice(0,u);if(v){w=w.split(":");n=w.shift().split(".");d=n.length;p=c;for(g=0;g<d;g++)p&&(p=p[n[g]]);w.length&&(p=a.formatSingle(w.join(":"),p,r));m.push(p)}else m.push(w);h=h.slice(u+1);u=(v=!v)?"}":"{"}m.push(h);
-return m.join("")};a.getMagnitude=function(a){return Math.pow(10,Math.floor(Math.log(a)/Math.LN10))};a.normalizeTickInterval=function(h,c,r,u,v){var w,n=h;r=a.pick(r,1);w=h/r;c||(c=v?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===u&&(1===r?c=c.filter(function(a){return 0===a%1}):.1>=r&&(c=[1/r])));for(u=0;u<c.length&&!(n=c[u],v&&n*r>=h||!v&&w<=(c[u]+(c[u+1]||c[u]))/2);u++);return n=a.correctFloat(n*r,-Math.round(Math.log(.001)/Math.LN10))};a.stableSort=function(a,c){var h=a.length,u,v;for(v=0;v<
-h;v++)a[v].safeI=v;a.sort(function(a,n){u=c(a,n);return 0===u?a.safeI-n.safeI:u});for(v=0;v<h;v++)delete a[v].safeI};a.arrayMin=function(a){for(var c=a.length,h=a[0];c--;)a[c]<h&&(h=a[c]);return h};a.arrayMax=function(a){for(var c=a.length,h=a[0];c--;)a[c]>h&&(h=a[c]);return h};a.destroyObjectProperties=function(h,c){a.objectEach(h,function(a,u){a&&a!==c&&a.destroy&&a.destroy();delete h[u]})};a.discardElement=function(h){var c=a.garbageBin;c||(c=a.createElement("div"));h&&c.appendChild(h);c.innerHTML=
-""};a.correctFloat=function(a,c){return parseFloat(a.toPrecision(c||14))};a.setAnimation=function(h,c){c.renderer.globalAnimation=a.pick(h,c.options.chart.animation,!0)};a.animObject=function(h){return a.isObject(h)?a.merge(h):{duration:h?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5};a.numberFormat=function(h,c,r,u){h=+h||0;c=+c;var v=a.defaultOptions.lang,w=(h.toString().split(".")[1]||"").split("e")[0].length,n,g,d=h.toString().split("e");
--1===c?c=Math.min(w,20):a.isNumber(c)?c&&d[1]&&0>d[1]&&(n=c+ +d[1],0<=n?(d[0]=(+d[0]).toExponential(n).split("e")[0],c=n):(d[0]=d[0].split(".")[0]||0,h=20>c?(d[0]*Math.pow(10,d[1])).toFixed(c):0,d[1]=0)):c=2;g=(Math.abs(d[1]?d[0]:h)+Math.pow(10,-Math.max(c,w)-1)).toFixed(c);w=String(a.pInt(g));n=3<w.length?w.length%3:0;r=a.pick(r,v.decimalPoint);u=a.pick(u,v.thousandsSep);h=(0>h?"-":"")+(n?w.substr(0,n)+u:"");h+=w.substr(n).replace(/(\d{3})(?=\d)/g,"$1"+u);c&&(h+=r+g.slice(-c));d[1]&&0!==+h&&(h+=
-"e"+d[1]);return h};Math.easeInOutSine=function(a){return-.5*(Math.cos(Math.PI*a)-1)};a.getStyle=function(h,c,r){if("width"===c)return Math.max(0,Math.min(h.offsetWidth,h.scrollWidth,h.getBoundingClientRect?Math.floor(h.getBoundingClientRect().width):Infinity)-a.getStyle(h,"padding-left")-a.getStyle(h,"padding-right"));if("height"===c)return Math.max(0,Math.min(h.offsetHeight,h.scrollHeight)-a.getStyle(h,"padding-top")-a.getStyle(h,"padding-bottom"));E.getComputedStyle||a.error(27,!0);if(h=E.getComputedStyle(h,
-void 0))h=h.getPropertyValue(c),a.pick(r,"opacity"!==c)&&(h=a.pInt(h));return h};a.inArray=function(a,c,r){return c.indexOf(a,r)};a.find=Array.prototype.find?function(a,c){return a.find(c)}:function(a,c){var h,u=a.length;for(h=0;h<u;h++)if(c(a[h],h))return a[h]};a.keys=Object.keys;a.offset=function(a){var c=G.documentElement;a=a.parentElement||a.parentNode?a.getBoundingClientRect():{top:0,left:0};return{top:a.top+(E.pageYOffset||c.scrollTop)-(c.clientTop||0),left:a.left+(E.pageXOffset||c.scrollLeft)-
-(c.clientLeft||0)}};a.stop=function(h,c){for(var r=a.timers.length;r--;)a.timers[r].elem!==h||c&&c!==a.timers[r].prop||(a.timers[r].stopped=!0)};a.objectEach=function(a,c,r){for(var h in a)a.hasOwnProperty(h)&&c.call(r||a[h],a[h],h,a)};a.objectEach({map:"map",each:"forEach",grep:"filter",reduce:"reduce",some:"some"},function(h,c){a[c]=function(a){return Array.prototype[h].apply(a,[].slice.call(arguments,1))}});a.addEvent=function(h,c,r,u){var v,w=h.addEventListener||a.addEventListenerPolyfill;v="function"===
-typeof h&&h.prototype?h.prototype.protoEvents=h.prototype.protoEvents||{}:h.hcEvents=h.hcEvents||{};a.Point&&h instanceof a.Point&&h.series&&h.series.chart&&(h.series.chart.runTrackerClick=!0);w&&w.call(h,c,r,!1);v[c]||(v[c]=[]);v[c].push(r);u&&a.isNumber(u.order)&&(r.order=u.order,v[c].sort(function(a,g){return a.order-g.order}));return function(){a.removeEvent(h,c,r)}};a.removeEvent=function(h,c,r){function u(g,d){var m=h.removeEventListener||a.removeEventListenerPolyfill;m&&m.call(h,g,d,!1)}function v(g){var d,
-m;h.nodeName&&(c?(d={},d[c]=!0):d=g,a.objectEach(d,function(a,b){if(g[b])for(m=g[b].length;m--;)u(b,g[b][m])}))}var w,n;["protoEvents","hcEvents"].forEach(function(a){var d=h[a];d&&(c?(w=d[c]||[],r?(n=w.indexOf(r),-1<n&&(w.splice(n,1),d[c]=w),u(c,r)):(v(d),d[c]=[])):(v(d),h[a]={}))})};a.fireEvent=function(h,c,r,u){var v,w,n,g,d;r=r||{};G.createEvent&&(h.dispatchEvent||h.fireEvent)?(v=G.createEvent("Events"),v.initEvent(c,!0,!0),a.extend(v,r),h.dispatchEvent?h.dispatchEvent(v):h.fireEvent(c,v)):["protoEvents",
-"hcEvents"].forEach(function(m){if(h[m])for(w=h[m][c]||[],n=w.length,r.target||a.extend(r,{preventDefault:function(){r.defaultPrevented=!0},target:h,type:c}),g=0;g<n;g++)(d=w[g])&&!1===d.call(h,r)&&r.preventDefault()});u&&!r.defaultPrevented&&u.call(h,r)};a.animate=function(h,c,r){var u,v="",w,n,g;a.isObject(r)||(g=arguments,r={duration:g[2],easing:g[3],complete:g[4]});a.isNumber(r.duration)||(r.duration=400);r.easing="function"===typeof r.easing?r.easing:Math[r.easing]||Math.easeInOutSine;r.curAnim=
-a.merge(c);a.objectEach(c,function(d,g){a.stop(h,g);n=new a.Fx(h,r,g);w=null;"d"===g?(n.paths=n.initPath(h,h.d,c.d),n.toD=c.d,u=0,w=1):h.attr?u=h.attr(g):(u=parseFloat(a.getStyle(h,g))||0,"opacity"!==g&&(v="px"));w||(w=d);w&&w.match&&w.match("px")&&(w=w.replace(/px/g,""));n.run(u,w,v)})};a.seriesType=function(h,c,r,u,v){var w=a.getOptions(),n=a.seriesTypes;w.plotOptions[h]=a.merge(w.plotOptions[c],r);n[h]=a.extendClass(n[c]||function(){},u);n[h].prototype.type=h;v&&(n[h].prototype.pointClass=a.extendClass(a.Point,
-v));return n[h]};a.uniqueKey=function(){var a=Math.random().toString(36).substring(2,9),c=0;return function(){return"highcharts-"+a+"-"+c++}}();a.isFunction=function(a){return"function"===typeof a};E.jQuery&&(E.jQuery.fn.highcharts=function(){var h=[].slice.call(arguments);if(this[0])return h[0]?(new (a[a.isString(h[0])?h.shift():"Chart"])(this[0],h[0],h[1]),this):y[a.attr(this[0],"data-highcharts-chart")]})})(J);(function(a){var y=a.isNumber,G=a.merge,E=a.pInt;a.Color=function(h){if(!(this instanceof
-a.Color))return new a.Color(h);this.init(h)};a.Color.prototype={parsers:[{regex:/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,parse:function(a){return[E(a[1]),E(a[2]),E(a[3]),parseFloat(a[4],10)]}},{regex:/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,parse:function(a){return[E(a[1]),E(a[2]),E(a[3]),1]}}],names:{white:"#ffffff",black:"#000000"},init:function(h){var c,r,u,v;if((this.input=h=this.names[h&&h.toLowerCase?h.toLowerCase():
-""]||h)&&h.stops)this.stops=h.stops.map(function(c){return new a.Color(c[1])});else if(h&&h.charAt&&"#"===h.charAt()&&(c=h.length,h=parseInt(h.substr(1),16),7===c?r=[(h&16711680)>>16,(h&65280)>>8,h&255,1]:4===c&&(r=[(h&3840)>>4|(h&3840)>>8,(h&240)>>4|h&240,(h&15)<<4|h&15,1])),!r)for(u=this.parsers.length;u--&&!r;)v=this.parsers[u],(c=v.regex.exec(h))&&(r=v.parse(c));this.rgba=r||[]},get:function(a){var c=this.input,h=this.rgba,u;this.stops?(u=G(c),u.stops=[].concat(u.stops),this.stops.forEach(function(c,
-h){u.stops[h]=[u.stops[h][0],c.get(a)]})):u=h&&y(h[0])?"rgb"===a||!a&&1===h[3]?"rgb("+h[0]+","+h[1]+","+h[2]+")":"a"===a?h[3]:"rgba("+h.join(",")+")":c;return u},brighten:function(a){var c,h=this.rgba;if(this.stops)this.stops.forEach(function(c){c.brighten(a)});else if(y(a)&&0!==a)for(c=0;3>c;c++)h[c]+=E(255*a),0>h[c]&&(h[c]=0),255<h[c]&&(h[c]=255);return this},setOpacity:function(a){this.rgba[3]=a;return this},tweenTo:function(a,c){var h=this.rgba,u=a.rgba;u.length&&h&&h.length?(a=1!==u[3]||1!==
-h[3],c=(a?"rgba(":"rgb(")+Math.round(u[0]+(h[0]-u[0])*(1-c))+","+Math.round(u[1]+(h[1]-u[1])*(1-c))+","+Math.round(u[2]+(h[2]-u[2])*(1-c))+(a?","+(u[3]+(h[3]-u[3])*(1-c)):"")+")"):c=a.input||"none";return c}};a.color=function(h){return new a.Color(h)}})(J);(function(a){var y,G,E=a.addEvent,h=a.animate,c=a.attr,r=a.charts,u=a.color,v=a.css,w=a.createElement,n=a.defined,g=a.deg2rad,d=a.destroyObjectProperties,m=a.doc,p=a.extend,b=a.erase,l=a.hasTouch,f=a.isArray,x=a.isFirefox,t=a.isMS,H=a.isObject,
-F=a.isString,z=a.isWebKit,k=a.merge,A=a.noop,D=a.objectEach,B=a.pick,e=a.pInt,q=a.removeEvent,L=a.splat,I=a.stop,R=a.svg,K=a.SVG_NS,M=a.symbolSizes,S=a.win;y=a.SVGElement=function(){return this};p(y.prototype,{opacity:1,SVG_NS:K,textProps:"direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline cursor".split(" "),init:function(a,e){this.element="span"===e?w(e):m.createElementNS(this.SVG_NS,e);this.renderer=a},animate:function(e,q,
-b){q=a.animObject(B(q,this.renderer.globalAnimation,!0));0!==q.duration?(b&&(q.complete=b),h(this,e,q)):(this.attr(e,null,b),q.step&&q.step.call(this));return this},complexColor:function(e,q,b){var C=this.renderer,l,d,p,g,A,K,m,N,x,c,t,I=[],L;a.fireEvent(this.renderer,"complexColor",{args:arguments},function(){e.radialGradient?d="radialGradient":e.linearGradient&&(d="linearGradient");d&&(p=e[d],A=C.gradients,m=e.stops,c=b.radialReference,f(p)&&(e[d]=p={x1:p[0],y1:p[1],x2:p[2],y2:p[3],gradientUnits:"userSpaceOnUse"}),
-"radialGradient"===d&&c&&!n(p.gradientUnits)&&(g=p,p=k(p,C.getRadialAttr(c,g),{gradientUnits:"userSpaceOnUse"})),D(p,function(a,e){"id"!==e&&I.push(e,a)}),D(m,function(a){I.push(a)}),I=I.join(","),A[I]?t=A[I].attr("id"):(p.id=t=a.uniqueKey(),A[I]=K=C.createElement(d).attr(p).add(C.defs),K.radAttr=g,K.stops=[],m.forEach(function(e){0===e[1].indexOf("rgba")?(l=a.color(e[1]),N=l.get("rgb"),x=l.get("a")):(N=e[1],x=1);e=C.createElement("stop").attr({offset:e[0],"stop-color":N,"stop-opacity":x}).add(K);
-K.stops.push(e)})),L="url("+C.url+"#"+t+")",b.setAttribute(q,L),b.gradient=I,e.toString=function(){return L})})},applyTextOutline:function(e){var C=this.element,q,f,k,l,d;-1!==e.indexOf("contrast")&&(e=e.replace(/contrast/g,this.renderer.getContrast(C.style.fill)));e=e.split(" ");f=e[e.length-1];if((k=e[0])&&"none"!==k&&a.svg){this.fakeTS=!0;e=[].slice.call(C.getElementsByTagName("tspan"));this.ySetter=this.xSetter;k=k.replace(/(^[\d\.]+)(.*?)$/g,function(a,e,C){return 2*e+C});for(d=e.length;d--;)q=
-e[d],"highcharts-text-outline"===q.getAttribute("class")&&b(e,C.removeChild(q));l=C.firstChild;e.forEach(function(a,e){0===e&&(a.setAttribute("x",C.getAttribute("x")),e=C.getAttribute("y"),a.setAttribute("y",e||0),null===e&&C.setAttribute("y",0));a=a.cloneNode(1);c(a,{"class":"highcharts-text-outline",fill:f,stroke:f,"stroke-width":k,"stroke-linejoin":"round"});C.insertBefore(a,l)})}},symbolCustomAttribs:"x y width height r start end innerR anchorX anchorY rounded".split(" "),attr:function(e,q,b,
-f){var C,k=this.element,l,d=this,p,g,A=this.symbolCustomAttribs;"string"===typeof e&&void 0!==q&&(C=e,e={},e[C]=q);"string"===typeof e?d=(this[e+"Getter"]||this._defaultGetter).call(this,e,k):(D(e,function(C,q){p=!1;f||I(this,q);this.symbolName&&-1!==a.inArray(q,A)&&(l||(this.symbolAttr(e),l=!0),p=!0);!this.rotation||"x"!==q&&"y"!==q||(this.doTransform=!0);p||(g=this[q+"Setter"]||this._defaultSetter,g.call(this,C,q,k),!this.styledMode&&this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(q)&&
-this.updateShadows(q,C,g))},this),this.afterSetters());b&&b.call(this);return d},afterSetters:function(){this.doTransform&&(this.updateTransform(),this.doTransform=!1)},updateShadows:function(a,e,q){for(var C=this.shadows,b=C.length;b--;)q.call(C[b],"height"===a?Math.max(e-(C[b].cutHeight||0),0):"d"===a?this.d:e,a,C[b])},addClass:function(a,e){var C=this.attr("class")||"";-1===C.indexOf(a)&&(e||(a=(C+(C?" ":"")+a).replace("  "," ")),this.attr("class",a));return this},hasClass:function(a){return-1!==
-(this.attr("class")||"").split(" ").indexOf(a)},removeClass:function(a){return this.attr("class",(this.attr("class")||"").replace(a,""))},symbolAttr:function(a){var e=this;"x y r start end width height innerR anchorX anchorY".split(" ").forEach(function(C){e[C]=B(a[C],e[C])});e.attr({d:e.renderer.symbols[e.symbolName](e.x,e.y,e.width,e.height,e)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":"none")},crisp:function(a,e){var C;e=e||a.strokeWidth||0;C=Math.round(e)%
-2/2;a.x=Math.floor(a.x||this.x||0)+C;a.y=Math.floor(a.y||this.y||0)+C;a.width=Math.floor((a.width||this.width||0)-2*C);a.height=Math.floor((a.height||this.height||0)-2*C);n(a.strokeWidth)&&(a.strokeWidth=e);return a},css:function(a){var C=this.styles,q={},b=this.element,k,f="",l,d=!C,g=["textOutline","textOverflow","width"];a&&a.color&&(a.fill=a.color);C&&D(a,function(a,e){a!==C[e]&&(q[e]=a,d=!0)});d&&(C&&(a=p(C,q)),a&&(null===a.width||"auto"===a.width?delete this.textWidth:"text"===b.nodeName.toLowerCase()&&
-a.width&&(k=this.textWidth=e(a.width))),this.styles=a,k&&!R&&this.renderer.forExport&&delete a.width,b.namespaceURI===this.SVG_NS?(l=function(a,e){return"-"+e.toLowerCase()},D(a,function(a,e){-1===g.indexOf(e)&&(f+=e.replace(/([A-Z])/g,l)+":"+a+";")}),f&&c(b,"style",f)):v(b,a),this.added&&("text"===this.element.nodeName&&this.renderer.buildText(this),a&&a.textOutline&&this.applyTextOutline(a.textOutline)));return this},getStyle:function(a){return S.getComputedStyle(this.element||this,"").getPropertyValue(a)},
-strokeWidth:function(){if(!this.renderer.styledMode)return this["stroke-width"]||0;var a=this.getStyle("stroke-width"),q;a.indexOf("px")===a.length-2?a=e(a):(q=m.createElementNS(K,"rect"),c(q,{width:a,"stroke-width":0}),this.element.parentNode.appendChild(q),a=q.getBBox().width,q.parentNode.removeChild(q));return a},on:function(a,e){var q=this,C=q.element;l&&"click"===a?(C.ontouchstart=function(a){q.touchEventFired=Date.now();a.preventDefault();e.call(C,a)},C.onclick=function(a){(-1===S.navigator.userAgent.indexOf("Android")||
-1100<Date.now()-(q.touchEventFired||0))&&e.call(C,a)}):C["on"+a]=e;return this},setRadialReference:function(a){var e=this.renderer.gradients[this.element.gradient];this.element.radialReference=a;e&&e.radAttr&&e.animate(this.renderer.getRadialAttr(a,e.radAttr));return this},translate:function(a,e){return this.attr({translateX:a,translateY:e})},invert:function(a){this.inverted=a;this.updateTransform();return this},updateTransform:function(){var a=this.translateX||0,e=this.translateY||0,q=this.scaleX,
-b=this.scaleY,f=this.inverted,k=this.rotation,l=this.matrix,d=this.element;f&&(a+=this.width,e+=this.height);a=["translate("+a+","+e+")"];n(l)&&a.push("matrix("+l.join(",")+")");f?a.push("rotate(90) scale(-1,1)"):k&&a.push("rotate("+k+" "+B(this.rotationOriginX,d.getAttribute("x"),0)+" "+B(this.rotationOriginY,d.getAttribute("y")||0)+")");(n(q)||n(b))&&a.push("scale("+B(q,1)+" "+B(b,1)+")");a.length&&d.setAttribute("transform",a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);
-return this},align:function(a,e,q){var C,f,k,l,d={};f=this.renderer;k=f.alignedObjects;var p,g;if(a){if(this.alignOptions=a,this.alignByTranslate=e,!q||F(q))this.alignTo=C=q||"renderer",b(k,this),k.push(this),q=null}else a=this.alignOptions,e=this.alignByTranslate,C=this.alignTo;q=B(q,f[C],f);C=a.align;f=a.verticalAlign;k=(q.x||0)+(a.x||0);l=(q.y||0)+(a.y||0);"right"===C?p=1:"center"===C&&(p=2);p&&(k+=(q.width-(a.width||0))/p);d[e?"translateX":"x"]=Math.round(k);"bottom"===f?g=1:"middle"===f&&(g=
-2);g&&(l+=(q.height-(a.height||0))/g);d[e?"translateY":"y"]=Math.round(l);this[this.placed?"animate":"attr"](d);this.placed=!0;this.alignAttr=d;return this},getBBox:function(a,e){var q,C=this.renderer,b,f=this.element,k=this.styles,l,d=this.textStr,A,K=C.cache,m=C.cacheKeys,x=f.namespaceURI===this.SVG_NS,c;e=B(e,this.rotation);b=e*g;l=C.styledMode?f&&y.prototype.getStyle.call(f,"font-size"):k&&k.fontSize;n(d)&&(c=d.toString(),-1===c.indexOf("\x3c")&&(c=c.replace(/[0-9]/g,"0")),c+=["",e||0,l,this.textWidth,
-k&&k.textOverflow].join());c&&!a&&(q=K[c]);if(!q){if(x||C.forExport){try{(A=this.fakeTS&&function(a){[].forEach.call(f.querySelectorAll(".highcharts-text-outline"),function(e){e.style.display=a})})&&A("none"),q=f.getBBox?p({},f.getBBox()):{width:f.offsetWidth,height:f.offsetHeight},A&&A("")}catch(W){}if(!q||0>q.width)q={width:0,height:0}}else q=this.htmlGetBBox();C.isSVG&&(a=q.width,C=q.height,x&&(q.height=C={"11px,17":14,"13px,20":16}[k&&k.fontSize+","+Math.round(C)]||C),e&&(q.width=Math.abs(C*Math.sin(b))+
-Math.abs(a*Math.cos(b)),q.height=Math.abs(C*Math.cos(b))+Math.abs(a*Math.sin(b))));if(c&&0<q.height){for(;250<m.length;)delete K[m.shift()];K[c]||m.push(c);K[c]=q}}return q},show:function(a){return this.attr({visibility:a?"inherit":"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var e=this;e.animate({opacity:0},{duration:a||150,complete:function(){e.attr({y:-9999})}})},add:function(a){var e=this.renderer,q=this.element,C;a&&(this.parentGroup=a);this.parentInverted=
-a&&a.inverted;void 0!==this.textStr&&e.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)C=this.zIndexSetter();C||(a?a.element:e.box).appendChild(q);if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var e=a.parentNode;e&&e.removeChild(a)},destroy:function(){var a=this,e=a.element||{},q=a.renderer,f=q.isSVG&&"SPAN"===e.nodeName&&a.parentGroup,k=e.ownerSVGElement,l=a.clipPath;e.onclick=e.onmouseout=e.onmouseover=e.onmousemove=e.point=null;I(a);l&&k&&([].forEach.call(k.querySelectorAll("[clip-path],[CLIP-PATH]"),
-function(a){var e=a.getAttribute("clip-path"),q=l.element.id;(-1<e.indexOf("(#"+q+")")||-1<e.indexOf('("#'+q+'")'))&&a.removeAttribute("clip-path")}),a.clipPath=l.destroy());if(a.stops){for(k=0;k<a.stops.length;k++)a.stops[k]=a.stops[k].destroy();a.stops=null}a.safeRemoveChild(e);for(q.styledMode||a.destroyShadows();f&&f.div&&0===f.div.childNodes.length;)e=f.parentGroup,a.safeRemoveChild(f.div),delete f.div,f=e;a.alignTo&&b(q.alignedObjects,a);D(a,function(e,q){delete a[q]});return null},shadow:function(a,
-e,q){var b=[],f,C,k=this.element,l,d,p,g;if(!a)this.destroyShadows();else if(!this.shadows){d=B(a.width,3);p=(a.opacity||.15)/d;g=this.parentInverted?"(-1,-1)":"("+B(a.offsetX,1)+", "+B(a.offsetY,1)+")";for(f=1;f<=d;f++)C=k.cloneNode(0),l=2*d+1-2*f,c(C,{stroke:a.color||"#000000","stroke-opacity":p*f,"stroke-width":l,transform:"translate"+g,fill:"none"}),C.setAttribute("class",(C.getAttribute("class")||"")+" highcharts-shadow"),q&&(c(C,"height",Math.max(c(C,"height")-l,0)),C.cutHeight=l),e?e.element.appendChild(C):
-k.parentNode&&k.parentNode.insertBefore(C,k),b.push(C);this.shadows=b}return this},destroyShadows:function(){(this.shadows||[]).forEach(function(a){this.safeRemoveChild(a)},this);this.shadows=void 0},xGetter:function(a){"circle"===this.element.nodeName&&("x"===a?a="cx":"y"===a&&(a="cy"));return this._defaultGetter(a)},_defaultGetter:function(a){a=B(this[a+"Value"],this[a],this.element?this.element.getAttribute(a):null,0);/^[\-0-9\.]+$/.test(a)&&(a=parseFloat(a));return a},dSetter:function(a,e,q){a&&
-a.join&&(a=a.join(" "));/(NaN| {2}|^$)/.test(a)&&(a="M 0 0");this[e]!==a&&(q.setAttribute(e,a),this[e]=a)},dashstyleSetter:function(a){var q,f=this["stroke-width"];"inherit"===f&&(f=1);if(a=a&&a.toLowerCase()){a=a.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(q=a.length;q--;)a[q]=e(a[q])*f;a=a.join(",").replace(/NaN/g,
-"none");this.element.setAttribute("stroke-dasharray",a)}},alignSetter:function(a){this.alignValue=a;this.element.setAttribute("text-anchor",{left:"start",center:"middle",right:"end"}[a])},opacitySetter:function(a,e,q){this[e]=a;q.setAttribute(e,a)},titleSetter:function(a){var e=this.element.getElementsByTagName("title")[0];e||(e=m.createElementNS(this.SVG_NS,"title"),this.element.appendChild(e));e.firstChild&&e.removeChild(e.firstChild);e.appendChild(m.createTextNode(String(B(a),"").replace(/<[^>]*>/g,
-"").replace(/&lt;/g,"\x3c").replace(/&gt;/g,"\x3e")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this))},fillSetter:function(a,e,q){"string"===typeof a?q.setAttribute(e,a):a&&this.complexColor(a,e,q)},visibilitySetter:function(a,e,q){"inherit"===a?q.removeAttribute(e):this[e]!==a&&q.setAttribute(e,a);this[e]=a},zIndexSetter:function(a,q){var f=this.renderer,b=this.parentGroup,k=(b||f).element||f.box,l,d=this.element,C,p,f=k===f.box;
-l=this.added;var g;n(a)?(d.setAttribute("data-z-index",a),a=+a,this[q]===a&&(l=!1)):n(this[q])&&d.removeAttribute("data-z-index");this[q]=a;if(l){(a=this.zIndex)&&b&&(b.handleZ=!0);q=k.childNodes;for(g=q.length-1;0<=g&&!C;g--)if(b=q[g],l=b.getAttribute("data-z-index"),p=!n(l),b!==d)if(0>a&&p&&!f&&!g)k.insertBefore(d,q[g]),C=!0;else if(e(l)<=a||p&&(!n(a)||0<=a))k.insertBefore(d,q[g+1]||null),C=!0;C||(k.insertBefore(d,q[f?3:0]||null),C=!0)}return C},_defaultSetter:function(a,e,q){q.setAttribute(e,a)}});
-y.prototype.yGetter=y.prototype.xGetter;y.prototype.translateXSetter=y.prototype.translateYSetter=y.prototype.rotationSetter=y.prototype.verticalAlignSetter=y.prototype.rotationOriginXSetter=y.prototype.rotationOriginYSetter=y.prototype.scaleXSetter=y.prototype.scaleYSetter=y.prototype.matrixSetter=function(a,e){this[e]=a;this.doTransform=!0};y.prototype["stroke-widthSetter"]=y.prototype.strokeSetter=function(a,e,q){this[e]=a;this.stroke&&this["stroke-width"]?(y.prototype.fillSetter.call(this,this.stroke,
-"stroke",q),q.setAttribute("stroke-width",this["stroke-width"]),this.hasStroke=!0):"stroke-width"===e&&0===a&&this.hasStroke&&(q.removeAttribute("stroke"),this.hasStroke=!1)};G=a.SVGRenderer=function(){this.init.apply(this,arguments)};p(G.prototype,{Element:y,SVG_NS:K,init:function(a,e,q,f,b,k,l){var d;d=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"});l||d.css(this.getStyle(f));f=d.element;a.appendChild(f);c(a,"dir","ltr");-1===a.innerHTML.indexOf("xmlns")&&c(f,"xmlns",this.SVG_NS);
-this.isSVG=!0;this.box=f;this.boxWrapper=d;this.alignedObjects=[];this.url=(x||z)&&m.getElementsByTagName("base").length?S.location.href.split("#")[0].replace(/<[^>]*>/g,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(m.createTextNode("Created with Highcharts 7.0.1"));this.defs=this.createElement("defs").add();this.allowHTML=k;this.forExport=b;this.styledMode=l;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(e,
-q,!1);var C;x&&a.getBoundingClientRect&&(e=function(){v(a,{left:0,top:0});C=a.getBoundingClientRect();v(a,{left:Math.ceil(C.left)-C.left+"px",top:Math.ceil(C.top)-C.top+"px"})},e(),this.unSubPixelFix=E(S,"resize",e))},definition:function(a){function e(a,f){var b;L(a).forEach(function(a){var k=q.createElement(a.tagName),l={};D(a,function(a,e){"tagName"!==e&&"children"!==e&&"textContent"!==e&&(l[e]=a)});k.attr(l);k.add(f||q.defs);a.textContent&&k.element.appendChild(m.createTextNode(a.textContent));
-e(a.children||[],k);b=k});return b}var q=this;return e(a)},getStyle:function(a){return this.style=p({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},setStyle:function(a){this.boxWrapper.css(this.getStyle(a))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();d(this.gradients||{});this.gradients=null;a&&(this.defs=a.destroy());this.unSubPixelFix&&
-this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var e=new this.Element;e.init(this,a);return e},draw:A,getRadialAttr:function(a,e){return{cx:a[0]-a[2]/2+e.cx*a[2],cy:a[1]-a[2]/2+e.cy*a[2],r:e.r*a[2]}},truncate:function(a,e,q,f,b,k,l){var d=this,p=a.rotation,C,g=f?1:0,A=(q||f).length,K=A,c=[],x=function(a){e.firstChild&&e.removeChild(e.firstChild);a&&e.appendChild(m.createTextNode(a))},n=function(k,p){p=p||k;if(void 0===c[p])if(e.getSubStringLength)try{c[p]=b+e.getSubStringLength(0,
-f?p+1:p)}catch(X){}else d.getSpanWidth&&(x(l(q||f,k)),c[p]=b+d.getSpanWidth(a,e));return c[p]},t,I;a.rotation=0;t=n(e.textContent.length);if(I=b+t>k){for(;g<=A;)K=Math.ceil((g+A)/2),f&&(C=l(f,K)),t=n(K,C&&C.length-1),g===A?g=A+1:t>k?A=K-1:g=K;0===A?x(""):q&&A===q.length-1||x(C||l(q||f,K))}f&&f.splice(0,K);a.actualWidth=t;a.rotation=p;return I},escapes:{"\x26":"\x26amp;","\x3c":"\x26lt;","\x3e":"\x26gt;","'":"\x26#39;",'"':"\x26quot;"},buildText:function(a){var q=a.element,f=this,k=f.forExport,b=B(a.textStr,
-"").toString(),l=-1!==b.indexOf("\x3c"),d=q.childNodes,p,g=c(q,"x"),C=a.styles,A=a.textWidth,x=C&&C.lineHeight,n=C&&C.textOutline,t=C&&"ellipsis"===C.textOverflow,I=C&&"nowrap"===C.whiteSpace,L=C&&C.fontSize,z,H,h=d.length,C=A&&!a.added&&this.box,F=function(a){var b;f.styledMode||(b=/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:L||f.style.fontSize||12);return x?e(x):f.fontMetrics(b,a.getAttribute("style")?a:q).h},M=function(a,e){D(f.escapes,function(q,f){e&&-1!==e.indexOf(q)||(a=a.toString().replace(new RegExp(q,
-"g"),f))});return a},w=function(a,e){var q;q=a.indexOf("\x3c");a=a.substring(q,a.indexOf("\x3e")-q);q=a.indexOf(e+"\x3d");if(-1!==q&&(q=q+e.length+1,e=a.charAt(q),'"'===e||"'"===e))return a=a.substring(q+1),a.substring(0,a.indexOf(e))};z=[b,t,I,x,n,L,A].join();if(z!==a.textCache){for(a.textCache=z;h--;)q.removeChild(d[h]);l||n||t||A||-1!==b.indexOf(" ")?(C&&C.appendChild(q),l?(b=f.styledMode?b.replace(/<(b|strong)>/g,'\x3cspan class\x3d"highcharts-strong"\x3e').replace(/<(i|em)>/g,'\x3cspan class\x3d"highcharts-emphasized"\x3e'):
-b.replace(/<(b|strong)>/g,'\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g,'\x3cspan style\x3d"font-style:italic"\x3e'),b=b.replace(/<a/g,"\x3cspan").replace(/<\/(b|strong|i|em|a)>/g,"\x3c/span\x3e").split(/<br.*?>/g)):b=[b],b=b.filter(function(a){return""!==a}),b.forEach(function(e,b){var l,d=0,C=0;e=e.replace(/^\s+|\s+$/g,"").replace(/<span/g,"|||\x3cspan").replace(/<\/span>/g,"\x3c/span\x3e|||");l=e.split("|||");l.forEach(function(e){if(""!==e||1===l.length){var x={},n=m.createElementNS(f.SVG_NS,
-"tspan"),D,B;(D=w(e,"class"))&&c(n,"class",D);if(D=w(e,"style"))D=D.replace(/(;| |^)color([ :])/,"$1fill$2"),c(n,"style",D);(B=w(e,"href"))&&!k&&(c(n,"onclick",'location.href\x3d"'+B+'"'),c(n,"class","highcharts-anchor"),f.styledMode||v(n,{cursor:"pointer"}));e=M(e.replace(/<[a-zA-Z\/](.|\n)*?>/g,"")||" ");if(" "!==e){n.appendChild(m.createTextNode(e));d?x.dx=0:b&&null!==g&&(x.x=g);c(n,x);q.appendChild(n);!d&&H&&(!R&&k&&v(n,{display:"block"}),c(n,"dy",F(n)));if(A){var z=e.replace(/([^\^])-/g,"$1- ").split(" "),
-x=!I&&(1<l.length||b||1<z.length);B=0;var h=F(n);if(t)p=f.truncate(a,n,e,void 0,0,Math.max(0,A-parseInt(L||12,10)),function(a,e){return a.substring(0,e)+"\u2026"});else if(x)for(;z.length;)z.length&&!I&&0<B&&(n=m.createElementNS(K,"tspan"),c(n,{dy:h,x:g}),D&&c(n,"style",D),n.appendChild(m.createTextNode(z.join(" ").replace(/- /g,"-"))),q.appendChild(n)),f.truncate(a,n,null,z,0===B?C:0,A,function(a,e){return z.slice(0,e).join(" ").replace(/- /g,"-")}),C=a.actualWidth,B++}d++}}});H=H||q.childNodes.length}),
-t&&p&&a.attr("title",M(a.textStr,["\x26lt;","\x26gt;"])),C&&C.removeChild(q),n&&a.applyTextOutline&&a.applyTextOutline(n)):q.appendChild(m.createTextNode(M(b)))}},getContrast:function(a){a=u(a).rgba;a[0]*=1;a[1]*=1.2;a[2]*=.5;return 459<a[0]+a[1]+a[2]?"#000000":"#FFFFFF"},button:function(a,e,q,f,b,l,d,g,A){var C=this.label(a,e,q,A,null,null,null,null,"button"),K=0,n=this.styledMode;C.attr(k({padding:8,r:2},b));if(!n){var m,x,c,I;b=k({fill:"#f7f7f7",stroke:"#cccccc","stroke-width":1,style:{color:"#333333",
-cursor:"pointer",fontWeight:"normal"}},b);m=b.style;delete b.style;l=k(b,{fill:"#e6e6e6"},l);x=l.style;delete l.style;d=k(b,{fill:"#e6ebf5",style:{color:"#000000",fontWeight:"bold"}},d);c=d.style;delete d.style;g=k(b,{style:{color:"#cccccc"}},g);I=g.style;delete g.style}E(C.element,t?"mouseover":"mouseenter",function(){3!==K&&C.setState(1)});E(C.element,t?"mouseout":"mouseleave",function(){3!==K&&C.setState(K)});C.setState=function(a){1!==a&&(C.state=K=a);C.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-"+
-["normal","hover","pressed","disabled"][a||0]);n||C.attr([b,l,d,g][a||0]).css([m,x,c,I][a||0])};n||C.attr(b).css(p({cursor:"default"},m));return C.on("click",function(a){3!==K&&f.call(C,a)})},crispLine:function(a,e){a[1]===a[4]&&(a[1]=a[4]=Math.round(a[1])-e%2/2);a[2]===a[5]&&(a[2]=a[5]=Math.round(a[2])+e%2/2);return a},path:function(a){var e=this.styledMode?{}:{fill:"none"};f(a)?e.d=a:H(a)&&p(e,a);return this.createElement("path").attr(e)},circle:function(a,e,q){a=H(a)?a:void 0===a?{}:{x:a,y:e,r:q};
-e=this.createElement("circle");e.xSetter=e.ySetter=function(a,e,q){q.setAttribute("c"+e,a)};return e.attr(a)},arc:function(a,e,q,b,f,k){H(a)?(b=a,e=b.y,q=b.r,a=b.x):b={innerR:b,start:f,end:k};a=this.symbol("arc",a,e,q,q,b);a.r=q;return a},rect:function(a,e,q,b,f,k){f=H(a)?a.r:f;var l=this.createElement("rect");a=H(a)?a:void 0===a?{}:{x:a,y:e,width:Math.max(q,0),height:Math.max(b,0)};this.styledMode||(void 0!==k&&(a.strokeWidth=k,a=l.crisp(a)),a.fill="none");f&&(a.r=f);l.rSetter=function(a,e,q){c(q,
-{rx:a,ry:a})};return l.attr(a)},setSize:function(a,e,q){var b=this.alignedObjects,f=b.length;this.width=a;this.height=e;for(this.boxWrapper.animate({width:a,height:e},{step:function(){this.attr({viewBox:"0 0 "+this.attr("width")+" "+this.attr("height")})},duration:B(q,!0)?void 0:0});f--;)b[f].align()},g:function(a){var e=this.createElement("g");return a?e.attr({"class":"highcharts-"+a}):e},image:function(a,e,q,b,f,k){var l={preserveAspectRatio:"none"},d,g=function(a,e){a.setAttributeNS?a.setAttributeNS("http://www.w3.org/1999/xlink",
-"href",e):a.setAttribute("hc-svg-href",e)},A=function(e){g(d.element,a);k.call(d,e)};1<arguments.length&&p(l,{x:e,y:q,width:b,height:f});d=this.createElement("image").attr(l);k?(g(d.element,"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw\x3d\x3d"),l=new S.Image,E(l,"load",A),l.src=a,l.complete&&A({})):g(d.element,a);return d},symbol:function(a,e,q,b,f,k){var l=this,d,g=/^url\((.*?)\)$/,A=g.test(a),K=!A&&(this.symbols[a]?a:"circle"),C=K&&this.symbols[K],x=n(e)&&C&&C.call(this.symbols,
-Math.round(e),Math.round(q),b,f,k),c,t;C?(d=this.path(x),l.styledMode||d.attr("fill","none"),p(d,{symbolName:K,x:e,y:q,width:b,height:f}),k&&p(d,k)):A&&(c=a.match(g)[1],d=this.image(c),d.imgwidth=B(M[c]&&M[c].width,k&&k.width),d.imgheight=B(M[c]&&M[c].height,k&&k.height),t=function(){d.attr({width:d.width,height:d.height})},["width","height"].forEach(function(a){d[a+"Setter"]=function(a,e){var q={},b=this["img"+e],f="width"===e?"translateX":"translateY";this[e]=a;n(b)&&(this.element&&this.element.setAttribute(e,
-b),this.alignByTranslate||(q[f]=((this[e]||0)-b)/2,this.attr(q)))}}),n(e)&&d.attr({x:e,y:q}),d.isImg=!0,n(d.imgwidth)&&n(d.imgheight)?t():(d.attr({width:0,height:0}),w("img",{onload:function(){var a=r[l.chartIndex];0===this.width&&(v(this,{position:"absolute",top:"-999em"}),m.body.appendChild(this));M[c]={width:this.width,height:this.height};d.imgwidth=this.width;d.imgheight=this.height;d.element&&t();this.parentNode&&this.parentNode.removeChild(this);l.imgCount--;if(!l.imgCount&&a&&a.onload)a.onload()},
-src:c}),this.imgCount++));return d},symbols:{circle:function(a,e,q,b){return this.arc(a+q/2,e+b/2,q/2,b/2,{start:0,end:2*Math.PI,open:!1})},square:function(a,e,q,b){return["M",a,e,"L",a+q,e,a+q,e+b,a,e+b,"Z"]},triangle:function(a,e,q,b){return["M",a+q/2,e,"L",a+q,e+b,a,e+b,"Z"]},"triangle-down":function(a,e,q,b){return["M",a,e,"L",a+q,e,a+q/2,e+b,"Z"]},diamond:function(a,e,q,b){return["M",a+q/2,e,"L",a+q,e+b/2,a+q/2,e+b,a,e+b/2,"Z"]},arc:function(a,e,q,b,f){var k=f.start,d=f.r||q,l=f.r||b||q,p=f.end-
-.001;q=f.innerR;b=B(f.open,.001>Math.abs(f.end-f.start-2*Math.PI));var g=Math.cos(k),A=Math.sin(k),K=Math.cos(p),p=Math.sin(p);f=.001>f.end-k-Math.PI?0:1;d=["M",a+d*g,e+l*A,"A",d,l,0,f,1,a+d*K,e+l*p];n(q)&&d.push(b?"M":"L",a+q*K,e+q*p,"A",q,q,0,f,0,a+q*g,e+q*A);d.push(b?"":"Z");return d},callout:function(a,e,q,b,f){var k=Math.min(f&&f.r||0,q,b),d=k+6,l=f&&f.anchorX;f=f&&f.anchorY;var p;p=["M",a+k,e,"L",a+q-k,e,"C",a+q,e,a+q,e,a+q,e+k,"L",a+q,e+b-k,"C",a+q,e+b,a+q,e+b,a+q-k,e+b,"L",a+k,e+b,"C",a,e+
-b,a,e+b,a,e+b-k,"L",a,e+k,"C",a,e,a,e,a+k,e];l&&l>q?f>e+d&&f<e+b-d?p.splice(13,3,"L",a+q,f-6,a+q+6,f,a+q,f+6,a+q,e+b-k):p.splice(13,3,"L",a+q,b/2,l,f,a+q,b/2,a+q,e+b-k):l&&0>l?f>e+d&&f<e+b-d?p.splice(33,3,"L",a,f+6,a-6,f,a,f-6,a,e+k):p.splice(33,3,"L",a,b/2,l,f,a,b/2,a,e+k):f&&f>b&&l>a+d&&l<a+q-d?p.splice(23,3,"L",l+6,e+b,l,e+b+6,l-6,e+b,a+k,e+b):f&&0>f&&l>a+d&&l<a+q-d&&p.splice(3,3,"L",l-6,e,l,e-6,l+6,e,q-k,e);return p}},clipRect:function(e,q,b,f){var k=a.uniqueKey(),l=this.createElement("clipPath").attr({id:k}).add(this.defs);
-e=this.rect(e,q,b,f,0).add(l);e.id=k;e.clipPath=l;e.count=0;return e},text:function(a,e,q,b){var f={};if(b&&(this.allowHTML||!this.forExport))return this.html(a,e,q);f.x=Math.round(e||0);q&&(f.y=Math.round(q));n(a)&&(f.text=a);a=this.createElement("text").attr(f);b||(a.xSetter=function(a,e,q){var b=q.getElementsByTagName("tspan"),f,k=q.getAttribute(e),l;for(l=0;l<b.length;l++)f=b[l],f.getAttribute(e)===k&&f.setAttribute(e,a);q.setAttribute(e,a)});return a},fontMetrics:function(a,q){a=this.styledMode?
-q&&y.prototype.getStyle.call(q,"font-size"):a||q&&q.style&&q.style.fontSize||this.style&&this.style.fontSize;a=/px/.test(a)?e(a):/em/.test(a)?parseFloat(a)*(q?this.fontMetrics(null,q.parentNode).f:16):12;q=24>a?a+3:Math.round(1.2*a);return{h:q,b:Math.round(.8*q),f:a}},rotCorr:function(a,e,q){var b=a;e&&q&&(b=Math.max(b*Math.cos(e*g),4));return{x:-a/3*Math.sin(e*g),y:b}},label:function(e,b,f,l,d,g,A,K,c){var m=this,x=m.styledMode,t=m.g("button"!==c&&"label"),I=t.text=m.text("",0,0,A).attr({zIndex:1}),
-D,L,C=0,B=3,z=0,H,h,F,M,R,w={},r,u,S=/^url\((.*?)\)$/.test(l),v=x||S,N=function(){return x?D.strokeWidth()%2/2:(r?parseInt(r,10):0)%2/2},P,T,E;c&&t.addClass("highcharts-"+c);P=function(){var a=I.element.style,e={};L=(void 0===H||void 0===h||R)&&n(I.textStr)&&I.getBBox();t.width=(H||L.width||0)+2*B+z;t.height=(h||L.height||0)+2*B;u=B+Math.min(m.fontMetrics(a&&a.fontSize,I).b,L?L.height:Infinity);v&&(D||(t.box=D=m.symbols[l]||S?m.symbol(l):m.rect(),D.addClass(("button"===c?"":"highcharts-label-box")+
-(c?" highcharts-"+c+"-box":"")),D.add(t),a=N(),e.x=a,e.y=(K?-u:0)+a),e.width=Math.round(t.width),e.height=Math.round(t.height),D.attr(p(e,w)),w={})};T=function(){var a=z+B,e;e=K?0:u;n(H)&&L&&("center"===R||"right"===R)&&(a+={center:.5,right:1}[R]*(H-L.width));if(a!==I.x||e!==I.y)I.attr("x",a),I.hasBoxWidthChanged&&(L=I.getBBox(!0),P()),void 0!==e&&I.attr("y",e);I.x=a;I.y=e};E=function(a,e){D?D.attr(a,e):w[a]=e};t.onAdd=function(){I.add(t);t.attr({text:e||0===e?e:"",x:b,y:f});D&&n(d)&&t.attr({anchorX:d,
-anchorY:g})};t.widthSetter=function(e){H=a.isNumber(e)?e:null};t.heightSetter=function(a){h=a};t["text-alignSetter"]=function(a){R=a};t.paddingSetter=function(a){n(a)&&a!==B&&(B=t.padding=a,T())};t.paddingLeftSetter=function(a){n(a)&&a!==z&&(z=a,T())};t.alignSetter=function(a){a={left:0,center:.5,right:1}[a];a!==C&&(C=a,L&&t.attr({x:F}))};t.textSetter=function(a){void 0!==a&&I.textSetter(a);P();T()};t["stroke-widthSetter"]=function(a,e){a&&(v=!0);r=this["stroke-width"]=a;E(e,a)};x?t.rSetter=function(a,
-e){E(e,a)}:t.strokeSetter=t.fillSetter=t.rSetter=function(a,e){"r"!==e&&("fill"===e&&a&&(v=!0),t[e]=a);E(e,a)};t.anchorXSetter=function(a,e){d=t.anchorX=a;E(e,Math.round(a)-N()-F)};t.anchorYSetter=function(a,e){g=t.anchorY=a;E(e,a-M)};t.xSetter=function(a){t.x=a;C&&(a-=C*((H||L.width)+2*B),t["forceAnimate:x"]=!0);F=Math.round(a);t.attr("translateX",F)};t.ySetter=function(a){M=t.y=Math.round(a);t.attr("translateY",M)};var Q=t.css;A={css:function(a){if(a){var e={};a=k(a);t.textProps.forEach(function(q){void 0!==
-a[q]&&(e[q]=a[q],delete a[q])});I.css(e);"width"in e&&P();"fontSize"in e&&(P(),T())}return Q.call(t,a)},getBBox:function(){return{width:L.width+2*B,height:L.height+2*B,x:L.x-B,y:L.y-B}},destroy:function(){q(t.element,"mouseenter");q(t.element,"mouseleave");I&&(I=I.destroy());D&&(D=D.destroy());y.prototype.destroy.call(t);t=m=P=T=E=null}};x||(A.shadow=function(a){a&&(P(),D&&D.shadow(a));return t});return p(t,A)}});a.Renderer=G})(J);(function(a){var y=a.attr,G=a.createElement,E=a.css,h=a.defined,c=
-a.extend,r=a.isFirefox,u=a.isMS,v=a.isWebKit,w=a.pick,n=a.pInt,g=a.SVGRenderer,d=a.win,m=a.wrap;c(a.SVGElement.prototype,{htmlCss:function(a){var b="SPAN"===this.element.tagName&&a&&"width"in a,l=w(b&&a.width,void 0),f;b&&(delete a.width,this.textWidth=l,f=!0);a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=c(this.styles,a);E(this.element,a);f&&this.htmlUpdateTransform();return this},htmlGetBBox:function(){var a=this.element;return{x:a.offsetLeft,y:a.offsetTop,
-width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,l=this.translateX||0,f=this.translateY||0,d=this.x||0,g=this.y||0,m=this.textAlign||"left",c={left:0,center:.5,right:1}[m],z=this.styles,k=z&&z.whiteSpace;E(b,{marginLeft:l,marginTop:f});!a.styledMode&&this.shadows&&this.shadows.forEach(function(a){E(a,{marginLeft:l+1,marginTop:f+1})});this.inverted&&b.childNodes.forEach(function(e){a.invertChild(e,b)});if("SPAN"===b.tagName){var z=
-this.rotation,A=this.textWidth&&n(this.textWidth),D=[z,m,b.innerHTML,this.textWidth,this.textAlign].join(),B;(B=A!==this.oldTextWidth)&&!(B=A>this.oldTextWidth)&&((B=this.textPxLength)||(E(b,{width:"",whiteSpace:k||"nowrap"}),B=b.offsetWidth),B=B>A);B&&(/[ \-]/.test(b.textContent||b.innerText)||"ellipsis"===b.style.textOverflow)?(E(b,{width:A+"px",display:"block",whiteSpace:k||"normal"}),this.oldTextWidth=A,this.hasBoxWidthChanged=!0):this.hasBoxWidthChanged=!1;D!==this.cTT&&(k=a.fontMetrics(b.style.fontSize,
-b).b,!h(z)||z===(this.oldRotation||0)&&m===this.oldAlign||this.setSpanRotation(z,c,k),this.getSpanCorrection(!h(z)&&this.textPxLength||b.offsetWidth,k,c,z,m));E(b,{left:d+(this.xCorr||0)+"px",top:g+(this.yCorr||0)+"px"});this.cTT=D;this.oldRotation=z;this.oldAlign=m}}else this.alignOnAdd=!0},setSpanRotation:function(a,b,l){var f={},d=this.renderer.getTransformKey();f[d]=f.transform="rotate("+a+"deg)";f[d+(r?"Origin":"-origin")]=f.transformOrigin=100*b+"% "+l+"px";E(this.element,f)},getSpanCorrection:function(a,
-b,l){this.xCorr=-a*l;this.yCorr=-b}});c(g.prototype,{getTransformKey:function(){return u&&!/Edge/.test(d.navigator.userAgent)?"-ms-transform":v?"-webkit-transform":r?"MozTransform":d.opera?"-o-transform":""},html:function(d,b,l){var f=this.createElement("span"),g=f.element,p=f.renderer,n=p.isSVG,h=function(a,b){["opacity","visibility"].forEach(function(f){m(a,f+"Setter",function(a,e,q,f){a.call(this,e,q,f);b[q]=e})});a.addedSetters=!0},z=a.charts[p.chartIndex],z=z&&z.styledMode;f.textSetter=function(a){a!==
-g.innerHTML&&delete this.bBox;this.textStr=a;g.innerHTML=w(a,"");f.doTransform=!0};n&&h(f,f.element.style);f.xSetter=f.ySetter=f.alignSetter=f.rotationSetter=function(a,b){"align"===b&&(b="textAlign");f[b]=a;f.doTransform=!0};f.afterSetters=function(){this.doTransform&&(this.htmlUpdateTransform(),this.doTransform=!1)};f.attr({text:d,x:Math.round(b),y:Math.round(l)}).css({position:"absolute"});z||f.css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});g.style.whiteSpace="nowrap";f.css=
-f.htmlCss;n&&(f.add=function(a){var b,l=p.box.parentNode,k=[];if(this.parentGroup=a){if(b=a.div,!b){for(;a;)k.push(a),a=a.parentGroup;k.reverse().forEach(function(a){function e(e,q){a[q]=e;"translateX"===q?d.left=e+"px":d.top=e+"px";a.doTransform=!0}var d,g=y(a.element,"class");g&&(g={className:g});b=a.div=a.div||G("div",g,{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},b||l);d=b.style;
-c(a,{classSetter:function(a){return function(e){this.element.setAttribute("class",e);a.className=e}}(b),on:function(){k[0].div&&f.on.apply({element:k[0].div},arguments);return a},translateXSetter:e,translateYSetter:e});a.addedSetters||h(a,d)})}}else b=l;b.appendChild(g);f.added=!0;f.alignOnAdd&&f.htmlUpdateTransform();return f});return f}})})(J);(function(a){var y=a.defined,G=a.extend,E=a.merge,h=a.pick,c=a.timeUnits,r=a.win;a.Time=function(a){this.update(a,!1)};a.Time.prototype={defaultOptions:{},
-update:function(a){var c=h(a&&a.useUTC,!0),w=this;this.options=a=E(!0,this.options||{},a);this.Date=a.Date||r.Date;this.timezoneOffset=(this.useUTC=c)&&a.timezoneOffset;this.getTimezoneOffset=this.timezoneOffsetFunction();(this.variableTimezone=!(c&&!a.getTimezoneOffset&&!a.timezone))||this.timezoneOffset?(this.get=function(a,g){var d=g.getTime(),m=d-w.getTimezoneOffset(g);g.setTime(m);a=g["getUTC"+a]();g.setTime(d);return a},this.set=function(a,g,d){var m;if("Milliseconds"===a||"Seconds"===a||"Minutes"===
-a&&0===g.getTimezoneOffset()%60)g["set"+a](d);else m=w.getTimezoneOffset(g),m=g.getTime()-m,g.setTime(m),g["setUTC"+a](d),a=w.getTimezoneOffset(g),m=g.getTime()+a,g.setTime(m)}):c?(this.get=function(a,g){return g["getUTC"+a]()},this.set=function(a,g,d){return g["setUTC"+a](d)}):(this.get=function(a,g){return g["get"+a]()},this.set=function(a,g,d){return g["set"+a](d)})},makeTime:function(c,r,w,n,g,d){var m,p,b;this.useUTC?(m=this.Date.UTC.apply(0,arguments),p=this.getTimezoneOffset(m),m+=p,b=this.getTimezoneOffset(m),
-p!==b?m+=b-p:p-36E5!==this.getTimezoneOffset(m-36E5)||a.isSafari||(m-=36E5)):m=(new this.Date(c,r,h(w,1),h(n,0),h(g,0),h(d,0))).getTime();return m},timezoneOffsetFunction:function(){var c=this,h=this.options,w=r.moment;if(!this.useUTC)return function(a){return 6E4*(new Date(a)).getTimezoneOffset()};if(h.timezone){if(w)return function(a){return 6E4*-w.tz(a,h.timezone).utcOffset()};a.error(25)}return this.useUTC&&h.getTimezoneOffset?function(a){return 6E4*h.getTimezoneOffset(a)}:function(){return 6E4*
-(c.timezoneOffset||0)}},dateFormat:function(c,h,w){if(!a.defined(h)||isNaN(h))return a.defaultOptions.lang.invalidDate||"";c=a.pick(c,"%Y-%m-%d %H:%M:%S");var n=this,g=new this.Date(h),d=this.get("Hours",g),m=this.get("Day",g),p=this.get("Date",g),b=this.get("Month",g),l=this.get("FullYear",g),f=a.defaultOptions.lang,x=f.weekdays,t=f.shortWeekdays,H=a.pad,g=a.extend({a:t?t[m]:x[m].substr(0,3),A:x[m],d:H(p),e:H(p,2," "),w:m,b:f.shortMonths[b],B:f.months[b],m:H(b+1),o:b+1,y:l.toString().substr(2,2),
-Y:l,H:H(d),k:d,I:H(d%12||12),l:d%12||12,M:H(n.get("Minutes",g)),p:12>d?"AM":"PM",P:12>d?"am":"pm",S:H(g.getSeconds()),L:H(Math.floor(h%1E3),3)},a.dateFormats);a.objectEach(g,function(a,b){for(;-1!==c.indexOf("%"+b);)c=c.replace("%"+b,"function"===typeof a?a.call(n,h):a)});return w?c.substr(0,1).toUpperCase()+c.substr(1):c},resolveDTLFormat:function(c){return a.isObject(c,!0)?c:(c=a.splat(c),{main:c[0],from:c[1],to:c[2]})},getTimeTicks:function(a,r,w,n){var g=this,d=[],m,p={},b;m=new g.Date(r);var l=
-a.unitRange,f=a.count||1,x;n=h(n,1);if(y(r)){g.set("Milliseconds",m,l>=c.second?0:f*Math.floor(g.get("Milliseconds",m)/f));l>=c.second&&g.set("Seconds",m,l>=c.minute?0:f*Math.floor(g.get("Seconds",m)/f));l>=c.minute&&g.set("Minutes",m,l>=c.hour?0:f*Math.floor(g.get("Minutes",m)/f));l>=c.hour&&g.set("Hours",m,l>=c.day?0:f*Math.floor(g.get("Hours",m)/f));l>=c.day&&g.set("Date",m,l>=c.month?1:Math.max(1,f*Math.floor(g.get("Date",m)/f)));l>=c.month&&(g.set("Month",m,l>=c.year?0:f*Math.floor(g.get("Month",
-m)/f)),b=g.get("FullYear",m));l>=c.year&&g.set("FullYear",m,b-b%f);l===c.week&&(b=g.get("Day",m),g.set("Date",m,g.get("Date",m)-b+n+(b<n?-7:0)));b=g.get("FullYear",m);n=g.get("Month",m);var t=g.get("Date",m),H=g.get("Hours",m);r=m.getTime();g.variableTimezone&&(x=w-r>4*c.month||g.getTimezoneOffset(r)!==g.getTimezoneOffset(w));r=m.getTime();for(m=1;r<w;)d.push(r),r=l===c.year?g.makeTime(b+m*f,0):l===c.month?g.makeTime(b,n+m*f):!x||l!==c.day&&l!==c.week?x&&l===c.hour&&1<f?g.makeTime(b,n,t,H+m*f):r+
-l*f:g.makeTime(b,n,t+m*f*(l===c.day?1:7)),m++;d.push(r);l<=c.hour&&1E4>d.length&&d.forEach(function(a){0===a%18E5&&"000000000"===g.dateFormat("%H%M%S%L",a)&&(p[a]="day")})}d.info=G(a,{higherRanks:p,totalRange:l*f});return d}}})(J);(function(a){var y=a.color,G=a.merge;a.defaultOptions={colors:"#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "),symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January February March April May June July August September October November December".split(" "),
-shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),weekdays:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),decimalPoint:".",numericSymbols:"kMGTPE".split(""),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{},time:a.Time.prototype.defaultOptions,chart:{styledMode:!1,borderRadius:0,colorCount:10,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:6},position:{align:"right",
-x:-10,y:10}},width:null,height:null,borderColor:"#335cad",backgroundColor:"#ffffff",plotBorderColor:"#cccccc"},title:{text:"Chart title",align:"center",margin:15,widthAdjust:-44},subtitle:{text:"",align:"center",widthAdjust:-44},plotOptions:{},labels:{style:{position:"absolute",color:"#333333"}},legend:{enabled:!0,align:"center",alignColumns:!0,layout:"horizontal",labelFormatter:function(){return this.name},borderColor:"#999999",borderRadius:0,navigation:{activeColor:"#003399",inactiveColor:"#cccccc"},
-itemStyle:{color:"#333333",cursor:"pointer",fontSize:"12px",fontWeight:"bold",textOverflow:"ellipsis"},itemHoverStyle:{color:"#000000"},itemHiddenStyle:{color:"#cccccc"},shadow:!1,itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},squareSymbol:!0,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:"#ffffff",opacity:.5,textAlign:"center"}},tooltip:{enabled:!0,
-animation:a.svg,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},footerFormat:"",padding:8,snap:a.isTouchDevice?25:10,headerFormat:'\x3cspan style\x3d"font-size: 10px"\x3e{point.key}\x3c/span\x3e\x3cbr/\x3e',pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e',
-backgroundColor:y("#f7f7f7").setOpacity(.85).get(),borderWidth:1,shadow:!0,style:{color:"#333333",cursor:"default",fontSize:"12px",pointerEvents:"none",whiteSpace:"nowrap"}},credits:{enabled:!0,href:"https://www.highcharts.com?credits",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#999999",fontSize:"9px"},text:"Highcharts.com"}};a.setOptions=function(y){a.defaultOptions=G(!0,a.defaultOptions,y);a.time.update(G(a.defaultOptions.global,a.defaultOptions.time),
-!1);return a.defaultOptions};a.getOptions=function(){return a.defaultOptions};a.defaultPlotOptions=a.defaultOptions.plotOptions;a.time=new a.Time(G(a.defaultOptions.global,a.defaultOptions.time));a.dateFormat=function(y,h,c){return a.time.dateFormat(y,h,c)}})(J);(function(a){var y=a.correctFloat,G=a.defined,E=a.destroyObjectProperties,h=a.fireEvent,c=a.isNumber,r=a.merge,u=a.pick,v=a.deg2rad;a.Tick=function(a,c,g,d,m){this.axis=a;this.pos=c;this.type=g||"";this.isNewLabel=this.isNew=!0;this.parameters=
-m||{};this.tickmarkOffset=this.parameters.tickmarkOffset;this.options=this.parameters.options;g||d||this.addLabel()};a.Tick.prototype={addLabel:function(){var c=this,n=c.axis,g=n.options,d=n.chart,m=n.categories,p=n.names,b=c.pos,l=u(c.options&&c.options.labels,g.labels),f=n.tickPositions,x=b===f[0],t=b===f[f.length-1],m=this.parameters.category||(m?u(m[b],p[b],b):b),h=c.label,f=f.info,F,z,k,A;n.isDatetimeAxis&&f&&(z=d.time.resolveDTLFormat(g.dateTimeLabelFormats[!g.grid&&f.higherRanks[b]||f.unitName]),
-F=z.main);c.isFirst=x;c.isLast=t;c.formatCtx={axis:n,chart:d,isFirst:x,isLast:t,dateTimeLabelFormat:F,tickPositionInfo:f,value:n.isLog?y(n.lin2log(m)):m,pos:b};g=n.labelFormatter.call(c.formatCtx,this.formatCtx);if(A=z&&z.list)c.shortenLabel=function(){for(k=0;k<A.length;k++)if(h.attr({text:n.labelFormatter.call(a.extend(c.formatCtx,{dateTimeLabelFormat:A[k]}))}),h.getBBox().width<n.getSlotWidth(c)-2*u(l.padding,5))return;h.attr({text:""})};if(G(h))h&&h.textStr!==g&&(!h.textWidth||l.style&&l.style.width||
-h.styles.width||h.css({width:null}),h.attr({text:g}));else{if(c.label=h=G(g)&&l.enabled?d.renderer.text(g,0,0,l.useHTML).add(n.labelGroup):null)d.styledMode||h.css(r(l.style)),h.textPxLength=h.getBBox().width;c.rotation=0}},getLabelSize:function(){return this.label?this.label.getBBox()[this.axis.horiz?"height":"width"]:0},handleOverflow:function(a){var c=this.axis,g=c.options.labels,d=a.x,m=c.chart.chartWidth,p=c.chart.spacing,b=u(c.labelLeft,Math.min(c.pos,p[3])),p=u(c.labelRight,Math.max(c.isRadial?
-0:c.pos+c.len,m-p[1])),l=this.label,f=this.rotation,x={left:0,center:.5,right:1}[c.labelAlign||l.attr("align")],t=l.getBBox().width,h=c.getSlotWidth(this),F=h,z=1,k,A={};if(f||"justify"!==u(g.overflow,"justify"))0>f&&d-x*t<b?k=Math.round(d/Math.cos(f*v)-b):0<f&&d+x*t>p&&(k=Math.round((m-d)/Math.cos(f*v)));else if(m=d+(1-x)*t,d-x*t<b?F=a.x+F*(1-x)-b:m>p&&(F=p-a.x+F*x,z=-1),F=Math.min(h,F),F<h&&"center"===c.labelAlign&&(a.x+=z*(h-F-x*(h-Math.min(t,F)))),t>F||c.autoRotation&&(l.styles||{}).width)k=F;
-k&&(this.shortenLabel?this.shortenLabel():(A.width=Math.floor(k),(g.style||{}).textOverflow||(A.textOverflow="ellipsis"),l.css(A)))},getPosition:function(c,n,g,d){var m=this.axis,p=m.chart,b=d&&p.oldChartHeight||p.chartHeight;c={x:c?a.correctFloat(m.translate(n+g,null,null,d)+m.transB):m.left+m.offset+(m.opposite?(d&&p.oldChartWidth||p.chartWidth)-m.right-m.left:0),y:c?b-m.bottom+m.offset-(m.opposite?m.height:0):a.correctFloat(b-m.translate(n+g,null,null,d)-m.transB)};h(this,"afterGetPosition",{pos:c});
-return c},getLabelPosition:function(a,c,g,d,m,p,b,l){var f=this.axis,x=f.transA,t=f.reversed,n=f.staggerLines,F=f.tickRotCorr||{x:0,y:0},z=m.y,k=d||f.reserveSpaceDefault?0:-f.labelOffset*("center"===f.labelAlign?.5:1),A={};G(z)||(z=0===f.side?g.rotation?-8:-g.getBBox().height:2===f.side?F.y+8:Math.cos(g.rotation*v)*(F.y-g.getBBox(!1,0).height/2));a=a+m.x+k+F.x-(p&&d?p*x*(t?-1:1):0);c=c+z-(p&&!d?p*x*(t?1:-1):0);n&&(g=b/(l||1)%n,f.opposite&&(g=n-g-1),c+=f.labelOffset/n*g);A.x=a;A.y=Math.round(c);h(this,
-"afterGetLabelPosition",{pos:A});return A},getMarkPath:function(a,c,g,d,m,p){return p.crispLine(["M",a,c,"L",a+(m?0:-g),c+(m?g:0)],d)},renderGridLine:function(a,c,g){var d=this.axis,m=d.options,p=this.gridLine,b={},l=this.pos,f=this.type,x=u(this.tickmarkOffset,d.tickmarkOffset),t=d.chart.renderer,n=f?f+"Grid":"grid",h=m[n+"LineWidth"],z=m[n+"LineColor"],m=m[n+"LineDashStyle"];p||(d.chart.styledMode||(b.stroke=z,b["stroke-width"]=h,m&&(b.dashstyle=m)),f||(b.zIndex=1),a&&(c=0),this.gridLine=p=t.path().attr(b).addClass("highcharts-"+
-(f?f+"-":"")+"grid-line").add(d.gridGroup));if(p&&(g=d.getPlotLinePath(l+x,p.strokeWidth()*g,a,"pass")))p[a||this.isNew?"attr":"animate"]({d:g,opacity:c})},renderMark:function(a,c,g){var d=this.axis,m=d.options,p=d.chart.renderer,b=this.type,l=b?b+"Tick":"tick",f=d.tickSize(l),x=this.mark,t=!x,n=a.x;a=a.y;var h=u(m[l+"Width"],!b&&d.isXAxis?1:0),m=m[l+"Color"];f&&(d.opposite&&(f[0]=-f[0]),t&&(this.mark=x=p.path().addClass("highcharts-"+(b?b+"-":"")+"tick").add(d.axisGroup),d.chart.styledMode||x.attr({stroke:m,
-"stroke-width":h})),x[t?"attr":"animate"]({d:this.getMarkPath(n,a,f[0],x.strokeWidth()*g,d.horiz,p),opacity:c}))},renderLabel:function(a,n,g,d){var m=this.axis,p=m.horiz,b=m.options,l=this.label,f=b.labels,x=f.step,m=u(this.tickmarkOffset,m.tickmarkOffset),t=!0,h=a.x;a=a.y;l&&c(h)&&(l.xy=a=this.getLabelPosition(h,a,l,p,f,m,d,x),this.isFirst&&!this.isLast&&!u(b.showFirstLabel,1)||this.isLast&&!this.isFirst&&!u(b.showLastLabel,1)?t=!1:!p||f.step||f.rotation||n||0===g||this.handleOverflow(a),x&&d%x&&
-(t=!1),t&&c(a.y)?(a.opacity=g,l[this.isNewLabel?"attr":"animate"](a),this.isNewLabel=!1):(l.attr("y",-9999),this.isNewLabel=!0))},render:function(c,n,g){var d=this.axis,m=d.horiz,p=this.pos,b=u(this.tickmarkOffset,d.tickmarkOffset),p=this.getPosition(m,p,b,n),b=p.x,l=p.y,d=m&&b===d.pos+d.len||!m&&l===d.pos?-1:1;g=u(g,1);this.isActive=!0;this.renderGridLine(n,g,d);this.renderMark(p,g,d);this.renderLabel(p,n,g,c);this.isNew=!1;a.fireEvent(this,"afterRender")},destroy:function(){E(this,this.axis)}}})(J);
-var V=function(a){var y=a.addEvent,G=a.animObject,E=a.arrayMax,h=a.arrayMin,c=a.color,r=a.correctFloat,u=a.defaultOptions,v=a.defined,w=a.deg2rad,n=a.destroyObjectProperties,g=a.extend,d=a.fireEvent,m=a.format,p=a.getMagnitude,b=a.isArray,l=a.isNumber,f=a.isString,x=a.merge,t=a.normalizeTickInterval,H=a.objectEach,F=a.pick,z=a.removeEvent,k=a.splat,A=a.syncTimeout,D=a.Tick,B=function(){this.init.apply(this,arguments)};a.extend(B.prototype,{defaultOptions:{dateTimeLabelFormats:{millisecond:{main:"%H:%M:%S.%L",
-range:!1},second:{main:"%H:%M:%S",range:!1},minute:{main:"%H:%M",range:!1},hour:{main:"%H:%M",range:!1},day:{main:"%e. %b"},week:{main:"%e. %b"},month:{main:"%b '%y"},year:{main:"%Y"}},endOnTick:!1,labels:{enabled:!0,indentation:10,x:0,style:{color:"#666666",cursor:"default",fontSize:"11px"}},maxPadding:.01,minorTickLength:2,minorTickPosition:"outside",minPadding:.01,startOfWeek:1,startOnTick:!1,tickLength:10,tickPixelInterval:100,tickmarkPlacement:"between",tickPosition:"outside",title:{align:"middle",
-style:{color:"#666666"}},type:"linear",minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#ccd6eb",lineWidth:1,gridLineColor:"#e6e6e6",tickColor:"#ccd6eb"},defaultYAxisOptions:{endOnTick:!0,maxPadding:.05,minPadding:.05,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{allowOverlap:!1,enabled:!1,formatter:function(){return a.numberFormat(this.total,-1)},style:{color:"#000000",fontSize:"11px",fontWeight:"bold",
-textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15},title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},init:function(a,q){var e=q.isX,b=this;b.chart=a;b.horiz=a.inverted&&!b.isZAxis?!e:e;b.isXAxis=e;b.coll=b.coll||(e?"xAxis":"yAxis");d(this,"init",{userOptions:q});b.opposite=
-q.opposite;b.side=q.side||(b.horiz?b.opposite?0:2:b.opposite?1:3);b.setOptions(q);var f=this.options,l=f.type;b.labelFormatter=f.labels.formatter||b.defaultLabelFormatter;b.userOptions=q;b.minPixelPadding=0;b.reversed=f.reversed;b.visible=!1!==f.visible;b.zoomEnabled=!1!==f.zoomEnabled;b.hasNames="category"===l||!0===f.categories;b.categories=f.categories||b.hasNames;b.names||(b.names=[],b.names.keys={});b.plotLinesAndBandsGroups={};b.isLog="logarithmic"===l;b.isDatetimeAxis="datetime"===l;b.positiveValuesOnly=
-b.isLog&&!b.allowNegativeLog;b.isLinked=v(f.linkedTo);b.ticks={};b.labelEdge=[];b.minorTicks={};b.plotLinesAndBands=[];b.alternateBands={};b.len=0;b.minRange=b.userMinRange=f.minRange||f.maxZoom;b.range=f.range;b.offset=f.offset||0;b.stacks={};b.oldStacks={};b.stacksTouched=0;b.max=null;b.min=null;b.crosshair=F(f.crosshair,k(a.options.tooltip.crosshairs)[e?0:1],!1);q=b.options.events;-1===a.axes.indexOf(b)&&(e?a.axes.splice(a.xAxis.length,0,b):a.axes.push(b),a[b.coll].push(b));b.series=b.series||
-[];a.inverted&&!b.isZAxis&&e&&void 0===b.reversed&&(b.reversed=!0);H(q,function(a,e){y(b,e,a)});b.lin2log=f.linearToLogConverter||b.lin2log;b.isLog&&(b.val2lin=b.log2lin,b.lin2val=b.lin2log);d(this,"afterInit")},setOptions:function(a){this.options=x(this.defaultOptions,"yAxis"===this.coll&&this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],x(u[this.coll],a));d(this,"afterSetOptions",{userOptions:a})},
-defaultLabelFormatter:function(){var e=this.axis,q=this.value,b=e.chart.time,f=e.categories,l=this.dateTimeLabelFormat,k=u.lang,d=k.numericSymbols,k=k.numericSymbolMagnitude||1E3,g=d&&d.length,c,p=e.options.labels.format,e=e.isLog?Math.abs(q):e.tickInterval;if(p)c=m(p,this,b);else if(f)c=q;else if(l)c=b.dateFormat(l,q);else if(g&&1E3<=e)for(;g--&&void 0===c;)b=Math.pow(k,g+1),e>=b&&0===10*q%b&&null!==d[g]&&0!==q&&(c=a.numberFormat(q/b,-1)+d[g]);void 0===c&&(c=1E4<=Math.abs(q)?a.numberFormat(q,-1):
-a.numberFormat(q,-1,void 0,""));return c},getSeriesExtremes:function(){var a=this,q=a.chart;d(this,"getSeriesExtremes",null,function(){a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();a.series.forEach(function(e){if(e.visible||!q.options.chart.ignoreHiddenSeries){var b=e.options,f=b.threshold,k;a.hasVisibleSeries=!0;a.positiveValuesOnly&&0>=f&&(f=null);if(a.isXAxis)b=e.xData,b.length&&(e=h(b),k=E(b),l(e)||e instanceof Date||(b=b.filter(l),
-e=h(b),k=E(b)),b.length&&(a.dataMin=Math.min(F(a.dataMin,b[0],e),e),a.dataMax=Math.max(F(a.dataMax,b[0],k),k)));else if(e.getExtremes(),k=e.dataMax,e=e.dataMin,v(e)&&v(k)&&(a.dataMin=Math.min(F(a.dataMin,e),e),a.dataMax=Math.max(F(a.dataMax,k),k)),v(f)&&(a.threshold=f),!b.softThreshold||a.positiveValuesOnly)a.softThreshold=!1}})});d(this,"afterGetSeriesExtremes")},translate:function(a,q,b,f,k,d){var e=this.linkedParent||this,c=1,g=0,p=f?e.oldTransA:e.transA;f=f?e.oldMin:e.min;var A=e.minPixelPadding;
-k=(e.isOrdinal||e.isBroken||e.isLog&&k)&&e.lin2val;p||(p=e.transA);b&&(c*=-1,g=e.len);e.reversed&&(c*=-1,g-=c*(e.sector||e.len));q?(a=(a*c+g-A)/p+f,k&&(a=e.lin2val(a))):(k&&(a=e.val2lin(a)),a=l(f)?c*(a-f)*p+g+c*A+(l(d)?p*d:0):void 0);return a},toPixels:function(a,q){return this.translate(a,!1,!this.horiz,null,!0)+(q?0:this.pos)},toValue:function(a,q){return this.translate(a-(q?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,q,b,f,k){var e=this.chart,d=this.left,c=this.top,g,p,A=b&&
-e.oldChartHeight||e.chartHeight,t=b&&e.oldChartWidth||e.chartWidth,m;g=this.transB;var x=function(a,e,q){if("pass"!==f&&a<e||a>q)f?a=Math.min(Math.max(e,a),q):m=!0;return a};k=F(k,this.translate(a,null,null,b));k=Math.min(Math.max(-1E5,k),1E5);a=b=Math.round(k+g);g=p=Math.round(A-k-g);l(k)?this.horiz?(g=c,p=A-this.bottom,a=b=x(a,d,d+this.width)):(a=d,b=t-this.right,g=p=x(g,c,c+this.height)):(m=!0,f=!1);return m&&!f?null:e.renderer.crispLine(["M",a,g,"L",b,p],q||1)},getLinearTickPositions:function(a,
-q,b){var e,f=r(Math.floor(q/a)*a);b=r(Math.ceil(b/a)*a);var k=[],d;r(f+a)===f&&(d=20);if(this.single)return[q];for(q=f;q<=b;){k.push(q);q=r(q+a,d);if(q===e)break;e=q}return k},getMinorTickInterval:function(){var a=this.options;return!0===a.minorTicks?F(a.minorTickInterval,"auto"):!1===a.minorTicks?null:a.minorTickInterval},getMinorTickPositions:function(){var a=this,q=a.options,b=a.tickPositions,f=a.minorTickInterval,k=[],d=a.pointRangePadding||0,l=a.min-d,d=a.max+d,g=d-l;if(g&&g/f<a.len/3)if(a.isLog)this.paddedTicks.forEach(function(e,
-q,b){q&&k.push.apply(k,a.getLogTickPositions(f,b[q-1],b[q],!0))});else if(a.isDatetimeAxis&&"auto"===this.getMinorTickInterval())k=k.concat(a.getTimeTicks(a.normalizeTimeTickInterval(f),l,d,q.startOfWeek));else for(q=l+(b[0]-l)%f;q<=d&&q!==k[0];q+=f)k.push(q);0!==k.length&&a.trimTicks(k);return k},adjustForMinRange:function(){var a=this.options,q=this.min,b=this.max,f,k,d,l,g,c,p,A;this.isXAxis&&void 0===this.minRange&&!this.isLog&&(v(a.min)||v(a.max)?this.minRange=null:(this.series.forEach(function(a){c=
-a.xData;for(l=p=a.xIncrement?1:c.length-1;0<l;l--)if(g=c[l]-c[l-1],void 0===d||g<d)d=g}),this.minRange=Math.min(5*d,this.dataMax-this.dataMin)));b-q<this.minRange&&(k=this.dataMax-this.dataMin>=this.minRange,A=this.minRange,f=(A-b+q)/2,f=[q-f,F(a.min,q-f)],k&&(f[2]=this.isLog?this.log2lin(this.dataMin):this.dataMin),q=E(f),b=[q+A,F(a.max,q+A)],k&&(b[2]=this.isLog?this.log2lin(this.dataMax):this.dataMax),b=h(b),b-q<A&&(f[0]=b-A,f[1]=F(a.min,b-A),q=E(f)));this.min=q;this.max=b},getClosest:function(){var a;
-this.categories?a=1:this.series.forEach(function(e){var q=e.closestPointRange,b=e.visible||!e.chart.options.chart.ignoreHiddenSeries;!e.noSharedTooltip&&v(q)&&b&&(a=v(a)?Math.min(a,q):q)});return a},nameToX:function(a){var e=b(this.categories),f=e?this.categories:this.names,k=a.options.x,d;a.series.requireSorting=!1;v(k)||(k=!1===this.options.uniqueNames?a.series.autoIncrement():e?f.indexOf(a.name):F(f.keys[a.name],-1));-1===k?e||(d=f.length):d=k;void 0!==d&&(this.names[d]=a.name,this.names.keys[a.name]=
-d);return d},updateNames:function(){var a=this,q=this.names;0<q.length&&(Object.keys(q.keys).forEach(function(a){delete q.keys[a]}),q.length=0,this.minRange=this.userMinRange,(this.series||[]).forEach(function(e){e.xIncrement=null;if(!e.points||e.isDirtyData)a.max=Math.max(a.max,e.xData.length-1),e.processData(),e.generatePoints();e.data.forEach(function(q,b){var f;q&&q.options&&void 0!==q.name&&(f=a.nameToX(q),void 0!==f&&f!==q.x&&(q.x=f,e.xData[b]=f))})}))},setAxisTranslation:function(a){var e=
-this,b=e.max-e.min,k=e.axisPointRange||0,l,g=0,c=0,p=e.linkedParent,A=!!e.categories,t=e.transA,m=e.isXAxis;if(m||A||k)l=e.getClosest(),p?(g=p.minPointOffset,c=p.pointRangePadding):e.series.forEach(function(a){var b=A?1:m?F(a.options.pointRange,l,0):e.axisPointRange||0;a=a.options.pointPlacement;k=Math.max(k,b);e.single||(g=Math.max(g,f(a)?0:b/2),c=Math.max(c,"on"===a?0:b))}),p=e.ordinalSlope&&l?e.ordinalSlope/l:1,e.minPointOffset=g*=p,e.pointRangePadding=c*=p,e.pointRange=Math.min(k,b),m&&(e.closestPointRange=
-l);a&&(e.oldTransA=t);e.translationSlope=e.transA=t=e.staticScale||e.len/(b+c||1);e.transB=e.horiz?e.left:e.bottom;e.minPixelPadding=t*g;d(this,"afterSetAxisTranslation")},minFromRange:function(){return this.max-this.range},setTickInterval:function(e){var b=this,f=b.chart,k=b.options,g=b.isLog,c=b.isDatetimeAxis,A=b.isXAxis,m=b.isLinked,x=k.maxPadding,n=k.minPadding,D,h=k.tickInterval,B=k.tickPixelInterval,z=b.categories,H=l(b.threshold)?b.threshold:null,w=b.softThreshold,u,y,E;c||z||m||this.getTickAmount();
-y=F(b.userMin,k.min);E=F(b.userMax,k.max);m?(b.linkedParent=f[b.coll][k.linkedTo],D=b.linkedParent.getExtremes(),b.min=F(D.min,D.dataMin),b.max=F(D.max,D.dataMax),k.type!==b.linkedParent.options.type&&a.error(11,1,f)):(!w&&v(H)&&(b.dataMin>=H?(D=H,n=0):b.dataMax<=H&&(u=H,x=0)),b.min=F(y,D,b.dataMin),b.max=F(E,u,b.dataMax));g&&(b.positiveValuesOnly&&!e&&0>=Math.min(b.min,F(b.dataMin,b.min))&&a.error(10,1,f),b.min=r(b.log2lin(b.min),15),b.max=r(b.log2lin(b.max),15));b.range&&v(b.max)&&(b.userMin=b.min=
-y=Math.max(b.dataMin,b.minFromRange()),b.userMax=E=b.max,b.range=null);d(b,"foundExtremes");b.beforePadding&&b.beforePadding();b.adjustForMinRange();!(z||b.axisPointRange||b.usePercentage||m)&&v(b.min)&&v(b.max)&&(f=b.max-b.min)&&(!v(y)&&n&&(b.min-=f*n),!v(E)&&x&&(b.max+=f*x));l(k.softMin)&&!l(b.userMin)&&(b.min=Math.min(b.min,k.softMin));l(k.softMax)&&!l(b.userMax)&&(b.max=Math.max(b.max,k.softMax));l(k.floor)&&(b.min=Math.min(Math.max(b.min,k.floor),Number.MAX_VALUE));l(k.ceiling)&&(b.max=Math.max(Math.min(b.max,
-k.ceiling),F(b.userMax,-Number.MAX_VALUE)));w&&v(b.dataMin)&&(H=H||0,!v(y)&&b.min<H&&b.dataMin>=H?b.min=H:!v(E)&&b.max>H&&b.dataMax<=H&&(b.max=H));b.tickInterval=b.min===b.max||void 0===b.min||void 0===b.max?1:m&&!h&&B===b.linkedParent.options.tickPixelInterval?h=b.linkedParent.tickInterval:F(h,this.tickAmount?(b.max-b.min)/Math.max(this.tickAmount-1,1):void 0,z?1:(b.max-b.min)*B/Math.max(b.len,B));A&&!e&&b.series.forEach(function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);
-b.beforeSetTickPositions&&b.beforeSetTickPositions();b.postProcessTickInterval&&(b.tickInterval=b.postProcessTickInterval(b.tickInterval));b.pointRange&&!h&&(b.tickInterval=Math.max(b.pointRange,b.tickInterval));e=F(k.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);!h&&b.tickInterval<e&&(b.tickInterval=e);c||g||h||(b.tickInterval=t(b.tickInterval,null,p(b.tickInterval),F(k.allowDecimals,!(.5<b.tickInterval&&5>b.tickInterval&&1E3<b.max&&9999>b.max)),!!this.tickAmount));this.tickAmount||(b.tickInterval=
-b.unsquish());this.setTickPositions()},setTickPositions:function(){var e=this.options,b,f=e.tickPositions;b=this.getMinorTickInterval();var k=e.tickPositioner,l=e.startOnTick,g=e.endOnTick;this.tickmarkOffset=this.categories&&"between"===e.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===b&&this.tickInterval?this.tickInterval/5:b;this.single=this.min===this.max&&v(this.min)&&!this.tickAmount&&(parseInt(this.min,10)===this.min||!1!==e.allowDecimals);this.tickPositions=
-b=f&&f.slice();!b&&(!this.ordinalPositions&&(this.max-this.min)/this.tickInterval>Math.max(2*this.len,200)?(b=[this.min,this.max],a.error(19,!1,this.chart)):b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,e.units),this.min,this.max,e.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],
-b.pop()],b[0]===b[1]&&(b.length=1)),this.tickPositions=b,k&&(k=k.apply(this,[this.min,this.max])))&&(this.tickPositions=b=k);this.paddedTicks=b.slice(0);this.trimTicks(b,l,g);this.isLinked||(this.single&&2>b.length&&(this.min-=.5,this.max+=.5),f||k||this.adjustTickAmount());d(this,"afterSetTickPositions")},trimTicks:function(a,b,f){var e=a[0],k=a[a.length-1],q=this.minPointOffset||0;if(!this.isLinked){if(b&&-Infinity!==e)this.min=e;else for(;this.min-q>a[0];)a.shift();if(f)this.max=k;else for(;this.max+
-q<a[a.length-1];)a.pop();0===a.length&&v(e)&&!this.options.tickPositions&&a.push((k+e)/2)}},alignToOthers:function(){var a={},b,f=this.options;!1===this.chart.options.chart.alignTicks||!1===f.alignTicks||!1===f.startOnTick||!1===f.endOnTick||this.isLog||this.chart[this.coll].forEach(function(e){var f=e.options,f=[e.horiz?f.left:f.top,f.width,f.height,f.pane].join();e.series.length&&(a[f]?b=!0:a[f]=1)});return b},getTickAmount:function(){var a=this.options,b=a.tickAmount,f=a.tickPixelInterval;!v(a.tickInterval)&&
-this.len<f&&!this.isRadial&&!this.isLog&&a.startOnTick&&a.endOnTick&&(b=2);!b&&this.alignToOthers()&&(b=Math.ceil(this.len/f)+1);4>b&&(this.finalTickAmt=b,b=5);this.tickAmount=b},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,f=this.tickAmount,k=this.finalTickAmt,d=b&&b.length,l=F(this.threshold,this.softThreshold?0:null);if(this.hasData()){if(d<f){for(;b.length<f;)b.length%2||this.min===l?b.push(r(b[b.length-1]+a)):b.unshift(r(b[0]-a));this.transA*=(d-1)/(f-1);this.min=
-b[0];this.max=b[b.length-1]}else d>f&&(this.tickInterval*=2,this.setTickPositions());if(v(k)){for(a=f=b.length;a--;)(3===k&&1===a%2||2>=k&&0<a&&a<f-1)&&b.splice(a,1);this.finalTickAmt=void 0}}},setScale:function(){var a,b;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();b=this.len!==this.oldAxisLength;this.series.forEach(function(e){if(e.isDirtyData||e.isDirty||e.xAxis.isDirty)a=!0});b||a||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==
-this.oldUserMax||this.alignToOthers()?(this.resetStacks&&this.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.oldUserMin=this.userMin,this.oldUserMax=this.userMax,this.isDirty||(this.isDirty=b||this.min!==this.oldMin||this.max!==this.oldMax)):this.cleanStacks&&this.cleanStacks();d(this,"afterSetScale")},setExtremes:function(a,b,f,k,l){var e=this,q=e.chart;f=F(f,!0);e.series.forEach(function(a){delete a.kdTree});l=g(l,{min:a,max:b});d(e,"setExtremes",l,function(){e.userMin=
-a;e.userMax=b;e.eventArgs=l;f&&q.redraw(k)})},zoom:function(a,b){var e=this.dataMin,f=this.dataMax,k=this.options,d=Math.min(e,F(k.min,e)),k=Math.max(f,F(k.max,f));if(a!==this.min||b!==this.max)this.allowZoomOutside||(v(e)&&(a<d&&(a=d),a>k&&(a=k)),v(f)&&(b<d&&(b=d),b>k&&(b=k))),this.displayBtn=void 0!==a||void 0!==b,this.setExtremes(a,b,!1,void 0,{trigger:"zoom"});return!0},setAxisSize:function(){var e=this.chart,b=this.options,f=b.offsets||[0,0,0,0],k=this.horiz,d=this.width=Math.round(a.relativeLength(F(b.width,
-e.plotWidth-f[3]+f[1]),e.plotWidth)),l=this.height=Math.round(a.relativeLength(F(b.height,e.plotHeight-f[0]+f[2]),e.plotHeight)),g=this.top=Math.round(a.relativeLength(F(b.top,e.plotTop+f[0]),e.plotHeight,e.plotTop)),b=this.left=Math.round(a.relativeLength(F(b.left,e.plotLeft+f[3]),e.plotWidth,e.plotLeft));this.bottom=e.chartHeight-l-g;this.right=e.chartWidth-d-b;this.len=Math.max(k?d:l,0);this.pos=k?b:g},getExtremes:function(){var a=this.isLog;return{min:a?r(this.lin2log(this.min)):this.min,max:a?
-r(this.lin2log(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var e=this.isLog,b=e?this.lin2log(this.min):this.min,e=e?this.lin2log(this.max):this.max;null===a||-Infinity===a?a=b:Infinity===a?a=e:b>a?a=b:e<a&&(a=e);return this.translate(a,0,1,0,1)},autoLabelAlign:function(a){a=(F(a,0)-90*this.side+720)%360;return 15<a&&165>a?"right":195<a&&345>a?"left":"center"},tickSize:function(a){var e=this.options,b=e[a+"Length"],
-f=F(e[a+"Width"],"tick"===a&&this.isXAxis?1:0);if(f&&b)return"inside"===e[a+"Position"]&&(b=-b),[b,f]},labelMetrics:function(){var a=this.tickPositions&&this.tickPositions[0]||0;return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize,this.ticks[a]&&this.ticks[a].label)},unsquish:function(){var a=this.options.labels,b=this.horiz,f=this.tickInterval,k=f,d=this.len/(((this.categories?1:0)+this.max-this.min)/f),l,g=a.rotation,c=this.labelMetrics(),p,A=Number.MAX_VALUE,
-t,m=function(a){a/=d||1;a=1<a?Math.ceil(a):1;return r(a*f)};b?(t=!a.staggerLines&&!a.step&&(v(g)?[g]:d<F(a.autoRotationLimit,80)&&a.autoRotation))&&t.forEach(function(a){var b;if(a===g||a&&-90<=a&&90>=a)p=m(Math.abs(c.h/Math.sin(w*a))),b=p+Math.abs(a/360),b<A&&(A=b,l=a,k=p)}):a.step||(k=m(c.h));this.autoRotation=t;this.labelRotation=F(l,g);return k},getSlotWidth:function(a){var b=this.chart,e=this.horiz,f=this.options.labels,k=Math.max(this.tickPositions.length-(this.categories?0:1),1),d=b.margin[3];
-return a&&a.slotWidth||e&&2>(f.step||0)&&!f.rotation&&(this.staggerLines||1)*this.len/k||!e&&(f.style&&parseInt(f.style.width,10)||d&&d-b.spacing[3]||.33*b.chartWidth)},renderUnsquish:function(){var a=this.chart,b=a.renderer,k=this.tickPositions,d=this.ticks,l=this.options.labels,g=l&&l.style||{},c=this.horiz,p=this.getSlotWidth(),A=Math.max(1,Math.round(p-2*(l.padding||5))),t={},m=this.labelMetrics(),x=l.style&&l.style.textOverflow,n,D,h=0,B;f(l.rotation)||(t.rotation=l.rotation||0);k.forEach(function(a){(a=
-d[a])&&a.label&&a.label.textPxLength>h&&(h=a.label.textPxLength)});this.maxLabelLength=h;if(this.autoRotation)h>A&&h>m.h?t.rotation=this.labelRotation:this.labelRotation=0;else if(p&&(n=A,!x))for(D="clip",A=k.length;!c&&A--;)if(B=k[A],B=d[B].label)B.styles&&"ellipsis"===B.styles.textOverflow?B.css({textOverflow:"clip"}):B.textPxLength>p&&B.css({width:p+"px"}),B.getBBox().height>this.len/k.length-(m.h-m.f)&&(B.specificTextOverflow="ellipsis");t.rotation&&(n=h>.5*a.chartHeight?.33*a.chartHeight:h,x||
-(D="ellipsis"));if(this.labelAlign=l.align||this.autoLabelAlign(this.labelRotation))t.align=this.labelAlign;k.forEach(function(a){var b=(a=d[a])&&a.label,e=g.width,f={};b&&(b.attr(t),a.shortenLabel?a.shortenLabel():n&&!e&&"nowrap"!==g.whiteSpace&&(n<b.textPxLength||"SPAN"===b.element.tagName)?(f.width=n,x||(f.textOverflow=b.specificTextOverflow||D),b.css(f)):b.styles&&b.styles.width&&!f.width&&!e&&b.css({width:null}),delete b.specificTextOverflow,a.rotation=t.rotation)},this);this.tickRotCorr=b.rotCorr(m.b,
-this.labelRotation||0,0!==this.side)},hasData:function(){return this.hasVisibleSeries||v(this.min)&&v(this.max)&&this.tickPositions&&0<this.tickPositions.length},addTitle:function(a){var b=this.chart.renderer,e=this.horiz,f=this.opposite,k=this.options.title,d,l=this.chart.styledMode;this.axisTitle||((d=k.textAlign)||(d=(e?{low:"left",middle:"center",high:"right"}:{low:f?"right":"left",middle:"center",high:f?"left":"right"})[k.align]),this.axisTitle=b.text(k.text,0,0,k.useHTML).attr({zIndex:7,rotation:k.rotation||
-0,align:d}).addClass("highcharts-axis-title"),l||this.axisTitle.css(x(k.style)),this.axisTitle.add(this.axisGroup),this.axisTitle.isNew=!0);l||k.style.width||this.isRadial||this.axisTitle.css({width:this.len});this.axisTitle[a?"show":"hide"](!0)},generateTick:function(a){var b=this.ticks;b[a]?b[a].addLabel():b[a]=new D(this,a)},getOffset:function(){var a=this,b=a.chart,f=b.renderer,k=a.options,l=a.tickPositions,g=a.ticks,c=a.horiz,p=a.side,A=b.inverted&&!a.isZAxis?[1,0,3,2][p]:p,t,m,x=0,n,D=0,h=k.title,
-B=k.labels,z=0,r=b.axisOffset,b=b.clipOffset,w=[-1,1,1,-1][p],u=k.className,y=a.axisParent;t=a.hasData();a.showAxis=m=t||F(k.showEmpty,!0);a.staggerLines=a.horiz&&B.staggerLines;a.axisGroup||(a.gridGroup=f.g("grid").attr({zIndex:k.gridZIndex||1}).addClass("highcharts-"+this.coll.toLowerCase()+"-grid "+(u||"")).add(y),a.axisGroup=f.g("axis").attr({zIndex:k.zIndex||2}).addClass("highcharts-"+this.coll.toLowerCase()+" "+(u||"")).add(y),a.labelGroup=f.g("axis-labels").attr({zIndex:B.zIndex||7}).addClass("highcharts-"+
-a.coll.toLowerCase()+"-labels "+(u||"")).add(y));t||a.isLinked?(l.forEach(function(b,e){a.generateTick(b,e)}),a.renderUnsquish(),a.reserveSpaceDefault=0===p||2===p||{1:"left",3:"right"}[p]===a.labelAlign,F(B.reserveSpace,"center"===a.labelAlign?!0:null,a.reserveSpaceDefault)&&l.forEach(function(a){z=Math.max(g[a].getLabelSize(),z)}),a.staggerLines&&(z*=a.staggerLines),a.labelOffset=z*(a.opposite?-1:1)):H(g,function(a,b){a.destroy();delete g[b]});h&&h.text&&!1!==h.enabled&&(a.addTitle(m),m&&!1!==h.reserveSpace&&
-(a.titleOffset=x=a.axisTitle.getBBox()[c?"height":"width"],n=h.offset,D=v(n)?0:F(h.margin,c?5:10)));a.renderLine();a.offset=w*F(k.offset,r[p]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};f=0===p?-a.labelMetrics().h:2===p?a.tickRotCorr.y:0;D=Math.abs(z)+D;z&&(D=D-f+w*(c?F(B.y,a.tickRotCorr.y+8*w):B.x));a.axisTitleMargin=F(n,D);a.getMaxLabelDimensions&&(a.maxLabelDimensions=a.getMaxLabelDimensions(g,l));c=this.tickSize("tick");r[p]=Math.max(r[p],a.axisTitleMargin+x+w*a.offset,D,t&&l.length&&c?c[0]+w*a.offset:
-0);k=k.offset?0:2*Math.floor(a.axisLine.strokeWidth()/2);b[A]=Math.max(b[A],k);d(this,"afterGetOffset")},getLinePath:function(a){var b=this.chart,e=this.opposite,f=this.offset,k=this.horiz,d=this.left+(e?this.width:0)+f,f=b.chartHeight-this.bottom-(e?this.height:0)+f;e&&(a*=-1);return b.renderer.crispLine(["M",k?this.left:d,k?f:this.top,"L",k?b.chartWidth-this.right:d,k?f:b.chartHeight-this.bottom],a)},renderLine:function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),
-this.chart.styledMode||this.axisLine.attr({stroke:this.options.lineColor,"stroke-width":this.options.lineWidth,zIndex:7}))},getTitlePosition:function(){var a=this.horiz,b=this.left,f=this.top,k=this.len,d=this.options.title,l=a?b:f,g=this.opposite,c=this.offset,p=d.x||0,A=d.y||0,t=this.axisTitle,m=this.chart.renderer.fontMetrics(d.style&&d.style.fontSize,t),t=Math.max(t.getBBox(null,0).height-m.h-1,0),k={low:l+(a?0:k),middle:l+k/2,high:l+(a?k:0)}[d.align],b=(a?f+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+
-[-t,t,m.f,-t][this.side];return{x:a?k+p:b+(g?this.width:0)+c+p,y:a?b+A-(g?this.height:0)+c:k+A}},renderMinorTick:function(a){var b=this.chart.hasRendered&&l(this.oldMin),e=this.minorTicks;e[a]||(e[a]=new D(this,a,"minor"));b&&e[a].isNew&&e[a].render(null,!0);e[a].render(null,!1,1)},renderTick:function(a,b){var e=this.isLinked,f=this.ticks,k=this.chart.hasRendered&&l(this.oldMin);if(!e||a>=this.min&&a<=this.max)f[a]||(f[a]=new D(this,a)),k&&f[a].isNew&&f[a].render(b,!0,-1),f[a].render(b)},render:function(){var b=
-this,f=b.chart,k=b.options,g=b.isLog,c=b.isLinked,p=b.tickPositions,t=b.axisTitle,m=b.ticks,x=b.minorTicks,n=b.alternateBands,h=k.stackLabels,B=k.alternateGridColor,z=b.tickmarkOffset,F=b.axisLine,r=b.showAxis,w=G(f.renderer.globalAnimation),u,v;b.labelEdge.length=0;b.overlap=!1;[m,x,n].forEach(function(a){H(a,function(a){a.isActive=!1})});if(b.hasData()||c)b.minorTickInterval&&!b.categories&&b.getMinorTickPositions().forEach(function(a){b.renderMinorTick(a)}),p.length&&(p.forEach(function(a,e){b.renderTick(a,
-e)}),z&&(0===b.min||b.single)&&(m[-1]||(m[-1]=new D(b,-1,null,!0)),m[-1].render(-1))),B&&p.forEach(function(e,k){v=void 0!==p[k+1]?p[k+1]+z:b.max-z;0===k%2&&e<b.max&&v<=b.max+(f.polar?-z:z)&&(n[e]||(n[e]=new a.PlotLineOrBand(b)),u=e+z,n[e].options={from:g?b.lin2log(u):u,to:g?b.lin2log(v):v,color:B},n[e].render(),n[e].isActive=!0)}),b._addedPlotLB||((k.plotLines||[]).concat(k.plotBands||[]).forEach(function(a){b.addPlotBandOrLine(a)}),b._addedPlotLB=!0);[m,x,n].forEach(function(a){var b,e=[],k=w.duration;
-H(a,function(a,b){a.isActive||(a.render(b,!1,0),a.isActive=!1,e.push(b))});A(function(){for(b=e.length;b--;)a[e[b]]&&!a[e[b]].isActive&&(a[e[b]].destroy(),delete a[e[b]])},a!==n&&f.hasRendered&&k?k:0)});F&&(F[F.isPlaced?"animate":"attr"]({d:this.getLinePath(F.strokeWidth())}),F.isPlaced=!0,F[r?"show":"hide"](!0));t&&r&&(k=b.getTitlePosition(),l(k.y)?(t[t.isNew?"attr":"animate"](k),t.isNew=!1):(t.attr("y",-9999),t.isNew=!0));h&&h.enabled&&b.renderStackTotals();b.isDirty=!1;d(this,"afterRender")},redraw:function(){this.visible&&
-(this.render(),this.plotLinesAndBands.forEach(function(a){a.render()}));this.series.forEach(function(a){a.isDirty=!0})},keepProps:"extKey hcEvents names series userMax userMin".split(" "),destroy:function(a){var b=this,e=b.stacks,f=b.plotLinesAndBands,k;d(this,"destroy",{keepEvents:a});a||z(b);H(e,function(a,b){n(a);e[b]=null});[b.ticks,b.minorTicks,b.alternateBands].forEach(function(a){n(a)});if(f)for(a=f.length;a--;)f[a].destroy();"stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross scrollbar".split(" ").forEach(function(a){b[a]&&
-(b[a]=b[a].destroy())});for(k in b.plotLinesAndBandsGroups)b.plotLinesAndBandsGroups[k]=b.plotLinesAndBandsGroups[k].destroy();H(b,function(a,e){-1===b.keepProps.indexOf(e)&&delete b[e]})},drawCrosshair:function(a,b){var e,f=this.crosshair,k=F(f.snap,!0),l,g=this.cross;d(this,"drawCrosshair",{e:a,point:b});a||(a=this.cross&&this.cross.e);if(this.crosshair&&!1!==(v(b)||!k)){k?v(b)&&(l=F(b.crosshairPos,this.isXAxis?b.plotX:this.len-b.plotY)):l=a&&(this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos);
-v(l)&&(e=this.getPlotLinePath(b&&(this.isXAxis?b.x:F(b.stackY,b.y)),null,null,null,l)||null);if(!v(e)){this.hideCrosshair();return}k=this.categories&&!this.isRadial;g||(this.cross=g=this.chart.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-"+(k?"category ":"thin ")+f.className).attr({zIndex:F(f.zIndex,2)}).add(),this.chart.styledMode||(g.attr({stroke:f.color||(k?c("#ccd6eb").setOpacity(.25).get():"#cccccc"),"stroke-width":F(f.width,1)}).css({"pointer-events":"none"}),f.dashStyle&&
-g.attr({dashstyle:f.dashStyle})));g.show().attr({d:e});k&&!f.width&&g.attr({"stroke-width":this.transA});this.cross.e=a}else this.hideCrosshair();d(this,"afterDrawCrosshair",{e:a,point:b})},hideCrosshair:function(){this.cross&&this.cross.hide()}});return a.Axis=B}(J);(function(a){var y=a.Axis,G=a.getMagnitude,E=a.normalizeTickInterval,h=a.timeUnits;y.prototype.getTimeTicks=function(){return this.chart.time.getTimeTicks.apply(this.chart.time,arguments)};y.prototype.normalizeTimeTickInterval=function(a,
-r){var c=r||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,3,4,6]],["year",null]];r=c[c.length-1];var v=h[r[0]],w=r[1],n;for(n=0;n<c.length&&!(r=c[n],v=h[r[0]],w=r[1],c[n+1]&&a<=(v*w[w.length-1]+h[c[n+1][0]])/2);n++);v===h.year&&a<5*v&&(w=[1,2,5]);a=E(a/v,w,"year"===r[0]?Math.max(G(a/v),1):1);return{unitRange:v,count:a,unitName:r[0]}}})(J);(function(a){var y=a.Axis,G=a.getMagnitude,
-E=a.normalizeTickInterval,h=a.pick;y.prototype.getLogTickPositions=function(a,r,u,v){var c=this.options,n=this.len,g=[];v||(this._minorAutoInterval=null);if(.5<=a)a=Math.round(a),g=this.getLinearTickPositions(a,r,u);else if(.08<=a)for(var n=Math.floor(r),d,m,p,b,l,c=.3<a?[1,2,4]:.15<a?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];n<u+1&&!l;n++)for(m=c.length,d=0;d<m&&!l;d++)p=this.log2lin(this.lin2log(n)*c[d]),p>r&&(!v||b<=u)&&void 0!==b&&g.push(b),b>u&&(l=!0),b=p;else r=this.lin2log(r),u=this.lin2log(u),a=v?this.getMinorTickInterval():
-c.tickInterval,a=h("auto"===a?null:a,this._minorAutoInterval,c.tickPixelInterval/(v?5:1)*(u-r)/((v?n/this.tickPositions.length:n)||1)),a=E(a,null,G(a)),g=this.getLinearTickPositions(a,r,u).map(this.log2lin),v||(this._minorAutoInterval=a/5);v||(this.tickInterval=a);return g};y.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};y.prototype.lin2log=function(a){return Math.pow(10,a)}})(J);(function(a,y){var G=a.arrayMax,E=a.arrayMin,h=a.defined,c=a.destroyObjectProperties,r=a.erase,u=a.merge,
-v=a.pick;a.PlotLineOrBand=function(a,c){this.axis=a;c&&(this.options=c,this.id=c.id)};a.PlotLineOrBand.prototype={render:function(){a.fireEvent(this,"render");var c=this,n=c.axis,g=n.horiz,d=c.options,m=d.label,p=c.label,b=d.to,l=d.from,f=d.value,x=h(l)&&h(b),t=h(f),H=c.svgElem,F=!H,z=[],k=d.color,A=v(d.zIndex,0),D=d.events,z={"class":"highcharts-plot-"+(x?"band ":"line ")+(d.className||"")},B={},e=n.chart.renderer,q=x?"bands":"lines";n.isLog&&(l=n.log2lin(l),b=n.log2lin(b),f=n.log2lin(f));n.chart.styledMode||
-(t?(z.stroke=k,z["stroke-width"]=d.width,d.dashStyle&&(z.dashstyle=d.dashStyle)):x&&(k&&(z.fill=k),d.borderWidth&&(z.stroke=d.borderColor,z["stroke-width"]=d.borderWidth)));B.zIndex=A;q+="-"+A;(k=n.plotLinesAndBandsGroups[q])||(n.plotLinesAndBandsGroups[q]=k=e.g("plot-"+q).attr(B).add());F&&(c.svgElem=H=e.path().attr(z).add(k));if(t)z=n.getPlotLinePath(f,H.strokeWidth());else if(x)z=n.getPlotBandPath(l,b,d);else return;F&&z&&z.length?(H.attr({d:z}),D&&a.objectEach(D,function(a,b){H.on(b,function(a){D[b].apply(c,
-[a])})})):H&&(z?(H.show(),H.animate({d:z})):(H.hide(),p&&(c.label=p=p.destroy())));m&&h(m.text)&&z&&z.length&&0<n.width&&0<n.height&&!z.isFlat?(m=u({align:g&&x&&"center",x:g?!x&&4:10,verticalAlign:!g&&x&&"middle",y:g?x?16:10:x?6:-4,rotation:g&&!x&&90},m),this.renderLabel(m,z,x,A)):p&&p.hide();return c},renderLabel:function(a,c,g,d){var m=this.label,p=this.axis.chart.renderer;m||(m={align:a.textAlign||a.align,rotation:a.rotation,"class":"highcharts-plot-"+(g?"band":"line")+"-label "+(a.className||
-"")},m.zIndex=d,this.label=m=p.text(a.text,0,0,a.useHTML).attr(m).add(),this.axis.chart.styledMode||m.css(a.style));d=c.xBounds||[c[1],c[4],g?c[6]:c[1]];c=c.yBounds||[c[2],c[5],g?c[7]:c[2]];g=E(d);p=E(c);m.align(a,!1,{x:g,y:p,width:G(d)-g,height:G(c)-p});m.show()},destroy:function(){r(this.axis.plotLinesAndBands,this);delete this.axis;c(this)}};a.extend(y.prototype,{getPlotBandPath:function(a,c){var g=this.getPlotLinePath(c,null,null,!0),d=this.getPlotLinePath(a,null,null,!0),m=[],p=this.horiz,b=
-1,l;a=a<this.min&&c<this.min||a>this.max&&c>this.max;if(d&&g)for(a&&(l=d.toString()===g.toString(),b=0),a=0;a<d.length;a+=6)p&&g[a+1]===d[a+1]?(g[a+1]+=b,g[a+4]+=b):p||g[a+2]!==d[a+2]||(g[a+2]+=b,g[a+5]+=b),m.push("M",d[a+1],d[a+2],"L",d[a+4],d[a+5],g[a+4],g[a+5],g[a+1],g[a+2],"z"),m.isFlat=l;return m},addPlotBand:function(a){return this.addPlotBandOrLine(a,"plotBands")},addPlotLine:function(a){return this.addPlotBandOrLine(a,"plotLines")},addPlotBandOrLine:function(c,n){var g=(new a.PlotLineOrBand(this,
-c)).render(),d=this.userOptions;g&&(n&&(d[n]=d[n]||[],d[n].push(c)),this.plotLinesAndBands.push(g));return g},removePlotBandOrLine:function(a){for(var c=this.plotLinesAndBands,g=this.options,d=this.userOptions,m=c.length;m--;)c[m].id===a&&c[m].destroy();[g.plotLines||[],d.plotLines||[],g.plotBands||[],d.plotBands||[]].forEach(function(d){for(m=d.length;m--;)d[m].id===a&&r(d,d[m])})},removePlotBand:function(a){this.removePlotBandOrLine(a)},removePlotLine:function(a){this.removePlotBandOrLine(a)}})})(J,
-V);(function(a){var y=a.doc,G=a.extend,E=a.format,h=a.isNumber,c=a.merge,r=a.pick,u=a.splat,v=a.syncTimeout,w=a.timeUnits;a.Tooltip=function(){this.init.apply(this,arguments)};a.Tooltip.prototype={init:function(a,c){this.chart=a;this.options=c;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=c.split&&!a.inverted;this.shared=c.shared||this.split;this.outside=c.outside&&!this.split},cleanSplit:function(a){this.chart.series.forEach(function(c){var d=c&&c.tt;d&&(!d.isActive||a?c.tt=d.destroy():
-d.isActive=!1)})},applyFilter:function(){var a=this.chart;a.renderer.definition({tagName:"filter",id:"drop-shadow-"+a.index,opacity:.5,children:[{tagName:"feGaussianBlur","in":"SourceAlpha",stdDeviation:1},{tagName:"feOffset",dx:1,dy:1},{tagName:"feComponentTransfer",children:[{tagName:"feFuncA",type:"linear",slope:.3}]},{tagName:"feMerge",children:[{tagName:"feMergeNode"},{tagName:"feMergeNode","in":"SourceGraphic"}]}]});a.renderer.definition({tagName:"style",textContent:".highcharts-tooltip-"+a.index+
-"{filter:url(#drop-shadow-"+a.index+")}"})},getLabel:function(){var c=this.chart.renderer,g=this.chart.styledMode,d=this.options,m;this.label||(this.outside&&(this.container=m=a.doc.createElement("div"),m.className="highcharts-tooltip-container",a.css(m,{position:"absolute",top:"1px",pointerEvents:d.style&&d.style.pointerEvents}),a.doc.body.appendChild(m),this.renderer=c=new a.Renderer(m,0,0)),this.split?this.label=c.g("tooltip"):(this.label=c.label("",0,0,d.shape||"callout",null,null,d.useHTML,null,
-"tooltip").attr({padding:d.padding,r:d.borderRadius}),g||this.label.attr({fill:d.backgroundColor,"stroke-width":d.borderWidth}).css(d.style).shadow(d.shadow)),g&&(this.applyFilter(),this.label.addClass("highcharts-tooltip-"+this.chart.index)),this.outside&&(this.label.attr({x:this.distance,y:this.distance}),this.label.xSetter=function(a){m.style.left=a+"px"},this.label.ySetter=function(a){m.style.top=a+"px"}),this.label.attr({zIndex:8}).add());return this.label},update:function(a){this.destroy();
-c(!0,this.chart.options.tooltip.userOptions,a);this.init(this.chart,c(!0,this.options,a))},destroy:function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart,!0),this.tt=this.tt.destroy());this.renderer&&(this.renderer=this.renderer.destroy(),a.discardElement(this.container));a.clearTimeout(this.hideTimer);a.clearTimeout(this.tooltipTimeout)},move:function(c,g,d,m){var p=this,b=p.now,l=!1!==p.options.animation&&!p.isHidden&&(1<Math.abs(c-b.x)||1<Math.abs(g-
-b.y)),f=p.followPointer||1<p.len;G(b,{x:l?(2*b.x+c)/3:c,y:l?(b.y+g)/2:g,anchorX:f?void 0:l?(2*b.anchorX+d)/3:d,anchorY:f?void 0:l?(b.anchorY+m)/2:m});p.getLabel().attr(b);l&&(a.clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){p&&p.move(c,g,d,m)},32))},hide:function(c){var g=this;a.clearTimeout(this.hideTimer);c=r(c,this.options.hideDelay,500);this.isHidden||(this.hideTimer=v(function(){g.getLabel()[c?"fadeOut":"hide"]();g.isHidden=!0},c))},getAnchor:function(a,c){var d=
-this.chart,g=d.pointer,p=d.inverted,b=d.plotTop,l=d.plotLeft,f=0,x=0,t,h;a=u(a);this.followPointer&&c?(void 0===c.chartX&&(c=g.normalize(c)),a=[c.chartX-d.plotLeft,c.chartY-b]):a[0].tooltipPos?a=a[0].tooltipPos:(a.forEach(function(a){t=a.series.yAxis;h=a.series.xAxis;f+=a.plotX+(!p&&h?h.left-l:0);x+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!p&&t?t.top-b:0)}),f/=a.length,x/=a.length,a=[p?d.plotWidth-x:f,this.shared&&!p&&1<a.length&&c?c.chartY-b:p?d.plotHeight-f:x]);return a.map(Math.round)},getPosition:function(a,
-c,d){var g=this.chart,p=this.distance,b={},l=g.inverted&&d.h||0,f,x=this.outside,t=x?y.documentElement.clientWidth-2*p:g.chartWidth,h=x?Math.max(y.body.scrollHeight,y.documentElement.scrollHeight,y.body.offsetHeight,y.documentElement.offsetHeight,y.documentElement.clientHeight):g.chartHeight,n=g.pointer.chartPosition,z=["y",h,c,(x?n.top-p:0)+d.plotY+g.plotTop,x?0:g.plotTop,x?h:g.plotTop+g.plotHeight],k=["x",t,a,(x?n.left-p:0)+d.plotX+g.plotLeft,x?0:g.plotLeft,x?t:g.plotLeft+g.plotWidth],A=!this.followPointer&&
-r(d.ttBelow,!g.inverted===!!d.negative),D=function(a,e,f,k,d,c){var g=f<k-p,q=k+p+f<e,t=k-p-f;k+=p;if(A&&q)b[a]=k;else if(!A&&g)b[a]=t;else if(g)b[a]=Math.min(c-f,0>t-l?t:t-l);else if(q)b[a]=Math.max(d,k+l+f>e?k:k+l);else return!1},B=function(a,e,f,k){var d;k<p||k>e-p?d=!1:b[a]=k<f/2?1:k>e-f/2?e-f-2:k-f/2;return d},e=function(a){var b=z;z=k;k=b;f=a},q=function(){!1!==D.apply(0,z)?!1!==B.apply(0,k)||f||(e(!0),q()):f?b.x=b.y=0:(e(!0),q())};(g.inverted||1<this.len)&&e();q();return b},defaultFormatter:function(a){var c=
-this.points||u(this),d;d=[a.tooltipFooterHeaderFormatter(c[0])];d=d.concat(a.bodyFormatter(c));d.push(a.tooltipFooterHeaderFormatter(c[0],!0));return d},refresh:function(c,g){var d,m=this.options,p,b=c,l,f={},x=[];d=m.formatter||this.defaultFormatter;var f=this.shared,t,h=this.chart.styledMode;m.enabled&&(a.clearTimeout(this.hideTimer),this.followPointer=u(b)[0].series.tooltipOptions.followPointer,l=this.getAnchor(b,g),g=l[0],p=l[1],!f||b.series&&b.series.noSharedTooltip?f=b.getLabelConfig():(b.forEach(function(a){a.setState("hover");
-x.push(a.getLabelConfig())}),f={x:b[0].category,y:b[0].y},f.points=x,b=b[0]),this.len=x.length,f=d.call(f,this),t=b.series,this.distance=r(t.tooltipOptions.distance,16),!1===f?this.hide():(d=this.getLabel(),this.isHidden&&d.attr({opacity:1}).show(),this.split?this.renderSplit(f,u(c)):(m.style.width&&!h||d.css({width:this.chart.spacingBox.width}),d.attr({text:f&&f.join?f.join(""):f}),d.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-"+r(b.colorIndex,t.colorIndex)),h||d.attr({stroke:m.borderColor||
-b.color||t.color||"#666666"}),this.updatePosition({plotX:g,plotY:p,negative:b.negative,ttBelow:b.ttBelow,h:l[2]||0})),this.isHidden=!1))},renderSplit:function(c,g){var d=this,m=[],p=this.chart,b=p.renderer,l=!0,f=this.options,x=0,t,h=this.getLabel(),n=p.plotTop;a.isString(c)&&(c=[!1,c]);c.slice(0,g.length+1).forEach(function(a,k){if(!1!==a&&""!==a){k=g[k-1]||{isHeader:!0,plotX:g[0].plotX,plotY:p.plotHeight};var c=k.series||d,D=c.tt,B=k.series||{},e="highcharts-color-"+r(k.colorIndex,B.colorIndex,
-"none");D||(D={padding:f.padding,r:f.borderRadius},p.styledMode||(D.fill=f.backgroundColor,D.stroke=f.borderColor||k.color||B.color||"#333333",D["stroke-width"]=f.borderWidth),c.tt=D=b.label(null,null,null,(k.isHeader?f.headerShape:f.shape)||"callout",null,null,f.useHTML).addClass("highcharts-tooltip-box "+e).attr(D).add(h));D.isActive=!0;D.attr({text:a});p.styledMode||D.css(f.style).shadow(f.shadow);a=D.getBBox();B=a.width+D.strokeWidth();k.isHeader?(x=a.height,p.xAxis[0].opposite&&(t=!0,n-=x),B=
-Math.max(0,Math.min(k.plotX+p.plotLeft-B/2,p.chartWidth+(p.scrollablePixels?p.scrollablePixels-p.marginRight:0)-B))):B=k.plotX+p.plotLeft-r(f.distance,16)-B;0>B&&(l=!1);a=(k.series&&k.series.yAxis&&k.series.yAxis.pos)+(k.plotY||0);a-=n;k.isHeader&&(a=t?-x:p.plotHeight+x);m.push({target:a,rank:k.isHeader?1:0,size:c.tt.getBBox().height+1,point:k,x:B,tt:D})}});this.cleanSplit();f.positioner&&m.forEach(function(a){var b=f.positioner.call(d,a.tt.getBBox().width,a.size,a.point);a.x=b.x;a.align=0;a.target=
-b.y;a.rank=r(b.rank,a.rank)});a.distribute(m,p.plotHeight+x);m.forEach(function(a){var b=a.point,d=b.series;a.tt.attr({visibility:void 0===a.pos?"hidden":"inherit",x:l||b.isHeader||f.positioner?a.x:b.plotX+p.plotLeft+r(f.distance,16),y:a.pos+n,anchorX:b.isHeader?b.plotX+p.plotLeft:b.plotX+d.xAxis.pos,anchorY:b.isHeader?p.plotTop+p.plotHeight/2:b.plotY+d.yAxis.pos})})},updatePosition:function(a){var c=this.chart,d=this.getLabel(),m=(this.options.positioner||this.getPosition).call(this,d.width,d.height,
-a),p=a.plotX+c.plotLeft;a=a.plotY+c.plotTop;var b;this.outside&&(b=(this.options.borderWidth||0)+2*this.distance,this.renderer.setSize(d.width+b,d.height+b,!1),p+=c.pointer.chartPosition.left-m.x,a+=c.pointer.chartPosition.top-m.y);this.move(Math.round(m.x),Math.round(m.y||0),p,a)},getDateFormat:function(a,c,d,m){var g=this.chart.time,b=g.dateFormat("%m-%d %H:%M:%S.%L",c),l,f,x={millisecond:15,second:12,minute:9,hour:6,day:3},t="millisecond";for(f in w){if(a===w.week&&+g.dateFormat("%w",c)===d&&"00:00:00.000"===
-b.substr(6)){f="week";break}if(w[f]>a){f=t;break}if(x[f]&&b.substr(x[f])!=="01-01 00:00:00.000".substr(x[f]))break;"week"!==f&&(t=f)}f&&(l=g.resolveDTLFormat(m[f]).main);return l},getXDateFormat:function(a,c,d){c=c.dateTimeLabelFormats;var g=d&&d.closestPointRange;return(g?this.getDateFormat(g,a.x,d.options.startOfWeek,c):c.day)||c.year},tooltipFooterHeaderFormatter:function(a,c){c=c?"footer":"header";var d=a.series,g=d.tooltipOptions,p=g.xDateFormat,b=d.xAxis,l=b&&"datetime"===b.options.type&&h(a.key),
-f=g[c+"Format"];l&&!p&&(p=this.getXDateFormat(a,g,b));l&&p&&(a.point&&a.point.tooltipDateKeys||["key"]).forEach(function(a){f=f.replace("{point."+a+"}","{point."+a+":"+p+"}")});d.chart.styledMode&&(f=this.styledModeFormat(f));return E(f,{point:a,series:d},this.chart.time)},bodyFormatter:function(a){return a.map(function(a){var d=a.series.tooltipOptions;return(d[(a.point.formatPrefix||"point")+"Formatter"]||a.point.tooltipFormatter).call(a.point,d[(a.point.formatPrefix||"point")+"Format"]||"")})},
-styledModeFormat:function(a){return a.replace('style\x3d"font-size: 10px"','class\x3d"highcharts-header"').replace(/style="color:{(point|series)\.color}"/g,'class\x3d"highcharts-color-{$1.colorIndex}"')}}})(J);(function(a){var y=a.addEvent,G=a.attr,E=a.charts,h=a.color,c=a.css,r=a.defined,u=a.extend,v=a.find,w=a.fireEvent,n=a.isNumber,g=a.isObject,d=a.offset,m=a.pick,p=a.splat,b=a.Tooltip;a.Pointer=function(a,b){this.init(a,b)};a.Pointer.prototype={init:function(a,f){this.options=f;this.chart=a;this.runChartClick=
-f.chart.events&&!!f.chart.events.click;this.pinchDown=[];this.lastValidTouch={};b&&(a.tooltip=new b(a,f.tooltip),this.followTouchMove=m(f.tooltip.followTouchMove,!0));this.setDOMEvents()},zoomOption:function(a){var b=this.chart,d=b.options.chart,l=d.zoomType||"",b=b.inverted;/touch/.test(a.type)&&(l=m(d.pinchType,l));this.zoomX=a=/x/.test(l);this.zoomY=l=/y/.test(l);this.zoomHor=a&&!b||l&&b;this.zoomVert=l&&!b||a&&b;this.hasZoom=a||l},normalize:function(a,b){var f;f=a.touches?a.touches.length?a.touches.item(0):
-a.changedTouches[0]:a;b||(this.chartPosition=b=d(this.chart.container));return u(a,{chartX:Math.round(f.pageX-b.left),chartY:Math.round(f.pageY-b.top)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};this.chart.axes.forEach(function(f){b[f.isXAxis?"xAxis":"yAxis"].push({axis:f,value:f.toValue(a[f.horiz?"chartX":"chartY"])})});return b},findNearestKDPoint:function(a,b,d){var f;a.forEach(function(a){var l=!(a.noSharedTooltip&&b)&&0>a.options.findNearestPointBy.indexOf("y");a=a.searchPoint(d,
-l);if((l=g(a,!0))&&!(l=!g(f,!0)))var l=f.distX-a.distX,c=f.dist-a.dist,k=(a.series.group&&a.series.group.zIndex)-(f.series.group&&f.series.group.zIndex),l=0<(0!==l&&b?l:0!==c?c:0!==k?k:f.series.index>a.series.index?-1:1);l&&(f=a)});return f},getPointFromEvent:function(a){a=a.target;for(var b;a&&!b;)b=a.point,a=a.parentNode;return b},getChartCoordinatesFromPoint:function(a,b){var f=a.series,d=f.xAxis,f=f.yAxis,l=m(a.clientX,a.plotX),c=a.shapeArgs;if(d&&f)return b?{chartX:d.len+d.pos-l,chartY:f.len+
-f.pos-a.plotY}:{chartX:l+d.pos,chartY:a.plotY+f.pos};if(c&&c.x&&c.y)return{chartX:c.x,chartY:c.y}},getHoverData:function(a,b,d,c,p,h,n){var f,l=[],t=n&&n.isBoosting;c=!(!c||!a);n=b&&!b.stickyTracking?[b]:d.filter(function(a){return a.visible&&!(!p&&a.directTouch)&&m(a.options.enableMouseTracking,!0)&&a.stickyTracking});b=(f=c?a:this.findNearestKDPoint(n,p,h))&&f.series;f&&(p&&!b.noSharedTooltip?(n=d.filter(function(a){return a.visible&&!(!p&&a.directTouch)&&m(a.options.enableMouseTracking,!0)&&!a.noSharedTooltip}),
-n.forEach(function(a){var b=v(a.points,function(a){return a.x===f.x&&!a.isNull});g(b)&&(t&&(b=a.getPoint(b)),l.push(b))})):l.push(f));return{hoverPoint:f,hoverSeries:b,hoverPoints:l}},runPointActions:function(b,f){var d=this.chart,c=d.tooltip&&d.tooltip.options.enabled?d.tooltip:void 0,l=c?c.shared:!1,g=f||d.hoverPoint,p=g&&g.series||d.hoverSeries,p=this.getHoverData(g,p,d.series,"touchmove"!==b.type&&(!!f||p&&p.directTouch&&this.isDirectTouch),l,b,{isBoosting:d.isBoosting}),k,g=p.hoverPoint;k=p.hoverPoints;
-f=(p=p.hoverSeries)&&p.tooltipOptions.followPointer;l=l&&p&&!p.noSharedTooltip;if(g&&(g!==d.hoverPoint||c&&c.isHidden)){(d.hoverPoints||[]).forEach(function(a){-1===k.indexOf(a)&&a.setState()});(k||[]).forEach(function(a){a.setState("hover")});if(d.hoverSeries!==p)p.onMouseOver();d.hoverPoint&&d.hoverPoint.firePointEvent("mouseOut");if(!g.series)return;g.firePointEvent("mouseOver");d.hoverPoints=k;d.hoverPoint=g;c&&c.refresh(l?k:g,b)}else f&&c&&!c.isHidden&&(g=c.getAnchor([{}],b),c.updatePosition({plotX:g[0],
-plotY:g[1]}));this.unDocMouseMove||(this.unDocMouseMove=y(d.container.ownerDocument,"mousemove",function(b){var f=E[a.hoverChartIndex];if(f)f.pointer.onDocumentMouseMove(b)}));d.axes.forEach(function(f){var d=m(f.crosshair.snap,!0),c=d?a.find(k,function(a){return a.series[f.coll]===f}):void 0;c||!d?f.drawCrosshair(b,c):f.hideCrosshair()})},reset:function(a,b){var f=this.chart,d=f.hoverSeries,c=f.hoverPoint,l=f.hoverPoints,g=f.tooltip,k=g&&g.shared?l:c;a&&k&&p(k).forEach(function(b){b.series.isCartesian&&
-void 0===b.plotX&&(a=!1)});if(a)g&&k&&k.length&&(g.refresh(k),g.shared&&l?l.forEach(function(a){a.setState(a.state,!0);a.series.isCartesian&&(a.series.xAxis.crosshair&&a.series.xAxis.drawCrosshair(null,a),a.series.yAxis.crosshair&&a.series.yAxis.drawCrosshair(null,a))}):c&&(c.setState(c.state,!0),f.axes.forEach(function(a){a.crosshair&&a.drawCrosshair(null,c)})));else{if(c)c.onMouseOut();l&&l.forEach(function(a){a.setState()});if(d)d.onMouseOut();g&&g.hide(b);this.unDocMouseMove&&(this.unDocMouseMove=
-this.unDocMouseMove());f.axes.forEach(function(a){a.hideCrosshair()});this.hoverX=f.hoverPoints=f.hoverPoint=null}},scaleGroups:function(a,b){var f=this.chart,d;f.series.forEach(function(c){d=a||c.getPlotBox();c.xAxis&&c.xAxis.zoomEnabled&&c.group&&(c.group.attr(d),c.markerGroup&&(c.markerGroup.attr(d),c.markerGroup.clip(b?f.clipRect:null)),c.dataLabelsGroup&&c.dataLabelsGroup.attr(d))});f.clipRect.attr(b||f.clipBox)},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=
-this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,d=b.options.chart,c=a.chartX,l=a.chartY,g=this.zoomHor,p=this.zoomVert,k=b.plotLeft,m=b.plotTop,D=b.plotWidth,B=b.plotHeight,e,q=this.selectionMarker,n=this.mouseDownX,r=this.mouseDownY,u=d.panKey&&a[d.panKey+"Key"];q&&q.touch||(c<k?c=k:c>k+D&&(c=k+D),l<m?l=m:l>m+B&&(l=m+B),this.hasDragged=Math.sqrt(Math.pow(n-c,2)+Math.pow(r-l,2)),10<this.hasDragged&&(e=b.isInsidePlot(n-k,r-m),b.hasCartesianSeries&&
-(this.zoomX||this.zoomY)&&e&&!u&&!q&&(this.selectionMarker=q=b.renderer.rect(k,m,g?1:D,p?1:B,0).attr({"class":"highcharts-selection-marker",zIndex:7}).add(),b.styledMode||q.attr({fill:d.selectionMarkerFill||h("#335cad").setOpacity(.25).get()})),q&&g&&(c-=n,q.attr({width:Math.abs(c),x:(0<c?0:c)+n})),q&&p&&(c=l-r,q.attr({height:Math.abs(c),y:(0<c?0:c)+r})),e&&!q&&d.panning&&b.pan(a,d.panning)))},drop:function(a){var b=this,d=this.chart,l=this.hasPinched;if(this.selectionMarker){var g={originalEvent:a,
-xAxis:[],yAxis:[]},p=this.selectionMarker,m=p.attr?p.attr("x"):p.x,k=p.attr?p.attr("y"):p.y,A=p.attr?p.attr("width"):p.width,D=p.attr?p.attr("height"):p.height,h;if(this.hasDragged||l)d.axes.forEach(function(e){if(e.zoomEnabled&&r(e.min)&&(l||b[{xAxis:"zoomX",yAxis:"zoomY"}[e.coll]])){var f=e.horiz,d="touchend"===a.type?e.minPixelPadding:0,c=e.toValue((f?m:k)+d),f=e.toValue((f?m+A:k+D)-d);g[e.coll].push({axis:e,min:Math.min(c,f),max:Math.max(c,f)});h=!0}}),h&&w(d,"selection",g,function(a){d.zoom(u(a,
-l?{animation:!1}:null))});n(d.index)&&(this.selectionMarker=this.selectionMarker.destroy());l&&this.scaleGroups()}d&&n(d.index)&&(c(d.container,{cursor:d._cursor}),d.cancelClick=10<this.hasDragged,d.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])},onContainerMouseDown:function(a){a=this.normalize(a);2!==a.button&&(this.zoomOption(a),a.preventDefault&&a.preventDefault(),this.dragStart(a))},onDocumentMouseUp:function(b){E[a.hoverChartIndex]&&E[a.hoverChartIndex].pointer.drop(b)},onDocumentMouseMove:function(a){var b=
-this.chart,d=this.chartPosition;a=this.normalize(a,d);!d||this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)||this.reset()},onContainerMouseLeave:function(b){var f=E[a.hoverChartIndex];f&&(b.relatedTarget||b.toElement)&&(f.pointer.reset(),f.pointer.chartPosition=null)},onContainerMouseMove:function(b){var f=this.chart;r(a.hoverChartIndex)&&E[a.hoverChartIndex]&&E[a.hoverChartIndex].mouseIsDown||(a.hoverChartIndex=f.index);b=this.normalize(b);b.returnValue=
-!1;"mousedown"===f.mouseIsDown&&this.drag(b);!this.inClass(b.target,"highcharts-tracker")&&!f.isInsidePlot(b.chartX-f.plotLeft,b.chartY-f.plotTop)||f.openMenu||this.runPointActions(b)},inClass:function(a,b){for(var f;a;){if(f=G(a,"class")){if(-1!==f.indexOf(b))return!0;if(-1!==f.indexOf("highcharts-container"))return!1}a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries;a=a.relatedTarget||a.toElement;this.isDirectTouch=!1;if(!(!b||!a||b.stickyTracking||this.inClass(a,"highcharts-tooltip")||
-this.inClass(a,"highcharts-series-"+b.index)&&this.inClass(a,"highcharts-tracker")))b.onMouseOut()},onContainerClick:function(a){var b=this.chart,d=b.hoverPoint,c=b.plotLeft,l=b.plotTop;a=this.normalize(a);b.cancelClick||(d&&this.inClass(a.target,"highcharts-tracker")?(w(d.series,"click",u(a,{point:d})),b.hoverPoint&&d.firePointEvent("click",a)):(u(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-c,a.chartY-l)&&w(b,"click",a)))},setDOMEvents:function(){var b=this,f=b.chart.container,d=f.ownerDocument;
-f.onmousedown=function(a){b.onContainerMouseDown(a)};f.onmousemove=function(a){b.onContainerMouseMove(a)};f.onclick=function(a){b.onContainerClick(a)};this.unbindContainerMouseLeave=y(f,"mouseleave",b.onContainerMouseLeave);a.unbindDocumentMouseUp||(a.unbindDocumentMouseUp=y(d,"mouseup",b.onDocumentMouseUp));a.hasTouch&&(f.ontouchstart=function(a){b.onContainerTouchStart(a)},f.ontouchmove=function(a){b.onContainerTouchMove(a)},a.unbindDocumentTouchEnd||(a.unbindDocumentTouchEnd=y(d,"touchend",b.onDocumentTouchEnd)))},
-destroy:function(){var b=this;b.unDocMouseMove&&b.unDocMouseMove();this.unbindContainerMouseLeave();a.chartCount||(a.unbindDocumentMouseUp&&(a.unbindDocumentMouseUp=a.unbindDocumentMouseUp()),a.unbindDocumentTouchEnd&&(a.unbindDocumentTouchEnd=a.unbindDocumentTouchEnd()));clearInterval(b.tooltipTimeout);a.objectEach(b,function(a,d){b[d]=null})}}})(J);(function(a){var y=a.charts,G=a.extend,E=a.noop,h=a.pick;G(a.Pointer.prototype,{pinchTranslate:function(a,h,u,v,w,n){this.zoomHor&&this.pinchTranslateDirection(!0,
-a,h,u,v,w,n);this.zoomVert&&this.pinchTranslateDirection(!1,a,h,u,v,w,n)},pinchTranslateDirection:function(a,h,u,v,w,n,g,d){var c=this.chart,p=a?"x":"y",b=a?"X":"Y",l="chart"+b,f=a?"width":"height",x=c["plot"+(a?"Left":"Top")],t,r,F=d||1,z=c.inverted,k=c.bounds[a?"h":"v"],A=1===h.length,D=h[0][l],B=u[0][l],e=!A&&h[1][l],q=!A&&u[1][l],L;u=function(){!A&&20<Math.abs(D-e)&&(F=d||Math.abs(B-q)/Math.abs(D-e));r=(x-B)/F+D;t=c["plot"+(a?"Width":"Height")]/F};u();h=r;h<k.min?(h=k.min,L=!0):h+t>k.max&&(h=
-k.max-t,L=!0);L?(B-=.8*(B-g[p][0]),A||(q-=.8*(q-g[p][1])),u()):g[p]=[B,q];z||(n[p]=r-x,n[f]=t);n=z?1/F:F;w[f]=t;w[p]=h;v[z?a?"scaleY":"scaleX":"scale"+b]=F;v["translate"+b]=n*x+(B-n*D)},pinch:function(a){var c=this,u=c.chart,v=c.pinchDown,w=a.touches,n=w.length,g=c.lastValidTouch,d=c.hasZoom,m=c.selectionMarker,p={},b=1===n&&(c.inClass(a.target,"highcharts-tracker")&&u.runTrackerClick||c.runChartClick),l={};1<n&&(c.initiated=!0);d&&c.initiated&&!b&&a.preventDefault();[].map.call(w,function(a){return c.normalize(a)});
-"touchstart"===a.type?([].forEach.call(w,function(a,b){v[b]={chartX:a.chartX,chartY:a.chartY}}),g.x=[v[0].chartX,v[1]&&v[1].chartX],g.y=[v[0].chartY,v[1]&&v[1].chartY],u.axes.forEach(function(a){if(a.zoomEnabled){var b=u.bounds[a.horiz?"h":"v"],f=a.minPixelPadding,d=a.toPixels(h(a.options.min,a.dataMin)),c=a.toPixels(h(a.options.max,a.dataMax)),l=Math.max(d,c);b.min=Math.min(a.pos,Math.min(d,c)-f);b.max=Math.max(a.pos+a.len,l+f)}}),c.res=!0):c.followTouchMove&&1===n?this.runPointActions(c.normalize(a)):
-v.length&&(m||(c.selectionMarker=m=G({destroy:E,touch:!0},u.plotBox)),c.pinchTranslate(v,w,p,m,l,g),c.hasPinched=d,c.scaleGroups(p,l),c.res&&(c.res=!1,this.reset(!1,0)))},touch:function(c,r){var u=this.chart,v,w;if(u.index!==a.hoverChartIndex)this.onContainerMouseLeave({relatedTarget:!0});a.hoverChartIndex=u.index;1===c.touches.length?(c=this.normalize(c),(w=u.isInsidePlot(c.chartX-u.plotLeft,c.chartY-u.plotTop))&&!u.openMenu?(r&&this.runPointActions(c),"touchmove"===c.type&&(r=this.pinchDown,v=r[0]?
-4<=Math.sqrt(Math.pow(r[0].chartX-c.chartX,2)+Math.pow(r[0].chartY-c.chartY,2)):!1),h(v,!0)&&this.pinch(c)):r&&this.reset()):2===c.touches.length&&this.pinch(c)},onContainerTouchStart:function(a){this.zoomOption(a);this.touch(a,!0)},onContainerTouchMove:function(a){this.touch(a)},onDocumentTouchEnd:function(c){y[a.hoverChartIndex]&&y[a.hoverChartIndex].pointer.drop(c)}})})(J);(function(a){var y=a.addEvent,G=a.charts,E=a.css,h=a.doc,c=a.extend,r=a.noop,u=a.Pointer,v=a.removeEvent,w=a.win,n=a.wrap;
-if(!a.hasTouch&&(w.PointerEvent||w.MSPointerEvent)){var g={},d=!!w.PointerEvent,m=function(){var b=[];b.item=function(a){return this[a]};a.objectEach(g,function(a){b.push({pageX:a.pageX,pageY:a.pageY,target:a.target})});return b},p=function(b,d,f,c){"touch"!==b.pointerType&&b.pointerType!==b.MSPOINTER_TYPE_TOUCH||!G[a.hoverChartIndex]||(c(b),c=G[a.hoverChartIndex].pointer,c[d]({type:f,target:b.currentTarget,preventDefault:r,touches:m()}))};c(u.prototype,{onContainerPointerDown:function(a){p(a,"onContainerTouchStart",
-"touchstart",function(a){g[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},onContainerPointerMove:function(a){p(a,"onContainerTouchMove","touchmove",function(a){g[a.pointerId]={pageX:a.pageX,pageY:a.pageY};g[a.pointerId].target||(g[a.pointerId].target=a.currentTarget)})},onDocumentPointerUp:function(a){p(a,"onDocumentTouchEnd","touchend",function(a){delete g[a.pointerId]})},batchMSEvents:function(a){a(this.chart.container,d?"pointerdown":"MSPointerDown",this.onContainerPointerDown);
-a(this.chart.container,d?"pointermove":"MSPointerMove",this.onContainerPointerMove);a(h,d?"pointerup":"MSPointerUp",this.onDocumentPointerUp)}});n(u.prototype,"init",function(a,d,f){a.call(this,d,f);this.hasZoom&&E(d.container,{"-ms-touch-action":"none","touch-action":"none"})});n(u.prototype,"setDOMEvents",function(a){a.apply(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(y)});n(u.prototype,"destroy",function(a){this.batchMSEvents(v);a.call(this)})}})(J);(function(a){var y=a.addEvent,
-G=a.css,E=a.discardElement,h=a.defined,c=a.fireEvent,r=a.isFirefox,u=a.marginNames,v=a.merge,w=a.pick,n=a.setAnimation,g=a.stableSort,d=a.win,m=a.wrap;a.Legend=function(a,b){this.init(a,b)};a.Legend.prototype={init:function(a,b){this.chart=a;this.setOptions(b);b.enabled&&(this.render(),y(this.chart,"endResize",function(){this.legend.positionCheckboxes()}),this.proximate?this.unchartrender=y(this.chart,"render",function(){this.legend.proximatePositions();this.legend.positionItems()}):this.unchartrender&&
-this.unchartrender())},setOptions:function(a){var b=w(a.padding,8);this.options=a;this.chart.styledMode||(this.itemStyle=a.itemStyle,this.itemHiddenStyle=v(this.itemStyle,a.itemHiddenStyle));this.itemMarginTop=a.itemMarginTop||0;this.padding=b;this.initialItemY=b-5;this.symbolWidth=w(a.symbolWidth,16);this.pages=[];this.proximate="proximate"===a.layout&&!this.chart.inverted},update:function(a,b){var d=this.chart;this.setOptions(v(!0,this.options,a));this.destroy();d.isDirtyLegend=d.isDirtyBox=!0;
-w(b,!0)&&d.redraw();c(this,"afterUpdate")},colorizeItem:function(a,b){a.legendGroup[b?"removeClass":"addClass"]("highcharts-legend-item-hidden");if(!this.chart.styledMode){var d=this.options,f=a.legendItem,g=a.legendLine,p=a.legendSymbol,m=this.itemHiddenStyle.color,d=b?d.itemStyle.color:m,h=b?a.color||m:m,n=a.options&&a.options.marker,k={fill:h};f&&f.css({fill:d,color:d});g&&g.attr({stroke:h});p&&(n&&p.isMarker&&(k=a.pointAttribs(),b||(k.stroke=k.fill=m)),p.attr(k))}c(this,"afterColorizeItem",{item:a,
-visible:b})},positionItems:function(){this.allItems.forEach(this.positionItem,this);this.chart.isResizing||this.positionCheckboxes()},positionItem:function(a){var b=this.options,d=b.symbolPadding,b=!b.rtl,f=a._legendItemPos,c=f[0],f=f[1],g=a.checkbox;if((a=a.legendGroup)&&a.element)a[h(a.translateY)?"animate":"attr"]({translateX:b?c:this.legendWidth-c-2*d-4,translateY:f});g&&(g.x=c,g.y=f)},destroyItem:function(a){var b=a.checkbox;["legendItem","legendLine","legendSymbol","legendGroup"].forEach(function(b){a[b]&&
-(a[b]=a[b].destroy())});b&&E(a.checkbox)},destroy:function(){function a(a){this[a]&&(this[a]=this[a].destroy())}this.getAllItems().forEach(function(b){["legendItem","legendGroup"].forEach(a,b)});"clipRect up down pager nav box title group".split(" ").forEach(a,this);this.display=null},positionCheckboxes:function(){var a=this.group&&this.group.alignAttr,b,d=this.clipHeight||this.legendHeight,f=this.titleHeight;a&&(b=a.translateY,this.allItems.forEach(function(c){var g=c.checkbox,l;g&&(l=b+f+g.y+(this.scrollOffset||
-0)+3,G(g,{left:a.translateX+c.checkboxOffset+g.x-20+"px",top:l+"px",display:this.proximate||l>b-6&&l<b+d-6?"":"none"}))},this))},renderTitle:function(){var a=this.options,b=this.padding,d=a.title,f=0;d.text&&(this.title||(this.title=this.chart.renderer.label(d.text,b-3,b-4,null,null,null,a.useHTML,null,"legend-title").attr({zIndex:1}),this.chart.styledMode||this.title.css(d.style),this.title.add(this.group)),a=this.title.getBBox(),f=a.height,this.offsetWidth=a.width,this.contentGroup.attr({translateY:f}));
-this.titleHeight=f},setText:function(d){var b=this.options;d.legendItem.attr({text:b.labelFormat?a.format(b.labelFormat,d,this.chart.time):b.labelFormatter.call(d)})},renderItem:function(a){var b=this.chart,d=b.renderer,f=this.options,c=this.symbolWidth,g=f.symbolPadding,p=this.itemStyle,m=this.itemHiddenStyle,h="horizontal"===f.layout?w(f.itemDistance,20):0,k=!f.rtl,A=a.legendItem,D=!a.series,B=!D&&a.series.drawLegendSymbol?a.series:a,e=B.options,e=this.createCheckboxForItem&&e&&e.showCheckbox,h=
-c+g+h+(e?20:0),q=f.useHTML,n=a.options.className;A||(a.legendGroup=d.g("legend-item").addClass("highcharts-"+B.type+"-series highcharts-color-"+a.colorIndex+(n?" "+n:"")+(D?" highcharts-series-"+a.index:"")).attr({zIndex:1}).add(this.scrollGroup),a.legendItem=A=d.text("",k?c+g:-g,this.baseline||0,q),b.styledMode||A.css(v(a.visible?p:m)),A.attr({align:k?"left":"right",zIndex:2}).add(a.legendGroup),this.baseline||(this.fontMetrics=d.fontMetrics(b.styledMode?12:p.fontSize,A),this.baseline=this.fontMetrics.f+
-3+this.itemMarginTop,A.attr("y",this.baseline)),this.symbolHeight=f.symbolHeight||this.fontMetrics.f,B.drawLegendSymbol(this,a),this.setItemEvents&&this.setItemEvents(a,A,q),e&&this.createCheckboxForItem(a));this.colorizeItem(a,a.visible);!b.styledMode&&p.width||A.css({width:(f.itemWidth||f.width||b.spacingBox.width)-h});this.setText(a);b=A.getBBox();a.itemWidth=a.checkboxOffset=f.itemWidth||a.legendItemWidth||b.width+h;this.maxItemWidth=Math.max(this.maxItemWidth,a.itemWidth);this.totalItemWidth+=
-a.itemWidth;this.itemHeight=a.itemHeight=Math.round(a.legendItemHeight||b.height||this.symbolHeight)},layoutItem:function(a){var b=this.options,d=this.padding,f="horizontal"===b.layout,c=a.itemHeight,g=b.itemMarginBottom||0,p=this.itemMarginTop,m=f?w(b.itemDistance,20):0,h=b.width,k=h||this.chart.spacingBox.width-2*d-b.x,b=b.alignColumns&&this.totalItemWidth>k?this.maxItemWidth:a.itemWidth;f&&this.itemX-d+b>k&&(this.itemX=d,this.itemY+=p+this.lastLineHeight+g,this.lastLineHeight=0);this.lastItemY=
-p+this.itemY+g;this.lastLineHeight=Math.max(c,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];f?this.itemX+=b:(this.itemY+=p+c+g,this.lastLineHeight=c);this.offsetWidth=h||Math.max((f?this.itemX-d-(a.checkbox?0:m):b)+d,this.offsetWidth)},getAllItems:function(){var a=[];this.chart.series.forEach(function(b){var d=b&&b.options;b&&w(d.showInLegend,h(d.linkedTo)?!1:void 0,!0)&&(a=a.concat(b.legendItems||("point"===d.legendType?b.data:b)))});c(this,"afterGetAllItems",{allItems:a});return a},
-getAlignment:function(){var a=this.options;return this.proximate?a.align.charAt(0)+"tv":a.floating?"":a.align.charAt(0)+a.verticalAlign.charAt(0)+a.layout.charAt(0)},adjustMargins:function(a,b){var d=this.chart,f=this.options,c=this.getAlignment();c&&[/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/].forEach(function(g,l){g.test(c)&&!h(a[l])&&(d[u[l]]=Math.max(d[u[l]],d.legend[(l+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][l]*f[l%2?"x":"y"]+w(f.margin,12)+b[l]+(0===l&&void 0!==d.options.title.margin?
-d.titleOffset+d.options.title.margin:0)))})},proximatePositions:function(){var d=this.chart,b=[],c="left"===this.options.align;this.allItems.forEach(function(f){var g,l;g=c;f.xAxis&&f.points&&(f.xAxis.options.reversed&&(g=!g),g=a.find(g?f.points:f.points.slice(0).reverse(),function(b){return a.isNumber(b.plotY)}),l=f.legendGroup.getBBox().height,b.push({target:f.visible?(g?g.plotY:f.xAxis.height)-.3*l:d.plotHeight,size:l,item:f}))},this);a.distribute(b,d.plotHeight);b.forEach(function(a){a.item._legendItemPos[1]=
-d.plotTop-d.spacing[0]+a.pos})},render:function(){var a=this.chart,b=a.renderer,d=this.group,f,c,m,h=this.box,n=this.options,z=this.padding;this.itemX=z;this.itemY=this.initialItemY;this.lastItemY=this.offsetWidth=0;d||(this.group=d=b.g("legend").attr({zIndex:7}).add(),this.contentGroup=b.g().attr({zIndex:1}).add(d),this.scrollGroup=b.g().add(this.contentGroup));this.renderTitle();f=this.getAllItems();g(f,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||
-0)});n.reversed&&f.reverse();this.allItems=f;this.display=c=!!f.length;this.itemHeight=this.totalItemWidth=this.maxItemWidth=this.lastLineHeight=0;f.forEach(this.renderItem,this);f.forEach(this.layoutItem,this);f=(n.width||this.offsetWidth)+z;m=this.lastItemY+this.lastLineHeight+this.titleHeight;m=this.handleOverflow(m);m+=z;h||(this.box=h=b.rect().addClass("highcharts-legend-box").attr({r:n.borderRadius}).add(d),h.isNew=!0);a.styledMode||h.attr({stroke:n.borderColor,"stroke-width":n.borderWidth||
-0,fill:n.backgroundColor||"none"}).shadow(n.shadow);0<f&&0<m&&(h[h.isNew?"attr":"animate"](h.crisp.call({},{x:0,y:0,width:f,height:m},h.strokeWidth())),h.isNew=!1);h[c?"show":"hide"]();a.styledMode&&"none"===d.getStyle("display")&&(f=m=0);this.legendWidth=f;this.legendHeight=m;c&&(b=a.spacingBox,/(lth|ct|rth)/.test(this.getAlignment())&&(b=v(b,{y:b.y+a.titleOffset+a.options.title.margin})),d.align(v(n,{width:f,height:m,verticalAlign:this.proximate?"top":n.verticalAlign}),!0,b));this.proximate||this.positionItems()},
-handleOverflow:function(a){var b=this,d=this.chart,f=d.renderer,c=this.options,g=c.y,m=this.padding,g=d.spacingBox.height+("top"===c.verticalAlign?-g:g)-m,p=c.maxHeight,h,k=this.clipRect,A=c.navigation,D=w(A.animation,!0),n=A.arrowSize||12,e=this.nav,q=this.pages,r,u=this.allItems,v=function(a){"number"===typeof a?k.attr({height:a}):k&&(b.clipRect=k.destroy(),b.contentGroup.clip());b.contentGroup.div&&(b.contentGroup.div.style.clip=a?"rect("+m+"px,9999px,"+(m+a)+"px,0)":"auto")};"horizontal"!==c.layout||
-"middle"===c.verticalAlign||c.floating||(g/=2);p&&(g=Math.min(g,p));q.length=0;a>g&&!1!==A.enabled?(this.clipHeight=h=Math.max(g-20-this.titleHeight-m,0),this.currentPage=w(this.currentPage,1),this.fullHeight=a,u.forEach(function(a,b){var e=a._legendItemPos[1],d=Math.round(a.legendItem.getBBox().height),f=q.length;if(!f||e-q[f-1]>h&&(r||e)!==q[f-1])q.push(r||e),f++;a.pageIx=f-1;r&&(u[b-1].pageIx=f-1);b===u.length-1&&e+d-q[f-1]>h&&e!==r&&(q.push(e),a.pageIx=f);e!==r&&(r=e)}),k||(k=b.clipRect=f.clipRect(0,
-m,9999,0),b.contentGroup.clip(k)),v(h),e||(this.nav=e=f.g().attr({zIndex:1}).add(this.group),this.up=f.symbol("triangle",0,0,n,n).on("click",function(){b.scroll(-1,D)}).add(e),this.pager=f.text("",15,10).addClass("highcharts-legend-navigation"),d.styledMode||this.pager.css(A.style),this.pager.add(e),this.down=f.symbol("triangle-down",0,0,n,n).on("click",function(){b.scroll(1,D)}).add(e)),b.scroll(0),a=g):e&&(v(),this.nav=e.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},
-scroll:function(a,b){var d=this.pages,f=d.length;a=this.currentPage+a;var c=this.clipHeight,g=this.options.navigation,m=this.pager,p=this.padding;a>f&&(a=f);0<a&&(void 0!==b&&n(b,this.chart),this.nav.attr({translateX:p,translateY:c+this.padding+7+this.titleHeight,visibility:"visible"}),this.up.attr({"class":1===a?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"}),m.attr({text:a+"/"+f}),this.down.attr({x:18+this.pager.getBBox().width,"class":a===f?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"}),
-this.chart.styledMode||(this.up.attr({fill:1===a?g.inactiveColor:g.activeColor}).css({cursor:1===a?"default":"pointer"}),this.down.attr({fill:a===f?g.inactiveColor:g.activeColor}).css({cursor:a===f?"default":"pointer"})),this.scrollOffset=-d[a-1]+this.initialItemY,this.scrollGroup.animate({translateY:this.scrollOffset}),this.currentPage=a,this.positionCheckboxes())}};a.LegendSymbolMixin={drawRectangle:function(a,b){var d=a.symbolHeight,f=a.options.squareSymbol;b.legendSymbol=this.chart.renderer.rect(f?
-(a.symbolWidth-d)/2:0,a.baseline-d+1,f?d:a.symbolWidth,d,w(a.options.symbolRadius,d/2)).addClass("highcharts-point").attr({zIndex:3}).add(b.legendGroup)},drawLineMarker:function(a){var b=this.options,d=b.marker,f=a.symbolWidth,c=a.symbolHeight,g=c/2,m=this.chart.renderer,p=this.legendGroup;a=a.baseline-Math.round(.3*a.fontMetrics.b);var h={};this.chart.styledMode||(h={"stroke-width":b.lineWidth||0},b.dashStyle&&(h.dashstyle=b.dashStyle));this.legendLine=m.path(["M",0,a,"L",f,a]).addClass("highcharts-graph").attr(h).add(p);
-d&&!1!==d.enabled&&f&&(b=Math.min(w(d.radius,g),g),0===this.symbol.indexOf("url")&&(d=v(d,{width:c,height:c}),b=0),this.legendSymbol=d=m.symbol(this.symbol,f/2-b,a-b,2*b,2*b,d).addClass("highcharts-point").add(p),d.isMarker=!0)}};(/Trident\/7\.0/.test(d.navigator.userAgent)||r)&&m(a.Legend.prototype,"positionItem",function(a,b){var d=this,f=function(){b._legendItemPos&&a.call(d,b)};f();d.bubbleLegend||setTimeout(f)})})(J);(function(a){var y=a.addEvent,G=a.animate,E=a.animObject,h=a.attr,c=a.doc,r=
-a.Axis,u=a.createElement,v=a.defaultOptions,w=a.discardElement,n=a.charts,g=a.css,d=a.defined,m=a.extend,p=a.find,b=a.fireEvent,l=a.isNumber,f=a.isObject,x=a.isString,t=a.Legend,H=a.marginNames,F=a.merge,z=a.objectEach,k=a.Pointer,A=a.pick,D=a.pInt,B=a.removeEvent,e=a.seriesTypes,q=a.splat,L=a.syncTimeout,I=a.win,R=a.Chart=function(){this.getArgs.apply(this,arguments)};a.chart=function(a,b,e){return new R(a,b,e)};m(R.prototype,{callbacks:[],getArgs:function(){var a=[].slice.call(arguments);if(x(a[0])||
-a[0].nodeName)this.renderTo=a.shift();this.init(a[0],a[1])},init:function(e,d){var f,k,c=e.series,g=e.plotOptions||{};b(this,"init",{args:arguments},function(){e.series=null;f=F(v,e);for(k in f.plotOptions)f.plotOptions[k].tooltip=g[k]&&F(g[k].tooltip)||void 0;f.tooltip.userOptions=e.chart&&e.chart.forExport&&e.tooltip.userOptions||e.tooltip;f.series=e.series=c;this.userOptions=e;var q=f.chart,l=q.events;this.margin=[];this.spacing=[];this.bounds={h:{},v:{}};this.labelCollectors=[];this.callback=
-d;this.isResizing=0;this.options=f;this.axes=[];this.series=[];this.time=e.time&&Object.keys(e.time).length?new a.Time(e.time):a.time;this.styledMode=q.styledMode;this.hasCartesianSeries=q.showAxes;var m=this;m.index=n.length;n.push(m);a.chartCount++;l&&z(l,function(a,b){y(m,b,a)});m.xAxis=[];m.yAxis=[];m.pointCount=m.colorCounter=m.symbolCounter=0;b(m,"afterInit");m.firstRender()})},initSeries:function(b){var d=this.options.chart;(d=e[b.type||d.type||d.defaultSeriesType])||a.error(17,!0,this);d=
-new d;d.init(this,b);return d},orderSeries:function(a){var b=this.series;for(a=a||0;a<b.length;a++)b[a]&&(b[a].index=a,b[a].name=b[a].getName())},isInsidePlot:function(a,b,e){var d=e?b:a;a=e?a:b;return 0<=d&&d<=this.plotWidth&&0<=a&&a<=this.plotHeight},redraw:function(e){b(this,"beforeRedraw");var d=this.axes,f=this.series,k=this.pointer,c=this.legend,g=this.userOptions.legend,q=this.isDirtyLegend,l,p,A=this.hasCartesianSeries,h=this.isDirtyBox,D,t=this.renderer,n=t.isHidden(),B=[];this.setResponsive&&
-this.setResponsive(!1);a.setAnimation(e,this);n&&this.temporaryDisplay();this.layOutTitles();for(e=f.length;e--;)if(D=f[e],D.options.stacking&&(l=!0,D.isDirty)){p=!0;break}if(p)for(e=f.length;e--;)D=f[e],D.options.stacking&&(D.isDirty=!0);f.forEach(function(a){a.isDirty&&("point"===a.options.legendType?(a.updateTotals&&a.updateTotals(),q=!0):g&&(g.labelFormatter||g.labelFormat)&&(q=!0));a.isDirtyData&&b(a,"updatedData")});q&&c&&c.options.enabled&&(c.render(),this.isDirtyLegend=!1);l&&this.getStacks();
-A&&d.forEach(function(a){a.updateNames();a.updateYNames&&a.updateYNames();a.setScale()});this.getMargins();A&&(d.forEach(function(a){a.isDirty&&(h=!0)}),d.forEach(function(a){var e=a.min+","+a.max;a.extKey!==e&&(a.extKey=e,B.push(function(){b(a,"afterSetExtremes",m(a.eventArgs,a.getExtremes()));delete a.eventArgs}));(h||l)&&a.redraw()}));h&&this.drawChartBox();b(this,"predraw");f.forEach(function(a){(h||a.isDirty)&&a.visible&&a.redraw();a.isDirtyData=!1});k&&k.reset(!0);t.draw();b(this,"redraw");
-b(this,"render");n&&this.temporaryDisplay(!0);B.forEach(function(a){a.call()})},get:function(a){function b(b){return b.id===a||b.options&&b.options.id===a}var e,d=this.series,f;e=p(this.axes,b)||p(this.series,b);for(f=0;!e&&f<d.length;f++)e=p(d[f].points||[],b);return e},getAxes:function(){var a=this,e=this.options,d=e.xAxis=q(e.xAxis||{}),e=e.yAxis=q(e.yAxis||{});b(this,"getAxes");d.forEach(function(a,b){a.index=b;a.isX=!0});e.forEach(function(a,b){a.index=b});d.concat(e).forEach(function(b){new r(a,
-b)});b(this,"afterGetAxes")},getSelectedPoints:function(){var a=[];this.series.forEach(function(b){a=a.concat((b.data||[]).filter(function(a){return a.selected}))});return a},getSelectedSeries:function(){return this.series.filter(function(a){return a.selected})},setTitle:function(a,b,e){var d=this,f=d.options,k=d.styledMode,c;c=f.title=F(!k&&{style:{color:"#333333",fontSize:f.isStock?"16px":"18px"}},f.title,a);f=f.subtitle=F(!k&&{style:{color:"#666666"}},f.subtitle,b);[["title",a,c],["subtitle",b,
-f]].forEach(function(a,b){var e=a[0],f=d[e],c=a[1];a=a[2];f&&c&&(d[e]=f=f.destroy());a&&!f&&(d[e]=d.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,"class":"highcharts-"+e,zIndex:a.zIndex||4}).add(),d[e].update=function(a){d.setTitle(!b&&a,b&&a)},k||d[e].css(a.style))});d.layOutTitles(e)},layOutTitles:function(a){var b=0,e,d=this.renderer,f=this.spacingBox;["title","subtitle"].forEach(function(a){var e=this[a],k=this.options[a];a="title"===a?-3:k.verticalAlign?0:b+2;var c;e&&(this.styledMode||
-(c=k.style.fontSize),c=d.fontMetrics(c,e).b,e.css({width:(k.width||f.width+k.widthAdjust)+"px"}).align(m({y:a+c},k),!1,"spacingBox"),k.floating||k.verticalAlign||(b=Math.ceil(b+e.getBBox(k.useHTML).height)))},this);e=this.titleOffset!==b;this.titleOffset=b;!this.isDirtyBox&&e&&(this.isDirtyBox=this.isDirtyLegend=e,this.hasRendered&&A(a,!0)&&this.isDirtyBox&&this.redraw())},getChartSize:function(){var b=this.options.chart,e=b.width,b=b.height,f=this.renderTo;d(e)||(this.containerWidth=a.getStyle(f,
-"width"));d(b)||(this.containerHeight=a.getStyle(f,"height"));this.chartWidth=Math.max(0,e||this.containerWidth||600);this.chartHeight=Math.max(0,a.relativeLength(b,this.chartWidth)||(1<this.containerHeight?this.containerHeight:400))},temporaryDisplay:function(b){var e=this.renderTo;if(b)for(;e&&e.style;)e.hcOrigStyle&&(a.css(e,e.hcOrigStyle),delete e.hcOrigStyle),e.hcOrigDetached&&(c.body.removeChild(e),e.hcOrigDetached=!1),e=e.parentNode;else for(;e&&e.style;){c.body.contains(e)||e.parentNode||
-(e.hcOrigDetached=!0,c.body.appendChild(e));if("none"===a.getStyle(e,"display",!1)||e.hcOricDetached)e.hcOrigStyle={display:e.style.display,height:e.style.height,overflow:e.style.overflow},b={display:"block",overflow:"hidden"},e!==this.renderTo&&(b.height=0),a.css(e,b),e.offsetWidth||e.style.setProperty("display","block","important");e=e.parentNode;if(e===c.body)break}},setClassName:function(a){this.container.className="highcharts-container "+(a||"")},getContainer:function(){var e,d=this.options,
-f=d.chart,k,q;e=this.renderTo;var p=a.uniqueKey(),A,t;e||(this.renderTo=e=f.renderTo);x(e)&&(this.renderTo=e=c.getElementById(e));e||a.error(13,!0,this);k=D(h(e,"data-highcharts-chart"));l(k)&&n[k]&&n[k].hasRendered&&n[k].destroy();h(e,"data-highcharts-chart",this.index);e.innerHTML="";f.skipClone||e.offsetWidth||this.temporaryDisplay();this.getChartSize();k=this.chartWidth;q=this.chartHeight;g(e,{overflow:"hidden"});this.styledMode||(A=m({position:"relative",overflow:"hidden",width:k+"px",height:q+
-"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},f.style));this.container=e=u("div",{id:p},A,e);this._cursor=e.style.cursor;this.renderer=new (a[f.renderer]||a.Renderer)(e,k,q,null,f.forExport,d.exporting&&d.exporting.allowHTML,this.styledMode);this.setClassName(f.className);if(this.styledMode)for(t in d.defs)this.renderer.definition(d.defs[t]);else this.renderer.setStyle(f.style);this.renderer.chartIndex=this.index;b(this,"afterGetContainer")},getMargins:function(a){var e=
-this.spacing,f=this.margin,k=this.titleOffset;this.resetMargins();k&&!d(f[0])&&(this.plotTop=Math.max(this.plotTop,k+this.options.title.margin+e[0]));this.legend&&this.legend.display&&this.legend.adjustMargins(f,e);b(this,"getMargins");a||this.getAxisMargins()},getAxisMargins:function(){var a=this,b=a.axisOffset=[0,0,0,0],e=a.margin;a.hasCartesianSeries&&a.axes.forEach(function(a){a.visible&&a.getOffset()});H.forEach(function(f,k){d(e[k])||(a[f]+=b[k])});a.setChartSize()},reflow:function(b){var e=
-this,f=e.options.chart,k=e.renderTo,g=d(f.width)&&d(f.height),q=f.width||a.getStyle(k,"width"),f=f.height||a.getStyle(k,"height"),k=b?b.target:I;if(!g&&!e.isPrinting&&q&&f&&(k===I||k===c)){if(q!==e.containerWidth||f!==e.containerHeight)a.clearTimeout(e.reflowTimeout),e.reflowTimeout=L(function(){e.container&&e.setSize(void 0,void 0,!1)},b?100:0);e.containerWidth=q;e.containerHeight=f}},setReflow:function(a){var b=this;!1===a||this.unbindReflow?!1===a&&this.unbindReflow&&(this.unbindReflow=this.unbindReflow()):
-(this.unbindReflow=y(I,"resize",function(a){b.reflow(a)}),y(this,"destroy",this.unbindReflow))},setSize:function(e,f,d){var k=this,c=k.renderer,q;k.isResizing+=1;a.setAnimation(d,k);k.oldChartHeight=k.chartHeight;k.oldChartWidth=k.chartWidth;void 0!==e&&(k.options.chart.width=e);void 0!==f&&(k.options.chart.height=f);k.getChartSize();k.styledMode||(q=c.globalAnimation,(q?G:g)(k.container,{width:k.chartWidth+"px",height:k.chartHeight+"px"},q));k.setChartSize(!0);c.setSize(k.chartWidth,k.chartHeight,
-d);k.axes.forEach(function(a){a.isDirty=!0;a.setScale()});k.isDirtyLegend=!0;k.isDirtyBox=!0;k.layOutTitles();k.getMargins();k.redraw(d);k.oldChartHeight=null;b(k,"resize");L(function(){k&&b(k,"endResize",null,function(){--k.isResizing})},E(q).duration)},setChartSize:function(a){var e=this.inverted,f=this.renderer,d=this.chartWidth,k=this.chartHeight,c=this.options.chart,g=this.spacing,q=this.clipOffset,l,m,p,A;this.plotLeft=l=Math.round(this.plotLeft);this.plotTop=m=Math.round(this.plotTop);this.plotWidth=
-p=Math.max(0,Math.round(d-l-this.marginRight));this.plotHeight=A=Math.max(0,Math.round(k-m-this.marginBottom));this.plotSizeX=e?A:p;this.plotSizeY=e?p:A;this.plotBorderWidth=c.plotBorderWidth||0;this.spacingBox=f.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:k-g[0]-g[2]};this.plotBox=f.plotBox={x:l,y:m,width:p,height:A};d=2*Math.floor(this.plotBorderWidth/2);e=Math.ceil(Math.max(d,q[3])/2);f=Math.ceil(Math.max(d,q[0])/2);this.clipBox={x:e,y:f,width:Math.floor(this.plotSizeX-Math.max(d,q[1])/
-2-e),height:Math.max(0,Math.floor(this.plotSizeY-Math.max(d,q[2])/2-f))};a||this.axes.forEach(function(a){a.setAxisSize();a.setAxisTranslation()});b(this,"afterSetChartSize",{skipAxes:a})},resetMargins:function(){b(this,"resetMargins");var a=this,e=a.options.chart;["margin","spacing"].forEach(function(b){var d=e[b],k=f(d)?d:[d,d,d,d];["Top","Right","Bottom","Left"].forEach(function(d,f){a[b][f]=A(e[b+d],k[f])})});H.forEach(function(b,e){a[b]=A(a.margin[e],a.spacing[e])});a.axisOffset=[0,0,0,0];a.clipOffset=
-[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,e=this.renderer,d=this.chartWidth,f=this.chartHeight,k=this.chartBackground,c=this.plotBackground,g=this.plotBorder,q,l=this.styledMode,m=this.plotBGImage,p=a.backgroundColor,A=a.plotBackgroundColor,h=a.plotBackgroundImage,D,t=this.plotLeft,n=this.plotTop,B=this.plotWidth,x=this.plotHeight,r=this.plotBox,z=this.clipRect,u=this.clipBox,v="animate";k||(this.chartBackground=k=e.rect().addClass("highcharts-background").add(),v="attr");if(l)q=
-D=k.strokeWidth();else{q=a.borderWidth||0;D=q+(a.shadow?8:0);p={fill:p||"none"};if(q||k["stroke-width"])p.stroke=a.borderColor,p["stroke-width"]=q;k.attr(p).shadow(a.shadow)}k[v]({x:D/2,y:D/2,width:d-D-q%2,height:f-D-q%2,r:a.borderRadius});v="animate";c||(v="attr",this.plotBackground=c=e.rect().addClass("highcharts-plot-background").add());c[v](r);l||(c.attr({fill:A||"none"}).shadow(a.plotShadow),h&&(m?m.animate(r):this.plotBGImage=e.image(h,t,n,B,x).add()));z?z.animate({width:u.width,height:u.height}):
-this.clipRect=e.clipRect(u);v="animate";g||(v="attr",this.plotBorder=g=e.rect().addClass("highcharts-plot-border").attr({zIndex:1}).add());l||g.attr({stroke:a.plotBorderColor,"stroke-width":a.plotBorderWidth||0,fill:"none"});g[v](g.crisp({x:t,y:n,width:B,height:x},-g.strokeWidth()));this.isDirtyBox=!1;b(this,"afterDrawChartBox")},propFromSeries:function(){var a=this,b=a.options.chart,d,f=a.options.series,k,c;["inverted","angular","polar"].forEach(function(g){d=e[b.type||b.defaultSeriesType];c=b[g]||
-d&&d.prototype[g];for(k=f&&f.length;!c&&k--;)(d=e[f[k].type])&&d.prototype[g]&&(c=!0);a[g]=c})},linkSeries:function(){var a=this,e=a.series;e.forEach(function(a){a.linkedSeries.length=0});e.forEach(function(b){var e=b.options.linkedTo;x(e)&&(e=":previous"===e?a.series[b.index-1]:a.get(e))&&e.linkedParent!==b&&(e.linkedSeries.push(b),b.linkedParent=e,b.visible=A(b.options.visible,e.options.visible,b.visible))});b(this,"afterLinkSeries")},renderSeries:function(){this.series.forEach(function(a){a.translate();
-a.render()})},renderLabels:function(){var a=this,b=a.options.labels;b.items&&b.items.forEach(function(e){var d=m(b.style,e.style),f=D(d.left)+a.plotLeft,k=D(d.top)+a.plotTop+12;delete d.left;delete d.top;a.renderer.text(e.html,f,k).attr({zIndex:2}).css(d).add()})},render:function(){var a=this.axes,b=this.renderer,e=this.options,d,f,k;this.setTitle();this.legend=new t(this,e.legend);this.getStacks&&this.getStacks();this.getMargins(!0);this.setChartSize();e=this.plotWidth;d=this.plotHeight=Math.max(this.plotHeight-
-21,0);a.forEach(function(a){a.setScale()});this.getAxisMargins();f=1.1<e/this.plotWidth;k=1.05<d/this.plotHeight;if(f||k)a.forEach(function(a){(a.horiz&&f||!a.horiz&&k)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries&&a.forEach(function(a){a.visible&&a.render()});this.seriesGroup||(this.seriesGroup=b.g("series-group").attr({zIndex:3}).add());this.renderSeries();this.renderLabels();this.addCredits();this.setResponsive&&this.setResponsive();this.hasRendered=!0},
-addCredits:function(a){var b=this;a=F(!0,this.options.credits,a);a.enabled&&!this.credits&&(this.credits=this.renderer.text(a.text+(this.mapCredits||""),0,0).addClass("highcharts-credits").on("click",function(){a.href&&(I.location.href=a.href)}).attr({align:a.position.align,zIndex:8}),b.styledMode||this.credits.css(a.style),this.credits.add().align(a.position),this.credits.update=function(a){b.credits=b.credits.destroy();b.addCredits(a)})},destroy:function(){var e=this,d=e.axes,f=e.series,k=e.container,
-c,g=k&&k.parentNode;b(e,"destroy");e.renderer.forExport?a.erase(n,e):n[e.index]=void 0;a.chartCount--;e.renderTo.removeAttribute("data-highcharts-chart");B(e);for(c=d.length;c--;)d[c]=d[c].destroy();this.scroller&&this.scroller.destroy&&this.scroller.destroy();for(c=f.length;c--;)f[c]=f[c].destroy();"title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" ").forEach(function(a){var b=e[a];
-b&&b.destroy&&(e[a]=b.destroy())});k&&(k.innerHTML="",B(k),g&&w(k));z(e,function(a,b){delete e[b]})},firstRender:function(){var e=this,d=e.options;if(!e.isReadyToRender||e.isReadyToRender()){e.getContainer();e.resetMargins();e.setChartSize();e.propFromSeries();e.getAxes();(a.isArray(d.series)?d.series:[]).forEach(function(a){e.initSeries(a)});e.linkSeries();b(e,"beforeRender");k&&(e.pointer=new k(e,d));e.render();if(!e.renderer.imgCount&&e.onload)e.onload();e.temporaryDisplay(!0)}},onload:function(){[this.callback].concat(this.callbacks).forEach(function(a){a&&
-void 0!==this.index&&a.apply(this,[this])},this);b(this,"load");b(this,"render");d(this.index)&&this.setReflow(this.options.chart.reflow);this.onload=null}})})(J);(function(a){var y=a.addEvent,G=a.Chart;y(G,"afterSetChartSize",function(y){var h=this.options.chart.scrollablePlotArea;(h=h&&h.minWidth)&&!this.renderer.forExport&&(this.scrollablePixels=h=Math.max(0,h-this.chartWidth))&&(this.plotWidth+=h,this.clipBox.width+=h,y.skipAxes||this.axes.forEach(function(c){1===c.side?c.getPlotLinePath=function(){var h=
-this.right,u;this.right=h-c.chart.scrollablePixels;u=a.Axis.prototype.getPlotLinePath.apply(this,arguments);this.right=h;return u}:(c.setAxisSize(),c.setAxisTranslation())}))});y(G,"render",function(){this.scrollablePixels?(this.setUpScrolling&&this.setUpScrolling(),this.applyFixed()):this.fixedDiv&&this.applyFixed()});G.prototype.setUpScrolling=function(){this.scrollingContainer=a.createElement("div",{className:"highcharts-scrolling"},{overflowX:"auto",WebkitOverflowScrolling:"touch"},this.renderTo);
-this.innerContainer=a.createElement("div",{className:"highcharts-inner-container"},null,this.scrollingContainer);this.innerContainer.appendChild(this.container);this.setUpScrolling=null};G.prototype.applyFixed=function(){var y=this.container,h,c,r=!this.fixedDiv;r&&(this.fixedDiv=a.createElement("div",{className:"highcharts-fixed"},{position:"absolute",overflow:"hidden",pointerEvents:"none",zIndex:2},null,!0),this.renderTo.insertBefore(this.fixedDiv,this.renderTo.firstChild),this.renderTo.style.overflow=
-"visible",this.fixedRenderer=h=new a.Renderer(this.fixedDiv,0,0),this.scrollableMask=h.path().attr({fill:a.color(this.options.chart.backgroundColor||"#fff").setOpacity(.85).get(),zIndex:-1}).addClass("highcharts-scrollable-mask").add(),[this.inverted?".highcharts-xaxis":".highcharts-yaxis",this.inverted?".highcharts-xaxis-labels":".highcharts-yaxis-labels",".highcharts-contextbutton",".highcharts-credits",".highcharts-legend",".highcharts-subtitle",".highcharts-title",".highcharts-legend-checkbox"].forEach(function(a){[].forEach.call(y.querySelectorAll(a),
-function(a){(a.namespaceURI===h.SVG_NS?h.box:h.box.parentNode).appendChild(a);a.style.pointerEvents="auto"})}));this.fixedRenderer.setSize(this.chartWidth,this.chartHeight);c=this.chartWidth+this.scrollablePixels;a.stop(this.container);this.container.style.width=c+"px";this.renderer.boxWrapper.attr({width:c,height:this.chartHeight,viewBox:[0,0,c,this.chartHeight].join(" ")});this.chartBackground.attr({width:c});r&&(c=this.options.chart.scrollablePlotArea,c.scrollPositionX&&(this.scrollingContainer.scrollLeft=
-this.scrollablePixels*c.scrollPositionX));r=this.axisOffset;c=this.plotTop-r[0]-1;var r=this.plotTop+this.plotHeight+r[2],u=this.plotLeft+this.plotWidth-this.scrollablePixels;this.scrollableMask.attr({d:this.scrollablePixels?["M",0,c,"L",this.plotLeft-1,c,"L",this.plotLeft-1,r,"L",0,r,"Z","M",u,c,"L",this.chartWidth,c,"L",this.chartWidth,r,"L",u,r,"Z"]:["M",0,0]})}})(J);(function(a){var y,G=a.extend,E=a.erase,h=a.fireEvent,c=a.format,r=a.isArray,u=a.isNumber,v=a.pick,w=a.uniqueKey,n=a.defined,g=a.removeEvent;
-a.Point=y=function(){};a.Point.prototype={init:function(a,c,g){var b;b=a.chart.options.chart.colorCount;var d=a.chart.styledMode;this.series=a;d||(this.color=a.color);this.applyOptions(c,g);this.id=n(this.id)?this.id:w();a.options.colorByPoint?(d||(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter],b=b.length),c=a.colorCounter,a.colorCounter++,a.colorCounter===b&&(a.colorCounter=0)):c=a.colorIndex;this.colorIndex=v(this.colorIndex,c);a.chart.pointCount++;h(this,"afterInit");
-return this},applyOptions:function(a,c){var d=this.series,b=d.options.pointValKey||d.pointValKey;a=y.prototype.optionsToObject.call(this,a);G(this,a);this.options=this.options?G(this.options,a):a;a.group&&delete this.group;a.dataLabels&&delete this.dataLabels;b&&(this.y=this[b]);this.isNull=v(this.isValid&&!this.isValid(),null===this.x||!u(this.y,!0));this.selected&&(this.state="select");"name"in this&&void 0===c&&d.xAxis&&d.xAxis.hasNames&&(this.x=d.xAxis.nameToX(this));void 0===this.x&&d&&(this.x=
-void 0===c?d.autoIncrement(this):c);return this},setNestedProperty:function(d,c,g){g.split(".").reduce(function(b,d,f,g){b[d]=g.length-1===f?c:a.isObject(b[d],!0)?b[d]:{};return b[d]},d);return d},optionsToObject:function(d){var c={},g=this.series,b=g.options.keys,l=b||g.pointArrayMap||["y"],f=l.length,h=0,t=0;if(u(d)||null===d)c[l[0]]=d;else if(r(d))for(!b&&d.length>f&&(g=typeof d[0],"string"===g?c.name=d[0]:"number"===g&&(c.x=d[0]),h++);t<f;)b&&void 0===d[h]||(0<l[t].indexOf(".")?a.Point.prototype.setNestedProperty(c,
-d[h],l[t]):c[l[t]]=d[h]),h++,t++;else"object"===typeof d&&(c=d,d.dataLabels&&(g._hasPointLabels=!0),d.marker&&(g._hasPointMarkers=!0));return c},getClassName:function(){return"highcharts-point"+(this.selected?" highcharts-point-select":"")+(this.negative?" highcharts-negative":"")+(this.isNull?" highcharts-null-point":"")+(void 0!==this.colorIndex?" highcharts-color-"+this.colorIndex:"")+(this.options.className?" "+this.options.className:"")+(this.zone&&this.zone.className?" "+this.zone.className.replace("highcharts-negative",
-""):"")},getZone:function(){var a=this.series,c=a.zones,a=a.zoneAxis||"y",g=0,b;for(b=c[g];this[a]>=b.value;)b=c[++g];this.nonZonedColor||(this.nonZonedColor=this.color);this.color=b&&b.color&&!this.options.color?b.color:this.nonZonedColor;return b},destroy:function(){var a=this.series.chart,c=a.hoverPoints,h;a.pointCount--;c&&(this.setState(),E(c,this),c.length||(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel||this.dataLabels)g(this),this.destroyElements();
-this.legendItem&&a.legend.destroyItem(this);for(h in this)this[h]=null},destroyElements:function(){for(var a=["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"],c,g=6;g--;)c=a[g],this[c]&&(this[c]=this[c].destroy());this.dataLabels&&(this.dataLabels.forEach(function(a){a.element&&a.destroy()}),delete this.dataLabels);this.connectors&&(this.connectors.forEach(function(a){a.element&&a.destroy()}),delete this.connectors)},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,
-colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var d=this.series,g=d.tooltipOptions,b=v(g.valueDecimals,""),l=g.valuePrefix||"",f=g.valueSuffix||"";d.chart.styledMode&&(a=d.chart.tooltip.styledModeFormat(a));(d.pointArrayMap||["y"]).forEach(function(d){d="{point."+d;if(l||f)a=a.replace(RegExp(d+"}","g"),l+d+"}"+f);a=a.replace(RegExp(d+"}","g"),d+":,."+b+"f}")});return c(a,
-{point:this,series:this.series},d.chart.time)},firePointEvent:function(a,c,g){var b=this,d=this.series.options;(d.point.events[a]||b.options&&b.options.events&&b.options.events[a])&&this.importEvents();"click"===a&&d.allowPointSelect&&(g=function(a){b.select&&b.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});h(this,a,c,g)},visible:!0}})(J);(function(a){var y=a.addEvent,G=a.animObject,E=a.arrayMax,h=a.arrayMin,c=a.correctFloat,r=a.defaultOptions,u=a.defaultPlotOptions,v=a.defined,w=a.erase,n=a.extend,
-g=a.fireEvent,d=a.isArray,m=a.isNumber,p=a.isString,b=a.merge,l=a.objectEach,f=a.pick,x=a.removeEvent,t=a.splat,H=a.SVGElement,F=a.syncTimeout,z=a.win;a.Series=a.seriesType("line",null,{lineWidth:2,allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},marker:{lineWidth:0,lineColor:"#ffffff",enabledThreshold:2,radius:4,states:{normal:{animation:!0},hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},
-point:{events:{}},dataLabels:{align:"center",formatter:function(){return null===this.y?"":a.numberFormat(this.y,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{normal:{animation:!0},hover:{animation:{duration:50},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{}},stickyTracking:!0,turboThreshold:1E3,findNearestPointBy:"x"},{isCartesian:!0,pointClass:a.Point,
-sorted:!0,requireSorting:!0,directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],coll:"series",init:function(a,b){g(this,"init",{options:b});var d=this,k,e=a.series,c;d.chart=a;d.options=b=d.setOptions(b);d.linkedSeries=[];d.bindAxes();n(d,{name:b.name,state:"",visible:!1!==b.visible,selected:!0===b.selected});k=b.events;l(k,function(a,b){y(d,b,a)});if(k&&k.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;d.getColor();d.getSymbol();
-d.parallelArrays.forEach(function(a){d[a+"Data"]=[]});d.setData(b.data,!1);d.isCartesian&&(a.hasCartesianSeries=!0);e.length&&(c=e[e.length-1]);d._i=f(c&&c._i,-1)+1;a.orderSeries(this.insert(e));g(this,"afterInit")},insert:function(a){var b=this.options.index,d;if(m(b)){for(d=a.length;d--;)if(b>=f(a[d].options.index,a[d]._i)){a.splice(d+1,0,this);break}-1===d&&a.unshift(this);d+=1}else a.push(this);return f(d,a.length-1)},bindAxes:function(){var b=this,d=b.options,f=b.chart,c;(b.axisTypes||[]).forEach(function(e){f[e].forEach(function(a){c=
-a.options;if(d[e]===c.index||void 0!==d[e]&&d[e]===c.id||void 0===d[e]&&0===c.index)b.insert(a.series),b[e]=a,a.isDirty=!0});b[e]||b.optionalAxis===e||a.error(18,!0,f)})},updateParallelArrays:function(a,b){var d=a.series,f=arguments,e=m(b)?function(e){var f="y"===e&&d.toYData?d.toYData(a):a[e];d[e+"Data"][b]=f}:function(a){Array.prototype[b].apply(d[a+"Data"],Array.prototype.slice.call(f,2))};d.parallelArrays.forEach(e)},autoIncrement:function(){var a=this.options,b=this.xIncrement,d,c=a.pointIntervalUnit,
-e=this.chart.time,b=f(b,a.pointStart,0);this.pointInterval=d=f(this.pointInterval,a.pointInterval,1);c&&(a=new e.Date(b),"day"===c?e.set("Date",a,e.get("Date",a)+d):"month"===c?e.set("Month",a,e.get("Month",a)+d):"year"===c&&e.set("FullYear",a,e.get("FullYear",a)+d),d=a.getTime()-b);this.xIncrement=b+d;return b},setOptions:function(a){var d=this.chart,c=d.options,k=c.plotOptions,e=(d.userOptions||{}).plotOptions||{},q=k[this.type],l=d.styledMode;this.userOptions=a;d=b(q,k.series,a);this.tooltipOptions=
-b(r.tooltip,r.plotOptions.series&&r.plotOptions.series.tooltip,r.plotOptions[this.type].tooltip,c.tooltip.userOptions,k.series&&k.series.tooltip,k[this.type].tooltip,a.tooltip);this.stickyTracking=f(a.stickyTracking,e[this.type]&&e[this.type].stickyTracking,e.series&&e.series.stickyTracking,this.tooltipOptions.shared&&!this.noSharedTooltip?!0:d.stickyTracking);null===q.marker&&delete d.marker;this.zoneAxis=d.zoneAxis;a=this.zones=(d.zones||[]).slice();!d.negativeColor&&!d.negativeFillColor||d.zones||
-(c={value:d[this.zoneAxis+"Threshold"]||d.threshold||0,className:"highcharts-negative"},l||(c.color=d.negativeColor,c.fillColor=d.negativeFillColor),a.push(c));a.length&&v(a[a.length-1].value)&&a.push(l?{}:{color:this.color,fillColor:this.fillColor});g(this,"afterSetOptions",{options:d});return d},getName:function(){return f(this.options.name,"Series "+(this.index+1))},getCyclic:function(a,b,d){var c,e=this.chart,k=this.userOptions,g=a+"Index",l=a+"Counter",m=d?d.length:f(e.options.chart[a+"Count"],
-e[a+"Count"]);b||(c=f(k[g],k["_"+g]),v(c)||(e.series.length||(e[l]=0),k["_"+g]=c=e[l]%m,e[l]+=1),d&&(b=d[c]));void 0!==c&&(this[g]=c);this[a]=b},getColor:function(){this.chart.styledMode?this.getCyclic("color"):this.options.colorByPoint?this.options.color=null:this.getCyclic("color",this.options.color||u[this.type].color,this.chart.options.colors)},getSymbol:function(){this.getCyclic("symbol",this.options.marker.symbol,this.chart.options.symbols)},drawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,
-updateData:function(b){var d=this.options,f=this.points,c=[],e,k,g,l=this.requireSorting;this.xIncrement=null;b.forEach(function(b){var k,q,h;k=a.defined(b)&&this.pointClass.prototype.optionsToObject.call({series:this},b)||{};h=k.x;if((k=k.id)||m(h))k&&(q=(q=this.chart.get(k))&&q.x),void 0===q&&m(h)&&(q=this.xData.indexOf(h,g)),-1===q||void 0===q||f[q].touched?c.push(b):b!==d.data[q]?(f[q].update(b,!1,null,!1),f[q].touched=!0,l&&(g=q+1)):f[q]&&(f[q].touched=!0),e=!0},this);if(e)for(b=f.length;b--;)k=
-f[b],k.touched||k.remove(!1),k.touched=!1;else if(b.length===f.length)b.forEach(function(a,b){f[b].update&&a!==d.data[b]&&f[b].update(a,!1,null,!1)});else return!1;c.forEach(function(a){this.addPoint(a,!1)},this);return!0},setData:function(b,c,g,l){var e=this,k=e.points,h=k&&k.length||0,A,t=e.options,n=e.chart,D=null,B=e.xAxis,x=t.turboThreshold,z=this.xData,r=this.yData,u=(A=e.pointArrayMap)&&A.length,v;b=b||[];A=b.length;c=f(c,!0);!1!==l&&A&&h&&!e.cropped&&!e.hasGroupedData&&e.visible&&!e.isSeriesBoosting&&
-(v=this.updateData(b));if(!v){e.xIncrement=null;e.colorCounter=0;this.parallelArrays.forEach(function(a){e[a+"Data"].length=0});if(x&&A>x){for(g=0;null===D&&g<A;)D=b[g],g++;if(m(D))for(g=0;g<A;g++)z[g]=this.autoIncrement(),r[g]=b[g];else if(d(D))if(u)for(g=0;g<A;g++)D=b[g],z[g]=D[0],r[g]=D.slice(1,u+1);else for(g=0;g<A;g++)D=b[g],z[g]=D[0],r[g]=D[1];else a.error(12,!1,n)}else for(g=0;g<A;g++)void 0!==b[g]&&(D={series:e},e.pointClass.prototype.applyOptions.apply(D,[b[g]]),e.updateParallelArrays(D,
-g));r&&p(r[0])&&a.error(14,!0,n);e.data=[];e.options.data=e.userOptions.data=b;for(g=h;g--;)k[g]&&k[g].destroy&&k[g].destroy();B&&(B.minRange=B.userMinRange);e.isDirty=n.isDirtyBox=!0;e.isDirtyData=!!k;g=!1}"point"===t.legendType&&(this.processData(),this.generatePoints());c&&n.redraw(g)},processData:function(b){var d=this.xData,f=this.yData,c=d.length,e;e=0;var k,g,l=this.xAxis,m,h=this.options;m=h.cropThreshold;var p=this.getExtremesFromAll||h.getExtremesFromAll,t=this.isCartesian,h=l&&l.val2lin,
-n=l&&l.isLog,x=this.requireSorting,r,z;if(t&&!this.isDirty&&!l.isDirty&&!this.yAxis.isDirty&&!b)return!1;l&&(b=l.getExtremes(),r=b.min,z=b.max);t&&this.sorted&&!p&&(!m||c>m||this.forceCrop)&&(d[c-1]<r||d[0]>z?(d=[],f=[]):this.yData&&(d[0]<r||d[c-1]>z)&&(e=this.cropData(this.xData,this.yData,r,z),d=e.xData,f=e.yData,e=e.start,k=!0));for(m=d.length||1;--m;)c=n?h(d[m])-h(d[m-1]):d[m]-d[m-1],0<c&&(void 0===g||c<g)?g=c:0>c&&x&&(a.error(15,!1,this.chart),x=!1);this.cropped=k;this.cropStart=e;this.processedXData=
-d;this.processedYData=f;this.closestPointRange=g},cropData:function(a,b,d,c,e){var k=a.length,g=0,l=k,m;e=f(e,this.cropShoulder,1);for(m=0;m<k;m++)if(a[m]>=d){g=Math.max(0,m-e);break}for(d=m;d<k;d++)if(a[d]>c){l=d+e;break}return{xData:a.slice(g,l),yData:b.slice(g,l),start:g,end:l}},generatePoints:function(){var a=this.options,b=a.data,d=this.data,f,e=this.processedXData,c=this.processedYData,g=this.pointClass,l=e.length,m=this.cropStart||0,h,p=this.hasGroupedData,a=a.keys,x,r=[],z;d||p||(d=[],d.length=
-b.length,d=this.data=d);a&&p&&(this.options.keys=!1);for(z=0;z<l;z++)h=m+z,p?(x=(new g).init(this,[e[z]].concat(t(c[z]))),x.dataGroup=this.groupMap[z],x.dataGroup.options&&(x.options=x.dataGroup.options,n(x,x.dataGroup.options))):(x=d[h])||void 0===b[h]||(d[h]=x=(new g).init(this,b[h],e[z])),x&&(x.index=h,r[z]=x);this.options.keys=a;if(d&&(l!==(f=d.length)||p))for(z=0;z<f;z++)z!==m||p||(z+=l),d[z]&&(d[z].destroyElements(),d[z].plotX=void 0);this.data=d;this.points=r},getExtremes:function(a){var b=
-this.yAxis,f=this.processedXData,c,e=[],k=0;c=this.xAxis.getExtremes();var g=c.min,l=c.max,p,t,n=this.requireSorting?1:0,x,z;a=a||this.stackedYData||this.processedYData||[];c=a.length;for(z=0;z<c;z++)if(t=f[z],x=a[z],p=(m(x,!0)||d(x))&&(!b.positiveValuesOnly||x.length||0<x),t=this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||(f[z+n]||t)>=g&&(f[z-n]||t)<=l,p&&t)if(p=x.length)for(;p--;)"number"===typeof x[p]&&(e[k++]=x[p]);else e[k++]=x;this.dataMin=h(e);this.dataMax=E(e)},translate:function(){this.processedXData||
-this.processData();this.generatePoints();var a=this.options,b=a.stacking,d=this.xAxis,l=d.categories,e=this.yAxis,q=this.points,h=q.length,p=!!this.modifyValue,t=a.pointPlacement,n="between"===t||m(t),x=a.threshold,z=a.startFromThreshold?x:0,r,u,F,H,w=Number.MAX_VALUE;"between"===t&&(t=.5);m(t)&&(t*=f(a.pointRange||d.pointRange));for(a=0;a<h;a++){var y=q[a],E=y.x,G=y.y;u=y.low;var J=b&&e.stacks[(this.negStacks&&G<(z?0:x)?"-":"")+this.stackKey],U;e.positiveValuesOnly&&null!==G&&0>=G&&(y.isNull=!0);
-y.plotX=r=c(Math.min(Math.max(-1E5,d.translate(E,0,0,0,1,t,"flags"===this.type)),1E5));b&&this.visible&&!y.isNull&&J&&J[E]&&(H=this.getStackIndicator(H,E,this.index),U=J[E],G=U.points[H.key],u=G[0],G=G[1],u===z&&H.key===J[E].base&&(u=f(m(x)&&x,e.min)),e.positiveValuesOnly&&0>=u&&(u=null),y.total=y.stackTotal=U.total,y.percentage=U.total&&y.y/U.total*100,y.stackY=G,U.setOffset(this.pointXOffset||0,this.barW||0));y.yBottom=v(u)?Math.min(Math.max(-1E5,e.translate(u,0,1,0,1)),1E5):null;p&&(G=this.modifyValue(G,
-y));y.plotY=u="number"===typeof G&&Infinity!==G?Math.min(Math.max(-1E5,e.translate(G,0,1,0,1)),1E5):void 0;y.isInside=void 0!==u&&0<=u&&u<=e.len&&0<=r&&r<=d.len;y.clientX=n?c(d.translate(E,0,0,0,1,t)):r;y.negative=y.y<(x||0);y.category=l&&void 0!==l[y.x]?l[y.x]:y.x;y.isNull||(void 0!==F&&(w=Math.min(w,Math.abs(r-F))),F=r);y.zone=this.zones.length&&y.getZone()}this.closestPointRangePx=w;g(this,"afterTranslate")},getValidPoints:function(a,b){var d=this.chart;return(a||this.points||[]).filter(function(a){return b&&
-!d.isInsidePlot(a.plotX,a.plotY,d.inverted)?!1:!a.isNull})},setClip:function(a){var b=this.chart,d=this.options,f=b.renderer,e=b.inverted,c=this.clipBox,k=c||b.clipBox,g=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,k.height,d.xAxis,d.yAxis].join(),l=b[g],m=b[g+"m"];l||(a&&(k.width=0,e&&(k.x=b.plotSizeX),b[g+"m"]=m=f.clipRect(e?b.plotSizeX+99:-99,e?-b.plotLeft:-b.plotTop,99,e?b.chartWidth:b.chartHeight)),b[g]=l=f.clipRect(k),l.count={length:0});a&&!l.count[this.index]&&(l.count[this.index]=
-!0,l.count.length+=1);!1!==d.clip&&(this.group.clip(a||c?l:b.clipRect),this.markerGroup.clip(m),this.sharedClipKey=g);a||(l.count[this.index]&&(delete l.count[this.index],--l.count.length),0===l.count.length&&g&&b[g]&&(c||(b[g]=b[g].destroy()),b[g+"m"]&&(b[g+"m"]=b[g+"m"].destroy())))},animate:function(a){var b=this.chart,d=G(this.options.animation),f;a?this.setClip(d):(f=this.sharedClipKey,(a=b[f])&&a.animate({width:b.plotSizeX,x:0},d),b[f+"m"]&&b[f+"m"].animate({width:b.plotSizeX+99,x:0},d),this.animate=
-null)},afterAnimate:function(){this.setClip();g(this,"afterAnimate");this.finishedAnimating=!0},drawPoints:function(){var a=this.points,b=this.chart,d,c,e,g,l=this.options.marker,m,h,p,t=this[this.specialGroup]||this.markerGroup;d=this.xAxis;var n,x=f(l.enabled,!d||d.isRadial?!0:null,this.closestPointRangePx>=l.enabledThreshold*l.radius);if(!1!==l.enabled||this._hasPointMarkers)for(d=0;d<a.length;d++)c=a[d],g=c.graphic,m=c.marker||{},h=!!c.marker,e=x&&void 0===m.enabled||m.enabled,p=!1!==c.isInside,
-e&&!c.isNull?(e=f(m.symbol,this.symbol),n=this.markerAttribs(c,c.selected&&"select"),g?g[p?"show":"hide"](!0).animate(n):p&&(0<n.width||c.hasImage)&&(c.graphic=g=b.renderer.symbol(e,n.x,n.y,n.width,n.height,h?m:l).add(t)),g&&!b.styledMode&&g.attr(this.pointAttribs(c,c.selected&&"select")),g&&g.addClass(c.getClassName(),!0)):g&&(c.graphic=g.destroy())},markerAttribs:function(a,b){var d=this.options.marker,c=a.marker||{},e=c.symbol||d.symbol,k=f(c.radius,d.radius);b&&(d=d.states[b],b=c.states&&c.states[b],
-k=f(b&&b.radius,d&&d.radius,k+(d&&d.radiusPlus||0)));a.hasImage=e&&0===e.indexOf("url");a.hasImage&&(k=0);a={x:Math.floor(a.plotX)-k,y:a.plotY-k};k&&(a.width=a.height=2*k);return a},pointAttribs:function(a,b){var d=this.options.marker,c=a&&a.options,e=c&&c.marker||{},k=this.color,g=c&&c.color,l=a&&a.color,c=f(e.lineWidth,d.lineWidth);a=a&&a.zone&&a.zone.color;k=g||a||l||k;a=e.fillColor||d.fillColor||k;k=e.lineColor||d.lineColor||k;b&&(d=d.states[b],b=e.states&&e.states[b]||{},c=f(b.lineWidth,d.lineWidth,
-c+f(b.lineWidthPlus,d.lineWidthPlus,0)),a=b.fillColor||d.fillColor||a,k=b.lineColor||d.lineColor||k);return{stroke:k,"stroke-width":c,fill:a}},destroy:function(){var b=this,d=b.chart,f=/AppleWebKit\/533/.test(z.navigator.userAgent),c,e,q=b.data||[],m,h;g(b,"destroy");x(b);(b.axisTypes||[]).forEach(function(a){(h=b[a])&&h.series&&(w(h.series,b),h.isDirty=h.forceRedraw=!0)});b.legendItem&&b.chart.legend.destroyItem(b);for(e=q.length;e--;)(m=q[e])&&m.destroy&&m.destroy();b.points=null;a.clearTimeout(b.animationTimeout);
-l(b,function(a,b){a instanceof H&&!a.survive&&(c=f&&"group"===b?"hide":"destroy",a[c]())});d.hoverSeries===b&&(d.hoverSeries=null);w(d.series,b);d.orderSeries();l(b,function(a,e){delete b[e]})},getGraphPath:function(a,b,d){var f=this,e=f.options,c=e.step,g,k=[],l=[],m;a=a||f.points;(g=a.reversed)&&a.reverse();(c={right:1,center:2}[c]||c&&3)&&g&&(c=4-c);!e.connectNulls||b||d||(a=this.getValidPoints(a));a.forEach(function(g,q){var h=g.plotX,p=g.plotY,t=a[q-1];(g.leftCliff||t&&t.rightCliff)&&!d&&(m=
-!0);g.isNull&&!v(b)&&0<q?m=!e.connectNulls:g.isNull&&!b?m=!0:(0===q||m?q=["M",g.plotX,g.plotY]:f.getPointSpline?q=f.getPointSpline(a,g,q):c?(q=1===c?["L",t.plotX,p]:2===c?["L",(t.plotX+h)/2,t.plotY,"L",(t.plotX+h)/2,p]:["L",h,t.plotY],q.push("L",h,p)):q=["L",h,p],l.push(g.x),c&&(l.push(g.x),2===c&&l.push(g.x)),k.push.apply(k,q),m=!1)});k.xMap=l;return f.graphPath=k},drawGraph:function(){var a=this,b=this.options,d=(this.gappedPath||this.getGraphPath).call(this),f=this.chart.styledMode,e=[["graph",
-"highcharts-graph"]];f||e[0].push(b.lineColor||this.color,b.dashStyle);e=a.getZonesGraphs(e);e.forEach(function(e,c){var g=e[0],k=a[g];k?(k.endX=a.preventGraphAnimation?null:d.xMap,k.animate({d:d})):d.length&&(a[g]=a.chart.renderer.path(d).addClass(e[1]).attr({zIndex:1}).add(a.group),f||(k={stroke:e[2],"stroke-width":b.lineWidth,fill:a.fillGraph&&a.color||"none"},e[3]?k.dashstyle=e[3]:"square"!==b.linecap&&(k["stroke-linecap"]=k["stroke-linejoin"]="round"),k=a[g].attr(k).shadow(2>c&&b.shadow)));k&&
-(k.startX=d.xMap,k.isArea=d.isArea)})},getZonesGraphs:function(a){this.zones.forEach(function(b,d){d=["zone-graph-"+d,"highcharts-graph highcharts-zone-graph-"+d+" "+(b.className||"")];this.chart.styledMode||d.push(b.color||this.color,b.dashStyle||this.options.dashStyle);a.push(d)},this);return a},applyZones:function(){var a=this,b=this.chart,d=b.renderer,c=this.zones,e,g,l=this.clips||[],m,h=this.graph,p=this.area,t=Math.max(b.chartWidth,b.chartHeight),n=this[(this.zoneAxis||"y")+"Axis"],x,z,r=b.inverted,
-u,v,F,H,w=!1;c.length&&(h||p)&&n&&void 0!==n.min&&(z=n.reversed,u=n.horiz,h&&!this.showLine&&h.hide(),p&&p.hide(),x=n.getExtremes(),c.forEach(function(c,k){e=z?u?b.plotWidth:0:u?0:n.toPixels(x.min)||0;e=Math.min(Math.max(f(g,e),0),t);g=Math.min(Math.max(Math.round(n.toPixels(f(c.value,x.max),!0)||0),0),t);w&&(e=g=n.toPixels(x.max));v=Math.abs(e-g);F=Math.min(e,g);H=Math.max(e,g);n.isXAxis?(m={x:r?H:F,y:0,width:v,height:t},u||(m.x=b.plotHeight-m.x)):(m={x:0,y:r?H:F,width:t,height:v},u&&(m.y=b.plotWidth-
-m.y));r&&d.isVML&&(m=n.isXAxis?{x:0,y:z?F:H,height:m.width,width:b.chartWidth}:{x:m.y-b.plotLeft-b.spacingBox.x,y:0,width:m.height,height:b.chartHeight});l[k]?l[k].animate(m):(l[k]=d.clipRect(m),h&&a["zone-graph-"+k].clip(l[k]),p&&a["zone-area-"+k].clip(l[k]));w=c.value>x.max;a.resetZones&&0===g&&(g=void 0)}),this.clips=l)},invertGroups:function(a){function b(){["group","markerGroup"].forEach(function(b){d[b]&&(f.renderer.isVML&&d[b].attr({width:d.yAxis.len,height:d.xAxis.len}),d[b].width=d.yAxis.len,
-d[b].height=d.xAxis.len,d[b].invert(a))})}var d=this,f=d.chart,e;d.xAxis&&(e=y(f,"resize",b),y(d,"destroy",e),b(a),d.invertGroups=b)},plotGroup:function(a,b,d,f,e){var c=this[a],g=!c;g&&(this[a]=c=this.chart.renderer.g().attr({zIndex:f||.1}).add(e));c.addClass("highcharts-"+b+" highcharts-series-"+this.index+" highcharts-"+this.type+"-series "+(v(this.colorIndex)?"highcharts-color-"+this.colorIndex+" ":"")+(this.options.className||"")+(c.hasClass("highcharts-tracker")?" highcharts-tracker":""),!0);
-c.attr({visibility:d})[g?"attr":"animate"](this.getPlotBox());return c},getPlotBox:function(){var a=this.chart,b=this.xAxis,d=this.yAxis;a.inverted&&(b=d,d=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:d?d.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,d,f=a.options,e=!!a.animate&&b.renderer.isSVG&&G(f.animation).duration,c=a.visible?"inherit":"hidden",l=f.zIndex,m=a.hasRendered,h=b.seriesGroup,p=b.inverted;d=a.plotGroup("group","series",c,l,h);a.markerGroup=
-a.plotGroup("markerGroup","markers",c,l,h);e&&a.animate(!0);d.inverted=a.isCartesian?p:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(p);!1===f.clip||a.sharedClipKey||m||d.clip(b.clipRect);e&&a.animate();m||(a.animationTimeout=F(function(){a.afterAnimate()},e));a.isDirty=!1;a.hasRendered=!0;g(a,"afterRender")},redraw:function(){var a=this.chart,b=this.isDirty||
-this.isDirtyData,d=this.group,c=this.xAxis,e=this.yAxis;d&&(a.inverted&&d.attr({width:a.plotWidth,height:a.plotHeight}),d.animate({translateX:f(c&&c.left,a.plotLeft),translateY:f(e&&e.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdAxisArray:["clientX","plotY"],searchPoint:function(a,b){var d=this.xAxis,f=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?d.len-a.chartY+d.pos:a.chartX-d.pos,plotY:e?f.len-a.chartX+f.pos:a.chartY-f.pos},b)},buildKDTree:function(){function a(d,
-e,f){var c,g;if(g=d&&d.length)return c=b.kdAxisArray[e%f],d.sort(function(a,b){return a[c]-b[c]}),g=Math.floor(g/2),{point:d[g],left:a(d.slice(0,g),e+1,f),right:a(d.slice(g+1),e+1,f)}}this.buildingKdTree=!0;var b=this,d=-1<b.options.findNearestPointBy.indexOf("y")?2:1;delete b.kdTree;F(function(){b.kdTree=a(b.getValidPoints(null,!b.directTouch),d,d);b.buildingKdTree=!1},b.options.kdNow?0:1)},searchKDTree:function(a,b){function d(a,b,k,l){var m=b.point,h=f.kdAxisArray[k%l],q,p,t=m;p=v(a[e])&&v(m[e])?
-Math.pow(a[e]-m[e],2):null;q=v(a[c])&&v(m[c])?Math.pow(a[c]-m[c],2):null;q=(p||0)+(q||0);m.dist=v(q)?Math.sqrt(q):Number.MAX_VALUE;m.distX=v(p)?Math.sqrt(p):Number.MAX_VALUE;h=a[h]-m[h];q=0>h?"left":"right";p=0>h?"right":"left";b[q]&&(q=d(a,b[q],k+1,l),t=q[g]<t[g]?q:m);b[p]&&Math.sqrt(h*h)<t[g]&&(a=d(a,b[p],k+1,l),t=a[g]<t[g]?a:t);return t}var f=this,e=this.kdAxisArray[0],c=this.kdAxisArray[1],g=b?"distX":"dist";b=-1<f.options.findNearestPointBy.indexOf("y")?2:1;this.kdTree||this.buildingKdTree||
-this.buildKDTree();if(this.kdTree)return d(a,this.kdTree,b,b)}})})(J);(function(a){var y=a.Axis,G=a.Chart,E=a.correctFloat,h=a.defined,c=a.destroyObjectProperties,r=a.format,u=a.objectEach,v=a.pick,w=a.Series;a.StackItem=function(a,c,d,m,h){var b=a.chart.inverted;this.axis=a;this.isNegative=d;this.options=c;this.x=m;this.total=null;this.points={};this.stack=h;this.rightCliff=this.leftCliff=0;this.alignOptions={align:c.align||(b?d?"left":"right":"center"),verticalAlign:c.verticalAlign||(b?"middle":
-d?"bottom":"top"),y:v(c.y,b?4:d?14:-6),x:v(c.x,b?d?-6:6:0)};this.textAlign=c.textAlign||(b?d?"right":"left":"center")};a.StackItem.prototype={destroy:function(){c(this,this.axis)},render:function(a){var c=this.axis.chart,d=this.options,m=d.format,m=m?r(m,this,c.time):d.formatter.call(this);this.label?this.label.attr({text:m,visibility:"hidden"}):this.label=c.renderer.text(m,null,null,d.useHTML).css(d.style).attr({align:this.textAlign,rotation:d.rotation,visibility:"hidden"}).add(a);this.label.labelrank=
-c.plotHeight},setOffset:function(a,c){var d=this.axis,g=d.chart,p=d.translate(d.usePercentage?100:this.total,0,0,0,1),b=d.translate(0),b=h(p)&&Math.abs(p-b);a=g.xAxis[0].translate(this.x)+a;d=h(p)&&this.getStackBox(g,this,a,p,c,b,d);(c=this.label)&&d&&(c.align(this.alignOptions,null,d),d=c.alignAttr,c[!1===this.options.crop||g.isInsidePlot(d.x,d.y)?"show":"hide"](!0))},getStackBox:function(a,c,d,m,h,b,l){var f=c.axis.reversed,g=a.inverted;a=l.height+l.pos-(g?a.plotLeft:a.plotTop);c=c.isNegative&&
-!f||!c.isNegative&&f;return{x:g?c?m:m-b:d,y:g?a-d-h:c?a-m-b:a-m,width:g?b:h,height:g?h:b}}};G.prototype.getStacks=function(){var a=this;a.yAxis.forEach(function(a){a.stacks&&a.hasVisibleSeries&&(a.oldStacks=a.stacks)});a.series.forEach(function(c){!c.options.stacking||!0!==c.visible&&!1!==a.options.chart.ignoreHiddenSeries||(c.stackKey=c.type+v(c.options.stack,""))})};y.prototype.buildStacks=function(){var a=this.series,c=v(this.options.reversedStacks,!0),d=a.length,m;if(!this.isXAxis){this.usePercentage=
-!1;for(m=d;m--;)a[c?m:d-m-1].setStackedPoints();for(m=0;m<d;m++)a[m].modifyStacks()}};y.prototype.renderStackTotals=function(){var a=this.chart,c=a.renderer,d=this.stacks,m=this.stackTotalGroup;m||(this.stackTotalGroup=m=c.g("stack-labels").attr({visibility:"visible",zIndex:6}).add());m.translate(a.plotLeft,a.plotTop);u(d,function(a){u(a,function(a){a.render(m)})})};y.prototype.resetStacks=function(){var a=this,c=a.stacks;a.isXAxis||u(c,function(d){u(d,function(c,g){c.touched<a.stacksTouched?(c.destroy(),
-delete d[g]):(c.total=null,c.cumulative=null)})})};y.prototype.cleanStacks=function(){var a;this.isXAxis||(this.oldStacks&&(a=this.stacks=this.oldStacks),u(a,function(a){u(a,function(a){a.cumulative=a.total})}))};w.prototype.setStackedPoints=function(){if(this.options.stacking&&(!0===this.visible||!1===this.chart.options.chart.ignoreHiddenSeries)){var c=this.processedXData,g=this.processedYData,d=[],m=g.length,p=this.options,b=p.threshold,l=v(p.startFromThreshold&&b,0),f=p.stack,p=p.stacking,x=this.stackKey,
-t="-"+x,r=this.negStacks,u=this.yAxis,z=u.stacks,k=u.oldStacks,A,D,B,e,q,w,y;u.stacksTouched+=1;for(q=0;q<m;q++)w=c[q],y=g[q],A=this.getStackIndicator(A,w,this.index),e=A.key,B=(D=r&&y<(l?0:b))?t:x,z[B]||(z[B]={}),z[B][w]||(k[B]&&k[B][w]?(z[B][w]=k[B][w],z[B][w].total=null):z[B][w]=new a.StackItem(u,u.options.stackLabels,D,w,f)),B=z[B][w],null!==y?(B.points[e]=B.points[this.index]=[v(B.cumulative,l)],h(B.cumulative)||(B.base=e),B.touched=u.stacksTouched,0<A.index&&!1===this.singleStacks&&(B.points[e][0]=
-B.points[this.index+","+w+",0"][0])):B.points[e]=B.points[this.index]=null,"percent"===p?(D=D?x:t,r&&z[D]&&z[D][w]?(D=z[D][w],B.total=D.total=Math.max(D.total,B.total)+Math.abs(y)||0):B.total=E(B.total+(Math.abs(y)||0))):B.total=E(B.total+(y||0)),B.cumulative=v(B.cumulative,l)+(y||0),null!==y&&(B.points[e].push(B.cumulative),d[q]=B.cumulative);"percent"===p&&(u.usePercentage=!0);this.stackedYData=d;u.oldStacks={}}};w.prototype.modifyStacks=function(){var a=this,c=a.stackKey,d=a.yAxis.stacks,m=a.processedXData,
-h,b=a.options.stacking;a[b+"Stacker"]&&[c,"-"+c].forEach(function(c){for(var f=m.length,g,l;f--;)if(g=m[f],h=a.getStackIndicator(h,g,a.index,c),l=(g=d[c]&&d[c][g])&&g.points[h.key])a[b+"Stacker"](l,g,f)})};w.prototype.percentStacker=function(a,c,d){c=c.total?100/c.total:0;a[0]=E(a[0]*c);a[1]=E(a[1]*c);this.stackedYData[d]=a[1]};w.prototype.getStackIndicator=function(a,c,d,m){!h(a)||a.x!==c||m&&a.key!==m?a={x:c,index:0,key:m}:a.index++;a.key=[d,c,a.index].join();return a}})(J);(function(a){var y=a.addEvent,
-G=a.animate,E=a.Axis,h=a.Chart,c=a.createElement,r=a.css,u=a.defined,v=a.erase,w=a.extend,n=a.fireEvent,g=a.isNumber,d=a.isObject,m=a.isArray,p=a.merge,b=a.objectEach,l=a.pick,f=a.Point,x=a.Series,t=a.seriesTypes,H=a.setAnimation,F=a.splat;a.cleanRecursively=function(c,f){var g={};b(c,function(b,k){if(d(c[k],!0)&&f[k])b=a.cleanRecursively(c[k],f[k]),Object.keys(b).length&&(g[k]=b);else if(d(c[k])||c[k]!==f[k])g[k]=c[k]});return g};w(h.prototype,{addSeries:function(a,b,d){var c,f=this;a&&(b=l(b,!0),
-n(f,"addSeries",{options:a},function(){c=f.initSeries(a);f.isDirtyLegend=!0;f.linkSeries();n(f,"afterAddSeries");b&&f.redraw(d)}));return c},addAxis:function(a,b,d,c){var f=b?"xAxis":"yAxis",e=this.options;a=p(a,{index:this[f].length,isX:b});b=new E(this,a);e[f]=F(e[f]||{});e[f].push(a);l(d,!0)&&this.redraw(c);return b},showLoading:function(a){var b=this,d=b.options,f=b.loadingDiv,g=d.loading,e=function(){f&&r(f,{left:b.plotLeft+"px",top:b.plotTop+"px",width:b.plotWidth+"px",height:b.plotHeight+"px"})};
-f||(b.loadingDiv=f=c("div",{className:"highcharts-loading highcharts-loading-hidden"},null,b.container),b.loadingSpan=c("span",{className:"highcharts-loading-inner"},null,f),y(b,"redraw",e));f.className="highcharts-loading";b.loadingSpan.innerHTML=a||d.lang.loading;b.styledMode||(r(f,w(g.style,{zIndex:10})),r(b.loadingSpan,g.labelStyle),b.loadingShown||(r(f,{opacity:0,display:""}),G(f,{opacity:g.style.opacity||.5},{duration:g.showDuration||0})));b.loadingShown=!0;e()},hideLoading:function(){var a=
-this.options,b=this.loadingDiv;b&&(b.className="highcharts-loading highcharts-loading-hidden",this.styledMode||G(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){r(b,{display:"none"})}}));this.loadingShown=!1},propsRequireDirtyBox:"backgroundColor borderColor borderWidth margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "),
-propsRequireUpdateSeries:"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip".split(" "),collectionsWithUpdate:"xAxis yAxis zAxis series colorAxis pane".split(" "),update:function(d,c,f,m){var k=this,e={credits:"addCredits",title:"setTitle",subtitle:"setSubtitle"},h,t,x,r=[];n(k,"update",{options:d});d=a.cleanRecursively(d,k.options);if(h=d.chart){p(!0,k.options.chart,h);"className"in h&&k.setClassName(h.className);"reflow"in h&&k.setReflow(h.reflow);if("inverted"in
-h||"polar"in h||"type"in h)k.propFromSeries(),t=!0;"alignTicks"in h&&(t=!0);b(h,function(a,b){-1!==k.propsRequireUpdateSeries.indexOf("chart."+b)&&(x=!0);-1!==k.propsRequireDirtyBox.indexOf(b)&&(k.isDirtyBox=!0)});!k.styledMode&&"style"in h&&k.renderer.setStyle(h.style)}!k.styledMode&&d.colors&&(this.options.colors=d.colors);d.plotOptions&&p(!0,this.options.plotOptions,d.plotOptions);b(d,function(a,b){if(k[b]&&"function"===typeof k[b].update)k[b].update(a,!1);else if("function"===typeof k[e[b]])k[e[b]](a);
-"chart"!==b&&-1!==k.propsRequireUpdateSeries.indexOf(b)&&(x=!0)});this.collectionsWithUpdate.forEach(function(a){var b;d[a]&&("series"===a&&(b=[],k[a].forEach(function(a,d){a.options.isInternal||b.push(l(a.options.index,d))})),F(d[a]).forEach(function(d,e){(e=u(d.id)&&k.get(d.id)||k[a][b?b[e]:e])&&e.coll===a&&(e.update(d,!1),f&&(e.touched=!0));if(!e&&f)if("series"===a)k.addSeries(d,!1).touched=!0;else if("xAxis"===a||"yAxis"===a)k.addAxis(d,"xAxis"===a,!1).touched=!0}),f&&k[a].forEach(function(a){a.touched||
-a.options.isInternal?delete a.touched:r.push(a)}))});r.forEach(function(a){a.remove&&a.remove(!1)});t&&k.axes.forEach(function(a){a.update({},!1)});x&&k.series.forEach(function(a){a.update({},!1)});d.loading&&p(!0,k.options.loading,d.loading);t=h&&h.width;h=h&&h.height;g(t)&&t!==k.chartWidth||g(h)&&h!==k.chartHeight?k.setSize(t,h,m):l(c,!0)&&k.redraw(m);n(k,"afterUpdate",{options:d})},setSubtitle:function(a){this.setTitle(void 0,a)}});w(f.prototype,{update:function(a,b,c,f){function g(){e.applyOptions(a);
-null===e.y&&h&&(e.graphic=h.destroy());d(a,!0)&&(h&&h.element&&a&&a.marker&&void 0!==a.marker.symbol&&(e.graphic=h.destroy()),a&&a.dataLabels&&e.dataLabel&&(e.dataLabel=e.dataLabel.destroy()),e.connector&&(e.connector=e.connector.destroy()));m=e.index;k.updateParallelArrays(e,m);t.data[m]=d(t.data[m],!0)||d(a,!0)?e.options:l(a,t.data[m]);k.isDirty=k.isDirtyData=!0;!k.fixedBox&&k.hasCartesianSeries&&(p.isDirtyBox=!0);"point"===t.legendType&&(p.isDirtyLegend=!0);b&&p.redraw(c)}var e=this,k=e.series,
-h=e.graphic,m,p=k.chart,t=k.options;b=l(b,!0);!1===f?g():e.firePointEvent("update",{options:a},g)},remove:function(a,b){this.series.removePoint(this.series.data.indexOf(this),a,b)}});w(x.prototype,{addPoint:function(a,b,d,c){var f=this.options,e=this.data,g=this.chart,k=this.xAxis,k=k&&k.hasNames&&k.names,h=f.data,m,p,t=this.xData,n,x;b=l(b,!0);m={series:this};this.pointClass.prototype.applyOptions.apply(m,[a]);x=m.x;n=t.length;if(this.requireSorting&&x<t[n-1])for(p=!0;n&&t[n-1]>x;)n--;this.updateParallelArrays(m,
-"splice",n,0,0);this.updateParallelArrays(m,n);k&&m.name&&(k[x]=m.name);h.splice(n,0,a);p&&(this.data.splice(n,0,null),this.processData());"point"===f.legendType&&this.generatePoints();d&&(e[0]&&e[0].remove?e[0].remove(!1):(e.shift(),this.updateParallelArrays(m,"shift"),h.shift()));this.isDirtyData=this.isDirty=!0;b&&g.redraw(c)},removePoint:function(a,b,d){var c=this,f=c.data,e=f[a],g=c.points,k=c.chart,h=function(){g&&g.length===f.length&&g.splice(a,1);f.splice(a,1);c.options.data.splice(a,1);c.updateParallelArrays(e||
-{series:c},"splice",a,1);e&&e.destroy();c.isDirty=!0;c.isDirtyData=!0;b&&k.redraw()};H(d,k);b=l(b,!0);e?e.firePointEvent("remove",null,h):h()},remove:function(a,b,d){function c(){f.destroy();f.remove=null;e.isDirtyLegend=e.isDirtyBox=!0;e.linkSeries();l(a,!0)&&e.redraw(b)}var f=this,e=f.chart;!1!==d?n(f,"remove",null,c):c()},update:function(b,d){b=a.cleanRecursively(b,this.userOptions);var c=this,f=c.chart,g=c.userOptions,e=c.oldType||c.type,k=b.type||g.type||f.options.chart.type,h=t[e].prototype,
-m,x=["group","markerGroup","dataLabelsGroup"],r=["navigatorSeries","baseSeries"],u=c.finishedAnimating&&{animation:!1},z=["data","name","turboThreshold"],v=Object.keys(b),F=0<v.length;v.forEach(function(a){-1===z.indexOf(a)&&(F=!1)});if(F)b.data&&this.setData(b.data,!1),b.name&&this.setName(b.name,!1);else{r=x.concat(r);r.forEach(function(a){r[a]=c[a];delete c[a]});b=p(g,u,{index:c.index,pointStart:l(g.pointStart,c.xData[0])},{data:c.options.data},b);c.remove(!1,null,!1);for(m in h)c[m]=void 0;t[k||
-e]?w(c,t[k||e].prototype):a.error(17,!0,f);r.forEach(function(a){c[a]=r[a]});c.init(f,b);b.zIndex!==g.zIndex&&x.forEach(function(a){c[a]&&c[a].attr({zIndex:b.zIndex})});c.oldType=e;f.linkSeries()}n(this,"afterUpdate");l(d,!0)&&f.redraw(F?void 0:!1)},setName:function(a){this.name=this.options.name=this.userOptions.name=a;this.chart.isDirtyLegend=!0}});w(E.prototype,{update:function(a,d){var c=this.chart,f=a&&a.events||{};a=p(this.userOptions,a);c.options[this.coll].indexOf&&(c.options[this.coll][c.options[this.coll].indexOf(this.userOptions)]=
-a);b(c.options[this.coll].events,function(a,b){"undefined"===typeof f[b]&&(f[b]=void 0)});this.destroy(!0);this.init(c,w(a,{events:f}));c.isDirtyBox=!0;l(d,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,d=this.coll,c=this.series,f=c.length;f--;)c[f]&&c[f].remove(!1);v(b.axes,this);v(b[d],this);m(b.options[d])?b.options[d].splice(this.options.index,1):delete b.options[d];b[d].forEach(function(a,b){a.options.index=a.userOptions.index=b});this.destroy();b.isDirtyBox=!0;l(a,!0)&&b.redraw()},
-setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}})})(J);(function(a){var y=a.color,G=a.pick,E=a.Series,h=a.seriesType;h("area","line",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(c){var h=[],u=[],v=this.xAxis,w=this.yAxis,n=w.stacks[this.stackKey],g={},d=this.index,m=w.series,p=m.length,b,l=G(w.options.reversedStacks,!0)?1:-1,f;c=c||this.points;if(this.options.stacking){for(f=0;f<c.length;f++)c[f].leftNull=c[f].rightNull=
-null,g[c[f].x]=c[f];a.objectEach(n,function(a,b){null!==a.total&&u.push(b)});u.sort(function(a,b){return a-b});b=m.map(function(a){return a.visible});u.forEach(function(a,c){var m=0,t,x;if(g[a]&&!g[a].isNull)h.push(g[a]),[-1,1].forEach(function(k){var h=1===k?"rightNull":"leftNull",m=0,r=n[u[c+k]];if(r)for(f=d;0<=f&&f<p;)t=r.points[f],t||(f===d?g[a][h]=!0:b[f]&&(x=n[a].points[f])&&(m-=x[1]-x[0])),f+=l;g[a][1===k?"rightCliff":"leftCliff"]=m});else{for(f=d;0<=f&&f<p;){if(t=n[a].points[f]){m=t[1];break}f+=
-l}m=w.translate(m,0,1,0,1);h.push({isNull:!0,plotX:v.translate(a,0,0,0,1),x:a,plotY:m,yBottom:m})}})}return h},getGraphPath:function(a){var c=E.prototype.getGraphPath,h=this.options,v=h.stacking,w=this.yAxis,n,g,d=[],m=[],p=this.index,b,l=w.stacks[this.stackKey],f=h.threshold,x=w.getThreshold(h.threshold),t,h=h.connectNulls||"percent"===v,H=function(c,g,k){var h=a[c];c=v&&l[h.x].points[p];var t=h[k+"Null"]||0;k=h[k+"Cliff"]||0;var n,e,h=!0;k||t?(n=(t?c[0]:c[1])+k,e=c[0]+k,h=!!t):!v&&a[g]&&a[g].isNull&&
-(n=e=f);void 0!==n&&(m.push({plotX:b,plotY:null===n?x:w.getThreshold(n),isNull:h,isCliff:!0}),d.push({plotX:b,plotY:null===e?x:w.getThreshold(e),doCurve:!1}))};a=a||this.points;v&&(a=this.getStackPoints(a));for(n=0;n<a.length;n++)if(g=a[n].isNull,b=G(a[n].rectPlotX,a[n].plotX),t=G(a[n].yBottom,x),!g||h)h||H(n,n-1,"left"),g&&!v&&h||(m.push(a[n]),d.push({x:n,plotX:b,plotY:t})),h||H(n,n+1,"right");n=c.call(this,m,!0,!0);d.reversed=!0;g=c.call(this,d,!0,!0);g.length&&(g[0]="L");g=n.concat(g);c=c.call(this,
-m,!1,h);g.xMap=n.xMap;this.areaPath=g;return c},drawGraph:function(){this.areaPath=[];E.prototype.drawGraph.apply(this);var a=this,h=this.areaPath,u=this.options,v=[["area","highcharts-area",this.color,u.fillColor]];this.zones.forEach(function(c,h){v.push(["zone-area-"+h,"highcharts-area highcharts-zone-area-"+h+" "+c.className,c.color||a.color,c.fillColor||u.fillColor])});v.forEach(function(c){var n=c[0],g=a[n];g?(g.endX=a.preventGraphAnimation?null:h.xMap,g.animate({d:h})):(g={zIndex:0},a.chart.styledMode||
-(g.fill=G(c[3],y(c[2]).setOpacity(G(u.fillOpacity,.75)).get())),g=a[n]=a.chart.renderer.path(h).addClass(c[1]).attr(g).add(a.group),g.isArea=!0);g.startX=h.xMap;g.shiftUnit=u.step?2:1})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})})(J);(function(a){var y=a.pick;a=a.seriesType;a("spline","line",{},{getPointSpline:function(a,E,h){var c=E.plotX,r=E.plotY,u=a[h-1];h=a[h+1];var v,w,n,g;if(u&&!u.isNull&&!1!==u.doCurve&&!E.isCliff&&h&&!h.isNull&&!1!==h.doCurve&&!E.isCliff){a=u.plotY;n=h.plotX;h=
-h.plotY;var d=0;v=(1.5*c+u.plotX)/2.5;w=(1.5*r+a)/2.5;n=(1.5*c+n)/2.5;g=(1.5*r+h)/2.5;n!==v&&(d=(g-w)*(n-c)/(n-v)+r-g);w+=d;g+=d;w>a&&w>r?(w=Math.max(a,r),g=2*r-w):w<a&&w<r&&(w=Math.min(a,r),g=2*r-w);g>h&&g>r?(g=Math.max(h,r),w=2*r-g):g<h&&g<r&&(g=Math.min(h,r),w=2*r-g);E.rightContX=n;E.rightContY=g}E=["C",y(u.rightContX,u.plotX),y(u.rightContY,u.plotY),y(v,c),y(w,r),c,r];u.rightContX=u.rightContY=null;return E}})})(J);(function(a){var y=a.seriesTypes.area.prototype,G=a.seriesType;G("areaspline",
-"spline",a.defaultPlotOptions.area,{getStackPoints:y.getStackPoints,getGraphPath:y.getGraphPath,drawGraph:y.drawGraph,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})})(J);(function(a){var y=a.animObject,G=a.color,E=a.extend,h=a.defined,c=a.isNumber,r=a.merge,u=a.pick,v=a.Series,w=a.seriesType,n=a.svg;w("column","line",{borderRadius:0,crisp:!0,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{halo:!1,brightness:.1},select:{color:"#cccccc",
-borderColor:"#000000"}},dataLabels:{align:null,verticalAlign:null,y:null},softThreshold:!1,startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0,borderColor:"#ffffff"},{cropShoulder:0,directTouch:!0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){v.prototype.init.apply(this,arguments);var a=this,d=a.chart;d.hasRendered&&d.series.forEach(function(d){d.type===a.type&&(d.isDirty=!0)})},getColumnMetrics:function(){var a=this,d=a.options,c=a.xAxis,h=a.yAxis,b=
-c.options.reversedStacks,b=c.reversed&&!b||!c.reversed&&b,l,f={},n=0;!1===d.grouping?n=1:a.chart.series.forEach(function(b){var d=b.options,c=b.yAxis,g;b.type!==a.type||!b.visible&&a.chart.options.chart.ignoreHiddenSeries||h.len!==c.len||h.pos!==c.pos||(d.stacking?(l=b.stackKey,void 0===f[l]&&(f[l]=n++),g=f[l]):!1!==d.grouping&&(g=n++),b.columnIndex=g)});var t=Math.min(Math.abs(c.transA)*(c.ordinalSlope||d.pointRange||c.closestPointRange||c.tickInterval||1),c.len),r=t*d.groupPadding,v=(t-2*r)/(n||
-1),d=Math.min(d.maxPointWidth||c.len,u(d.pointWidth,v*(1-2*d.pointPadding)));a.columnMetrics={width:d,offset:(v-d)/2+(r+((a.columnIndex||0)+(b?1:0))*v-t/2)*(b?-1:1)};return a.columnMetrics},crispCol:function(a,d,c,h){var b=this.chart,g=this.borderWidth,f=-(g%2?.5:0),g=g%2?.5:1;b.inverted&&b.renderer.isVML&&(g+=1);this.options.crisp&&(c=Math.round(a+c)+f,a=Math.round(a)+f,c-=a);h=Math.round(d+h)+g;f=.5>=Math.abs(d)&&.5<h;d=Math.round(d)+g;h-=d;f&&h&&(--d,h+=1);return{x:a,y:d,width:c,height:h}},translate:function(){var a=
-this,d=a.chart,c=a.options,p=a.dense=2>a.closestPointRange*a.xAxis.transA,p=a.borderWidth=u(c.borderWidth,p?0:1),b=a.yAxis,l=c.threshold,f=a.translatedThreshold=b.getThreshold(l),n=u(c.minPointLength,5),t=a.getColumnMetrics(),r=t.width,F=a.barW=Math.max(r,1+2*p),z=a.pointXOffset=t.offset;d.inverted&&(f-=.5);c.pointPadding&&(F=Math.ceil(F));v.prototype.translate.apply(a);a.points.forEach(function(c){var g=u(c.yBottom,f),k=999+Math.abs(g),m=r,k=Math.min(Math.max(-k,c.plotY),b.len+k),e=c.plotX+z,q=F,
-p=Math.min(k,g),t,x=Math.max(k,g)-p;n&&Math.abs(x)<n&&(x=n,t=!b.reversed&&!c.negative||b.reversed&&c.negative,c.y===l&&a.dataMax<=l&&b.min<l&&(t=!t),p=Math.abs(p-f)>n?g-n:f-(t?n:0));h(c.options.pointWidth)&&(m=q=Math.ceil(c.options.pointWidth),e-=Math.round((m-r)/2));c.barX=e;c.pointWidth=m;c.tooltipPos=d.inverted?[b.len+b.pos-d.plotLeft-k,a.xAxis.len-e-q/2,x]:[e+q/2,k+b.pos-d.plotTop,x];c.shapeType=c.shapeType||"rect";c.shapeArgs=a.crispCol.apply(a,c.isNull?[e,f,q,0]:[e,p,q,x])})},getSymbol:a.noop,
-drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")},pointAttribs:function(a,d){var c=this.options,g,b=this.pointAttrToOptions||{};g=b.stroke||"borderColor";var l=b["stroke-width"]||"borderWidth",f=a&&a.color||this.color,h=a&&a[g]||c[g]||this.color||f,t=a&&a[l]||c[l]||this[l]||0,b=c.dashStyle;a&&this.zones.length&&(f=a.getZone(),f=a.options.color||f&&f.color||this.color);d&&(a=r(c.states[d],a.options.states&&
-a.options.states[d]||{}),d=a.brightness,f=a.color||void 0!==d&&G(f).brighten(a.brightness).get()||f,h=a[g]||h,t=a[l]||t,b=a.dashStyle||b);g={fill:f,stroke:h,"stroke-width":t};b&&(g.dashstyle=b);return g},drawPoints:function(){var a=this,d=this.chart,h=a.options,p=d.renderer,b=h.animationLimit||250,l;a.points.forEach(function(f){var g=f.graphic,m=g&&d.pointCount<b?"animate":"attr";if(c(f.plotY)&&null!==f.y){l=f.shapeArgs;if(g)g[m](r(l));else f.graphic=g=p[f.shapeType](l).add(f.group||a.group);h.borderRadius&&
-g.attr({r:h.borderRadius});d.styledMode||g[m](a.pointAttribs(f,f.selected&&"select")).shadow(h.shadow,null,h.stacking&&!h.borderRadius);g.addClass(f.getClassName(),!0)}else g&&(f.graphic=g.destroy())})},animate:function(a){var d=this,c=this.yAxis,g=d.options,b=this.chart.inverted,h={},f=b?"translateX":"translateY",x;n&&(a?(h.scaleY=.001,a=Math.min(c.pos+c.len,Math.max(c.pos,c.toPixels(g.threshold))),b?h.translateX=a-c.len:h.translateY=a,d.group.attr(h)):(x=d.group.attr(f),d.group.animate({scaleY:1},
-E(y(d.options.animation),{step:function(a,b){h[f]=x+b.pos*(c.pos-x);d.group.attr(h)}})),d.animate=null))},remove:function(){var a=this,d=a.chart;d.hasRendered&&d.series.forEach(function(d){d.type===a.type&&(d.isDirty=!0)});v.prototype.remove.apply(a,arguments)}})})(J);(function(a){a=a.seriesType;a("bar","column",null,{inverted:!0})})(J);(function(a){var y=a.Series;a=a.seriesType;a("scatter","line",{lineWidth:0,findNearestPointBy:"xy",marker:{enabled:!0},tooltip:{headerFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cspan style\x3d"font-size: 10px"\x3e {series.name}\x3c/span\x3e\x3cbr/\x3e',
-pointFormat:"x: \x3cb\x3e{point.x}\x3c/b\x3e\x3cbr/\x3ey: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e"}},{sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1,drawGraph:function(){this.options.lineWidth&&y.prototype.drawGraph.call(this)}})})(J);(function(a){var y=a.deg2rad,G=a.isNumber,E=a.pick,h=a.relativeLength;a.CenteredSeriesMixin={getCenter:function(){var a=this.options,r=this.chart,u=2*(a.slicedOffset||0),v=r.plotWidth-2*u,
-r=r.plotHeight-2*u,w=a.center,w=[E(w[0],"50%"),E(w[1],"50%"),a.size||"100%",a.innerSize||0],n=Math.min(v,r),g,d;for(g=0;4>g;++g)d=w[g],a=2>g||2===g&&/%$/.test(d),w[g]=h(d,[v,r,n,w[2]][g])+(a?u:0);w[3]>w[2]&&(w[3]=w[2]);return w},getStartAndEndRadians:function(a,h){a=G(a)?a:0;h=G(h)&&h>a&&360>h-a?h:a+360;return{start:y*(a+-90),end:y*(h+-90)}}}})(J);(function(a){var y=a.addEvent,G=a.CenteredSeriesMixin,E=a.defined,h=a.extend,c=G.getStartAndEndRadians,r=a.noop,u=a.pick,v=a.Point,w=a.Series,n=a.seriesType,
-g=a.setAnimation;n("pie","line",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{allowOverlap:!0,connectorPadding:5,distance:30,enabled:!0,formatter:function(){return this.point.isNull?void 0:this.point.name},softConnector:!0,x:0,connectorShape:"fixedOffset",crookDistance:"70%"},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",borderWidth:1,states:{hover:{brightness:.1}}},{isCartesian:!1,
-requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var d=this,c=d.points,b=d.startAngleRad;a||(c.forEach(function(a){var c=a.graphic,g=a.shapeArgs;c&&(c.attr({r:a.startR||d.center[3]/2,start:b,end:b}),c.animate({r:g.r,start:g.start,end:g.end},d.options.animation))}),d.animate=null)},updateTotals:function(){var a,c=0,g=this.points,b=g.length,h,f=this.options.ignoreHiddenPoint;
-for(a=0;a<b;a++)h=g[a],c+=f&&!h.visible?0:h.isNull?0:h.y;this.total=c;for(a=0;a<b;a++)h=g[a],h.percentage=0<c&&(h.visible||!f)?h.y/c*100:0,h.total=c},generatePoints:function(){w.prototype.generatePoints.call(this);this.updateTotals()},getX:function(a,c,g){var b=this.center,d=this.radii?this.radii[g.index]:b[2]/2;return b[0]+(c?-1:1)*Math.cos(Math.asin(Math.max(Math.min((a-b[1])/(d+g.labelDistance),1),-1)))*(d+g.labelDistance)+(0<g.labelDistance?(c?-1:1)*this.options.dataLabels.padding:0)},translate:function(a){this.generatePoints();
-var d=0,g=this.options,b=g.slicedOffset,h=b+(g.borderWidth||0),f,n,t=c(g.startAngle,g.endAngle),r=this.startAngleRad=t.start,t=(this.endAngleRad=t.end)-r,v=this.points,z,k,A=g.dataLabels.distance,g=g.ignoreHiddenPoint,w,B=v.length,e;a||(this.center=a=this.getCenter());for(w=0;w<B;w++){e=v[w];e.labelDistance=u(e.options.dataLabels&&e.options.dataLabels.distance,A);this.maxLabelDistance=Math.max(this.maxLabelDistance||0,e.labelDistance);f=r+d*t;if(!g||e.visible)d+=e.percentage/100;n=r+d*t;e.shapeType=
-"arc";e.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:Math.round(1E3*f)/1E3,end:Math.round(1E3*n)/1E3};n=(n+f)/2;n>1.5*Math.PI?n-=2*Math.PI:n<-Math.PI/2&&(n+=2*Math.PI);e.slicedTranslation={translateX:Math.round(Math.cos(n)*b),translateY:Math.round(Math.sin(n)*b)};z=Math.cos(n)*a[2]/2;k=Math.sin(n)*a[2]/2;e.tooltipPos=[a[0]+.7*z,a[1]+.7*k];e.half=n<-Math.PI/2||n>Math.PI/2?1:0;e.angle=n;f=Math.min(h,e.labelDistance/5);e.labelPosition={natural:{x:a[0]+z+Math.cos(n)*e.labelDistance,y:a[1]+k+
-Math.sin(n)*e.labelDistance},"final":{},alignment:0>e.labelDistance?"center":e.half?"right":"left",connectorPosition:{breakAt:{x:a[0]+z+Math.cos(n)*f,y:a[1]+k+Math.sin(n)*f},touchingSliceAt:{x:a[0]+z,y:a[1]+k}}}}},drawGraph:null,drawPoints:function(){var a=this,c=a.chart,g=c.renderer,b,l,f,n,t=a.options.shadow;!t||a.shadowGroup||c.styledMode||(a.shadowGroup=g.g("shadow").add(a.group));a.points.forEach(function(d){l=d.graphic;if(d.isNull)l&&(d.graphic=l.destroy());else{n=d.shapeArgs;b=d.getTranslate();
-if(!c.styledMode){var m=d.shadowGroup;t&&!m&&(m=d.shadowGroup=g.g("shadow").add(a.shadowGroup));m&&m.attr(b);f=a.pointAttribs(d,d.selected&&"select")}l?(l.setRadialReference(a.center),c.styledMode||l.attr(f),l.animate(h(n,b))):(d.graphic=l=g[d.shapeType](n).setRadialReference(a.center).attr(b).add(a.group),c.styledMode||l.attr(f).attr({"stroke-linejoin":"round"}).shadow(t,m));l.attr({visibility:d.visible?"inherit":"hidden"});l.addClass(d.getClassName())}})},searchPoint:r,sortByAngle:function(a,c){a.sort(function(a,
-b){return void 0!==a.angle&&(b.angle-a.angle)*c})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:G.getCenter,getSymbol:r},{init:function(){v.prototype.init.apply(this,arguments);var a=this,c;a.name=u(a.name,"Slice");c=function(d){a.slice("select"===d.type)};y(a,"select",c);y(a,"unselect",c);return a},isValid:function(){return a.isNumber(this.y,!0)&&0<=this.y},setVisible:function(a,c){var d=this,b=d.series,g=b.chart,f=b.options.ignoreHiddenPoint;c=u(c,f);a!==d.visible&&(d.visible=d.options.visible=
-a=void 0===a?!d.visible:a,b.options.data[b.data.indexOf(d)]=d.options,["graphic","dataLabel","connector","shadowGroup"].forEach(function(b){if(d[b])d[b][a?"show":"hide"](!0)}),d.legendItem&&g.legend.colorizeItem(d,a),a||"hover"!==d.state||d.setState(""),f&&(b.isDirty=!0),c&&g.redraw())},slice:function(a,c,h){var b=this.series;g(h,b.chart);u(c,!0);this.sliced=this.options.sliced=E(a)?a:!this.sliced;b.options.data[b.data.indexOf(this)]=this.options;this.graphic.animate(this.getTranslate());this.shadowGroup&&
-this.shadowGroup.animate(this.getTranslate())},getTranslate:function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}},haloPath:function(a){var d=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(d.x,d.y,d.r+a,d.r+a,{innerR:this.shapeArgs.r-1,start:d.start,end:d.end})},connectorShapes:{fixedOffset:function(a,c,g){var b=c.breakAt;c=c.touchingSliceAt;return["M",a.x,a.y].concat(g.softConnector?["C",a.x+("left"===a.alignment?-5:5),a.y,2*
-b.x-c.x,2*b.y-c.y,b.x,b.y]:["L",b.x,b.y]).concat(["L",c.x,c.y])},straight:function(a,c){c=c.touchingSliceAt;return["M",a.x,a.y,"L",c.x,c.y]},crookedLine:function(d,c,g){c=c.touchingSliceAt;var b=this.series,h=b.center[0],f=b.chart.plotWidth,m=b.chart.plotLeft,b=d.alignment,t=this.shapeArgs.r;g=a.relativeLength(g.crookDistance,1);g="left"===b?h+t+(f+m-h-t)*(1-g):m+(h-t)*g;h=["L",g,d.y];if("left"===b?g>d.x||g<c.x:g<d.x||g>c.x)h=[];return["M",d.x,d.y].concat(h).concat(["L",c.x,c.y])}},getConnectorPath:function(){var a=
-this.labelPosition,c=this.series.options.dataLabels,g=c.connectorShape,b=this.connectorShapes;b[g]&&(g=b[g]);return g.call(this,{x:a.final.x,y:a.final.y,alignment:a.alignment},a.connectorPosition,c)}})})(J);(function(a){var y=a.addEvent,G=a.arrayMax,E=a.defined,h=a.extend,c=a.format,r=a.merge,u=a.noop,v=a.pick,w=a.relativeLength,n=a.Series,g=a.seriesTypes,d=a.stableSort,m=a.isArray,p=a.splat;a.distribute=function(b,c,f){function g(a,b){return a.target-b.target}var h,l=!0,m=b,p=[],k;k=0;var n=m.reducedLen||
-c;for(h=b.length;h--;)k+=b[h].size;if(k>n){d(b,function(a,b){return(b.rank||0)-(a.rank||0)});for(k=h=0;k<=n;)k+=b[h].size,h++;p=b.splice(h-1,b.length)}d(b,g);for(b=b.map(function(a){return{size:a.size,targets:[a.target],align:v(a.align,.5)}});l;){for(h=b.length;h--;)l=b[h],k=(Math.min.apply(0,l.targets)+Math.max.apply(0,l.targets))/2,l.pos=Math.min(Math.max(0,k-l.size*l.align),c-l.size);h=b.length;for(l=!1;h--;)0<h&&b[h-1].pos+b[h-1].size>b[h].pos&&(b[h-1].size+=b[h].size,b[h-1].targets=b[h-1].targets.concat(b[h].targets),
-b[h-1].align=.5,b[h-1].pos+b[h-1].size>c&&(b[h-1].pos=c-b[h-1].size),b.splice(h,1),l=!0)}m.push.apply(m,p);h=0;b.some(function(b){var d=0;if(b.targets.some(function(){m[h].pos=b.pos+d;if(Math.abs(m[h].pos-m[h].target)>f)return m.slice(0,h+1).forEach(function(a){delete a.pos}),m.reducedLen=(m.reducedLen||c)-.1*c,m.reducedLen>.1*c&&a.distribute(m,c,f),!0;d+=m[h].size;h++}))return!0});d(m,g)};n.prototype.drawDataLabels=function(){function b(a,b){var c=b.filter;return c?(b=c.operator,a=a[c.property],
-c=c.value,"\x3e"===b&&a>c||"\x3c"===b&&a<c||"\x3e\x3d"===b&&a>=c||"\x3c\x3d"===b&&a<=c||"\x3d\x3d"===b&&a==c||"\x3d\x3d\x3d"===b&&a===c?!0:!1):!0}function d(a,b){var c=[],d;if(m(a)&&!m(b))c=a.map(function(a){return r(a,b)});else if(m(b)&&!m(a))c=b.map(function(b){return r(a,b)});else if(m(a)||m(b))for(d=Math.max(a.length,b.length);d--;)c[d]=r(a[d],b[d]);else c=r(a,b);return c}var f=this,g=f.chart,h=f.options,n=h.dataLabels,u=f.points,z,k=f.hasRendered||0,A,w=v(n.defer,!!h.animation),B=g.renderer,
-n=d(d(g.options.plotOptions&&g.options.plotOptions.series&&g.options.plotOptions.series.dataLabels,g.options.plotOptions&&g.options.plotOptions[f.type]&&g.options.plotOptions[f.type].dataLabels),n);a.fireEvent(this,"drawDataLabels");if(m(n)||n.enabled||f._hasPointLabels)A=f.plotGroup("dataLabelsGroup","data-labels",w&&!k?"hidden":"visible",n.zIndex||6),w&&(A.attr({opacity:+k}),k||y(f,"afterAnimate",function(){f.visible&&A.show(!0);A[h.animation?"animate":"attr"]({opacity:1},{duration:200})})),u.forEach(function(e){z=
-p(d(n,e.dlOptions||e.options&&e.options.dataLabels));z.forEach(function(d,k){var l=d.enabled&&!e.isNull&&b(e,d),m,q,t,p,n=e.dataLabels?e.dataLabels[k]:e.dataLabel,r=e.connectors?e.connectors[k]:e.connector,u=!n;l&&(m=e.getLabelConfig(),q=d[e.formatPrefix+"Format"]||d.format,m=E(q)?c(q,m,g.time):(d[e.formatPrefix+"Formatter"]||d.formatter).call(m,d),q=d.style,t=d.rotation,g.styledMode||(q.color=v(d.color,q.color,f.color,"#000000"),"contrast"===q.color&&(e.contrastColor=B.getContrast(e.color||f.color),
-q.color=d.inside||0>v(d.distance,e.labelDistance)||h.stacking?e.contrastColor:"#000000"),h.cursor&&(q.cursor=h.cursor)),p={r:d.borderRadius||0,rotation:t,padding:d.padding,zIndex:1},g.styledMode||(p.fill=d.backgroundColor,p.stroke=d.borderColor,p["stroke-width"]=d.borderWidth),a.objectEach(p,function(a,b){void 0===a&&delete p[b]}));!n||l&&E(m)?l&&E(m)&&(n?p.text=m:(e.dataLabels=e.dataLabels||[],n=e.dataLabels[k]=t?B.text(m,0,-9999).addClass("highcharts-data-label"):B.label(m,0,-9999,d.shape,null,
-null,d.useHTML,null,"data-label"),k||(e.dataLabel=n),n.addClass(" highcharts-data-label-color-"+e.colorIndex+" "+(d.className||"")+(d.useHTML?" highcharts-tracker":""))),n.options=d,n.attr(p),g.styledMode||n.css(q).shadow(d.shadow),n.added||n.add(A),f.alignDataLabel(e,n,d,null,u)):(e.dataLabel=e.dataLabel&&e.dataLabel.destroy(),e.dataLabels&&(1===e.dataLabels.length?delete e.dataLabels:delete e.dataLabels[k]),k||delete e.dataLabel,r&&(e.connector=e.connector.destroy(),e.connectors&&(1===e.connectors.length?
-delete e.connectors:delete e.connectors[k])))})});a.fireEvent(this,"afterDrawDataLabels")};n.prototype.alignDataLabel=function(a,d,c,g,m){var b=this.chart,f=this.isCartesian&&b.inverted,l=v(a.dlBox&&a.dlBox.centerX,a.plotX,-9999),k=v(a.plotY,-9999),n=d.getBBox(),p,t=c.rotation,e=c.align,q=this.visible&&(a.series.forceDL||b.isInsidePlot(l,Math.round(k),f)||g&&b.isInsidePlot(l,f?g.x+1:g.y+g.height-1,f)),r="justify"===v(c.overflow,"justify");if(q&&(p=b.renderer.fontMetrics(b.styledMode?void 0:c.style.fontSize,
-d).b,g=h({x:f?this.yAxis.len-k:l,y:Math.round(f?this.xAxis.len-l:k),width:0,height:0},g),h(c,{width:n.width,height:n.height}),t?(r=!1,l=b.renderer.rotCorr(p,t),l={x:g.x+c.x+g.width/2+l.x,y:g.y+c.y+{top:0,middle:.5,bottom:1}[c.verticalAlign]*g.height},d[m?"attr":"animate"](l).attr({align:e}),k=(t+720)%360,k=180<k&&360>k,"left"===e?l.y-=k?n.height:0:"center"===e?(l.x-=n.width/2,l.y-=n.height/2):"right"===e&&(l.x-=n.width,l.y-=k?0:n.height),d.placed=!0,d.alignAttr=l):(d.align(c,null,g),l=d.alignAttr),
-r&&0<=g.height?a.isLabelJustified=this.justifyDataLabel(d,c,l,n,g,m):v(c.crop,!0)&&(q=b.isInsidePlot(l.x,l.y)&&b.isInsidePlot(l.x+n.width,l.y+n.height)),c.shape&&!t))d[m?"attr":"animate"]({anchorX:f?b.plotWidth-a.plotY:a.plotX,anchorY:f?b.plotHeight-a.plotX:a.plotY});q||(d.attr({y:-9999}),d.placed=!1)};n.prototype.justifyDataLabel=function(a,d,c,g,h,m){var b=this.chart,f=d.align,k=d.verticalAlign,l,n,p=a.box?0:a.padding||0;l=c.x+p;0>l&&("right"===f?d.align="left":d.x=-l,n=!0);l=c.x+g.width-p;l>b.plotWidth&&
-("left"===f?d.align="right":d.x=b.plotWidth-l,n=!0);l=c.y+p;0>l&&("bottom"===k?d.verticalAlign="top":d.y=-l,n=!0);l=c.y+g.height-p;l>b.plotHeight&&("top"===k?d.verticalAlign="bottom":d.y=b.plotHeight-l,n=!0);n&&(a.placed=!m,a.align(d,null,h));return n};g.pie&&(g.pie.prototype.dataLabelPositioners={radialDistributionY:function(a){return a.top+a.distributeBox.pos},radialDistributionX:function(a,d,c,g){return a.getX(c<d.top+2||c>d.bottom-2?g:c,d.half,d)},justify:function(a,d,c){return c[0]+(a.half?-1:
-1)*(d+a.labelDistance)},alignToPlotEdges:function(a,d,c,g){a=a.getBBox().width;return d?a+g:c-a-g},alignToConnectors:function(a,d,c,g){var b=0,f;a.forEach(function(a){f=a.dataLabel.getBBox().width;f>b&&(b=f)});return d?b+g:c-b-g}},g.pie.prototype.drawDataLabels=function(){var b=this,d=b.data,c,g=b.chart,h=b.options.dataLabels,m=h.connectorPadding,p=v(h.connectorWidth,1),r=g.plotWidth,k=g.plotHeight,u=g.plotLeft,w=Math.round(g.chartWidth/3),B,e=b.center,q=e[2]/2,y=e[1],I,J,K,M,S=[[],[]],C,N,P,T,Q=
-[0,0,0,0],O=b.dataLabelPositioners;b.visible&&(h.enabled||b._hasPointLabels)&&(d.forEach(function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&(a.dataLabel.attr({width:"auto"}).css({width:"auto",textOverflow:"clip"}),a.dataLabel.shortened=!1)}),n.prototype.drawDataLabels.apply(b),d.forEach(function(a){a.dataLabel&&(a.visible?(S[a.half].push(a),a.dataLabel._pos=null,!E(h.style.width)&&!E(a.options.dataLabels&&a.options.dataLabels.style&&a.options.dataLabels.style.width)&&a.dataLabel.getBBox().width>
-w&&(a.dataLabel.css({width:.7*w}),a.dataLabel.shortened=!0)):(a.dataLabel=a.dataLabel.destroy(),a.dataLabels&&1===a.dataLabels.length&&delete a.dataLabels))}),S.forEach(function(d,f){var l,n,p=d.length,t=[],x;if(p)for(b.sortByAngle(d,f-.5),0<b.maxLabelDistance&&(l=Math.max(0,y-q-b.maxLabelDistance),n=Math.min(y+q+b.maxLabelDistance,g.plotHeight),d.forEach(function(a){0<a.labelDistance&&a.dataLabel&&(a.top=Math.max(0,y-q-a.labelDistance),a.bottom=Math.min(y+q+a.labelDistance,g.plotHeight),x=a.dataLabel.getBBox().height||
-21,a.distributeBox={target:a.labelPosition.natural.y-a.top+x/2,size:x,rank:a.y},t.push(a.distributeBox))}),l=n+x-l,a.distribute(t,l,l/5)),T=0;T<p;T++){c=d[T];K=c.labelPosition;I=c.dataLabel;P=!1===c.visible?"hidden":"inherit";N=l=K.natural.y;t&&E(c.distributeBox)&&(void 0===c.distributeBox.pos?P="hidden":(M=c.distributeBox.size,N=O.radialDistributionY(c)));delete c.positionIndex;if(h.justify)C=O.justify(c,q,e);else switch(h.alignTo){case "connectors":C=O.alignToConnectors(d,f,r,u);break;case "plotEdges":C=
-O.alignToPlotEdges(I,f,r,u);break;default:C=O.radialDistributionX(b,c,N,l)}I._attr={visibility:P,align:K.alignment};I._pos={x:C+h.x+({left:m,right:-m}[K.alignment]||0),y:N+h.y-10};K.final.x=C;K.final.y=N;v(h.crop,!0)&&(J=I.getBBox().width,l=null,C-J<m&&1===f?(l=Math.round(J-C+m),Q[3]=Math.max(l,Q[3])):C+J>r-m&&0===f&&(l=Math.round(C+J-r+m),Q[1]=Math.max(l,Q[1])),0>N-M/2?Q[0]=Math.max(Math.round(-N+M/2),Q[0]):N+M/2>k&&(Q[2]=Math.max(Math.round(N+M/2-k),Q[2])),I.sideOverflow=l)}}),0===G(Q)||this.verifyDataLabelOverflow(Q))&&
-(this.placeDataLabels(),p&&this.points.forEach(function(a){var d;B=a.connector;if((I=a.dataLabel)&&I._pos&&a.visible&&0<a.labelDistance){P=I._attr.visibility;if(d=!B)a.connector=B=g.renderer.path().addClass("highcharts-data-label-connector  highcharts-color-"+a.colorIndex+(a.className?" "+a.className:"")).add(b.dataLabelsGroup),g.styledMode||B.attr({"stroke-width":p,stroke:h.connectorColor||a.color||"#666666"});B[d?"attr":"animate"]({d:a.getConnectorPath()});B.attr("visibility",P)}else B&&(a.connector=
-B.destroy())}))},g.pie.prototype.placeDataLabels=function(){this.points.forEach(function(a){var b=a.dataLabel;b&&a.visible&&((a=b._pos)?(b.sideOverflow&&(b._attr.width=b.getBBox().width-b.sideOverflow,b.css({width:b._attr.width+"px",textOverflow:(this.options.dataLabels.style||{}).textOverflow||"ellipsis"}),b.shortened=!0),b.attr(b._attr),b[b.moved?"animate":"attr"](a),b.moved=!0):b&&b.attr({y:-9999}))},this)},g.pie.prototype.alignDataLabel=u,g.pie.prototype.verifyDataLabelOverflow=function(a){var b=
-this.center,d=this.options,c=d.center,g=d.minSize||80,h,m=null!==d.size;m||(null!==c[0]?h=Math.max(b[2]-Math.max(a[1],a[3]),g):(h=Math.max(b[2]-a[1]-a[3],g),b[0]+=(a[3]-a[1])/2),null!==c[1]?h=Math.max(Math.min(h,b[2]-Math.max(a[0],a[2])),g):(h=Math.max(Math.min(h,b[2]-a[0]-a[2]),g),b[1]+=(a[0]-a[2])/2),h<b[2]?(b[2]=h,b[3]=Math.min(w(d.innerSize||0,h),h),this.translate(b),this.drawDataLabels&&this.drawDataLabels()):m=!0);return m});g.column&&(g.column.prototype.alignDataLabel=function(a,d,c,g,h){var b=
-this.chart.inverted,f=a.series,l=a.dlBox||a.shapeArgs,k=v(a.below,a.plotY>v(this.translatedThreshold,f.yAxis.len)),m=v(c.inside,!!this.options.stacking);l&&(g=r(l),0>g.y&&(g.height+=g.y,g.y=0),l=g.y+g.height-f.yAxis.len,0<l&&(g.height-=l),b&&(g={x:f.yAxis.len-g.y-g.height,y:f.xAxis.len-g.x-g.width,width:g.height,height:g.width}),m||(b?(g.x+=k?0:g.width,g.width=0):(g.y+=k?g.height:0,g.height=0)));c.align=v(c.align,!b||m?"center":k?"right":"left");c.verticalAlign=v(c.verticalAlign,b||m?"middle":k?"top":
-"bottom");n.prototype.alignDataLabel.call(this,a,d,c,g,h);a.isLabelJustified&&a.contrastColor&&d.css({color:a.contrastColor})})})(J);(function(a){var y=a.Chart,G=a.isArray,E=a.objectEach,h=a.pick,c=a.addEvent,r=a.fireEvent;c(y,"render",function(){var a=[];(this.labelCollectors||[]).forEach(function(c){a=a.concat(c())});(this.yAxis||[]).forEach(function(c){c.options.stackLabels&&!c.options.stackLabels.allowOverlap&&E(c.stacks,function(c){E(c,function(c){a.push(c.label)})})});(this.series||[]).forEach(function(c){var r=
-c.options.dataLabels;c.visible&&(!1!==r.enabled||c._hasPointLabels)&&c.points.forEach(function(c){c.visible&&(G(c.dataLabels)?c.dataLabels:c.dataLabel?[c.dataLabel]:[]).forEach(function(g){var d=g.options;g.labelrank=h(d.labelrank,c.labelrank,c.shapeArgs&&c.shapeArgs.height);d.allowOverlap||a.push(g)})})});this.hideOverlappingLabels(a)});y.prototype.hideOverlappingLabels=function(a){var c=this,h=a.length,n=c.renderer,g,d,m,p,b,l,f=function(a,b,c,d,f,g,h,l){return!(f>a+c||f+h<a||g>b+d||g+l<b)};m=function(a){var b,
-c,d,f=a.box?0:a.padding||0;d=0;if(a&&(!a.alignAttr||a.placed))return b=a.alignAttr||{x:a.attr("x"),y:a.attr("y")},c=a.parentGroup,a.width||(d=a.getBBox(),a.width=d.width,a.height=d.height,d=n.fontMetrics(null,a.element).h),{x:b.x+(c.translateX||0)+f,y:b.y+(c.translateY||0)+f-d,width:a.width-2*f,height:a.height-2*f}};for(d=0;d<h;d++)if(g=a[d])g.oldOpacity=g.opacity,g.newOpacity=1,g.absoluteBox=m(g);a.sort(function(a,b){return(b.labelrank||0)-(a.labelrank||0)});for(d=0;d<h;d++)for(l=(m=a[d])&&m.absoluteBox,
-g=d+1;g<h;++g)if(b=(p=a[g])&&p.absoluteBox,l&&b&&m!==p&&0!==m.newOpacity&&0!==p.newOpacity&&(b=f(l.x,l.y,l.width,l.height,b.x,b.y,b.width,b.height)))(m.labelrank<p.labelrank?m:p).newOpacity=0;a.forEach(function(a){var b,d;a&&(d=a.newOpacity,a.oldOpacity!==d&&(a.alignAttr&&a.placed?(d?a.show(!0):b=function(){a.hide()},a.alignAttr.opacity=d,a[a.isOld?"animate":"attr"](a.alignAttr,null,b),r(c,"afterHideOverlappingLabels")):a.attr({opacity:d})),a.isOld=!0)})}})(J);(function(a){var y=a.addEvent,G=a.Chart,
-E=a.createElement,h=a.css,c=a.defaultOptions,r=a.defaultPlotOptions,u=a.extend,v=a.fireEvent,w=a.hasTouch,n=a.isObject,g=a.Legend,d=a.merge,m=a.pick,p=a.Point,b=a.Series,l=a.seriesTypes,f=a.svg,x;x=a.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart,c=b.pointer,d=function(a){var b=c.getPointFromEvent(a);void 0!==b&&(c.isDirectTouch=!0,b.onMouseOver(a))};a.points.forEach(function(a){a.graphic&&(a.graphic.element.point=a);a.dataLabel&&(a.dataLabel.div?a.dataLabel.div.point=a:a.dataLabel.element.point=
-a)});a._hasTracking||(a.trackerGroups.forEach(function(f){if(a[f]){a[f].addClass("highcharts-tracker").on("mouseover",d).on("mouseout",function(a){c.onTrackerMouseOut(a)});if(w)a[f].on("touchstart",d);!b.styledMode&&a.options.cursor&&a[f].css(h).css({cursor:a.options.cursor})}}),a._hasTracking=!0);v(this,"afterDrawTracker")},drawTrackerGraph:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),g=d.length,h=a.chart,l=h.pointer,m=h.renderer,e=h.options.tooltip.snap,
-q=a.tracker,p,n=function(){if(h.hoverSeries!==a)a.onMouseOver()},r="rgba(192,192,192,"+(f?.0001:.002)+")";if(g&&!c)for(p=g+1;p--;)"M"===d[p]&&d.splice(p+1,0,d[p+1]-e,d[p+2],"L"),(p&&"M"===d[p]||p===g)&&d.splice(p,0,"L",d[p-2]+e,d[p-1]);q?q.attr({d:d}):a.graph&&(a.tracker=m.path(d).attr({visibility:a.visible?"visible":"hidden",zIndex:2}).addClass(c?"highcharts-tracker-area":"highcharts-tracker-line").add(a.group),h.styledMode||a.tracker.attr({"stroke-linejoin":"round",stroke:r,fill:c?r:"none","stroke-width":a.graph.strokeWidth()+
-(c?0:2*e)}),[a.tracker,a.markerGroup].forEach(function(a){a.addClass("highcharts-tracker").on("mouseover",n).on("mouseout",function(a){l.onTrackerMouseOut(a)});b.cursor&&!h.styledMode&&a.css({cursor:b.cursor});if(w)a.on("touchstart",n)}));v(this,"afterDrawTracker")}};l.column&&(l.column.prototype.drawTracker=x.drawTrackerPoint);l.pie&&(l.pie.prototype.drawTracker=x.drawTrackerPoint);l.scatter&&(l.scatter.prototype.drawTracker=x.drawTrackerPoint);u(g.prototype,{setItemEvents:function(a,b,c){var f=
-this,g=f.chart.renderer.boxWrapper,h="highcharts-legend-"+(a instanceof p?"point":"series")+"-active",l=f.chart.styledMode;(c?b:a.legendGroup).on("mouseover",function(){a.setState("hover");g.addClass(h);l||b.css(f.options.itemHoverStyle)}).on("mouseout",function(){f.styledMode||b.css(d(a.visible?f.itemStyle:f.itemHiddenStyle));g.removeClass(h);a.setState()}).on("click",function(b){var c=function(){a.setVisible&&a.setVisible()};g.removeClass(h);b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",
-b,c):v(a,"legendItemClick",b,c)})},createCheckboxForItem:function(a){a.checkbox=E("input",{type:"checkbox",className:"highcharts-legend-checkbox",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);y(a.checkbox,"click",function(b){v(a.series||a,"checkboxClick",{checked:b.target.checked,item:a},function(){a.select()})})}});u(G.prototype,{showResetZoom:function(){function a(){b.zoomOut()}var b=this,d=c.lang,f=b.options.chart.resetZoomButton,g=f.theme,h=
-g.states,l="chart"===f.relativeTo?null:"plotBox";v(this,"beforeShowResetZoom",null,function(){b.resetZoomButton=b.renderer.button(d.resetZoom,null,null,a,g,h&&h.hover).attr({align:f.position.align,title:d.resetZoomTitle}).addClass("highcharts-reset-zoom").add().align(f.position,!1,l)})},zoomOut:function(){v(this,"selection",{resetSelection:!0},this.zoom)},zoom:function(a){var b,c=this.pointer,d=!1,f;!a||a.resetSelection?(this.axes.forEach(function(a){b=a.zoom()}),c.initiated=!1):a.xAxis.concat(a.yAxis).forEach(function(a){var f=
-a.axis;c[f.isXAxis?"zoomX":"zoomY"]&&(b=f.zoom(a.min,a.max),f.displayBtn&&(d=!0))});f=this.resetZoomButton;d&&!f?this.showResetZoom():!d&&n(f)&&(this.resetZoomButton=f.destroy());b&&this.redraw(m(this.options.chart.animation,a&&a.animation,100>this.pointCount))},pan:function(a,b){var c=this,d=c.hoverPoints,f;d&&d.forEach(function(a){a.setState()});("xy"===b?[1,0]:[1]).forEach(function(b){b=c[b?"xAxis":"yAxis"][0];var d=b.horiz,g=a[d?"chartX":"chartY"],d=d?"mouseDownX":"mouseDownY",e=c[d],h=(b.pointRange||
-0)/2,k=b.reversed&&!c.inverted||!b.reversed&&c.inverted?-1:1,l=b.getExtremes(),m=b.toValue(e-g,!0)+h*k,k=b.toValue(e+b.len-g,!0)-h*k,p=k<m,e=p?k:m,m=p?m:k,k=Math.min(l.dataMin,h?l.min:b.toValue(b.toPixels(l.min)-b.minPixelPadding)),h=Math.max(l.dataMax,h?l.max:b.toValue(b.toPixels(l.max)+b.minPixelPadding)),p=k-e;0<p&&(m+=p,e=k);p=m-h;0<p&&(m=h,e-=p);b.series.length&&e!==l.min&&m!==l.max&&(b.setExtremes(e,m,!1,!1,{trigger:"pan"}),f=!0);c[d]=g});f&&c.redraw(!1);h(c.container,{cursor:"move"})}});u(p.prototype,
-{select:function(a,b){var c=this,d=c.series,f=d.chart;a=m(a,!c.selected);c.firePointEvent(a?"select":"unselect",{accumulate:b},function(){c.selected=c.options.selected=a;d.options.data[d.data.indexOf(c)]=c.options;c.setState(a&&"select");b||f.getSelectedPoints().forEach(function(a){a.selected&&a!==c&&(a.selected=a.options.selected=!1,d.options.data[d.data.indexOf(a)]=a.options,a.setState(""),a.firePointEvent("unselect"))})})},onMouseOver:function(a){var b=this.series.chart,c=b.pointer;a=a?c.normalize(a):
-c.getChartCoordinatesFromPoint(this,b.inverted);c.runPointActions(a,this)},onMouseOut:function(){var a=this.series.chart;this.firePointEvent("mouseOut");(a.hoverPoints||[]).forEach(function(a){a.setState()});a.hoverPoints=a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var b=this,c=d(b.series.options.point,b.options).events;b.events=c;a.objectEach(c,function(a,c){y(b,c,a)});this.hasImportedEvents=!0}},setState:function(a,b){var c=Math.floor(this.plotX),d=this.plotY,f=this.series,
-g=f.options.states[a||"normal"]||{},h=r[f.type].marker&&f.options.marker,l=h&&!1===h.enabled,e=h&&h.states&&h.states[a||"normal"]||{},p=!1===e.enabled,n=f.stateMarkerGraphic,t=this.marker||{},w=f.chart,x=f.halo,y,E=h&&f.markerAttribs;a=a||"";if(!(a===this.state&&!b||this.selected&&"select"!==a||!1===g.enabled||a&&(p||l&&!1===e.enabled)||a&&t.states&&t.states[a]&&!1===t.states[a].enabled)){E&&(y=f.markerAttribs(this,a));if(this.graphic)this.state&&this.graphic.removeClass("highcharts-point-"+this.state),
-a&&this.graphic.addClass("highcharts-point-"+a),w.styledMode||this.graphic.animate(f.pointAttribs(this,a),m(w.options.chart.animation,g.animation)),y&&this.graphic.animate(y,m(w.options.chart.animation,e.animation,h.animation)),n&&n.hide();else{if(a&&e){h=t.symbol||f.symbol;n&&n.currentSymbol!==h&&(n=n.destroy());if(n)n[b?"animate":"attr"]({x:y.x,y:y.y});else h&&(f.stateMarkerGraphic=n=w.renderer.symbol(h,y.x,y.y,y.width,y.height).add(f.markerGroup),n.currentSymbol=h);!w.styledMode&&n&&n.attr(f.pointAttribs(this,
-a))}n&&(n[a&&w.isInsidePlot(c,d,w.inverted)?"show":"hide"](),n.element.point=this)}(c=g.halo)&&c.size?(x||(f.halo=x=w.renderer.path().add((this.graphic||n).parentGroup)),x.show()[b?"animate":"attr"]({d:this.haloPath(c.size)}),x.attr({"class":"highcharts-halo highcharts-color-"+m(this.colorIndex,f.colorIndex)+(this.className?" "+this.className:""),zIndex:-1}),x.point=this,w.styledMode||x.attr(u({fill:this.color||f.color,"fill-opacity":c.opacity},c.attributes))):x&&x.point&&x.point.haloPath&&x.animate({d:x.point.haloPath(0)},
-null,x.hide);this.state=a;v(this,"afterSetState")}},haloPath:function(a){return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX)-a,this.plotY-a,2*a,2*a)}});u(b.prototype,{onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&v(this,"mouseOver");this.setState("hover");a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;b.hoverSeries=null;if(d)d.onMouseOut();this&&a.events.mouseOut&&
-v(this,"mouseOut");!c||this.stickyTracking||c.shared&&!this.noSharedTooltip||c.hide();this.setState()},setState:function(a){var b=this,c=b.options,d=b.graph,f=c.states,g=c.lineWidth,c=0;a=a||"";if(b.state!==a&&([b.group,b.markerGroup,b.dataLabelsGroup].forEach(function(c){c&&(b.state&&c.removeClass("highcharts-series-"+b.state),a&&c.addClass("highcharts-series-"+a))}),b.state=a,!(b.chart.styledMode||f[a]&&!1===f[a].enabled)&&(a&&(g=f[a].lineWidth||g+(f[a].lineWidthPlus||0)),d&&!d.dashstyle)))for(g=
-{"stroke-width":g},d.animate(g,m(f[a||"normal"]&&f[a||"normal"].animation,b.chart.options.chart.animation));b["zone-graph-"+c];)b["zone-graph-"+c].attr(g),c+=1},setVisible:function(a,b){var c=this,d=c.chart,f=c.legendItem,g,h=d.options.chart.ignoreHiddenSeries,l=c.visible;g=(c.visible=a=c.options.visible=c.userOptions.visible=void 0===a?!l:a)?"show":"hide";["group","dataLabelsGroup","markerGroup","tracker","tt"].forEach(function(a){if(c[a])c[a][g]()});if(d.hoverSeries===c||(d.hoverPoint&&d.hoverPoint.series)===
-c)c.onMouseOut();f&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&d.series.forEach(function(a){a.options.stacking&&a.visible&&(a.isDirty=!0)});c.linkedSeries.forEach(function(b){b.setVisible(a,!1)});h&&(d.isDirtyBox=!0);v(c,g);!1!==b&&d.redraw()},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=this.options.selected=void 0===a?!this.selected:a;this.checkbox&&(this.checkbox.checked=a);v(this,a?"select":"unselect")},drawTracker:x.drawTrackerGraph})})(J);
-(function(a){var y=a.Chart,G=a.isArray,E=a.isObject,h=a.pick,c=a.splat;y.prototype.setResponsive=function(c){var h=this.options.responsive,r=[],w=this.currentResponsive;h&&h.rules&&h.rules.forEach(function(g){void 0===g._id&&(g._id=a.uniqueKey());this.matchResponsiveRule(g,r,c)},this);var n=a.merge.apply(0,r.map(function(c){return a.find(h.rules,function(a){return a._id===c}).chartOptions})),r=r.toString()||void 0;r!==(w&&w.ruleIds)&&(w&&this.update(w.undoOptions,c),r?(this.currentResponsive={ruleIds:r,
-mergedOptions:n,undoOptions:this.currentOptions(n)},this.update(n,c)):this.currentResponsive=void 0)};y.prototype.matchResponsiveRule=function(a,c){var r=a.condition;(r.callback||function(){return this.chartWidth<=h(r.maxWidth,Number.MAX_VALUE)&&this.chartHeight<=h(r.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=h(r.minWidth,0)&&this.chartHeight>=h(r.minHeight,0)}).call(this)&&c.push(a._id)};y.prototype.currentOptions=function(h){function r(h,n,g,d){var m;a.objectEach(h,function(a,b){if(!d&&-1<["series",
-"xAxis","yAxis"].indexOf(b))for(a=c(a),g[b]=[],m=0;m<a.length;m++)n[b][m]&&(g[b][m]={},r(a[m],n[b][m],g[b][m],d+1));else E(a)?(g[b]=G(a)?[]:{},r(a,n[b]||{},g[b],d+1)):g[b]=n[b]||null})}var v={};r(h,this.options,v,0);return v}})(J);return J});
-//# sourceMappingURL=highcharts.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
-
- 3D features for Highcharts JS
-
- @license: www.highcharts.com/license
-*/
-(function(A){"object"===typeof module&&module.exports?module.exports=A:"function"===typeof define&&define.amd?define(function(){return A}):A("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(A){(function(b){var y=b.deg2rad,z=b.pick;b.perspective3D=function(b,q,v){q=0<v&&v<Number.POSITIVE_INFINITY?v/(b.z+q.z+v):1;return{x:b.x*q,y:b.y*q}};b.perspective=function(u,q,v){var x=q.options.chart.options3d,f=v?q.inverted:!1,w={x:q.plotWidth/2,y:q.plotHeight/2,z:x.depth/2,vd:z(x.depth,1)*z(x.viewDistance,
-0)},p=q.scale3d||1,e=y*x.beta*(f?-1:1),x=y*x.alpha*(f?-1:1),a=Math.cos(x),l=Math.cos(-e),r=Math.sin(x),k=Math.sin(-e);v||(w.x+=q.plotLeft,w.y+=q.plotTop);return u.map(function(e){var d;d=(f?e.y:e.x)-w.x;var c=(f?e.x:e.y)-w.y;e=(e.z||0)-w.z;d={x:l*d-k*e,y:-r*k*d+a*c-l*r*e,z:a*k*d+r*c+a*l*e};c=b.perspective3D(d,w,w.vd);c.x=c.x*p+w.x;c.y=c.y*p+w.y;c.z=d.z*p+w.z;return{x:f?c.y:c.x,y:f?c.x:c.y,z:c.z}})};b.pointCameraDistance=function(b,q){var v=q.options.chart.options3d,x=q.plotWidth/2;q=q.plotHeight/
-2;v=z(v.depth,1)*z(v.viewDistance,0)+v.depth;return Math.sqrt(Math.pow(x-b.plotX,2)+Math.pow(q-b.plotY,2)+Math.pow(v-b.plotZ,2))};b.shapeArea=function(b){var q=0,v,x;for(v=0;v<b.length;v++)x=(v+1)%b.length,q+=b[v].x*b[x].y-b[x].x*b[v].y;return q/2};b.shapeArea3d=function(u,q,v){return b.shapeArea(b.perspective(u,q,v))}})(A);(function(b){function y(a,d,h,b,g,C,e,p){var m=[],F=C-g;return C>g&&C-g>Math.PI/2+.0001?(m=m.concat(y(a,d,h,b,g,g+Math.PI/2,e,p)),m=m.concat(y(a,d,h,b,g+Math.PI/2,C,e,p))):C<g&&
-g-C>Math.PI/2+.0001?(m=m.concat(y(a,d,h,b,g,g-Math.PI/2,e,p)),m=m.concat(y(a,d,h,b,g-Math.PI/2,C,e,p))):["C",a+h*Math.cos(g)-h*c*F*Math.sin(g)+e,d+b*Math.sin(g)+b*c*F*Math.cos(g)+p,a+h*Math.cos(C)+h*c*F*Math.sin(C)+e,d+b*Math.sin(C)-b*c*F*Math.cos(C)+p,a+h*Math.cos(C)+e,d+b*Math.sin(C)+p]}var z=Math.cos,u=Math.PI,q=Math.sin,v=b.animObject,x=b.charts,f=b.color,w=b.defined,p=b.deg2rad,e=b.extend,a=b.merge,l=b.perspective,r=b.pick,k=b.SVGElement,t=b.SVGRenderer,d=b.wrap,c,n,g;c=4*(Math.sqrt(2)-1)/3/
-(u/2);t.prototype.toLinePath=function(a,d){var h=[];a.forEach(function(a){h.push("L",a.x,a.y)});a.length&&(h[0]="M",d&&h.push("Z"));return h};t.prototype.toLineSegments=function(a){var d=[],h=!0;a.forEach(function(a){d.push(h?"M":"L",a.x,a.y);h=!h});return d};t.prototype.face3d=function(a){var c=this,h=this.createElement("path");h.vertexes=[];h.insidePlotArea=!1;h.enabled=!0;d(h,"attr",function(a,d){if("object"===typeof d&&(w(d.enabled)||w(d.vertexes)||w(d.insidePlotArea))){this.enabled=r(d.enabled,
-this.enabled);this.vertexes=r(d.vertexes,this.vertexes);this.insidePlotArea=r(d.insidePlotArea,this.insidePlotArea);delete d.enabled;delete d.vertexes;delete d.insidePlotArea;var h=l(this.vertexes,x[c.chartIndex],this.insidePlotArea),m=c.toLinePath(h,!0),h=b.shapeArea(h),h=this.enabled&&0<h?"visible":"hidden";d.d=m;d.visibility=h}return a.apply(this,[].slice.call(arguments,1))});d(h,"animate",function(a,d){if("object"===typeof d&&(w(d.enabled)||w(d.vertexes)||w(d.insidePlotArea))){this.enabled=r(d.enabled,
-this.enabled);this.vertexes=r(d.vertexes,this.vertexes);this.insidePlotArea=r(d.insidePlotArea,this.insidePlotArea);delete d.enabled;delete d.vertexes;delete d.insidePlotArea;var h=l(this.vertexes,x[c.chartIndex],this.insidePlotArea),m=c.toLinePath(h,!0),h=b.shapeArea(h),h=this.enabled&&0<h?"visible":"hidden";d.d=m;this.attr("visibility",h)}return a.apply(this,[].slice.call(arguments,1))});return h.attr(a)};t.prototype.polyhedron=function(a){var c=this,h=this.g(),m=h.destroy;this.styledMode||h.attr({"stroke-linejoin":"round"});
-h.faces=[];h.destroy=function(){for(var a=0;a<h.faces.length;a++)h.faces[a].destroy();return m.call(this)};d(h,"attr",function(a,d,m,b,g){if("object"===typeof d&&w(d.faces)){for(;h.faces.length>d.faces.length;)h.faces.pop().destroy();for(;h.faces.length<d.faces.length;)h.faces.push(c.face3d().add(h));for(var e=0;e<d.faces.length;e++)c.styledMode&&delete d.faces[e].fill,h.faces[e].attr(d.faces[e],null,b,g);delete d.faces}return a.apply(this,[].slice.call(arguments,1))});d(h,"animate",function(a,d,
-m,b){if(d&&d.faces){for(;h.faces.length>d.faces.length;)h.faces.pop().destroy();for(;h.faces.length<d.faces.length;)h.faces.push(c.face3d().add(h));for(var g=0;g<d.faces.length;g++)h.faces[g].animate(d.faces[g],m,b);delete d.faces}return a.apply(this,[].slice.call(arguments,1))});return h.attr(a)};n={initArgs:function(a){var d=this,h=d.renderer,c=h[d.pathType+"Path"](a),m=c.zIndexes;d.parts.forEach(function(a){d[a]=h.path(c[a]).attr({"class":"highcharts-3d-"+a,zIndex:m[a]||0}).add(d)});d.attr({"stroke-linejoin":"round",
-zIndex:m.group});d.originalDestroy=d.destroy;d.destroy=d.destroyParts},singleSetterForParts:function(a,d,h,c,g,e){var m={};c=[null,null,c||"attr",g,e];var p=h&&h.zIndexes;h?(b.objectEach(h,function(d,c){m[c]={};m[c][a]=d;p&&(m[c].zIndex=h.zIndexes[c]||0)}),c[1]=m):(m[a]=d,c[0]=m);return this.processParts.apply(this,c)},processParts:function(a,d,c,g,e){var h=this;h.parts.forEach(function(m){d&&(a=b.pick(d[m],!1));if(!1!==a)h[m][c](a,g,e)});return h},destroyParts:function(){this.processParts(null,null,
-"destroy");return this.originalDestroy.call(this)}};g=b.merge(n,{parts:["front","top","side"],pathType:"cuboid",attr:function(a,d,c,b){if("string"===typeof a&&"undefined"!==typeof d){var h=a;a={};a[h]=d}return a.shapeArgs||w(a.x)?this.singleSetterForParts("d",null,this.renderer[this.pathType+"Path"](a.shapeArgs||a)):k.prototype.attr.call(this,a,void 0,c,b)},animate:function(a,d,c){w(a.x)&&w(a.y)?(a=this.renderer[this.pathType+"Path"](a),this.singleSetterForParts("d",null,a,"animate",d,c),this.attr({zIndex:a.zIndexes.group})):
-a.opacity?this.processParts(a,null,"animate",d,c):k.prototype.animate.call(this,a,d,c);return this},fillSetter:function(a){this.singleSetterForParts("fill",null,{front:a,top:f(a).brighten(.1).get(),side:f(a).brighten(-.1).get()});this.color=this.fill=a;return this},opacitySetter:function(a){return this.singleSetterForParts("opacity",a)}});t.prototype.elements3d={base:n,cuboid:g};t.prototype.element3d=function(a,d){var c=this.g();b.extend(c,this.elements3d[a]);c.initArgs(d);return c};t.prototype.cuboid=
-function(a){return this.element3d("cuboid",a)};b.SVGRenderer.prototype.cuboidPath=function(a){function d(a){return f[a]}var c=a.x,g=a.y,e=a.z,p=a.height,m=a.width,k=a.depth,r=x[this.chartIndex],n,t,v=r.options.chart.options3d.alpha,q=0,f=[{x:c,y:g,z:e},{x:c+m,y:g,z:e},{x:c+m,y:g+p,z:e},{x:c,y:g+p,z:e},{x:c,y:g+p,z:e+k},{x:c+m,y:g+p,z:e+k},{x:c+m,y:g,z:e+k},{x:c,y:g,z:e+k}],f=l(f,r,a.insidePlotArea);t=function(a,c){var h=[[],-1];a=a.map(d);c=c.map(d);0>b.shapeArea(a)?h=[a,0]:0>b.shapeArea(c)&&(h=[c,
-1]);return h};n=t([3,2,1,0],[7,6,5,4]);a=n[0];m=n[1];n=t([1,6,7,0],[4,5,2,3]);p=n[0];k=n[1];n=t([1,2,5,6],[0,7,4,3]);t=n[0];n=n[1];1===n?q+=1E4*(1E3-c):n||(q+=1E4*c);q+=10*(!k||0<=v&&180>=v||360>v&&357.5<v?r.plotHeight-g:10+g);1===m?q+=100*e:m||(q+=100*(1E3-e));return{front:this.toLinePath(a,!0),top:this.toLinePath(p,!0),side:this.toLinePath(t,!0),zIndexes:{group:Math.round(q)},isFront:m,isTop:k}};b.SVGRenderer.prototype.arc3d=function(c){function g(d){var c=!1,h={},g;d=a(d);for(g in d)-1!==l.indexOf(g)&&
-(h[g]=d[g],delete d[g],c=!0);return c?h:!1}var h=this.g(),m=h.renderer,l="x y r innerR start end".split(" ");c=a(c);c.alpha=(c.alpha||0)*p;c.beta=(c.beta||0)*p;h.top=m.path();h.side1=m.path();h.side2=m.path();h.inn=m.path();h.out=m.path();h.onAdd=function(){var a=h.parentGroup,d=h.attr("class");h.top.add(h);["out","inn","side1","side2"].forEach(function(c){h[c].attr({"class":d+" highcharts-3d-side"}).add(a)})};["addClass","removeClass"].forEach(function(a){h[a]=function(){var d=arguments;["top","out",
-"inn","side1","side2"].forEach(function(c){h[c][a].apply(h[c],d)})}});h.setPaths=function(a){var d=h.renderer.arc3dPath(a),c=100*d.zTop;h.attribs=a;h.top.attr({d:d.top,zIndex:d.zTop});h.inn.attr({d:d.inn,zIndex:d.zInn});h.out.attr({d:d.out,zIndex:d.zOut});h.side1.attr({d:d.side1,zIndex:d.zSide1});h.side2.attr({d:d.side2,zIndex:d.zSide2});h.zIndex=c;h.attr({zIndex:c});a.center&&(h.top.setRadialReference(a.center),delete a.center)};h.setPaths(c);h.fillSetter=function(a){var d=f(a).brighten(-.1).get();
-this.fill=a;this.side1.attr({fill:d});this.side2.attr({fill:d});this.inn.attr({fill:d});this.out.attr({fill:d});this.top.attr({fill:a});return this};["opacity","translateX","translateY","visibility"].forEach(function(a){h[a+"Setter"]=function(a,d){h[d]=a;["out","inn","side1","side2","top"].forEach(function(c){h[c].attr(d,a)})}});d(h,"attr",function(a,d){var c;"object"===typeof d&&(c=g(d))&&(e(h.attribs,c),h.setPaths(h.attribs));return a.apply(this,[].slice.call(arguments,1))});d(h,"animate",function(d,
-c,e,p){var m,k=this.attribs,l,n="data-"+Math.random().toString(26).substring(2,9);delete c.center;delete c.z;delete c.depth;delete c.alpha;delete c.beta;l=v(r(e,this.renderer.globalAnimation));l.duration&&(m=g(c),h[n]=0,c[n]=1,h[n+"Setter"]=b.noop,m&&(l.step=function(d,c){function h(a){return k[a]+(r(m[a],k[a])-k[a])*c.pos}c.prop===n&&c.elem.setPaths(a(k,{x:h("x"),y:h("y"),r:h("r"),innerR:h("innerR"),start:h("start"),end:h("end")}))}),e=l);return d.call(this,c,e,p)});h.destroy=function(){this.top.destroy();
-this.out.destroy();this.inn.destroy();this.side1.destroy();this.side2.destroy();k.prototype.destroy.call(this)};h.hide=function(){this.top.hide();this.out.hide();this.inn.hide();this.side1.hide();this.side2.hide()};h.show=function(a){this.top.show(a);this.out.show(a);this.inn.show(a);this.side1.show(a);this.side2.show(a)};return h};t.prototype.arc3dPath=function(a){function d(a){a%=2*Math.PI;a>Math.PI&&(a=2*Math.PI-a);return a}var c=a.x,g=a.y,b=a.start,e=a.end-.00001,p=a.r,k=a.innerR||0,l=a.depth||
-0,m=a.alpha,n=a.beta,r=Math.cos(b),t=Math.sin(b);a=Math.cos(e);var v=Math.sin(e),f=p*Math.cos(n),p=p*Math.cos(m),x=k*Math.cos(n),w=k*Math.cos(m),k=l*Math.sin(n),B=l*Math.sin(m),l=["M",c+f*r,g+p*t],l=l.concat(y(c,g,f,p,b,e,0,0)),l=l.concat(["L",c+x*a,g+w*v]),l=l.concat(y(c,g,x,w,e,b,0,0)),l=l.concat(["Z"]),A=0<n?Math.PI/2:0,n=0<m?0:Math.PI/2,A=b>-A?b:e>-A?-A:b,D=e<u-n?e:b<u-n?u-n:e,E=2*u-n,m=["M",c+f*z(A),g+p*q(A)],m=m.concat(y(c,g,f,p,A,D,0,0));e>E&&b<E?(m=m.concat(["L",c+f*z(D)+k,g+p*q(D)+B]),m=
-m.concat(y(c,g,f,p,D,E,k,B)),m=m.concat(["L",c+f*z(E),g+p*q(E)]),m=m.concat(y(c,g,f,p,E,e,0,0)),m=m.concat(["L",c+f*z(e)+k,g+p*q(e)+B]),m=m.concat(y(c,g,f,p,e,E,k,B)),m=m.concat(["L",c+f*z(E),g+p*q(E)]),m=m.concat(y(c,g,f,p,E,D,0,0))):e>u-n&&b<u-n&&(m=m.concat(["L",c+f*Math.cos(D)+k,g+p*Math.sin(D)+B]),m=m.concat(y(c,g,f,p,D,e,k,B)),m=m.concat(["L",c+f*Math.cos(e),g+p*Math.sin(e)]),m=m.concat(y(c,g,f,p,e,D,0,0)));m=m.concat(["L",c+f*Math.cos(D)+k,g+p*Math.sin(D)+B]);m=m.concat(y(c,g,f,p,D,A,k,B));
-m=m.concat(["Z"]);n=["M",c+x*r,g+w*t];n=n.concat(y(c,g,x,w,b,e,0,0));n=n.concat(["L",c+x*Math.cos(e)+k,g+w*Math.sin(e)+B]);n=n.concat(y(c,g,x,w,e,b,k,B));n=n.concat(["Z"]);r=["M",c+f*r,g+p*t,"L",c+f*r+k,g+p*t+B,"L",c+x*r+k,g+w*t+B,"L",c+x*r,g+w*t,"Z"];c=["M",c+f*a,g+p*v,"L",c+f*a+k,g+p*v+B,"L",c+x*a+k,g+w*v+B,"L",c+x*a,g+w*v,"Z"];v=Math.atan2(B,-k);g=Math.abs(e+v);a=Math.abs(b+v);b=Math.abs((b+e)/2+v);g=d(g);a=d(a);b=d(b);b*=1E5;e=1E5*a;g*=1E5;return{top:l,zTop:1E5*Math.PI+1,out:m,zOut:Math.max(b,
-e,g),inn:n,zInn:Math.max(b,e,g),side1:r,zSide1:.99*g,side2:c,zSide2:.99*e}}})(A);(function(b){function y(b,e){var a=b.plotLeft,p=b.plotWidth+a,r=b.plotTop,k=b.plotHeight+r,t=a+b.plotWidth/2,d=r+b.plotHeight/2,c=Number.MAX_VALUE,n=-Number.MAX_VALUE,g=Number.MAX_VALUE,m=-Number.MAX_VALUE,f,h=1;f=[{x:a,y:r,z:0},{x:a,y:r,z:e}];[0,1].forEach(function(a){f.push({x:p,y:f[a].y,z:f[a].z})});[0,1,2,3].forEach(function(a){f.push({x:f[a].x,y:k,z:f[a].z})});f=v(f,b,!1);f.forEach(function(a){c=Math.min(c,a.x);
-n=Math.max(n,a.x);g=Math.min(g,a.y);m=Math.max(m,a.y)});a>c&&(h=Math.min(h,1-Math.abs((a+t)/(c+t))%1));p<n&&(h=Math.min(h,(p-t)/(n-t)));r>g&&(h=0>g?Math.min(h,(r+d)/(-g+r+d)):Math.min(h,1-(r+d)/(g+d)%1));k<m&&(h=Math.min(h,Math.abs((k-d)/(m-d))));return h}var z=b.addEvent,u=b.Chart,q=b.merge,v=b.perspective,x=b.pick,f=b.wrap;u.prototype.is3d=function(){return this.options.chart.options3d&&this.options.chart.options3d.enabled};u.prototype.propsRequireDirtyBox.push("chart.options3d");u.prototype.propsRequireUpdateSeries.push("chart.options3d");
-z(u,"afterInit",function(){var b=this.options;this.is3d()&&(b.series||[]).forEach(function(e){"scatter"===(e.type||b.chart.type||b.chart.defaultSeriesType)&&(e.type="scatter3d")})});z(u,"addSeries",function(b){this.is3d()&&"scatter"===b.options.type&&(b.options.type="scatter3d")});b.wrap(b.Chart.prototype,"isInsidePlot",function(b){return this.is3d()||b.apply(this,[].slice.call(arguments,1))});var w=b.getOptions();q(!0,w,{chart:{options3d:{enabled:!1,alpha:0,beta:0,depth:100,fitToPlot:!0,viewDistance:25,
-axisLabelPosition:null,frame:{visible:"default",size:1,bottom:{},top:{},left:{},right:{},back:{},front:{}}}}});z(u,"afterGetContainer",function(){this.styledMode&&(this.renderer.definition({tagName:"style",textContent:".highcharts-3d-top{filter: url(#highcharts-brighter)}\n.highcharts-3d-side{filter: url(#highcharts-darker)}\n"}),[{name:"darker",slope:.6},{name:"brighter",slope:1.4}].forEach(function(b){this.renderer.definition({tagName:"filter",id:"highcharts-"+b.name,children:[{tagName:"feComponentTransfer",
-children:[{tagName:"feFuncR",type:"linear",slope:b.slope},{tagName:"feFuncG",type:"linear",slope:b.slope},{tagName:"feFuncB",type:"linear",slope:b.slope}]}]})},this))});f(u.prototype,"setClassName",function(b){b.apply(this,[].slice.call(arguments,1));this.is3d()&&(this.container.className+=" highcharts-3d-chart")});z(b.Chart,"afterSetChartSize",function(){var b=this.options.chart.options3d;if(this.is3d()){var e=this.inverted,a=this.clipBox,l=this.margin;a[e?"y":"x"]=-(l[3]||0);a[e?"x":"y"]=-(l[0]||
-0);a[e?"height":"width"]=this.chartWidth+(l[3]||0)+(l[1]||0);a[e?"width":"height"]=this.chartHeight+(l[0]||0)+(l[2]||0);this.scale3d=1;!0===b.fitToPlot&&(this.scale3d=y(this,b.depth));this.frame3d=this.get3dFrame()}});z(u,"beforeRedraw",function(){this.is3d()&&(this.isDirtyBox=!0)});z(u,"beforeRender",function(){this.is3d()&&(this.frame3d=this.get3dFrame())});f(u.prototype,"renderSeries",function(b){var e=this.series.length;if(this.is3d())for(;e--;)b=this.series[e],b.translate(),b.render();else b.call(this)});
-z(u,"afterDrawChartBox",function(){if(this.is3d()){var p=this.renderer,e=this.options.chart.options3d,a=this.get3dFrame(),l=this.plotLeft,r=this.plotLeft+this.plotWidth,k=this.plotTop,t=this.plotTop+this.plotHeight,e=e.depth,d=l-(a.left.visible?a.left.size:0),c=r+(a.right.visible?a.right.size:0),n=k-(a.top.visible?a.top.size:0),g=t+(a.bottom.visible?a.bottom.size:0),m=0-(a.front.visible?a.front.size:0),f=e+(a.back.visible?a.back.size:0),h=this.hasRendered?"animate":"attr";this.frame3d=a;this.frameShapes||
-(this.frameShapes={bottom:p.polyhedron().add(),top:p.polyhedron().add(),left:p.polyhedron().add(),right:p.polyhedron().add(),back:p.polyhedron().add(),front:p.polyhedron().add()});this.frameShapes.bottom[h]({"class":"highcharts-3d-frame highcharts-3d-frame-bottom",zIndex:a.bottom.frontFacing?-1E3:1E3,faces:[{fill:b.color(a.bottom.color).brighten(.1).get(),vertexes:[{x:d,y:g,z:m},{x:c,y:g,z:m},{x:c,y:g,z:f},{x:d,y:g,z:f}],enabled:a.bottom.visible},{fill:b.color(a.bottom.color).brighten(.1).get(),vertexes:[{x:l,
-y:t,z:e},{x:r,y:t,z:e},{x:r,y:t,z:0},{x:l,y:t,z:0}],enabled:a.bottom.visible},{fill:b.color(a.bottom.color).brighten(-.1).get(),vertexes:[{x:d,y:g,z:m},{x:d,y:g,z:f},{x:l,y:t,z:e},{x:l,y:t,z:0}],enabled:a.bottom.visible&&!a.left.visible},{fill:b.color(a.bottom.color).brighten(-.1).get(),vertexes:[{x:c,y:g,z:f},{x:c,y:g,z:m},{x:r,y:t,z:0},{x:r,y:t,z:e}],enabled:a.bottom.visible&&!a.right.visible},{fill:b.color(a.bottom.color).get(),vertexes:[{x:c,y:g,z:m},{x:d,y:g,z:m},{x:l,y:t,z:0},{x:r,y:t,z:0}],
-enabled:a.bottom.visible&&!a.front.visible},{fill:b.color(a.bottom.color).get(),vertexes:[{x:d,y:g,z:f},{x:c,y:g,z:f},{x:r,y:t,z:e},{x:l,y:t,z:e}],enabled:a.bottom.visible&&!a.back.visible}]});this.frameShapes.top[h]({"class":"highcharts-3d-frame highcharts-3d-frame-top",zIndex:a.top.frontFacing?-1E3:1E3,faces:[{fill:b.color(a.top.color).brighten(.1).get(),vertexes:[{x:d,y:n,z:f},{x:c,y:n,z:f},{x:c,y:n,z:m},{x:d,y:n,z:m}],enabled:a.top.visible},{fill:b.color(a.top.color).brighten(.1).get(),vertexes:[{x:l,
-y:k,z:0},{x:r,y:k,z:0},{x:r,y:k,z:e},{x:l,y:k,z:e}],enabled:a.top.visible},{fill:b.color(a.top.color).brighten(-.1).get(),vertexes:[{x:d,y:n,z:f},{x:d,y:n,z:m},{x:l,y:k,z:0},{x:l,y:k,z:e}],enabled:a.top.visible&&!a.left.visible},{fill:b.color(a.top.color).brighten(-.1).get(),vertexes:[{x:c,y:n,z:m},{x:c,y:n,z:f},{x:r,y:k,z:e},{x:r,y:k,z:0}],enabled:a.top.visible&&!a.right.visible},{fill:b.color(a.top.color).get(),vertexes:[{x:d,y:n,z:m},{x:c,y:n,z:m},{x:r,y:k,z:0},{x:l,y:k,z:0}],enabled:a.top.visible&&
-!a.front.visible},{fill:b.color(a.top.color).get(),vertexes:[{x:c,y:n,z:f},{x:d,y:n,z:f},{x:l,y:k,z:e},{x:r,y:k,z:e}],enabled:a.top.visible&&!a.back.visible}]});this.frameShapes.left[h]({"class":"highcharts-3d-frame highcharts-3d-frame-left",zIndex:a.left.frontFacing?-1E3:1E3,faces:[{fill:b.color(a.left.color).brighten(.1).get(),vertexes:[{x:d,y:g,z:m},{x:l,y:t,z:0},{x:l,y:t,z:e},{x:d,y:g,z:f}],enabled:a.left.visible&&!a.bottom.visible},{fill:b.color(a.left.color).brighten(.1).get(),vertexes:[{x:d,
-y:n,z:f},{x:l,y:k,z:e},{x:l,y:k,z:0},{x:d,y:n,z:m}],enabled:a.left.visible&&!a.top.visible},{fill:b.color(a.left.color).brighten(-.1).get(),vertexes:[{x:d,y:g,z:f},{x:d,y:n,z:f},{x:d,y:n,z:m},{x:d,y:g,z:m}],enabled:a.left.visible},{fill:b.color(a.left.color).brighten(-.1).get(),vertexes:[{x:l,y:k,z:e},{x:l,y:t,z:e},{x:l,y:t,z:0},{x:l,y:k,z:0}],enabled:a.left.visible},{fill:b.color(a.left.color).get(),vertexes:[{x:d,y:g,z:m},{x:d,y:n,z:m},{x:l,y:k,z:0},{x:l,y:t,z:0}],enabled:a.left.visible&&!a.front.visible},
-{fill:b.color(a.left.color).get(),vertexes:[{x:d,y:n,z:f},{x:d,y:g,z:f},{x:l,y:t,z:e},{x:l,y:k,z:e}],enabled:a.left.visible&&!a.back.visible}]});this.frameShapes.right[h]({"class":"highcharts-3d-frame highcharts-3d-frame-right",zIndex:a.right.frontFacing?-1E3:1E3,faces:[{fill:b.color(a.right.color).brighten(.1).get(),vertexes:[{x:c,y:g,z:f},{x:r,y:t,z:e},{x:r,y:t,z:0},{x:c,y:g,z:m}],enabled:a.right.visible&&!a.bottom.visible},{fill:b.color(a.right.color).brighten(.1).get(),vertexes:[{x:c,y:n,z:m},
-{x:r,y:k,z:0},{x:r,y:k,z:e},{x:c,y:n,z:f}],enabled:a.right.visible&&!a.top.visible},{fill:b.color(a.right.color).brighten(-.1).get(),vertexes:[{x:r,y:k,z:0},{x:r,y:t,z:0},{x:r,y:t,z:e},{x:r,y:k,z:e}],enabled:a.right.visible},{fill:b.color(a.right.color).brighten(-.1).get(),vertexes:[{x:c,y:g,z:m},{x:c,y:n,z:m},{x:c,y:n,z:f},{x:c,y:g,z:f}],enabled:a.right.visible},{fill:b.color(a.right.color).get(),vertexes:[{x:c,y:n,z:m},{x:c,y:g,z:m},{x:r,y:t,z:0},{x:r,y:k,z:0}],enabled:a.right.visible&&!a.front.visible},
-{fill:b.color(a.right.color).get(),vertexes:[{x:c,y:g,z:f},{x:c,y:n,z:f},{x:r,y:k,z:e},{x:r,y:t,z:e}],enabled:a.right.visible&&!a.back.visible}]});this.frameShapes.back[h]({"class":"highcharts-3d-frame highcharts-3d-frame-back",zIndex:a.back.frontFacing?-1E3:1E3,faces:[{fill:b.color(a.back.color).brighten(.1).get(),vertexes:[{x:c,y:g,z:f},{x:d,y:g,z:f},{x:l,y:t,z:e},{x:r,y:t,z:e}],enabled:a.back.visible&&!a.bottom.visible},{fill:b.color(a.back.color).brighten(.1).get(),vertexes:[{x:d,y:n,z:f},{x:c,
-y:n,z:f},{x:r,y:k,z:e},{x:l,y:k,z:e}],enabled:a.back.visible&&!a.top.visible},{fill:b.color(a.back.color).brighten(-.1).get(),vertexes:[{x:d,y:g,z:f},{x:d,y:n,z:f},{x:l,y:k,z:e},{x:l,y:t,z:e}],enabled:a.back.visible&&!a.left.visible},{fill:b.color(a.back.color).brighten(-.1).get(),vertexes:[{x:c,y:n,z:f},{x:c,y:g,z:f},{x:r,y:t,z:e},{x:r,y:k,z:e}],enabled:a.back.visible&&!a.right.visible},{fill:b.color(a.back.color).get(),vertexes:[{x:l,y:k,z:e},{x:r,y:k,z:e},{x:r,y:t,z:e},{x:l,y:t,z:e}],enabled:a.back.visible},
-{fill:b.color(a.back.color).get(),vertexes:[{x:d,y:g,z:f},{x:c,y:g,z:f},{x:c,y:n,z:f},{x:d,y:n,z:f}],enabled:a.back.visible}]});this.frameShapes.front[h]({"class":"highcharts-3d-frame highcharts-3d-frame-front",zIndex:a.front.frontFacing?-1E3:1E3,faces:[{fill:b.color(a.front.color).brighten(.1).get(),vertexes:[{x:d,y:g,z:m},{x:c,y:g,z:m},{x:r,y:t,z:0},{x:l,y:t,z:0}],enabled:a.front.visible&&!a.bottom.visible},{fill:b.color(a.front.color).brighten(.1).get(),vertexes:[{x:c,y:n,z:m},{x:d,y:n,z:m},{x:l,
-y:k,z:0},{x:r,y:k,z:0}],enabled:a.front.visible&&!a.top.visible},{fill:b.color(a.front.color).brighten(-.1).get(),vertexes:[{x:d,y:n,z:m},{x:d,y:g,z:m},{x:l,y:t,z:0},{x:l,y:k,z:0}],enabled:a.front.visible&&!a.left.visible},{fill:b.color(a.front.color).brighten(-.1).get(),vertexes:[{x:c,y:g,z:m},{x:c,y:n,z:m},{x:r,y:k,z:0},{x:r,y:t,z:0}],enabled:a.front.visible&&!a.right.visible},{fill:b.color(a.front.color).get(),vertexes:[{x:r,y:k,z:0},{x:l,y:k,z:0},{x:l,y:t,z:0},{x:r,y:t,z:0}],enabled:a.front.visible},
-{fill:b.color(a.front.color).get(),vertexes:[{x:c,y:g,z:m},{x:d,y:g,z:m},{x:d,y:n,z:m},{x:c,y:n,z:m}],enabled:a.front.visible}]})}});u.prototype.retrieveStacks=function(b){var e=this.series,a={},l,p=1;this.series.forEach(function(k){l=x(k.options.stack,b?0:e.length-1-k.index);a[l]?a[l].series.push(k):(a[l]={series:[k],position:p},p++)});a.totalStacks=p+1;return a};u.prototype.get3dFrame=function(){var p=this,e=p.options.chart.options3d,a=e.frame,l=p.plotLeft,f=p.plotLeft+p.plotWidth,k=p.plotTop,t=
-p.plotTop+p.plotHeight,d=e.depth,c=function(a){a=b.shapeArea3d(a,p);return.5<a?1:-.5>a?-1:0},n=c([{x:l,y:t,z:d},{x:f,y:t,z:d},{x:f,y:t,z:0},{x:l,y:t,z:0}]),g=c([{x:l,y:k,z:0},{x:f,y:k,z:0},{x:f,y:k,z:d},{x:l,y:k,z:d}]),m=c([{x:l,y:k,z:0},{x:l,y:k,z:d},{x:l,y:t,z:d},{x:l,y:t,z:0}]),q=c([{x:f,y:k,z:d},{x:f,y:k,z:0},{x:f,y:t,z:0},{x:f,y:t,z:d}]),h=c([{x:l,y:t,z:0},{x:f,y:t,z:0},{x:f,y:k,z:0},{x:l,y:k,z:0}]),c=c([{x:l,y:k,z:d},{x:f,y:k,z:d},{x:f,y:t,z:d},{x:l,y:t,z:d}]),w=!1,u=!1,y=!1,z=!1;[].concat(p.xAxis,
-p.yAxis,p.zAxis).forEach(function(a){a&&(a.horiz?a.opposite?u=!0:w=!0:a.opposite?z=!0:y=!0)});var A=function(a,c,d){for(var b=["size","color","visible"],g={},e=0;e<b.length;e++)for(var m=b[e],h=0;h<a.length;h++)if("object"===typeof a[h]){var f=a[h][m];if(void 0!==f&&null!==f){g[m]=f;break}}a=d;!0===g.visible||!1===g.visible?a=g.visible:"auto"===g.visible&&(a=0<c);return{size:x(g.size,1),color:x(g.color,"none"),frontFacing:0<c,visible:a}},a={bottom:A([a.bottom,a.top,a],n,w),top:A([a.top,a.bottom,a],
-g,u),left:A([a.left,a.right,a.side,a],m,y),right:A([a.right,a.left,a.side,a],q,z),back:A([a.back,a.front,a],c,!0),front:A([a.front,a.back,a],h,!1)};"auto"===e.axisLabelPosition?(q=function(a,c){return a.visible!==c.visible||a.visible&&c.visible&&a.frontFacing!==c.frontFacing},e=[],q(a.left,a.front)&&e.push({y:(k+t)/2,x:l,z:0,xDir:{x:1,y:0,z:0}}),q(a.left,a.back)&&e.push({y:(k+t)/2,x:l,z:d,xDir:{x:0,y:0,z:-1}}),q(a.right,a.front)&&e.push({y:(k+t)/2,x:f,z:0,xDir:{x:0,y:0,z:1}}),q(a.right,a.back)&&e.push({y:(k+
-t)/2,x:f,z:d,xDir:{x:-1,y:0,z:0}}),n=[],q(a.bottom,a.front)&&n.push({x:(l+f)/2,y:t,z:0,xDir:{x:1,y:0,z:0}}),q(a.bottom,a.back)&&n.push({x:(l+f)/2,y:t,z:d,xDir:{x:-1,y:0,z:0}}),g=[],q(a.top,a.front)&&g.push({x:(l+f)/2,y:k,z:0,xDir:{x:1,y:0,z:0}}),q(a.top,a.back)&&g.push({x:(l+f)/2,y:k,z:d,xDir:{x:-1,y:0,z:0}}),m=[],q(a.bottom,a.left)&&m.push({z:(0+d)/2,y:t,x:l,xDir:{x:0,y:0,z:-1}}),q(a.bottom,a.right)&&m.push({z:(0+d)/2,y:t,x:f,xDir:{x:0,y:0,z:1}}),t=[],q(a.top,a.left)&&t.push({z:(0+d)/2,y:k,x:l,xDir:{x:0,
-y:0,z:-1}}),q(a.top,a.right)&&t.push({z:(0+d)/2,y:k,x:f,xDir:{x:0,y:0,z:1}}),l=function(a,c,d){if(0===a.length)return null;if(1===a.length)return a[0];for(var b=0,g=v(a,p,!1),e=1;e<g.length;e++)d*g[e][c]>d*g[b][c]?b=e:d*g[e][c]===d*g[b][c]&&g[e].z<g[b].z&&(b=e);return a[b]},a.axes={y:{left:l(e,"x",-1),right:l(e,"x",1)},x:{top:l(g,"y",-1),bottom:l(n,"y",1)},z:{top:l(t,"y",-1),bottom:l(m,"y",1)}}):a.axes={y:{left:{x:l,z:0,xDir:{x:1,y:0,z:0}},right:{x:f,z:0,xDir:{x:0,y:0,z:1}}},x:{top:{y:k,z:0,xDir:{x:1,
-y:0,z:0}},bottom:{y:t,z:0,xDir:{x:1,y:0,z:0}}},z:{top:{x:y?f:l,y:k,xDir:y?{x:0,y:0,z:1}:{x:0,y:0,z:-1}},bottom:{x:y?f:l,y:t,xDir:y?{x:0,y:0,z:1}:{x:0,y:0,z:-1}}}};return a};b.Fx.prototype.matrixSetter=function(){var f;if(1>this.pos&&(b.isArray(this.start)||b.isArray(this.end))){var e=this.start||[1,0,0,1,0,0],a=this.end||[1,0,0,1,0,0];f=[];for(var l=0;6>l;l++)f.push(this.pos*a[l]+(1-this.pos)*e[l])}else f=this.end;this.elem.attr(this.prop,f,null,!0)}})(A);(function(b){function y(d,c,b){if(!d.chart.is3d()||
-"colorAxis"===d.coll)return c;var g=d.chart,e=x*g.options.chart.options3d.alpha,f=x*g.options.chart.options3d.beta,h=a(b&&d.options.title.position3d,d.options.labels.position3d);b=a(b&&d.options.title.skew3d,d.options.labels.skew3d);var k=g.frame3d,n=g.plotLeft,t=g.plotWidth+n,r=g.plotTop,q=g.plotHeight+r,g=!1,v=0,w=0,u={x:0,y:1,z:0};c=d.swapZ({x:c.x,y:c.y,z:0});if(d.isZAxis)if(d.opposite){if(null===k.axes.z.top)return{};w=c.y-r;c.x=k.axes.z.top.x;c.y=k.axes.z.top.y;n=k.axes.z.top.xDir;g=!k.top.frontFacing}else{if(null===
-k.axes.z.bottom)return{};w=c.y-q;c.x=k.axes.z.bottom.x;c.y=k.axes.z.bottom.y;n=k.axes.z.bottom.xDir;g=!k.bottom.frontFacing}else if(d.horiz)if(d.opposite){if(null===k.axes.x.top)return{};w=c.y-r;c.y=k.axes.x.top.y;c.z=k.axes.x.top.z;n=k.axes.x.top.xDir;g=!k.top.frontFacing}else{if(null===k.axes.x.bottom)return{};w=c.y-q;c.y=k.axes.x.bottom.y;c.z=k.axes.x.bottom.z;n=k.axes.x.bottom.xDir;g=!k.bottom.frontFacing}else if(d.opposite){if(null===k.axes.y.right)return{};v=c.x-t;c.x=k.axes.y.right.x;c.z=k.axes.y.right.z;
-n=k.axes.y.right.xDir;n={x:n.z,y:n.y,z:-n.x}}else{if(null===k.axes.y.left)return{};v=c.x-n;c.x=k.axes.y.left.x;c.z=k.axes.y.left.z;n=k.axes.y.left.xDir}"chart"!==h&&("flap"===h?d.horiz?(f=Math.sin(e),e=Math.cos(e),d.opposite&&(f=-f),g&&(f=-f),u={x:n.z*f,y:e,z:-n.x*f}):n={x:Math.cos(f),y:0,z:Math.sin(f)}:"ortho"===h?d.horiz?(u=Math.cos(e),h=Math.sin(f)*u,e=-Math.sin(e),f=-u*Math.cos(f),u={x:n.y*f-n.z*e,y:n.z*h-n.x*f,z:n.x*e-n.y*h},e=1/Math.sqrt(u.x*u.x+u.y*u.y+u.z*u.z),g&&(e=-e),u={x:e*u.x,y:e*u.y,
-z:e*u.z}):n={x:Math.cos(f),y:0,z:Math.sin(f)}:d.horiz?u={x:Math.sin(f)*Math.sin(e),y:Math.cos(e),z:-Math.cos(f)*Math.sin(e)}:n={x:Math.cos(f),y:0,z:Math.sin(f)});c.x+=v*n.x+w*u.x;c.y+=v*n.y+w*u.y;c.z+=v*n.z+w*u.z;g=p([c],d.chart)[0];b&&(0>l(p([c,{x:c.x+n.x,y:c.y+n.y,z:c.z+n.z},{x:c.x+u.x,y:c.y+u.y,z:c.z+u.z}],d.chart))&&(n={x:-n.x,y:-n.y,z:-n.z}),d=p([{x:c.x,y:c.y,z:c.z},{x:c.x+n.x,y:c.y+n.y,z:c.z+n.z},{x:c.x+u.x,y:c.y+u.y,z:c.z+u.z}],d.chart),g.matrix=[d[1].x-d[0].x,d[1].y-d[0].y,d[2].x-d[0].x,d[2].y-
-d[0].y,g.x,g.y],g.matrix[4]-=g.x*g.matrix[0]+g.y*g.matrix[2],g.matrix[5]-=g.x*g.matrix[1]+g.y*g.matrix[3]);return g}var z,u=b.addEvent,q=b.Axis,v=b.Chart,x=b.deg2rad,f=b.extend,w=b.merge,p=b.perspective,e=b.perspective3D,a=b.pick,l=b.shapeArea,r=b.splat,k=b.Tick,t=b.wrap;w(!0,q.prototype.defaultOptions,{labels:{position3d:"offset",skew3d:!1},title:{position3d:null,skew3d:null}});u(q,"afterSetOptions",function(){var d;this.chart.is3d&&this.chart.is3d()&&"colorAxis"!==this.coll&&(d=this.options,d.tickWidth=
-a(d.tickWidth,0),d.gridLineWidth=a(d.gridLineWidth,1))});t(q.prototype,"getPlotLinePath",function(a){var c=a.apply(this,[].slice.call(arguments,1));if(!this.chart.is3d()||"colorAxis"===this.coll||null===c)return c;var d=this.chart,b=d.options.chart.options3d,b=this.isZAxis?d.plotWidth:b.depth,d=d.frame3d,c=[this.swapZ({x:c[1],y:c[2],z:0}),this.swapZ({x:c[1],y:c[2],z:b}),this.swapZ({x:c[4],y:c[5],z:0}),this.swapZ({x:c[4],y:c[5],z:b})],b=[];this.horiz?(this.isZAxis?(d.left.visible&&b.push(c[0],c[2]),
-d.right.visible&&b.push(c[1],c[3])):(d.front.visible&&b.push(c[0],c[2]),d.back.visible&&b.push(c[1],c[3])),d.top.visible&&b.push(c[0],c[1]),d.bottom.visible&&b.push(c[2],c[3])):(d.front.visible&&b.push(c[0],c[2]),d.back.visible&&b.push(c[1],c[3]),d.left.visible&&b.push(c[0],c[1]),d.right.visible&&b.push(c[2],c[3]));b=p(b,this.chart,!1);return this.chart.renderer.toLineSegments(b)});t(q.prototype,"getLinePath",function(a){return this.chart.is3d()&&"colorAxis"!==this.coll?[]:a.apply(this,[].slice.call(arguments,
-1))});t(q.prototype,"getPlotBandPath",function(a){if(!this.chart.is3d()||"colorAxis"===this.coll)return a.apply(this,[].slice.call(arguments,1));var d=arguments,b=d[2],e=[],d=this.getPlotLinePath(d[1]),b=this.getPlotLinePath(b);if(d&&b)for(var f=0;f<d.length;f+=6)e.push("M",d[f+1],d[f+2],"L",d[f+4],d[f+5],"L",b[f+4],b[f+5],"L",b[f+1],b[f+2],"Z");return e});t(k.prototype,"getMarkPath",function(a){var d=a.apply(this,[].slice.call(arguments,1)),d=[y(this.axis,{x:d[1],y:d[2],z:0}),y(this.axis,{x:d[4],
-y:d[5],z:0})];return this.axis.chart.renderer.toLineSegments(d)});u(k,"afterGetLabelPosition",function(a){f(a.pos,y(this.axis,a.pos))});t(q.prototype,"getTitlePosition",function(a){var d=a.apply(this,[].slice.call(arguments,1));return y(this,d,!0)});u(q,"drawCrosshair",function(a){this.chart.is3d()&&"colorAxis"!==this.coll&&a.point&&(a.point.crosshairPos=this.isXAxis?a.point.axisXpos:this.len-a.point.axisYpos)});u(q,"destroy",function(){["backFrame","bottomFrame","sideFrame"].forEach(function(a){this[a]&&
-(this[a]=this[a].destroy())},this)});q.prototype.swapZ=function(a,c){return this.isZAxis?(c=c?0:this.chart.plotLeft,{x:c+a.z,y:a.y,z:a.x-c}):a};z=b.ZAxis=function(){this.init.apply(this,arguments)};f(z.prototype,q.prototype);f(z.prototype,{isZAxis:!0,setOptions:function(a){a=w({offset:0,lineWidth:0},a);q.prototype.setOptions.call(this,a);this.coll="zAxis"},setAxisSize:function(){q.prototype.setAxisSize.call(this);this.width=this.len=this.chart.options.chart.options3d.depth;this.right=this.chart.chartWidth-
-this.width-this.left},getSeriesExtremes:function(){var d=this,c=d.chart;d.hasVisibleSeries=!1;d.dataMin=d.dataMax=d.ignoreMinPadding=d.ignoreMaxPadding=null;d.buildStacks&&d.buildStacks();d.series.forEach(function(b){if(b.visible||!c.options.chart.ignoreHiddenSeries)d.hasVisibleSeries=!0,b=b.zData,b.length&&(d.dataMin=Math.min(a(d.dataMin,b[0]),Math.min.apply(null,b)),d.dataMax=Math.max(a(d.dataMax,b[0]),Math.max.apply(null,b)))})}});u(v,"afterGetAxes",function(){var a=this,c=this.options,c=c.zAxis=
-r(c.zAxis||{});a.is3d()&&(this.zAxis=[],c.forEach(function(d,c){d.index=c;d.isX=!0;(new z(a,d)).setScale()}))});t(q.prototype,"getSlotWidth",function(d,c){if(this.chart.is3d()&&c&&c.label&&this.categories&&this.chart.frameShapes){var b=this.chart,g=this.ticks,f=this.gridGroup.element.childNodes[0].getBBox(),k=b.frameShapes.left.getBBox(),h=b.options.chart.options3d,b={x:b.plotWidth/2,y:b.plotHeight/2,z:h.depth/2,vd:a(h.depth,1)*a(h.viewDistance,0)},l,p,h=c.pos,r=g[h-1],g=g[h+1];0!==h&&r&&r.label.xy&&
-(l=e({x:r.label.xy.x,y:r.label.xy.y,z:null},b,b.vd));g&&g.label.xy&&(p=e({x:g.label.xy.x,y:g.label.xy.y,z:null},b,b.vd));g={x:c.label.xy.x,y:c.label.xy.y,z:null};g=e(g,b,b.vd);return Math.abs(l?g.x-l.x:p?p.x-g.x:f.x-k.x)}return d.apply(this,[].slice.call(arguments,1))})})(A);(function(b){var y=b.addEvent,z=b.perspective,u=b.pick;y(b.Series,"afterTranslate",function(){this.chart.is3d()&&this.translate3dPoints()});b.Series.prototype.translate3dPoints=function(){var b=this.chart,v=u(this.zAxis,b.options.zAxis[0]),
-x=[],f,w,p;for(p=0;p<this.data.length;p++)f=this.data[p],v&&v.translate?(w=v.isLog&&v.val2lin?v.val2lin(f.z):f.z,f.plotZ=v.translate(w),f.isInside=f.isInside?w>=v.min&&w<=v.max:!1):f.plotZ=0,f.axisXpos=f.plotX,f.axisYpos=f.plotY,f.axisZpos=f.plotZ,x.push({x:f.plotX,y:f.plotY,z:f.plotZ});b=z(x,b,!0);for(p=0;p<this.data.length;p++)f=this.data[p],v=b[p],f.plotX=v.x,f.plotY=v.y,f.plotZ=v.z}})(A);(function(b){function y(b){var e=b.apply(this,[].slice.call(arguments,1));this.chart.is3d&&this.chart.is3d()&&
-(e.stroke=this.options.edgeColor||e.fill,e["stroke-width"]=q(this.options.edgeWidth,1));return e}var z=b.addEvent,u=b.perspective,q=b.pick,v=b.Series,x=b.seriesTypes,f=b.svg,w=b.wrap;w(x.column.prototype,"translate",function(b){b.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&this.translate3dShapes()});w(b.Series.prototype,"alignDataLabel",function(b){arguments[3].outside3dPlot=arguments[1].outside3dPlot;b.apply(this,[].slice.call(arguments,1))});w(b.Series.prototype,"justifyDataLabel",
-function(b){return arguments[2].outside3dPlot?!1:b.apply(this,[].slice.call(arguments,1))});x.column.prototype.translate3dPoints=function(){};x.column.prototype.translate3dShapes=function(){var b=this,e=b.chart,a=b.options,f=a.depth||25,r=(a.stacking?a.stack||0:b.index)*(f+(a.groupZPadding||1)),k=b.borderWidth%2?.5:0;e.inverted&&!b.yAxis.reversed&&(k*=-1);!1!==a.grouping&&(r=0);r+=a.groupZPadding||1;b.data.forEach(function(a){a.outside3dPlot=null;if(null!==a.y){var d=a.shapeArgs,c=a.tooltipPos,l;
-[["x","width"],["y","height"]].forEach(function(c){l=d[c[0]]-k;0>l&&(d[c[1]]+=d[c[0]]+k,d[c[0]]=-k,l=0);l+d[c[1]]>b[c[0]+"Axis"].len&&0!==d[c[1]]&&(d[c[1]]=b[c[0]+"Axis"].len-d[c[0]]);if(0!==d[c[1]]&&(d[c[0]]>=b[c[0]+"Axis"].len||d[c[0]]+d[c[1]]<=k)){for(var e in d)d[e]=0;a.outside3dPlot=!0}});"rect"===a.shapeType&&(a.shapeType="cuboid");d.z=r;d.depth=f;d.insidePlotArea=!0;c=u([{x:c[0],y:c[1],z:r}],e,!0)[0];a.tooltipPos=[c.x,c.y]}});b.z=r};w(x.column.prototype,"animate",function(b){if(this.chart.is3d()){var e=
-arguments[1],a=this.yAxis,l=this,p=this.yAxis.reversed;f&&(e?l.data.forEach(function(b){null!==b.y&&(b.height=b.shapeArgs.height,b.shapey=b.shapeArgs.y,b.shapeArgs.height=1,p||(b.shapeArgs.y=b.stackY?b.plotY+a.translate(b.stackY):b.plotY+(b.negative?-b.height:b.height)))}):(l.data.forEach(function(a){null!==a.y&&(a.shapeArgs.height=a.height,a.shapeArgs.y=a.shapey,a.graphic&&a.graphic.animate(a.shapeArgs,l.options.animation))}),this.drawDataLabels(),l.animate=null))}else b.apply(this,[].slice.call(arguments,
-1))});w(x.column.prototype,"plotGroup",function(b,e,a,f,r,k){this.chart.is3d()&&k&&!this[e]&&(this.chart.columnGroup||(this.chart.columnGroup=this.chart.renderer.g("columnGroup").add(k)),this[e]=this.chart.columnGroup,this.chart.columnGroup.attr(this.getPlotBox()),this[e].survive=!0);return b.apply(this,Array.prototype.slice.call(arguments,1))});w(x.column.prototype,"setVisible",function(b,e){var a=this,f;a.chart.is3d()&&a.data.forEach(function(b){f=(b.visible=b.options.visible=e=void 0===e?!b.visible:
-e)?"visible":"hidden";a.options.data[a.data.indexOf(b)]=b.options;b.graphic&&b.graphic.attr({visibility:f})});b.apply(this,Array.prototype.slice.call(arguments,1))});x.column.prototype.handle3dGrouping=!0;z(v,"afterInit",function(){if(this.chart.is3d()&&this.handle3dGrouping){var b=this.options,e=b.grouping,a=b.stacking,f=q(this.yAxis.options.reversedStacks,!0),r=0;if(void 0===e||e){e=this.chart.retrieveStacks(a);r=b.stack||0;for(a=0;a<e[r].series.length&&e[r].series[a]!==this;a++);r=10*(e.totalStacks-
-e[r].position)+(f?a:-a);this.xAxis.reversed||(r=10*e.totalStacks-r)}b.zIndex=r}});w(x.column.prototype,"pointAttribs",y);x.columnrange&&(w(x.columnrange.prototype,"pointAttribs",y),x.columnrange.prototype.plotGroup=x.column.prototype.plotGroup,x.columnrange.prototype.setVisible=x.column.prototype.setVisible);w(v.prototype,"alignDataLabel",function(b){if(this.chart.is3d()&&this instanceof x.column){var e=arguments,a=e[4],e=e[1],f={x:a.x,y:a.y,z:this.z},f=u([f],this.chart,!0)[0];a.x=f.x;a.y=e.outside3dPlot?
--9E9:f.y}b.apply(this,[].slice.call(arguments,1))});w(b.StackItem.prototype,"getStackBox",function(f,e){var a=f.apply(this,[].slice.call(arguments,1));if(e.is3d()){var l={x:a.x,y:a.y,z:0},l=b.perspective([l],e,!0)[0];a.x=l.x;a.y=l.y}return a})})(A);(function(b){var y=b.deg2rad,z=b.pick,u=b.seriesTypes,q=b.svg;b=b.wrap;b(u.pie.prototype,"translate",function(b){b.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var q=this,f=q.options,v=f.depth||0,p=q.chart.options.chart.options3d,e=p.alpha,
-a=p.beta,l=f.stacking?(f.stack||0)*v:q._i*v,l=l+v/2;!1!==f.grouping&&(l=0);q.data.forEach(function(b){var k=b.shapeArgs;b.shapeType="arc3d";k.z=l;k.depth=.75*v;k.alpha=e;k.beta=a;k.center=q.center;k=(k.end+k.start)/2;b.slicedTranslation={translateX:Math.round(Math.cos(k)*f.slicedOffset*Math.cos(e*y)),translateY:Math.round(Math.sin(k)*f.slicedOffset*Math.cos(e*y))}})}});b(u.pie.prototype.pointClass.prototype,"haloPath",function(b){var q=arguments;return this.series.chart.is3d()?[]:b.call(this,q[1])});
-b(u.pie.prototype,"pointAttribs",function(b,q,f){b=b.call(this,q,f);f=this.options;this.chart.is3d()&&!this.chart.styledMode&&(b.stroke=f.edgeColor||q.color||this.color,b["stroke-width"]=z(f.edgeWidth,1));return b});b(u.pie.prototype,"drawDataLabels",function(b){if(this.chart.is3d()){var q=this.chart.options.chart.options3d;this.data.forEach(function(b){var f=b.shapeArgs,p=f.r,e=(f.start+f.end)/2;b=b.labelPosition;var a=b.connectorPosition,l=-p*(1-Math.cos((f.alpha||q.alpha)*y))*Math.sin(e),r=p*(Math.cos((f.beta||
-q.beta)*y)-1)*Math.cos(e);[b.natural,a.breakAt,a.touchingSliceAt].forEach(function(a){a.x+=r;a.y+=l})})}b.apply(this,[].slice.call(arguments,1))});b(u.pie.prototype,"addPoint",function(b){b.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&this.update(this.userOptions,!0)});b(u.pie.prototype,"animate",function(b){if(this.chart.is3d()){var u=arguments[1],f=this.options.animation,v=this.center,p=this.group,e=this.markerGroup;q&&(!0===f&&(f={}),u?(p.oldtranslateX=p.translateX,p.oldtranslateY=
-p.translateY,u={translateX:v[0],translateY:v[1],scaleX:.001,scaleY:.001},p.attr(u),e&&(e.attrSetters=p.attrSetters,e.attr(u))):(u={translateX:p.oldtranslateX,translateY:p.oldtranslateY,scaleX:1,scaleY:1},p.animate(u,f),e&&e.animate(u,f),this.animate=null))}else b.apply(this,[].slice.call(arguments,1))})})(A);(function(b){var y=b.Point,z=b.seriesType,u=b.seriesTypes;z("scatter3d","scatter",{tooltip:{pointFormat:"x: \x3cb\x3e{point.x}\x3c/b\x3e\x3cbr/\x3ey: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3ez: \x3cb\x3e{point.z}\x3c/b\x3e\x3cbr/\x3e"}},
-{pointAttribs:function(q){var v=u.scatter.prototype.pointAttribs.apply(this,arguments);this.chart.is3d()&&q&&(v.zIndex=b.pointCameraDistance(q,this.chart));return v},axisTypes:["xAxis","yAxis","zAxis"],pointArrayMap:["x","y","z"],parallelArrays:["x","y","z"],directTouch:!0},{applyOptions:function(){y.prototype.applyOptions.apply(this,arguments);void 0===this.z&&(this.z=0);return this}})})(A);(function(b){var y=b.addEvent,z=b.Axis,u=b.SVGRenderer,q=b.VMLRenderer;q&&(b.setOptions({animate:!1}),q.prototype.face3d=
-u.prototype.face3d,q.prototype.polyhedron=u.prototype.polyhedron,q.prototype.elements3d=u.prototype.elements3d,q.prototype.element3d=u.prototype.element3d,q.prototype.cuboid=u.prototype.cuboid,q.prototype.cuboidPath=u.prototype.cuboidPath,q.prototype.toLinePath=u.prototype.toLinePath,q.prototype.toLineSegments=u.prototype.toLineSegments,q.prototype.arc3d=function(b){b=u.prototype.arc3d.call(this,b);b.css({zIndex:b.zIndex});return b},b.VMLRenderer.prototype.arc3dPath=b.SVGRenderer.prototype.arc3dPath,
-y(z,"render",function(){this.sideFrame&&(this.sideFrame.css({zIndex:0}),this.sideFrame.front.attr({fill:this.sideFrame.color}));this.bottomFrame&&(this.bottomFrame.css({zIndex:1}),this.bottomFrame.front.attr({fill:this.bottomFrame.color}));this.backFrame&&(this.backFrame.css({zIndex:0}),this.backFrame.front.attr({fill:this.backFrame.color}))}))})(A)});
-//# sourceMappingURL=highcharts-3d.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
-
- (c) 2009-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(y){"object"===typeof module&&module.exports?module.exports=y:"function"===typeof define&&define.amd?define(function(){return y}):y("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(y){(function(a){function v(a,d){this.init(a,d)}var w=a.CenteredSeriesMixin,e=a.extend,m=a.merge,u=a.splat;e(v.prototype,{coll:"pane",init:function(a,d){this.chart=d;this.background=[];d.pane.push(this);this.setOptions(a)},setOptions:function(a){this.options=m(this.defaultOptions,this.chart.angular?
-{background:{}}:void 0,a)},render:function(){var a=this.options,d=this.options.background,c=this.chart.renderer;this.group||(this.group=c.g("pane-group").attr({zIndex:a.zIndex||0}).add());this.updateCenter();if(d)for(d=u(d),a=Math.max(d.length,this.background.length||0),c=0;c<a;c++)d[c]&&this.axis?this.renderBackground(m(this.defaultBackgroundOptions,d[c]),c):this.background[c]&&(this.background[c]=this.background[c].destroy(),this.background.splice(c,1))},renderBackground:function(a,d){var c="animate",
-n={"class":"highcharts-pane "+(a.className||"")};this.chart.styledMode||e(n,{fill:a.backgroundColor,stroke:a.borderColor,"stroke-width":a.borderWidth});this.background[d]||(this.background[d]=this.chart.renderer.path().add(this.group),c="attr");this.background[d][c]({d:this.axis.getPlotBandPath(a.from,a.to,a)}).attr(n)},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{shape:"circle",borderWidth:1,borderColor:"#cccccc",backgroundColor:{linearGradient:{x1:0,y1:0,
-x2:0,y2:1},stops:[[0,"#ffffff"],[1,"#e6e6e6"]]},from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"},updateCenter:function(a){this.center=(a||this.axis||{}).center=w.getCenter.call(this)},update:function(a,d){m(!0,this.options,a);this.setOptions(this.options);this.render();this.chart.axes.forEach(function(c){c.pane===this&&(c.pane=null,c.update({},d))},this)}});a.Pane=v})(y);(function(a){var v=a.addEvent,w=a.Axis,e=a.extend,m=a.merge,u=a.noop,q=a.pick,d=a.pInt,c=a.Tick,n=a.wrap,
-b=a.correctFloat,l,k,h=w.prototype,f=c.prototype;a.radialAxisExtended||(a.radialAxisExtended=!0,l={getOffset:u,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:u,setCategories:u,setTitle:u},k={defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2},defaultRadialXOptions:{gridLineWidth:1,
-labels:{align:null,distance:15,x:0,y:null,style:{textOverflow:"none"}},maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(b){b=this.options=m(this.defaultOptions,this.defaultRadialOptions,b);b.plotBands||(b.plotBands=[]);a.fireEvent(this,"afterSetOptions")},getOffset:function(){h.getOffset.call(this);this.chart.axisOffset[this.side]=0},
-getLinePath:function(b,c){b=this.center;var g=this.chart,p=q(c,b[2]/2-this.offset);this.isCircular||void 0!==c?(c=this.chart.renderer.symbols.arc(this.left+b[0],this.top+b[1],p,p,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0}),c.xBounds=[this.left+b[0]],c.yBounds=[this.top+b[1]-p]):(c=this.postTranslate(this.angleRad,p),c=["M",b[0]+g.plotLeft,b[1]+g.plotTop,"L",c.x,c.y]);return c},setAxisTranslation:function(){h.setAxisTranslation.call(this);this.center&&(this.transA=this.isCircular?
-(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0)},beforeSetTickPositions:function(){if(this.autoConnect=this.isCircular&&void 0===q(this.userMax,this.options.max)&&b(this.endAngleRad-this.startAngleRad)===b(2*Math.PI))this.max+=this.categories&&1||this.pointRange||this.closestPointRange||0},setAxisSize:function(){h.setAxisSize.call(this);this.isRadial&&(this.pane.updateCenter(this),
-this.isCircular&&(this.sector=this.endAngleRad-this.startAngleRad),this.len=this.width=this.height=this.center[2]*q(this.sector,1)/2)},getPosition:function(b,c){return this.postTranslate(this.isCircular?this.translate(b):this.angleRad,q(this.isCircular?c:this.translate(b),this.center[2]/2)-this.offset)},postTranslate:function(b,c){var g=this.chart,p=this.center;b=this.startAngleRad+b;return{x:g.plotLeft+p[0]+Math.cos(b)*c,y:g.plotTop+p[1]+Math.sin(b)*c}},getPlotBandPath:function(b,c,g){var p=this.center,
-n=this.startAngleRad,l=p[2]/2,a=[q(g.outerRadius,"100%"),g.innerRadius,q(g.thickness,10)],t=Math.min(this.offset,0),h=/%$/,k,f=this.isCircular;"polygon"===this.options.gridLineInterpolation?p=this.getPlotLinePath(b).concat(this.getPlotLinePath(c,!0)):(b=Math.max(b,this.min),c=Math.min(c,this.max),f||(a[0]=this.translate(b),a[1]=this.translate(c)),a=a.map(function(g){h.test(g)&&(g=d(g,10)*l/100);return g}),"circle"!==g.shape&&f?(b=n+this.translate(b),c=n+this.translate(c)):(b=-Math.PI/2,c=1.5*Math.PI,
-k=!0),a[0]-=t,a[2]-=t,p=this.chart.renderer.symbols.arc(this.left+p[0],this.top+p[1],a[0],a[0],{start:Math.min(b,c),end:Math.max(b,c),innerR:q(a[1],a[0]-a[2]),open:k}));return p},getPlotLinePath:function(b,c){var g=this,p=g.center,n=g.chart,d=g.getPosition(b),a,l,t;g.isCircular?t=["M",p[0]+n.plotLeft,p[1]+n.plotTop,"L",d.x,d.y]:"circle"===g.options.gridLineInterpolation?(b=g.translate(b),t=g.getLinePath(0,b)):(n.xAxis.forEach(function(b){b.pane===g.pane&&(a=b)}),t=[],b=g.translate(b),p=a.tickPositions,
-a.autoConnect&&(p=p.concat([p[0]])),c&&(p=[].concat(p).reverse()),p.forEach(function(g,c){l=a.getPosition(g,b);t.push(c?"L":"M",l.x,l.y)}));return t},getTitlePosition:function(){var b=this.center,c=this.chart,g=this.options.title;return{x:c.plotLeft+b[0]+(g.x||0),y:c.plotTop+b[1]-{high:.5,middle:.25,low:0}[g.align]*b[2]+(g.y||0)}}},v(w,"init",function(b){var c=this.chart,g=c.angular,p=c.polar,n=this.isXAxis,d=g&&n,a,h=c.options;b=b.userOptions.pane||0;b=this.pane=c.pane&&c.pane[b];if(g){if(e(this,
-d?l:k),a=!n)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else p&&(e(this,k),this.defaultRadialOptions=(a=n)?this.defaultRadialXOptions:m(this.defaultYAxisOptions,this.defaultRadialYOptions));g||p?(this.isRadial=!0,c.inverted=!1,h.chart.zoomType=null):this.isRadial=!1;b&&a&&(b.axis=this);this.isCircular=a}),v(w,"afterInit",function(){var b=this.chart,c=this.options,g=this.pane,p=g&&g.options;b.angular&&this.isXAxis||!g||!b.angular&&!b.polar||(this.angleRad=(c.angle||0)*Math.PI/180,this.startAngleRad=
-(p.startAngle-90)*Math.PI/180,this.endAngleRad=(q(p.endAngle,p.startAngle+360)-90)*Math.PI/180,this.offset=c.offset||0)}),n(h,"autoLabelAlign",function(b){if(!this.isRadial)return b.apply(this,[].slice.call(arguments,1))}),v(c,"afterGetPosition",function(b){this.axis.getPosition&&e(b.pos,this.axis.getPosition(this.pos))}),v(c,"afterGetLabelPosition",function(b){var c=this.axis,g=this.label,p=c.options.labels,n=p.y,d,a=20,l=p.align,h=(c.translate(this.pos)+c.startAngleRad+Math.PI/2)/Math.PI*180%360;
-c.isRadial&&(d=c.getPosition(this.pos,c.center[2]/2+q(p.distance,-25)),"auto"===p.rotation?g.attr({rotation:h}):null===n&&(n=c.chart.renderer.fontMetrics(g.styles&&g.styles.fontSize).b-g.getBBox().height/2),null===l&&(c.isCircular?(this.label.getBBox().width>c.len*c.tickInterval/(c.max-c.min)&&(a=0),l=h>a&&h<180-a?"left":h>180+a&&h<360-a?"right":"center"):l="center",g.attr({align:l})),b.pos.x=d.x+p.x,b.pos.y=d.y+n)}),n(f,"getMarkPath",function(b,c,g,p,n,d,a){var l=this.axis;l.isRadial?(b=l.getPosition(this.pos,
-l.center[2]/2+p),c=["M",c,g,"L",b.x,b.y]):c=b.call(this,c,g,p,n,d,a);return c}))})(y);(function(a){var v=a.pick,w=a.extend,e=a.isArray,m=a.defined,u=a.seriesType,q=a.seriesTypes,d=a.Series.prototype,c=a.Point.prototype;u("arearange","area",{lineWidth:1,threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{series.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},trackByArea:!0,dataLabels:{align:null,verticalAlign:null,
-xLow:0,xHigh:0,yLow:0,yHigh:0}},{pointArrayMap:["low","high"],toYData:function(c){return[c.low,c.high]},pointValKey:"low",deferTranslatePolar:!0,highToXY:function(c){var b=this.chart,n=this.xAxis.postTranslate(c.rectPlotX,this.yAxis.len-c.plotHigh);c.plotHighX=n.x-b.plotLeft;c.plotHigh=n.y-b.plotTop;c.plotLowX=c.plotX},translate:function(){var c=this,b=c.yAxis,d=!!c.modifyValue;q.area.prototype.translate.apply(c);c.points.forEach(function(a){var n=a.low,l=a.high,k=a.plotY;null===l||null===n?(a.isNull=
-!0,a.plotY=null):(a.plotLow=k,a.plotHigh=b.translate(d?c.modifyValue(l,a):l,0,1,0,1),d&&(a.yBottom=a.plotHigh))});this.chart.polar&&this.points.forEach(function(b){c.highToXY(b);b.tooltipPos=[(b.plotHighX+b.plotLowX)/2,(b.plotHigh+b.plotLow)/2]})},getGraphPath:function(c){var b=[],a=[],d,n=q.area.prototype.getGraphPath,f,r,t;t=this.options;var g=this.chart.polar&&!1!==t.connectEnds,p=t.connectNulls,x=t.step;c=c||this.points;for(d=c.length;d--;)f=c[d],f.isNull||g||p||c[d+1]&&!c[d+1].isNull||a.push({plotX:f.plotX,
-plotY:f.plotY,doCurve:!1}),r={polarPlotY:f.polarPlotY,rectPlotX:f.rectPlotX,yBottom:f.yBottom,plotX:v(f.plotHighX,f.plotX),plotY:f.plotHigh,isNull:f.isNull},a.push(r),b.push(r),f.isNull||g||p||c[d-1]&&!c[d-1].isNull||a.push({plotX:f.plotX,plotY:f.plotY,doCurve:!1});c=n.call(this,c);x&&(!0===x&&(x="left"),t.step={left:"right",center:"center",right:"left"}[x]);b=n.call(this,b);a=n.call(this,a);t.step=x;t=[].concat(c,b);this.chart.polar||"M"!==a[0]||(a[0]="L");this.graphPath=t;this.areaPath=c.concat(a);
-t.isArea=!0;t.xMap=c.xMap;this.areaPath.xMap=c.xMap;return t},drawDataLabels:function(){var c=this.points,b=c.length,a,k=[],h=this.options.dataLabels,f,r,t=this.chart.inverted,g,p;e(h)?1<h.length?(g=h[0],p=h[1]):(g=h[0],p={enabled:!1}):(g=w({},h),g.x=h.xHigh,g.y=h.yHigh,p=w({},h),p.x=h.xLow,p.y=h.yLow);if(g.enabled||this._hasPointLabels){for(a=b;a--;)if(f=c[a])r=g.inside?f.plotHigh<f.plotLow:f.plotHigh>f.plotLow,f.y=f.high,f._plotY=f.plotY,f.plotY=f.plotHigh,k[a]=f.dataLabel,f.dataLabel=f.dataLabelUpper,
-f.below=r,t?g.align||(g.align=r?"right":"left"):g.verticalAlign||(g.verticalAlign=r?"top":"bottom");this.options.dataLabels=g;d.drawDataLabels&&d.drawDataLabels.apply(this,arguments);for(a=b;a--;)if(f=c[a])f.dataLabelUpper=f.dataLabel,f.dataLabel=k[a],delete f.dataLabels,f.y=f.low,f.plotY=f._plotY}if(p.enabled||this._hasPointLabels){for(a=b;a--;)if(f=c[a])r=p.inside?f.plotHigh<f.plotLow:f.plotHigh>f.plotLow,f.below=!r,t?p.align||(p.align=r?"left":"right"):p.verticalAlign||(p.verticalAlign=r?"bottom":
-"top");this.options.dataLabels=p;d.drawDataLabels&&d.drawDataLabels.apply(this,arguments)}if(g.enabled)for(a=b;a--;)if(f=c[a])f.dataLabels=[f.dataLabel,f.dataLabelUpper].filter(function(b){return!!b});this.options.dataLabels=h},alignDataLabel:function(){q.column.prototype.alignDataLabel.apply(this,arguments)},drawPoints:function(){var c=this.points.length,b,l;d.drawPoints.apply(this,arguments);for(l=0;l<c;)b=this.points[l],b.origProps={plotY:b.plotY,plotX:b.plotX,isInside:b.isInside,negative:b.negative,
-zone:b.zone,y:b.y},b.lowerGraphic=b.graphic,b.graphic=b.upperGraphic,b.plotY=b.plotHigh,m(b.plotHighX)&&(b.plotX=b.plotHighX),b.y=b.high,b.negative=b.high<(this.options.threshold||0),b.zone=this.zones.length&&b.getZone(),this.chart.polar||(b.isInside=b.isTopInside=void 0!==b.plotY&&0<=b.plotY&&b.plotY<=this.yAxis.len&&0<=b.plotX&&b.plotX<=this.xAxis.len),l++;d.drawPoints.apply(this,arguments);for(l=0;l<c;)b=this.points[l],b.upperGraphic=b.graphic,b.graphic=b.lowerGraphic,a.extend(b,b.origProps),delete b.origProps,
-l++},setStackedPoints:a.noop},{setState:function(){var a=this.state,b=this.series,d=b.chart.polar;m(this.plotHigh)||(this.plotHigh=b.yAxis.toPixels(this.high,!0));m(this.plotLow)||(this.plotLow=this.plotY=b.yAxis.toPixels(this.low,!0));b.stateMarkerGraphic&&(b.lowerStateMarkerGraphic=b.stateMarkerGraphic,b.stateMarkerGraphic=b.upperStateMarkerGraphic);this.graphic=this.upperGraphic;this.plotY=this.plotHigh;d&&(this.plotX=this.plotHighX);c.setState.apply(this,arguments);this.state=a;this.plotY=this.plotLow;
-this.graphic=this.lowerGraphic;d&&(this.plotX=this.plotLowX);b.stateMarkerGraphic&&(b.upperStateMarkerGraphic=b.stateMarkerGraphic,b.stateMarkerGraphic=b.lowerStateMarkerGraphic,b.lowerStateMarkerGraphic=void 0);c.setState.apply(this,arguments)},haloPath:function(){var a=this.series.chart.polar,b=[];this.plotY=this.plotLow;a&&(this.plotX=this.plotLowX);this.isInside&&(b=c.haloPath.apply(this,arguments));this.plotY=this.plotHigh;a&&(this.plotX=this.plotHighX);this.isTopInside&&(b=b.concat(c.haloPath.apply(this,
-arguments)));return b},destroyElements:function(){["lowerGraphic","upperGraphic"].forEach(function(c){this[c]&&(this[c]=this[c].destroy())},this);this.graphic=null;return c.destroyElements.apply(this,arguments)}})})(y);(function(a){var v=a.seriesType;v("areasplinerange","arearange",null,{getPointSpline:a.seriesTypes.spline.prototype.getPointSpline})})(y);(function(a){var v=a.defaultPlotOptions,w=a.merge,e=a.noop,m=a.pick,u=a.seriesType,q=a.seriesTypes.column.prototype;u("columnrange","arearange",
-w(v.column,v.arearange,{pointRange:null,marker:null,states:{hover:{halo:!1}}}),{translate:function(){var a=this,c=a.yAxis,n=a.xAxis,b=n.startAngleRad,l,k=a.chart,h=a.xAxis.isRadial,f=Math.max(k.chartWidth,k.chartHeight)+999,r;q.translate.apply(a);a.points.forEach(function(d){var g=d.shapeArgs,p=a.options.minPointLength,x,t;d.plotHigh=r=Math.min(Math.max(-f,c.translate(d.high,0,1,0,1)),f);d.plotLow=Math.min(Math.max(-f,d.plotY),f);t=r;x=m(d.rectPlotY,d.plotY)-r;Math.abs(x)<p?(p-=x,x+=p,t-=p/2):0>x&&
-(x*=-1,t-=x);h?(l=d.barX+b,d.shapeType="path",d.shapeArgs={d:a.polarArc(t+x,t,l,l+d.pointWidth)}):(g.height=x,g.y=t,d.tooltipPos=k.inverted?[c.len+c.pos-k.plotLeft-t-x/2,n.len+n.pos-k.plotTop-g.x-g.width/2,x]:[n.left-k.plotLeft+g.x+g.width/2,c.pos-k.plotTop+t+x/2,x])})},directTouch:!0,trackerGroups:["group","dataLabelsGroup"],drawGraph:e,getSymbol:e,crispCol:function(){return q.crispCol.apply(this,arguments)},drawPoints:function(){return q.drawPoints.apply(this,arguments)},drawTracker:function(){return q.drawTracker.apply(this,
-arguments)},getColumnMetrics:function(){return q.getColumnMetrics.apply(this,arguments)},pointAttribs:function(){return q.pointAttribs.apply(this,arguments)},animate:function(){return q.animate.apply(this,arguments)},polarArc:function(){return q.polarArc.apply(this,arguments)},translate3dPoints:function(){return q.translate3dPoints.apply(this,arguments)},translate3dShapes:function(){return q.translate3dShapes.apply(this,arguments)}},{setState:q.pointClass.prototype.setState})})(y);(function(a){var v=
-a.pick,w=a.seriesType,e=a.seriesTypes.column.prototype;w("columnpyramid","column",{},{translate:function(){var a=this,u=a.chart,q=a.options,d=a.dense=2>a.closestPointRange*a.xAxis.transA,d=a.borderWidth=v(q.borderWidth,d?0:1),c=a.yAxis,n=q.threshold,b=a.translatedThreshold=c.getThreshold(n),l=v(q.minPointLength,5),k=a.getColumnMetrics(),h=k.width,f=a.barW=Math.max(h,1+2*d),r=a.pointXOffset=k.offset;u.inverted&&(b-=.5);q.pointPadding&&(f=Math.ceil(f));e.translate.apply(a);a.points.forEach(function(d){var g=
-v(d.yBottom,b),p=999+Math.abs(g),k=Math.min(Math.max(-p,d.plotY),c.len+p),p=d.plotX+r,t=f/2,e=Math.min(k,g),g=Math.max(k,g)-e,m,z,A,w,C,D;d.barX=p;d.pointWidth=h;d.tooltipPos=u.inverted?[c.len+c.pos-u.plotLeft-k,a.xAxis.len-p-t,g]:[p+t,k+c.pos-u.plotTop,g];k=n+(d.total||d.y);"percent"===q.stacking&&(k=n+(0>d.y)?-100:100);k=c.toPixels(k,!0);m=u.plotHeight-k-(u.plotHeight-b);z=t*(e-k)/m;A=t*(e+g-k)/m;m=p-z+t;z=p+z+t;w=p+A+t;A=p-A+t;C=e-l;D=e+g;0>d.y&&(C=e,D=e+g+l);u.inverted&&(w=u.plotWidth-e,m=k-(u.plotWidth-
-b),z=t*(k-w)/m,A=t*(k-(w-g))/m,m=p+t+z,z=m-2*z,w=p-A+t,A=p+A+t,C=e,D=e+g-l,0>d.y&&(D=e+g+l));d.shapeType="path";d.shapeArgs={x:m,y:C,width:z-m,height:g,d:["M",m,C,"L",z,C,w,D,A,D,"Z"]}})}})})(y);(function(a){var v=a.isNumber,w=a.merge,e=a.pick,m=a.pInt,u=a.Series,q=a.seriesType,d=a.TrackerMixin;q("gauge","line",{dataLabels:{enabled:!0,defer:!1,y:15,borderRadius:3,crop:!1,verticalAlign:"top",zIndex:2,borderWidth:1,borderColor:"#cccccc"},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1},{angular:!0,
-directTouch:!0,drawGraph:a.noop,fixedBox:!0,forceDL:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],translate:function(){var c=this.yAxis,a=this.options,b=c.center;this.generatePoints();this.points.forEach(function(d){var n=w(a.dial,d.dial),h=m(e(n.radius,80))*b[2]/200,f=m(e(n.baseLength,70))*h/100,l=m(e(n.rearLength,10))*h/100,t=n.baseWidth||3,g=n.topWidth||1,p=a.overshoot,x=c.startAngleRad+c.translate(d.y,null,null,null,!0);v(p)?(p=p/180*Math.PI,x=Math.max(c.startAngleRad-p,Math.min(c.endAngleRad+
-p,x))):!1===a.wrap&&(x=Math.max(c.startAngleRad,Math.min(c.endAngleRad,x)));x=180*x/Math.PI;d.shapeType="path";d.shapeArgs={d:n.path||["M",-l,-t/2,"L",f,-t/2,h,-g/2,h,g/2,f,t/2,-l,t/2,"z"],translateX:b[0],translateY:b[1],rotation:x};d.plotX=b[0];d.plotY=b[1]})},drawPoints:function(){var c=this,a=c.chart,b=c.yAxis.center,d=c.pivot,k=c.options,h=k.pivot,f=a.renderer;c.points.forEach(function(b){var d=b.graphic,g=b.shapeArgs,p=g.d,n=w(k.dial,b.dial);d?(d.animate(g),g.d=p):(b.graphic=f[b.shapeType](g).attr({rotation:g.rotation,
-zIndex:1}).addClass("highcharts-dial").add(c.group),a.styledMode||b.graphic.attr({stroke:n.borderColor||"none","stroke-width":n.borderWidth||0,fill:n.backgroundColor||"#000000"}))});d?d.animate({translateX:b[0],translateY:b[1]}):(c.pivot=f.circle(0,0,e(h.radius,5)).attr({zIndex:2}).addClass("highcharts-pivot").translate(b[0],b[1]).add(c.group),a.styledMode||c.pivot.attr({"stroke-width":h.borderWidth||0,stroke:h.borderColor||"#cccccc",fill:h.backgroundColor||"#000000"}))},animate:function(c){var a=
-this;c||(a.points.forEach(function(b){var c=b.graphic;c&&(c.attr({rotation:180*a.yAxis.startAngleRad/Math.PI}),c.animate({rotation:b.shapeArgs.rotation},a.options.animation))}),a.animate=null)},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);u.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:function(c,a){u.prototype.setData.call(this,c,!1);this.processData();this.generatePoints();e(a,
-!0)&&this.chart.redraw()},drawTracker:d&&d.drawTrackerPoint},{setState:function(c){this.state=c}})})(y);(function(a){var v=a.noop,w=a.pick,e=a.seriesType,m=a.seriesTypes;e("boxplot","column",{threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eMaximum: {point.high}\x3cbr/\x3eUpper quartile: {point.q3}\x3cbr/\x3eMedian: {point.median}\x3cbr/\x3eLower quartile: {point.q1}\x3cbr/\x3eMinimum: {point.low}\x3cbr/\x3e'},
-whiskerLength:"50%",fillColor:"#ffffff",lineWidth:1,medianWidth:2,whiskerWidth:2},{pointArrayMap:["low","q1","median","q3","high"],toYData:function(a){return[a.low,a.q1,a.median,a.q3,a.high]},pointValKey:"high",pointAttribs:function(){return{}},drawDataLabels:v,translate:function(){var a=this.yAxis,e=this.pointArrayMap;m.column.prototype.translate.apply(this);this.points.forEach(function(d){e.forEach(function(c){null!==d[c]&&(d[c+"Plot"]=a.translate(d[c],0,1,0,1))})})},drawPoints:function(){var a=
-this,e=a.options,d=a.chart,c=d.renderer,n,b,l,k,h,f,m=0,t,g,p,x,E=!1!==a.doQuartiles,F,B=a.options.whiskerLength;a.points.forEach(function(r){var q=r.graphic,u=q?"animate":"attr",z=r.shapeArgs,v={},H={},J={},y={},G=r.color||a.color;void 0!==r.plotY&&(t=z.width,g=Math.floor(z.x),p=g+t,x=Math.round(t/2),n=Math.floor(E?r.q1Plot:r.lowPlot),b=Math.floor(E?r.q3Plot:r.lowPlot),l=Math.floor(r.highPlot),k=Math.floor(r.lowPlot),q||(r.graphic=q=c.g("point").add(a.group),r.stem=c.path().addClass("highcharts-boxplot-stem").add(q),
-B&&(r.whiskers=c.path().addClass("highcharts-boxplot-whisker").add(q)),E&&(r.box=c.path(void 0).addClass("highcharts-boxplot-box").add(q)),r.medianShape=c.path(void 0).addClass("highcharts-boxplot-median").add(q)),d.styledMode||(H.stroke=r.stemColor||e.stemColor||G,H["stroke-width"]=w(r.stemWidth,e.stemWidth,e.lineWidth),H.dashstyle=r.stemDashStyle||e.stemDashStyle,r.stem.attr(H),B&&(J.stroke=r.whiskerColor||e.whiskerColor||G,J["stroke-width"]=w(r.whiskerWidth,e.whiskerWidth,e.lineWidth),r.whiskers.attr(J)),
-E&&(v.fill=r.fillColor||e.fillColor||G,v.stroke=e.lineColor||G,v["stroke-width"]=e.lineWidth||0,r.box.attr(v)),y.stroke=r.medianColor||e.medianColor||G,y["stroke-width"]=w(r.medianWidth,e.medianWidth,e.lineWidth),r.medianShape.attr(y)),f=r.stem.strokeWidth()%2/2,m=g+x+f,r.stem[u]({d:["M",m,b,"L",m,l,"M",m,n,"L",m,k]}),E&&(f=r.box.strokeWidth()%2/2,n=Math.floor(n)+f,b=Math.floor(b)+f,g+=f,p+=f,r.box[u]({d:["M",g,b,"L",g,n,"L",p,n,"L",p,b,"L",g,b,"z"]})),B&&(f=r.whiskers.strokeWidth()%2/2,l+=f,k+=f,
-F=/%$/.test(B)?x*parseFloat(B)/100:B/2,r.whiskers[u]({d:["M",m-F,l,"L",m+F,l,"M",m-F,k,"L",m+F,k]})),h=Math.round(r.medianPlot),f=r.medianShape.strokeWidth()%2/2,h+=f,r.medianShape[u]({d:["M",g,h,"L",p,h]}))})},setStackedPoints:v})})(y);(function(a){var v=a.noop,w=a.seriesType,e=a.seriesTypes;w("errorbar","boxplot",{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},
-whiskerWidth:null},{type:"errorbar",pointArrayMap:["low","high"],toYData:function(a){return[a.low,a.high]},pointValKey:"high",doQuartiles:!1,drawDataLabels:e.arearange?function(){var a=this.pointValKey;e.arearange.prototype.drawDataLabels.call(this);this.data.forEach(function(e){e.y=e[a]})}:v,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||e.column.prototype.getColumnMetrics.call(this)}})})(y);(function(a){var v=a.correctFloat,w=a.isNumber,e=a.pick,m=a.Point,
-u=a.Series,q=a.seriesType,d=a.seriesTypes;q("waterfall","column",{dataLabels:{inside:!0},lineWidth:1,lineColor:"#333333",dashStyle:"Dot",borderColor:"#333333",states:{hover:{lineWidthPlus:0}}},{pointValKey:"y",showLine:!0,generatePoints:function(){var c=this.options.threshold,a,b,l,k;d.column.prototype.generatePoints.apply(this);l=0;for(b=this.points.length;l<b;l++)a=this.points[l],k=this.processedYData[l],a.isSum?a.y=v(k):a.isIntermediateSum&&(a.y=v(k-c),c=k)},translate:function(){var c=this.options,
-a=this.yAxis,b,l,k,h,f,r,t,g,p,m,q=e(c.minPointLength,5),u=q/2,B=c.threshold,z=c.stacking,v;d.column.prototype.translate.apply(this);g=p=B;l=this.points;b=0;for(c=l.length;b<c;b++)k=l[b],t=this.processedYData[b],h=k.shapeArgs,f=z&&a.stacks[(this.negStacks&&t<B?"-":"")+this.stackKey],v=this.getStackIndicator(v,k.x,this.index),m=e(f&&f[k.x].points[v.key],[0,t]),r=Math.max(g,g+k.y)+m[0],h.y=a.translate(r,0,1,0,1),k.isSum?(h.y=a.translate(m[1],0,1,0,1),h.height=Math.min(a.translate(m[0],0,1,0,1),a.len)-
-h.y):k.isIntermediateSum?(h.y=a.translate(m[1],0,1,0,1),h.height=Math.min(a.translate(p,0,1,0,1),a.len)-h.y,p=m[1]):(h.height=0<t?a.translate(g,0,1,0,1)-h.y:a.translate(g,0,1,0,1)-a.translate(g-t,0,1,0,1),g+=f&&f[k.x]?f[k.x].total:t,k.below=g<e(B,0)),0>h.height&&(h.y+=h.height,h.height*=-1),k.plotY=h.y=Math.round(h.y)-this.borderWidth%2/2,h.height=Math.max(Math.round(h.height),.001),k.yBottom=h.y+h.height,h.height<=q&&!k.isNull?(h.height=q,h.y-=u,k.plotY=h.y,k.minPointLengthOffset=0>k.y?-u:u):(k.isNull&&
-(h.width=0),k.minPointLengthOffset=0),h=k.plotY+(k.negative?h.height:0),this.chart.inverted?k.tooltipPos[0]=a.len-h:k.tooltipPos[1]=h},processData:function(a){var c=this.yData,b=this.options.data,d,k=c.length,h,f,r,e,g,p;f=h=r=e=this.options.threshold||0;for(p=0;p<k;p++)g=c[p],d=b&&b[p]?b[p]:{},"sum"===g||d.isSum?c[p]=v(f):"intermediateSum"===g||d.isIntermediateSum?c[p]=v(h):(f+=g,h+=g),r=Math.min(f,r),e=Math.max(f,e);u.prototype.processData.call(this,a);this.options.stacking||(this.dataMin=r,this.dataMax=
-e)},toYData:function(a){return a.isSum?0===a.x?null:"sum":a.isIntermediateSum?0===a.x?null:"intermediateSum":a.y},pointAttribs:function(a,n){var b=this.options.upColor;b&&!a.options.color&&(a.color=0<a.y?b:null);a=d.column.prototype.pointAttribs.call(this,a,n);delete a.dashstyle;return a},getGraphPath:function(){return["M",0,0]},getCrispPath:function(){var a=this.data,d=a.length,b=this.graph.strokeWidth()+this.borderWidth,b=Math.round(b)%2/2,l=this.xAxis.reversed,k=this.yAxis.reversed,h=[],f,r,e;
-for(e=1;e<d;e++){r=a[e].shapeArgs;f=a[e-1].shapeArgs;r=["M",f.x+(l?0:f.width),f.y+a[e-1].minPointLengthOffset+b,"L",r.x+(l?f.width:0),f.y+a[e-1].minPointLengthOffset+b];if(0>a[e-1].y&&!k||0<a[e-1].y&&k)r[2]+=f.height,r[5]+=f.height;h=h.concat(r)}return h},drawGraph:function(){u.prototype.drawGraph.call(this);this.graph.attr({d:this.getCrispPath()})},setStackedPoints:function(){var a=this.options,d,b;u.prototype.setStackedPoints.apply(this,arguments);d=this.stackedYData?this.stackedYData.length:0;
-for(b=1;b<d;b++)a.data[b].isSum||a.data[b].isIntermediateSum||(this.stackedYData[b]+=this.stackedYData[b-1])},getExtremes:function(){if(this.options.stacking)return u.prototype.getExtremes.apply(this,arguments)}},{getClassName:function(){var a=m.prototype.getClassName.call(this);this.isSum?a+=" highcharts-sum":this.isIntermediateSum&&(a+=" highcharts-intermediate-sum");return a},isValid:function(){return w(this.y,!0)||this.isSum||this.isIntermediateSum}})})(y);(function(a){var v=a.Series,w=a.seriesType,
-e=a.seriesTypes;w("polygon","scatter",{marker:{enabled:!1,states:{hover:{enabled:!1}}},stickyTracking:!1,tooltip:{followPointer:!0,pointFormat:""},trackByArea:!0},{type:"polygon",getGraphPath:function(){for(var a=v.prototype.getGraphPath.call(this),e=a.length+1;e--;)(e===a.length||"M"===a[e])&&0<e&&a.splice(e,0,"z");return this.areaPath=a},drawGraph:function(){this.options.fillColor=this.color;e.area.prototype.drawGraph.call(this)},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawTracker:v.prototype.drawTracker,
-setStackedPoints:a.noop})})(y);(function(a){var v=a.Series,w=a.Legend,e=a.Chart,m=a.addEvent,u=a.wrap,q=a.color,d=a.isNumber,c=a.numberFormat,n=a.objectEach,b=a.merge,l=a.noop,k=a.pick,h=a.stableSort,f=a.setOptions,r=a.arrayMin,t=a.arrayMax;f({legend:{bubbleLegend:{borderColor:void 0,borderWidth:2,className:void 0,color:void 0,connectorClassName:void 0,connectorColor:void 0,connectorDistance:60,connectorWidth:1,enabled:!1,labels:{className:void 0,allowOverlap:!1,format:"",formatter:void 0,align:"right",
-style:{fontSize:10,color:void 0},x:0,y:0},maxSize:60,minSize:10,legendIndex:0,ranges:{value:void 0,borderColor:void 0,color:void 0,connectorColor:void 0},sizeBy:"area",sizeByAbsoluteValue:!1,zIndex:1,zThreshold:0}}});a.BubbleLegend=function(a,b){this.init(a,b)};a.BubbleLegend.prototype={init:function(a,b){this.options=a;this.visible=!0;this.chart=b.chart;this.legend=b},setState:l,addToLegend:function(a){a.splice(this.options.legendIndex,0,this)},drawLegendSymbol:function(a){var b=this.chart,c=this.options,
-g=k(a.options.itemDistance,20),f,e=c.ranges;f=c.connectorDistance;this.fontMetrics=b.renderer.fontMetrics(c.labels.style.fontSize.toString()+"px");e&&e.length&&d(e[0].value)?(h(e,function(a,b){return b.value-a.value}),this.ranges=e,this.setOptions(),this.render(),b=this.getMaxLabelSize(),e=this.ranges[0].radius,a=2*e,f=f-e+b.width,f=0<f?f:0,this.maxLabel=b,this.movementX="left"===c.labels.align?f:0,this.legendItemWidth=a+f+g,this.legendItemHeight=a+this.fontMetrics.h/2):a.options.bubbleLegend.autoRanges=
-!0},setOptions:function(){var a=this,c=a.ranges,d=a.options,h=a.chart.series[d.seriesIndex],f=a.legend.baseline,e={"z-index":d.zIndex,"stroke-width":d.borderWidth},l={"z-index":d.zIndex,"stroke-width":d.connectorWidth},n=a.getLabelStyles(),r=h.options.marker.fillOpacity,m=a.chart.styledMode;c.forEach(function(g,p){m||(e.stroke=k(g.borderColor,d.borderColor,h.color),e.fill=k(g.color,d.color,1!==r?q(h.color).setOpacity(r).get("rgba"):h.color),l.stroke=k(g.connectorColor,d.connectorColor,h.color));c[p].radius=
-a.getRangeRadius(g.value);c[p]=b(c[p],{center:c[0].radius-c[p].radius+f});m||b(!0,c[p],{bubbleStyle:b(!1,e),connectorStyle:b(!1,l),labelStyle:n})})},getLabelStyles:function(){var a=this.options,c={},d="left"===a.labels.align,h=this.legend.options.rtl;n(a.labels.style,function(a,b){"color"!==b&&"fontSize"!==b&&"z-index"!==b&&(c[b]=a)});return b(!1,c,{"font-size":a.labels.style.fontSize,fill:k(a.labels.style.color,"#000000"),"z-index":a.zIndex,align:h||d?"right":"left"})},getRangeRadius:function(a){var b=
-this.options;return this.chart.series[this.options.seriesIndex].getRadius.call(this,b.ranges[b.ranges.length-1].value,b.ranges[0].value,b.minSize,b.maxSize,a)},render:function(){var a=this,b=a.chart.renderer,c=a.options.zThreshold;a.symbols||(a.symbols={connectors:[],bubbleItems:[],labels:[]});a.legendSymbol=b.g("bubble-legend");a.legendItem=b.g("bubble-legend-item");a.legendSymbol.translateX=0;a.legendSymbol.translateY=0;a.ranges.forEach(function(b){b.value>=c&&a.renderRange(b)});a.legendSymbol.add(a.legendItem);
-a.legendItem.add(a.legendGroup);a.hideOverlappingLabels()},renderRange:function(a){var b=this.options,c=b.labels,d=this.chart.renderer,g=this.symbols,h=g.labels,f=a.center,e=Math.abs(a.radius),k=b.connectorDistance,l=c.align,r=c.style.fontSize,k=this.legend.options.rtl||"left"===l?-k:k,c=b.connectorWidth,n=this.ranges[0].radius,m=f-e-b.borderWidth/2+c/2,t,r=r/2-(this.fontMetrics.h-r)/2,q=d.styledMode;"center"===l&&(k=0,b.connectorDistance=0,a.labelStyle.align="center");l=m+b.labels.y;t=n+k+b.labels.x;
-g.bubbleItems.push(d.circle(n,f+((m%1?1:.5)-(c%2?0:.5)),e).attr(q?{}:a.bubbleStyle).addClass((q?"highcharts-color-"+this.options.seriesIndex+" ":"")+"highcharts-bubble-legend-symbol "+(b.className||"")).add(this.legendSymbol));g.connectors.push(d.path(d.crispLine(["M",n,m,"L",n+k,m],b.connectorWidth)).attr(q?{}:a.connectorStyle).addClass((q?"highcharts-color-"+this.options.seriesIndex+" ":"")+"highcharts-bubble-legend-connectors "+(b.connectorClassName||"")).add(this.legendSymbol));a=d.text(this.formatLabel(a),
-t,l+r).attr(q?{}:a.labelStyle).addClass("highcharts-bubble-legend-labels "+(b.labels.className||"")).add(this.legendSymbol);h.push(a);a.placed=!0;a.alignAttr={x:t,y:l+r}},getMaxLabelSize:function(){var a,b;this.symbols.labels.forEach(function(c){b=c.getBBox(!0);a=a?b.width>a.width?b:a:b});return a||{}},formatLabel:function(b){var d=this.options,g=d.labels.formatter;return(d=d.labels.format)?a.format(d,b):g?g.call(b):c(b.value,1)},hideOverlappingLabels:function(){var a=this.chart,b=this.symbols;!this.options.labels.allowOverlap&&
-b&&(a.hideOverlappingLabels(b.labels),b.labels.forEach(function(a,c){a.newOpacity?a.newOpacity!==a.oldOpacity&&b.connectors[c].show():b.connectors[c].hide()}))},getRanges:function(){var a=this.legend.bubbleLegend,c,h=a.options.ranges,f,e=Number.MAX_VALUE,l=-Number.MAX_VALUE;a.chart.series.forEach(function(a){a.isBubble&&!a.ignoreSeries&&(f=a.zData.filter(d),f.length&&(e=k(a.options.zMin,Math.min(e,Math.max(r(f),!1===a.options.displayNegative?a.options.zThreshold:-Number.MAX_VALUE))),l=k(a.options.zMax,
-Math.max(l,t(f)))))});c=e===l?[{value:l}]:[{value:e},{value:(e+l)/2},{value:l,autoRanges:!0}];h.length&&h[0].radius&&c.reverse();c.forEach(function(a,d){h&&h[d]&&(c[d]=b(!1,h[d],a))});return c},predictBubbleSizes:function(){var a=this.chart,b=this.fontMetrics,c=a.legend.options,d="horizontal"===c.layout,h=d?a.legend.lastLineHeight:0,f=a.plotSizeX,e=a.plotSizeY,l=a.series[this.options.seriesIndex],a=Math.ceil(l.minPxSize),k=Math.ceil(l.maxPxSize),l=l.options.maxSize,r=Math.min(e,f);if(c.floating||
-!/%$/.test(l))b=k;else if(l=parseFloat(l),b=(r+h-b.h/2)*l/100/(l/100+1),d&&e-b>=f||!d&&f-b>=e)b=k;return[a,Math.ceil(b)]},updateRanges:function(a,b){var c=this.legend.options.bubbleLegend;c.minSize=a;c.maxSize=b;c.ranges=this.getRanges()},correctSizes:function(){var a=this.legend,b=this.chart.series[this.options.seriesIndex];1<Math.abs(Math.ceil(b.maxPxSize)-this.options.maxSize)&&(this.updateRanges(this.options.minSize,b.maxPxSize),a.render())}};m(a.Legend,"afterGetAllItems",function(b){var c=this.bubbleLegend,
-d=this.options,g=d.bubbleLegend,h=this.chart.getVisibleBubbleSeriesIndex();c&&c.ranges&&c.ranges.length&&(g.ranges.length&&(g.autoRanges=g.ranges[0].autoRanges?!0:!1),this.destroyItem(c));0<=h&&d.enabled&&g.enabled&&(g.seriesIndex=h,this.bubbleLegend=new a.BubbleLegend(g,this),this.bubbleLegend.addToLegend(b.allItems))});e.prototype.getVisibleBubbleSeriesIndex=function(){for(var a=this.series,b=0;b<a.length;){if(a[b]&&a[b].isBubble&&a[b].visible&&a[b].zData.length)return b;b++}return-1};w.prototype.getLinesHeights=
-function(){var a=this.allItems,b=[],c,d=a.length,h,f=0;for(h=0;h<d;h++)if(a[h].legendItemHeight&&(a[h].itemHeight=a[h].legendItemHeight),a[h]===a[d-1]||a[h+1]&&a[h]._legendItemPos[1]!==a[h+1]._legendItemPos[1]){b.push({height:0});c=b[b.length-1];for(f;f<=h;f++)a[f].itemHeight>c.height&&(c.height=a[f].itemHeight);c.step=h}return b};w.prototype.retranslateItems=function(a){var b,c,d,h=this.options.rtl,f=0;this.allItems.forEach(function(g,e){b=g.legendGroup.translateX;c=g._legendItemPos[1];if((d=g.movementX)||
-h&&g.ranges)d=h?b-g.options.maxSize/2:b+d,g.legendGroup.attr({translateX:d});e>a[f].step&&f++;g.legendGroup.attr({translateY:Math.round(c+a[f].height/2)});g._legendItemPos[1]=c+a[f].height/2})};m(v,"legendItemClick",function(){var a=this.chart,b=this.visible,c=this.chart.legend;c&&c.bubbleLegend&&(this.visible=!b,this.ignoreSeries=b,a=0<=a.getVisibleBubbleSeriesIndex(),c.bubbleLegend.visible!==a&&(c.update({bubbleLegend:{enabled:a}}),c.bubbleLegend.visible=a),this.visible=b)});u(e.prototype,"drawChartBox",
-function(a,b,c){var d=this.legend,h=0<=this.getVisibleBubbleSeriesIndex(),f;d&&d.options.enabled&&d.bubbleLegend&&d.options.bubbleLegend.autoRanges&&h?(f=d.bubbleLegend.options,h=d.bubbleLegend.predictBubbleSizes(),d.bubbleLegend.updateRanges(h[0],h[1]),f.placed||(d.group.placed=!1,d.allItems.forEach(function(a){a.legendGroup.translateY=null})),d.render(),this.getMargins(),this.axes.forEach(function(a){a.render();f.placed||(a.setScale(),a.updateNames(),n(a.ticks,function(a){a.isNew=!0;a.isNewLabel=
-!0}))}),f.placed=!0,this.getMargins(),a.call(this,b,c),d.bubbleLegend.correctSizes(),d.retranslateItems(d.getLinesHeights())):(a.call(this,b,c),d&&d.options.enabled&&d.bubbleLegend&&(d.render(),d.retranslateItems(d.getLinesHeights())))})})(y);(function(a){var v=a.arrayMax,w=a.arrayMin,e=a.Axis,m=a.color,u=a.isNumber,q=a.noop,d=a.pick,c=a.pInt,n=a.Point,b=a.Series,l=a.seriesType,k=a.seriesTypes;l("bubble","scatter",{dataLabels:{formatter:function(){return this.point.z},inside:!0,verticalAlign:"middle"},
-animationLimit:250,marker:{lineColor:null,lineWidth:1,fillOpacity:.5,radius:null,states:{hover:{radiusPlus:0}},symbol:"circle"},minSize:8,maxSize:"20%",softThreshold:!1,states:{hover:{halo:{size:5}}},tooltip:{pointFormat:"({point.x}, {point.y}), Size: {point.z}"},turboThreshold:0,zThreshold:0,zoneAxis:"z"},{pointArrayMap:["y","z"],parallelArrays:["x","y","z"],trackerGroups:["group","dataLabelsGroup"],specialGroup:"group",bubblePadding:!0,zoneAxis:"z",directTouch:!0,isBubble:!0,pointAttribs:function(a,
-c){var d=this.options.marker.fillOpacity;a=b.prototype.pointAttribs.call(this,a,c);1!==d&&(a.fill=m(a.fill).setOpacity(d).get("rgba"));return a},getRadii:function(a,b,c){var d,h=this.zData,f=c.minPxSize,e=c.maxPxSize,l=[],k;d=0;for(c=h.length;d<c;d++)k=h[d],l.push(this.getRadius(a,b,f,e,k));this.radii=l},getRadius:function(a,b,c,d,e){var h=this.options,f="width"!==h.sizeBy,g=h.zThreshold,l=b-a;h.sizeByAbsoluteValue&&null!==e&&(e=Math.abs(e-g),l=Math.max(b-g,Math.abs(a-g)),a=0);u(e)?e<a?c=c/2-1:(a=
-0<l?(e-a)/l:.5,f&&0<=a&&(a=Math.sqrt(a)),c=Math.ceil(c+a*(d-c))/2):c=null;return c},animate:function(a){!a&&this.points.length<this.options.animationLimit&&(this.points.forEach(function(a){var b=a.graphic,c;b&&b.width&&(c={x:b.x,y:b.y,width:b.width,height:b.height},b.attr({x:a.plotX,y:a.plotY,width:1,height:1}),b.animate(c,this.options.animation))},this),this.animate=null)},translate:function(){var b,c=this.data,d,e,g=this.radii;k.scatter.prototype.translate.call(this);for(b=c.length;b--;)d=c[b],
-e=g?g[b]:0,u(e)&&e>=this.minPxSize/2?(d.marker=a.extend(d.marker,{radius:e,width:2*e,height:2*e}),d.dlBox={x:d.plotX-e,y:d.plotY-e,width:2*e,height:2*e}):d.shapeArgs=d.plotY=d.dlBox=void 0},alignDataLabel:k.column.prototype.alignDataLabel,buildKDTree:q,applyZones:q},{haloPath:function(a){return n.prototype.haloPath.call(this,0===a?0:(this.marker?this.marker.radius||0:0)+a)},ttBelow:!1});e.prototype.beforePadding=function(){var b=this,e=this.len,l=this.chart,k=0,g=e,n=this.isXAxis,m=n?"xData":"yData",
-q=this.min,y={},B=Math.min(l.plotWidth,l.plotHeight),z=Number.MAX_VALUE,A=-Number.MAX_VALUE,I=this.max-q,C=e/I,D=[];this.series.forEach(function(e){var f=e.options;!e.bubblePadding||!e.visible&&l.options.chart.ignoreHiddenSeries||(b.allowZoomOutside=!0,D.push(e),n&&(["minSize","maxSize"].forEach(function(a){var b=f[a],d=/%$/.test(b),b=c(b);y[a]=d?B*b/100:b}),e.minPxSize=y.minSize,e.maxPxSize=Math.max(y.maxSize,y.minSize),e=e.zData.filter(a.isNumber),e.length&&(z=d(f.zMin,Math.min(z,Math.max(w(e),
-!1===f.displayNegative?f.zThreshold:-Number.MAX_VALUE))),A=d(f.zMax,Math.max(A,v(e))))))});D.forEach(function(a){var c=a[m],d=c.length,e;n&&a.getRadii(z,A,a);if(0<I)for(;d--;)u(c[d])&&b.dataMin<=c[d]&&c[d]<=b.dataMax&&(e=a.radii[d],k=Math.min((c[d]-q)*C-e,k),g=Math.max((c[d]-q)*C+e,g))});D.length&&0<I&&!this.isLog&&(g-=e,C*=(e+Math.max(0,k)-Math.min(g,e))/e,[["min","userMin",k],["max","userMax",g]].forEach(function(a){void 0===d(b.options[a[0]],b[a[1]])&&(b[a[0]]+=a[2]/C)}))}})(y);(function(a){var v=
-a.seriesType,w=a.defined;v("packedbubble","bubble",{minSize:"10%",maxSize:"100%",sizeBy:"radius",zoneAxis:"y",tooltip:{pointFormat:"Value: {point.value}"}},{pointArrayMap:["value"],pointValKey:"value",isCartesian:!1,axisTypes:[],accumulateAllPoints:function(a){var e=a.chart,u=[],q,d;for(q=0;q<e.series.length;q++)if(a=e.series[q],a.visible||!e.options.chart.ignoreHiddenSeries)for(d=0;d<a.yData.length;d++)u.push([null,null,a.yData[d],a.index,d]);return u},translate:function(){var e,m=this.chart,u=this.data,
-q=this.index,d,c,n;this.processedXData=this.xData;this.generatePoints();w(m.allDataPoints)||(m.allDataPoints=this.accumulateAllPoints(this),this.getPointRadius());e=this.placeBubbles(m.allDataPoints);for(n=0;n<e.length;n++)e[n][3]===q&&(d=u[e[n][4]],c=e[n][2],d.plotX=e[n][0]-m.plotLeft+m.diffX,d.plotY=e[n][1]-m.plotTop+m.diffY,d.marker=a.extend(d.marker,{radius:c,width:2*c,height:2*c}))},checkOverlap:function(a,m){var e=a[0]-m[0],q=a[1]-m[1];return-.001>Math.sqrt(e*e+q*q)-Math.abs(a[2]+m[2])},positionBubble:function(a,
-m,u){var e=Math.sqrt,d=Math.asin,c=Math.acos,n=Math.pow,b=Math.abs,e=e(n(a[0]-m[0],2)+n(a[1]-m[1],2)),c=c((n(e,2)+n(u[2]+m[2],2)-n(u[2]+a[2],2))/(2*(u[2]+m[2])*e)),d=d(b(a[0]-m[0])/e);a=(0>a[1]-m[1]?0:Math.PI)+c+d*(0>(a[0]-m[0])*(a[1]-m[1])?1:-1);return[m[0]+(m[2]+u[2])*Math.sin(a),m[1]-(m[2]+u[2])*Math.cos(a),u[2],u[3],u[4]]},placeBubbles:function(a){var e=this.checkOverlap,u=this.positionBubble,q=[],d=1,c=0,n=0,b,l;b=a.sort(function(a,b){return b[2]-a[2]});if(!b.length)return[];if(2>b.length)return[0,
-0,b[0][0],b[0][1],b[0][2]];q.push([[0,0,b[0][2],b[0][3],b[0][4]]]);q.push([[0,0-b[1][2]-b[0][2],b[1][2],b[1][3],b[1][4]]]);for(l=2;l<b.length;l++)b[l][2]=b[l][2]||1,a=u(q[d][c],q[d-1][n],b[l]),e(a,q[d][0])?(q.push([]),n=0,q[d+1].push(u(q[d][c],q[d][0],b[l])),d++,c=0):1<d&&q[d-1][n+1]&&e(a,q[d-1][n+1])?(n++,q[d].push(u(q[d][c],q[d-1][n],b[l])),c++):(c++,q[d].push(a));this.chart.stages=q;this.chart.rawPositions=[].concat.apply([],q);this.resizeRadius();return this.chart.rawPositions},resizeRadius:function(){var a=
-this.chart,m=a.rawPositions,u=Math.min,q=Math.max,d=a.plotLeft,c=a.plotTop,n=a.plotHeight,b=a.plotWidth,l,k,h,f,r,t;l=h=Number.POSITIVE_INFINITY;k=f=Number.NEGATIVE_INFINITY;for(t=0;t<m.length;t++)r=m[t][2],l=u(l,m[t][0]-r),k=q(k,m[t][0]+r),h=u(h,m[t][1]-r),f=q(f,m[t][1]+r);t=[k-l,f-h];u=u.apply([],[(b-d)/t[0],(n-c)/t[1]]);if(1e-10<Math.abs(u-1)){for(t=0;t<m.length;t++)m[t][2]*=u;this.placeBubbles(m)}else a.diffY=n/2+c-h-(f-h)/2,a.diffX=b/2+d-l-(k-l)/2},getPointRadius:function(){var a=this,m=a.chart,
-u=a.options,q=Math.min(m.plotWidth,m.plotHeight),d={},c=[],n=m.allDataPoints,b,l,k,h;["minSize","maxSize"].forEach(function(a){var b=parseInt(u[a],10),c=/%$/.test(b);d[a]=c?q*b/100:b});m.minRadius=b=d.minSize;m.maxRadius=l=d.maxSize;(n||[]).forEach(function(d,e){k=d[2];h=a.getRadius(b,l,b,l,k);0===k&&(h=null);n[e][2]=h;c.push(h)});this.radii=c},alignDataLabel:a.Series.prototype.alignDataLabel});a.addEvent(a.seriesTypes.packedbubble,"updatedData",function(){var a=this;this.chart.series.forEach(function(e){e.type===
-a.type&&(e.isDirty=!0)})});a.addEvent(a.Chart,"beforeRedraw",function(){this.allDataPoints&&delete this.allDataPoints})})(y);(function(a){var v=a.pick,w=a.Series,e=a.seriesTypes,m=a.wrap,u=w.prototype,q=a.Pointer.prototype;a.polarExtended||(a.polarExtended=!0,u.searchPointByAngle=function(a){var c=this.chart,d=this.xAxis.pane.center;return this.searchKDTree({clientX:180+-180/Math.PI*Math.atan2(a.chartX-d[0]-c.plotLeft,a.chartY-d[1]-c.plotTop)})},u.getConnectors=function(a,c,e,b){var d,k,h,f,n,m,g,
-p;k=b?1:0;d=0<=c&&c<=a.length-1?c:0>c?a.length-1+c:0;c=0>d-1?a.length-(1+k):d-1;k=d+1>a.length-1?k:d+1;h=a[c];k=a[k];f=h.plotX;h=h.plotY;n=k.plotX;m=k.plotY;k=a[d].plotX;d=a[d].plotY;f=(1.5*k+f)/2.5;h=(1.5*d+h)/2.5;n=(1.5*k+n)/2.5;g=(1.5*d+m)/2.5;m=Math.sqrt(Math.pow(f-k,2)+Math.pow(h-d,2));p=Math.sqrt(Math.pow(n-k,2)+Math.pow(g-d,2));f=Math.atan2(h-d,f-k);g=Math.PI/2+(f+Math.atan2(g-d,n-k))/2;Math.abs(f-g)>Math.PI/2&&(g-=Math.PI);f=k+Math.cos(g)*m;h=d+Math.sin(g)*m;n=k+Math.cos(Math.PI+g)*p;g=d+
-Math.sin(Math.PI+g)*p;k={rightContX:n,rightContY:g,leftContX:f,leftContY:h,plotX:k,plotY:d};e&&(k.prevPointCont=this.getConnectors(a,c,!1,b));return k},m(u,"buildKDTree",function(a){this.chart.polar&&(this.kdByAngle?this.searchPoint=this.searchPointByAngle:this.options.findNearestPointBy="xy");a.apply(this)}),u.toXY=function(a){var c,d=this.chart,b=a.plotX;c=a.plotY;a.rectPlotX=b;a.rectPlotY=c;c=this.xAxis.postTranslate(a.plotX,this.yAxis.len-c);a.plotX=a.polarPlotX=c.x-d.plotLeft;a.plotY=a.polarPlotY=
-c.y-d.plotTop;this.kdByAngle?(d=(b/Math.PI*180+this.xAxis.pane.options.startAngle)%360,0>d&&(d+=360),a.clientX=d):a.clientX=a.plotX},e.spline&&(m(e.spline.prototype,"getPointSpline",function(a,c,e,b){this.chart.polar?b?(a=this.getConnectors(c,b,!0,this.connectEnds),a=["C",a.prevPointCont.rightContX,a.prevPointCont.rightContY,a.leftContX,a.leftContY,a.plotX,a.plotY]):a=["M",e.plotX,e.plotY]:a=a.call(this,c,e,b);return a}),e.areasplinerange&&(e.areasplinerange.prototype.getPointSpline=e.spline.prototype.getPointSpline)),
-a.addEvent(w,"afterTranslate",function(){var d=this.chart,c,e;if(d.polar){this.kdByAngle=d.tooltip&&d.tooltip.shared;if(!this.preventPostTranslate)for(c=this.points,e=c.length;e--;)this.toXY(c[e]);this.hasClipCircleSetter||(this.hasClipCircleSetter=!!a.addEvent(this,"afterRender",function(){var b;d.polar&&(b=this.yAxis.center,this.group.clip(d.renderer.clipCircle(b[0],b[1],b[2]/2)),this.setClip=a.noop)}))}},{order:2}),m(u,"getGraphPath",function(a,c){var d=this,b,e,k;if(this.chart.polar){c=c||this.points;
-for(b=0;b<c.length;b++)if(!c[b].isNull){e=b;break}!1!==this.options.connectEnds&&void 0!==e&&(this.connectEnds=!0,c.splice(c.length,0,c[e]),k=!0);c.forEach(function(a){void 0===a.polarPlotY&&d.toXY(a)})}b=a.apply(this,[].slice.call(arguments,1));k&&c.pop();return b}),w=function(a,c){var d=this.chart,b=this.options.animation,e=this.group,k=this.markerGroup,h=this.xAxis.center,f=d.plotLeft,m=d.plotTop;d.polar?d.renderer.isSVG&&(!0===b&&(b={}),c?(a={translateX:h[0]+f,translateY:h[1]+m,scaleX:.001,scaleY:.001},
-e.attr(a),k&&k.attr(a)):(a={translateX:f,translateY:m,scaleX:1,scaleY:1},e.animate(a,b),k&&k.animate(a,b),this.animate=null)):a.call(this,c)},m(u,"animate",w),e.column&&(e=e.column.prototype,e.polarArc=function(a,c,e,b){var d=this.xAxis.center,k=this.yAxis.len;return this.chart.renderer.symbols.arc(d[0],d[1],k-c,null,{start:e,end:b,innerR:k-v(a,k)})},m(e,"animate",w),m(e,"translate",function(a){var c=this.xAxis,d=c.startAngleRad,b,e,k;this.preventPostTranslate=!0;a.call(this);if(c.isRadial)for(b=
-this.points,k=b.length;k--;)e=b[k],a=e.barX+d,e.shapeType="path",e.shapeArgs={d:this.polarArc(e.yBottom,e.plotY,a,a+e.pointWidth)},this.toXY(e),e.tooltipPos=[e.plotX,e.plotY],e.ttBelow=e.plotY>c.center[1]}),m(e,"alignDataLabel",function(a,c,e,b,l,k){this.chart.polar?(a=c.rectPlotX/Math.PI*180,null===b.align&&(b.align=20<a&&160>a?"left":200<a&&340>a?"right":"center"),null===b.verticalAlign&&(b.verticalAlign=45>a||315<a?"bottom":135<a&&225>a?"top":"middle"),u.alignDataLabel.call(this,c,e,b,l,k)):a.call(this,
-c,e,b,l,k)})),m(q,"getCoordinates",function(a,c){var d=this.chart,b={xAxis:[],yAxis:[]};d.polar?d.axes.forEach(function(a){var e=a.isXAxis,h=a.center,f=c.chartX-h[0]-d.plotLeft,h=c.chartY-h[1]-d.plotTop;b[e?"xAxis":"yAxis"].push({axis:a,value:a.translate(e?Math.PI-Math.atan2(f,h):Math.sqrt(Math.pow(f,2)+Math.pow(h,2)),!0)})}):b=a.call(this,c);return b}),a.SVGRenderer.prototype.clipCircle=function(d,c,e){var b=a.uniqueKey(),l=this.createElement("clipPath").attr({id:b}).add(this.defs);d=this.circle(d,
-c,e).add(l);d.id=b;d.clipPath=l;return d},a.addEvent(a.Chart,"getAxes",function(){this.pane||(this.pane=[]);a.splat(this.options.pane).forEach(function(d){new a.Pane(d,this)},this)}),a.addEvent(a.Chart,"afterDrawChartBox",function(){this.pane.forEach(function(a){a.render()})}),m(a.Chart.prototype,"get",function(d,c){return a.find(this.pane,function(a){return a.options.id===c})||d.call(this,c)}))})(y)});
-//# sourceMappingURL=highcharts-more.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
- Highstock as a plugin for Highcharts
-
- (c) 2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(H){"object"===typeof module&&module.exports?module.exports=H:"function"===typeof define&&define.amd?define(function(){return H}):H("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(H){(function(b){var D=b.addEvent,n=b.Axis,E=b.Chart,p=b.css,C=b.defined,G=b.extend,B=b.noop,w=b.pick,A=b.timeUnits,z=b.wrap;z(b.Series.prototype,"init",function(b){var e;b.apply(this,Array.prototype.slice.call(arguments,1));(e=this.xAxis)&&e.options.ordinal&&D(this,"updatedData",function(){delete e.ordinalIndex})});
-z(n.prototype,"getTimeTicks",function(b,e,d,l,a,f,u,m){var c=0,k,q,h={},y,r,x,g=[],t=-Number.MAX_VALUE,v=this.options.tickPixelInterval,K=this.chart.time;if(!this.options.ordinal&&!this.options.breaks||!f||3>f.length||void 0===d)return b.call(this,e,d,l,a);r=f.length;for(k=0;k<r;k++){x=k&&f[k-1]>l;f[k]<d&&(c=k);if(k===r-1||f[k+1]-f[k]>5*u||x){if(f[k]>t){for(q=b.call(this,e,f[c],f[k],a);q.length&&q[0]<=t;)q.shift();q.length&&(t=q[q.length-1]);g=g.concat(q)}c=k+1}if(x)break}b=q.info;if(m&&b.unitRange<=
-A.hour){k=g.length-1;for(c=1;c<k;c++)K.dateFormat("%d",g[c])!==K.dateFormat("%d",g[c-1])&&(h[g[c]]="day",y=!0);y&&(h[g[0]]="day");b.higherRanks=h}g.info=b;if(m&&C(v)){m=K=g.length;k=[];var I;for(y=[];m--;)c=this.translate(g[m]),I&&(y[m]=I-c),k[m]=I=c;y.sort();y=y[Math.floor(y.length/2)];y<.6*v&&(y=null);m=g[K-1]>l?K-1:K;for(I=void 0;m--;)c=k[m],l=Math.abs(I-c),I&&l<.8*v&&(null===y||l<.8*y)?(h[g[m]]&&!h[g[m+1]]?(l=m+1,I=c):l=m,g.splice(l,1)):I=c}return g});G(n.prototype,{beforeSetTickPositions:function(){var b,
-e=[],d,l=!1,a,f=this.getExtremes(),u=f.min,m=f.max,c,k=this.isXAxis&&!!this.options.breaks,f=this.options.ordinal,q=Number.MAX_VALUE,h=this.chart.options.chart.ignoreHiddenSeries,y;if(f||k){this.series.forEach(function(a,c){d=[];if(!(h&&!1===a.visible||!1===a.takeOrdinalPosition&&!k)&&(e=e.concat(a.processedXData),b=e.length,e.sort(function(g,a){return g-a}),q=Math.min(q,w(a.closestPointRange,q)),b)){for(c=0;c<b-1;)e[c]!==e[c+1]&&d.push(e[c+1]),c++;d[0]!==e[0]&&d.unshift(e[0]);e=d}a.isSeriesBoosting&&
-(y=!0)});y&&(e.length=0);b=e.length;if(2<b){a=e[1]-e[0];for(c=b-1;c--&&!l;)e[c+1]-e[c]!==a&&(l=!0);!this.options.keepOrdinalPadding&&(e[0]-u>a||m-e[e.length-1]>a)&&(l=!0)}else this.options.overscroll&&(2===b?q=e[1]-e[0]:1===b?(q=this.options.overscroll,e=[e[0],e[0]+q]):q=this.overscrollPointsRange);l?(this.options.overscroll&&(this.overscrollPointsRange=q,e=e.concat(this.getOverscrollPositions())),this.ordinalPositions=e,a=this.ordinal2lin(Math.max(u,e[0]),!0),c=Math.max(this.ordinal2lin(Math.min(m,
-e[e.length-1]),!0),1),this.ordinalSlope=m=(m-u)/(c-a),this.ordinalOffset=u-a*m):(this.overscrollPointsRange=w(this.closestPointRange,this.overscrollPointsRange),this.ordinalPositions=this.ordinalSlope=this.ordinalOffset=void 0)}this.isOrdinal=f&&l;this.groupIntervalFactor=null},val2lin:function(b,e){var d=this.ordinalPositions;if(d){var l=d.length,a,f;for(a=l;a--;)if(d[a]===b){f=a;break}for(a=l-1;a--;)if(b>d[a]||0===a){b=(b-d[a])/(d[a+1]-d[a]);f=a+b;break}e=e?f:this.ordinalSlope*(f||0)+this.ordinalOffset}else e=
-b;return e},lin2val:function(b,e){var d=this.ordinalPositions;if(d){var l=this.ordinalSlope,a=this.ordinalOffset,f=d.length-1,u;if(e)0>b?b=d[0]:b>f?b=d[f]:(f=Math.floor(b),u=b-f);else for(;f--;)if(e=l*f+a,b>=e){l=l*(f+1)+a;u=(b-e)/(l-e);break}return void 0!==u&&void 0!==d[f]?d[f]+(u?u*(d[f+1]-d[f]):0):b}return b},getExtendedPositions:function(){var b=this,e=b.chart,d=b.series[0].currentDataGrouping,l=b.ordinalIndex,a=d?d.count+d.unitName:"raw",f=b.options.overscroll,u=b.getExtremes(),m,c;l||(l=b.ordinalIndex=
-{});l[a]||(m={series:[],chart:e,getExtremes:function(){return{min:u.dataMin,max:u.dataMax+f}},options:{ordinal:!0},val2lin:n.prototype.val2lin,ordinal2lin:n.prototype.ordinal2lin},b.series.forEach(function(a){c={xAxis:m,xData:a.xData.slice(),chart:e,destroyGroupedData:B};c.xData=c.xData.concat(b.getOverscrollPositions());c.options={dataGrouping:d?{enabled:!0,forced:!0,approximation:"open",units:[[d.unitName,[d.count]]]}:{enabled:!1}};a.processData.apply(c);m.series.push(c)}),b.beforeSetTickPositions.apply(m),
-l[a]=m.ordinalPositions);return l[a]},getOverscrollPositions:function(){var F=this.options.overscroll,e=this.overscrollPointsRange,d=[],l=this.dataMax;if(b.defined(e))for(d.push(l);l<=this.dataMax+F;)l+=e,d.push(l);return d},getGroupIntervalFactor:function(b,e,d){var l;d=d.processedXData;var a=d.length,f=[];l=this.groupIntervalFactor;if(!l){for(l=0;l<a-1;l++)f[l]=d[l+1]-d[l];f.sort(function(a,f){return a-f});f=f[Math.floor(a/2)];b=Math.max(b,d[0]);e=Math.min(e,d[a-1]);this.groupIntervalFactor=l=a*
-f/(e-b)}return l},postProcessTickInterval:function(b){var e=this.ordinalSlope;return e?this.options.breaks?this.closestPointRange||b:b/(e/this.closestPointRange):b}});n.prototype.ordinal2lin=n.prototype.val2lin;z(E.prototype,"pan",function(b,e){var d=this.xAxis[0],l=d.options.overscroll,a=e.chartX,f=!1;if(d.options.ordinal&&d.series.length){var u=this.mouseDownX,m=d.getExtremes(),c=m.dataMax,k=m.min,q=m.max,h=this.hoverPoints,y=d.closestPointRange||d.overscrollPointsRange,u=(u-a)/(d.translationSlope*
-(d.ordinalSlope||y)),r={ordinalPositions:d.getExtendedPositions()},y=d.lin2val,x=d.val2lin,g;r.ordinalPositions?1<Math.abs(u)&&(h&&h.forEach(function(g){g.setState()}),0>u?(h=r,g=d.ordinalPositions?d:r):(h=d.ordinalPositions?d:r,g=r),r=g.ordinalPositions,c>r[r.length-1]&&r.push(c),this.fixedRange=q-k,u=d.toFixedRange(null,null,y.apply(h,[x.apply(h,[k,!0])+u,!0]),y.apply(g,[x.apply(g,[q,!0])+u,!0])),u.min>=Math.min(m.dataMin,k)&&u.max<=Math.max(c,q)+l&&d.setExtremes(u.min,u.max,!0,!1,{trigger:"pan"}),
-this.mouseDownX=a,p(this.container,{cursor:"move"})):f=!0}else f=!0;f&&(l&&(d.max=d.dataMax+l),b.apply(this,Array.prototype.slice.call(arguments,1)))});D(n,"foundExtremes",function(){this.isXAxis&&C(this.options.overscroll)&&this.max===this.dataMax&&(!this.chart.mouseIsDown||this.isInternal)&&(!this.eventArgs||this.eventArgs&&"navigator"!==this.eventArgs.trigger)&&(this.max+=this.options.overscroll,!this.isInternal&&C(this.userMin)&&(this.min+=this.options.overscroll))})})(H);(function(b){function D(){return Array.prototype.slice.call(arguments,
-1)}function n(b){b.apply(this);this.drawBreaks(this.xAxis,["x"]);this.drawBreaks(this.yAxis,p(this.pointArrayMap,["y"]))}var E=b.addEvent,p=b.pick,C=b.wrap,G=b.extend,B=b.isArray,w=b.fireEvent,A=b.Axis,z=b.Series;G(A.prototype,{isInBreak:function(b,e){var d=b.repeat||Infinity,l=b.from,a=b.to-b.from;e=e>=l?(e-l)%d:d-(l-e)%d;return b.inclusive?e<=a:e<a&&0!==e},isInAnyBreak:function(b,e){var d=this.options.breaks,l=d&&d.length,a,f,u;if(l){for(;l--;)this.isInBreak(d[l],b)&&(a=!0,f||(f=p(d[l].showPoints,
-this.isXAxis?!1:!0)));u=a&&e?a&&!f:a}return u}});E(A,"afterInit",function(){"function"===typeof this.setBreaks&&this.setBreaks(this.options.breaks,!1)});E(A,"afterSetTickPositions",function(){if(this.isBroken){var b=this.tickPositions,e=this.tickPositions.info,d=[],l;for(l=0;l<b.length;l++)this.isInAnyBreak(b[l])||d.push(b[l]);this.tickPositions=d;this.tickPositions.info=e}});E(A,"afterSetOptions",function(){this.isBroken&&(this.options.ordinal=!1)});A.prototype.setBreaks=function(b,e){function d(b){var f=
-b,c,k;for(k=0;k<a.breakArray.length;k++)if(c=a.breakArray[k],c.to<=b)f-=c.len;else if(c.from>=b)break;else if(a.isInBreak(c,b)){f-=b-c.from;break}return f}function l(b){var f,c;for(c=0;c<a.breakArray.length&&!(f=a.breakArray[c],f.from>=b);c++)f.to<b?b+=f.len:a.isInBreak(f,b)&&(b+=f.len);return b}var a=this,f=B(b)&&!!b.length;a.isDirty=a.isBroken!==f;a.isBroken=f;a.options.breaks=a.userOptions.breaks=b;a.forceRedraw=!0;f||a.val2lin!==d||(delete a.val2lin,delete a.lin2val);f&&(a.userOptions.ordinal=
-!1,a.val2lin=d,a.lin2val=l,a.setExtremes=function(a,b,c,f,q){if(this.isBroken){for(;this.isInAnyBreak(a);)a-=this.closestPointRange;for(;this.isInAnyBreak(b);)b-=this.closestPointRange}A.prototype.setExtremes.call(this,a,b,c,f,q)},a.setAxisTranslation=function(b){A.prototype.setAxisTranslation.call(this,b);this.unitLength=null;if(this.isBroken){b=a.options.breaks;var f=[],c=[],k=0,q,h,y=a.userMin||a.min,r=a.userMax||a.max,x=p(a.pointRangePadding,0),g,t;b.forEach(function(g){h=g.repeat||Infinity;a.isInBreak(g,
-y)&&(y+=g.to%h-y%h);a.isInBreak(g,r)&&(r-=r%h-g.from%h)});b.forEach(function(a){g=a.from;for(h=a.repeat||Infinity;g-h>y;)g-=h;for(;g<y;)g+=h;for(t=g;t<r;t+=h)f.push({value:t,move:"in"}),f.push({value:t+(a.to-a.from),move:"out",size:a.breakSize})});f.sort(function(g,a){return g.value===a.value?("in"===g.move?0:1)-("in"===a.move?0:1):g.value-a.value});q=0;g=y;f.forEach(function(a){q+="in"===a.move?1:-1;1===q&&"in"===a.move&&(g=a.value);0===q&&(c.push({from:g,to:a.value,len:a.value-g-(a.size||0)}),k+=
-a.value-g-(a.size||0))});a.breakArray=c;a.unitLength=r-y-k+x;w(a,"afterBreaks");a.staticScale?a.transA=a.staticScale:a.unitLength&&(a.transA*=(r-a.min+x)/a.unitLength);x&&(a.minPixelPadding=a.transA*a.minPointOffset);a.min=y;a.max=r}});p(e,!0)&&this.chart.redraw()};C(z.prototype,"generatePoints",function(b){b.apply(this,D(arguments));var e=this.xAxis,d=this.yAxis,l=this.points,a,f=l.length,u=this.options.connectNulls,m;if(e&&d&&(e.options.breaks||d.options.breaks))for(;f--;)a=l[f],m=null===a.y&&!1===
-u,m||!e.isInAnyBreak(a.x,!0)&&!d.isInAnyBreak(a.y,!0)||(l.splice(f,1),this.data[f]&&this.data[f].destroyElements())});b.Series.prototype.drawBreaks=function(b,e){var d=this,l=d.points,a,f,u,m;b&&e.forEach(function(c){a=b.breakArray||[];f=b.isXAxis?b.min:p(d.options.threshold,b.min);l.forEach(function(k){m=p(k["stack"+c.toUpperCase()],k[c]);a.forEach(function(a){u=!1;if(f<a.from&&m>a.to||f>a.from&&m<a.from)u="pointBreak";else if(f<a.from&&m>a.from&&m<a.to||f>a.from&&m>a.to&&m<a.from)u="pointInBreak";
-u&&w(b,u,{point:k,brk:a})})})})};b.Series.prototype.gappedPath=function(){var p=this.currentDataGrouping,e=p&&p.totalRange,p=this.options.gapSize,d=this.points.slice(),l=d.length-1,a=this.yAxis;if(p&&0<l)for("value"!==this.options.gapUnit&&(p*=this.closestPointRange),e&&e>p&&(p=e);l--;)d[l+1].x-d[l].x>p&&(e=(d[l].x+d[l+1].x)/2,d.splice(l+1,0,{isNull:!0,x:e}),this.options.stacking&&(e=a.stacks[this.stackKey][e]=new b.StackItem(a,a.options.stackLabels,!1,e,this.stack),e.total=0));return this.getGraphPath(d)};
-C(b.seriesTypes.column.prototype,"drawPoints",n);C(b.Series.prototype,"drawPoints",n)})(H);(function(b){var D=b.addEvent,n=b.arrayMax,E=b.arrayMin,p=b.Axis,C=b.defaultPlotOptions,G=b.defined,B=b.extend,w=b.format,A=b.isNumber,z=b.merge,F=b.pick,e=b.Point,d=b.Series,l=b.Tooltip,a=b.wrap,f=d.prototype,u=f.processData,m=f.generatePoints,c={approximation:"average",groupPixelWidth:2,dateTimeLabelFormats:{millisecond:["%A, %b %e, %H:%M:%S.%L","%A, %b %e, %H:%M:%S.%L","-%H:%M:%S.%L"],second:["%A, %b %e, %H:%M:%S",
-"%A, %b %e, %H:%M:%S","-%H:%M:%S"],minute:["%A, %b %e, %H:%M","%A, %b %e, %H:%M","-%H:%M"],hour:["%A, %b %e, %H:%M","%A, %b %e, %H:%M","-%H:%M"],day:["%A, %b %e, %Y","%A, %b %e","-%A, %b %e, %Y"],week:["Week from %A, %b %e, %Y","%A, %b %e","-%A, %b %e, %Y"],month:["%B %Y","%B","-%B %Y"],year:["%Y","%Y","-%Y"]}},k={line:{},spline:{},area:{},areaspline:{},column:{approximation:"sum",groupPixelWidth:10},arearange:{approximation:"range"},areasplinerange:{approximation:"range"},columnrange:{approximation:"range",
-groupPixelWidth:10},candlestick:{approximation:"ohlc",groupPixelWidth:10},ohlc:{approximation:"ohlc",groupPixelWidth:5}},q=b.defaultDataGroupingUnits=[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1]],["week",[1]],["month",[1,3,6]],["year",null]],h=b.approximations={sum:function(a){var c=a.length,b;if(!c&&a.hasNulls)b=null;else if(c)for(b=0;c--;)b+=a[c];return b},average:function(a){var c=a.length;a=h.sum(a);
-A(a)&&c&&(a/=c);return a},averages:function(){var a=[];[].forEach.call(arguments,function(c){a.push(h.average(c))});return void 0===a[0]?void 0:a},open:function(a){return a.length?a[0]:a.hasNulls?null:void 0},high:function(a){return a.length?n(a):a.hasNulls?null:void 0},low:function(a){return a.length?E(a):a.hasNulls?null:void 0},close:function(a){return a.length?a[a.length-1]:a.hasNulls?null:void 0},ohlc:function(a,c,b,g){a=h.open(a);c=h.high(c);b=h.low(b);g=h.close(g);if(A(a)||A(c)||A(b)||A(g))return[a,
-c,b,g]},range:function(a,c){a=h.low(a);c=h.high(c);if(A(a)||A(c))return[a,c];if(null===a&&null===c)return null}};f.groupData=function(a,b,f,g){var t=this,v=t.data,r=t.options.data,I=[],y=[],q=[],d=a.length,x,l,u=!!b,m=[];g="function"===typeof g?g:h[g]||k[t.type]&&h[k[t.type].approximation]||h[c.approximation];var e=t.pointArrayMap,p=e&&e.length,w=["x"].concat(e||["y"]),n=0,C=0,B,J;p?e.forEach(function(){m.push([])}):m.push([]);B=p||1;for(J=0;J<=d&&!(a[J]>=f[0]);J++);for(J;J<=d;J++){for(;void 0!==
-f[n+1]&&a[J]>=f[n+1]||J===d;){x=f[n];t.dataGroupInfo={start:C,length:m[0].length};l=g.apply(t,m);G(t.dataGroupInfo.options)||(t.dataGroupInfo.options=z(t.pointClass.prototype.optionsToObject.call({series:t},t.options.data[C])),w.forEach(function(a){delete t.dataGroupInfo.options[a]}));void 0!==l&&(I.push(x),y.push(l),q.push(t.dataGroupInfo));C=J;for(x=0;x<B;x++)m[x].length=0,m[x].hasNulls=!1;n+=1;if(J===d)break}if(J===d)break;if(e){x=t.cropStart+J;l=v&&v[x]||t.pointClass.prototype.applyOptions.apply({series:t},
-[r[x]]);var F;for(x=0;x<p;x++)F=l[e[x]],A(F)?m[x].push(F):null===F&&(m[x].hasNulls=!0)}else x=u?b[J]:null,A(x)?m[0].push(x):null===x&&(m[0].hasNulls=!0)}return[I,y,q]};f.processData=function(){var a=this.chart,c=this.options.dataGrouping,b=!1!==this.allowDG&&c&&F(c.enabled,a.options.isStock),g=this.visible||!a.options.chart.ignoreHiddenSeries,t,v=this.currentDataGrouping,k;this.forceCrop=b;this.groupPixelWidth=null;this.hasProcessed=!0;if(!1!==u.apply(this,arguments)&&b){this.destroyGroupedData();
-var I,h=c.groupAll?this.xData:this.processedXData,d=c.groupAll?this.yData:this.processedYData,m=a.plotSizeX,a=this.xAxis,l=a.options.ordinal,e=this.groupPixelWidth=a.getGroupPixelWidth&&a.getGroupPixelWidth();if(e){this.isDirty=t=!0;this.points=null;b=a.getExtremes();k=b.min;b=b.max;l=l&&a.getGroupIntervalFactor(k,b,this)||1;e=e*(b-k)/m*l;m=a.getTimeTicks(a.normalizeTimeTickInterval(e,c.units||q),Math.min(k,h[0]),Math.max(b,h[h.length-1]),a.options.startOfWeek,h,this.closestPointRange);d=f.groupData.apply(this,
-[h,d,m,c.approximation]);h=d[0];l=d[1];if(c.smoothed&&h.length){I=h.length-1;for(h[I]=Math.min(h[I],b);I--&&0<I;)h[I]+=e/2;h[0]=Math.max(h[0],k)}k=m.info;this.closestPointRange=m.info.totalRange;this.groupMap=d[2];if(G(h[0])&&h[0]<a.dataMin&&g){if(!G(a.options.min)&&a.min<=a.dataMin||a.min===a.dataMin)a.min=h[0];a.dataMin=h[0]}c.groupAll&&(c=this.cropData(h,l,a.min,a.max,1),h=c.xData,l=c.yData);this.processedXData=h;this.processedYData=l}else this.groupMap=null;this.hasGroupedData=t;this.currentDataGrouping=
-k;this.preventGraphAnimation=(v&&v.totalRange)!==(k&&k.totalRange)}};f.destroyGroupedData=function(){var a=this.groupedData;(a||[]).forEach(function(c,b){c&&(a[b]=c.destroy?c.destroy():null)});this.groupedData=null};f.generatePoints=function(){m.apply(this);this.destroyGroupedData();this.groupedData=this.hasGroupedData?this.points:null};D(e,"update",function(){if(this.dataGroup)return b.error(24,!1,this.series.chart),!1});a(l.prototype,"tooltipFooterHeaderFormatter",function(a,c,b){var g=this.chart.time,
-t=c.series,v=t.tooltipOptions,f=t.options.dataGrouping,h=v.xDateFormat,k,r=t.xAxis,d=v[(b?"footer":"header")+"Format"];return r&&"datetime"===r.options.type&&f&&A(c.key)?(a=t.currentDataGrouping,f=f.dateTimeLabelFormats,a?(v=f[a.unitName],1===a.count?h=v[0]:(h=v[1],k=v[2])):!h&&f&&(h=this.getXDateFormat(c,v,r)),h=g.dateFormat(h,c.key),k&&(h+=g.dateFormat(k,c.key+a.totalRange-1)),t.chart.styledMode&&(d=this.styledModeFormat(d)),w(d,{point:B(c.point,{key:h}),series:t},g)):a.call(this,c,b)});D(d,"destroy",
-f.destroyGroupedData);D(d,"afterSetOptions",function(a){a=a.options;var b=this.type,f=this.chart.options.plotOptions,g=C[b].dataGrouping,t=this.useCommonDataGrouping&&c;if(k[b]||t)g||(g=z(c,k[b])),a.dataGrouping=z(t,g,f.series&&f.series.dataGrouping,f[b].dataGrouping,this.userOptions.dataGrouping);this.chart.options.isStock&&(this.requireSorting=!0)});D(p,"afterSetScale",function(){this.series.forEach(function(a){a.hasProcessed=!1})});p.prototype.getGroupPixelWidth=function(){var a=this.series,c=
-a.length,b,g=0,t=!1,f;for(b=c;b--;)(f=a[b].options.dataGrouping)&&(g=Math.max(g,f.groupPixelWidth));for(b=c;b--;)(f=a[b].options.dataGrouping)&&a[b].hasProcessed&&(c=(a[b].processedXData||a[b].data).length,a[b].groupPixelWidth||c>this.chart.plotSizeX/g||c&&f.forced)&&(t=!0);return t?g:0};p.prototype.setDataGrouping=function(a,c){var b;c=F(c,!0);a||(a={forced:!1,units:null});if(this instanceof p)for(b=this.series.length;b--;)this.series[b].update({dataGrouping:a},!1);else this.chart.options.series.forEach(function(g){g.dataGrouping=
-a},!1);this.ordinalSlope=null;c&&this.chart.redraw()}})(H);(function(b){var D=b.Point,n=b.seriesType,E=b.seriesTypes;n("ohlc","column",{lineWidth:1,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eOpen: {point.open}\x3cbr/\x3eHigh: {point.high}\x3cbr/\x3eLow: {point.low}\x3cbr/\x3eClose: {point.close}\x3cbr/\x3e'},threshold:null,states:{hover:{lineWidth:3}},stickyTracking:!0},{directTouch:!1,pointArrayMap:["open","high",
-"low","close"],toYData:function(b){return[b.open,b.high,b.low,b.close]},pointValKey:"close",pointAttrToOptions:{stroke:"color","stroke-width":"lineWidth"},init:function(){E.column.prototype.init.apply(this,arguments);this.options.stacking=!1},pointAttribs:function(b,n){n=E.column.prototype.pointAttribs.call(this,b,n);var p=this.options;delete n.fill;!b.options.color&&p.upColor&&b.open<b.close&&(n.stroke=p.upColor);return n},translate:function(){var b=this,n=b.yAxis,G=!!b.modifyValue,B=["plotOpen",
-"plotHigh","plotLow","plotClose","yBottom"];E.column.prototype.translate.apply(b);b.points.forEach(function(p){[p.open,p.high,p.low,p.close,p.low].forEach(function(w,z){null!==w&&(G&&(w=b.modifyValue(w)),p[B[z]]=n.toPixels(w,!0))});p.tooltipPos[1]=p.plotHigh+n.pos-b.chart.plotTop})},drawPoints:function(){var b=this,n=b.chart;b.points.forEach(function(p){var B,w,A,z,C=p.graphic,e,d=!C;void 0!==p.plotY&&(C||(p.graphic=C=n.renderer.path().add(b.group)),n.styledMode||C.attr(b.pointAttribs(p,p.selected&&
-"select")),w=C.strokeWidth()%2/2,e=Math.round(p.plotX)-w,A=Math.round(p.shapeArgs.width/2),z=["M",e,Math.round(p.yBottom),"L",e,Math.round(p.plotHigh)],null!==p.open&&(B=Math.round(p.plotOpen)+w,z.push("M",e,B,"L",e-A,B)),null!==p.close&&(B=Math.round(p.plotClose)+w,z.push("M",e,B,"L",e+A,B)),C[d?"attr":"animate"]({d:z}).addClass(p.getClassName(),!0))})},animate:null},{getClassName:function(){return D.prototype.getClassName.call(this)+(this.open<this.close?" highcharts-point-up":" highcharts-point-down")}})})(H);
-(function(b){var D=b.defaultPlotOptions,n=b.merge,E=b.seriesType,p=b.seriesTypes;E("candlestick","ohlc",n(D.column,{states:{hover:{lineWidth:2}},tooltip:D.ohlc.tooltip,threshold:null,lineColor:"#000000",lineWidth:1,upColor:"#ffffff",stickyTracking:!0}),{pointAttribs:function(b,n){var B=p.column.prototype.pointAttribs.call(this,b,n),w=this.options,A=b.open<b.close,z=w.lineColor||this.color;B["stroke-width"]=w.lineWidth;B.fill=b.options.color||(A?w.upColor||this.color:this.color);B.stroke=b.lineColor||
-(A?w.upLineColor||z:z);n&&(b=w.states[n],B.fill=b.color||B.fill,B.stroke=b.lineColor||B.stroke,B["stroke-width"]=b.lineWidth||B["stroke-width"]);return B},drawPoints:function(){var b=this,p=b.chart,n=b.yAxis.reversed;b.points.forEach(function(w){var A=w.graphic,z,B,e,d,l,a,f,u=!A;void 0!==w.plotY&&(A||(w.graphic=A=p.renderer.path().add(b.group)),b.chart.styledMode||A.attr(b.pointAttribs(w,w.selected&&"select")).shadow(b.options.shadow),l=A.strokeWidth()%2/2,a=Math.round(w.plotX)-l,z=w.plotOpen,B=
-w.plotClose,e=Math.min(z,B),z=Math.max(z,B),f=Math.round(w.shapeArgs.width/2),B=n?z!==w.yBottom:Math.round(e)!==Math.round(w.plotHigh),d=n?Math.round(e)!==Math.round(w.plotHigh):z!==w.yBottom,e=Math.round(e)+l,z=Math.round(z)+l,l=[],l.push("M",a-f,z,"L",a-f,e,"L",a+f,e,"L",a+f,z,"Z","M",a,e,"L",a,B?Math.round(n?w.yBottom:w.plotHigh):e,"M",a,z,"L",a,d?Math.round(n?w.plotHigh:w.yBottom):z),A[u?"attr":"animate"]({d:l}).addClass(w.getClassName(),!0))})}})})(H);var U=function(b){var D=b.defined,n=b.seriesTypes,
-E=b.stableSort;return{getPlotBox:function(){return b.Series.prototype.getPlotBox.call(this.options.onSeries&&this.chart.get(this.options.onSeries)||this)},translate:function(){n.column.prototype.translate.apply(this);var b=this.options,C=this.chart,G=this.points,B=G.length-1,w,A,z=b.onSeries,z=z&&C.get(z),b=b.onKey||"y",F=z&&z.options.step,e=z&&z.points,d=e&&e.length,l=C.inverted,a=this.xAxis,f=this.yAxis,u=0,m,c,k,q;if(z&&z.visible&&d)for(u=(z.pointXOffset||0)+(z.barW||0)/2,w=z.currentDataGrouping,
-c=e[d-1].x+(w?w.totalRange:0),E(G,function(a,b){return a.x-b.x}),b="plot"+b[0].toUpperCase()+b.substr(1);d--&&G[B]&&!(m=e[d],w=G[B],w.y=m.y,m.x<=w.x&&void 0!==m[b]&&(w.x<=c&&(w.plotY=m[b],m.x<w.x&&!F&&(k=e[d+1])&&void 0!==k[b]&&(q=(w.x-m.x)/(k.x-m.x),w.plotY+=q*(k[b]-m[b]),w.y+=q*(k.y-m.y))),B--,d++,0>B)););G.forEach(function(b,c){var k;b.plotX+=u;if(void 0===b.plotY||l)0<=b.plotX&&b.plotX<=a.len?l?(b.plotY=a.translate(b.x,0,1,0,1),b.plotX=D(b.y)?f.translate(b.y,0,0,0,1):0):b.plotY=C.chartHeight-
-a.bottom-(a.opposite?a.height:0)+a.offset-f.top:b.shapeArgs={};(A=G[c-1])&&A.plotX===b.plotX&&(void 0===A.stackIndex&&(A.stackIndex=0),k=A.stackIndex+1);b.stackIndex=k});this.onSeries=z}}}(H);(function(b,D){function n(b){e[b+"pin"]=function(d,a,f,u,m){var c=m&&m.anchorX;m=m&&m.anchorY;"circle"===b&&u>f&&(d-=Math.round((u-f)/2),f=u);d=e[b](d,a,f,u);c&&m&&(d.push("M","circle"===b?d[1]-d[4]:d[1]+d[4]/2,a>m?a:a+u,"L",c,m),d=d.concat(e.circle(c-1,m-1,2,2)));return d}}var E=b.addEvent,p=b.merge,C=b.noop,
-G=b.defined,B=b.Renderer,w=b.Series,A=b.seriesType,z=b.TrackerMixin,F=b.VMLRenderer,e=b.SVGRenderer.prototype.symbols;A("flags","column",{pointRange:0,allowOverlapX:!1,shape:"flag",stackDistance:12,textAlign:"center",tooltip:{pointFormat:"{point.text}\x3cbr/\x3e"},threshold:null,y:-30,fillColor:"#ffffff",lineWidth:1,states:{hover:{lineColor:"#000000",fillColor:"#ccd6eb"}},style:{fontSize:"11px",fontWeight:"bold"}},{sorted:!1,noSharedTooltip:!0,allowDG:!1,takeOrdinalPosition:!1,trackerGroups:["markerGroup"],
-forceCrop:!0,init:w.prototype.init,pointAttribs:function(b,e){var a=this.options,f=b&&b.color||this.color,d=a.lineColor,m=b&&b.lineWidth;b=b&&b.fillColor||a.fillColor;e&&(b=a.states[e].fillColor,d=a.states[e].lineColor,m=a.states[e].lineWidth);return{fill:b||f,stroke:d||f,"stroke-width":m||a.lineWidth||0}},translate:D.translate,getPlotBox:D.getPlotBox,drawPoints:function(){var d=this.points,e=this.chart,a=e.renderer,f,u,m=e.inverted,c=this.options,k=c.y,q,h,y,r,x,g,t=this.yAxis,v={},K=[];for(h=d.length;h--;)y=
-d[h],g=(m?y.plotY:y.plotX)>this.xAxis.len,f=y.plotX,r=y.stackIndex,q=y.options.shape||c.shape,u=y.plotY,void 0!==u&&(u=y.plotY+k-(void 0!==r&&r*c.stackDistance)),y.anchorX=r?void 0:y.plotX,x=r?void 0:y.plotY,r=y.graphic,void 0!==u&&0<=f&&!g?(r||(r=y.graphic=a.label("",null,null,q,null,null,c.useHTML),e.styledMode||r.attr(this.pointAttribs(y)).css(p(c.style,y.style)),r.attr({align:"flag"===q?"left":"center",width:c.width,height:c.height,"text-align":c.textAlign}).addClass("highcharts-point").add(this.markerGroup),
-y.graphic.div&&(y.graphic.div.point=y),e.styledMode||r.shadow(c.shadow),r.isNew=!0),0<f&&(f-=r.strokeWidth()%2),q={y:u,anchorY:x},c.allowOverlapX&&(q.x=f,q.anchorX=y.anchorX),r.attr({text:y.options.title||c.title||"A"})[r.isNew?"attr":"animate"](q),c.allowOverlapX||(v[y.plotX]?v[y.plotX].size=Math.max(v[y.plotX].size,r.width):v[y.plotX]={align:0,size:r.width,target:f,anchorX:f}),y.tooltipPos=[f,u+t.pos-e.plotTop]):r&&(y.graphic=r.destroy());c.allowOverlapX||(b.objectEach(v,function(a){a.plotX=a.anchorX;
-K.push(a)}),b.distribute(K,m?t.len:this.xAxis.len,100),d.forEach(function(a){var b=a.graphic&&v[a.plotX];b&&(a.graphic[a.graphic.isNew?"attr":"animate"]({x:b.pos,anchorX:a.anchorX}),G(b.pos)?a.graphic.isNew=!1:(a.graphic.attr({x:-9999,anchorX:-9999}),a.graphic.isNew=!0))}));c.useHTML&&b.wrap(this.markerGroup,"on",function(a){return b.SVGElement.prototype.on.apply(a.apply(this,[].slice.call(arguments,1)),[].slice.call(arguments,1))})},drawTracker:function(){var b=this.points;z.drawTrackerPoint.apply(this);
-b.forEach(function(d){var a=d.graphic;a&&E(a.element,"mouseover",function(){0<d.stackIndex&&!d.raised&&(d._y=a.y,a.attr({y:d._y-8}),d.raised=!0);b.forEach(function(a){a!==d&&a.raised&&a.graphic&&(a.graphic.attr({y:a._y}),a.raised=!1)})})})},animate:function(b){b?this.setClip():this.animate=null},setClip:function(){w.prototype.setClip.apply(this,arguments);!1!==this.options.clip&&this.sharedClipKey&&this.markerGroup.clip(this.chart[this.sharedClipKey])},buildKDTree:C,invertGroups:C});e.flag=function(b,
-l,a,f,u){var d=u&&u.anchorX||b;u=u&&u.anchorY||l;return e.circle(d-1,u-1,2,2).concat(["M",d,u,"L",b,l+f,b,l,b+a,l,b+a,l+f,b,l+f,"Z"])};n("circle");n("square");B===F&&["flag","circlepin","squarepin"].forEach(function(b){F.prototype.symbols[b]=e[b]})})(H,U);(function(b){function D(a,b,d){this.init(a,b,d)}var n=b.addEvent,E=b.Axis,p=b.correctFloat,C=b.defaultOptions,G=b.defined,B=b.destroyObjectProperties,w=b.fireEvent,A=b.hasTouch,z=b.merge,F=b.pick,e=b.removeEvent,d,l={height:b.isTouchDevice?20:14,
-barBorderRadius:0,buttonBorderRadius:0,liveRedraw:void 0,margin:10,minWidth:6,step:.2,zIndex:3,barBackgroundColor:"#cccccc",barBorderWidth:1,barBorderColor:"#cccccc",buttonArrowColor:"#333333",buttonBackgroundColor:"#e6e6e6",buttonBorderColor:"#cccccc",buttonBorderWidth:1,rifleColor:"#333333",trackBackgroundColor:"#f2f2f2",trackBorderColor:"#f2f2f2",trackBorderWidth:1};C.scrollbar=z(!0,l,C.scrollbar);b.swapXY=d=function(a,b){var f=a.length,d;if(b)for(b=0;b<f;b+=3)d=a[b+1],a[b+1]=a[b+2],a[b+2]=d;return a};
-D.prototype={init:function(a,b,d){this.scrollbarButtons=[];this.renderer=a;this.userOptions=b;this.options=z(l,b);this.chart=d;this.size=F(this.options.size,this.options.height);b.enabled&&(this.render(),this.initEvents(),this.addEvents())},render:function(){var a=this.renderer,b=this.options,e=this.size,m=this.chart.styledMode,c;this.group=c=a.g("scrollbar").attr({zIndex:b.zIndex,translateY:-99999}).add();this.track=a.rect().addClass("highcharts-scrollbar-track").attr({x:0,r:b.trackBorderRadius||
-0,height:e,width:e}).add(c);m||this.track.attr({fill:b.trackBackgroundColor,stroke:b.trackBorderColor,"stroke-width":b.trackBorderWidth});this.trackBorderWidth=this.track.strokeWidth();this.track.attr({y:-this.trackBorderWidth%2/2});this.scrollbarGroup=a.g().add(c);this.scrollbar=a.rect().addClass("highcharts-scrollbar-thumb").attr({height:e,width:e,r:b.barBorderRadius||0}).add(this.scrollbarGroup);this.scrollbarRifles=a.path(d(["M",-3,e/4,"L",-3,2*e/3,"M",0,e/4,"L",0,2*e/3,"M",3,e/4,"L",3,2*e/3],
-b.vertical)).addClass("highcharts-scrollbar-rifles").add(this.scrollbarGroup);m||(this.scrollbar.attr({fill:b.barBackgroundColor,stroke:b.barBorderColor,"stroke-width":b.barBorderWidth}),this.scrollbarRifles.attr({stroke:b.rifleColor,"stroke-width":1}));this.scrollbarStrokeWidth=this.scrollbar.strokeWidth();this.scrollbarGroup.translate(-this.scrollbarStrokeWidth%2/2,-this.scrollbarStrokeWidth%2/2);this.drawScrollbarButton(0);this.drawScrollbarButton(1)},position:function(a,b,d,e){var c=this.options.vertical,
-f=0,q=this.rendered?"animate":"attr";this.x=a;this.y=b+this.trackBorderWidth;this.width=d;this.xOffset=this.height=e;this.yOffset=f;c?(this.width=this.yOffset=d=f=this.size,this.xOffset=b=0,this.barWidth=e-2*d,this.x=a+=this.options.margin):(this.height=this.xOffset=e=b=this.size,this.barWidth=d-2*e,this.y+=this.options.margin);this.group[q]({translateX:a,translateY:this.y});this.track[q]({width:d,height:e});this.scrollbarButtons[1][q]({translateX:c?0:d-b,translateY:c?e-f:0})},drawScrollbarButton:function(a){var b=
-this.renderer,e=this.scrollbarButtons,m=this.options,c=this.size,k;k=b.g().add(this.group);e.push(k);k=b.rect().addClass("highcharts-scrollbar-button").add(k);this.chart.styledMode||k.attr({stroke:m.buttonBorderColor,"stroke-width":m.buttonBorderWidth,fill:m.buttonBackgroundColor});k.attr(k.crisp({x:-.5,y:-.5,width:c+1,height:c+1,r:m.buttonBorderRadius},k.strokeWidth()));k=b.path(d(["M",c/2+(a?-1:1),c/2-3,"L",c/2+(a?-1:1),c/2+3,"L",c/2+(a?2:-2),c/2],m.vertical)).addClass("highcharts-scrollbar-arrow").add(e[a]);
-this.chart.styledMode||k.attr({fill:m.buttonArrowColor})},setRange:function(a,b){var f=this.options,d=f.vertical,c=f.minWidth,k=this.barWidth,e,h,y=!this.rendered||this.hasDragged||this.chart.navigator&&this.chart.navigator.hasDragged?"attr":"animate";G(k)&&(a=Math.max(a,0),e=Math.ceil(k*a),this.calculatedWidth=h=p(k*Math.min(b,1)-e),h<c&&(e=(k-c+h)*a,h=c),c=Math.floor(e+this.xOffset+this.yOffset),k=h/2-.5,this.from=a,this.to=b,d?(this.scrollbarGroup[y]({translateY:c}),this.scrollbar[y]({height:h}),
-this.scrollbarRifles[y]({translateY:k}),this.scrollbarTop=c,this.scrollbarLeft=0):(this.scrollbarGroup[y]({translateX:c}),this.scrollbar[y]({width:h}),this.scrollbarRifles[y]({translateX:k}),this.scrollbarLeft=c,this.scrollbarTop=0),12>=h?this.scrollbarRifles.hide():this.scrollbarRifles.show(!0),!1===f.showFull&&(0>=a&&1<=b?this.group.hide():this.group.show()),this.rendered=!0)},initEvents:function(){var a=this;a.mouseMoveHandler=function(b){var f=a.chart.pointer.normalize(b),e=a.options.vertical?
-"chartY":"chartX",c=a.initPositions;!a.grabbedCenter||b.touches&&0===b.touches[0][e]||(f=a.cursorToScrollbarPosition(f)[e],e=a[e],e=f-e,a.hasDragged=!0,a.updatePosition(c[0]+e,c[1]+e),a.hasDragged&&w(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b}))};a.mouseUpHandler=function(b){a.hasDragged&&w(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b});a.grabbedCenter=a.hasDragged=a.chartX=a.chartY=null};a.mouseDownHandler=function(b){b=a.chart.pointer.normalize(b);
-b=a.cursorToScrollbarPosition(b);a.chartX=b.chartX;a.chartY=b.chartY;a.initPositions=[a.from,a.to];a.grabbedCenter=!0};a.buttonToMinClick=function(b){var f=p(a.to-a.from)*a.options.step;a.updatePosition(p(a.from-f),p(a.to-f));w(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.buttonToMaxClick=function(b){var f=(a.to-a.from)*a.options.step;a.updatePosition(a.from+f,a.to+f);w(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.trackClick=function(b){var f=a.chart.pointer.normalize(b),
-e=a.to-a.from,c=a.y+a.scrollbarTop,k=a.x+a.scrollbarLeft;a.options.vertical&&f.chartY>c||!a.options.vertical&&f.chartX>k?a.updatePosition(a.from+e,a.to+e):a.updatePosition(a.from-e,a.to-e);w(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})}},cursorToScrollbarPosition:function(a){var b=this.options,b=b.minWidth>this.calculatedWidth?b.minWidth:0;return{chartX:(a.chartX-this.x-this.xOffset)/(this.barWidth-b),chartY:(a.chartY-this.y-this.yOffset)/(this.barWidth-b)}},updatePosition:function(a,
-b){1<b&&(a=p(1-p(b-a)),b=1);0>a&&(b=p(b-a),a=0);this.from=a;this.to=b},update:function(a){this.destroy();this.init(this.chart.renderer,z(!0,this.options,a),this.chart)},addEvents:function(){var a=this.options.inverted?[1,0]:[0,1],b=this.scrollbarButtons,e=this.scrollbarGroup.element,d=this.mouseDownHandler,c=this.mouseMoveHandler,k=this.mouseUpHandler,a=[[b[a[0]].element,"click",this.buttonToMinClick],[b[a[1]].element,"click",this.buttonToMaxClick],[this.track.element,"click",this.trackClick],[e,
-"mousedown",d],[e.ownerDocument,"mousemove",c],[e.ownerDocument,"mouseup",k]];A&&a.push([e,"touchstart",d],[e.ownerDocument,"touchmove",c],[e.ownerDocument,"touchend",k]);a.forEach(function(a){n.apply(null,a)});this._events=a},removeEvents:function(){this._events.forEach(function(a){e.apply(null,a)});this._events.length=0},destroy:function(){var a=this.chart.scroller;this.removeEvents();["track","scrollbarRifles","scrollbar","scrollbarGroup","group"].forEach(function(a){this[a]&&this[a].destroy&&
-(this[a]=this[a].destroy())},this);a&&this===a.scrollbar&&(a.scrollbar=null,B(a.scrollbarButtons))}};n(E,"afterInit",function(){var a=this;a.options&&a.options.scrollbar&&a.options.scrollbar.enabled&&(a.options.scrollbar.vertical=!a.horiz,a.options.startOnTick=a.options.endOnTick=!1,a.scrollbar=new D(a.chart.renderer,a.options.scrollbar,a.chart),n(a.scrollbar,"changed",function(b){var e=Math.min(F(a.options.min,a.min),a.min,a.dataMin),d=Math.max(F(a.options.max,a.max),a.max,a.dataMax)-e,c;a.horiz&&
-!a.reversed||!a.horiz&&a.reversed?(c=e+d*this.to,e+=d*this.from):(c=e+d*(1-this.from),e+=d*(1-this.to));a.setExtremes(e,c,!0,!1,b)}))});n(E,"afterRender",function(){var a=Math.min(F(this.options.min,this.min),this.min,F(this.dataMin,this.min)),b=Math.max(F(this.options.max,this.max),this.max,F(this.dataMax,this.max)),e=this.scrollbar,d=this.titleOffset||0;if(e){this.horiz?(e.position(this.left,this.top+this.height+2+this.chart.scrollbarsOffsets[1]+(this.opposite?0:d+this.axisTitleMargin+this.offset),
-this.width,this.height),d=1):(e.position(this.left+this.width+2+this.chart.scrollbarsOffsets[0]+(this.opposite?d+this.axisTitleMargin+this.offset:0),this.top,this.width,this.height),d=0);if(!this.opposite&&!this.horiz||this.opposite&&this.horiz)this.chart.scrollbarsOffsets[d]+=this.scrollbar.size+this.scrollbar.options.margin;isNaN(a)||isNaN(b)||!G(this.min)||!G(this.max)?e.setRange(0,0):(d=(this.min-a)/(b-a),a=(this.max-a)/(b-a),this.horiz&&!this.reversed||!this.horiz&&this.reversed?e.setRange(d,
-a):e.setRange(1-a,1-d))}});n(E,"afterGetOffset",function(){var a=this.horiz?2:1,b=this.scrollbar;b&&(this.chart.scrollbarsOffsets=[0,0],this.chart.axisOffset[a]+=b.size+b.options.margin)});b.Scrollbar=D})(H);(function(b){function D(a){this.init(a)}var n=b.addEvent,E=b.Axis,p=b.Chart,C=b.color,G=b.defaultOptions,B=b.defined,w=b.destroyObjectProperties,A=b.erase,z=b.error,F=b.extend,e=b.hasTouch,d=b.isArray,l=b.isNumber,a=b.isObject,f=b.isTouchDevice,u=b.merge,m=b.pick,c=b.removeEvent,k=b.Scrollbar,
-q=b.Series,h=b.seriesTypes,y=b.wrap,r=[].concat(b.defaultDataGroupingUnits),x=function(a){var b=[].filter.call(arguments,l);if(b.length)return Math[a].apply(0,b)};r[4]=["day",[1,2,3,4]];r[5]=["week",[1,2,3]];h=void 0===h.areaspline?"line":"areaspline";F(G,{navigator:{height:40,margin:25,maskInside:!0,handles:{width:7,height:15,symbols:["navigator-handle","navigator-handle"],enabled:!0,lineWidth:1,backgroundColor:"#f2f2f2",borderColor:"#999999"},maskFill:C("#6685c2").setOpacity(.3).get(),outlineColor:"#cccccc",
-outlineWidth:1,series:{type:h,fillOpacity:.05,lineWidth:1,compare:null,dataGrouping:{approximation:"average",enabled:!0,groupPixelWidth:2,smoothed:!0,units:r},dataLabels:{enabled:!1,zIndex:2},id:"highcharts-navigator-series",className:"highcharts-navigator-series",lineColor:null,marker:{enabled:!1},pointRange:0,threshold:null},xAxis:{overscroll:0,className:"highcharts-navigator-xaxis",tickLength:0,lineWidth:0,gridLineColor:"#e6e6e6",gridLineWidth:1,tickPixelInterval:200,labels:{align:"left",style:{color:"#999999"},
-x:3,y:-4},crosshair:!1},yAxis:{className:"highcharts-navigator-yaxis",gridLineWidth:0,startOnTick:!1,endOnTick:!1,minPadding:.1,maxPadding:.1,labels:{enabled:!1},crosshair:!1,title:{text:null},tickLength:0,tickWidth:0}}});b.Renderer.prototype.symbols["navigator-handle"]=function(a,b,c,e,d){a=d.width/2;b=Math.round(a/3)+.5;d=d.height;return["M",-a-1,.5,"L",a,.5,"L",a,d+.5,"L",-a-1,d+.5,"L",-a-1,.5,"M",-b,4,"L",-b,d-3,"M",b-1,4,"L",b-1,d-3]};D.prototype={drawHandle:function(a,b,c,e){var g=this.navigatorOptions.handles.height;
-this.handles[b][e](c?{translateX:Math.round(this.left+this.height/2),translateY:Math.round(this.top+parseInt(a,10)+.5-g)}:{translateX:Math.round(this.left+parseInt(a,10)),translateY:Math.round(this.top+this.height/2-g/2-1)})},drawOutline:function(a,b,c,e){var g=this.navigatorOptions.maskInside,t=this.outline.strokeWidth(),v=t/2,t=t%2/2,d=this.outlineHeight,k=this.scrollbarHeight,h=this.size,f=this.left-k,q=this.top;c?(f-=v,c=q+b+t,b=q+a+t,a=["M",f+d,q-k-t,"L",f+d,c,"L",f,c,"L",f,b,"L",f+d,b,"L",f+
-d,q+h+k].concat(g?["M",f+d,c-v,"L",f+d,b+v]:[])):(a+=f+k-t,b+=f+k-t,q+=v,a=["M",f,q,"L",a,q,"L",a,q+d,"L",b,q+d,"L",b,q,"L",f+h+2*k,q].concat(g?["M",a-v,q,"L",b+v,q]:[]));this.outline[e]({d:a})},drawMasks:function(a,b,c,e){var g=this.left,t=this.top,v=this.height,d,k,h,f;c?(h=[g,g,g],f=[t,t+a,t+b],k=[v,v,v],d=[a,b-a,this.size-b]):(h=[g,g+a,g+b],f=[t,t,t],k=[a,b-a,this.size-b],d=[v,v,v]);this.shades.forEach(function(a,b){a[e]({x:h[b],y:f[b],width:k[b],height:d[b]})})},renderElements:function(){var a=
-this,b=a.navigatorOptions,c=b.maskInside,e=a.chart,d=e.renderer,k,h={cursor:e.inverted?"ns-resize":"ew-resize"};a.navigatorGroup=k=d.g("navigator").attr({zIndex:8,visibility:"hidden"}).add();[!c,c,!c].forEach(function(g,c){a.shades[c]=d.rect().addClass("highcharts-navigator-mask"+(1===c?"-inside":"-outside")).add(k);e.styledMode||a.shades[c].attr({fill:g?b.maskFill:"rgba(0,0,0,0)"}).css(1===c&&h)});a.outline=d.path().addClass("highcharts-navigator-outline").add(k);e.styledMode||a.outline.attr({"stroke-width":b.outlineWidth,
-stroke:b.outlineColor});b.handles.enabled&&[0,1].forEach(function(c){b.handles.inverted=e.inverted;a.handles[c]=d.symbol(b.handles.symbols[c],-b.handles.width/2-1,0,b.handles.width,b.handles.height,b.handles);a.handles[c].attr({zIndex:7-c}).addClass("highcharts-navigator-handle highcharts-navigator-handle-"+["left","right"][c]).add(k);if(!e.styledMode){var g=b.handles;a.handles[c].attr({fill:g.backgroundColor,stroke:g.borderColor,"stroke-width":g.lineWidth}).css(h)}})},update:function(b){(this.series||
-[]).forEach(function(b){b.baseSeries&&delete b.baseSeries.navigatorSeries});this.destroy();u(!0,this.chart.options.navigator,this.options,b);this.init(this.chart)},render:function(a,c,e,d){var g=this.chart,t,v,k=this.scrollbarHeight,h,f=this.xAxis;t=f.fake?g.xAxis[0]:f;var q=this.navigatorEnabled,r,x=this.rendered;v=g.inverted;var y,K=g.xAxis[0].minRange,n=g.xAxis[0].options.maxRange;if(!this.hasDragged||B(e)){if(!l(a)||!l(c))if(x)e=0,d=m(f.width,t.width);else return;this.left=m(f.left,g.plotLeft+
-k+(v?g.plotWidth:0));this.size=r=h=m(f.len,(v?g.plotHeight:g.plotWidth)-2*k);g=v?k:h+2*k;e=m(e,f.toPixels(a,!0));d=m(d,f.toPixels(c,!0));l(e)&&Infinity!==Math.abs(e)||(e=0,d=g);a=f.toValue(e,!0);c=f.toValue(d,!0);y=Math.abs(b.correctFloat(c-a));y<K?this.grabbedLeft?e=f.toPixels(c-K,!0):this.grabbedRight&&(d=f.toPixels(a+K,!0)):B(n)&&y>n&&(this.grabbedLeft?e=f.toPixels(c-n,!0):this.grabbedRight&&(d=f.toPixels(a+n,!0)));this.zoomedMax=Math.min(Math.max(e,d,0),r);this.zoomedMin=Math.min(Math.max(this.fixedWidth?
-this.zoomedMax-this.fixedWidth:Math.min(e,d),0),r);this.range=this.zoomedMax-this.zoomedMin;r=Math.round(this.zoomedMax);e=Math.round(this.zoomedMin);q&&(this.navigatorGroup.attr({visibility:"visible"}),x=x&&!this.hasDragged?"animate":"attr",this.drawMasks(e,r,v,x),this.drawOutline(e,r,v,x),this.navigatorOptions.handles.enabled&&(this.drawHandle(e,0,v,x),this.drawHandle(r,1,v,x)));this.scrollbar&&(v?(v=this.top-k,t=this.left-k+(q||!t.opposite?0:(t.titleOffset||0)+t.axisTitleMargin),k=h+2*k):(v=this.top+
-(q?this.height:-k),t=this.left-k),this.scrollbar.position(t,v,g,k),this.scrollbar.setRange(this.zoomedMin/(h||1),this.zoomedMax/(h||1)));this.rendered=!0}},addMouseEvents:function(){var a=this,b=a.chart,c=b.container,d=[],k,f;a.mouseMoveHandler=k=function(b){a.onMouseMove(b)};a.mouseUpHandler=f=function(b){a.onMouseUp(b)};d=a.getPartsEvents("mousedown");d.push(n(c,"mousemove",k),n(c.ownerDocument,"mouseup",f));e&&(d.push(n(c,"touchmove",k),n(c.ownerDocument,"touchend",f)),d.concat(a.getPartsEvents("touchstart")));
-a.eventsToUnbind=d;a.series&&a.series[0]&&d.push(n(a.series[0].xAxis,"foundExtremes",function(){b.navigator.modifyNavigatorAxisExtremes()}))},getPartsEvents:function(a){var b=this,c=[];["shades","handles"].forEach(function(g){b[g].forEach(function(e,d){c.push(n(e.element,a,function(a){b[g+"Mousedown"](a,d)}))})});return c},shadesMousedown:function(a,b){a=this.chart.pointer.normalize(a);var c=this.chart,g=this.xAxis,e=this.zoomedMin,d=this.left,t=this.size,k=this.range,f=a.chartX,h,q;c.inverted&&(f=
-a.chartY,d=this.top);1===b?(this.grabbedCenter=f,this.fixedWidth=k,this.dragOffset=f-e):(a=f-d-k/2,0===b?a=Math.max(0,a):2===b&&a+k>=t&&(a=t-k,this.reversedExtremes?(a-=k,q=this.getUnionExtremes().dataMin):h=this.getUnionExtremes().dataMax),a!==e&&(this.fixedWidth=k,b=g.toFixedRange(a,a+k,q,h),B(b.min)&&c.xAxis[0].setExtremes(Math.min(b.min,b.max),Math.max(b.min,b.max),!0,null,{trigger:"navigator"})))},handlesMousedown:function(a,b){this.chart.pointer.normalize(a);a=this.chart;var c=a.xAxis[0],g=
-this.reversedExtremes;0===b?(this.grabbedLeft=!0,this.otherHandlePos=this.zoomedMax,this.fixedExtreme=g?c.min:c.max):(this.grabbedRight=!0,this.otherHandlePos=this.zoomedMin,this.fixedExtreme=g?c.max:c.min);a.fixedRange=null},onMouseMove:function(a){var c=this,g=c.chart,e=c.left,d=c.navigatorSize,k=c.range,h=c.dragOffset,q=g.inverted;a.touches&&0===a.touches[0].pageX||(a=g.pointer.normalize(a),g=a.chartX,q&&(e=c.top,g=a.chartY),c.grabbedLeft?(c.hasDragged=!0,c.render(0,0,g-e,c.otherHandlePos)):c.grabbedRight?
-(c.hasDragged=!0,c.render(0,0,c.otherHandlePos,g-e)):c.grabbedCenter&&(c.hasDragged=!0,g<h?g=h:g>d+h-k&&(g=d+h-k),c.render(0,0,g-h,g-h+k)),c.hasDragged&&c.scrollbar&&m(c.scrollbar.options.liveRedraw,b.svg&&!f&&!this.chart.isBoosting)&&(a.DOMType=a.type,setTimeout(function(){c.onMouseUp(a)},0)))},onMouseUp:function(a){var b=this.chart,c=this.xAxis,g=this.scrollbar,e,d,k=a.DOMEvent||a;(!this.hasDragged||g&&g.hasDragged)&&"scrollbar"!==a.trigger||(g=this.getUnionExtremes(),this.zoomedMin===this.otherHandlePos?
-e=this.fixedExtreme:this.zoomedMax===this.otherHandlePos&&(d=this.fixedExtreme),this.zoomedMax===this.size&&(d=this.reversedExtremes?g.dataMin:g.dataMax),0===this.zoomedMin&&(e=this.reversedExtremes?g.dataMax:g.dataMin),c=c.toFixedRange(this.zoomedMin,this.zoomedMax,e,d),B(c.min)&&b.xAxis[0].setExtremes(Math.min(c.min,c.max),Math.max(c.min,c.max),!0,this.hasDragged?!1:null,{trigger:"navigator",triggerOp:"navigator-drag",DOMEvent:k}));"mousemove"!==a.DOMType&&(this.grabbedLeft=this.grabbedRight=this.grabbedCenter=
-this.fixedWidth=this.fixedExtreme=this.otherHandlePos=this.hasDragged=this.dragOffset=null)},removeEvents:function(){this.eventsToUnbind&&(this.eventsToUnbind.forEach(function(a){a()}),this.eventsToUnbind=void 0);this.removeBaseSeriesEvents()},removeBaseSeriesEvents:function(){var a=this.baseSeries||[];this.navigatorEnabled&&a[0]&&(!1!==this.navigatorOptions.adaptToUpdatedData&&a.forEach(function(a){c(a,"updatedData",this.updatedDataHandler)},this),a[0].xAxis&&c(a[0].xAxis,"foundExtremes",this.modifyBaseAxisExtremes))},
-init:function(a){var b=a.options,c=b.navigator,g=c.enabled,e=b.scrollbar,d=e.enabled,b=g?c.height:0,f=d?e.height:0;this.handles=[];this.shades=[];this.chart=a;this.setBaseSeries();this.height=b;this.scrollbarHeight=f;this.scrollbarEnabled=d;this.navigatorEnabled=g;this.navigatorOptions=c;this.scrollbarOptions=e;this.outlineHeight=b+f;this.opposite=m(c.opposite,!g&&a.inverted);var h=this,g=h.baseSeries,e=a.xAxis.length,d=a.yAxis.length,q=g&&g[0]&&g[0].xAxis||a.xAxis[0]||{options:{}};a.isDirtyBox=!0;
-h.navigatorEnabled?(h.xAxis=new E(a,u({breaks:q.options.breaks,ordinal:q.options.ordinal},c.xAxis,{id:"navigator-x-axis",yAxis:"navigator-y-axis",isX:!0,type:"datetime",index:e,isInternal:!0,offset:0,keepOrdinalPadding:!0,startOnTick:!1,endOnTick:!1,minPadding:0,maxPadding:0,zoomEnabled:!1},a.inverted?{offsets:[f,0,-f,0],width:b}:{offsets:[0,-f,0,f],height:b})),h.yAxis=new E(a,u(c.yAxis,{id:"navigator-y-axis",alignTicks:!1,offset:0,index:d,isInternal:!0,zoomEnabled:!1},a.inverted?{width:b}:{height:b})),
-g||c.series.data?h.updateNavigatorSeries(!1):0===a.series.length&&(h.unbindRedraw=n(a,"beforeRedraw",function(){0<a.series.length&&!h.series&&(h.setBaseSeries(),h.unbindRedraw())})),h.reversedExtremes=a.inverted&&!h.xAxis.reversed||!a.inverted&&h.xAxis.reversed,h.renderElements(),h.addMouseEvents()):h.xAxis={translate:function(b,c){var g=a.xAxis[0],e=g.getExtremes(),d=g.len-2*f,h=x("min",g.options.min,e.dataMin),g=x("max",g.options.max,e.dataMax)-h;return c?b*g/d+h:d*(b-h)/g},toPixels:function(a){return this.translate(a)},
-toValue:function(a){return this.translate(a,!0)},toFixedRange:E.prototype.toFixedRange,fake:!0};a.options.scrollbar.enabled&&(a.scrollbar=h.scrollbar=new k(a.renderer,u(a.options.scrollbar,{margin:h.navigatorEnabled?0:10,vertical:a.inverted}),a),n(h.scrollbar,"changed",function(b){var c=h.size,g=c*this.to,c=c*this.from;h.hasDragged=h.scrollbar.hasDragged;h.render(0,0,c,g);(a.options.scrollbar.liveRedraw||"mousemove"!==b.DOMType&&"touchmove"!==b.DOMType)&&setTimeout(function(){h.onMouseUp(b)})}));
-h.addBaseSeriesEvents();h.addChartEvents()},getUnionExtremes:function(a){var b=this.chart.xAxis[0],c=this.xAxis,g=c.options,e=b.options,d;a&&null===b.dataMin||(d={dataMin:m(g&&g.min,x("min",e.min,b.dataMin,c.dataMin,c.min)),dataMax:m(g&&g.max,x("max",e.max,b.dataMax,c.dataMax,c.max))});return d},setBaseSeries:function(a,b){var c=this.chart,g=this.baseSeries=[];a=a||c.options&&c.options.navigator.baseSeries||0;(c.series||[]).forEach(function(b,c){b.options.isInternal||!b.options.showInNavigator&&(c!==
-a&&b.options.id!==a||!1===b.options.showInNavigator)||g.push(b)});this.xAxis&&!this.xAxis.fake&&this.updateNavigatorSeries(!0,b)},updateNavigatorSeries:function(a,e){var g=this,h=g.chart,k=g.baseSeries,f,q,t=g.navigatorOptions.series,r,x={enableMouseTracking:!1,index:null,linkedTo:null,group:"nav",padXAxis:!1,xAxis:"navigator-x-axis",yAxis:"navigator-y-axis",showInLegend:!1,stacking:!1,isInternal:!0},y=g.series=(g.series||[]).filter(function(a){var b=a.baseSeries;return 0>k.indexOf(b)?(b&&(c(b,"updatedData",
-g.updatedDataHandler),delete b.navigatorSeries),a.chart&&a.destroy(),!1):!0});k&&k.length&&k.forEach(function(a){var b=a.navigatorSeries,c=F({color:a.color,visible:a.visible},d(t)?G.navigator.series:t);b&&!1===g.navigatorOptions.adaptToUpdatedData||(x.name="Navigator "+k.length,f=a.options||{},r=f.navigatorOptions||{},q=u(f,x,c,r),c=r.data||c.data,g.hasNavigatorData=g.hasNavigatorData||!!c,q.data=c||f.data&&f.data.slice(0),b&&b.options?b.update(q,e):(a.navigatorSeries=h.initSeries(q),a.navigatorSeries.baseSeries=
-a,y.push(a.navigatorSeries)))});if(t.data&&(!k||!k.length)||d(t))g.hasNavigatorData=!1,t=b.splat(t),t.forEach(function(a,b){x.name="Navigator "+(y.length+1);q=u(G.navigator.series,{color:h.series[b]&&!h.series[b].options.isInternal&&h.series[b].color||h.options.colors[b]||h.options.colors[0]},x,a);q.data=a.data;q.data&&(g.hasNavigatorData=!0,y.push(h.initSeries(q)))});a&&this.addBaseSeriesEvents()},addBaseSeriesEvents:function(){var a=this,b=a.baseSeries||[];b[0]&&b[0].xAxis&&n(b[0].xAxis,"foundExtremes",
-this.modifyBaseAxisExtremes);b.forEach(function(b){n(b,"show",function(){this.navigatorSeries&&this.navigatorSeries.setVisible(!0,!1)});n(b,"hide",function(){this.navigatorSeries&&this.navigatorSeries.setVisible(!1,!1)});!1!==this.navigatorOptions.adaptToUpdatedData&&b.xAxis&&n(b,"updatedData",this.updatedDataHandler);n(b,"remove",function(){this.navigatorSeries&&(A(a.series,this.navigatorSeries),B(this.navigatorSeries.options)&&this.navigatorSeries.remove(!1),delete this.navigatorSeries)})},this)},
-getBaseSeriesMin:function(a){return this.baseSeries.reduce(function(a,b){return Math.min(a,b.xData[0])},a)},modifyNavigatorAxisExtremes:function(){var a=this.xAxis,b;a.getExtremes&&(!(b=this.getUnionExtremes(!0))||b.dataMin===a.min&&b.dataMax===a.max||(a.min=b.dataMin,a.max=b.dataMax))},modifyBaseAxisExtremes:function(){var a=this.chart.navigator,b=this.getExtremes(),c=b.dataMin,e=b.dataMax,b=b.max-b.min,d=a.stickToMin,h=a.stickToMax,k=m(this.options.overscroll,0),f,q,r=a.series&&a.series[0],x=!!this.setExtremes;
-this.eventArgs&&"rangeSelectorButton"===this.eventArgs.trigger||(d&&(q=c,f=q+b),h&&(f=e+k,d||(q=Math.max(f-b,a.getBaseSeriesMin(r&&r.xData?r.xData[0]:-Number.MAX_VALUE)))),x&&(d||h)&&l(q)&&(this.min=this.userMin=q,this.max=this.userMax=f));a.stickToMin=a.stickToMax=null},updatedDataHandler:function(){var a=this.chart.navigator,b=this.navigatorSeries,c=a.getBaseSeriesMin(this.xData[0]);a.stickToMax=a.reversedExtremes?0===Math.round(a.zoomedMin):Math.round(a.zoomedMax)>=Math.round(a.size);a.stickToMin=
-l(this.xAxis.min)&&this.xAxis.min<=c&&(!this.chart.fixedRange||!a.stickToMax);b&&!a.hasNavigatorData&&(b.options.pointStart=this.xData[0],b.setData(this.options.data,!1,null,!1))},addChartEvents:function(){this.eventsToUnbind||(this.eventsToUnbind=[]);this.eventsToUnbind.push(n(this.chart,"redraw",function(){var a=this.navigator,b=a&&(a.baseSeries&&a.baseSeries[0]&&a.baseSeries[0].xAxis||a.scrollbar&&this.xAxis[0]);b&&a.render(b.min,b.max)}),n(this.chart,"getMargins",function(){var a=this.navigator,
-b=a.opposite?"plotTop":"marginBottom";this.inverted&&(b=a.opposite?"marginRight":"plotLeft");this[b]=(this[b]||0)+(a.navigatorEnabled||!this.inverted?a.outlineHeight:0)+a.navigatorOptions.margin}))},destroy:function(){this.removeEvents();this.xAxis&&(A(this.chart.xAxis,this.xAxis),A(this.chart.axes,this.xAxis));this.yAxis&&(A(this.chart.yAxis,this.yAxis),A(this.chart.axes,this.yAxis));(this.series||[]).forEach(function(a){a.destroy&&a.destroy()});"series xAxis yAxis shades outline scrollbarTrack scrollbarRifles scrollbarGroup scrollbar navigatorGroup rendered".split(" ").forEach(function(a){this[a]&&
-this[a].destroy&&this[a].destroy();this[a]=null},this);[this.handles].forEach(function(a){w(a)},this)}};b.Navigator=D;y(E.prototype,"zoom",function(a,b,c){var e=this.chart.options,d=e.chart.zoomType,g=e.chart.pinchType,h=e.navigator,e=e.rangeSelector,k;this.isXAxis&&(h&&h.enabled||e&&e.enabled)&&("y"===d?k=!1:(!f&&"xy"===d||f&&"xy"===g)&&this.options.range&&(d=this.previousZoom,B(b)?this.previousZoom=[this.min,this.max]:d&&(b=d[0],c=d[1],delete this.previousZoom)));return void 0!==k?k:a.call(this,
-b,c)});n(p,"beforeShowResetZoom",function(){var a=this.options,b=a.navigator,c=a.rangeSelector;if((b&&b.enabled||c&&c.enabled)&&(!f&&"x"===a.chart.zoomType||f&&"x"===a.chart.pinchType))return!1});n(p,"beforeRender",function(){var a=this.options;if(a.navigator.enabled||a.scrollbar.enabled)this.scroller=this.navigator=new D(this)});n(p,"afterSetChartSize",function(){var a=this.legend,b=this.navigator,c,e,d,h;b&&(e=a&&a.options,d=b.xAxis,h=b.yAxis,c=b.scrollbarHeight,this.inverted?(b.left=b.opposite?
-this.chartWidth-c-b.height:this.spacing[3]+c,b.top=this.plotTop+c):(b.left=this.plotLeft+c,b.top=b.navigatorOptions.top||this.chartHeight-b.height-c-this.spacing[2]-(this.rangeSelector&&this.extraBottomMargin?this.rangeSelector.getHeight():0)-(e&&"bottom"===e.verticalAlign&&e.enabled&&!e.floating?a.legendHeight+m(e.margin,10):0)),d&&h&&(this.inverted?d.options.left=h.options.left=b.left:d.options.top=h.options.top=b.top,d.setAxisSize(),h.setAxisSize()))});n(p,"update",function(a){var b=a.options.navigator||
-{},c=a.options.scrollbar||{};this.navigator||this.scroller||!b.enabled&&!c.enabled||(u(!0,this.options.navigator,b),u(!0,this.options.scrollbar,c),delete a.options.navigator,delete a.options.scrollbar)});n(p,"afterUpdate",function(){this.navigator||this.scroller||!this.options.navigator.enabled&&!this.options.scrollbar.enabled||(this.scroller=this.navigator=new D(this))});y(q.prototype,"addPoint",function(b,c,e,d,h){var g=this.options.turboThreshold;g&&this.xData.length>g&&a(c,!0)&&this.chart.navigator&&
-z(20,!0,this.chart);b.call(this,c,e,d,h)});n(p,"afterAddSeries",function(){this.navigator&&this.navigator.setBaseSeries(null,!1)});n(q,"afterUpdate",function(){this.chart.navigator&&!this.options.isInternal&&this.chart.navigator.setBaseSeries(null,!1)});p.prototype.callbacks.push(function(a){var b=a.navigator;b&&a.xAxis[0]&&(a=a.xAxis[0].getExtremes(),b.render(a.min,a.max))})})(H);(function(b){function D(a){this.init(a)}var n=b.addEvent,E=b.Axis,p=b.Chart,C=b.css,G=b.createElement,B=b.defaultOptions,
-w=b.defined,A=b.destroyObjectProperties,z=b.discardElement,F=b.extend,e=b.fireEvent,d=b.isNumber,l=b.merge,a=b.pick,f=b.pInt,u=b.splat,m=b.wrap;F(B,{rangeSelector:{verticalAlign:"top",buttonTheme:{width:28,height:18,padding:2,zIndex:7},floating:!1,x:0,y:0,height:void 0,inputPosition:{align:"right",x:0,y:0},buttonPosition:{align:"left",x:0,y:0},labelStyle:{color:"#666666"}}});B.lang=l(B.lang,{rangeSelectorZoom:"Zoom",rangeSelectorFrom:"From",rangeSelectorTo:"To"});D.prototype={clickButton:function(b,
-e){var c=this,h=c.chart,k=c.buttonOptions[b],f=h.xAxis[0],x=h.scroller&&h.scroller.getUnionExtremes()||f||{},g=x.dataMin,t=x.dataMax,v,l=f&&Math.round(Math.min(f.max,a(t,f.max))),m=k.type,p,x=k._range,w,z,B,A=k.dataGrouping;if(null!==g&&null!==t){h.fixedRange=x;A&&(this.forcedDataGrouping=!0,E.prototype.setDataGrouping.call(f||{chart:this.chart},A,!1),this.frozenStates=k.preserveDataGrouping);if("month"===m||"year"===m)f?(m={range:k,max:l,chart:h,dataMin:g,dataMax:t},v=f.minFromRange.call(m),d(m.newMax)&&
-(l=m.newMax)):x=k;else if(x)v=Math.max(l-x,g),l=Math.min(v+x,t);else if("ytd"===m)if(f)void 0===t&&(g=Number.MAX_VALUE,t=Number.MIN_VALUE,h.series.forEach(function(a){a=a.xData;g=Math.min(a[0],g);t=Math.max(a[a.length-1],t)}),e=!1),l=c.getYTDExtremes(t,g,h.time.useUTC),v=w=l.min,l=l.max;else{n(h,"beforeRender",function(){c.clickButton(b)});return}else"all"===m&&f&&(v=g,l=t);v+=k._offsetMin;l+=k._offsetMax;c.setSelected(b);f?f.setExtremes(v,l,a(e,1),null,{trigger:"rangeSelectorButton",rangeSelectorButton:k}):
-(p=u(h.options.xAxis)[0],B=p.range,p.range=x,z=p.min,p.min=w,n(h,"load",function(){p.range=B;p.min=z}))}},setSelected:function(a){this.selected=this.options.selected=a},defaultButtons:[{type:"month",count:1,text:"1m"},{type:"month",count:3,text:"3m"},{type:"month",count:6,text:"6m"},{type:"ytd",text:"YTD"},{type:"year",count:1,text:"1y"},{type:"all",text:"All"}],init:function(a){var b=this,c=a.options.rangeSelector,d=c.buttons||[].concat(b.defaultButtons),f=c.selected,r=function(){var a=b.minInput,
-c=b.maxInput;a&&a.blur&&e(a,"blur");c&&c.blur&&e(c,"blur")};b.chart=a;b.options=c;b.buttons=[];a.extraTopMargin=c.height;b.buttonOptions=d;this.unMouseDown=n(a.container,"mousedown",r);this.unResize=n(a,"resize",r);d.forEach(b.computeButtonRange);void 0!==f&&d[f]&&this.clickButton(f,!1);n(a,"load",function(){a.xAxis&&a.xAxis[0]&&n(a.xAxis[0],"setExtremes",function(c){this.max-this.min!==a.fixedRange&&"rangeSelectorButton"!==c.trigger&&"updatedData"!==c.trigger&&b.forcedDataGrouping&&!b.frozenStates&&
-this.setDataGrouping(!1,!1)})})},updateButtonStates:function(){var a=this,b=this.chart,e=b.xAxis[0],h=Math.round(e.max-e.min),f=!e.hasVisibleSeries,r=b.scroller&&b.scroller.getUnionExtremes()||e,x=r.dataMin,g=r.dataMax,b=a.getYTDExtremes(g,x,b.time.useUTC),l=b.min,v=b.max,m=a.selected,p=d(m),n=a.options.allButtonsEnabled,u=a.buttons;a.buttonOptions.forEach(function(b,c){var d=b._range,k=b.type,q=b.count||1,r=u[c],t=0;b=b._offsetMax-b._offsetMin;c=c===m;var y=d>g-x,w=d<e.minRange,I=!1,z=!1,d=d===h;
-("month"===k||"year"===k)&&h+36E5>=864E5*{month:28,year:365}[k]*q-b&&h-36E5<=864E5*{month:31,year:366}[k]*q+b?d=!0:"ytd"===k?(d=v-l+b===h,I=!c):"all"===k&&(d=e.max-e.min>=g-x,z=!c&&p&&d);k=!n&&(y||w||z||f);q=c&&d||d&&!p&&!I||c&&a.frozenStates;k?t=3:q&&(p=!0,t=2);r.state!==t&&r.setState(t)})},computeButtonRange:function(b){var c=b.type,e=b.count||1,d={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5};if(d[c])b._range=d[c]*e;else if("month"===c||"year"===c)b._range=864E5*{month:30,
-year:365}[c]*e;b._offsetMin=a(b.offsetMin,0);b._offsetMax=a(b.offsetMax,0);b._range+=b._offsetMax-b._offsetMin},setInputValue:function(a,b){var c=this.chart.options.rangeSelector,e=this.chart.time,d=this[a+"Input"];w(b)&&(d.previousValue=d.HCTime,d.HCTime=b);d.value=e.dateFormat(c.inputEditDateFormat||"%Y-%m-%d",d.HCTime);this[a+"DateBox"].attr({text:e.dateFormat(c.inputDateFormat||"%b %e, %Y",d.HCTime)})},showInput:function(a){var b=this.inputGroup,c=this[a+"DateBox"];C(this[a+"Input"],{left:b.translateX+
-c.x+"px",top:b.translateY+"px",width:c.width-2+"px",height:c.height-2+"px",border:"2px solid silver"})},hideInput:function(a){C(this[a+"Input"],{border:0,width:"1px",height:"1px"});this.setInputValue(a)},drawInput:function(a){function c(){var a=v.value,b=(x.inputDateParser||Date.parse)(a),c=h.xAxis[0],g=h.scroller&&h.scroller.xAxis?h.scroller.xAxis:c,k=g.dataMin,g=g.dataMax;b!==v.previousValue&&(v.previousValue=b,d(b)||(b=a.split("-"),b=Date.UTC(f(b[0]),f(b[1])-1,f(b[2]))),d(b)&&(h.time.useUTC||(b+=
-6E4*(new Date).getTimezoneOffset()),t?b>e.maxInput.HCTime?b=void 0:b<k&&(b=k):b<e.minInput.HCTime?b=void 0:b>g&&(b=g),void 0!==b&&c.setExtremes(t?b:c.min,t?c.max:b,void 0,void 0,{trigger:"rangeSelectorInput"})))}var e=this,h=e.chart,m=h.renderer.style||{},r=h.renderer,x=h.options.rangeSelector,g=e.div,t="min"===a,v,p,n=this.inputGroup;this[a+"Label"]=p=r.label(B.lang[t?"rangeSelectorFrom":"rangeSelectorTo"],this.inputGroup.offset).addClass("highcharts-range-label").attr({padding:2}).add(n);n.offset+=
-p.width+5;this[a+"DateBox"]=r=r.label("",n.offset).addClass("highcharts-range-input").attr({padding:2,width:x.inputBoxWidth||90,height:x.inputBoxHeight||17,"text-align":"center"}).on("click",function(){e.showInput(a);e[a+"Input"].focus()});h.styledMode||r.attr({stroke:x.inputBoxBorderColor||"#cccccc","stroke-width":1});r.add(n);n.offset+=r.width+(t?10:0);this[a+"Input"]=v=G("input",{name:a,className:"highcharts-range-selector",type:"text"},{top:h.plotTop+"px"},g);h.styledMode||(p.css(l(m,x.labelStyle)),
-r.css(l({color:"#333333"},m,x.inputStyle)),C(v,F({position:"absolute",border:0,width:"1px",height:"1px",padding:0,textAlign:"center",fontSize:m.fontSize,fontFamily:m.fontFamily,top:"-9999em"},x.inputStyle)));v.onfocus=function(){e.showInput(a)};v.onblur=function(){v===b.doc.activeElement&&(c(),e.hideInput(a))};v.onchange=c;v.onkeypress=function(a){13===a.keyCode&&c()}},getPosition:function(){var a=this.chart,b=a.options.rangeSelector,a="top"===b.verticalAlign?a.plotTop-a.axisOffset[0]:0;return{buttonTop:a+
-b.buttonPosition.y,inputTop:a+b.inputPosition.y-10}},getYTDExtremes:function(a,b,e){var c=this.chart.time,d=new c.Date(a),f=c.get("FullYear",d);e=e?c.Date.UTC(f,0,1):+new c.Date(f,0,1);b=Math.max(b||0,e);d=d.getTime();return{max:Math.min(a||d,d),min:b}},render:function(b,e){var c=this,d=c.chart,f=d.renderer,k=d.container,x=d.options,g=x.exporting&&!1!==x.exporting.enabled&&x.navigation&&x.navigation.buttonOptions,l=B.lang,v=c.div,m=x.rangeSelector,n=a(x.chart.style&&x.chart.style.zIndex,0)+1,x=m.floating,
-p=c.buttons,v=c.inputGroup,u=m.buttonTheme,w=m.buttonPosition,z=m.inputPosition,A=m.inputEnabled,C=u&&u.states,D=d.plotLeft,F,E=c.buttonGroup,H;H=c.rendered;var O=c.options.verticalAlign,Q=d.legend,R=Q&&Q.options,J=w.y,P=z.y,S=H||!1,T=S?"animate":"attr",N=0,L=0,M;if(!1!==m.enabled){H||(c.group=H=f.g("range-selector-group").attr({zIndex:7}).add(),c.buttonGroup=E=f.g("range-selector-buttons").add(H),c.zoomText=f.text(l.rangeSelectorZoom,0,15).add(E),d.styledMode||(c.zoomText.css(m.labelStyle),u["stroke-width"]=
-a(u["stroke-width"],0)),c.buttonOptions.forEach(function(a,b){p[b]=f.button(a.text,0,0,function(){var d=a.events&&a.events.click,e;d&&(e=d.call(a));!1!==e&&c.clickButton(b);c.isActive=!0},u,C&&C.hover,C&&C.select,C&&C.disabled).attr({"text-align":"center"}).add(E)}),!1!==A&&(c.div=v=G("div",null,{position:"relative",height:0,zIndex:n}),k.parentNode.insertBefore(v,k),c.inputGroup=v=f.g("input-group").add(H),v.offset=0,c.drawInput("min"),c.drawInput("max")));c.zoomText[T]({x:a(D+w.x,D)});F=a(D+w.x,
-D)+c.zoomText.getBBox().width+5;c.buttonOptions.forEach(function(b,c){p[c][T]({x:F});F+=p[c].width+a(m.buttonSpacing,5)});D=d.plotLeft-d.spacing[3];c.updateButtonStates();g&&this.titleCollision(d)&&"top"===O&&"right"===w.align&&w.y+E.getBBox().height-12<(g.y||0)+g.height&&(N=-40);"left"===w.align?M=w.x-d.spacing[3]:"right"===w.align&&(M=w.x+N-d.spacing[1]);E.align({y:w.y,width:E.getBBox().width,align:w.align,x:M},!0,d.spacingBox);c.group.placed=S;c.buttonGroup.placed=S;!1!==A&&(N=g&&this.titleCollision(d)&&
-"top"===O&&"right"===z.align&&z.y-v.getBBox().height-12<(g.y||0)+g.height+d.spacing[0]?-40:0,"left"===z.align?M=D:"right"===z.align&&(M=-Math.max(d.axisOffset[1],-N)),v.align({y:z.y,width:v.getBBox().width,align:z.align,x:z.x+M-2},!0,d.spacingBox),k=v.alignAttr.translateX+v.alignOptions.x-N+v.getBBox().x+2,g=v.alignOptions.width,l=E.alignAttr.translateX+E.getBBox().x,M=E.getBBox().width+20,(z.align===w.align||l+M>k&&k+g>l&&J<P+v.getBBox().height)&&v.attr({translateX:v.alignAttr.translateX+(d.axisOffset[1]>=
--N?0:-N),translateY:v.alignAttr.translateY+E.getBBox().height+10}),c.setInputValue("min",b),c.setInputValue("max",e),c.inputGroup.placed=S);c.group.align({verticalAlign:O},!0,d.spacingBox);b=c.group.getBBox().height+20;e=c.group.alignAttr.translateY;"bottom"===O&&(Q=R&&"bottom"===R.verticalAlign&&R.enabled&&!R.floating?Q.legendHeight+a(R.margin,10):0,b=b+Q-20,L=e-b-(x?0:m.y)-10);if("top"===O)x&&(L=0),d.titleOffset&&(L=d.titleOffset+d.options.title.margin),L+=d.margin[0]-d.spacing[0]||0;else if("middle"===
-O)if(P===J)L=0>P?e+void 0:e;else if(P||J)L=0>P||0>J?L-Math.min(P,J):e-b+NaN;c.group.translate(m.x,m.y+Math.floor(L));!1!==A&&(c.minInput.style.marginTop=c.group.translateY+"px",c.maxInput.style.marginTop=c.group.translateY+"px");c.rendered=!0}},getHeight:function(){var a=this.options,b=this.group,d=a.y,e=a.buttonPosition.y,a=a.inputPosition.y,b=b?b.getBBox(!0).height+13+d:0,d=Math.min(a,e);if(0>a&&0>e||0<a&&0<e)b+=Math.abs(d);return b},titleCollision:function(a){return!(a.options.title.text||a.options.subtitle.text)},
-update:function(a){var b=this.chart;l(!0,b.options.rangeSelector,a);this.destroy();this.init(b);b.rangeSelector.render()},destroy:function(){var a=this,d=a.minInput,e=a.maxInput;a.unMouseDown();a.unResize();A(a.buttons);d&&(d.onfocus=d.onblur=d.onchange=null);e&&(e.onfocus=e.onblur=e.onchange=null);b.objectEach(a,function(b,c){b&&"chart"!==c&&(b.destroy?b.destroy():b.nodeType&&z(this[c]));b!==D.prototype[c]&&(a[c]=null)},this)}};E.prototype.toFixedRange=function(b,e,f,h){var c=this.chart&&this.chart.fixedRange;
-b=a(f,this.translate(b,!0,!this.horiz));e=a(h,this.translate(e,!0,!this.horiz));f=c&&(e-b)/c;.7<f&&1.3>f&&(h?b=e-c:e=b+c);d(b)&&d(e)||(b=e=void 0);return{min:b,max:e}};E.prototype.minFromRange=function(){var b=this.range,e={month:"Month",year:"FullYear"}[b.type],f,h=this.max,l,r,x=function(a,b){var c=new Date(a),d=c["get"+e]();c["set"+e](d+b);d===c["get"+e]()&&c.setDate(0);return c.getTime()-a};d(b)?(f=h-b,r=b):(f=h+x(h,-b.count),this.chart&&(this.chart.fixedRange=h-f));l=a(this.dataMin,Number.MIN_VALUE);
-d(f)||(f=l);f<=l&&(f=l,void 0===r&&(r=x(f,b.count)),this.newMax=Math.min(f+r,this.dataMax));d(h)||(f=void 0);return f};n(p,"afterGetContainer",function(){this.options.rangeSelector.enabled&&(this.rangeSelector=new D(this))});m(p.prototype,"render",function(a,b,e){var c=this.axes,d=this.rangeSelector;d&&(c.forEach(function(a){a.updateNames();a.setScale()}),this.getAxisMargins(),d.render(),c=d.options.verticalAlign,d.options.floating||("bottom"===c?this.extraBottomMargin=!0:"middle"!==c&&(this.extraTopMargin=
-!0)));a.call(this,b,e)});n(p,"update",function(a){var b=a.options.rangeSelector;a=this.rangeSelector;var c=this.extraBottomMargin,d=this.extraTopMargin;b&&b.enabled&&!w(a)&&(this.options.rangeSelector.enabled=!0,this.rangeSelector=new D(this));this.extraTopMargin=this.extraBottomMargin=!1;a&&(a.render(),b=b&&b.verticalAlign||a.options&&a.options.verticalAlign,a.options.floating||("bottom"===b?this.extraBottomMargin=!0:"middle"!==b&&(this.extraTopMargin=!0)),this.extraBottomMargin!==c||this.extraTopMargin!==
-d)&&(this.isDirtyBox=!0)});m(p.prototype,"redraw",function(a,b,d){var c=this.rangeSelector;c&&!c.options.floating&&(c.render(),c=c.options.verticalAlign,"bottom"===c?this.extraBottomMargin=!0:"middle"!==c&&(this.extraTopMargin=!0));a.call(this,b,d)});n(p,"getMargins",function(){var a=this.rangeSelector;a&&(a=a.getHeight(),this.extraTopMargin&&(this.plotTop+=a),this.extraBottomMargin&&(this.marginBottom+=a))});p.prototype.callbacks.push(function(a){function b(){c=a.xAxis[0].getExtremes();d(c.min)&&
-e.render(c.min,c.max)}var c,e=a.rangeSelector,f,r;e&&(r=n(a.xAxis[0],"afterSetExtremes",function(a){e.render(a.min,a.max)}),f=n(a,"redraw",b),b());n(a,"destroy",function(){e&&(f(),r())})});b.RangeSelector=D})(H);(function(b){var D=b.addEvent,n=b.arrayMax,E=b.arrayMin,p=b.Axis,C=b.Chart,G=b.defined,B=b.extend,w=b.format,A=b.isNumber,z=b.isString,F=b.merge,e=b.pick,d=b.Point,l=b.Renderer,a=b.Series,f=b.splat,u=b.SVGRenderer,m=b.VMLRenderer,c=b.wrap,k=a.prototype,q=k.init,h=k.processData,y=d.prototype.tooltipFormatter;
-b.StockChart=b.stockChart=function(a,c,d){var g=z(a)||a.nodeName,h=arguments[g?1:0],k=h,r=h.series,l=b.getOptions(),x,m=e(h.navigator&&h.navigator.enabled,l.navigator.enabled,!0),p=m?{startOnTick:!1,endOnTick:!1}:null,n={marker:{enabled:!1,radius:2}},q={shadow:!1,borderWidth:0};h.xAxis=f(h.xAxis||{}).map(function(a,b){return F({minPadding:0,maxPadding:0,overscroll:0,ordinal:!0,title:{text:null},labels:{overflow:"justify"},showLastLabel:!0},l.xAxis,l.xAxis&&l.xAxis[b],a,{type:"datetime",categories:null},
-p)});h.yAxis=f(h.yAxis||{}).map(function(a,b){x=e(a.opposite,!0);return F({labels:{y:-2},opposite:x,showLastLabel:!(!a.categories&&"category"!==a.type),title:{text:null}},l.yAxis,l.yAxis&&l.yAxis[b],a)});h.series=null;h=F({chart:{panning:!0,pinchType:"x"},navigator:{enabled:m},scrollbar:{enabled:e(l.scrollbar.enabled,!0)},rangeSelector:{enabled:e(l.rangeSelector.enabled,!0)},title:{text:null},tooltip:{split:e(l.tooltip.split,!0),crosshairs:!0},legend:{enabled:!1},plotOptions:{line:n,spline:n,area:n,
-areaspline:n,arearange:n,areasplinerange:n,column:q,columnrange:q,candlestick:q,ohlc:q}},h,{isStock:!0});h.series=k.series=r;return g?new C(a,h,d):new C(h,c)};c(p.prototype,"autoLabelAlign",function(a){var b=this.chart,c=this.options,b=b._labelPanes=b._labelPanes||{},d=this.options.labels;return this.chart.options.isStock&&"yAxis"===this.coll&&(c=c.top+","+c.height,!b[c]&&d.enabled)?(15===d.x&&(d.x=0),void 0===d.align&&(d.align="right"),b[c]=this,"right"):a.apply(this,[].slice.call(arguments,1))});
-D(p,"destroy",function(){var a=this.chart,b=this.options&&this.options.top+","+this.options.height;b&&a._labelPanes&&a._labelPanes[b]===this&&delete a._labelPanes[b]});c(p.prototype,"getPlotLinePath",function(a,c,d,f,h,k){var g=this,l=this.isLinked&&!this.series?this.linkedParent.series:this.series,r=g.chart,m=r.renderer,x=g.left,t=g.top,n,v,p,q,w=[],u=[],y,B;if("xAxis"!==g.coll&&"yAxis"!==g.coll)return a.apply(this,[].slice.call(arguments,1));u=function(a){var b="xAxis"===a?"yAxis":"xAxis";a=g.options[b];
-return A(a)?[r[b][a]]:z(a)?[r.get(a)]:l.map(function(a){return a[b]})}(g.coll);(g.isXAxis?r.yAxis:r.xAxis).forEach(function(a){if(G(a.options.id)?-1===a.options.id.indexOf("navigator"):1){var b=a.isXAxis?"yAxis":"xAxis",b=G(a.options[b])?r[b][a.options[b]]:r[b][0];g===b&&u.push(a)}});y=u.length?[]:[g.isXAxis?r.yAxis[0]:r.xAxis[0]];u.forEach(function(a){-1!==y.indexOf(a)||b.find(y,function(b){return b.pos===a.pos&&b.len===a.len})||y.push(a)});B=e(k,g.translate(c,null,null,f));A(B)&&(g.horiz?y.forEach(function(a){var b;
-v=a.pos;q=v+a.len;n=p=Math.round(B+g.transB);"pass"!==h&&(n<x||n>x+g.width)&&(h?n=p=Math.min(Math.max(x,n),x+g.width):b=!0);b||w.push("M",n,v,"L",p,q)}):y.forEach(function(a){var b;n=a.pos;p=n+a.len;v=q=Math.round(t+g.height-B);"pass"!==h&&(v<t||v>t+g.height)&&(h?v=q=Math.min(Math.max(t,v),g.top+g.height):b=!0);b||w.push("M",n,v,"L",p,q)}));return 0<w.length?m.crispPolyLine(w,d||1):null});u.prototype.crispPolyLine=function(a,b){var c;for(c=0;c<a.length;c+=6)a[c+1]===a[c+4]&&(a[c+1]=a[c+4]=Math.round(a[c+
-1])-b%2/2),a[c+2]===a[c+5]&&(a[c+2]=a[c+5]=Math.round(a[c+2])+b%2/2);return a};l===m&&(m.prototype.crispPolyLine=u.prototype.crispPolyLine);c(p.prototype,"hideCrosshair",function(a,b){a.call(this,b);this.crossLabel&&(this.crossLabel=this.crossLabel.hide())});D(p,"afterDrawCrosshair",function(a){var b,c;if(G(this.crosshair.label)&&this.crosshair.label.enabled&&this.cross){var d=this.chart,f=this.options.crosshair.label,h=this.horiz;b=this.opposite;c=this.left;var k=this.top,l=this.crossLabel,m=f.format,
-r="",n="inside"===this.options.tickPosition,p=!1!==this.crosshair.snap,q=0,u=a.e||this.cross&&this.cross.e,y=a.point;a=this.lin2log;var z,A;this.isLog?(z=a(this.min),A=a(this.max)):(z=this.min,A=this.max);a=h?"center":b?"right"===this.labelAlign?"right":"left":"left"===this.labelAlign?"left":"center";l||(l=this.crossLabel=d.renderer.label(null,null,null,f.shape||"callout").addClass("highcharts-crosshair-label"+(this.series[0]&&" highcharts-color-"+this.series[0].colorIndex)).attr({align:f.align||
-a,padding:e(f.padding,8),r:e(f.borderRadius,3),zIndex:2}).add(this.labelGroup),d.styledMode||l.attr({fill:f.backgroundColor||this.series[0]&&this.series[0].color||"#666666",stroke:f.borderColor||"","stroke-width":f.borderWidth||0}).css(B({color:"#ffffff",fontWeight:"normal",fontSize:"11px",textAlign:"center"},f.style)));h?(a=p?y.plotX+c:u.chartX,k+=b?0:this.height):(a=b?this.width+c:0,k=p?y.plotY+k:u.chartY);m||f.formatter||(this.isDatetimeAxis&&(r="%b %d, %Y"),m="{value"+(r?":"+r:"")+"}");r=p?y[this.isXAxis?
-"x":"y"]:this.toValue(h?u.chartX:u.chartY);l.attr({text:m?w(m,{value:r},d.time):f.formatter.call(this,r),x:a,y:k,visibility:r<z||r>A?"hidden":"visible"});f=l.getBBox();if(h){if(n&&!b||!n&&b)k=l.y-f.height}else k=l.y-f.height/2;h?(b=c-f.x,c=c+this.width-f.x):(b="left"===this.labelAlign?c:0,c="right"===this.labelAlign?c+this.width:d.chartWidth);l.translateX<b&&(q=b-l.translateX);l.translateX+f.width>=c&&(q=-(l.translateX+f.width-c));l.attr({x:a+q,y:k,anchorX:h?a:this.opposite?0:d.chartWidth,anchorY:h?
-this.opposite?d.chartHeight:0:k+f.height/2})}});k.init=function(){q.apply(this,arguments);this.setCompare(this.options.compare)};k.setCompare=function(a){this.modifyValue="value"===a||"percent"===a?function(b,c){var d=this.compareValue;if(void 0!==b&&void 0!==d)return b="value"===a?b-d:b/d*100-(100===this.options.compareBase?0:100),c&&(c.change=b),b}:null;this.userOptions.compare=a;this.chart.hasRendered&&(this.isDirty=!0)};k.processData=function(){var a,b=-1,c,d,e=!0===this.options.compareStart?
-0:1,f,k;h.apply(this,arguments);if(this.xAxis&&this.processedYData)for(c=this.processedXData,d=this.processedYData,f=d.length,this.pointArrayMap&&(b=this.pointArrayMap.indexOf("close"),-1===b&&(b=this.pointArrayMap.indexOf(this.pointValKey||"y"))),a=0;a<f-e;a++)if(k=d[a]&&-1<b?d[a][b]:d[a],A(k)&&c[a+e]>=this.xAxis.min&&0!==k){this.compareValue=k;break}};c(k,"getExtremes",function(a){var b;a.apply(this,[].slice.call(arguments,1));this.modifyValue&&(b=[this.modifyValue(this.dataMin),this.modifyValue(this.dataMax)],
-this.dataMin=E(b),this.dataMax=n(b))});p.prototype.setCompare=function(a,b){this.isXAxis||(this.series.forEach(function(b){b.setCompare(a)}),e(b,!0)&&this.chart.redraw())};d.prototype.tooltipFormatter=function(a){a=a.replace("{point.change}",(0<this.change?"+":"")+b.numberFormat(this.change,e(this.series.tooltipOptions.changeDecimals,2)));return y.apply(this,[a])};c(a.prototype,"render",function(a){var b;this.chart.is3d&&this.chart.is3d()||this.chart.polar||!this.xAxis||this.xAxis.isRadial||(b=this.yAxis.len-
-(this.xAxis.axisLine?Math.floor(this.xAxis.axisLine.strokeWidth()/2):0),!this.clipBox&&this.animate?(this.clipBox=F(this.chart.clipBox),this.clipBox.width=this.xAxis.len,this.clipBox.height=b):this.chart[this.sharedClipKey]?this.chart[this.sharedClipKey].attr({width:this.xAxis.len,height:b}):this.clipBox&&(this.clipBox.width=this.xAxis.len,this.clipBox.height=b));a.call(this)});c(C.prototype,"getSelectedPoints",function(a){var b=a.call(this);this.series.forEach(function(a){a.hasGroupedData&&(b=b.concat((a.points||
-[]).filter(function(a){return a.selected})))});return b});D(C,"update",function(a){a=a.options;"scrollbar"in a&&this.navigator&&(F(!0,this.options.scrollbar,a.scrollbar),this.navigator.update({},!1),delete a.scrollbar)})})(H)});
-//# sourceMappingURL=stock.js.map
-</script>
-<script>/*
- Highmaps JS v7.0.1 (2018-12-19)
- Highmaps as a plugin for Highcharts or Highstock.
-
- (c) 2011-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(z){"object"===typeof module&&module.exports?module.exports=z:"function"===typeof define&&define.amd?define(function(){return z}):z("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(z){(function(a){var p=a.addEvent,h=a.Axis,n=a.pick;p(h,"getSeriesExtremes",function(){var a=[];this.isXAxis&&(this.series.forEach(function(e,r){e.useMapGeometry&&(a[r]=e.xData,e.xData=[])}),this.seriesXData=a)});p(h,"afterGetSeriesExtremes",function(){var a=this.seriesXData,e,t,h;this.isXAxis&&(e=
-n(this.dataMin,Number.MAX_VALUE),t=n(this.dataMax,-Number.MAX_VALUE),this.series.forEach(function(d,b){d.useMapGeometry&&(e=Math.min(e,n(d.minX,e)),t=Math.max(t,n(d.maxX,t)),d.xData=a[b],h=!0)}),h&&(this.dataMin=e,this.dataMax=t),delete this.seriesXData)});p(h,"afterSetAxisTranslation",function(){var a=this.chart,e;e=a.plotWidth/a.plotHeight;var a=a.xAxis[0],h;"yAxis"===this.coll&&void 0!==a.transA&&this.series.forEach(function(a){a.preserveAspectRatio&&(h=!0)});if(h&&(this.transA=a.transA=Math.min(this.transA,
-a.transA),e/=(a.max-a.min)/(this.max-this.min),e=1>e?this:a,a=(e.max-e.min)*e.transA,e.pixelPadding=e.len-a,e.minPixelPadding=e.pixelPadding/2,a=e.fixTo)){a=a[1]-e.toValue(a[0],!0);a*=e.transA;if(Math.abs(a)>e.minPixelPadding||e.min===e.dataMin&&e.max===e.dataMax)a=0;e.minPixelPadding-=a}});p(h,"render",function(){this.fixTo=null})})(z);(function(a){var p=a.addEvent,h=a.Axis,n=a.Chart,r=a.color,e,t=a.extend,y=a.isNumber,d=a.Legend,b=a.LegendSymbolMixin,f=a.noop,u=a.merge,q=a.pick;a.ColorAxis||(e=
-a.ColorAxis=function(){this.init.apply(this,arguments)},t(e.prototype,h.prototype),t(e.prototype,{defaultColorAxisOptions:{lineWidth:0,minPadding:0,maxPadding:0,gridLineWidth:1,tickPixelInterval:72,startOnTick:!0,endOnTick:!0,offset:0,marker:{animation:{duration:50},width:.01,color:"#999999"},labels:{overflow:"justify",rotation:0},minColor:"#e6ebf5",maxColor:"#003399",tickLength:5,showInLegend:!0},keepProps:["legendGroup","legendItemHeight","legendItemWidth","legendItem","legendSymbol"].concat(h.prototype.keepProps),
-init:function(c,l){var g="vertical"!==c.options.legend.layout,a;this.coll="colorAxis";a=u(this.defaultColorAxisOptions,{side:g?2:1,reversed:!g},l,{opposite:!g,showEmpty:!1,title:null,visible:c.options.legend.enabled});h.prototype.init.call(this,c,a);l.dataClasses&&this.initDataClasses(l);this.initStops();this.horiz=g;this.zoomEnabled=!1;this.defaultLegendLength=200},initDataClasses:function(c){var l=this.chart,g,a=0,k=l.options.chart.colorCount,m=this.options,b=c.dataClasses.length;this.dataClasses=
-g=[];this.legendItems=[];c.dataClasses.forEach(function(c,x){c=u(c);g.push(c);if(l.styledMode||!c.color)"category"===m.dataClassColor?(l.styledMode||(x=l.options.colors,k=x.length,c.color=x[a]),c.colorIndex=a,a++,a===k&&(a=0)):c.color=r(m.minColor).tweenTo(r(m.maxColor),2>b?.5:x/(b-1))})},setTickPositions:function(){if(!this.dataClasses)return h.prototype.setTickPositions.call(this)},initStops:function(){this.stops=this.options.stops||[[0,this.options.minColor],[1,this.options.maxColor]];this.stops.forEach(function(c){c.color=
-r(c[1])})},setOptions:function(c){h.prototype.setOptions.call(this,c);this.options.crosshair=this.options.marker},setAxisSize:function(){var c=this.legendSymbol,l=this.chart,g=l.options.legend||{},a,k;c?(this.left=g=c.attr("x"),this.top=a=c.attr("y"),this.width=k=c.attr("width"),this.height=c=c.attr("height"),this.right=l.chartWidth-g-k,this.bottom=l.chartHeight-a-c,this.len=this.horiz?k:c,this.pos=this.horiz?g:a):this.len=(this.horiz?g.symbolWidth:g.symbolHeight)||this.defaultLegendLength},normalizedValue:function(c){this.isLog&&
-(c=this.val2lin(c));return 1-(this.max-c)/(this.max-this.min||1)},toColor:function(c,l){var a=this.stops,b,k,m=this.dataClasses,x,v;if(m)for(v=m.length;v--;){if(x=m[v],b=x.from,a=x.to,(void 0===b||c>=b)&&(void 0===a||c<=a)){k=x.color;l&&(l.dataClass=v,l.colorIndex=x.colorIndex);break}}else{c=this.normalizedValue(c);for(v=a.length;v--&&!(c>a[v][0]););b=a[v]||a[v+1];a=a[v+1]||b;c=1-(a[0]-c)/(a[0]-b[0]||1);k=b.color.tweenTo(a.color,c)}return k},getOffset:function(){var c=this.legendGroup,a=this.chart.axisOffset[this.side];
-c&&(this.axisParent=c,h.prototype.getOffset.call(this),this.added||(this.added=!0,this.labelLeft=0,this.labelRight=this.width),this.chart.axisOffset[this.side]=a)},setLegendColor:function(){var c,a=this.reversed;c=a?1:0;a=a?0:1;c=this.horiz?[c,0,a,0]:[0,a,0,c];this.legendColor={linearGradient:{x1:c[0],y1:c[1],x2:c[2],y2:c[3]},stops:this.stops}},drawLegendSymbol:function(c,a){var l=c.padding,b=c.options,k=this.horiz,m=q(b.symbolWidth,k?this.defaultLegendLength:12),x=q(b.symbolHeight,k?12:this.defaultLegendLength),
-v=q(b.labelPadding,k?16:30),b=q(b.itemDistance,10);this.setLegendColor();a.legendSymbol=this.chart.renderer.rect(0,c.baseline-11,m,x).attr({zIndex:1}).add(a.legendGroup);this.legendItemWidth=m+l+(k?b:v);this.legendItemHeight=x+l+(k?v:0)},setState:function(c){this.series.forEach(function(a){a.setState(c)})},visible:!0,setVisible:f,getSeriesExtremes:function(){var c=this.series,a=c.length;this.dataMin=Infinity;for(this.dataMax=-Infinity;a--;)c[a].getExtremes(),void 0!==c[a].valueMin&&(this.dataMin=
-Math.min(this.dataMin,c[a].valueMin),this.dataMax=Math.max(this.dataMax,c[a].valueMax))},drawCrosshair:function(c,a){var b=a&&a.plotX,l=a&&a.plotY,k,m=this.pos,x=this.len;a&&(k=this.toPixels(a[a.series.colorKey]),k<m?k=m-2:k>m+x&&(k=m+x+2),a.plotX=k,a.plotY=this.len-k,h.prototype.drawCrosshair.call(this,c,a),a.plotX=b,a.plotY=l,this.cross&&!this.cross.addedToColorAxis&&this.legendGroup&&(this.cross.addClass("highcharts-coloraxis-marker").add(this.legendGroup),this.cross.addedToColorAxis=!0,this.chart.styledMode||
-this.cross.attr({fill:this.crosshair.color})))},getPlotLinePath:function(c,a,b,f,k){return y(k)?this.horiz?["M",k-4,this.top-6,"L",k+4,this.top-6,k,this.top,"Z"]:["M",this.left,k,"L",this.left-6,k+6,this.left-6,k-6,"Z"]:h.prototype.getPlotLinePath.call(this,c,a,b,f)},update:function(c,a){var b=this.chart,l=b.legend;this.series.forEach(function(c){c.isDirtyData=!0});c.dataClasses&&l.allItems&&(l.allItems.forEach(function(c){c.isDataClass&&c.legendGroup&&c.legendGroup.destroy()}),b.isDirtyLegend=!0);
-b.options[this.coll]=u(this.userOptions,c);h.prototype.update.call(this,c,a);this.legendItem&&(this.setLegendColor(),l.colorizeItem(this,!0))},remove:function(){this.legendItem&&this.chart.legend.destroyItem(this);h.prototype.remove.call(this)},getDataClassLegendSymbols:function(){var c=this,l=this.chart,g=this.legendItems,d=l.options.legend,k=d.valueDecimals,m=d.valueSuffix||"",x;g.length||this.dataClasses.forEach(function(v,d){var A=!0,e=v.from,u=v.to;x="";void 0===e?x="\x3c ":void 0===u&&(x="\x3e ");
-void 0!==e&&(x+=a.numberFormat(e,k)+m);void 0!==e&&void 0!==u&&(x+=" - ");void 0!==u&&(x+=a.numberFormat(u,k)+m);g.push(t({chart:l,name:x,options:{},drawLegendSymbol:b.drawRectangle,visible:!0,setState:f,isDataClass:!0,setVisible:function(){A=this.visible=!A;c.series.forEach(function(c){c.points.forEach(function(c){c.dataClass===d&&c.setVisible(A)})});l.legend.colorizeItem(this,A)}},v))});return g},name:""}),["fill","stroke"].forEach(function(c){a.Fx.prototype[c+"Setter"]=function(){this.elem.attr(c,
-r(this.start).tweenTo(r(this.end),this.pos),null,!0)}}),p(n,"afterGetAxes",function(){var c=this.options.colorAxis;this.colorAxis=[];c&&new e(this,c)}),p(d,"afterGetAllItems",function(c){var b=[],g=this.chart.colorAxis[0];g&&g.options&&g.options.showInLegend&&(g.options.dataClasses?b=g.getDataClassLegendSymbols():b.push(g),g.series.forEach(function(b){a.erase(c.allItems,b)}));for(g=b.length;g--;)c.allItems.unshift(b[g])}),p(d,"afterColorizeItem",function(c){c.visible&&c.item.legendColor&&c.item.legendSymbol.attr({fill:c.item.legendColor})}),
-p(d,"afterUpdate",function(c,a,b){this.chart.colorAxis[0]&&this.chart.colorAxis[0].update({},b)}))})(z);(function(a){var p=a.defined,h=a.noop,n=a.seriesTypes;a.colorPointMixin={isValid:function(){return null!==this.value&&Infinity!==this.value&&-Infinity!==this.value},setVisible:function(a){var e=this,r=a?"show":"hide";e.visible=!!a;["graphic","dataLabel"].forEach(function(a){if(e[a])e[a][r]()})},setState:function(r){a.Point.prototype.setState.call(this,r);this.graphic&&this.graphic.attr({zIndex:"hover"===
-r?1:0})}};a.colorSeriesMixin={pointArrayMap:["value"],axisTypes:["xAxis","yAxis","colorAxis"],optionalAxis:"colorAxis",trackerGroups:["group","markerGroup","dataLabelsGroup"],getSymbol:h,parallelArrays:["x","y","value"],colorKey:"value",pointAttribs:n.column.prototype.pointAttribs,translateColors:function(){var a=this,e=this.options.nullColor,h=this.colorAxis,n=this.colorKey;this.data.forEach(function(d){var b=d[n];if(b=d.options.color||(d.isNull?e:h&&void 0!==b?h.toColor(b,d):d.color||a.color))d.color=
-b})},colorAttribs:function(a){var e={};p(a.color)&&(e[this.colorProp||"fill"]=a.color);return e}}})(z);(function(a){function p(a){a&&(a.preventDefault&&a.preventDefault(),a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)}function h(a){this.init(a)}var n=a.addEvent,r=a.Chart,e=a.doc,t=a.extend,y=a.merge,d=a.pick;h.prototype.init=function(a){this.chart=a;a.mapNavButtons=[]};h.prototype.update=function(b){var f=this.chart,e=f.options.mapNavigation,q,c,l,g,w,k=function(c){this.handler.call(f,
-c);p(c)},m=f.mapNavButtons;b&&(e=f.options.mapNavigation=y(f.options.mapNavigation,b));for(;m.length;)m.pop().destroy();d(e.enableButtons,e.enabled)&&!f.renderer.forExport&&a.objectEach(e.buttons,function(a,b){q=y(e.buttonOptions,a);f.styledMode||(c=q.theme,c.style=y(q.theme.style,q.style),g=(l=c.states)&&l.hover,w=l&&l.select);a=f.renderer.button(q.text,0,0,k,c,g,w,0,"zoomIn"===b?"topbutton":"bottombutton").addClass("highcharts-map-navigation highcharts-"+{zoomIn:"zoom-in",zoomOut:"zoom-out"}[b]).attr({width:q.width,
-height:q.height,title:f.options.lang[b],padding:q.padding,zIndex:5}).add();a.handler=q.onclick;a.align(t(q,{width:a.width,height:2*a.height}),null,q.alignTo);n(a.element,"dblclick",p);m.push(a)});this.updateEvents(e)};h.prototype.updateEvents=function(a){var b=this.chart;d(a.enableDoubleClickZoom,a.enabled)||a.enableDoubleClickZoomTo?this.unbindDblClick=this.unbindDblClick||n(b.container,"dblclick",function(a){b.pointer.onContainerDblClick(a)}):this.unbindDblClick&&(this.unbindDblClick=this.unbindDblClick());
-d(a.enableMouseWheelZoom,a.enabled)?this.unbindMouseWheel=this.unbindMouseWheel||n(b.container,void 0===e.onmousewheel?"DOMMouseScroll":"mousewheel",function(a){b.pointer.onContainerMouseWheel(a);p(a);return!1}):this.unbindMouseWheel&&(this.unbindMouseWheel=this.unbindMouseWheel())};t(r.prototype,{fitToBox:function(a,f){[["x","width"],["y","height"]].forEach(function(b){var e=b[0];b=b[1];a[e]+a[b]>f[e]+f[b]&&(a[b]>f[b]?(a[b]=f[b],a[e]=f[e]):a[e]=f[e]+f[b]-a[b]);a[b]>f[b]&&(a[b]=f[b]);a[e]<f[e]&&(a[e]=
-f[e])});return a},mapZoom:function(a,f,e,r,c){var b=this.xAxis[0],g=b.max-b.min,w=d(f,b.min+g/2),k=g*a,g=this.yAxis[0],m=g.max-g.min,x=d(e,g.min+m/2),m=m*a,w=this.fitToBox({x:w-k*(r?(r-b.pos)/b.len:.5),y:x-m*(c?(c-g.pos)/g.len:.5),width:k,height:m},{x:b.dataMin,y:g.dataMin,width:b.dataMax-b.dataMin,height:g.dataMax-g.dataMin}),k=w.x<=b.dataMin&&w.width>=b.dataMax-b.dataMin&&w.y<=g.dataMin&&w.height>=g.dataMax-g.dataMin;r&&(b.fixTo=[r-b.pos,f]);c&&(g.fixTo=[c-g.pos,e]);void 0===a||k?(b.setExtremes(void 0,
-void 0,!1),g.setExtremes(void 0,void 0,!1)):(b.setExtremes(w.x,w.x+w.width,!1),g.setExtremes(w.y,w.y+w.height,!1));this.redraw()}});n(r,"beforeRender",function(){this.mapNavigation=new h(this);this.mapNavigation.update()});a.MapNavigation=h})(z);(function(a){var p=a.extend,h=a.pick,n=a.Pointer;a=a.wrap;p(n.prototype,{onContainerDblClick:function(a){var e=this.chart;a=this.normalize(a);e.options.mapNavigation.enableDoubleClickZoomTo?e.pointer.inClass(a.target,"highcharts-tracker")&&e.hoverPoint&&e.hoverPoint.zoomTo():
-e.isInsidePlot(a.chartX-e.plotLeft,a.chartY-e.plotTop)&&e.mapZoom(.5,e.xAxis[0].toValue(a.chartX),e.yAxis[0].toValue(a.chartY),a.chartX,a.chartY)},onContainerMouseWheel:function(a){var e=this.chart,h;a=this.normalize(a);h=a.detail||-(a.wheelDelta/120);e.isInsidePlot(a.chartX-e.plotLeft,a.chartY-e.plotTop)&&e.mapZoom(Math.pow(e.options.mapNavigation.mouseWheelSensitivity,h),e.xAxis[0].toValue(a.chartX),e.yAxis[0].toValue(a.chartY),a.chartX,a.chartY)}});a(n.prototype,"zoomOption",function(a){var e=
-this.chart.options.mapNavigation;h(e.enableTouchZoom,e.enabled)&&(this.chart.options.chart.pinchType="xy");a.apply(this,[].slice.call(arguments,1))});a(n.prototype,"pinchTranslate",function(a,e,h,n,d,b,f){a.call(this,e,h,n,d,b,f);"map"===this.chart.options.chart.type&&this.hasZoom&&(a=n.scaleX>n.scaleY,this.pinchTranslateDirection(!a,e,h,n,d,b,f,a?n.scaleX:n.scaleY))})})(z);(function(a){var p=a.colorPointMixin,h=a.extend,n=a.isNumber,r=a.merge,e=a.noop,t=a.pick,y=a.isArray,d=a.Point,b=a.Series,f=
-a.seriesType,u=a.seriesTypes,q=a.splat;f("map","scatter",{animation:!1,dataLabels:{crop:!1,formatter:function(){return this.point.value},inside:!0,overflow:!1,padding:0,verticalAlign:"middle"},marker:null,nullColor:"#f7f7f7",stickyTracking:!1,tooltip:{followPointer:!0,pointFormat:"{point.name}: {point.value}\x3cbr/\x3e"},turboThreshold:0,allAreas:!0,borderColor:"#cccccc",borderWidth:1,joinBy:"hc-key",states:{hover:{halo:null,brightness:.2},normal:{animation:!0},select:{color:"#cccccc"}}},r(a.colorSeriesMixin,
-{type:"map",getExtremesFromAll:!0,useMapGeometry:!0,forceDL:!0,searchPoint:e,directTouch:!0,preserveAspectRatio:!0,pointArrayMap:["value"],getBox:function(c){var b=Number.MAX_VALUE,g=-b,e=b,k=-b,m=b,x=b,v=this.xAxis,f=this.yAxis,d;(c||[]).forEach(function(c){if(c.path){"string"===typeof c.path&&(c.path=a.splitPath(c.path));var l=c.path||[],f=l.length,v=!1,A=-b,w=b,u=-b,h=b,q=c.properties;if(!c._foundBox){for(;f--;)n(l[f])&&(v?(A=Math.max(A,l[f]),w=Math.min(w,l[f])):(u=Math.max(u,l[f]),h=Math.min(h,
-l[f])),v=!v);c._midX=w+(A-w)*t(c.middleX,q&&q["hc-middle-x"],.5);c._midY=h+(u-h)*t(c.middleY,q&&q["hc-middle-y"],.5);c._maxX=A;c._minX=w;c._maxY=u;c._minY=h;c.labelrank=t(c.labelrank,(A-w)*(u-h));c._foundBox=!0}g=Math.max(g,c._maxX);e=Math.min(e,c._minX);k=Math.max(k,c._maxY);m=Math.min(m,c._minY);x=Math.min(c._maxX-c._minX,c._maxY-c._minY,x);d=!0}});d&&(this.minY=Math.min(m,t(this.minY,b)),this.maxY=Math.max(k,t(this.maxY,-b)),this.minX=Math.min(e,t(this.minX,b)),this.maxX=Math.max(g,t(this.maxX,
--b)),v&&void 0===v.options.minRange&&(v.minRange=Math.min(5*x,(this.maxX-this.minX)/5,v.minRange||b)),f&&void 0===f.options.minRange&&(f.minRange=Math.min(5*x,(this.maxY-this.minY)/5,f.minRange||b)))},getExtremes:function(){b.prototype.getExtremes.call(this,this.valueData);this.chart.hasRendered&&this.isDirtyData&&this.getBox(this.options.data);this.valueMin=this.dataMin;this.valueMax=this.dataMax;this.dataMin=this.minY;this.dataMax=this.maxY},translatePath:function(a){var c=!1,b=this.xAxis,f=this.yAxis,
-k=b.min,m=b.transA,b=b.minPixelPadding,e=f.min,v=f.transA,f=f.minPixelPadding,d,h=[];if(a)for(d=a.length;d--;)n(a[d])?(h[d]=c?(a[d]-k)*m+b:(a[d]-e)*v+f,c=!c):h[d]=a[d];return h},setData:function(c,l,g,f){var k=this.options,m=this.chart.options.chart,e=m&&m.map,v=k.mapData,d=k.joinBy,w=null===d,h=k.keys||this.pointArrayMap,u=[],t={},p=this.chart.mapTransforms;!v&&e&&(v="string"===typeof e?a.maps[e]:e);w&&(d="_i");d=this.joinBy=q(d);d[1]||(d[1]=d[0]);c&&c.forEach(function(b,m){var g=0;if(n(b))c[m]=
-{value:b};else if(y(b)){c[m]={};!k.keys&&b.length>h.length&&"string"===typeof b[0]&&(c[m]["hc-key"]=b[0],++g);for(var d=0;d<h.length;++d,++g)h[d]&&void 0!==b[g]&&(0<h[d].indexOf(".")?a.Point.prototype.setNestedProperty(c[m],b[g],h[d]):c[m][h[d]]=b[g])}w&&(c[m]._i=m)});this.getBox(c);(this.chart.mapTransforms=p=m&&m.mapTransforms||v&&v["hc-transform"]||p)&&a.objectEach(p,function(a){a.rotation&&(a.cosAngle=Math.cos(a.rotation),a.sinAngle=Math.sin(a.rotation))});if(v){"FeatureCollection"===v.type&&
-(this.mapTitle=v.title,v=a.geojson(v,this.type,this));this.mapData=v;this.mapMap={};for(p=0;p<v.length;p++)m=v[p],e=m.properties,m._i=p,d[0]&&e&&e[d[0]]&&(m[d[0]]=e[d[0]]),t[m[d[0]]]=m;this.mapMap=t;c&&d[1]&&c.forEach(function(a){t[a[d[1]]]&&u.push(t[a[d[1]]])});k.allAreas?(this.getBox(v),c=c||[],d[1]&&c.forEach(function(a){u.push(a[d[1]])}),u="|"+u.map(function(a){return a&&a[d[0]]}).join("|")+"|",v.forEach(function(a){d[0]&&-1!==u.indexOf("|"+a[d[0]]+"|")||(c.push(r(a,{value:null})),f=!1)})):this.getBox(u)}b.prototype.setData.call(this,
-c,l,g,f)},drawGraph:e,drawDataLabels:e,doFullTranslate:function(){return this.isDirtyData||this.chart.isResizing||this.chart.renderer.isVML||!this.baseTrans},translate:function(){var a=this,b=a.xAxis,g=a.yAxis,d=a.doFullTranslate();a.generatePoints();a.data.forEach(function(c){c.plotX=b.toPixels(c._midX,!0);c.plotY=g.toPixels(c._midY,!0);d&&(c.shapeType="path",c.shapeArgs={d:a.translatePath(c.path)})});a.translateColors()},pointAttribs:function(a,b){b=a.series.chart.styledMode?this.colorAttribs(a):
-u.column.prototype.pointAttribs.call(this,a,b);b["stroke-width"]=t(a.options[this.pointAttrToOptions&&this.pointAttrToOptions["stroke-width"]||"borderWidth"],"inherit");return b},drawPoints:function(){var a=this,b=a.xAxis,g=a.yAxis,d=a.group,k=a.chart,m=k.renderer,f,e,h,q,n=this.baseTrans,p,r,t,y,G;a.transformGroup||(a.transformGroup=m.g().attr({scaleX:1,scaleY:1}).add(d),a.transformGroup.survive=!0);a.doFullTranslate()?(k.hasRendered&&!k.styledMode&&a.points.forEach(function(c){c.shapeArgs&&(c.shapeArgs.fill=
-a.pointAttribs(c,c.state).fill)}),a.group=a.transformGroup,u.column.prototype.drawPoints.apply(a),a.group=d,a.points.forEach(function(c){c.graphic&&(c.name&&c.graphic.addClass("highcharts-name-"+c.name.replace(/ /g,"-").toLowerCase()),c.properties&&c.properties["hc-key"]&&c.graphic.addClass("highcharts-key-"+c.properties["hc-key"].toLowerCase()),k.styledMode&&c.graphic.css(a.pointAttribs(c,c.selected&&"select")))}),this.baseTrans={originX:b.min-b.minPixelPadding/b.transA,originY:g.min-g.minPixelPadding/
-g.transA+(g.reversed?0:g.len/g.transA),transAX:b.transA,transAY:g.transA},this.transformGroup.animate({translateX:0,translateY:0,scaleX:1,scaleY:1})):(f=b.transA/n.transAX,e=g.transA/n.transAY,h=b.toPixels(n.originX,!0),q=g.toPixels(n.originY,!0),.99<f&&1.01>f&&.99<e&&1.01>e&&(e=f=1,h=Math.round(h),q=Math.round(q)),p=this.transformGroup,k.renderer.globalAnimation?(r=p.attr("translateX"),t=p.attr("translateY"),y=p.attr("scaleX"),G=p.attr("scaleY"),p.attr({animator:0}).animate({animator:1},{step:function(a,
-c){p.attr({translateX:r+(h-r)*c.pos,translateY:t+(q-t)*c.pos,scaleX:y+(f-y)*c.pos,scaleY:G+(e-G)*c.pos})}})):p.attr({translateX:h,translateY:q,scaleX:f,scaleY:e}));k.styledMode||d.element.setAttribute("stroke-width",(a.options[a.pointAttrToOptions&&a.pointAttrToOptions["stroke-width"]||"borderWidth"]||1)/(f||1));this.drawMapDataLabels()},drawMapDataLabels:function(){b.prototype.drawDataLabels.call(this);this.dataLabelsGroup&&this.dataLabelsGroup.clip(this.chart.clipRect)},render:function(){var a=
-this,d=b.prototype.render;a.chart.renderer.isVML&&3E3<a.data.length?setTimeout(function(){d.call(a)}):d.call(a)},animate:function(a){var c=this.options.animation,b=this.group,d=this.xAxis,k=this.yAxis,m=d.pos,f=k.pos;this.chart.renderer.isSVG&&(!0===c&&(c={duration:1E3}),a?b.attr({translateX:m+d.len/2,translateY:f+k.len/2,scaleX:.001,scaleY:.001}):(b.animate({translateX:m,translateY:f,scaleX:1,scaleY:1},c),this.animate=null))},animateDrilldown:function(a){var c=this.chart.plotBox,b=this.chart.drilldownLevels[this.chart.drilldownLevels.length-
-1],d=b.bBox,k=this.chart.options.drilldown.animation;a||(a=Math.min(d.width/c.width,d.height/c.height),b.shapeArgs={scaleX:a,scaleY:a,translateX:d.x,translateY:d.y},this.points.forEach(function(a){a.graphic&&a.graphic.attr(b.shapeArgs).animate({scaleX:1,scaleY:1,translateX:0,translateY:0},k)}),this.animate=null)},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,animateDrillupFrom:function(a){u.column.prototype.animateDrillupFrom.call(this,a)},animateDrillupTo:function(a){u.column.prototype.animateDrillupTo.call(this,
-a)}}),h({applyOptions:function(a,b){a=d.prototype.applyOptions.call(this,a,b);b=this.series;var c=b.joinBy;b.mapData&&((c=void 0!==a[c[1]]&&b.mapMap[a[c[1]]])?(b.xyFromShape&&(a.x=c._midX,a.y=c._midY),h(a,c)):a.value=a.value||null);return a},onMouseOver:function(c){a.clearTimeout(this.colorInterval);if(null!==this.value||this.series.options.nullInteraction)d.prototype.onMouseOver.call(this,c);else this.series.onMouseOut(c)},zoomTo:function(){var a=this.series;a.xAxis.setExtremes(this._minX,this._maxX,
-!1);a.yAxis.setExtremes(this._minY,this._maxY,!1);a.chart.redraw()}},p))})(z);(function(a){var p=a.seriesType,h=a.seriesTypes;p("mapline","map",{lineWidth:1,fillColor:"none"},{type:"mapline",colorProp:"stroke",pointAttrToOptions:{stroke:"color","stroke-width":"lineWidth"},pointAttribs:function(a,p){a=h.map.prototype.pointAttribs.call(this,a,p);a.fill=this.options.fillColor;return a},drawLegendSymbol:h.line.prototype.drawLegendSymbol})})(z);(function(a){var p=a.merge,h=a.Point;a=a.seriesType;a("mappoint",
-"scatter",{dataLabels:{enabled:!0,formatter:function(){return this.point.name},crop:!1,defer:!1,overflow:!1,style:{color:"#000000"}}},{type:"mappoint",forceDL:!0},{applyOptions:function(a,r){a=void 0!==a.lat&&void 0!==a.lon?p(a,this.series.chart.fromLatLonToPoint(a)):a;return h.prototype.applyOptions.call(this,a,r)}})})(z);(function(a){var p=a.Series,h=a.Legend,n=a.Chart,r=a.addEvent,e=a.wrap,t=a.color,y=a.isNumber,d=a.numberFormat,b=a.objectEach,f=a.merge,u=a.noop,q=a.pick,c=a.stableSort,l=a.setOptions,
-g=a.arrayMin,w=a.arrayMax;l({legend:{bubbleLegend:{borderColor:void 0,borderWidth:2,className:void 0,color:void 0,connectorClassName:void 0,connectorColor:void 0,connectorDistance:60,connectorWidth:1,enabled:!1,labels:{className:void 0,allowOverlap:!1,format:"",formatter:void 0,align:"right",style:{fontSize:10,color:void 0},x:0,y:0},maxSize:60,minSize:10,legendIndex:0,ranges:{value:void 0,borderColor:void 0,color:void 0,connectorColor:void 0},sizeBy:"area",sizeByAbsoluteValue:!1,zIndex:1,zThreshold:0}}});
-a.BubbleLegend=function(a,c){this.init(a,c)};a.BubbleLegend.prototype={init:function(a,c){this.options=a;this.visible=!0;this.chart=c.chart;this.legend=c},setState:u,addToLegend:function(a){a.splice(this.options.legendIndex,0,this)},drawLegendSymbol:function(a){var b=this.chart,k=this.options,d=q(a.options.itemDistance,20),f,g=k.ranges;f=k.connectorDistance;this.fontMetrics=b.renderer.fontMetrics(k.labels.style.fontSize.toString()+"px");g&&g.length&&y(g[0].value)?(c(g,function(a,c){return c.value-
-a.value}),this.ranges=g,this.setOptions(),this.render(),b=this.getMaxLabelSize(),g=this.ranges[0].radius,a=2*g,f=f-g+b.width,f=0<f?f:0,this.maxLabel=b,this.movementX="left"===k.labels.align?f:0,this.legendItemWidth=a+f+d,this.legendItemHeight=a+this.fontMetrics.h/2):a.options.bubbleLegend.autoRanges=!0},setOptions:function(){var a=this,c=a.ranges,b=a.options,d=a.chart.series[b.seriesIndex],g=a.legend.baseline,e={"z-index":b.zIndex,"stroke-width":b.borderWidth},l={"z-index":b.zIndex,"stroke-width":b.connectorWidth},
-h=a.getLabelStyles(),u=d.options.marker.fillOpacity,w=a.chart.styledMode;c.forEach(function(k,m){w||(e.stroke=q(k.borderColor,b.borderColor,d.color),e.fill=q(k.color,b.color,1!==u?t(d.color).setOpacity(u).get("rgba"):d.color),l.stroke=q(k.connectorColor,b.connectorColor,d.color));c[m].radius=a.getRangeRadius(k.value);c[m]=f(c[m],{center:c[0].radius-c[m].radius+g});w||f(!0,c[m],{bubbleStyle:f(!1,e),connectorStyle:f(!1,l),labelStyle:h})})},getLabelStyles:function(){var a=this.options,c={},d="left"===
-a.labels.align,g=this.legend.options.rtl;b(a.labels.style,function(a,b){"color"!==b&&"fontSize"!==b&&"z-index"!==b&&(c[b]=a)});return f(!1,c,{"font-size":a.labels.style.fontSize,fill:q(a.labels.style.color,"#000000"),"z-index":a.zIndex,align:g||d?"right":"left"})},getRangeRadius:function(a){var c=this.options;return this.chart.series[this.options.seriesIndex].getRadius.call(this,c.ranges[c.ranges.length-1].value,c.ranges[0].value,c.minSize,c.maxSize,a)},render:function(){var a=this,c=a.chart.renderer,
-b=a.options.zThreshold;a.symbols||(a.symbols={connectors:[],bubbleItems:[],labels:[]});a.legendSymbol=c.g("bubble-legend");a.legendItem=c.g("bubble-legend-item");a.legendSymbol.translateX=0;a.legendSymbol.translateY=0;a.ranges.forEach(function(c){c.value>=b&&a.renderRange(c)});a.legendSymbol.add(a.legendItem);a.legendItem.add(a.legendGroup);a.hideOverlappingLabels()},renderRange:function(a){var c=this.options,b=c.labels,d=this.chart.renderer,k=this.symbols,g=k.labels,f=a.center,e=Math.abs(a.radius),
-l=c.connectorDistance,h=b.align,u=b.style.fontSize,l=this.legend.options.rtl||"left"===h?-l:l,b=c.connectorWidth,w=this.ranges[0].radius,q=f-e-c.borderWidth/2+b/2,p,u=u/2-(this.fontMetrics.h-u)/2,n=d.styledMode;"center"===h&&(l=0,c.connectorDistance=0,a.labelStyle.align="center");h=q+c.labels.y;p=w+l+c.labels.x;k.bubbleItems.push(d.circle(w,f+((q%1?1:.5)-(b%2?0:.5)),e).attr(n?{}:a.bubbleStyle).addClass((n?"highcharts-color-"+this.options.seriesIndex+" ":"")+"highcharts-bubble-legend-symbol "+(c.className||
-"")).add(this.legendSymbol));k.connectors.push(d.path(d.crispLine(["M",w,q,"L",w+l,q],c.connectorWidth)).attr(n?{}:a.connectorStyle).addClass((n?"highcharts-color-"+this.options.seriesIndex+" ":"")+"highcharts-bubble-legend-connectors "+(c.connectorClassName||"")).add(this.legendSymbol));a=d.text(this.formatLabel(a),p,h+u).attr(n?{}:a.labelStyle).addClass("highcharts-bubble-legend-labels "+(c.labels.className||"")).add(this.legendSymbol);g.push(a);a.placed=!0;a.alignAttr={x:p,y:h+u}},getMaxLabelSize:function(){var a,
-c;this.symbols.labels.forEach(function(b){c=b.getBBox(!0);a=a?c.width>a.width?c:a:c});return a||{}},formatLabel:function(c){var b=this.options,g=b.labels.formatter;return(b=b.labels.format)?a.format(b,c):g?g.call(c):d(c.value,1)},hideOverlappingLabels:function(){var a=this.chart,c=this.symbols;!this.options.labels.allowOverlap&&c&&(a.hideOverlappingLabels(c.labels),c.labels.forEach(function(a,b){a.newOpacity?a.newOpacity!==a.oldOpacity&&c.connectors[b].show():c.connectors[b].hide()}))},getRanges:function(){var a=
-this.legend.bubbleLegend,c,b=a.options.ranges,d,e=Number.MAX_VALUE,l=-Number.MAX_VALUE;a.chart.series.forEach(function(a){a.isBubble&&!a.ignoreSeries&&(d=a.zData.filter(y),d.length&&(e=q(a.options.zMin,Math.min(e,Math.max(g(d),!1===a.options.displayNegative?a.options.zThreshold:-Number.MAX_VALUE))),l=q(a.options.zMax,Math.max(l,w(d)))))});c=e===l?[{value:l}]:[{value:e},{value:(e+l)/2},{value:l,autoRanges:!0}];b.length&&b[0].radius&&c.reverse();c.forEach(function(a,d){b&&b[d]&&(c[d]=f(!1,b[d],a))});
-return c},predictBubbleSizes:function(){var a=this.chart,c=this.fontMetrics,b=a.legend.options,d="horizontal"===b.layout,g=d?a.legend.lastLineHeight:0,f=a.plotSizeX,e=a.plotSizeY,l=a.series[this.options.seriesIndex],a=Math.ceil(l.minPxSize),h=Math.ceil(l.maxPxSize),l=l.options.maxSize,u=Math.min(e,f);if(b.floating||!/%$/.test(l))c=h;else if(l=parseFloat(l),c=(u+g-c.h/2)*l/100/(l/100+1),d&&e-c>=f||!d&&f-c>=e)c=h;return[a,Math.ceil(c)]},updateRanges:function(a,c){var b=this.legend.options.bubbleLegend;
-b.minSize=a;b.maxSize=c;b.ranges=this.getRanges()},correctSizes:function(){var a=this.legend,c=this.chart.series[this.options.seriesIndex];1<Math.abs(Math.ceil(c.maxPxSize)-this.options.maxSize)&&(this.updateRanges(this.options.minSize,c.maxPxSize),a.render())}};r(a.Legend,"afterGetAllItems",function(c){var b=this.bubbleLegend,d=this.options,g=d.bubbleLegend,f=this.chart.getVisibleBubbleSeriesIndex();b&&b.ranges&&b.ranges.length&&(g.ranges.length&&(g.autoRanges=g.ranges[0].autoRanges?!0:!1),this.destroyItem(b));
-0<=f&&d.enabled&&g.enabled&&(g.seriesIndex=f,this.bubbleLegend=new a.BubbleLegend(g,this),this.bubbleLegend.addToLegend(c.allItems))});n.prototype.getVisibleBubbleSeriesIndex=function(){for(var a=this.series,c=0;c<a.length;){if(a[c]&&a[c].isBubble&&a[c].visible&&a[c].zData.length)return c;c++}return-1};h.prototype.getLinesHeights=function(){var a=this.allItems,c=[],b,d=a.length,g,f=0;for(g=0;g<d;g++)if(a[g].legendItemHeight&&(a[g].itemHeight=a[g].legendItemHeight),a[g]===a[d-1]||a[g+1]&&a[g]._legendItemPos[1]!==
-a[g+1]._legendItemPos[1]){c.push({height:0});b=c[c.length-1];for(f;f<=g;f++)a[f].itemHeight>b.height&&(b.height=a[f].itemHeight);b.step=g}return c};h.prototype.retranslateItems=function(a){var c,b,d,g=this.options.rtl,f=0;this.allItems.forEach(function(e,l){c=e.legendGroup.translateX;b=e._legendItemPos[1];if((d=e.movementX)||g&&e.ranges)d=g?c-e.options.maxSize/2:c+d,e.legendGroup.attr({translateX:d});l>a[f].step&&f++;e.legendGroup.attr({translateY:Math.round(b+a[f].height/2)});e._legendItemPos[1]=
-b+a[f].height/2})};r(p,"legendItemClick",function(){var a=this.chart,c=this.visible,b=this.chart.legend;b&&b.bubbleLegend&&(this.visible=!c,this.ignoreSeries=c,a=0<=a.getVisibleBubbleSeriesIndex(),b.bubbleLegend.visible!==a&&(b.update({bubbleLegend:{enabled:a}}),b.bubbleLegend.visible=a),this.visible=c)});e(n.prototype,"drawChartBox",function(a,c,d){var g=this.legend,f=0<=this.getVisibleBubbleSeriesIndex(),e;g&&g.options.enabled&&g.bubbleLegend&&g.options.bubbleLegend.autoRanges&&f?(e=g.bubbleLegend.options,
-f=g.bubbleLegend.predictBubbleSizes(),g.bubbleLegend.updateRanges(f[0],f[1]),e.placed||(g.group.placed=!1,g.allItems.forEach(function(a){a.legendGroup.translateY=null})),g.render(),this.getMargins(),this.axes.forEach(function(a){a.render();e.placed||(a.setScale(),a.updateNames(),b(a.ticks,function(a){a.isNew=!0;a.isNewLabel=!0}))}),e.placed=!0,this.getMargins(),a.call(this,c,d),g.bubbleLegend.correctSizes(),g.retranslateItems(g.getLinesHeights())):(a.call(this,c,d),g&&g.options.enabled&&g.bubbleLegend&&
-(g.render(),g.retranslateItems(g.getLinesHeights())))})})(z);(function(a){var p=a.arrayMax,h=a.arrayMin,n=a.Axis,r=a.color,e=a.isNumber,t=a.noop,y=a.pick,d=a.pInt,b=a.Point,f=a.Series,u=a.seriesType,q=a.seriesTypes;u("bubble","scatter",{dataLabels:{formatter:function(){return this.point.z},inside:!0,verticalAlign:"middle"},animationLimit:250,marker:{lineColor:null,lineWidth:1,fillOpacity:.5,radius:null,states:{hover:{radiusPlus:0}},symbol:"circle"},minSize:8,maxSize:"20%",softThreshold:!1,states:{hover:{halo:{size:5}}},
-tooltip:{pointFormat:"({point.x}, {point.y}), Size: {point.z}"},turboThreshold:0,zThreshold:0,zoneAxis:"z"},{pointArrayMap:["y","z"],parallelArrays:["x","y","z"],trackerGroups:["group","dataLabelsGroup"],specialGroup:"group",bubblePadding:!0,zoneAxis:"z",directTouch:!0,isBubble:!0,pointAttribs:function(a,b){var c=this.options.marker.fillOpacity;a=f.prototype.pointAttribs.call(this,a,b);1!==c&&(a.fill=r(a.fill).setOpacity(c).get("rgba"));return a},getRadii:function(a,b,g){var c,d=this.zData,f=g.minPxSize,
-e=g.maxPxSize,l=[],h;c=0;for(g=d.length;c<g;c++)h=d[c],l.push(this.getRadius(a,b,f,e,h));this.radii=l},getRadius:function(a,b,d,f,k){var c=this.options,g="width"!==c.sizeBy,l=c.zThreshold,h=b-a;c.sizeByAbsoluteValue&&null!==k&&(k=Math.abs(k-l),h=Math.max(b-l,Math.abs(a-l)),a=0);e(k)?k<a?d=d/2-1:(a=0<h?(k-a)/h:.5,g&&0<=a&&(a=Math.sqrt(a)),d=Math.ceil(d+a*(f-d))/2):d=null;return d},animate:function(a){!a&&this.points.length<this.options.animationLimit&&(this.points.forEach(function(a){var c=a.graphic,
-b;c&&c.width&&(b={x:c.x,y:c.y,width:c.width,height:c.height},c.attr({x:a.plotX,y:a.plotY,width:1,height:1}),c.animate(b,this.options.animation))},this),this.animate=null)},translate:function(){var c,b=this.data,d,f,k=this.radii;q.scatter.prototype.translate.call(this);for(c=b.length;c--;)d=b[c],f=k?k[c]:0,e(f)&&f>=this.minPxSize/2?(d.marker=a.extend(d.marker,{radius:f,width:2*f,height:2*f}),d.dlBox={x:d.plotX-f,y:d.plotY-f,width:2*f,height:2*f}):d.shapeArgs=d.plotY=d.dlBox=void 0},alignDataLabel:q.column.prototype.alignDataLabel,
-buildKDTree:t,applyZones:t},{haloPath:function(a){return b.prototype.haloPath.call(this,0===a?0:(this.marker?this.marker.radius||0:0)+a)},ttBelow:!1});n.prototype.beforePadding=function(){var c=this,b=this.len,f=this.chart,u=0,k=b,q=this.isXAxis,n=q?"xData":"yData",r=this.min,t={},z=Math.min(f.plotWidth,f.plotHeight),C=Number.MAX_VALUE,D=-Number.MAX_VALUE,E=this.max-r,B=b/E,F=[];this.series.forEach(function(b){var g=b.options;!b.bubblePadding||!b.visible&&f.options.chart.ignoreHiddenSeries||(c.allowZoomOutside=
-!0,F.push(b),q&&(["minSize","maxSize"].forEach(function(a){var c=g[a],b=/%$/.test(c),c=d(c);t[a]=b?z*c/100:c}),b.minPxSize=t.minSize,b.maxPxSize=Math.max(t.maxSize,t.minSize),b=b.zData.filter(a.isNumber),b.length&&(C=y(g.zMin,Math.min(C,Math.max(h(b),!1===g.displayNegative?g.zThreshold:-Number.MAX_VALUE))),D=y(g.zMax,Math.max(D,p(b))))))});F.forEach(function(a){var b=a[n],d=b.length,f;q&&a.getRadii(C,D,a);if(0<E)for(;d--;)e(b[d])&&c.dataMin<=b[d]&&b[d]<=c.dataMax&&(f=a.radii[d],u=Math.min((b[d]-r)*
-B-f,u),k=Math.max((b[d]-r)*B+f,k))});F.length&&0<E&&!this.isLog&&(k-=b,B*=(b+Math.max(0,u)-Math.min(k,b))/b,[["min","userMin",u],["max","userMax",k]].forEach(function(a){void 0===y(c.options[a[0]],c[a[1]])&&(c[a[0]]+=a[2]/B)}))}})(z);(function(a){var p=a.merge,h=a.Point,n=a.seriesType,r=a.seriesTypes;r.bubble&&n("mapbubble","bubble",{animationLimit:500,tooltip:{pointFormat:"{point.name}: {point.z}"}},{xyFromShape:!0,type:"mapbubble",pointArrayMap:["z"],getMapData:r.map.prototype.getMapData,getBox:r.map.prototype.getBox,
-setData:r.map.prototype.setData},{applyOptions:function(a,n){return a&&void 0!==a.lat&&void 0!==a.lon?h.prototype.applyOptions.call(this,p(a,this.series.chart.fromLatLonToPoint(a)),n):r.map.prototype.pointClass.prototype.applyOptions.call(this,a,n)},isValid:function(){return"number"===typeof this.z},ttBelow:!1})})(z);(function(a){var p=a.colorPointMixin,h=a.merge,n=a.noop,r=a.pick,e=a.Series,t=a.seriesType,y=a.seriesTypes;t("heatmap","scatter",{animation:!1,borderWidth:0,nullColor:"#f7f7f7",dataLabels:{formatter:function(){return this.point.value},
-inside:!0,verticalAlign:"middle",crop:!1,overflow:!1,padding:0},marker:null,pointRange:null,tooltip:{pointFormat:"{point.x}, {point.y}: {point.value}\x3cbr/\x3e"},states:{hover:{halo:!1,brightness:.2}}},h(a.colorSeriesMixin,{pointArrayMap:["y","value"],hasPointSpecificOptions:!0,getExtremesFromAll:!0,directTouch:!0,init:function(){var a;y.scatter.prototype.init.apply(this,arguments);a=this.options;a.pointRange=r(a.pointRange,a.colsize||1);this.yAxis.axisPointRange=a.rowsize||1},translate:function(){var a=
-this.options,b=this.xAxis,f=this.yAxis,e=a.pointPadding||0,h=function(a,b,d){return Math.min(Math.max(b,a),d)};this.generatePoints();this.points.forEach(function(c){var d=(a.colsize||1)/2,g=(a.rowsize||1)/2,u=h(Math.round(b.len-b.translate(c.x-d,0,1,0,1)),-b.len,2*b.len),d=h(Math.round(b.len-b.translate(c.x+d,0,1,0,1)),-b.len,2*b.len),k=h(Math.round(f.translate(c.y-g,0,1,0,1)),-f.len,2*f.len),g=h(Math.round(f.translate(c.y+g,0,1,0,1)),-f.len,2*f.len),q=r(c.pointPadding,e);c.plotX=c.clientX=(u+d)/
-2;c.plotY=(k+g)/2;c.shapeType="rect";c.shapeArgs={x:Math.min(u,d)+q,y:Math.min(k,g)+q,width:Math.abs(d-u)-2*q,height:Math.abs(g-k)-2*q}});this.translateColors()},drawPoints:function(){var a=this.chart.styledMode?"css":"attr";y.column.prototype.drawPoints.call(this);this.points.forEach(function(b){b.graphic[a](this.colorAttribs(b))},this)},animate:n,getBox:n,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,alignDataLabel:y.column.prototype.alignDataLabel,getExtremes:function(){e.prototype.getExtremes.call(this,
-this.valueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;e.prototype.getExtremes.call(this)}}),a.extend({haloPath:function(a){if(!a)return[];var b=this.shapeArgs;return["M",b.x-a,b.y-a,"L",b.x-a,b.y+b.height+a,b.x+b.width+a,b.y+b.height+a,b.x+b.width+a,b.y-a,"Z"]}},p))})(z);(function(a){function p(a,b){var d,e,h,c=!1,l=a.x,g=a.y;a=0;for(d=b.length-1;a<b.length;d=a++)e=b[a][1]>g,h=b[d][1]>g,e!==h&&l<(b[d][0]-b[a][0])*(g-b[a][1])/(b[d][1]-b[a][1])+b[a][0]&&(c=!c);return c}var h=a.Chart,
-n=a.extend,r=a.format,e=a.merge,t=a.win,y=a.wrap;h.prototype.transformFromLatLon=function(d,b){if(void 0===t.proj4)return a.error(21,!1,this),{x:0,y:null};d=t.proj4(b.crs,[d.lon,d.lat]);var f=b.cosAngle||b.rotation&&Math.cos(b.rotation),e=b.sinAngle||b.rotation&&Math.sin(b.rotation);d=b.rotation?[d[0]*f+d[1]*e,-d[0]*e+d[1]*f]:d;return{x:((d[0]-(b.xoffset||0))*(b.scale||1)+(b.xpan||0))*(b.jsonres||1)+(b.jsonmarginX||0),y:(((b.yoffset||0)-d[1])*(b.scale||1)+(b.ypan||0))*(b.jsonres||1)-(b.jsonmarginY||
-0)}};h.prototype.transformToLatLon=function(d,b){if(void 0===t.proj4)a.error(21,!1,this);else{d={x:((d.x-(b.jsonmarginX||0))/(b.jsonres||1)-(b.xpan||0))/(b.scale||1)+(b.xoffset||0),y:((-d.y-(b.jsonmarginY||0))/(b.jsonres||1)+(b.ypan||0))/(b.scale||1)+(b.yoffset||0)};var f=b.cosAngle||b.rotation&&Math.cos(b.rotation),e=b.sinAngle||b.rotation&&Math.sin(b.rotation);b=t.proj4(b.crs,"WGS84",b.rotation?{x:d.x*f+d.y*-e,y:d.x*e+d.y*f}:d);return{lat:b.y,lon:b.x}}};h.prototype.fromPointToLatLon=function(d){var b=
-this.mapTransforms,f;if(b){for(f in b)if(b.hasOwnProperty(f)&&b[f].hitZone&&p({x:d.x,y:-d.y},b[f].hitZone.coordinates[0]))return this.transformToLatLon(d,b[f]);return this.transformToLatLon(d,b["default"])}a.error(22,!1,this)};h.prototype.fromLatLonToPoint=function(d){var b=this.mapTransforms,f,e;if(!b)return a.error(22,!1,this),{x:0,y:null};for(f in b)if(b.hasOwnProperty(f)&&b[f].hitZone&&(e=this.transformFromLatLon(d,b[f]),p({x:e.x,y:-e.y},b[f].hitZone.coordinates[0])))return e;return this.transformFromLatLon(d,
-b["default"])};a.geojson=function(a,b,f){var d=[],e=[],c=function(a){var c,b=a.length;e.push("M");for(c=0;c<b;c++)1===c&&e.push("L"),e.push(a[c][0],-a[c][1])};b=b||"map";a.features.forEach(function(a){var f=a.geometry,h=f.type,f=f.coordinates;a=a.properties;var k;e=[];"map"===b||"mapbubble"===b?("Polygon"===h?(f.forEach(c),e.push("Z")):"MultiPolygon"===h&&(f.forEach(function(a){a.forEach(c)}),e.push("Z")),e.length&&(k={path:e})):"mapline"===b?("LineString"===h?c(f):"MultiLineString"===h&&f.forEach(c),
-e.length&&(k={path:e})):"mappoint"===b&&"Point"===h&&(k={x:f[0],y:-f[1]});k&&d.push(n(k,{name:a.name||a.NAME,properties:a}))});f&&a.copyrightShort&&(f.chart.mapCredits=r(f.chart.options.credits.mapText,{geojson:a}),f.chart.mapCreditsFull=r(f.chart.options.credits.mapTextFull,{geojson:a}));return d};y(h.prototype,"addCredits",function(a,b){b=e(!0,this.options.credits,b);this.mapCredits&&(b.href=null);a.call(this,b);this.credits&&this.mapCreditsFull&&this.credits.attr({title:this.mapCreditsFull})})})(z);
-(function(a){function p(a,b,d,c,e,g,h,k){return["M",a+e,b,"L",a+d-g,b,"C",a+d-g/2,b,a+d,b+g/2,a+d,b+g,"L",a+d,b+c-h,"C",a+d,b+c-h/2,a+d-h/2,b+c,a+d-h,b+c,"L",a+k,b+c,"C",a+k/2,b+c,a,b+c-k/2,a,b+c-k,"L",a,b+e,"C",a,b+e/2,a+e/2,b,a+e,b,"Z"]}var h=a.Chart,n=a.defaultOptions,r=a.extend,e=a.merge,t=a.pick,y=a.Renderer,d=a.SVGRenderer,b=a.VMLRenderer;r(n.lang,{zoomIn:"Zoom in",zoomOut:"Zoom out"});n.mapNavigation={buttonOptions:{alignTo:"plotBox",align:"left",verticalAlign:"top",x:0,width:18,height:18,
-padding:5,style:{fontSize:"15px",fontWeight:"bold"},theme:{"stroke-width":1,"text-align":"center"}},buttons:{zoomIn:{onclick:function(){this.mapZoom(.5)},text:"+",y:0},zoomOut:{onclick:function(){this.mapZoom(2)},text:"-",y:28}},mouseWheelSensitivity:1.1};a.splitPath=function(a){var b;a=a.replace(/([A-Za-z])/g," $1 ");a=a.replace(/^\s*/,"").replace(/\s*$/,"");a=a.split(/[ ,]+/);for(b=0;b<a.length;b++)/[a-zA-Z]/.test(a[b])||(a[b]=parseFloat(a[b]));return a};a.maps={};d.prototype.symbols.topbutton=
-function(a,b,d,c,e){return p(a-1,b-1,d,c,e.r,e.r,0,0)};d.prototype.symbols.bottombutton=function(a,b,d,c,e){return p(a-1,b-1,d,c,0,0,e.r,e.r)};y===b&&["topbutton","bottombutton"].forEach(function(a){b.prototype.symbols[a]=d.prototype.symbols[a]});a.Map=a.mapChart=function(b,d,p){var c="string"===typeof b||b.nodeName,f=arguments[c?1:0],g=f,n={endOnTick:!1,visible:!1,minPadding:0,maxPadding:0,startOnTick:!1},k,m=a.getOptions().credits;k=f.series;f.series=null;f=e({chart:{panning:"xy",type:"map"},credits:{mapText:t(m.mapText,
-' \u00a9 \x3ca href\x3d"{geojson.copyrightUrl}"\x3e{geojson.copyrightShort}\x3c/a\x3e'),mapTextFull:t(m.mapTextFull,"{geojson.copyright}")},tooltip:{followTouchMove:!1},xAxis:n,yAxis:e(n,{reversed:!0})},f,{chart:{inverted:!1,alignTicks:!1}});f.series=g.series=k;return c?new h(b,f,p):new h(f,d)}})(z)});
-//# sourceMappingURL=map.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
- Annotations module
-
- (c) 2009-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(l){"object"===typeof module&&module.exports?module.exports=l:"function"===typeof define&&define.amd?define(function(){return l}):l("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(l){var B=function(a){return{addEvents:function(){var f=this;a.addEvent(f.graphic.element,"mousedown",function(d){f.onMouseDown(d)});a.objectEach(f.options.events,function(d,b){var c=function(c){"click"===b&&f.cancelClick||d.call(f,f.chart.pointer.normalize(c),f.target)};if("drag"!==b)f.graphic.on(b,
-c);else a.addEvent(f,"drag",c)});f.options.draggable&&(a.addEvent(f,"drag",f.onDrag),f.graphic.renderer.styledMode||f.graphic.css({cursor:{x:"ew-resize",y:"ns-resize",xy:"move"}[f.options.draggable]}))},removeDocEvents:function(){this.removeDrag&&(this.removeDrag=this.removeDrag());this.removeMouseUp&&(this.removeMouseUp=this.removeMouseUp())},onMouseDown:function(f){var d=this,b=d.chart.pointer,c,h;2!==f.button&&(f.stopPropagation(),f=b.normalize(f),c=f.chartX,h=f.chartY,d.cancelClick=!1,d.removeDrag=
-a.addEvent(a.doc,"mousemove",function(p){d.hasDragged=!0;p=b.normalize(p);p.prevChartX=c;p.prevChartY=h;a.fireEvent(d,"drag",p);c=p.chartX;h=p.chartY}),d.removeMouseUp=a.addEvent(a.doc,"mouseup",function(c){d.cancelClick=d.hasDragged;d.hasDragged=!1;d.onMouseUp(c)}))},onMouseUp:function(){this.removeDocEvents()},onDrag:function(a){if(this.chart.isInsidePlot(a.chartX-this.chart.plotLeft,a.chartY-this.chart.plotTop)){var d=this.mouseMoveToTranslation(a);"x"===this.options.draggable&&(d.y=0);"y"===this.options.draggable&&
-(d.x=0);this.points.length?this.translate(d.x,d.y):(this.shapes.forEach(function(b){b.translate(d.x,d.y)}),this.labels.forEach(function(b){b.translate(d.x,d.y)}));this.redraw(!1)}},mouseMoveToRadians:function(a,d,b){var c=a.prevChartY-b,h=a.prevChartX-d;b=a.chartY-b;a=a.chartX-d;this.chart.inverted&&(d=h,h=c,c=d,d=a,a=b,b=d);return Math.atan2(b,a)-Math.atan2(c,h)},mouseMoveToTranslation:function(a){var d=a.chartX-a.prevChartX;a=a.chartY-a.prevChartY;var b;this.chart.inverted&&(b=a,a=d,d=b);return{x:d,
-y:a}},mouseMoveToScale:function(a,d,b){d=(a.chartX-d||1)/(a.prevChartX-d||1);a=(a.chartY-b||1)/(a.prevChartY-b||1);this.chart.inverted&&(b=a,a=d,d=b);return{x:d,y:a}},destroy:function(){this.removeDocEvents();a.removeEvent(this);this.hcEvents=null}}}(l),C=function(a,f){function d(b,c,h,d){this.chart=b;this.target=c;this.options=h;this.index=a.pick(h.index,d)}a.extend(d.prototype,f);d.prototype.setVisibility=function(b){this.graphic.attr("visibility",b?"visible":"hidden");this.options.visible=b};d.prototype.render=
-function(){var b=this.chart,c=this.options;this.graphic=b.renderer.symbol(c.symbol,0,0,c.width,c.height).add(b.controlPointsGroup).css(c.style);this.setVisibility(c.visible);this.addEvents()};d.prototype.redraw=function(b){this.graphic[b?"animate":"attr"](this.options.positioner.call(this,this.target))};d.prototype.destroy=function(){f.destroy.call(this);this.graphic&&(this.graphic=this.graphic.destroy());this.options=this.target=this.chart=null};d.prototype.update=function(b){var c=this.chart,h=
-this.target,d=this.index;b=a.merge(!0,this.options,b);this.destroy();this.constructor(c,h,b,d);this.render(c.controlPointsGroup);this.redraw()};return d}(l,B),z=function(a){function f(d,b,c){this.series={visible:!0,chart:d,getPlotBox:a.Series.prototype.getPlotBox};this.target=b||null;this.options=c;this.applyOptions(this.getOptions())}f.fromPoint=function(a){return new f(a.series.chart,null,{x:a.x,y:a.y,xAxis:a.series.xAxis,yAxis:a.series.yAxis})};f.pointToPixels=function(a,b){var c=a.series,h=c.chart,
-d=a.plotX,g=a.plotY;h.inverted&&(a.mock?(d=a.plotY,g=a.plotX):(d=h.plotWidth-a.plotY,g=h.plotHeight-a.plotX));c&&!b&&(a=c.getPlotBox(),d+=a.translateX,g+=a.translateY);return{x:d,y:g}};f.pointToOptions=function(a){return{x:a.x,y:a.y,xAxis:a.series.xAxis,yAxis:a.series.yAxis}};a.extend(f.prototype,{mock:!0,hasDynamicOptions:function(){return"function"===typeof this.options},getOptions:function(){return this.hasDynamicOptions()?this.options.call(this,this.target):this.options},applyOptions:function(a){this.command=
-a.command;this.setAxis(a,"x");this.setAxis(a,"y");this.refresh()},setAxis:function(d,b){b+="Axis";d=d[b];var c=this.series.chart;this.series[b]=d instanceof a.Axis?d:a.defined(d)?c[b][d]||c.get(d):null},toAnchor:function(){var a=[this.plotX,this.plotY,0,0];this.series.chart.inverted&&(a[0]=this.plotY,a[1]=this.plotX);return a},getLabelConfig:function(){return{x:this.x,y:this.y,point:this}},isInsidePane:function(){var d=this.plotX,b=this.plotY,c=this.series.xAxis,h=this.series.yAxis,p=!0;c&&(p=a.defined(d)&&
-0<=d&&d<=c.len);h&&(p=p&&a.defined(b)&&0<=b&&b<=h.len);return p},refresh:function(){var a=this.series,b=a.xAxis,a=a.yAxis,c=this.getOptions();b?(this.x=c.x,this.plotX=b.toPixels(c.x,!0)):(this.x=null,this.plotX=c.x);a?(this.y=c.y,this.plotY=a.toPixels(c.y,!0)):(this.y=null,this.plotY=c.y);this.isInside=this.isInsidePane()},translate:function(a,b,c,h){this.hasDynamicOptions()||(this.plotX+=c,this.plotY+=h,this.refreshOptions())},scale:function(a,b,c,h){if(!this.hasDynamicOptions()){var d=this.plotY*
-h;this.plotX=(1-c)*a+this.plotX*c;this.plotY=(1-h)*b+d;this.refreshOptions()}},rotate:function(a,b,c){if(!this.hasDynamicOptions()){var h=Math.cos(c);c=Math.sin(c);var d=this.plotX,g=this.plotY,d=d-a,g=g-b;this.plotX=d*h-g*c+a;this.plotY=d*c+g*h+b;this.refreshOptions()}},refreshOptions:function(){var a=this.series,b=a.xAxis,a=a.yAxis;this.x=this.options.x=b?this.options.x=b.toValue(this.plotX,!0):this.plotX;this.y=this.options.y=a?a.toValue(this.plotY,!0):this.plotY}});return f}(l),u=function(a,f,
-d){return{init:function(a,c){this.annotation=a;this.chart=a.chart;this.options=c;this.points=[];this.controlPoints=[];this.linkPoints();this.addControlPoints()},attr:function(){this.graphic.attr.apply(this.graphic,arguments)},getPointsOptions:function(){var b=this.options;return b.points||b.point&&a.splat(b.point)},attrsFromOptions:function(a){var c=this.constructor.attrsMap,b={},d,g,f=this.chart.styledMode;for(d in a)g=c[d],!g||f&&-1!==["fill","stroke","stroke-width"].indexOf(g)||(b[g]=a[d]);return b},
-anchor:function(b){var c=b.series.getPlotBox();b=b.mock?b.toAnchor():a.Tooltip.prototype.getAnchor.call({chart:b.series.chart},b);b={x:b[0]+(this.options.x||0),y:b[1]+(this.options.y||0),height:b[2]||0,width:b[3]||0};return{relativePosition:b,absolutePosition:a.merge(b,{x:b.x+c.translateX,y:b.y+c.translateY})}},point:function(b,c){if(b&&b.series)return b;c&&null!==c.series||(a.isObject(b)?c=new d(this.chart,this,b):a.isString(b)?c=this.chart.get(b)||null:"function"===typeof b&&(c=b.call(c,this),c=
-c.series?c:new d(this.chart,this,b)));return c},linkPoints:function(){var a=this.getPointsOptions(),c=this.points,h=a&&a.length||0,d,g;for(d=0;d<h;d++){g=this.point(a[d],c[d]);if(!g){c.length=0;return}g.mock&&g.refresh();c[d]=g}return c},addControlPoints:function(){var b=this.options.controlPoints;(b||[]).forEach(function(c,h){c=a.merge(this.options.controlPointOptions,c);c.index||(c.index=h);b[h]=c;this.controlPoints.push(new f(this.chart,this,c))},this)},shouldBeDrawn:function(){return!!this.points.length},
-render:function(){this.controlPoints.forEach(function(a){a.render()})},redraw:function(a){this.controlPoints.forEach(function(c){c.redraw(a)})},transform:function(a,c,h,d,g){if(this.chart.inverted){var b=c;c=h;h=b}this.points.forEach(function(b,k){this.transformPoint(a,c,h,d,g,k)},this)},transformPoint:function(a,c,h,p,g,f){var b=this.points[f];b.mock||(b=this.points[f]=d.fromPoint(b));b[a](c,h,p,g)},translate:function(a,c){this.transform("translate",null,null,a,c)},translatePoint:function(a,c,h){this.transformPoint("translate",
-null,null,a,c,h)},rotate:function(a,c,h){this.transform("rotate",a,c,h)},scale:function(a,c,h,d){this.transform("scale",a,c,h,d)},setControlPointsVisibility:function(a){this.controlPoints.forEach(function(c){c.setVisibility(a)})},destroy:function(){this.graphic&&(this.graphic=this.graphic.destroy());this.tracker&&(this.tracker=this.tracker.destroy());this.controlPoints.forEach(function(a){a.destroy()});this.options=this.controlPoints=this.points=this.chart=null;this.annotation&&(this.annotation=null)},
-update:function(b){var c=this.annotation;b=a.merge(!0,this.options,b);var h=this.graphic.parentGroup;this.destroy();this.constructor(c,b);this.render(h);this.redraw()}}}(l,C,z),v=function(a){var f={arrow:{tagName:"marker",render:!1,id:"arrow",refY:5,refX:9,markerWidth:10,markerHeight:10,children:[{tagName:"path",d:"M 0 0 L 10 5 L 0 10 Z",strokeWidth:0}]},"reverse-arrow":{tagName:"marker",render:!1,id:"reverse-arrow",refY:5,refX:1,markerWidth:10,markerHeight:10,children:[{tagName:"path",d:"M 0 5 L 10 0 L 10 10 Z",
-strokeWidth:0}]}};a.SVGRenderer.prototype.addMarker=function(b,c){var h={id:b},d={stroke:c.color||"none",fill:c.color||"rgba(0, 0, 0, 0.75)"};h.children=c.children.map(function(c){return a.merge(d,c)});c=this.definition(a.merge(!0,{markerWidth:20,markerHeight:20,refX:0,refY:0,orient:"auto"},c,h));c.id=b;return c};var d=function(a){return function(c){this.attr(a,"url(#"+c+")")}},d={markerEndSetter:d("marker-end"),markerStartSetter:d("marker-start"),setItemMarkers:function(b){var c=b.options,h=b.chart,
-d=h.options.defs,g=c.fill,f=a.defined(g)&&"none"!==g?g:c.stroke;["markerStart","markerEnd"].forEach(function(g){var k=c[g],e,m,q;if(k){for(q in d)if(e=d[q],k===e.id&&"marker"===e.tagName){m=e;break}m&&(k=b[g]=h.renderer.addMarker((c.id||a.uniqueKey())+"-"+m.id,a.merge(m,{color:f})),b.attr(g,k.attr("id")))}})}};a.SVGRenderer.prototype.definition=function(b){function c(b,d){var g;a.splat(b).forEach(function(b){var k=h.createElement(b.tagName),e={};a.objectEach(b,function(a,c){"tagName"!==c&&"children"!==
-c&&"textContent"!==c&&(e[c]=a)});k.attr(e);k.add(d||h.defs);b.textContent&&k.element.appendChild(a.doc.createTextNode(b.textContent));c(b.children||[],k);g=k});return g}var h=this;return c(b)};a.addEvent(a.Chart,"afterGetContainer",function(){this.options.defs=a.merge(f,this.options.defs||{});a.objectEach(this.options.defs,function(a){"marker"===a.tagName&&!1!==a.render&&this.renderer.addMarker(a.id,a)},this)});return d}(l),v=function(a,f,d){function b(a,c){this.init(a,c)}var c="rgba(192,192,192,"+
-(a.svg?.0001:.002)+")";b.attrsMap={dashStyle:"dashstyle",strokeWidth:"stroke-width",stroke:"stroke",fill:"fill",zIndex:"zIndex"};a.merge(!0,b.prototype,f,{type:"path",setMarkers:d.setItemMarkers,toD:function(){var a=this.options.d;if(a)return"function"===typeof a?a.call(this):a;for(var c=this.points,b=c.length,d=b,f=c[0],k=d&&this.anchor(f).absolutePosition,e=0,m=2,a=k&&["M",k.x,k.y];++e<b&&d;)f=c[e],d=f.command||"L",k=this.anchor(f).absolutePosition,"Z"===d?a[++m]=d:(d!==c[e-1].command&&(a[++m]=
-d),a[++m]=k.x,a[++m]=k.y),d=f.series.visible;return d?this.chart.renderer.crispLine(a,this.graphic.strokeWidth()):null},shouldBeDrawn:function(){return f.shouldBeDrawn.call(this)||!!this.options.d},render:function(b){var h=this.options,g=this.attrsFromOptions(h);this.graphic=this.annotation.chart.renderer.path(["M",0,0]).attr(g).add(b);h.className&&this.graphic.addClass(h.className);this.tracker=this.annotation.chart.renderer.path(["M",0,0]).addClass("highcharts-tracker-line").attr({zIndex:2}).add(b);
-this.annotation.chart.styledMode||this.tracker.attr({"stroke-linejoin":"round",stroke:c,fill:c,"stroke-width":this.graphic.strokeWidth()+2*h.snap});f.render.call(this);a.extend(this.graphic,{markerStartSetter:d.markerStartSetter,markerEndSetter:d.markerEndSetter});this.setMarkers(this)},redraw:function(a){var c=this.toD(),b=a?"animate":"attr";c?(this.graphic[b]({d:c}),this.tracker[b]({d:c})):(this.graphic.attr({d:"M 0 -9000000000"}),this.tracker.attr({d:"M 0 -9000000000"}));this.graphic.placed=this.tracker.placed=
-!!c;f.redraw.call(this,a)}});return b}(l,u,v),F=function(a,f,d){function b(a,b){this.init(a,b)}b.attrsMap=a.merge(d.attrsMap,{width:"width",height:"height"});a.merge(!0,b.prototype,f,{type:"rect",render:function(a){var c=this.attrsFromOptions(this.options);this.graphic=this.annotation.chart.renderer.rect(0,-9E9,0,0).attr(c).add(a);f.render.call(this)},redraw:function(a){var c=this.anchor(this.points[0]).absolutePosition;if(c)this.graphic[a?"animate":"attr"]({x:c.x,y:c.y,width:this.options.width,height:this.options.height});
-else this.attr({x:0,y:-9E9});this.graphic.placed=!!c;f.redraw.call(this,a)},translate:function(a,b){this.translatePoint(a,b,0)}});return b}(l,u,v),G=function(a,f,d){function b(a,b){this.init(a,b)}b.attrsMap=a.merge(d.attrsMap,{r:"r"});a.merge(!0,b.prototype,f,{type:"circle",render:function(a){var c=this.attrsFromOptions(this.options);this.graphic=this.annotation.chart.renderer.circle(0,-9E9,0).attr(c).add(a);f.render.call(this)},redraw:function(a){var c=this.anchor(this.points[0]).absolutePosition;
-if(c)this.graphic[a?"animate":"attr"]({x:c.x,y:c.y,r:this.options.r});else this.graphic.attr({x:0,y:-9E9});this.graphic.placed=!!c;f.redraw.call(this,a)},translate:function(a,b){this.translatePoint(a,b,0)},setRadius:function(a){this.options.r=a}});return b}(l,u,v),D=function(a,f,d){function b(a,b){this.init(a,b)}b.shapesWithoutBackground=["connector"];b.alignedPosition=function(a,b){var c=a.align,d=a.verticalAlign,h=(b.x||0)+(a.x||0),f=(b.y||0)+(a.y||0),k,e;"right"===c?k=1:"center"===c&&(k=2);k&&
-(h+=(b.width-(a.width||0))/k);"bottom"===d?e=1:"middle"===d&&(e=2);e&&(f+=(b.height-(a.height||0))/e);return{x:Math.round(h),y:Math.round(f)}};b.justifiedOptions=function(a,b,d,g){var c=d.align,h=d.verticalAlign,k=b.box?0:b.padding||0,e=b.getBBox();b={align:c,verticalAlign:h,x:d.x,y:d.y,width:b.width,height:b.height};d=g.x-a.plotLeft;var m=g.y-a.plotTop;g=d+k;0>g&&("right"===c?b.align="left":b.x=-g);g=d+e.width-k;g>a.plotWidth&&("left"===c?b.align="right":b.x=a.plotWidth-g);g=m+k;0>g&&("bottom"===
-h?b.verticalAlign="top":b.y=-g);g=m+e.height-k;g>a.plotHeight&&("top"===h?b.verticalAlign="bottom":b.y=a.plotHeight-g);return b};b.attrsMap={backgroundColor:"fill",borderColor:"stroke",borderWidth:"stroke-width",zIndex:"zIndex",borderRadius:"r",padding:"padding"};a.merge(!0,b.prototype,f,{translatePoint:function(a,b){f.translatePoint.call(this,a,b,0)},translate:function(a,b){this.options.x+=a;this.options.y+=b},render:function(a){var c=this.options,d=this.attrsFromOptions(c),g=c.style;this.graphic=
-this.annotation.chart.renderer.label("",0,-9E9,c.shape,null,null,c.useHTML,null,"annotation-label").attr(d).add(a);this.annotation.chart.styledMode||("contrast"===g.color&&(g.color=this.annotation.chart.renderer.getContrast(-1<b.shapesWithoutBackground.indexOf(c.shape)?"#FFFFFF":c.backgroundColor)),this.graphic.css(c.style).shadow(c.shadow));c.className&&this.graphic.addClass(c.className);this.graphic.labelrank=c.labelrank;f.render.call(this)},redraw:function(c){var b=this.options,d=this.text||b.format||
-b.text,g=this.graphic,n=this.points[0];g.attr({text:d?a.format(d,n.getLabelConfig(),this.annotation.chart.time):b.formatter.call(n,this)});b=this.anchor(n);(d=this.position(b))?(g.alignAttr=d,d.anchorX=b.absolutePosition.x,d.anchorY=b.absolutePosition.y,g[c?"animate":"attr"](d)):g.attr({x:0,y:-9E9});g.placed=!!d;f.redraw.call(this,c)},anchor:function(){var a=f.anchor.apply(this,arguments),b=this.options.x||0,d=this.options.y||0;a.absolutePosition.x-=b;a.absolutePosition.y-=d;a.relativePosition.x-=
-b;a.relativePosition.y-=d;return a},position:function(c){var h=this.graphic,f=this.annotation.chart,g=this.points[0],n=this.options,l=c.absolutePosition,k=c.relativePosition,e;if(c=g.series.visible&&d.prototype.isInsidePane.call(g))n.distance?e=a.Tooltip.prototype.getPosition.call({chart:f,distance:a.pick(n.distance,16)},h.width,h.height,{plotX:k.x,plotY:k.y,negative:g.negative,ttBelow:g.ttBelow,h:k.height||k.width}):n.positioner?e=n.positioner.call(this):(g={x:l.x,y:l.y,width:0,height:0},e=b.alignedPosition(a.extend(n,
-{width:h.width,height:h.height}),g),"justify"===this.options.overflow&&(e=b.alignedPosition(b.justifiedOptions(f,h,n,e),g))),n.crop&&(n=e.x-f.plotLeft,g=e.y-f.plotTop,c=f.isInsidePlot(n,g)&&f.isInsidePlot(n+h.width,g+h.height));return c?e:null}});a.SVGRenderer.prototype.symbols.connector=function(b,d,f,g,n){var c=n&&n.anchorX;n=n&&n.anchorY;var k,e,m=f/2;a.isNumber(c)&&a.isNumber(n)&&(k=["M",c,n],e=d-n,0>e&&(e=-g-e),e<f&&(m=c<b+f/2?e:f-e),n>d+g?k.push("L",b+m,d+g):n<d?k.push("L",b+m,d):c<b?k.push("L",
-b,d+g/2):c>b+f&&k.push("L",b+f,d+g/2));return k||[]};return b}(l,u,z),H=function(a,f,d){function b(a,b){this.init(a,b)}b.attrsMap={width:"width",height:"height",zIndex:"zIndex"};a.merge(!0,b.prototype,f,{type:"image",render:function(a){var b=this.attrsFromOptions(this.options),c=this.options;this.graphic=this.annotation.chart.renderer.image(c.src,0,-9E9,c.width,c.height).attr(b).add(a);this.graphic.width=c.width;this.graphic.height=c.height;f.render.call(this)},redraw:function(a){var b=this.anchor(this.points[0]);
-if(b=d.prototype.position.call(this,b))this.graphic[a?"animate":"attr"]({x:b.x,y:b.y});else this.graphic.attr({x:0,y:-9E9});this.graphic.placed=!!b;f.redraw.call(this,a)},translate:function(a,b){this.translatePoint(a,b,0)}});return b}(l,u,D);(function(a,f,d,b,c,h,l,g,n,t){var k=a.merge,e=a.addEvent,m=a.defined,q=a.erase,w=a.find,A=a.isString,E=a.pick,y=a.reduce,p=a.splat,x=a.destroyObjectProperties,r=a.Annotation=function(a,b){var e;this.chart=a;this.points=[];this.controlPoints=[];this.coll="annotations";
-this.labels=[];this.shapes=[];this.options=b;this.userOptions=k(!0,{},b);e=this.getLabelsAndShapesOptions(this.userOptions,b);this.userOptions.labels=e.labels;this.userOptions.shapes=e.shapes;this.init(a,b)};k(!0,r.prototype,f,g,{defaultOptions:{visible:!0,draggable:"xy",labelOptions:{align:"center",allowOverlap:!1,backgroundColor:"rgba(0, 0, 0, 0.75)",borderColor:"black",borderRadius:3,borderWidth:1,className:"",crop:!1,formatter:function(){return m(this.y)?this.y:"Annotation label"},overflow:"justify",
-padding:5,shadow:!1,shape:"callout",style:{fontSize:"11px",fontWeight:"normal",color:"contrast"},useHTML:!1,verticalAlign:"bottom",x:0,y:-16},shapeOptions:{stroke:"rgba(0, 0, 0, 0.75)",strokeWidth:1,fill:"rgba(0, 0, 0, 0.75)",r:0,snap:2},controlPointOptions:{symbol:"circle",width:10,height:10,style:{stroke:"black","stroke-width":2,fill:"white"},visible:!1,events:{}},events:{},zIndex:6},init:function(){this.linkPoints();this.addControlPoints();this.addShapes();this.addLabels();this.addClipPaths();
-this.setLabelCollector()},getLabelsAndShapesOptions:function(a,b){var e={};["labels","shapes"].forEach(function(c){a[c]&&(e[c]=p(b[c]).map(function(b,e){return k(a[c][e],b)}))});return e},addShapes:function(){(this.options.shapes||[]).forEach(function(a,b){a=this.initShape(a);this.options.shapes[b]=a.options},this)},addLabels:function(){(this.options.labels||[]).forEach(function(a,b){a=this.initLabel(a);this.options.labels[b]=a.options},this)},addClipPaths:function(){this.setClipAxes();this.clipXAxis&&
-this.clipYAxis&&(this.clipRect=this.chart.renderer.clipRect(this.getClipBox()))},setClipAxes:function(){var a=this.chart.xAxis,b=this.chart.yAxis,e=y((this.options.labels||[]).concat(this.options.shapes||[]),function(e,c){return[a[c&&c.point&&c.point.xAxis]||e[0],b[c&&c.point&&c.point.yAxis]||e[1]]},[]);this.clipXAxis=e[0];this.clipYAxis=e[1]},getClipBox:function(){return{x:this.clipXAxis.left,y:this.clipYAxis.top,width:this.clipXAxis.width,height:this.clipYAxis.height}},setLabelCollector:function(){var a=
-this;a.labelCollector=function(){return a.labels.reduce(function(a,b){b.options.allowOverlap||a.push(b.graphic);return a},[])};a.chart.labelCollectors.push(a.labelCollector)},setOptions:function(a){this.options=k(this.defaultOptions,a)},redraw:function(a){this.linkPoints();this.graphic||this.render();this.clipRect&&this.clipRect.animate(this.getClipBox());this.redrawItems(this.shapes,a);this.redrawItems(this.labels,a);f.redraw.call(this,a)},redrawItems:function(a,b){for(var e=a.length;e--;)this.redrawItem(a[e],
-b)},render:function(){var a=this.chart.renderer;this.graphic=a.g("annotation").attr({zIndex:this.options.zIndex,visibility:this.options.visible?"visible":"hidden"}).add();this.shapesGroup=a.g("annotation-shapes").add(this.graphic).clip(this.chart.plotBoxClip);this.labelsGroup=a.g("annotation-labels").attr({translateX:0,translateY:0}).add(this.graphic);this.clipRect&&this.graphic.clip(this.clipRect);this.addEvents();f.render.call(this)},setVisibility:function(a){var b=this.options;a=E(a,!b.visible);
-this.graphic.attr("visibility",a?"visible":"hidden");a||this.setControlPointsVisibility(!1);b.visible=a},setControlPointsVisibility:function(a){var b=function(b){b.setControlPointsVisibility(a)};f.setControlPointsVisibility.call(this,a);this.shapes.forEach(b);this.labels.forEach(b)},destroy:function(){var a=this.chart,b=function(a){a.destroy()};this.labels.forEach(b);this.shapes.forEach(b);this.clipYAxis=this.clipXAxis=null;q(a.labelCollectors,this.labelCollector);g.destroy.call(this);f.destroy.call(this);
-x(this,a)},remove:function(){return this.destroy()},update:function(b){var e=this.chart,c=this.getLabelsAndShapesOptions(this.userOptions,b);b=a.merge(!0,this.userOptions,b);b.labels=c.labels;b.shapes=c.shapes;this.destroy();this.constructor(e,b);this.redraw()},initShape:function(a){a=k(this.options.shapeOptions,{controlPointOptions:this.options.controlPointOptions},a);a=new r.shapesMap[a.type](this,a);a.itemType="shape";this.shapes.push(a);return a},initLabel:function(a){a=k(this.options.labelOptions,
-{controlPointOptions:this.options.controlPointOptions},a);a=new l(this,a);a.itemType="label";this.labels.push(a);return a},redrawItem:function(b,e){b.linkPoints();b.shouldBeDrawn()?(b.graphic||this.renderItem(b),b.redraw(a.pick(e,!0)&&b.graphic.placed),b.points.length&&this.adjustVisibility(b)):this.destroyItem(b)},adjustVisibility:function(a){var b=!1,e=a.graphic;a.points.forEach(function(a){!1!==a.series.visible&&!1!==a.visible&&(b=!0)});b?"hidden"===e.visibility&&e.show():e.hide()},destroyItem:function(a){q(this[a.itemType+
-"s"],a);a.destroy()},renderItem:function(a){a.render("label"===a.itemType?this.labelsGroup:this.shapesGroup)}});r.shapesMap={rect:d,circle:b,path:c,image:h};r.types={};r.MockPoint=n;r.ControlPoint=t;a.extendAnnotation=function(a,b,e,c){b=b||r;k(!0,a.prototype,b.prototype,e);a.prototype.defaultOptions=k(a.prototype.defaultOptions,c||{})};a.Chart.prototype.collectionsWithUpdate.push("annotations");a.extend(a.Chart.prototype,{initAnnotation:function(b){var e=r.types[b.type]||r;b=a.merge(e.prototype.defaultOptions,
-b);e=new e(this,b);this.annotations.push(e);return e},addAnnotation:function(a,b){a=this.initAnnotation(a);this.options.annotations.push(a.options);E(b,!0)&&a.redraw();return a},removeAnnotation:function(a){var b=this.annotations,e=A(a)?w(b,function(b){return b.options.id===a}):a;e&&(q(this.options.annotations,e.options),q(b,e),e.destroy())},drawAnnotations:function(){this.plotBoxClip.attr(this.plotBox);this.annotations.forEach(function(a){a.redraw()})}});a.Chart.prototype.callbacks.push(function(a){a.annotations=
-[];a.options.annotations||(a.options.annotations=[]);a.plotBoxClip=this.renderer.clipRect(this.plotBox);a.controlPointsGroup=a.renderer.g("control-points").attr({zIndex:99}).clip(a.plotBoxClip).add();a.options.annotations.forEach(function(b,e){b=a.initAnnotation(b);a.options.annotations[e]=b.options});a.drawAnnotations();e(a,"redraw",a.drawAnnotations);e(a,"destroy",function(){a.plotBoxClip.destroy();a.controlPointsGroup.destroy()})})})(l,u,F,G,v,H,D,B,z,C);(function(a){function f(b){var e=b.prototype.defaultOptions.events&&
-b.prototype.defaultOptions.events.click;a.merge(!0,b.prototype.defaultOptions.events,{click:function(a){var b=this,c=b.chart.navigationBindings,d=c.activeAnnotation;e&&e.click.call(b,a);d!==b?(c.deselectAnnotation(),c.activeAnnotation=b,b.setControlPointsVisibility(!0),g(c,"showPopup",{annotation:b,formType:"annotation-toolbar",options:c.annotationToFields(b),onSubmit:function(a){var e={};"remove"===a.actionType?(c.activeAnnotation=!1,c.chart.removeAnnotation(b)):(c.fieldsToOptions(a.fields,e),c.deselectAnnotation(),
-a=e.typeOptions,"measure"===b.options.type&&(a.crosshairY.enabled=0!==a.crosshairY.strokeWidth,a.crosshairX.enabled=0!==a.crosshairX.strokeWidth),b.update(e))}})):(c.deselectAnnotation(),g(c,"closePopup"));a.activeAnnotation=!0}})}var d=a.doc,b=a.addEvent,c=a.pick,h=a.extend,l=a.isNumber,g=a.fireEvent,n=a.isArray,t=a.isObject,k=a.objectEach;a.NavigationBindings=function(a,b){this.chart=a;this.options=b;this.eventsToUnbind=[];this.container=d.getElementsByClassName(this.options.bindingsClassName)};
-a.NavigationBindings.annotationsEditable={nestedOptions:{labelOptions:["style","format","backgroundColor"],labels:["style"],label:["style"],style:["fontSize","color"],background:["fill","strokeWidth","stroke"],innerBackground:["fill","strokeWidth","stroke"],outerBackground:["fill","strokeWidth","stroke"],shapeOptions:["fill","strokeWidth","stroke"],shapes:["fill","strokeWidth","stroke"],line:["strokeWidth","stroke"],backgroundColors:[!0],connector:["fill","strokeWidth","stroke"],crosshairX:["strokeWidth",
-"stroke"],crosshairY:["strokeWidth","stroke"]},circle:["shapes"],verticalLine:[],label:["labelOptions"],measure:["background","crosshairY","crosshairX"],fibonacci:[],tunnel:["background","line","height"],pitchfork:["innerBackground","outerBackground"],rect:["shapes"],crookedLine:[]};a.NavigationBindings.annotationsNonEditable={rectangle:["crosshairX","crosshairY","label"]};h(a.NavigationBindings.prototype,{initEvents:function(){var a=this,c=a.chart,d=a.container,f=a.options;a.boundClassNames={};k(f.bindings,
-function(b){a.boundClassNames[b.className]=b});[].forEach.call(d,function(e){a.eventsToUnbind.push(b(e,"click",function(b){var e=a.getButtonEvents(d,b);e&&a.bindingsButtonClick(e.button,e.events,b)}))});k(f.events||{},function(e,c){a.eventsToUnbind.push(b(a,c,e))});a.eventsToUnbind.push(b(c.container,"click",function(b){!c.cancelClick&&c.isInsidePlot(b.chartX-c.plotLeft,b.chartY-c.plotTop)&&a.bindingsChartClick(this,b)}));a.eventsToUnbind.push(b(c.container,"mousemove",function(b){a.bindingsContainerMouseMove(this,
-b)}))},bindingsButtonClick:function(a,b,c){var e=this.chart;this.selectedButtonElement&&(g(this,"deselectButton",{button:this.selectedButtonElement}),this.nextEvent&&(this.currentUserDetails&&"annotations"===this.currentUserDetails.coll&&e.removeAnnotation(this.currentUserDetails),this.mouseMoveEvent=this.nextEvent=!1));this.selectedButton=b;this.selectedButtonElement=a;g(this,"selectButton",{button:a});b.init&&b.init.call(this,a,c);(b.start||b.steps)&&e.renderer.boxWrapper.addClass("highcharts-draw-mode")},
-bindingsChartClick:function(a,b){a=this.selectedButton;var c=this.chart.renderer.boxWrapper;this.activeAnnotation&&!b.activeAnnotation&&b.target.parentNode&&!b.target.closest(".highcharts-popup")&&(g(this,"closePopup"),this.deselectAnnotation());a&&a.start&&(this.nextEvent?(this.nextEvent.call(this,b,this.currentUserDetails),this.steps&&(this.stepIndex++,a.steps[this.stepIndex]?this.mouseMoveEvent=this.nextEvent=a.steps[this.stepIndex]:(g(this,"deselectButton",{button:this.selectedButtonElement}),
-c.removeClass("highcharts-draw-mode"),a.end&&a.end.call(this,b,this.currentUserDetails),this.mouseMoveEvent=this.nextEvent=!1,this.selectedButton=null))):(this.currentUserDetails=a.start.call(this,b),a.steps?(this.stepIndex=0,this.steps=!0,this.mouseMoveEvent=this.nextEvent=a.steps[this.stepIndex]):(g(this,"deselectButton",{button:this.selectedButtonElement}),c.removeClass("highcharts-draw-mode"),this.steps=!1,this.selectedButton=null,a.end&&a.end.call(this,b,this.currentUserDetails))))},bindingsContainerMouseMove:function(a,
-b){this.mouseMoveEvent&&this.mouseMoveEvent.call(this,b,this.currentUserDetails)},fieldsToOptions:function(a,b){k(a,function(a,e){var d=parseFloat(a),k=e.split("."),q=b,m=k.length-1;!l(d)||a.match(/px/g)||e.match(/format/g)||(a=d);""!==a&&"undefined"!==a&&k.forEach(function(b,e){var d=c(k[e+1],"");m===e?q[b]=a:(q[b]||(q[b]=d.match(/\d/g)?[]:{}),q=q[b])})});return b},deselectAnnotation:function(){this.activeAnnotation&&(this.activeAnnotation.setControlPointsVisibility(!1),this.activeAnnotation=!1)},
-annotationToFields:function(b){function e(c,d,q,f){var m;q&&-1===l.indexOf(d)&&(0<=(q.indexOf&&q.indexOf(d))||q[d]||!0===q)&&(n(c)?(f[d]=[],c.forEach(function(a,b){t(a)?(f[d][b]={},k(a,function(a,c){e(a,c,g[d],f[d][b])})):e(a,0,g[d],f[d])})):t(c)?(m={},n(f)?(f.push(m),m[d]={},m=m[d]):f[d]=m,k(c,function(a,b){e(a,b,0===d?q:g[d],m)})):"format"===d?f[d]=[a.format(c,b.labels[0].points[0]).toString(),"text"]:n(f)?f.push([c,h(c)]):f[d]=[c,h(c)])}var d=b.options,f=a.NavigationBindings.annotationsEditable,
-g=f.nestedOptions,h=this.utils.getFieldType,y=c(d.type,d.shapes&&d.shapes[0]&&d.shapes[0].type,d.labels&&d.labels[0]&&d.labels[0].itemType,"label"),l=a.NavigationBindings.annotationsNonEditable[d.langKey]||[],p={langKey:d.langKey,type:y};k(d,function(a,b){"typeOptions"===b?(p[b]={},k(d[b],function(a,c){e(a,c,g,p[b],!0)})):e(a,b,f[y],p)});return p},getClickedClassNames:function(b,c){var e=c.target;c=[];for(var d;e&&((d=a.attr(e,"class"))&&(c=c.concat(d.split(" ").map(function(a){return[a,e]}))),e=
-e.parentNode,e!==b););return c},getButtonEvents:function(a,b){var c=this,e;this.getClickedClassNames(a,b).forEach(function(a){c.boundClassNames[a[0]]&&!e&&(e={events:c.boundClassNames[a[0]],button:a[1]})});return e},update:function(){this.removeEvents();this.initEvents()},removeEvents:function(){this.eventsToUnbind.forEach(function(a){a()})},destroy:function(){this.removeEvents()},utils:{updateRectSize:function(a,b){var c=b.options.typeOptions,e=this.chart.xAxis[0].toPixels(c.point.x),c=this.chart.yAxis[0].toPixels(c.point.y);
-b.update({typeOptions:{background:{width:a.chartX-e+"px",height:a.chartY-c+"px"}}})},getFieldType:function(a){return{string:"text",number:"number","boolean":"checkbox"}[typeof a]}}});b(a.Chart,"load",function(){var b=this.options;b&&b.navigation&&b.navigation.bindings&&(this.navigationBindings=new a.NavigationBindings(this,b.navigation),this.navigationBindings.initEvents())});b(a.Chart,"destroy",function(){this.navigationBindings&&this.navigationBindings.destroy()});b(a.NavigationBindings,"deselectButton",
-function(){this.selectedButtonElement=null});a.Annotation&&(f(a.Annotation),a.objectEach(a.Annotation.types,function(a){f(a)}));a.setOptions({lang:{navigation:{popup:{simpleShapes:"Simple shapes",lines:"Lines",circle:"Circle",rectangle:"Rectangle",label:"Label",shapeOptions:"Shape options",typeOptions:"Details",fill:"Fill",format:"Text",strokeWidth:"Line width",stroke:"Line color",title:"Title",name:"Name",labelOptions:"Label options",labels:"Labels",backgroundColor:"Background color",backgroundColors:"Background colors",
-borderColor:"Border color",borderRadius:"Border radius",borderWidth:"Border width",style:"Style",padding:"Padding",fontSize:"Font size",color:"Color",height:"Height",shapes:"Shape options"}}},navigation:{bindingsClassName:"highcharts-bindings-wrapper",bindings:{circleAnnotation:{className:"highcharts-circle-annotation",start:function(b){var c=this.chart.xAxis[0].toValue(b.chartX);b=this.chart.yAxis[0].toValue(b.chartY);return this.chart.addAnnotation({langKey:"circle",shapes:[{type:"circle",point:{xAxis:0,
-yAxis:0,x:c,y:b},r:5,controlPoints:[{positioner:function(b){var c=a.Annotation.MockPoint.pointToPixels(b.points[0]);b=b.options.r;return{x:c.x+b*Math.cos(Math.PI/4)-this.graphic.width/2,y:c.y+b*Math.sin(Math.PI/4)-this.graphic.height/2}},events:{drag:function(a,b){a=this.mouseMoveToTranslation(a);b.setRadius(Math.max(b.options.r+a.y/Math.sin(Math.PI/4),5));b.redraw(!1)}}}]}]})},steps:[function(a,b){var c=b.options.shapes[0].point,d=this.chart.xAxis[0].toPixels(c.x),c=this.chart.yAxis[0].toPixels(c.y);
-b.update({shapes:[{r:Math.max(Math.sqrt(Math.pow(d-a.chartX,2)+Math.pow(c-a.chartY,2)),5)}]})}]},rectangleAnnotation:{className:"highcharts-rectangle-annotation",start:function(b){var c=this.chart.xAxis[0].toValue(b.chartX);b=this.chart.yAxis[0].toValue(b.chartY);return this.chart.addAnnotation({langKey:"rectangle",shapes:[{type:"rect",point:{x:c,y:b,xAxis:0,yAxis:0},width:5,height:5,controlPoints:[{positioner:function(b){var c=a.Annotation.MockPoint.pointToPixels(b.points[0]);return{x:c.x+b.options.width-
-4,y:c.y+b.options.height-4}},events:{drag:function(a,b){a=this.mouseMoveToTranslation(a);b.options.width=Math.max(b.options.width+a.x,5);b.options.height=Math.max(b.options.height+a.y,5);b.redraw(!1)}}}]}]})},steps:[function(a,b){var c=this.chart.yAxis[0],d=b.options.shapes[0].point,e=this.chart.xAxis[0].toPixels(d.x),c=c.toPixels(d.y);b.update({shapes:[{width:Math.max(a.chartX-e,5),height:Math.max(a.chartY-c,5),point:{x:d.x,y:d.y}}]})}]},labelAnnotation:{className:"highcharts-label-annotation",start:function(b){var c=
-this.chart.xAxis[0].toValue(b.chartX);b=this.chart.yAxis[0].toValue(b.chartY);this.chart.addAnnotation({langKey:"label",labelOptions:{format:"{y:.2f}"},labels:[{point:{x:c,y:b,xAxis:0,yAxis:0},controlPoints:[{symbol:"triangle-down",positioner:function(b){if(!b.graphic.placed)return{x:0,y:-9E7};b=a.Annotation.MockPoint.pointToPixels(b.points[0]);return{x:b.x-this.graphic.width/2,y:b.y-this.graphic.height/2}},events:{drag:function(a,b){a=this.mouseMoveToTranslation(a);b.translatePoint(a.x,a.y);b.redraw(!1)}}},
-{symbol:"square",positioner:function(a){return a.graphic.placed?{x:a.graphic.alignAttr.x-this.graphic.width/2,y:a.graphic.alignAttr.y-this.graphic.height/2}:{x:0,y:-9E7}},events:{drag:function(a,b){a=this.mouseMoveToTranslation(a);b.translate(a.x,a.y);b.redraw(!1)}}}],overflow:"none",crop:!0}]})}}},events:{}}})})(l);(function(a){var f=a.addEvent,d=a.createElement,b=a.objectEach,c=a.pick,h=a.wrap,l=a.isString,g=a.isObject,n=a.isArray,t=/\d/g;h(a.Pointer.prototype,"onContainerMouseDown",function(a,
-b){var c=b.target&&b.target.className;l(c)&&0<=c.indexOf("highcharts-popup-field")||a.apply(this,Array.prototype.slice.call(arguments,1))});a.Popup=function(a){this.init(a)};a.Popup.prototype={init:function(a){this.container=d("div",{className:"highcharts-popup"},null,a);this.lang=this.getLangpack();this.addCloseBtn.call(this)},addCloseBtn:function(){var a=this,b;b=d("div",{className:"highcharts-popup-close"},null,this.container);f(b,"click",function(){a.closePopup.call(a)})},addColsContainer:function(a){var b;
-b=d("div",{className:"highcharts-popup-lhs-col"},null,a);a=d("div",{className:"highcharts-popup-rhs-col"},null,a);d("div",{className:"highcharts-popup-rhs-col-wrapper"},null,a);return{lhsCol:b,rhsCol:a}},addInput:function(a,b,c,f){var e=a.split("."),e=e[e.length-1],k=this.lang;b="highcharts-"+b+"-"+e;b.match(t)||d("label",{innerHTML:k[e]||e,htmlFor:b},null,c);d("input",{name:b,value:f[0],type:f[1],className:"highcharts-popup-field"},null,c).setAttribute("highcharts-data-name",a)},addButton:function(a,
-b,c,g,h){var e=this,k=this.closePopup,m=this.getFields;a=d("button",{innerHTML:b},null,a);f(a,"click",function(){k.call(e);return g(m(h,c))});return a},getFields:function(a,b){var c=a.querySelectorAll("input"),d=a.querySelectorAll("#highcharts-select-series \x3e option:checked")[0];a=a.querySelectorAll("#highcharts-select-volume \x3e option:checked")[0];var e,k,f;f={actionType:b,linkedTo:d&&d.getAttribute("value"),fields:{}};c.forEach(function(a){k=a.getAttribute("highcharts-data-name");(e=a.getAttribute("highcharts-data-series-id"))?
-f.seriesId=a.value:k?f.fields[k]=a.value:f.type=a.value});a&&(f.fields["params.volumeSeriesID"]=a.getAttribute("value"));return f},showPopup:function(){var a=this.container,b=a.querySelectorAll(".highcharts-popup-close")[0];a.innerHTML="";0<=a.className.indexOf("highcharts-annotation-toolbar")&&(a.classList.remove("highcharts-annotation-toolbar"),a.removeAttribute("style"));a.appendChild(b);a.style.display="block"},closePopup:function(){this.popup.container.style.display="none"},showForm:function(a,
-b,c,d){this.popup=b.navigationBindings.popup;this.showPopup();"indicators"===a&&this.indicators.addForm.call(this,b,c,d);"annotation-toolbar"===a&&this.annotations.addToolbar.call(this,b,c,d);"annotation-edit"===a&&this.annotations.addForm.call(this,b,c,d);"flag"===a&&this.annotations.addForm.call(this,b,c,d,!0)},getLangpack:function(){return a.getOptions().lang.navigation.popup},annotations:{addToolbar:function(a,b,f){var e=this,k=this.lang,g=this.popup.container,h=this.showForm,m;-1===g.className.indexOf("highcharts-annotation-toolbar")&&
-(g.className+=" highcharts-annotation-toolbar");g.style.top=a.plotTop+10+"px";d("span",{innerHTML:c(k[b.langKey]||b.langKey,b.shapes&&b.shapes[0].type)},null,g);m=this.addButton.call(this,g,k.removeButton||"remove","remove",f,g);m.className+=" highcharts-annotation-remove-button";m=this.addButton.call(this,g,k.editButton||"edit","edit",function(){h.call(e,"annotation-edit",a,b,f)},g);m.className+=" highcharts-annotation-edit-button"},addForm:function(a,b,c,f){var e=this.popup.container,k=this.lang,
-g,h;d("h2",{innerHTML:k[b.langKey]||b.langKey,className:"highcharts-popup-main-title"},null,e);h=d("div",{className:"highcharts-popup-lhs-col highcharts-popup-lhs-full"},null,e);g=d("div",{className:"highcharts-popup-bottom-row"},null,e);this.annotations.addFormFields.call(this,h,a,"",b,[],!0);this.addButton.call(this,g,f?k.addButton||"add":k.saveButton||"save",f?"add":"save",c,e)},addFormFields:function(a,c,f,h,l,A){var e=this,k=this.annotations.addFormFields,m=this.addInput,q=this.lang,p,w;b(h,
-function(b,d){p=""!==f?f+"."+d:d;g(b)&&(!n(b)||n(b)&&g(b[0])?(w=q[d]||d,w.match(t)||l.push([!0,w,a]),k.call(e,a,c,p,b,l,!1)):l.push([e,p,"annotation",a,b]))});A&&(l=l.sort(function(a){return a[1].match(/format/g)?-1:1}),l.forEach(function(a){!0===a[0]?d("span",{className:"highcharts-annotation-title",innerHTML:a[1]},null,a[2]):m.apply(a[0],a.splice(1))}))}},indicators:{addForm:function(a,b,c){var d=this.indicators,e=this.lang,f;this.tabs.init.call(this,a);b=this.popup.container.querySelectorAll(".highcharts-tab-item-content");
-this.addColsContainer(b[0]);d.addIndicatorList.call(this,a,b[0],"add");f=b[0].querySelectorAll(".highcharts-popup-rhs-col")[0];this.addButton.call(this,f,e.addButton||"add","add",c,f);this.addColsContainer(b[1]);d.addIndicatorList.call(this,a,b[1],"edit");f=b[1].querySelectorAll(".highcharts-popup-rhs-col")[0];this.addButton.call(this,f,e.saveButton||"save","edit",c,f);this.addButton.call(this,f,e.removeButton||"remove","remove",c,f)},addIndicatorList:function(c,e,g){var k=this,h=e.querySelectorAll(".highcharts-popup-lhs-col")[0];
-e=e.querySelectorAll(".highcharts-popup-rhs-col")[0];var m=a.getOptions(),l="edit"===g,n=l?c.series:m.plotOptions,p=this.indicators.addFormFields,x,r,t;r=d("ul",{className:"highcharts-indicator-list"},null,h);x=e.querySelectorAll(".highcharts-popup-rhs-col-wrapper")[0];b(n,function(a,b){var e=a.options;if(a.params||e&&e.params){var g=k.indicators.getNameType(a,b);t=d("li",{className:"highcharts-indicator-list",innerHTML:g.name},null,r);f(t,"click",function(){p.call(k,c,l?a:n[g.type],g.type,x);l&&
-a.options&&d("input",{type:"hidden",name:"highcharts-id-"+g.type,value:a.options.id},null,x).setAttribute("highcharts-data-series-id",a.options.id)})}});0<r.childNodes.length&&r.childNodes[0].click()},getNameType:function(b,c){var d=b.options,e=a.seriesTypes,e=e[c]&&e[c].prototype.nameBase||c.toUpperCase();d&&d.type&&(c=b.options.type,e=b.name);return{name:e,type:c}},listAllSeries:function(a,b,c,f){a="highcharts-"+b+"-type-"+a;var e,g;d("label",{innerHTML:this.lang[b]||b,htmlFor:a},null,f);e=d("select",
-{name:a,className:"highcharts-popup-field"},null,f);e.setAttribute("id","highcharts-select-"+b);c.series.forEach(function(a){g=a.options;!g.params&&g.id&&"highcharts-navigator-series"!==g.id&&d("option",{innerHTML:g.name||g.id,value:g.id},null,e)})},addFormFields:function(a,b,c,f){var e=b.params||b.options.params,g=this.indicators.getNameType;f.innerHTML="";d("h3",{className:"highcharts-indicator-title",innerHTML:g(b,c).name},null,f);d("input",{type:"hidden",name:"highcharts-type-"+c,value:c},null,
-f);this.indicators.listAllSeries.call(this,c,"series",a,f);e.volumeSeriesID&&this.indicators.listAllSeries.call(this,c,"volume",a,f);this.indicators.addParamInputs.call(this,a,"params",e,c,f)},addParamInputs:function(a,c,d,f,h){var e=this,k=this.indicators.addParamInputs,m=this.addInput,l;b(d,function(b,d){l=c+"."+d;g(b)?k.call(e,a,l,b,f,h):"params.volumeSeriesID"!==l&&m.call(e,l,f,h,[b,"text"])})},getAmount:function(){var a=0;b(this.series,function(b){var c=b.options;(b.params||c&&c.params)&&a++});
-return a}},tabs:{init:function(a){var b=this.tabs;a=this.indicators.getAmount.call(a);var c;c=b.addMenuItem.call(this,"add");b.addMenuItem.call(this,"edit",a);b.addContentItem.call(this,"add");b.addContentItem.call(this,"edit");b.switchTabs.call(this,a);b.selectTab.call(this,c,0)},addMenuItem:function(a,b){var c=this.popup.container,e="highcharts-tab-item",f=this.lang;0===b&&(e+=" highcharts-tab-disabled");b=d("span",{innerHTML:f[a+"Button"]||a,className:e},null,c);b.setAttribute("highcharts-data-tab-type",
-a);return b},addContentItem:function(){return d("div",{className:"highcharts-tab-item-content"},null,this.popup.container)},switchTabs:function(a){var b=this,c;this.popup.container.querySelectorAll(".highcharts-tab-item").forEach(function(d,e){c=d.getAttribute("highcharts-data-tab-type");"edit"===c&&0===a||f(d,"click",function(){b.tabs.deselectAll.call(b);b.tabs.selectTab.call(b,this,e)})})},selectTab:function(a,b){var c=this.popup.container.querySelectorAll(".highcharts-tab-item-content");a.className+=
-" highcharts-tab-item-active";c[b].className+=" highcharts-tab-item-show"},deselectAll:function(){var a=this.popup.container,b=a.querySelectorAll(".highcharts-tab-item"),a=a.querySelectorAll(".highcharts-tab-item-content"),c;for(c=0;c<b.length;c++)b[c].classList.remove("highcharts-tab-item-active"),a[c].classList.remove("highcharts-tab-item-show")}}};f(a.NavigationBindings,"showPopup",function(b){this.popup||(this.popup=new a.Popup(this.chart.container));this.popup.showForm(b.formType,this.chart,
-b.options,b.onSubmit)});f(a.NavigationBindings,"closePopup",function(){this.popup&&this.popup.closePopup()})})(l)});
-//# sourceMappingURL=annotations.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
- Boost module
-
- (c) 2010-2018 Highsoft AS
- Author: Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(z){"object"===typeof module&&module.exports?module.exports=z:"function"===typeof define&&define.amd?define(function(){return z}):z("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(z){(function(l){function z(){var a=Array.prototype.slice.call(arguments),c=-Number.MAX_VALUE;a.forEach(function(a){if("undefined"!==typeof a&&null!==a&&"undefined"!==typeof a.length&&0<a.length)return c=a.length,!0});return c}function V(a){var c=0,d=0,f=G(a.options.boost&&a.options.boost.allowForce,
-!0),b;if("undefined"!==typeof a.boostForceChartBoost)return a.boostForceChartBoost;if(1<a.series.length)for(var l=0;l<a.series.length;l++)b=a.series[l],0!==b.options.boostThreshold&&!1!==b.visible&&"heatmap"!==b.type&&(H[b.type]&&++d,z(b.processedXData,b.options.data,b.points)>=(b.options.boostThreshold||Number.MAX_VALUE)&&++c);a.boostForceChartBoost=f&&(d===a.series.length&&0<c||5<c);return a.boostForceChartBoost}function P(a){return G(a&&a.options&&a.options.boost&&a.options.boost.enabled,!0)}function pa(a){function c(){k.length&&
-l.error("[highcharts boost] shader error - "+k.join("\n"))}function d(b,e){var c=a.createShader("vertex"===e?a.VERTEX_SHADER:a.FRAGMENT_SHADER);a.shaderSource(c,b);a.compileShader(c);return a.getShaderParameter(c,a.COMPILE_STATUS)?c:(k.push("when compiling "+e+" shader:\n"+a.getShaderInfoLog(c)),!1)}function f(){function b(b){return a.getUniformLocation(h,b)}var f=d("#version 100\nprecision highp float;\nattribute vec4 aVertexPosition;\nattribute vec4 aColor;\nvarying highp vec2 position;\nvarying highp vec4 vColor;\nuniform mat4 uPMatrix;\nuniform float pSize;\nuniform float translatedThreshold;\nuniform bool hasThreshold;\nuniform bool skipTranslation;\nuniform float plotHeight;\nuniform float xAxisTrans;\nuniform float xAxisMin;\nuniform float xAxisMinPad;\nuniform float xAxisPointRange;\nuniform float xAxisLen;\nuniform bool  xAxisPostTranslate;\nuniform float xAxisOrdinalSlope;\nuniform float xAxisOrdinalOffset;\nuniform float xAxisPos;\nuniform bool  xAxisCVSCoord;\nuniform float yAxisTrans;\nuniform float yAxisMin;\nuniform float yAxisMinPad;\nuniform float yAxisPointRange;\nuniform float yAxisLen;\nuniform bool  yAxisPostTranslate;\nuniform float yAxisOrdinalSlope;\nuniform float yAxisOrdinalOffset;\nuniform float yAxisPos;\nuniform bool  yAxisCVSCoord;\nuniform bool  isBubble;\nuniform bool  bubbleSizeByArea;\nuniform float bubbleZMin;\nuniform float bubbleZMax;\nuniform float bubbleZThreshold;\nuniform float bubbleMinSize;\nuniform float bubbleMaxSize;\nuniform bool  bubbleSizeAbs;\nuniform bool  isInverted;\nfloat bubbleRadius(){\nfloat value \x3d aVertexPosition.w;\nfloat zMax \x3d bubbleZMax;\nfloat zMin \x3d bubbleZMin;\nfloat radius \x3d 0.0;\nfloat pos \x3d 0.0;\nfloat zRange \x3d zMax - zMin;\nif (bubbleSizeAbs){\nvalue \x3d value - bubbleZThreshold;\nzMax \x3d max(zMax - bubbleZThreshold, zMin - bubbleZThreshold);\nzMin \x3d 0.0;\n}\nif (value \x3c zMin){\nradius \x3d bubbleZMin / 2.0 - 1.0;\n} else {\npos \x3d zRange \x3e 0.0 ? (value - zMin) / zRange : 0.5;\nif (bubbleSizeByArea \x26\x26 pos \x3e 0.0){\npos \x3d sqrt(pos);\n}\nradius \x3d ceil(bubbleMinSize + pos * (bubbleMaxSize - bubbleMinSize)) / 2.0;\n}\nreturn radius * 2.0;\n}\nfloat translate(float val,\nfloat pointPlacement,\nfloat localA,\nfloat localMin,\nfloat minPixelPadding,\nfloat pointRange,\nfloat len,\nbool  cvsCoord\n){\nfloat sign \x3d 1.0;\nfloat cvsOffset \x3d 0.0;\nif (cvsCoord) {\nsign *\x3d -1.0;\ncvsOffset \x3d len;\n}\nreturn sign * (val - localMin) * localA + cvsOffset + \n(sign * minPixelPadding);\n}\nfloat xToPixels(float value){\nif (skipTranslation){\nreturn value;// + xAxisPos;\n}\nreturn translate(value, 0.0, xAxisTrans, xAxisMin, xAxisMinPad, xAxisPointRange, xAxisLen, xAxisCVSCoord);// + xAxisPos;\n}\nfloat yToPixels(float value, float checkTreshold){\nfloat v;\nif (skipTranslation){\nv \x3d value;// + yAxisPos;\n} else {\nv \x3d translate(value, 0.0, yAxisTrans, yAxisMin, yAxisMinPad, yAxisPointRange, yAxisLen, yAxisCVSCoord);// + yAxisPos;\nif (v \x3e plotHeight) {\nv \x3d plotHeight;\n}\n}\nif (checkTreshold \x3e 0.0 \x26\x26 hasThreshold) {\nv \x3d min(v, translatedThreshold);\n}\nreturn v;\n}\nvoid main(void) {\nif (isBubble){\ngl_PointSize \x3d bubbleRadius();\n} else {\ngl_PointSize \x3d pSize;\n}\nvColor \x3d aColor;\nif (isInverted) {\ngl_Position \x3d uPMatrix * vec4(xToPixels(aVertexPosition.y) + yAxisPos, yToPixels(aVertexPosition.x, aVertexPosition.z) + xAxisPos, 0.0, 1.0);\n} else {\ngl_Position \x3d uPMatrix * vec4(xToPixels(aVertexPosition.x) + xAxisPos, yToPixels(aVertexPosition.y, aVertexPosition.z) + yAxisPos, 0.0, 1.0);\n}\n}",
-"vertex"),l=d("precision highp float;\nuniform vec4 fillColor;\nvarying highp vec2 position;\nvarying highp vec4 vColor;\nuniform sampler2D uSampler;\nuniform bool isCircle;\nuniform bool hasColor;\nvoid main(void) {\nvec4 col \x3d fillColor;\nvec4 tcol;\nif (hasColor) {\ncol \x3d vColor;\n}\nif (isCircle) {\ntcol \x3d texture2D(uSampler, gl_PointCoord.st);\ncol *\x3d tcol;\nif (tcol.r \x3c 0.0) {\ndiscard;\n} else {\ngl_FragColor \x3d col;\n}\n} else {\ngl_FragColor \x3d col;\n}\n}","fragment");
-if(!f||!l)return h=!1,c(),!1;h=a.createProgram();a.attachShader(h,f);a.attachShader(h,l);a.linkProgram(h);if(!a.getProgramParameter(h,a.LINK_STATUS))return k.push(a.getProgramInfoLog(h)),c(),h=!1;a.useProgram(h);a.bindAttribLocation(h,0,"aVertexPosition");m=b("uPMatrix");Q=b("pSize");n=b("fillColor");g=b("isBubble");A=b("bubbleSizeAbs");e=b("bubbleSizeByArea");I=b("uSampler");v=b("skipTranslation");F=b("isCircle");B=b("isInverted");p=b("plotHeight");return!0}function b(b,e){a&&h&&(b=N[b]=N[b]||a.getUniformLocation(h,
-b),a.uniform1f(b,e))}var N={},h,m,Q,n,g,A,e,v,F,B,p,k=[],I;return a&&!f()?!1:{psUniform:function(){return Q},pUniform:function(){return m},fillColorUniform:function(){return n},setPlotHeight:function(b){a&&h&&a.uniform1f(p,b)},setBubbleUniforms:function(c,d,f){var l=c.options,u=Number.MAX_VALUE,w=-Number.MAX_VALUE;a&&h&&"bubble"===c.type&&(u=G(l.zMin,Math.min(u,Math.max(d,!1===l.displayNegative?l.zThreshold:-Number.MAX_VALUE))),w=G(l.zMax,Math.max(w,f)),a.uniform1i(g,1),a.uniform1i(F,1),a.uniform1i(e,
-"width"!==c.options.sizeBy),a.uniform1i(A,c.options.sizeByAbsoluteValue),b("bubbleZMin",u),b("bubbleZMax",w),b("bubbleZThreshold",c.options.zThreshold),b("bubbleMinSize",c.minPxSize),b("bubbleMaxSize",c.maxPxSize))},bind:function(){a&&h&&a.useProgram(h)},program:function(){return h},create:f,setUniform:b,setPMatrix:function(b){a&&h&&a.uniformMatrix4fv(m,!1,b)},setColor:function(b){a&&h&&a.uniform4f(n,b[0]/255,b[1]/255,b[2]/255,b[3])},setPointSize:function(b){a&&h&&a.uniform1f(Q,b)},setSkipTranslation:function(b){a&&
-h&&a.uniform1i(v,!0===b?1:0)},setTexture:function(b){a&&h&&a.uniform1i(I,b)},setDrawAsCircle:function(b){a&&h&&a.uniform1i(F,b?1:0)},reset:function(){a&&h&&(a.uniform1i(g,0),a.uniform1i(F,0))},setInverted:function(b){a&&h&&a.uniform1i(B,b)},destroy:function(){a&&h&&(a.deleteProgram(h),h=!1)}}}function R(a,c,d){function f(){b&&(a.deleteBuffer(b),l=b=!1);k=0;h=d||2;n=[]}var b=!1,l=!1,h=d||2,m=!1,k=0,n;return{destroy:f,bind:function(){if(!b)return!1;a.vertexAttribPointer(l,h,a.FLOAT,!1,0,0)},data:n,
-build:function(d,A,e){var g;n=d||[];if(!(n&&0!==n.length||m))return f(),!1;h=e||h;b&&a.deleteBuffer(b);m||(g=new Float32Array(n));b=a.createBuffer();a.bindBuffer(a.ARRAY_BUFFER,b);a.bufferData(a.ARRAY_BUFFER,m||g,a.STATIC_DRAW);l=a.getAttribLocation(c.program(),A);a.enableVertexAttribArray(l);return!0},render:function(c,d,e){var g=m?m.length:n.length;if(!b||!g)return!1;if(!c||c>g||0>c)c=0;if(!d||d>g)d=g;a.drawArrays(a[(e||"points").toUpperCase()],c/h,(d-c)/h);return!0},allocate:function(a){k=-1;m=
-new Float32Array(4*a)},push:function(a,b,c,d){m&&(m[++k]=a,m[++k]=b,m[++k]=c,m[++k]=d)}}}function qa(a){function c(a){var b,c;return a.isSeriesBoosting?(b=!!a.options.stacking,c=a.xData||a.options.xData||a.processedXData,b=(b?a.data:c||a.options.data).length,"treemap"===a.type?b*=12:"heatmap"===a.type?b*=6:fa[a.type]&&(b*=2),b):0}function d(){e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}function f(a,b){function c(a){a&&(b.colorData.push(a[0]),b.colorData.push(a[1]),b.colorData.push(a[2]),b.colorData.push(a[3]))}
-function e(a,b,e,d,w){c(w);q.usePreallocated?A.push(a,b,e?1:0,d||1):(B.push(a),B.push(b),B.push(e?1:0),B.push(d||1))}function d(){b.segments.length&&(b.segments[b.segments.length-1].to=B.length)}function w(){b.segments.length&&b.segments[b.segments.length-1].from===B.length||(d(),b.segments.push({from:B.length}))}function g(a,b,d,w,g){c(g);e(a+d,b);c(g);e(a,b);c(g);e(a,b+w);c(g);e(a,b+w);c(g);e(a+d,b+w);c(g);e(a+d,b)}function ha(a,c){q.useGPUTranslations||(b.skipTranslation=!0,a.x=y.toPixels(a.x,
-!0),a.y=z.toPixels(a.y,!0));c?B=[a.x,a.y,0,2].concat(B):e(a.x,a.y,0,2)}var f=a.pointArrayMap&&"low,high"===a.pointArrayMap.join(","),h=a.chart,O=a.options,m=!!O.stacking,k=O.data,S=a.xAxis.getExtremes(),N=S.min,S=S.max,p=a.yAxis.getExtremes(),u=p.min,p=p.max,n=a.xData||O.xData||a.processedXData,F=a.yData||O.yData||a.processedYData,v=a.zData||O.zData||a.processedZData,z=a.yAxis,y=a.xAxis,E=a.chart.plotHeight,I=a.chart.plotWidth,G=!n||0===n.length,H=O.connectNulls,r=a.points||!1,Q=!1,J=!1,x,T,U,k=m?
-a.data:n||k,n={x:Number.MAX_VALUE,y:0},K={x:-Number.MAX_VALUE,y:0},L=0,M=!1,t,ca,D=-1,Z=!1,aa=!1,ba,W="undefined"===typeof h.index,X=!1,da=!1,V=fa[a.type],ea=!1,P=!0,ga=!0,R=O.threshold;if(!(O.boostData&&0<O.boostData.length)){h.inverted&&(E=a.chart.plotWidth,I=a.chart.plotHeight);a.closestPointRangePx=Number.MAX_VALUE;w();if(r&&0<r.length)b.skipTranslation=!0,b.drawMode="triangles",r[0].node&&r[0].node.levelDynamic&&r.sort(function(a,b){if(a.node){if(a.node.levelDynamic>b.node.levelDynamic)return 1;
-if(a.node.levelDynamic<b.node.levelDynamic)return-1}return 0}),r.forEach(function(b){var c=b.plotY,e;"undefined"===typeof c||isNaN(c)||null===b.y||(c=b.shapeArgs,e=h.styledMode?b.series.colorAttribs(b):e=b.series.pointAttribs(b),b=e["stroke-width"]||0,T=l.color(e.fill).rgba,T[0]/=255,T[1]/=255,T[2]/=255,"treemap"===a.type&&(b=b||1,U=l.color(e.stroke).rgba,U[0]/=255,U[1]/=255,U[2]/=255,g(c.x,c.y,c.width,c.height,U),b/=2),"heatmap"===a.type&&h.inverted&&(c.x=y.len-c.x,c.y=z.len-c.y,c.width=-c.width,
-c.height=-c.height),g(c.x+b,c.y+b,c.width-2*b,c.height-2*b,T))});else{for(;D<k.length-1;){x=k[++D];if(W)break;G?(r=x[0],t=x[1],k[D+1]&&(aa=k[D+1][0]),k[D-1]&&(Z=k[D-1][0]),3<=x.length&&(ca=x[2],x[2]>b.zMax&&(b.zMax=x[2]),x[2]<b.zMin&&(b.zMin=x[2]))):(r=x,t=F[D],k[D+1]&&(aa=k[D+1]),k[D-1]&&(Z=k[D-1]),v&&v.length&&(ca=v[D],v[D]>b.zMax&&(b.zMax=v[D]),v[D]<b.zMin&&(b.zMin=v[D])));if(H||null!==r&&null!==t){if(aa&&aa>=N&&aa<=S&&(X=!0),Z&&Z>=N&&Z<=S&&(da=!0),f?(G&&(t=x.slice(1,3)),ba=t[0],t=t[1]):m&&(r=
-x.x,t=x.stackY,ba=t-x.y),null!==u&&"undefined"!==typeof u&&null!==p&&"undefined"!==typeof p&&(P=t>=u&&t<=p),r>S&&K.x<S&&(K.x=r,K.y=t),r<N&&n.x>N&&(n.x=r,n.y=t),null!==t||!H)if(null!==t&&(P||X||da)){if(r>=N&&r<=S&&(ea=!0),ea||X||da){if(!q.useGPUTranslations&&(b.skipTranslation=!0,r=y.toPixels(r,!0),t=z.toPixels(t,!0),t>E&&(t=E),r>I&&"points"===b.drawMode))continue;if(V){x=ba;if(!1===ba||"undefined"===typeof ba)x=0>t?t:0;f||m||(x=Math.max(R,u));q.useGPUTranslations||(x=z.toPixels(x,!0));e(r,x,0,0,!1)}b.hasMarkers&&
-ea&&!1!==Q&&(a.closestPointRangePx=Math.min(a.closestPointRangePx,Math.abs(r-Q)));!q.useGPUTranslations&&!q.usePreallocated&&Q&&1>Math.abs(r-Q)&&J&&1>Math.abs(t-J)?q.debug.showSkipSummary&&++L:(O.step&&!ga&&e(r,J,0,2,!1),e(r,t,0,"bubble"===a.type?ca||1:2,!1),Q=r,J=t,M=!0,ga=!1)}}else w()}else w()}q.debug.showSkipSummary&&console.log("skipped points:",L);M||!1===H||"line_strip"!==a.drawMode||(n.x<Number.MAX_VALUE&&ha(n,!0),K.x>-Number.MAX_VALUE&&ha(K))}d()}}function b(){u=[];y.data=B=[];z=[];A&&A.destroy()}
-function k(a){g&&(g.setUniform("xAxisTrans",a.transA),g.setUniform("xAxisMin",a.min),g.setUniform("xAxisMinPad",a.minPixelPadding),g.setUniform("xAxisPointRange",a.pointRange),g.setUniform("xAxisLen",a.len),g.setUniform("xAxisPos",a.pos),g.setUniform("xAxisCVSCoord",!a.horiz))}function h(a){g&&(g.setUniform("yAxisTrans",a.transA),g.setUniform("yAxisMin",a.min),g.setUniform("yAxisMinPad",a.minPixelPadding),g.setUniform("yAxisPointRange",a.pointRange),g.setUniform("yAxisLen",a.len),g.setUniform("yAxisPos",
-a.pos),g.setUniform("yAxisCVSCoord",!a.horiz))}function m(a,b){g.setUniform("hasThreshold",a);g.setUniform("translatedThreshold",b)}function p(c){if(c)v=c.chartWidth||800,F=c.chartHeight||400;else return!1;if(!(e&&v&&F&&g))return!1;q.debug.timeRendering&&console.time("gl rendering");e.canvas.width=v;e.canvas.height=F;g.bind();e.viewport(0,0,v,F);g.setPMatrix([2/v,0,0,0,0,-(2/F),0,0,0,0,-2,0,-1,1,-1,1]);g.setPlotHeight(c.plotHeight);1<q.lineWidth&&!l.isMS&&e.lineWidth(q.lineWidth);A.build(y.data,"aVertexPosition",
-4);A.bind();g.setInverted(c.inverted);u.forEach(function(a,b){var d=a.series.options,f=d.marker,C;C="undefined"!==typeof d.lineWidth?d.lineWidth:1;var w=d.threshold,n=J(w),N=a.series.yAxis.getThreshold(w),w=G(d.marker?d.marker.enabled:null,a.series.xAxis.isRadial?!0:null,a.series.closestPointRangePx>2*((d.marker?d.marker.radius:10)||10)),f=E[f&&f.symbol||a.series.symbol]||E.circle;if(!(0===a.segments.length||a.segmentslength&&a.segments[0].from===a.segments[0].to)){f.isReady&&(e.bindTexture(e.TEXTURE_2D,
-f.handle),g.setTexture(f.handle));c.styledMode?f=a.series.markerGroup&&a.series.markerGroup.getStyle("fill"):(f=a.series.pointAttribs&&a.series.pointAttribs().fill||a.series.color,d.colorByPoint&&(f=a.series.chart.options.colors[b]));a.series.fillOpacity&&d.fillOpacity&&(f=(new ia(f)).setOpacity(G(d.fillOpacity,1)).get());f=l.color(f).rgba;q.useAlpha||(f[3]=1);"lines"===a.drawMode&&q.useAlpha&&1>f[3]&&(f[3]/=10);"add"===d.boostBlending?(e.blendFunc(e.SRC_ALPHA,e.ONE),e.blendEquation(e.FUNC_ADD)):
-"mult"===d.boostBlending?e.blendFunc(e.DST_COLOR,e.ZERO):"darken"===d.boostBlending?(e.blendFunc(e.ONE,e.ONE),e.blendEquation(e.FUNC_MIN)):e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA);g.reset();0<a.colorData.length&&(g.setUniform("hasColor",1),b=R(e,g),b.build(a.colorData,"aColor",4),b.bind());g.setColor(f);k(a.series.xAxis);h(a.series.yAxis);m(n,N);"points"===a.drawMode&&(d.marker&&d.marker.radius?g.setPointSize(2*d.marker.radius):g.setPointSize(1));g.setSkipTranslation(a.skipTranslation);
-"bubble"===a.series.type&&g.setBubbleUniforms(a.series,a.zMin,a.zMax);g.setDrawAsCircle(H[a.series.type]||!1);if(0<C||"line_strip"!==a.drawMode)for(C=0;C<a.segments.length;C++)A.render(a.segments[C].from,a.segments[C].to,a.drawMode);if(a.hasMarkers&&w)for(d.marker&&d.marker.radius?g.setPointSize(2*d.marker.radius):g.setPointSize(10),g.setDrawAsCircle(!0),C=0;C<a.segments.length;C++)A.render(a.segments[C].from,a.segments[C].to,"POINTS")}});q.debug.timeRendering&&console.timeEnd("gl rendering");a&&
-a();b()}function n(a){d();if(a.renderer.forExport)return p(a);I?p(a):setTimeout(function(){n(a)},1)}var g=!1,A=!1,e=!1,v=0,F=0,B=!1,z=!1,y={},I=!1,u=[],E={},fa={column:!0,columnrange:!0,bar:!0,area:!0,arearange:!0},H={scatter:!0,bubble:!0},q={pointSize:1,lineWidth:1,fillColor:"#AA00AA",useAlpha:!0,usePreallocated:!1,useGPUTranslations:!1,debug:{timeRendering:!1,timeSeriesProcessing:!1,timeSetup:!1,timeBufferCopy:!1,timeKDTree:!1,showSkipSummary:!1}};return y={allocateBufferForSingleSeries:function(a){var b=
-0;q.usePreallocated&&(a.isSeriesBoosting&&(b=c(a)),A.allocate(b))},pushSeries:function(a){0<u.length&&u[u.length-1].hasMarkers&&(u[u.length-1].markerTo=z.length);q.debug.timeSeriesProcessing&&console.time("building "+a.type+" series");u.push({segments:[],markerFrom:z.length,colorData:[],series:a,zMin:Number.MAX_VALUE,zMax:-Number.MAX_VALUE,hasMarkers:a.options.marker?!1!==a.options.marker.enabled:!1,showMarkers:!0,drawMode:{area:"lines",arearange:"lines",areaspline:"line_strip",column:"lines",columnrange:"lines",
-bar:"lines",line:"line_strip",scatter:"points",heatmap:"triangles",treemap:"triangles",bubble:"points"}[a.type]||"line_strip"});f(a,u[u.length-1]);q.debug.timeSeriesProcessing&&console.timeEnd("building "+a.type+" series")},setSize:function(a,b){v===a&&b===b||!g||(v=a,F=b,g.bind(),g.setPMatrix([2/v,0,0,0,0,-(2/F),0,0,0,0,-2,0,-1,1,-1,1]))},inited:function(){return I},setThreshold:m,init:function(a,c){function d(a,b){var c={isReady:!1,texture:K.createElement("canvas"),handle:e.createTexture()},d=c.texture.getContext("2d");
-E[a]=c;c.texture.width=512;c.texture.height=512;d.mozImageSmoothingEnabled=!1;d.webkitImageSmoothingEnabled=!1;d.msImageSmoothingEnabled=!1;d.imageSmoothingEnabled=!1;d.strokeStyle="rgba(255, 255, 255, 0)";d.fillStyle="#FFF";b(d);try{e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,c.handle),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,c.texture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,
-e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.bindTexture(e.TEXTURE_2D,null),c.isReady=!0}catch(xa){}}var f=0,h=["webgl","experimental-webgl","moz-webgl","webkit-3d"];I=!1;if(!a)return!1;for(q.debug.timeSetup&&console.time("gl setup");f<h.length&&!(e=a.getContext(h[f],{}));f++);if(e)c||b();else return!1;e.enable(e.BLEND);e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA);e.disable(e.DEPTH_TEST);e.depthFunc(e.LESS);g=pa(e);if(!g)return!1;A=R(e,g);d("circle",
-function(a){a.beginPath();a.arc(256,256,256,0,2*Math.PI);a.stroke();a.fill()});d("square",function(a){a.fillRect(0,0,512,512)});d("diamond",function(a){a.beginPath();a.moveTo(256,0);a.lineTo(512,256);a.lineTo(256,512);a.lineTo(0,256);a.lineTo(256,0);a.fill()});d("triangle",function(a){a.beginPath();a.moveTo(0,512);a.lineTo(256,0);a.lineTo(512,512);a.lineTo(0,512);a.fill()});d("triangle-down",function(a){a.beginPath();a.moveTo(0,0);a.lineTo(256,512);a.lineTo(512,0);a.lineTo(0,0);a.fill()});I=!0;q.debug.timeSetup&&
-console.timeEnd("gl setup");return!0},render:n,settings:q,valid:function(){return!1!==e},clear:d,flush:b,setXAxis:k,setYAxis:h,data:B,gl:function(){return e},allocateBuffer:function(a){var b=0;q.usePreallocated&&(a.series.forEach(function(a){a.isSeriesBoosting&&(b+=c(a))}),A.allocate(b))},destroy:function(){b();A.destroy();g.destroy();e&&(ra(E,function(a){E[a].handle&&e.deleteTexture(E[a].handle)}),e.canvas.width=1,e.canvas.height=1)},setOptions:function(a){sa(!0,q,a)}}}function ja(a,c){var d=a.chartWidth,
-f=a.chartHeight,b=a,k=a.seriesGroup||c.group,h=K.implementation.hasFeature("www.http://w3.org/TR/SVG11/feature#Extensibility","1.1"),b=a.isChartSeriesBoosting()?a:c,h=!1;b.renderTarget||(b.canvas=ta,a.renderer.forExport||!h?(b.renderTarget=a.renderer.image("",0,0,d,f).addClass("highcharts-boost-canvas").add(k),b.boostClear=function(){b.renderTarget.attr({href:""})},b.boostCopy=function(){b.boostResizeTarget();b.renderTarget.attr({href:b.canvas.toDataURL("image/png")})}):(b.renderTargetFo=a.renderer.createElement("foreignObject").add(k),
-b.renderTarget=K.createElement("canvas"),b.renderTargetCtx=b.renderTarget.getContext("2d"),b.renderTargetFo.element.appendChild(b.renderTarget),b.boostClear=function(){b.renderTarget.width=b.canvas.width;b.renderTarget.height=b.canvas.height},b.boostCopy=function(){b.renderTarget.width=b.canvas.width;b.renderTarget.height=b.canvas.height;b.renderTargetCtx.drawImage(b.canvas,0,0)}),b.boostResizeTarget=function(){d=a.chartWidth;f=a.chartHeight;(b.renderTargetFo||b.renderTarget).attr({x:0,y:0,width:d,
-height:f}).css({pointerEvents:"none",mixedBlendMode:"normal",opacity:1});b instanceof l.Chart&&b.markerGroup.translate(a.plotLeft,a.plotTop)},b.boostClipRect=a.renderer.clipRect(),(b.renderTargetFo||b.renderTarget).clip(b.boostClipRect),b instanceof l.Chart&&(b.markerGroup=b.renderer.g().add(k),b.markerGroup.translate(c.xAxis.pos,c.yAxis.pos)));b.canvas.width=d;b.canvas.height=f;b.boostClipRect.attr(a.getBoostClipRect(b));b.boostResizeTarget();b.boostClear();b.ogl||(b.ogl=qa(function(){b.ogl.settings.debug.timeBufferCopy&&
-console.time("buffer copy");b.boostCopy();b.ogl.settings.debug.timeBufferCopy&&console.timeEnd("buffer copy")}),b.ogl.init(b.canvas)||l.error("[highcharts boost] - unable to init WebGL renderer"),b.ogl.setOptions(a.options.boost||{}),b instanceof l.Chart&&b.ogl.allocateBuffer(a));b.ogl.setSize(d,f);return b.ogl}function ka(a,c,d){a&&c.renderTarget&&c.canvas&&!(d||c.chart).isChartSeriesBoosting()&&a.render(d||c.chart)}function la(a,c){a&&c.renderTarget&&c.canvas&&!c.chart.isChartSeriesBoosting()&&
-a.allocateBufferForSingleSeries(c)}function ua(a){var c=!0;this.chart.options&&this.chart.options.boost&&(c="undefined"===typeof this.chart.options.boost.enabled?!0:this.chart.options.boost.enabled);if(!c||!this.isSeriesBoosting)return a.call(this);this.chart.isBoosting=!0;if(a=ja(this.chart,this))la(a,this),a.pushSeries(this);ka(a,this)}var L=l.win,K=L.document,va=function(){},ma=l.Chart,ia=l.Color,p=l.Series,k=l.seriesTypes,ra=l.objectEach,na=l.extend,M=l.addEvent,wa=l.fireEvent,J=l.isNumber,sa=
-l.merge,G=l.pick,y=l.wrap,W=l.getOptions().plotOptions,ta=K.createElement("canvas"),X,oa="area arearange column columnrange bar line scatter heatmap bubble treemap".split(" "),H={};oa.forEach(function(a){H[a]=1});ia.prototype.names={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",
-chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",
-dimgray:"#696969",dodgerblue:"#1e90ff",feldspar:"#d19275",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",
-lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslateblue:"#8470ff",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",
-mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",
-purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",violetred:"#d02090",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",
-yellowgreen:"#9acd32"};ma.prototype.isChartSeriesBoosting=function(){return G(this.options.boost&&this.options.boost.seriesThreshold,50)<=this.series.length||V(this)};ma.prototype.getBoostClipRect=function(a){var c={x:this.plotLeft,y:this.plotTop,width:this.plotWidth,height:this.plotHeight};a===this&&this.yAxis.forEach(function(a){c.y=Math.min(a.pos,c.y);c.height=Math.max(a.pos-this.plotTop+a.len,c.height)},this);return c};l.eachAsync=function(a,c,d,f,b,k){b=b||0;f=f||3E4;for(var h=b+f,m=!0;m&&b<
-h&&b<a.length;)m=c(a[b],b),++b;m&&(b<a.length?k?l.eachAsync(a,c,d,f,b,k):L.requestAnimationFrame?L.requestAnimationFrame(function(){l.eachAsync(a,c,d,f,b)}):setTimeout(function(){l.eachAsync(a,c,d,f,b)}):d&&d())};p.prototype.getPoint=function(a){var c=a,d=this.xData||this.options.xData||this.processedXData||!1;!a||a instanceof this.pointClass||(c=(new this.pointClass).init(this,this.options.data[a.i],d?d[a.i]:void 0),c.category=c.x,c.dist=a.dist,c.distX=a.distX,c.plotX=a.plotX,c.plotY=a.plotY,c.index=
-a.i);return c};y(p.prototype,"searchPoint",function(a){return this.getPoint(a.apply(this,[].slice.call(arguments,1)))});M(p,"destroy",function(){var a=this,c=a.chart;c.markerGroup===a.markerGroup&&(a.markerGroup=null);c.hoverPoints&&(c.hoverPoints=c.hoverPoints.filter(function(c){return c.series===a}));c.hoverPoint&&c.hoverPoint.series===a&&(c.hoverPoint=null)});y(p.prototype,"getExtremes",function(a){if(!this.isSeriesBoosting||!this.hasExtremes||!this.hasExtremes())return a.apply(this,Array.prototype.slice.call(arguments,
-1))});oa.forEach(function(a){W[a]&&(W[a].boostThreshold=5E3,W[a].boostData=[],k[a].prototype.fillOpacity=!0)});["translate","generatePoints","drawTracker","drawPoints","render"].forEach(function(a){function c(c){var d=this.options.stacking&&("translate"===a||"generatePoints"===a);if(!this.isSeriesBoosting||d||!P(this.chart)||"heatmap"===this.type||"treemap"===this.type||!H[this.type]||0===this.options.boostThreshold)c.call(this);else if(this[a+"Canvas"])this[a+"Canvas"]()}y(p.prototype,a,c);"translate"===
-a&&"column bar arearange columnrange heatmap treemap".split(" ").forEach(function(d){k[d]&&y(k[d].prototype,a,c)})});y(p.prototype,"processData",function(a){function c(a){return d.chart.isChartSeriesBoosting()||(a?a.length:0)>=(d.options.boostThreshold||Number.MAX_VALUE)}var d=this,f=this.options.data;P(this.chart)&&H[this.type]?(c(f)&&"heatmap"!==this.type&&"treemap"!==this.type&&!this.options.stacking&&this.hasExtremes&&this.hasExtremes(!0)||(a.apply(this,Array.prototype.slice.call(arguments,1)),
-f=this.processedXData),(this.isSeriesBoosting=c(f))?this.enterBoost():this.exitBoost&&this.exitBoost()):a.apply(this,Array.prototype.slice.call(arguments,1))});M(p,"hide",function(){this.canvas&&this.renderTarget&&(this.ogl&&this.ogl.clear(),this.boostClear())});p.prototype.enterBoost=function(){this.alteredByBoost=[];["allowDG","directTouch","stickyTracking"].forEach(function(a){this.alteredByBoost.push({prop:a,val:this[a],own:this.hasOwnProperty(a)})},this);this.directTouch=this.allowDG=!1;this.stickyTracking=
-!0;this.animate=null;this.labelBySeries&&(this.labelBySeries=this.labelBySeries.destroy())};p.prototype.exitBoost=function(){(this.alteredByBoost||[]).forEach(function(a){a.own?this[a.prop]=a.val:delete this[a.prop]},this);this.boostClear&&this.boostClear()};p.prototype.hasExtremes=function(a){var c=this.options,d=this.xAxis&&this.xAxis.options,f=this.yAxis&&this.yAxis.options;return c.data.length>(c.boostThreshold||Number.MAX_VALUE)&&J(f.min)&&J(f.max)&&(!a||J(d.min)&&J(d.max))};p.prototype.destroyGraphics=
-function(){var a=this,c=this.points,d,f;if(c)for(f=0;f<c.length;f+=1)(d=c[f])&&d.destroyElements&&d.destroyElements();["graph","area","tracker"].forEach(function(b){a[b]&&(a[b]=a[b].destroy())})};l.hasWebGLSupport=function(){var a=0,c,d=["webgl","experimental-webgl","moz-webgl","webkit-3d"],f=!1;if("undefined"!==typeof L.WebGLRenderingContext)for(c=K.createElement("canvas");a<d.length;a++)try{if(f=c.getContext(d[a]),"undefined"!==typeof f&&null!==f)return!0}catch(b){}return!1};l.hasWebGLSupport()?
-(l.extend(p.prototype,{renderCanvas:function(){function a(a,b){var c,d,f=!1,g="undefined"===typeof k.index,l=!0;if(!g&&(J?(c=a[0],d=a[1]):(c=a,d=n[b]),G?(J&&(d=a.slice(1,3)),f=d[0],d=d[1]):H&&(c=a.x,d=a.stackY,f=d-a.y),w||(l=d>=v&&d<=z),null!==d&&c>=A&&c<=e&&l))if(a=h.toPixels(c,!0),K){if(void 0===Y||a===y){G||(f=d);if(void 0===C||d>M)M=d,C=b;if(void 0===Y||f<L)L=f,Y=b}a!==y&&(void 0!==Y&&(d=m.toPixels(M,!0),E=m.toPixels(L,!0),R(a,d,C),E!==d&&R(a,E,Y)),Y=C=void 0,y=a)}else d=Math.ceil(m.toPixels(d,
-!0)),R(a,d,b);return!g}function c(){wa(d,"renderedCanvas");delete d.buildKDTree;d.buildKDTree();P.debug.timeKDTree&&console.timeEnd("kd tree building")}var d=this,f=d.options||{},b=!1,k=d.chart,h=this.xAxis,m=this.yAxis,p=f.xData||d.processedXData,n=f.yData||d.processedYData,g=f.data,b=h.getExtremes(),A=b.min,e=b.max,b=m.getExtremes(),v=b.min,z=b.max,B={},y,K=!!d.sampling,I,u=!1!==f.enableMouseTracking,E=m.getThreshold(f.threshold),G=d.pointArrayMap&&"low,high"===d.pointArrayMap.join(","),H=!!f.stacking,
-q=d.cropStart||0,w=d.requireSorting,J=!p,L,M,Y,C,P,W="x"===f.findNearestPointBy,V=this.xData||this.options.xData||this.processedXData||!1,R=function(a,b,c){a=Math.ceil(a);X=W?a:a+","+b;u&&!B[X]&&(B[X]=!0,k.inverted&&(a=h.len-a,b=m.len-b),I.push({x:V?V[q+c]:!1,clientX:a,plotX:a,plotY:b,i:q+c}))},b=ja(k,d);k.isBoosting=!0;P=b.settings;if(this.visible){if(this.points||this.graph)this.animate=null,this.destroyGraphics();k.isChartSeriesBoosting()?(this.markerGroup=k.markerGroup,this.renderTarget&&(this.renderTarget=
-this.renderTarget.destroy())):this.markerGroup=d.plotGroup("markerGroup","markers",!0,1,k.seriesGroup);I=this.points=[];d.buildKDTree=va;b&&(la(b,this),b.pushSeries(d),ka(b,this,k));k.renderer.forExport||(P.debug.timeKDTree&&console.time("kd tree building"),l.eachAsync(H?d.data:p||g,a,c))}}}),["heatmap","treemap"].forEach(function(a){k[a]&&y(k[a].prototype,"drawPoints",ua)}),k.bubble&&(delete k.bubble.prototype.buildKDTree,y(k.bubble.prototype,"markerAttribs",function(a){return this.isSeriesBoosting?
-!1:a.apply(this,[].slice.call(arguments,1))})),k.scatter.prototype.fill=!0,na(k.area.prototype,{fill:!0,fillOpacity:!0,sampling:!0}),na(k.column.prototype,{fill:!0,sampling:!0}),l.Chart.prototype.callbacks.push(function(a){M(a,"predraw",function(){a.boostForceChartBoost=void 0;a.boostForceChartBoost=V(a);a.isBoosting=!1;!a.isChartSeriesBoosting()&&a.didBoost&&(a.didBoost=!1);a.boostClear&&a.boostClear();a.canvas&&a.ogl&&a.isChartSeriesBoosting()&&(a.didBoost=!0,a.ogl.allocateBuffer(a));a.markerGroup&&
-a.xAxis&&0<a.xAxis.length&&a.yAxis&&0<a.yAxis.length&&a.markerGroup.translate(a.xAxis[0].pos,a.yAxis[0].pos)});M(a,"render",function(){a.ogl&&a.isChartSeriesBoosting()&&a.ogl.render(a)})})):"undefined"!==typeof l.initCanvasBoost?l.initCanvasBoost():l.error(26)})(z)});
-//# sourceMappingURL=boost.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
- Data module
-
- (c) 2012-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(q){"object"===typeof module&&module.exports?module.exports=q:"function"===typeof define&&define.amd?define(function(){return q}):q("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(q){(function(h){h.ajax=function(q){var n=h.merge(!0,{url:!1,type:"GET",dataType:"json",success:!1,error:!1,data:!1,headers:{}},q);q={json:"application/json",xml:"application/xml",text:"text/plain",octet:"application/octet-stream"};var p=new XMLHttpRequest;if(!n.url)return!1;p.open(n.type.toUpperCase(),
-n.url,!0);p.setRequestHeader("Content-Type",q[n.dataType]||q.text);h.objectEach(n.headers,function(h,n){p.setRequestHeader(n,h)});p.onreadystatechange=function(){var h;if(4===p.readyState){if(200===p.status){h=p.responseText;if("json"===n.dataType)try{h=JSON.parse(h)}catch(C){n.error&&n.error(p,C);return}return n.success&&n.success(h)}n.error&&n.error(p,p.responseText)}};try{n.data=JSON.stringify(n.data)}catch(D){}p.send(n.data||!0)}})(q);(function(h){var q=h.addEvent,n=h.Chart,p=h.win.document,D=
-h.objectEach,C=h.pick,E=h.isNumber,y=h.merge,G=h.splat,H=h.fireEvent,w,z=function(a,b,c){this.init(a,b,c)};h.extend(z.prototype,{init:function(a,b,c){var f=a.decimalPoint,e;b&&(this.chartOptions=b);c&&(this.chart=c);"."!==f&&","!==f&&(f=void 0);this.options=a;this.columns=a.columns||this.rowsToColumns(a.rows)||[];this.firstRowAsNames=C(a.firstRowAsNames,this.firstRowAsNames,!0);this.decimalRegex=f&&new RegExp("^(-?[0-9]+)"+f+"([0-9]+)$");this.rawColumns=[];this.columns.length&&(this.dataFound(),e=
-!0);e||(e=this.fetchLiveData());e||(e=!!this.parseCSV().length);e||(e=!!this.parseTable().length);e||(e=this.parseGoogleSpreadsheet());!e&&a.afterComplete&&a.afterComplete()},getColumnDistribution:function(){var a=this.chartOptions,b=this.options,c=[],f=function(a){return(h.seriesTypes[a||"line"].prototype.pointArrayMap||[0]).length},e=a&&a.chart&&a.chart.type,d=[],k=[],t=0,b=b&&b.seriesMapping||a&&a.series&&a.series.map(function(){return{x:0}})||[],g;(a&&a.series||[]).forEach(function(a){d.push(f(a.type||
-e))});b.forEach(function(a){c.push(a.x||0)});0===c.length&&c.push(0);b.forEach(function(b){var c=new w,A=d[t]||f(e),m=h.seriesTypes[((a&&a.series||[])[t]||{}).type||e||"line"].prototype.pointArrayMap||["y"];c.addColumnReader(b.x,"x");D(b,function(a,b){"x"!==b&&c.addColumnReader(a,b)});for(g=0;g<A;g++)c.hasReader(m[g])||c.addColumnReader(void 0,m[g]);k.push(c);t++});b=h.seriesTypes[e||"line"].prototype.pointArrayMap;void 0===b&&(b=["y"]);this.valueCount={global:f(e),xColumns:c,individual:d,seriesBuilders:k,
-globalPointArrayMap:b}},dataFound:function(){this.options.switchRowsAndColumns&&(this.columns=this.rowsToColumns(this.columns));this.getColumnDistribution();this.parseTypes();!1!==this.parsed()&&this.complete()},parseCSV:function(a){function b(a,b,c,d){function e(b){l=a[b];r=a[b-1];A=a[b+1]}function f(a){v.length<u+1&&v.push([a]);v[u][v[u].length-1]!==a&&v[u].push(a)}function g(){h>B||B>n?(++B,m=""):(!isNaN(parseFloat(m))&&isFinite(m)?(m=parseFloat(m),f("number")):isNaN(Date.parse(m))?f("string"):
-(m=m.replace(/\//g,"-"),f("date")),t.length<u+1&&t.push([]),c||(t[u][b]=m),m="",++u,++B)}var k=0,l="",r="",A="",m="",B=0,u=0;if(a.trim().length&&"#"!==a.trim()[0]){for(;k<a.length;k++){e(k);if("#"===l){g();return}if('"'===l)for(e(++k);k<a.length&&('"'!==l||'"'===r||'"'===A);){if('"'!==l||'"'===l&&'"'!==r)m+=l;e(++k)}else d&&d[l]?d[l](l,m)&&g():l===x?g():m+=l}g()}}function c(a){var b=0,c=0,f=!1;a.some(function(a,d){var e=!1,f,l,g="";if(13<d)return!0;for(var k=0;k<a.length;k++){d=a[k];f=a[k+1];l=a[k-
-1];if("#"===d)break;else if('"'===d)if(e){if('"'!==l&&'"'!==f){for(;" "===f&&k<a.length;)f=a[++k];"undefined"!==typeof u[f]&&u[f]++;e=!1}}else e=!0;else"undefined"!==typeof u[d]?(g=g.trim(),isNaN(Date.parse(g))?!isNaN(g)&&isFinite(g)||u[d]++:u[d]++,g=""):g+=d;","===d&&c++;"."===d&&b++}});f=u[";"]>u[","]?";":",";d.decimalPoint||(d.decimalPoint=b>c?".":",",e.decimalRegex=new RegExp("^(-?[0-9]+)"+d.decimalPoint+"([0-9]+)$"));return f}function f(a,b){var c,f,g=0,k=!1,m=[],t=[],l;if(!b||b>a.length)b=a.length;
-for(;g<b;g++)if("undefined"!==typeof a[g]&&a[g]&&a[g].length)for(c=a[g].trim().replace(/\//g," ").replace(/\-/g," ").replace(/\./g," ").split(" "),f=["","",""],l=0;l<c.length;l++)l<f.length&&(c[l]=parseInt(c[l],10),c[l]&&(t[l]=!t[l]||t[l]<c[l]?c[l]:t[l],"undefined"!==typeof m[l]?m[l]!==c[l]&&(m[l]=!1):m[l]=c[l],31<c[l]?f[l]=100>c[l]?"YY":"YYYY":12<c[l]&&31>=c[l]?(f[l]="dd",k=!0):f[l].length||(f[l]="mm")));if(k){for(l=0;l<m.length;l++)!1!==m[l]?12<t[l]&&"YY"!==f[l]&&"YYYY"!==f[l]&&(f[l]="YY"):12<t[l]&&
-"mm"===f[l]&&(f[l]="dd");3===f.length&&"dd"===f[1]&&"dd"===f[2]&&(f[2]="YY");a=f.join("/");return(d.dateFormats||e.dateFormats)[a]?a:(H("deduceDateFailed"),"YYYY/mm/dd")}return"YYYY/mm/dd"}var e=this,d=a||this.options,k=d.csv,t;a="undefined"!==typeof d.startRow&&d.startRow?d.startRow:0;var g=d.endRow||Number.MAX_VALUE,h="undefined"!==typeof d.startColumn&&d.startColumn?d.startColumn:0,n=d.endColumn||Number.MAX_VALUE,x,m=0,v=[],u={",":0,";":0,"\t":0};t=this.columns=[];k&&d.beforeParse&&(k=d.beforeParse.call(this,
-k));if(k){k=k.replace(/\r\n/g,"\n").replace(/\r/g,"\n").split(d.lineDelimiter||"\n");if(!a||0>a)a=0;if(!g||g>=k.length)g=k.length-1;d.itemDelimiter?x=d.itemDelimiter:(x=null,x=c(k));for(var F=0,m=a;m<=g;m++)"#"===k[m][0]?F++:b(k[m],m-a-F);d.columnTypes&&0!==d.columnTypes.length||!v.length||!v[0].length||"date"!==v[0][1]||d.dateFormat||(d.dateFormat=f(t[0]));this.dataFound()}return t},parseTable:function(){var a=this.options,b=a.table,c=this.columns,f=a.startRow||0,e=a.endRow||Number.MAX_VALUE,d=a.startColumn||
-0,k=a.endColumn||Number.MAX_VALUE;b&&("string"===typeof b&&(b=p.getElementById(b)),[].forEach.call(b.getElementsByTagName("tr"),function(a,b){b>=f&&b<=e&&[].forEach.call(a.children,function(a,e){("TD"===a.tagName||"TH"===a.tagName)&&e>=d&&e<=k&&(c[e-d]||(c[e-d]=[]),c[e-d][b-f]=a.innerHTML)})}),this.dataFound());return c},fetchLiveData:function(){function a(t){function g(g,k,x){function m(){e&&b.liveDataURL===g&&(b.liveDataTimeout=setTimeout(a,d))}if(!g||0!==g.indexOf("http"))return g&&c.error&&c.error("Invalid URL"),
-!1;t&&(clearTimeout(b.liveDataTimeout),b.liveDataURL=g);h.ajax({url:g,dataType:x||"json",success:function(a){b&&b.series&&k(a);m()},error:function(a,b){3>++f&&m();return c.error&&c.error(b,a)}});return!0}g(k.csvURL,function(a){b.update({data:{csv:a}})},"text")||g(k.rowsURL,function(a){b.update({data:{rows:a}})})||g(k.columnsURL,function(a){b.update({data:{columns:a}})})}var b=this.chart,c=this.options,f=0,e=c.enablePolling,d=1E3*(c.dataRefreshRate||2),k=y(c);if(!c||!c.csvURL&&!c.rowsURL&&!c.columnsURL)return!1;
-1E3>d&&(d=1E3);delete c.csvURL;delete c.rowsURL;delete c.columnsURL;a(!0);return c&&(c.csvURL||c.rowsURL||c.columnsURL)},parseGoogleSpreadsheet:function(){function a(b){var e=["https://spreadsheets.google.com/feeds/cells",f,d,"public/values?alt\x3djson"].join("/");h.ajax({url:e,dataType:"json",success:function(d){b(d);c.enablePolling&&setTimeout(function(){a(b)},c.dataRefreshRate)},error:function(a,b){return c.error&&c.error(b,a)}})}var b=this,c=this.options,f=c.googleSpreadsheetKey,e=this.chart,
-d=c.googleSpreadsheetWorksheet||1,k=c.startRow||0,t=c.endRow||Number.MAX_VALUE,g=c.startColumn||0,n=c.endColumn||Number.MAX_VALUE,q=1E3*(c.dataRefreshRate||2);4E3>q&&(q=4E3);f&&(delete c.googleSpreadsheetKey,a(function(a){var c=[];a=a.feed.entry;var d,f=(a||[]).length,h=0,q,p,r;if(!a||0===a.length)return!1;for(r=0;r<f;r++)d=a[r],h=Math.max(h,d.gs$cell.col);for(r=0;r<h;r++)r>=g&&r<=n&&(c[r-g]=[]);for(r=0;r<f;r++)d=a[r],h=d.gs$cell.row-1,q=d.gs$cell.col-1,q>=g&&q<=n&&h>=k&&h<=t&&(p=d.gs$cell||d.content,
-d=null,p.numericValue?d=0<=p.$t.indexOf("/")||0<=p.$t.indexOf("-")?p.$t:0<p.$t.indexOf("%")?100*parseFloat(p.numericValue):parseFloat(p.numericValue):p.$t&&p.$t.length&&(d=p.$t),c[q-g][h-k]=d);c.forEach(function(a){for(r=0;r<a.length;r++)void 0===a[r]&&(a[r]=null)});e&&e.series?e.update({data:{columns:c}}):(b.columns=c,b.dataFound())}));return!1},trim:function(a,b){"string"===typeof a&&(a=a.replace(/^\s+|\s+$/g,""),b&&/^[0-9\s]+$/.test(a)&&(a=a.replace(/\s/g,"")),this.decimalRegex&&(a=a.replace(this.decimalRegex,
-"$1.$2")));return a},parseTypes:function(){for(var a=this.columns,b=a.length;b--;)this.parseColumn(a[b],b)},parseColumn:function(a,b){var c=this.rawColumns,f=this.columns,e=a.length,d,k,h,g,p=this.firstRowAsNames,n=-1!==this.valueCount.xColumns.indexOf(b),q,m=[],v=this.chartOptions,u,w=(this.options.columnTypes||[])[b],v=n&&(v&&v.xAxis&&"category"===G(v.xAxis)[0].type||"string"===w);for(c[b]||(c[b]=[]);e--;)d=m[e]||a[e],h=this.trim(d),g=this.trim(d,!0),k=parseFloat(g),void 0===c[b][e]&&(c[b][e]=h),
-v||0===e&&p?a[e]=""+h:+g===k?(a[e]=k,31536E6<k&&"float"!==w?a.isDatetime=!0:a.isNumeric=!0,void 0!==a[e+1]&&(u=k>a[e+1])):(h&&h.length&&(q=this.parseDate(d)),n&&E(q)&&"float"!==w?(m[e]=d,a[e]=q,a.isDatetime=!0,void 0!==a[e+1]&&(d=q>a[e+1],d!==u&&void 0!==u&&(this.alternativeFormat?(this.dateFormat=this.alternativeFormat,e=a.length,this.alternativeFormat=this.dateFormats[this.dateFormat].alternative):a.unsorted=!0),u=d)):(a[e]=""===h?null:h,0!==e&&(a.isDatetime||a.isNumeric)&&(a.mixed=!0)));n&&a.mixed&&
-(f[b]=c[b]);if(n&&u&&this.options.sort)for(b=0;b<f.length;b++)f[b].reverse(),p&&f[b].unshift(f[b].pop())},dateFormats:{"YYYY/mm/dd":{regex:/^([0-9]{4})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{1,2})$/,parser:function(a){return Date.UTC(+a[1],a[2]-1,+a[3])}},"dd/mm/YYYY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{4})$/,parser:function(a){return Date.UTC(+a[3],a[2]-1,+a[1])},alternative:"mm/dd/YYYY"},"mm/dd/YYYY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{4})$/,parser:function(a){return Date.UTC(+a[3],
-a[1]-1,+a[2])}},"dd/mm/YY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{2})$/,parser:function(a){var b=+a[3],b=b>(new Date).getFullYear()-2E3?b+1900:b+2E3;return Date.UTC(b,a[2]-1,+a[1])},alternative:"mm/dd/YY"},"mm/dd/YY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{2})$/,parser:function(a){return Date.UTC(+a[3]+2E3,a[1]-1,+a[2])}}},parseDate:function(a){var b=this.options.parseDate,c,f,e=this.options.dateFormat||this.dateFormat,d;if(b)c=b(a);else if("string"===typeof a){if(e)(b=
-this.dateFormats[e])||(b=this.dateFormats["YYYY/mm/dd"]),(d=a.match(b.regex))&&(c=b.parser(d));else for(f in this.dateFormats)if(b=this.dateFormats[f],d=a.match(b.regex)){this.dateFormat=f;this.alternativeFormat=b.alternative;c=b.parser(d);break}d||(d=Date.parse(a),"object"===typeof d&&null!==d&&d.getTime?c=d.getTime()-6E4*d.getTimezoneOffset():E(d)&&(c=d-6E4*(new Date(d)).getTimezoneOffset()))}return c},rowsToColumns:function(a){var b,c,f,e,d;if(a)for(d=[],c=a.length,b=0;b<c;b++)for(e=a[b].length,
-f=0;f<e;f++)d[f]||(d[f]=[]),d[f][b]=a[b][f];return d},parsed:function(){if(this.options.parsed)return this.options.parsed.call(this,this.columns)},getFreeIndexes:function(a,b){var c,f=[],e=[],d;for(c=0;c<a;c+=1)f.push(!0);for(a=0;a<b.length;a+=1)for(d=b[a].getReferencedColumnIndexes(),c=0;c<d.length;c+=1)f[d[c]]=!1;for(c=0;c<f.length;c+=1)f[c]&&e.push(c);return e},complete:function(){var a=this.columns,b,c=this.options,f,e,d,k,h=[],g;if(c.complete||c.afterComplete){if(this.firstRowAsNames)for(d=0;d<
-a.length;d++)a[d].name=a[d].shift();f=[];e=this.getFreeIndexes(a.length,this.valueCount.seriesBuilders);for(d=0;d<this.valueCount.seriesBuilders.length;d++)g=this.valueCount.seriesBuilders[d],g.populateColumns(e)&&h.push(g);for(;0<e.length;){g=new w;g.addColumnReader(0,"x");d=e.indexOf(0);-1!==d&&e.splice(d,1);for(d=0;d<this.valueCount.global;d++)g.addColumnReader(void 0,this.valueCount.globalPointArrayMap[d]);g.populateColumns(e)&&h.push(g)}0<h.length&&0<h[0].readers.length&&(g=a[h[0].readers[0].columnIndex],
-void 0!==g&&(g.isDatetime?b="datetime":g.isNumeric||(b="category")));if("category"===b)for(d=0;d<h.length;d++)for(g=h[d],e=0;e<g.readers.length;e++)"x"===g.readers[e].configName&&(g.readers[e].configName="name");for(d=0;d<h.length;d++){g=h[d];e=[];for(k=0;k<a[0].length;k++)e[k]=g.read(a,k);f[d]={data:e};g.name&&(f[d].name=g.name);"category"===b&&(f[d].turboThreshold=0)}a={series:f};b&&(a.xAxis={type:b},"category"===b&&(a.xAxis.uniqueNames=!1));c.complete&&c.complete(a);c.afterComplete&&c.afterComplete(a)}},
-update:function(a,b){var c=this.chart;a&&(a.afterComplete=function(a){a.xAxis&&c.xAxis[0]&&a.xAxis.type===c.xAxis[0].options.type&&delete a.xAxis;c.update(a,b,!0)},y(!0,this.options,a),this.init(this.options))}});h.Data=z;h.data=function(a,b,c){return new z(a,b,c)};q(n,"init",function(a){var b=this,c=a.args[0],f=a.args[1];c&&c.data&&!b.hasDataDef&&(b.hasDataDef=!0,b.data=new z(h.extend(c.data,{afterComplete:function(a){var d,e;if(c.hasOwnProperty("series"))if("object"===typeof c.series)for(d=Math.max(c.series.length,
-a&&a.series?a.series.length:0);d--;)e=c.series[d]||{},c.series[d]=y(e,a&&a.series?a.series[d]:{});else delete c.series;c=y(a,c);b.init(c,f)}}),c,b),a.preventDefault())});w=function(){this.readers=[];this.pointIsArray=!0};w.prototype.populateColumns=function(a){var b=!0;this.readers.forEach(function(b){void 0===b.columnIndex&&(b.columnIndex=a.shift())});this.readers.forEach(function(a){void 0===a.columnIndex&&(b=!1)});return b};w.prototype.read=function(a,b){var c=this.pointIsArray,f=c?[]:{},e;this.readers.forEach(function(d){var e=
-a[d.columnIndex][b];c?f.push(e):0<d.configName.indexOf(".")?h.Point.prototype.setNestedProperty(f,e,d.configName):f[d.configName]=e});void 0===this.name&&2<=this.readers.length&&(e=this.getReferencedColumnIndexes(),2<=e.length&&(e.shift(),e.sort(function(a,b){return a-b}),this.name=a[e.shift()].name));return f};w.prototype.addColumnReader=function(a,b){this.readers.push({columnIndex:a,configName:b});"x"!==b&&"y"!==b&&void 0!==b&&(this.pointIsArray=!1)};w.prototype.getReferencedColumnIndexes=function(){var a,
-b=[],c;for(a=0;a<this.readers.length;a+=1)c=this.readers[a],void 0!==c.columnIndex&&b.push(c.columnIndex);return b};w.prototype.hasReader=function(a){var b,c;for(b=0;b<this.readers.length;b+=1)if(c=this.readers[b],c.configName===a)return!0}})(q)});
-//# sourceMappingURL=data.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
- Drag-panes module
-
- (c) 2010-2018 Highsoft AS
- Author: Kacper Madej
-
- License: www.highcharts.com/license
-*/
-(function(g){"object"===typeof module&&module.exports?module.exports=g:"function"===typeof define&&define.amd?define(function(){return g}):g("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(g){(function(b){var g=b.hasTouch,x=b.merge,u=b.wrap,y=b.isNumber,e=b.addEvent,v=b.relativeLength,z=b.objectEach,m=b.Axis,w=b.Pointer;x(!0,m.prototype.defaultYAxisOptions,{minLength:"10%",maxLength:"100%",resize:{controlledAxis:{next:[],prev:[]},enabled:!1,cursor:"ns-resize",lineColor:"#cccccc",lineDashStyle:"Solid",
-lineWidth:4,x:0,y:0}});b.AxisResizer=function(a){this.init(a)};b.AxisResizer.prototype={init:function(a,c){this.axis=a;this.options=a.options.resize;this.render();c||this.addMouseEvents()},render:function(){var a=this.axis,c=a.chart,d=this.options,b=d.x,e=d.y,k=Math.min(Math.max(a.top+a.height+e,c.plotTop),c.plotTop+c.plotHeight),l={};c.styledMode||(l={cursor:d.cursor,stroke:d.lineColor,"stroke-width":d.lineWidth,dashstyle:d.lineDashStyle});this.lastPos=k-e;this.controlLine||(this.controlLine=c.renderer.path().addClass("highcharts-axis-resizer"));
-this.controlLine.add(a.axisGroup);d=c.styledMode?this.controlLine.strokeWidth():d.lineWidth;l.d=c.renderer.crispLine(["M",a.left+b,k,"L",a.left+a.width+b,k],d);this.controlLine.attr(l)},addMouseEvents:function(){var a=this,c=a.controlLine.element,d=a.axis.chart.container,b=[],t,k,l;a.mouseMoveHandler=t=function(c){a.onMouseMove(c)};a.mouseUpHandler=k=function(c){a.onMouseUp(c)};a.mouseDownHandler=l=function(c){a.onMouseDown(c)};b.push(e(d,"mousemove",t),e(d.ownerDocument,"mouseup",k),e(c,"mousedown",
-l));g&&b.push(e(d,"touchmove",t),e(d.ownerDocument,"touchend",k),e(c,"touchstart",l));a.eventsToUnbind=b},onMouseMove:function(a){a.touches&&0===a.touches[0].pageX||!this.grabbed||(this.hasDragged=!0,this.updateAxes(this.axis.chart.pointer.normalize(a).chartY-this.options.y))},onMouseUp:function(a){this.hasDragged&&this.updateAxes(this.axis.chart.pointer.normalize(a).chartY-this.options.y);this.grabbed=this.hasDragged=this.axis.chart.activeResizer=null},onMouseDown:function(){this.axis.chart.pointer.reset(!1,
-0);this.grabbed=this.axis.chart.activeResizer=!0},updateAxes:function(a){var c=this,d=c.axis.chart,b=c.options.controlledAxis,e=0===b.next.length?[d.yAxis.indexOf(c.axis)+1]:b.next,b=[c.axis].concat(b.prev),k=[],l=!1,g=d.plotTop,m=d.plotHeight,q=g+m,p;a=Math.max(Math.min(a,q),g);p=a-c.lastPos;1>p*p||([b,e].forEach(function(b,e){b.forEach(function(b,h){var f=(b=y(b)?d.yAxis[b]:e||h?d.get(b):b)&&b.options,n,r;f&&"navigator-y-axis"!==f.id&&(h=b.top,r=Math.round(v(f.minLength,m)),n=Math.round(v(f.maxLength,
-m)),e?(p=a-c.lastPos,f=Math.round(Math.min(Math.max(b.len-p,r),n)),h=b.top+p,h+f>q&&(n=q-f-h,a+=n,h+=n),h<g&&(h=g,h+f>q&&(f=m)),f===r&&(l=!0),k.push({axis:b,options:{top:Math.round(h),height:f}})):(f=Math.round(Math.min(Math.max(a-h,r),n)),f===n&&(l=!0),a=h+f,k.push({axis:b,options:{height:f}})))})}),l||(k.forEach(function(a){a.axis.update(a.options,!1)}),d.redraw(!1)))},destroy:function(){var a=this;delete a.axis.resizer;this.eventsToUnbind&&this.eventsToUnbind.forEach(function(a){a()});a.controlLine.destroy();
-z(a,function(b,d){a[d]=null})}};m.prototype.keepProps.push("resizer");e(m,"afterRender",function(){var a=this.resizer,c=this.options.resize;c&&(c=!1!==c.enabled,a?c?a.init(this,!0):a.destroy():c&&(this.resizer=new b.AxisResizer(this)))});e(m,"destroy",function(a){!a.keepEvents&&this.resizer&&this.resizer.destroy()});u(w.prototype,"runPointActions",function(a){this.chart.activeResizer||a.apply(this,Array.prototype.slice.call(arguments,1))});u(w.prototype,"drag",function(a){this.chart.activeResizer||
-a.apply(this,Array.prototype.slice.call(arguments,1))})})(g)});
-//# sourceMappingURL=drag-panes.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
- Highcharts Drilldown module
-
- Author: Torstein Honsi
- License: www.highcharts.com/license
-
-*/
-(function(n){"object"===typeof module&&module.exports?module.exports=n:"function"===typeof define&&define.amd?define(function(){return n}):n("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(n){(function(e){var n=e.animObject,w=e.noop,x=e.color,y=e.defaultOptions,r=e.extend,D=e.format,z=e.objectEach,t=e.pick,l=e.Chart,p=e.seriesTypes,A=p.pie,p=p.column,B=e.Tick,u=e.fireEvent,C=1;r(y.lang,{drillUpText:"\u25c1 Back to {series.name}"});y.drilldown={activeAxisLabelStyle:{cursor:"pointer",
-color:"#003399",fontWeight:"bold",textDecoration:"underline"},activeDataLabelStyle:{cursor:"pointer",color:"#003399",fontWeight:"bold",textDecoration:"underline"},animation:{duration:500},drillUpButton:{position:{align:"right",x:-10,y:10}}};e.SVGRenderer.prototype.Element.prototype.fadeIn=function(a){this.attr({opacity:.1,visibility:"inherit"}).animate({opacity:t(this.newOpacity,1)},a||{duration:250})};l.prototype.addSeriesAsDrilldown=function(a,b){this.addSingleSeriesAsDrilldown(a,b);this.applyDrilldown()};
-l.prototype.addSingleSeriesAsDrilldown=function(a,b){var c=a.series,d=c.xAxis,f=c.yAxis,h,g=[],m=[],k,q,l;l=this.styledMode?{colorIndex:t(a.colorIndex,c.colorIndex)}:{color:a.color||c.color};this.drilldownLevels||(this.drilldownLevels=[]);k=c.options._levelNumber||0;(q=this.drilldownLevels[this.drilldownLevels.length-1])&&q.levelNumber!==k&&(q=void 0);b=r(r({_ddSeriesId:C++},l),b);h=c.points.indexOf(a);c.chart.series.forEach(function(a){a.xAxis!==d||a.isDrilling||(a.options._ddSeriesId=a.options._ddSeriesId||
-C++,a.options._colorIndex=a.userOptions._colorIndex,a.options._levelNumber=a.options._levelNumber||k,q?(g=q.levelSeries,m=q.levelSeriesOptions):(g.push(a),m.push(a.options)))});a=r({levelNumber:k,seriesOptions:c.options,levelSeriesOptions:m,levelSeries:g,shapeArgs:a.shapeArgs,bBox:a.graphic?a.graphic.getBBox():{},color:a.isNull?(new e.Color(x)).setOpacity(0).get():x,lowerSeriesOptions:b,pointOptions:c.options.data[h],pointIndex:h,oldExtremes:{xMin:d&&d.userMin,xMax:d&&d.userMax,yMin:f&&f.userMin,
-yMax:f&&f.userMax},resetZoomButton:this.resetZoomButton},l);this.drilldownLevels.push(a);d&&d.names&&(d.names.length=0);b=a.lowerSeries=this.addSeries(b,!1);b.options._levelNumber=k+1;d&&(d.oldPos=d.pos,d.userMin=d.userMax=null,f.userMin=f.userMax=null);c.type===b.type&&(b.animate=b.animateDrilldown||w,b.options.animation=!0)};l.prototype.applyDrilldown=function(){var a=this.drilldownLevels,b;a&&0<a.length&&(b=a[a.length-1].levelNumber,this.drilldownLevels.forEach(function(a){a.levelNumber===b&&a.levelSeries.forEach(function(a){a.options&&
-a.options._levelNumber===b&&a.remove(!1)})}));this.resetZoomButton&&(this.resetZoomButton.hide(),delete this.resetZoomButton);this.pointer.reset();this.redraw();this.showDrillUpButton()};l.prototype.getDrilldownBackText=function(){var a=this.drilldownLevels;if(a&&0<a.length)return a=a[a.length-1],a.series=a.seriesOptions,D(this.options.lang.drillUpText,a)};l.prototype.showDrillUpButton=function(){var a=this,b=this.getDrilldownBackText(),c=a.options.drilldown.drillUpButton,d,f;this.drillUpButton?this.drillUpButton.attr({text:b}).align():
-(f=(d=c.theme)&&d.states,this.drillUpButton=this.renderer.button(b,null,null,function(){a.drillUp()},d,f&&f.hover,f&&f.select).addClass("highcharts-drillup-button").attr({align:c.position.align,zIndex:7}).add().align(c.position,!1,c.relativeTo||"plotBox"))};l.prototype.drillUp=function(){if(this.drilldownLevels&&0!==this.drilldownLevels.length){for(var a=this,b=a.drilldownLevels,c=b[b.length-1].levelNumber,d=b.length,f=a.series,h,g,e,k,q=function(b){var c;f.forEach(function(a){a.options._ddSeriesId===
-b._ddSeriesId&&(c=a)});c=c||a.addSeries(b,!1);c.type===e.type&&c.animateDrillupTo&&(c.animate=c.animateDrillupTo);b===g.seriesOptions&&(k=c)};d--;)if(g=b[d],g.levelNumber===c){b.pop();e=g.lowerSeries;if(!e.chart)for(h=f.length;h--;)if(f[h].options.id===g.lowerSeriesOptions.id&&f[h].options._levelNumber===c+1){e=f[h];break}e.xData=[];g.levelSeriesOptions.forEach(q);u(a,"drillup",{seriesOptions:g.seriesOptions});k.type===e.type&&(k.drilldownLevel=g,k.options.animation=a.options.drilldown.animation,
-e.animateDrillupFrom&&e.chart&&e.animateDrillupFrom(g));k.options._levelNumber=c;e.remove(!1);k.xAxis&&(h=g.oldExtremes,k.xAxis.setExtremes(h.xMin,h.xMax,!1),k.yAxis.setExtremes(h.yMin,h.yMax,!1));g.resetZoomButton&&(a.resetZoomButton=g.resetZoomButton,a.resetZoomButton.show())}u(a,"drillupall");this.redraw();0===this.drilldownLevels.length?this.drillUpButton=this.drillUpButton.destroy():this.drillUpButton.attr({text:this.getDrilldownBackText()}).align();this.ddDupes.length=[]}};l.prototype.callbacks.push(function(){var a=
-this;a.drilldown={update:function(b,c){e.merge(!0,a.options.drilldown,b);t(c,!0)&&a.redraw()}}});e.addEvent(l,"beforeShowResetZoom",function(){if(this.drillUpButton)return!1});e.addEvent(l,"render",function(){(this.xAxis||[]).forEach(function(a){a.ddPoints={};a.series.forEach(function(b){var c,d=b.xData||[],f=b.points,h;for(c=0;c<d.length;c++)h=b.options.data[c],"number"!==typeof h&&(h=b.pointClass.prototype.optionsToObject.call({series:b},h),h.drilldown&&(a.ddPoints[d[c]]||(a.ddPoints[d[c]]=[]),
-a.ddPoints[d[c]].push(f?f[c]:!0)))});z(a.ticks,B.prototype.drillable)})});p.prototype.animateDrillupTo=function(a){if(!a){var b=this,c=b.drilldownLevel;this.points.forEach(function(a){var b=a.dataLabel;a.graphic&&a.graphic.hide();b&&(b.hidden="hidden"===b.attr("visibility"),b.hidden||(b.hide(),a.connector&&a.connector.hide()))});e.syncTimeout(function(){b.points&&b.points.forEach(function(a,b){b=b===(c&&c.pointIndex)?"show":"fadeIn";var d="show"===b?!0:void 0,f=a.dataLabel;if(a.graphic)a.graphic[b](d);
-f&&!f.hidden&&(f.fadeIn(),a.connector&&a.connector.fadeIn())})},Math.max(this.chart.options.drilldown.animation.duration-50,0));this.animate=w}};p.prototype.animateDrilldown=function(a){var b=this,c=this.chart,d=c.drilldownLevels,f,e=n(c.options.drilldown.animation),g=this.xAxis,m=c.styledMode;a||(d.forEach(function(a){b.options._ddSeriesId===a.lowerSeriesOptions._ddSeriesId&&(f=a.shapeArgs,m||(f.fill=a.color))}),f.x+=t(g.oldPos,g.pos)-g.pos,this.points.forEach(function(a){var c=a.shapeArgs;m||(c.fill=
-a.color);a.graphic&&a.graphic.attr(f).animate(r(a.shapeArgs,{fill:a.color||b.color}),e);a.dataLabel&&a.dataLabel.fadeIn(e)}),this.animate=null)};p.prototype.animateDrillupFrom=function(a){var b=n(this.chart.options.drilldown.animation),c=this.group,d=c!==this.chart.columnGroup,f=this;f.trackerGroups.forEach(function(a){if(f[a])f[a].on("mouseover")});d&&delete this.group;this.points.forEach(function(h){var g=h.graphic,m=a.shapeArgs,k=function(){g.destroy();c&&d&&(c=c.destroy())};g&&(delete h.graphic,
-f.chart.styledMode||(m.fill=a.color),b.duration?g.animate(m,e.merge(b,{complete:k})):(g.attr(m),k()))})};A&&r(A.prototype,{animateDrillupTo:p.prototype.animateDrillupTo,animateDrillupFrom:p.prototype.animateDrillupFrom,animateDrilldown:function(a){var b=this.chart.drilldownLevels[this.chart.drilldownLevels.length-1],c=this.chart.options.drilldown.animation,d=b.shapeArgs,f=d.start,h=(d.end-f)/this.points.length,g=this.chart.styledMode;a||(this.points.forEach(function(a,k){var m=a.shapeArgs;g||(d.fill=
-b.color,m.fill=a.color);if(a.graphic)a.graphic.attr(e.merge(d,{start:f+k*h,end:f+(k+1)*h}))[c?"animate":"attr"](m,c)}),this.animate=null)}});e.Point.prototype.doDrilldown=function(a,b,c){var d=this.series.chart,f=d.options.drilldown,e=(f.series||[]).length,g;d.ddDupes||(d.ddDupes=[]);for(;e--&&!g;)f.series[e].id===this.drilldown&&-1===d.ddDupes.indexOf(this.drilldown)&&(g=f.series[e],d.ddDupes.push(this.drilldown));u(d,"drilldown",{point:this,seriesOptions:g,category:b,originalEvent:c,points:void 0!==
-b&&this.series.xAxis.getDDPoints(b).slice(0)},function(b){var c=b.point.series&&b.point.series.chart,d=b.seriesOptions;c&&d&&(a?c.addSingleSeriesAsDrilldown(b.point,d):c.addSeriesAsDrilldown(b.point,d))})};e.Axis.prototype.drilldownCategory=function(a,b){z(this.getDDPoints(a),function(c){c&&c.series&&c.series.visible&&c.doDrilldown&&c.doDrilldown(!0,a,b)});this.chart.applyDrilldown()};e.Axis.prototype.getDDPoints=function(a){return this.ddPoints&&this.ddPoints[a]};B.prototype.drillable=function(){var a=
-this.pos,b=this.label,c=this.axis,d="xAxis"===c.coll&&c.getDDPoints,f=d&&c.getDDPoints(a),h=c.chart.styledMode;d&&(b&&f&&f.length?(b.drillable=!0,b.basicStyles||h||(b.basicStyles=e.merge(b.styles)),b.addClass("highcharts-drilldown-axis-label").on("click",function(b){c.drilldownCategory(a,b)}),h||b.css(c.chart.options.drilldown.activeAxisLabelStyle)):b&&b.drillable&&(h||(b.styles={},b.css(b.basicStyles)),b.on("click",null),b.removeClass("highcharts-drilldown-axis-label")))};e.addEvent(e.Point,"afterInit",
-function(){var a=this,b=a.series;a.drilldown&&e.addEvent(a,"click",function(c){b.xAxis&&!1===b.chart.options.drilldown.allowPointDrilldown?b.xAxis.drilldownCategory(a.x,c):a.doDrilldown(void 0,void 0,c)});return a});e.addEvent(e.Series,"afterDrawDataLabels",function(){var a=this.chart.options.drilldown.activeDataLabelStyle,b=this.chart.renderer,c=this.chart.styledMode;this.points.forEach(function(d){var f=d.options.dataLabels,e=t(d.dlOptions,f&&f.style,{});d.drilldown&&d.dataLabel&&("contrast"!==
-a.color||c||(e.color=b.getContrast(d.color||this.color)),f&&f.color&&(e.color=f.color),d.dataLabel.addClass("highcharts-drilldown-data-label"),c||d.dataLabel.css(a).css(e))},this)});var v=function(a,b,c,d){a[c?"addClass":"removeClass"]("highcharts-drilldown-point");d||a.css({cursor:b})};e.addEvent(e.Series,"afterDrawTracker",function(){var a=this.chart.styledMode;this.points.forEach(function(b){b.drilldown&&b.graphic&&v(b.graphic,"pointer",!0,a)})});e.addEvent(e.Point,"afterSetState",function(){var a=
-this.series.chart.styledMode;this.drilldown&&this.series.halo&&"hover"===this.state?v(this.series.halo,"pointer",!0,a):this.series.halo&&v(this.series.halo,"auto",!1,a)})})(n)});
-//# sourceMappingURL=drilldown.js.map
-</script>
-<script>/*
-  Highcharts JS v7.0.1 (2018-12-19)
-
- Item series type for Highcharts
-
- (c) 2010-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(c){"object"===typeof module&&module.exports?module.exports=c:"function"===typeof define&&define.amd?define(function(){return c}):c("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(c){(function(f){var c=f.extend,u=f.pick,r=f.seriesType;r("item","column",{itemPadding:.2,marker:{symbol:"circle",states:{hover:{},select:{}}}},{drawPoints:function(){var b=this,v=b.chart.renderer,l=this.options.marker,m=this.yAxis.transA*b.options.itemPadding,n=this.borderWidth%2?.5:1;this.points.forEach(function(a){var d,
-e,g,h,k;d=a.marker||{};var w=d.symbol||l.symbol,r=u(d.radius,l.radius),p,t,x="rect"!==w,q;a.graphics=g=a.graphics||{};k=a.pointAttr?a.pointAttr[a.selected?"selected":""]||b.pointAttr[""]:b.pointAttribs(a,a.selected&&"select");delete k.r;b.chart.styledMode&&(delete k.stroke,delete k["stroke-width"]);if(null!==a.y)for(a.graphic||(a.graphic=v.g("point").add(b.group)),h=a.y,t=u(a.stackY,a.y),p=Math.min(a.pointWidth,b.yAxis.transA-m),d=t;d>t-a.y;d--)e=a.barX+(x?a.pointWidth/2-p/2:0),q=b.yAxis.toPixels(d,
-!0)+m/2,b.options.crisp&&(e=Math.round(e)-n,q=Math.round(q)+n),e={x:e,y:q,width:Math.round(x?p:a.pointWidth),height:Math.round(p),r:r},g[h]?g[h].animate(e):g[h]=v.symbol(w).attr(c(e,k)).add(a.graphic),g[h].isActive=!0,h--;f.objectEach(g,function(a,b){a.isActive?a.isActive=!1:(a.destroy(),delete a[b])})})}});f.SVGRenderer.prototype.symbols.rect=function(b,c,l,m,n){return f.SVGRenderer.prototype.symbols.callout(b,c,l,m,n)}})(c)});
-//# sourceMappingURL=item-series.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
- Client side exporting module
-
- (c) 2015-2018 Torstein Honsi / Oystein Moseng
-
- License: www.highcharts.com/license
-*/
-(function(h){"object"===typeof module&&module.exports?module.exports=h:"function"===typeof define&&define.amd?define(function(){return h}):h("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(h){(function(a){var b=a.win,h=b.navigator,n=b.document,d=b.URL||b.webkitURL||b,r=/Edge\/\d+/.test(h.userAgent);a.dataURLtoBlob=function(a){if((a=a.match(/data:([^;]*)(;base64)?,([0-9A-Za-z+/]+)/))&&3<a.length&&b.atob&&b.ArrayBuffer&&b.Uint8Array&&b.Blob&&d.createObjectURL){for(var g=b.atob(a[3]),e=
-new b.ArrayBuffer(g.length),e=new b.Uint8Array(e),h=0;h<e.length;++h)e[h]=g.charCodeAt(h);a=new b.Blob([e],{type:a[1]});return d.createObjectURL(a)}};a.downloadURL=function(g,d){var e=n.createElement("a"),x;if("string"===typeof g||g instanceof String||!h.msSaveOrOpenBlob){if(r||2E6<g.length)if(g=a.dataURLtoBlob(g),!g)throw"Failed to convert to blob";if(void 0!==e.download)e.href=g,e.download=d,n.body.appendChild(e),e.click(),n.body.removeChild(e);else try{if(x=b.open(g,"chart"),void 0===x||null===
-x)throw"Failed to open window";}catch(k){b.location.href=g}}else h.msSaveOrOpenBlob(g,d)}})(h);(function(a){function b(k,b){var f=g.getElementsByTagName("head")[0],c=g.createElement("script");c.type="text/javascript";c.src=k;c.onload=b;c.onerror=function(){a.error("Error loading script "+k)};f.appendChild(c)}var h=a.addEvent,n=a.merge,d=a.win,r=d.navigator,g=d.document,B=d.URL||d.webkitURL||d,e=/Edge\/|Trident\/|MSIE /.test(r.userAgent),x=e?150:0;a.CanVGRenderer={};a.svgToDataUrl=function(a){var k=
--1<r.userAgent.indexOf("WebKit")&&0>r.userAgent.indexOf("Chrome");try{if(!k&&0>r.userAgent.toLowerCase().indexOf("firefox"))return B.createObjectURL(new d.Blob([a],{type:"image/svg+xml;charset-utf-16"}))}catch(f){}return"data:image/svg+xml;charset\x3dUTF-8,"+encodeURIComponent(a)};a.imageToDataUrl=function(a,b,f,c,h,e,q,t,p){var l=new d.Image,k,y=function(){setTimeout(function(){var d=g.createElement("canvas"),e=d.getContext&&d.getContext("2d"),z;try{if(e){d.height=l.height*c;d.width=l.width*c;e.drawImage(l,
-0,0,d.width,d.height);try{z=d.toDataURL(b),h(z,b,f,c)}catch(C){k(a,b,f,c)}}else q(a,b,f,c)}finally{p&&p(a,b,f,c)}},x)},u=function(){t(a,b,f,c);p&&p(a,b,f,c)};k=function(){l=new d.Image;k=e;l.crossOrigin="Anonymous";l.onload=y;l.onerror=u;l.src=a};l.onload=y;l.onerror=u;l.src=a};a.downloadSVGLocal=function(k,e,f,c){function h(a,c){c=new d.jsPDF("l","pt",[a.width.baseVal.value+2*c,a.height.baseVal.value+2*c]);[].forEach.call(a.querySelectorAll('*[visibility\x3d"hidden"]'),function(a){a.parentNode.removeChild(a)});
-d.svg2pdf(a,c,{removeInvalid:!0});return c.output("datauristring")}function u(){A.innerHTML=k;var b=A.getElementsByTagName("text"),d;[].forEach.call(b,function(a){["font-family","font-size"].forEach(function(c){for(var b=a;b&&b!==A;){if(b.style[c]){a.style[c]=b.style[c];break}b=b.parentNode}});a.style["font-family"]=a.style["font-family"]&&a.style["font-family"].split(" ").splice(-1);d=a.getElementsByTagName("title");[].forEach.call(d,function(c){a.removeChild(c)})});b=h(A.firstChild,0);try{a.downloadURL(b,
-v),c&&c()}catch(D){f(D)}}var q,t,p=!0,l,m=e.libURL||a.getOptions().exporting.libURL,A=g.createElement("div"),w=e.type||"image/png",v=(e.filename||"chart")+"."+("image/svg+xml"===w?"svg":w.split("/")[1]),n=e.scale||1,m="/"!==m.slice(-1)?m+"/":m;if("image/svg+xml"===w)try{r.msSaveOrOpenBlob?(t=new MSBlobBuilder,t.append(k),q=t.getBlob("image/svg+xml")):q=a.svgToDataUrl(k),a.downloadURL(q,v),c&&c()}catch(z){f(z)}else"application/pdf"===w?d.jsPDF&&d.svg2pdf?u():(p=!0,b(m+"jspdf.js",function(){b(m+"svg2pdf.js",
-function(){u()})})):(q=a.svgToDataUrl(k),l=function(){try{B.revokeObjectURL(q)}catch(z){}},a.imageToDataUrl(q,w,{},n,function(b){try{a.downloadURL(b,v),c&&c()}catch(C){f(C)}},function(){var e=g.createElement("canvas"),h=e.getContext("2d"),u=k.match(/^<svg[^>]*width\s*=\s*\"?(\d+)\"?[^>]*>/)[1]*n,y=k.match(/^<svg[^>]*height\s*=\s*\"?(\d+)\"?[^>]*>/)[1]*n,q=function(){h.drawSvg(k,0,0,u,y);try{a.downloadURL(r.msSaveOrOpenBlob?e.msToBlob():e.toDataURL(w),v),c&&c()}catch(E){f(E)}finally{l()}};e.width=
-u;e.height=y;d.canvg?q():(p=!0,b(m+"rgbcolor.js",function(){b(m+"canvg.js",function(){q()})}))},f,f,function(){p&&l()}))};a.Chart.prototype.getSVGForLocalExport=function(b,e,d,c){var f=this,g,k=0,t,p,l,m,n,r=function(a,b,d){++k;d.imageElement.setAttributeNS("http://www.w3.org/1999/xlink","href",a);k===g.length&&c(f.sanitizeSVG(t.innerHTML,p))};f.unbindGetSVG=h(f,"getSVG",function(a){p=a.chartCopy.options;t=a.chartCopy.container.cloneNode(!0)});f.getSVGForExport(b,e);g=t.getElementsByTagName("image");
-try{if(!g.length){c(f.sanitizeSVG(t.innerHTML,p));return}m=0;for(n=g.length;m<n;++m)l=g[m],a.imageToDataUrl(l.getAttributeNS("http://www.w3.org/1999/xlink","href"),"image/png",{imageElement:l},b.scale,r,d,d,d)}catch(v){d(v)}f.unbindGetSVG()};a.Chart.prototype.exportChartLocal=function(b,d){var f=this,c=a.merge(f.options.exporting,b),g=function(b){!1===c.fallbackToExportServer?c.error?c.error(c,b):a.error(28,!0):f.exportChart(c)};e&&f.styledMode&&(a.SVGRenderer.prototype.inlineWhitelist=[/^blockSize/,
-/^border/,/^caretColor/,/^color/,/^columnRule/,/^columnRuleColor/,/^cssFloat/,/^cursor/,/^fill$/,/^fillOpacity/,/^font/,/^inlineSize/,/^length/,/^lineHeight/,/^opacity/,/^outline/,/^parentRule/,/^rx$/,/^ry$/,/^stroke/,/^textAlign/,/^textAnchor/,/^textDecoration/,/^transform/,/^vectorEffect/,/^visibility/,/^x$/,/^y$/]);e&&("application/pdf"===c.type||f.container.getElementsByTagName("image").length&&"image/svg+xml"!==c.type)||"application/pdf"===c.type&&f.container.getElementsByTagName("image").length?
-g("Image type not supported for this chart/browser."):f.getSVGForLocalExport(c,d,g,function(b){-1<b.indexOf("\x3cforeignObject")&&"image/svg+xml"!==c.type?g("Image type not supported for charts with embedded HTML"):a.downloadSVGLocal(b,a.extend({filename:f.getFilename()},c),g)})};n(!0,a.getOptions().exporting,{libURL:"https://code.highcharts.com/7.0.1/lib/",menuItemDefinitions:{downloadPNG:{textKey:"downloadPNG",onclick:function(){this.exportChartLocal()}},downloadJPEG:{textKey:"downloadJPEG",onclick:function(){this.exportChartLocal({type:"image/jpeg"})}},
-downloadSVG:{textKey:"downloadSVG",onclick:function(){this.exportChartLocal({type:"image/svg+xml"})}},downloadPDF:{textKey:"downloadPDF",onclick:function(){this.exportChartLocal({type:"application/pdf"})}}}})})(h)});
-//# sourceMappingURL=offline-exporting.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
-
- (c) 2009-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(a){});
-//# sourceMappingURL=overlapping-datalabels.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
- Exporting module
-
- (c) 2010-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(l){"object"===typeof module&&module.exports?module.exports=l:"function"===typeof define&&define.amd?define(function(){return l}):l("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(l){(function(g){var y=g.defaultOptions,z=g.doc,l=g.Chart,q=g.addEvent,I=g.removeEvent,C=g.fireEvent,t=g.createElement,D=g.discardElement,r=g.css,p=g.merge,u=g.pick,E=g.objectEach,x=g.extend,J=g.isTouchDevice,A=g.win,G=A.navigator.userAgent,F=g.SVGRenderer,H=g.Renderer.prototype.symbols,K=/Edge\/|Trident\/|MSIE /.test(G),
-L=/firefox/i.test(G);x(y.lang,{printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",contextButtonTitle:"Chart context menu"});y.navigation||(y.navigation={});p(!0,y.navigation,{buttonOptions:{theme:{},symbolSize:14,symbolX:12.5,symbolY:10.5,align:"right",buttonSpacing:3,height:22,verticalAlign:"top",width:24}});p(!0,y.navigation,{menuStyle:{border:"1px solid #999999",background:"#ffffff",
-padding:"5px 0"},menuItemStyle:{padding:"0.5em 1em",color:"#333333",background:"none",fontSize:J?"14px":"11px",transition:"background 250ms, color 250ms"},menuItemHoverStyle:{background:"#335cad",color:"#ffffff"},buttonOptions:{symbolFill:"#666666",symbolStroke:"#666666",symbolStrokeWidth:3,theme:{padding:5}}});y.exporting={type:"image/png",url:"https://export.highcharts.com/",printMaxWidth:780,scale:2,buttons:{contextButton:{className:"highcharts-contextbutton",menuClassName:"highcharts-contextmenu",
-symbol:"menu",titleKey:"contextButtonTitle",menuItems:"printChart separator downloadPNG downloadJPEG downloadPDF downloadSVG".split(" ")}},menuItemDefinitions:{printChart:{textKey:"printChart",onclick:function(){this.print()}},separator:{separator:!0},downloadPNG:{textKey:"downloadPNG",onclick:function(){this.exportChart()}},downloadJPEG:{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},downloadPDF:{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},
-downloadSVG:{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}}};g.post=function(b,a,d){var c=t("form",p({method:"post",action:b,enctype:"multipart/form-data"},d),{display:"none"},z.body);E(a,function(a,b){t("input",{type:"hidden",name:b,value:a},null,c)});c.submit();D(c)};x(l.prototype,{sanitizeSVG:function(b,a){if(a&&a.exporting&&a.exporting.allowHTML){var d=b.match(/<\/svg>(.*?$)/);d&&d[1]&&(d='\x3cforeignObject x\x3d"0" y\x3d"0" width\x3d"'+a.chart.width+'" height\x3d"'+
-a.chart.height+'"\x3e\x3cbody xmlns\x3d"http://www.w3.org/1999/xhtml"\x3e'+d[1]+"\x3c/body\x3e\x3c/foreignObject\x3e",b=b.replace("\x3c/svg\x3e",d+"\x3c/svg\x3e"))}b=b.replace(/zIndex="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\(("|&quot;)(\S+)("|&quot;)\)/g,"url($2)").replace(/url\([^#]+#/g,"url(#").replace(/<svg /,'\x3csvg xmlns:xlink\x3d"http://www.w3.org/1999/xlink" ').replace(/ (|NS[0-9]+\:)href=/g," xlink:href\x3d").replace(/\n/," ").replace(/<\/svg>.*?$/,
-"\x3c/svg\x3e").replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g,'$1\x3d"rgb($2)" $1-opacity\x3d"$3"').replace(/&nbsp;/g,"\u00a0").replace(/&shy;/g,"\u00ad");this.ieSanitizeSVG&&(b=this.ieSanitizeSVG(b));return b},getChartHTML:function(){this.styledMode&&this.inlineStyles();return this.container.innerHTML},getSVG:function(b){var a,d,c,w,m,h=p(this.options,b);d=t("div",null,{position:"absolute",top:"-9999em",width:this.chartWidth+"px",height:this.chartHeight+"px"},z.body);c=
-this.renderTo.style.width;m=this.renderTo.style.height;c=h.exporting.sourceWidth||h.chart.width||/px$/.test(c)&&parseInt(c,10)||(h.isGantt?800:600);m=h.exporting.sourceHeight||h.chart.height||/px$/.test(m)&&parseInt(m,10)||400;x(h.chart,{animation:!1,renderTo:d,forExport:!0,renderer:"SVGRenderer",width:c,height:m});h.exporting.enabled=!1;delete h.data;h.series=[];this.series.forEach(function(a){w=p(a.userOptions,{animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});w.isInternal||
-h.series.push(w)});this.axes.forEach(function(a){a.userOptions.internalKey||(a.userOptions.internalKey=g.uniqueKey())});a=new g.Chart(h,this.callback);b&&["xAxis","yAxis","series"].forEach(function(c){var d={};b[c]&&(d[c]=b[c],a.update(d))});this.axes.forEach(function(b){var c=g.find(a.axes,function(a){return a.options.internalKey===b.userOptions.internalKey}),d=b.getExtremes(),e=d.userMin,d=d.userMax;c&&(void 0!==e&&e!==c.min||void 0!==d&&d!==c.max)&&c.setExtremes(e,d,!0,!1)});c=a.getChartHTML();
-C(this,"getSVG",{chartCopy:a});c=this.sanitizeSVG(c,h);h=null;a.destroy();D(d);return c},getSVGForExport:function(b,a){var d=this.options.exporting;return this.getSVG(p({chart:{borderRadius:0}},d.chartOptions,a,{exporting:{sourceWidth:b&&b.sourceWidth||d.sourceWidth,sourceHeight:b&&b.sourceHeight||d.sourceHeight}}))},getFilename:function(){var b=this.userOptions.title&&this.userOptions.title.text,a=this.options.exporting.filename;if(a)return a;"string"===typeof b&&(a=b.toLowerCase().replace(/<\/?[^>]+(>|$)/g,
-"").replace(/[\s_]+/g,"-").replace(/[^a-z0-9\-]/g,"").replace(/^[\-]+/g,"").replace(/[\-]+/g,"-").substr(0,24).replace(/[\-]+$/g,""));if(!a||5>a.length)a="chart";return a},exportChart:function(b,a){a=this.getSVGForExport(b,a);b=p(this.options.exporting,b);g.post(b.url,{filename:b.filename||this.getFilename(),type:b.type,width:b.width||0,scale:b.scale,svg:a},b.formAttributes)},print:function(){function b(b){(a.fixedDiv?[a.fixedDiv,a.scrollingContainer]:[a.container]).forEach(function(a){b.appendChild(a)})}
-var a=this,d=[],c=z.body,g=c.childNodes,m=a.options.exporting.printMaxWidth,h,e;if(!a.isPrinting){a.isPrinting=!0;a.pointer.reset(null,0);C(a,"beforePrint");if(e=m&&a.chartWidth>m)h=[a.options.chart.width,void 0,!1],a.setSize(m,void 0,!1);g.forEach(function(a,b){1===a.nodeType&&(d[b]=a.style.display,a.style.display="none")});b(c);setTimeout(function(){A.focus();A.print();setTimeout(function(){b(a.renderTo);g.forEach(function(a,b){1===a.nodeType&&(a.style.display=d[b])});a.isPrinting=!1;e&&a.setSize.apply(a,
-h);C(a,"afterPrint")},1E3)},1)}},contextMenu:function(b,a,d,c,w,m,h){var e=this,n=e.options.navigation,k=e.chartWidth,v=e.chartHeight,l="cache-"+b,f=e[l],B=Math.max(w,m),p;f||(e.exportContextMenu=e[l]=f=t("div",{className:b},{position:"absolute",zIndex:1E3,padding:B+"px",pointerEvents:"auto"},e.fixedDiv||e.container),p=t("div",{className:"highcharts-menu"},null,f),e.styledMode||r(p,x({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},n.menuStyle)),
-f.hideMenu=function(){r(f,{display:"none"});h&&h.setState(0);e.openMenu=!1;g.clearTimeout(f.hideTimer)},e.exportEvents.push(q(f,"mouseleave",function(){f.hideTimer=setTimeout(f.hideMenu,500)}),q(f,"mouseenter",function(){g.clearTimeout(f.hideTimer)}),q(z,"mouseup",function(a){e.pointer.inClass(a.target,b)||f.hideMenu()}),q(f,"click",function(){e.openMenu&&f.hideMenu()})),a.forEach(function(a){"string"===typeof a&&(a=e.options.exporting.menuItemDefinitions[a]);if(g.isObject(a,!0)){var b;a.separator?
-b=t("hr",null,null,p):(b=t("div",{className:"highcharts-menu-item",onclick:function(b){b&&b.stopPropagation();f.hideMenu();a.onclick&&a.onclick.apply(e,arguments)},innerHTML:a.text||e.options.lang[a.textKey]},null,p),e.styledMode||(b.onmouseover=function(){r(this,n.menuItemHoverStyle)},b.onmouseout=function(){r(this,n.menuItemStyle)},r(b,x({cursor:"pointer"},n.menuItemStyle))));e.exportDivElements.push(b)}}),e.exportDivElements.push(p,f),e.exportMenuWidth=f.offsetWidth,e.exportMenuHeight=f.offsetHeight);
-a={display:"block"};d+e.exportMenuWidth>k?a.right=k-d-w-B+"px":a.left=d-B+"px";c+m+e.exportMenuHeight>v&&"top"!==h.alignOptions.verticalAlign?a.bottom=v-c-B+"px":a.top=c+m-B+"px";r(f,a);e.openMenu=!0},addButton:function(b){var a=this,d=a.renderer,c=p(a.options.navigation.buttonOptions,b),g=c.onclick,m=c.menuItems,h,e,n=c.symbolSize||12;a.btnCount||(a.btnCount=0);a.exportDivElements||(a.exportDivElements=[],a.exportSVGElements=[]);if(!1!==c.enabled){var k=c.theme,v=k.states,l=v&&v.hover,v=v&&v.select,
-f;a.styledMode||(k.fill=u(k.fill,"#ffffff"),k.stroke=u(k.stroke,"none"));delete k.states;g?f=function(b){b&&b.stopPropagation();g.call(a,b)}:m&&(f=function(b){b&&b.stopPropagation();a.contextMenu(e.menuClassName,m,e.translateX,e.translateY,e.width,e.height,e);e.setState(2)});c.text&&c.symbol?k.paddingLeft=u(k.paddingLeft,25):c.text||x(k,{width:c.width,height:c.height,padding:0});a.styledMode||(k["stroke-linecap"]="round",k.fill=u(k.fill,"#ffffff"),k.stroke=u(k.stroke,"none"));e=d.button(c.text,0,
-0,f,k,l,v).addClass(b.className).attr({title:u(a.options.lang[c._titleKey||c.titleKey],"")});e.menuClassName=b.menuClassName||"highcharts-menu-"+a.btnCount++;c.symbol&&(h=d.symbol(c.symbol,c.symbolX-n/2,c.symbolY-n/2,n,n,{width:n,height:n}).addClass("highcharts-button-symbol").attr({zIndex:1}).add(e),a.styledMode||h.attr({stroke:c.symbolStroke,fill:c.symbolFill,"stroke-width":c.symbolStrokeWidth||1}));e.add(a.exportingGroup).align(x(c,{width:e.width,x:u(c.x,a.buttonOffset)}),!0,"spacingBox");a.buttonOffset+=
-(e.width+c.buttonSpacing)*("right"===c.align?-1:1);a.exportSVGElements.push(e,h)}},destroyExport:function(b){var a=b?b.target:this;b=a.exportSVGElements;var d=a.exportDivElements,c=a.exportEvents,l;b&&(b.forEach(function(b,c){b&&(b.onclick=b.ontouchstart=null,l="cache-"+b.menuClassName,a[l]&&delete a[l],a.exportSVGElements[c]=b.destroy())}),b.length=0);a.exportingGroup&&(a.exportingGroup.destroy(),delete a.exportingGroup);d&&(d.forEach(function(b,c){g.clearTimeout(b.hideTimer);I(b,"mouseleave");a.exportDivElements[c]=
-b.onmouseout=b.onmouseover=b.ontouchstart=b.onclick=null;D(b)}),d.length=0);c&&(c.forEach(function(a){a()}),c.length=0)}});F.prototype.inlineToAttributes="fill stroke strokeLinecap strokeLinejoin strokeWidth textAnchor x y".split(" ");F.prototype.inlineBlacklist=[/-/,/^(clipPath|cssText|d|height|width)$/,/^font$/,/[lL]ogical(Width|Height)$/,/perspective/,/TapHighlightColor/,/^transition/,/^length$/];F.prototype.unstyledElements=["clipPath","defs","desc"];l.prototype.inlineStyles=function(){function b(a){return a.replace(/([A-Z])/g,
-function(a,b){return"-"+b.toLowerCase()})}function a(d){function m(a,f){q=t=!1;if(l){for(r=l.length;r--&&!t;)t=l[r].test(f);q=!t}"transform"===f&&"none"===a&&(q=!0);for(r=g.length;r--&&!q;)q=g[r].test(f)||"function"===typeof a;q||v[f]===a&&"svg"!==d.nodeName||e[d.nodeName][f]===a||(-1!==c.indexOf(f)?d.setAttribute(b(f),a):u+=b(f)+":"+a+";")}var f,v,u="",w,q,t,r;if(1===d.nodeType&&-1===h.indexOf(d.nodeName)){f=A.getComputedStyle(d,null);v="svg"===d.nodeName?{}:A.getComputedStyle(d.parentNode,null);
-e[d.nodeName]||(n=k.getElementsByTagName("svg")[0],w=k.createElementNS(d.namespaceURI,d.nodeName),n.appendChild(w),e[d.nodeName]=p(A.getComputedStyle(w,null)),"text"===d.nodeName&&delete e.text.fill,n.removeChild(w));if(L||K)for(var x in f)m(f[x],x);else E(f,m);u&&(f=d.getAttribute("style"),d.setAttribute("style",(f?f+";":"")+u));"svg"===d.nodeName&&d.setAttribute("stroke-width","1px");"text"!==d.nodeName&&[].forEach.call(d.children||d.childNodes,a)}}var d=this.renderer,c=d.inlineToAttributes,g=d.inlineBlacklist,
-l=d.inlineWhitelist,h=d.unstyledElements,e={},n,k,d=z.createElement("iframe");r(d,{width:"1px",height:"1px",visibility:"hidden"});z.body.appendChild(d);k=d.contentWindow.document;k.open();k.write('\x3csvg xmlns\x3d"http://www.w3.org/2000/svg"\x3e\x3c/svg\x3e');k.close();a(this.container.querySelector("svg"));n.parentNode.removeChild(n)};H.menu=function(b,a,d,c){return["M",b,a+2.5,"L",b+d,a+2.5,"M",b,a+c/2+.5,"L",b+d,a+c/2+.5,"M",b,a+c-1.5,"L",b+d,a+c-1.5]};H.menuball=function(b,a,d,c){b=[];c=c/3-
-2;return b=b.concat(this.circle(d-c,a,c,c),this.circle(d-c,a+c+4,c,c),this.circle(d-c,a+2*(c+4),c,c))};l.prototype.renderExporting=function(){var b=this,a=b.options.exporting,d=a.buttons,c=b.isDirtyExporting||!b.exportSVGElements;b.buttonOffset=0;b.isDirtyExporting&&b.destroyExport();c&&!1!==a.enabled&&(b.exportEvents=[],b.exportingGroup=b.exportingGroup||b.renderer.g("exporting-group").attr({zIndex:3}).add(),E(d,function(a){b.addButton(a)}),b.isDirtyExporting=!1);q(b,"destroy",b.destroyExport)};
-q(l,"init",function(){var b=this;["exporting","navigation"].forEach(function(a){b[a]={update:function(d,c){b.isDirtyExporting=!0;p(!0,b.options[a],d);u(c,!0)&&b.redraw()}}})});l.prototype.callbacks.push(function(b){b.renderExporting();q(b,"redraw",b.renderExporting)})})(l)});
-//# sourceMappingURL=exporting.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
- Exporting module
-
- (c) 2010-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(m){"object"===typeof module&&module.exports?module.exports=m:"function"===typeof define&&define.amd?define(function(){return m}):m("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(m){(function(a){a.ajax=function(f){var b=a.merge(!0,{url:!1,type:"GET",dataType:"json",success:!1,error:!1,data:!1,headers:{}},f);f={json:"application/json",xml:"application/xml",text:"text/plain",octet:"application/octet-stream"};var c=new XMLHttpRequest;if(!b.url)return!1;c.open(b.type.toUpperCase(),
-b.url,!0);c.setRequestHeader("Content-Type",f[b.dataType]||f.text);a.objectEach(b.headers,function(a,f){c.setRequestHeader(f,a)});c.onreadystatechange=function(){var a;if(4===c.readyState){if(200===c.status){a=c.responseText;if("json"===b.dataType)try{a=JSON.parse(a)}catch(v){b.error&&b.error(c,v);return}return b.success&&b.success(a)}b.error&&b.error(c,c.responseText)}};try{b.data=JSON.stringify(b.data)}catch(k){}c.send(b.data||!0)}})(m);(function(a){var f=a.win,b=f.navigator,c=f.document,k=f.URL||
-f.webkitURL||f,v=/Edge\/\d+/.test(b.userAgent);a.dataURLtoBlob=function(a){if((a=a.match(/data:([^;]*)(;base64)?,([0-9A-Za-z+/]+)/))&&3<a.length&&f.atob&&f.ArrayBuffer&&f.Uint8Array&&f.Blob&&k.createObjectURL){for(var c=f.atob(a[3]),b=new f.ArrayBuffer(c.length),b=new f.Uint8Array(b),g=0;g<b.length;++g)b[g]=c.charCodeAt(g);a=new f.Blob([b],{type:a[1]});return k.createObjectURL(a)}};a.downloadURL=function(e,k){var q=c.createElement("a"),g;if("string"===typeof e||e instanceof String||!b.msSaveOrOpenBlob){if(v||
-2E6<e.length)if(e=a.dataURLtoBlob(e),!e)throw"Failed to convert to blob";if(void 0!==q.download)q.href=e,q.download=k,c.body.appendChild(q),q.click(),c.body.removeChild(q);else try{if(g=f.open(e,"chart"),void 0===g||null===g)throw"Failed to open window";}catch(B){f.location.href=e}}else b.msSaveOrOpenBlob(e,k)}})(m);(function(a){function f(a,b){if(k.Blob&&k.navigator.msSaveOrOpenBlob)return new k.Blob(["\ufeff"+a],{type:b})}var b=a.defined,c=a.pick,k=a.win,v=k.document,e=a.seriesTypes,m=a.downloadURL;
-a.setOptions({exporting:{csv:{columnHeaderFormatter:null,dateFormat:"%Y-%m-%d %H:%M:%S",decimalPoint:null,itemDelimiter:null,lineDelimiter:"\n"},showTable:!1,useMultiLevelHeaders:!0,useRowspanHeaders:!0},lang:{downloadCSV:"Download CSV",downloadXLS:"Download XLS",openInCloud:"Open in Highcharts Cloud",viewData:"View data table"}});a.addEvent(a.Chart,"render",function(){this.options&&this.options.exporting&&this.options.exporting.showTable&&this.viewData()});a.Chart.prototype.setUpKeyToAxis=function(){e.arearange&&
-(e.arearange.prototype.keyToAxis={low:"y",high:"y"});e.gantt&&(e.gantt.prototype.keyToAxis={start:"x",end:"x"})};a.Chart.prototype.getDataRows=function(g){var f=this.time,e=this.options.exporting&&this.options.exporting.csv||{},h,l=this.xAxis,t={},k=[],n,m=[],p=[],y,w,u,C=function(d,b,h){if(e.columnHeaderFormatter){var u=e.columnHeaderFormatter(d,b,h);if(!1!==u)return u}return d?d instanceof a.Axis?d.options.title&&d.options.title.text||(d.isDatetimeAxis?"DateTime":"Category"):g?{columnTitle:1<h?
-b:d.name,topLevelColumnTitle:d.name}:d.name+(1<h?" ("+b+")":""):"Category"},z=[];w=0;this.setUpKeyToAxis();this.series.forEach(function(d){var b=d.options.keys||d.pointArrayMap||["y"],h=b.length,u=!d.requireSorting&&{},x={},B={},n=l.indexOf(d.xAxis),k,r;b.forEach(function(a){var b=(d.keyToAxis&&d.keyToAxis[a]||a)+"Axis";x[a]=d[b]&&d[b].categories||[];B[a]=d[b]&&d[b].isDatetimeAxis});if(!1!==d.options.includeInCSVExport&&!d.options.isInternal&&!1!==d.visible){a.find(z,function(d){return d[0]===n})||
-z.push([n,w]);for(r=0;r<h;)y=C(d,b[r],b.length),p.push(y.columnTitle||y),g&&m.push(y.topLevelColumnTitle||y),r++;k={chart:d.chart,autoIncrement:d.autoIncrement,options:d.options,pointArrayMap:d.pointArrayMap};d.options.data.forEach(function(a,g){var l,p;p={series:k};d.pointClass.prototype.applyOptions.apply(p,[a]);a=p.x;l=d.data[g]&&d.data[g].name;u&&(u[a]&&(a+="|"+g),u[a]=!0);r=0;d.xAxis&&"name"!==d.exportKey||(a=l);t[a]||(t[a]=[],t[a].xValues=[]);t[a].x=p.x;t[a].name=l;for(t[a].xValues[n]=p.x;r<
-h;)g=b[r],l=p[g],t[a][w+r]=c(x[g][l],B[g]?f.dateFormat(e.dateFormat,l):null,l),r++});w+=r}});for(n in t)t.hasOwnProperty(n)&&k.push(t[n]);var x,A;n=g?[m,p]:[p];for(w=z.length;w--;)x=z[w][0],A=z[w][1],h=l[x],k.sort(function(a,b){return a.xValues[x]-b.xValues[x]}),u=C(h),n[0].splice(A,0,u),g&&n[1]&&n[1].splice(A,0,u),k.forEach(function(a){var d=a.name;h&&!b(d)&&(h.isDatetimeAxis?(a.x instanceof Date&&(a.x=a.x.getTime()),d=f.dateFormat(e.dateFormat,a.x)):d=h.categories?c(h.names[a.x],h.categories[a.x],
-a.x):a.x);a.splice(A,0,d)});n=n.concat(k);a.fireEvent(this,"exportData",{dataRows:n});return n};a.Chart.prototype.getCSV=function(a){var b="",g=this.getDataRows(),h=this.options.exporting.csv,f=c(h.decimalPoint,","!==h.itemDelimiter&&a?(1.1).toLocaleString()[1]:"."),e=c(h.itemDelimiter,","===f?";":","),k=h.lineDelimiter;g.forEach(function(a,h){for(var c,l=a.length;l--;)c=a[l],"string"===typeof c&&(c='"'+c+'"'),"number"===typeof c&&"."!==f&&(c=c.toString().replace(".",f)),a[l]=c;b+=a.join(e);h<g.length-
-1&&(b+=k)});return b};a.Chart.prototype.getTable=function(a){var b="\x3ctable\x3e",g=this.options,h=a?(1.1).toLocaleString()[1]:".",f=c(g.exporting.useMultiLevelHeaders,!0);a=this.getDataRows(f);var e=0,k=f?a.shift():null,n=a.shift(),m=function(a,b,g,f){var e=c(f,"");b="text"+(b?" "+b:"");"number"===typeof e?(e=e.toString(),","===h&&(e=e.replace(".",h)),b="number"):f||(b="empty");return"\x3c"+a+(g?" "+g:"")+' class\x3d"'+b+'"\x3e'+e+"\x3c/"+a+"\x3e"};!1!==g.exporting.tableCaption&&(b+='\x3ccaption class\x3d"highcharts-table-caption"\x3e'+
-c(g.exporting.tableCaption,g.title.text?g.title.text.replace(/&/g,"\x26amp;").replace(/</g,"\x26lt;").replace(/>/g,"\x26gt;").replace(/"/g,"\x26quot;").replace(/'/g,"\x26#x27;").replace(/\//g,"\x26#x2F;"):"Chart")+"\x3c/caption\x3e");for(var p=0,q=a.length;p<q;++p)a[p].length>e&&(e=a[p].length);b+=function(a,b,e){var h="\x3cthead\x3e",c=0;e=e||b&&b.length;var k,d,l=0;if(d=f&&a&&b){a:if(d=a.length,b.length===d){for(;d--;)if(a[d]!==b[d]){d=!1;break a}d=!0}else d=!1;d=!d}if(d){for(h+="\x3ctr\x3e";c<
-e;++c)d=a[c],k=a[c+1],d===k?++l:l?(h+=m("th","highcharts-table-topheading",'scope\x3d"col" colspan\x3d"'+(l+1)+'"',d),l=0):(d===b[c]?g.exporting.useRowspanHeaders?(k=2,delete b[c]):(k=1,b[c]=""):k=1,h+=m("th","highcharts-table-topheading",'scope\x3d"col"'+(1<k?' valign\x3d"top" rowspan\x3d"'+k+'"':""),d));h+="\x3c/tr\x3e"}if(b){h+="\x3ctr\x3e";c=0;for(e=b.length;c<e;++c)void 0!==b[c]&&(h+=m("th",null,'scope\x3d"col"',b[c]));h+="\x3c/tr\x3e"}return h+"\x3c/thead\x3e"}(k,n,Math.max(e,n.length));b+=
-"\x3ctbody\x3e";a.forEach(function(a){b+="\x3ctr\x3e";for(var c=0;c<e;c++)b+=m(c?"td":"th",null,c?"":'scope\x3d"row"',a[c]);b+="\x3c/tr\x3e"});return b+="\x3c/tbody\x3e\x3c/table\x3e"};a.Chart.prototype.downloadCSV=function(){var a=this.getCSV(!0);m(f(a,"text/csv")||"data:text/csv,\ufeff"+encodeURIComponent(a),this.getFilename()+".csv")};a.Chart.prototype.downloadXLS=function(){var a='\x3chtml xmlns:o\x3d"urn:schemas-microsoft-com:office:office" xmlns:x\x3d"urn:schemas-microsoft-com:office:excel" xmlns\x3d"http://www.w3.org/TR/REC-html40"\x3e\x3chead\x3e\x3c!--[if gte mso 9]\x3e\x3cxml\x3e\x3cx:ExcelWorkbook\x3e\x3cx:ExcelWorksheets\x3e\x3cx:ExcelWorksheet\x3e\x3cx:Name\x3eArk1\x3c/x:Name\x3e\x3cx:WorksheetOptions\x3e\x3cx:DisplayGridlines/\x3e\x3c/x:WorksheetOptions\x3e\x3c/x:ExcelWorksheet\x3e\x3c/x:ExcelWorksheets\x3e\x3c/x:ExcelWorkbook\x3e\x3c/xml\x3e\x3c![endif]--\x3e\x3cstyle\x3etd{border:none;font-family: Calibri, sans-serif;} .number{mso-number-format:"0.00";} .text{ mso-number-format:"@";}\x3c/style\x3e\x3cmeta name\x3dProgId content\x3dExcel.Sheet\x3e\x3cmeta charset\x3dUTF-8\x3e\x3c/head\x3e\x3cbody\x3e'+
-this.getTable(!0)+"\x3c/body\x3e\x3c/html\x3e";m(f(a,"application/vnd.ms-excel")||"data:application/vnd.ms-excel;base64,"+k.btoa(unescape(encodeURIComponent(a))),this.getFilename()+".xls")};a.Chart.prototype.viewData=function(){this.dataTableDiv||(this.dataTableDiv=v.createElement("div"),this.dataTableDiv.className="highcharts-data-table",this.renderTo.parentNode.insertBefore(this.dataTableDiv,this.renderTo.nextSibling));this.dataTableDiv.innerHTML=this.getTable()};a.Chart.prototype.openInCloud=function(){function b(c){Object.keys(c).forEach(function(e){"function"===
-typeof c[e]&&delete c[e];a.isObject(c[e])&&b(c[e])})}var c,e;c=a.merge(this.userOptions);b(c);c={name:c.title&&c.title.text||"Chart title",options:c,settings:{constructor:"Chart",dataProvider:{csv:this.getCSV()}}};e=JSON.stringify(c);(function(){var a=v.createElement("form");v.body.appendChild(a);a.method="post";a.action="https://cloud-api.highcharts.com/openincloud";a.target="_blank";var b=v.createElement("input");b.type="hidden";b.name="chart";b.value=e;a.appendChild(b);a.submit();v.body.removeChild(a)})()};
-var q=a.getOptions().exporting;q&&(a.extend(q.menuItemDefinitions,{downloadCSV:{textKey:"downloadCSV",onclick:function(){this.downloadCSV()}},downloadXLS:{textKey:"downloadXLS",onclick:function(){this.downloadXLS()}},viewData:{textKey:"viewData",onclick:function(){this.viewData()}},openInCloud:{textKey:"openInCloud",onclick:function(){this.openInCloud()}}}),q.buttons.contextButton.menuItems.push("separator","downloadCSV","downloadXLS","viewData","openInCloud"));e.map&&(e.map.prototype.exportKey="name");
-e.mapbubble&&(e.mapbubble.prototype.exportKey="name");e.treemap&&(e.treemap.prototype.exportKey="name")})(m)});
-//# sourceMappingURL=export-data.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
- Highcharts funnel module
-
- (c) 2010-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(a){(function(a){var p=a.seriesType,D=a.seriesTypes,H=a.noop,E=a.pick;p("funnel","pie",{animation:!1,center:["50%","50%"],width:"90%",neckWidth:"30%",height:"100%",neckHeight:"25%",reversed:!1,size:!0,dataLabels:{connectorWidth:1},states:{select:{color:"#cccccc",borderColor:"#000000"}}},{animate:H,
-translate:function(){var d=function(b,a){return/%$/.test(b)?a*parseInt(b,10)/100:parseInt(b,10)},a=0,f=this.chart,e=this.options,c=e.reversed,v=e.ignoreHiddenPoint,t=f.plotWidth,f=f.plotHeight,q=0,p=e.center,g=d(p[0],t),r=d(p[1],f),D=d(e.width,t),k,w,l=d(e.height,f),x=d(e.neckWidth,t),F=d(e.neckHeight,f),y=r-l/2+l-F,d=this.data,A,B,E="left"===e.dataLabels.position?1:0,C,m,G,u,h,z,n;this.getWidthAt=w=function(b){var a=r-l/2;return b>y||l===F?x:x+(D-x)*(1-(b-a)/(l-F))};this.getX=function(b,a,d){return g+
-(a?-1:1)*(w(c?2*r-b:b)/2+d.labelDistance)};this.center=[g,r,l];this.centerX=g;d.forEach(function(b){v&&!1===b.visible||(a+=b.y)});d.forEach(function(b){n=null;B=a?b.y/a:0;m=r-l/2+q*l;h=m+B*l;k=w(m);C=g-k/2;G=C+k;k=w(h);u=g-k/2;z=u+k;m>y?(C=u=g-x/2,G=z=g+x/2):h>y&&(n=h,k=w(y),u=g-k/2,z=u+k,h=y);c&&(m=2*r-m,h=2*r-h,null!==n&&(n=2*r-n));A=["M",C,m,"L",G,m,z,h];null!==n&&A.push(z,n,u,n);A.push(u,h,"Z");b.shapeType="path";b.shapeArgs={d:A};b.percentage=100*B;b.plotX=g;b.plotY=(m+(n||h))/2;b.tooltipPos=
-[g,b.plotY];b.slice=H;b.half=E;v&&!1===b.visible||(q+=B)})},sortByAngle:function(a){a.sort(function(a,d){return a.plotY-d.plotY})},drawDataLabels:function(){var a=this.data,p=this.options.dataLabels.distance,f,e,c,v=a.length,t,q;for(this.center[2]-=2*p;v--;)c=a[v],e=(f=c.half)?1:-1,q=c.plotY,c.labelDistance=E(c.options.dataLabels&&c.options.dataLabels.distance,p),this.maxLabelDistance=Math.max(c.labelDistance,this.maxLabelDistance||0),t=this.getX(q,f,c),c.labelPosition={natural:{x:0,y:q},"final":{},
-alignment:f?"right":"left",connectorPosition:{breakAt:{x:t+(c.labelDistance-5)*e,y:q},touchingSliceAt:{x:t+c.labelDistance*e,y:q}}};D.pie.prototype.drawDataLabels.call(this)}});p("pyramid","funnel",{neckWidth:"0%",neckHeight:"0%",reversed:!0})})(a)});
-//# sourceMappingURL=funnel.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
-
- (c) 2009-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(m){"object"===typeof module&&module.exports?module.exports=m:"function"===typeof define&&define.amd?define(function(){return m}):m("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(m){(function(b){var r=b.addEvent,f=b.Axis,m=b.Chart,l=b.color,p,q=b.extend,n=b.isNumber,c=b.Legend,g=b.LegendSymbolMixin,w=b.noop,v=b.merge,u=b.pick;b.ColorAxis||(p=b.ColorAxis=function(){this.init.apply(this,arguments)},q(p.prototype,f.prototype),q(p.prototype,{defaultColorAxisOptions:{lineWidth:0,
-minPadding:0,maxPadding:0,gridLineWidth:1,tickPixelInterval:72,startOnTick:!0,endOnTick:!0,offset:0,marker:{animation:{duration:50},width:.01,color:"#999999"},labels:{overflow:"justify",rotation:0},minColor:"#e6ebf5",maxColor:"#003399",tickLength:5,showInLegend:!0},keepProps:["legendGroup","legendItemHeight","legendItemWidth","legendItem","legendSymbol"].concat(f.prototype.keepProps),init:function(a,d){var e="vertical"!==a.options.legend.layout,h;this.coll="colorAxis";h=v(this.defaultColorAxisOptions,
-{side:e?2:1,reversed:!e},d,{opposite:!e,showEmpty:!1,title:null,visible:a.options.legend.enabled});f.prototype.init.call(this,a,h);d.dataClasses&&this.initDataClasses(d);this.initStops();this.horiz=e;this.zoomEnabled=!1;this.defaultLegendLength=200},initDataClasses:function(a){var d=this.chart,e,h=0,k=d.options.chart.colorCount,b=this.options,c=a.dataClasses.length;this.dataClasses=e=[];this.legendItems=[];a.dataClasses.forEach(function(a,g){a=v(a);e.push(a);if(d.styledMode||!a.color)"category"===
-b.dataClassColor?(d.styledMode||(g=d.options.colors,k=g.length,a.color=g[h]),a.colorIndex=h,h++,h===k&&(h=0)):a.color=l(b.minColor).tweenTo(l(b.maxColor),2>c?.5:g/(c-1))})},setTickPositions:function(){if(!this.dataClasses)return f.prototype.setTickPositions.call(this)},initStops:function(){this.stops=this.options.stops||[[0,this.options.minColor],[1,this.options.maxColor]];this.stops.forEach(function(a){a.color=l(a[1])})},setOptions:function(a){f.prototype.setOptions.call(this,a);this.options.crosshair=
-this.options.marker},setAxisSize:function(){var a=this.legendSymbol,d=this.chart,e=d.options.legend||{},h,k;a?(this.left=e=a.attr("x"),this.top=h=a.attr("y"),this.width=k=a.attr("width"),this.height=a=a.attr("height"),this.right=d.chartWidth-e-k,this.bottom=d.chartHeight-h-a,this.len=this.horiz?k:a,this.pos=this.horiz?e:h):this.len=(this.horiz?e.symbolWidth:e.symbolHeight)||this.defaultLegendLength},normalizedValue:function(a){this.isLog&&(a=this.val2lin(a));return 1-(this.max-a)/(this.max-this.min||
-1)},toColor:function(a,d){var e=this.stops,h,k,b=this.dataClasses,g,c;if(b)for(c=b.length;c--;){if(g=b[c],h=g.from,e=g.to,(void 0===h||a>=h)&&(void 0===e||a<=e)){k=g.color;d&&(d.dataClass=c,d.colorIndex=g.colorIndex);break}}else{a=this.normalizedValue(a);for(c=e.length;c--&&!(a>e[c][0]););h=e[c]||e[c+1];e=e[c+1]||h;a=1-(e[0]-a)/(e[0]-h[0]||1);k=h.color.tweenTo(e.color,a)}return k},getOffset:function(){var a=this.legendGroup,d=this.chart.axisOffset[this.side];a&&(this.axisParent=a,f.prototype.getOffset.call(this),
-this.added||(this.added=!0,this.labelLeft=0,this.labelRight=this.width),this.chart.axisOffset[this.side]=d)},setLegendColor:function(){var a,d=this.reversed;a=d?1:0;d=d?0:1;a=this.horiz?[a,0,d,0]:[0,d,0,a];this.legendColor={linearGradient:{x1:a[0],y1:a[1],x2:a[2],y2:a[3]},stops:this.stops}},drawLegendSymbol:function(a,d){var e=a.padding,c=a.options,k=this.horiz,b=u(c.symbolWidth,k?this.defaultLegendLength:12),g=u(c.symbolHeight,k?12:this.defaultLegendLength),l=u(c.labelPadding,k?16:30),c=u(c.itemDistance,
-10);this.setLegendColor();d.legendSymbol=this.chart.renderer.rect(0,a.baseline-11,b,g).attr({zIndex:1}).add(d.legendGroup);this.legendItemWidth=b+e+(k?c:l);this.legendItemHeight=g+e+(k?l:0)},setState:function(a){this.series.forEach(function(d){d.setState(a)})},visible:!0,setVisible:w,getSeriesExtremes:function(){var a=this.series,d=a.length;this.dataMin=Infinity;for(this.dataMax=-Infinity;d--;)a[d].getExtremes(),void 0!==a[d].valueMin&&(this.dataMin=Math.min(this.dataMin,a[d].valueMin),this.dataMax=
-Math.max(this.dataMax,a[d].valueMax))},drawCrosshair:function(a,d){var e=d&&d.plotX,c=d&&d.plotY,b,g=this.pos,l=this.len;d&&(b=this.toPixels(d[d.series.colorKey]),b<g?b=g-2:b>g+l&&(b=g+l+2),d.plotX=b,d.plotY=this.len-b,f.prototype.drawCrosshair.call(this,a,d),d.plotX=e,d.plotY=c,this.cross&&!this.cross.addedToColorAxis&&this.legendGroup&&(this.cross.addClass("highcharts-coloraxis-marker").add(this.legendGroup),this.cross.addedToColorAxis=!0,this.chart.styledMode||this.cross.attr({fill:this.crosshair.color})))},
-getPlotLinePath:function(a,d,e,c,b){return n(b)?this.horiz?["M",b-4,this.top-6,"L",b+4,this.top-6,b,this.top,"Z"]:["M",this.left,b,"L",this.left-6,b+6,this.left-6,b-6,"Z"]:f.prototype.getPlotLinePath.call(this,a,d,e,c)},update:function(a,d){var e=this.chart,b=e.legend;this.series.forEach(function(a){a.isDirtyData=!0});a.dataClasses&&b.allItems&&(b.allItems.forEach(function(a){a.isDataClass&&a.legendGroup&&a.legendGroup.destroy()}),e.isDirtyLegend=!0);e.options[this.coll]=v(this.userOptions,a);f.prototype.update.call(this,
-a,d);this.legendItem&&(this.setLegendColor(),b.colorizeItem(this,!0))},remove:function(){this.legendItem&&this.chart.legend.destroyItem(this);f.prototype.remove.call(this)},getDataClassLegendSymbols:function(){var a=this,d=this.chart,e=this.legendItems,c=d.options.legend,l=c.valueDecimals,p=c.valueSuffix||"",f;e.length||this.dataClasses.forEach(function(c,h){var k=!0,n=c.from,m=c.to;f="";void 0===n?f="\x3c ":void 0===m&&(f="\x3e ");void 0!==n&&(f+=b.numberFormat(n,l)+p);void 0!==n&&void 0!==m&&(f+=
-" - ");void 0!==m&&(f+=b.numberFormat(m,l)+p);e.push(q({chart:d,name:f,options:{},drawLegendSymbol:g.drawRectangle,visible:!0,setState:w,isDataClass:!0,setVisible:function(){k=this.visible=!k;a.series.forEach(function(a){a.points.forEach(function(a){a.dataClass===h&&a.setVisible(k)})});d.legend.colorizeItem(this,k)}},c))});return e},name:""}),["fill","stroke"].forEach(function(a){b.Fx.prototype[a+"Setter"]=function(){this.elem.attr(a,l(this.start).tweenTo(l(this.end),this.pos),null,!0)}}),r(m,"afterGetAxes",
-function(){var a=this.options.colorAxis;this.colorAxis=[];a&&new p(this,a)}),r(c,"afterGetAllItems",function(a){var d=[],c=this.chart.colorAxis[0];c&&c.options&&c.options.showInLegend&&(c.options.dataClasses?d=c.getDataClassLegendSymbols():d.push(c),c.series.forEach(function(c){b.erase(a.allItems,c)}));for(c=d.length;c--;)a.allItems.unshift(d[c])}),r(c,"afterColorizeItem",function(a){a.visible&&a.item.legendColor&&a.item.legendSymbol.attr({fill:a.item.legendColor})}),r(c,"afterUpdate",function(a,
-c,b){this.chart.colorAxis[0]&&this.chart.colorAxis[0].update({},b)}))})(m);(function(b){var m=b.defined,f=b.noop,t=b.seriesTypes;b.colorPointMixin={isValid:function(){return null!==this.value&&Infinity!==this.value&&-Infinity!==this.value},setVisible:function(b){var l=this,f=b?"show":"hide";l.visible=!!b;["graphic","dataLabel"].forEach(function(b){if(l[b])l[b][f]()})},setState:function(l){b.Point.prototype.setState.call(this,l);this.graphic&&this.graphic.attr({zIndex:"hover"===l?1:0})}};b.colorSeriesMixin=
-{pointArrayMap:["value"],axisTypes:["xAxis","yAxis","colorAxis"],optionalAxis:"colorAxis",trackerGroups:["group","markerGroup","dataLabelsGroup"],getSymbol:f,parallelArrays:["x","y","value"],colorKey:"value",pointAttribs:t.column.prototype.pointAttribs,translateColors:function(){var b=this,f=this.options.nullColor,m=this.colorAxis,n=this.colorKey;this.data.forEach(function(c){var g=c[n];if(g=c.options.color||(c.isNull?f:m&&void 0!==g?m.toColor(g,c):c.color||b.color))c.color=g})},colorAttribs:function(b){var f=
-{};m(b.color)&&(f[this.colorProp||"fill"]=b.color);return f}}})(m);(function(b){var m=b.colorPointMixin,f=b.merge,t=b.noop,l=b.pick,p=b.Series,q=b.seriesType,n=b.seriesTypes;q("heatmap","scatter",{animation:!1,borderWidth:0,nullColor:"#f7f7f7",dataLabels:{formatter:function(){return this.point.value},inside:!0,verticalAlign:"middle",crop:!1,overflow:!1,padding:0},marker:null,pointRange:null,tooltip:{pointFormat:"{point.x}, {point.y}: {point.value}\x3cbr/\x3e"},states:{hover:{halo:!1,brightness:.2}}},
-f(b.colorSeriesMixin,{pointArrayMap:["y","value"],hasPointSpecificOptions:!0,getExtremesFromAll:!0,directTouch:!0,init:function(){var b;n.scatter.prototype.init.apply(this,arguments);b=this.options;b.pointRange=l(b.pointRange,b.colsize||1);this.yAxis.axisPointRange=b.rowsize||1},translate:function(){var b=this.options,g=this.xAxis,f=this.yAxis,m=b.pointPadding||0,n=function(a,b,c){return Math.min(Math.max(b,a),c)};this.generatePoints();this.points.forEach(function(a){var c=(b.colsize||1)/2,e=(b.rowsize||
-1)/2,h=n(Math.round(g.len-g.translate(a.x-c,0,1,0,1)),-g.len,2*g.len),c=n(Math.round(g.len-g.translate(a.x+c,0,1,0,1)),-g.len,2*g.len),k=n(Math.round(f.translate(a.y-e,0,1,0,1)),-f.len,2*f.len),e=n(Math.round(f.translate(a.y+e,0,1,0,1)),-f.len,2*f.len),p=l(a.pointPadding,m);a.plotX=a.clientX=(h+c)/2;a.plotY=(k+e)/2;a.shapeType="rect";a.shapeArgs={x:Math.min(h,c)+p,y:Math.min(k,e)+p,width:Math.abs(c-h)-2*p,height:Math.abs(e-k)-2*p}});this.translateColors()},drawPoints:function(){var b=this.chart.styledMode?
-"css":"attr";n.column.prototype.drawPoints.call(this);this.points.forEach(function(c){c.graphic[b](this.colorAttribs(c))},this)},animate:t,getBox:t,drawLegendSymbol:b.LegendSymbolMixin.drawRectangle,alignDataLabel:n.column.prototype.alignDataLabel,getExtremes:function(){p.prototype.getExtremes.call(this,this.valueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;p.prototype.getExtremes.call(this)}}),b.extend({haloPath:function(b){if(!b)return[];var c=this.shapeArgs;return["M",c.x-b,c.y-
-b,"L",c.x-b,c.y+c.height+b,c.x+c.width+b,c.y+c.height+b,c.x+c.width+b,c.y-b,"Z"]}},m))})(m)});
-//# sourceMappingURL=heatmap.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
-
- (c) 2014-2018 Highsoft AS
- Authors: Jon Arild Nygard / Oystein Moseng
-
- License: www.highcharts.com/license
-*/
-(function(p){"object"===typeof module&&module.exports?module.exports=p:"function"===typeof define&&define.amd?define(function(){return p}):p("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(p){var C=function(b){var y=b.extend,p=b.isArray,g=b.isObject,u=b.isNumber,B=b.merge,z=b.pick;return{getColor:function(q,l){var v=l.index,m=l.mapOptionsToLevel,g=l.parentColor,w=l.parentColorIndex,n=l.series,e=l.colors,y=l.siblings,h=n.points,u=n.chart.options.chart,A,p,a,c;if(q){h=h[q.i];q=m[q.level]||
-{};if(m=h&&q.colorByPoint)p=h.index%(e?e.length:u.colorCount),A=e&&e[p];if(!n.chart.styledMode){e=h&&h.options.color;u=q&&q.color;if(a=g)a=(a=q&&q.colorVariation)&&"brightness"===a.key?b.color(g).brighten(v/y*a.to).get():g;a=z(e,u,A,a,n.color)}c=z(h&&h.options.colorIndex,q&&q.colorIndex,p,w,l.colorIndex)}return{color:a,colorIndex:c}},getLevelOptions:function(b){var l=null,v,m,q,w;if(g(b))for(l={},q=u(b.from)?b.from:1,w=b.levels,m={},v=g(b.defaults)?b.defaults:{},p(w)&&(m=w.reduce(function(b,e){var l,
-h;g(e)&&u(e.level)&&(h=B({},e),l="boolean"===typeof h.levelIsConstant?h.levelIsConstant:v.levelIsConstant,delete h.levelIsConstant,delete h.level,e=e.level+(l?0:q-1),g(b[e])?y(b[e],h):b[e]=h);return b},{})),w=u(b.to)?b.to:1,b=0;b<=w;b++)l[b]=B({},v,g(m[b])?m[b]:{});return l},setTreeValues:function l(b,m){var g=m.before,v=m.idRoot,n=m.mapIdToNode[v],e=m.points[b.i],u=e&&e.options||{},h=0,p=[];y(b,{levelDynamic:b.level-(("boolean"===typeof m.levelIsConstant?m.levelIsConstant:1)?0:n.level),name:z(e&&
-e.name,""),visible:v===b.id||("boolean"===typeof m.visible?m.visible:!1)});"function"===typeof g&&(b=g(b,m));b.children.forEach(function(e,g){var a=y({},m);y(a,{index:g,siblings:b.children.length,visible:b.visible});e=l(e,a);p.push(e);e.visible&&(h+=e.val)});b.visible=0<h||b.visible;g=z(u.value,h);y(b,{children:p,childrenTotal:h,isLeaf:b.visible&&!h,val:g});return b},updateRootId:function(b){var l;g(b)&&(l=g(b.options)?b.options:{},l=z(b.rootNode,l.rootId,""),g(b.userOptions)&&(b.userOptions.rootId=
-l),b.rootNode=l);return l}}}(p);(function(b,p){var y=b.seriesType,g=b.seriesTypes,u=b.merge,B=b.extend,z=b.noop,q=p.getColor,l=p.getLevelOptions,v=b.isArray,m=b.isNumber,C=b.isObject,w=b.isString,n=b.pick,e=b.Series,E=b.stableSort,h=b.Color,F=function(a,c,d){d=d||this;b.objectEach(a,function(b,f){c.call(d,b,f,a)})},A=function(a,c,d){d=d||this;a=c.call(d,a);!1!==a&&A(a,c,d)},G=p.updateRootId;y("treemap","scatter",{showInLegend:!1,marker:!1,colorByPoint:!1,dataLabels:{enabled:!0,defer:!1,verticalAlign:"middle",
-formatter:function(){var a=this&&this.point?this.point:{};return w(a.name)?a.name:""},inside:!0},tooltip:{headerFormat:"",pointFormat:"\x3cb\x3e{point.name}\x3c/b\x3e: {point.value}\x3cbr/\x3e"},ignoreHiddenPoint:!0,layoutAlgorithm:"sliceAndDice",layoutStartingDirection:"vertical",alternateStartingDirection:!1,levelIsConstant:!0,drillUpButton:{position:{align:"right",x:-10,y:10}},borderColor:"#e6e6e6",borderWidth:1,opacity:.15,states:{hover:{borderColor:"#999999",brightness:g.heatmap?0:.1,halo:!1,
-opacity:.75,shadow:!1}}},{pointArrayMap:["value"],directTouch:!0,optionalAxis:"colorAxis",getSymbol:z,parallelArrays:["x","y","value","colorValue"],colorKey:"colorValue",trackerGroups:["group","dataLabelsGroup"],getListOfParents:function(a,c){a=v(a)?a:[];var d=v(c)?c:[];c=a.reduce(function(a,c,d){c=n(c.parent,"");void 0===a[c]&&(a[c]=[]);a[c].push(d);return a},{"":[]});F(c,function(a,c,b){""!==c&&-1===d.indexOf(c)&&(a.forEach(function(a){b[""].push(a)}),delete b[c])});return c},getTree:function(){var a=
-this.data.map(function(a){return a.id}),a=this.getListOfParents(this.data,a);this.nodeMap=[];return this.buildNode("",-1,0,a,null)},init:function(a,c){var d=b.colorSeriesMixin;b.colorSeriesMixin&&(this.translateColors=d.translateColors,this.colorAttribs=d.colorAttribs,this.axisTypes=d.axisTypes);e.prototype.init.call(this,a,c);this.options.allowDrillToNode&&b.addEvent(this,"click",this.onClickDrillToNode)},buildNode:function(a,c,d,b,f){var t=this,x=[],k=t.points[c],D=0,e;(b[a]||[]).forEach(function(c){e=
-t.buildNode(t.points[c].id,c,d+1,b,a);D=Math.max(e.height+1,D);x.push(e)});c={id:a,i:c,children:x,height:D,level:d,parent:f,visible:!1};t.nodeMap[c.id]=c;k&&(k.node=c);return c},setTreeValues:function(a){var c=this,d=c.options,b=c.nodeMap[c.rootNode],d="boolean"===typeof d.levelIsConstant?d.levelIsConstant:!0,f=0,r=[],x,k=c.points[a.i];a.children.forEach(function(a){a=c.setTreeValues(a);r.push(a);a.ignore||(f+=a.val)});E(r,function(a,c){return a.sortIndex-c.sortIndex});x=n(k&&k.options.value,f);k&&
-(k.value=x);B(a,{children:r,childrenTotal:f,ignore:!(n(k&&k.visible,!0)&&0<x),isLeaf:a.visible&&!f,levelDynamic:a.level-(d?0:b.level),name:n(k&&k.name,""),sortIndex:n(k&&k.sortIndex,-x),val:x});return a},calculateChildrenAreas:function(a,c){var d=this,b=d.options,f=d.mapOptionsToLevel[a.level+1],r=n(d[f&&f.layoutAlgorithm]&&f.layoutAlgorithm,b.layoutAlgorithm),x=b.alternateStartingDirection,k=[];a=a.children.filter(function(a){return!a.ignore});f&&f.layoutStartingDirection&&(c.direction="vertical"===
-f.layoutStartingDirection?0:1);k=d[r](c,a);a.forEach(function(a,b){b=k[b];a.values=u(b,{val:a.childrenTotal,direction:x?1-c.direction:c.direction});a.pointValues=u(b,{x:b.x/d.axisRatio,width:b.width/d.axisRatio});a.children.length&&d.calculateChildrenAreas(a,a.values)})},setPointValues:function(){var a=this,c=a.xAxis,d=a.yAxis;a.points.forEach(function(b){var f=b.node,r=f.pointValues,t,k,e=0;a.chart.styledMode||(e=(a.pointAttribs(b)["stroke-width"]||0)%2/2);r&&f.visible?(f=Math.round(c.translate(r.x,
-0,0,0,1))-e,t=Math.round(c.translate(r.x+r.width,0,0,0,1))-e,k=Math.round(d.translate(r.y,0,0,0,1))-e,r=Math.round(d.translate(r.y+r.height,0,0,0,1))-e,b.shapeType="rect",b.shapeArgs={x:Math.min(f,t),y:Math.min(k,r),width:Math.abs(t-f),height:Math.abs(r-k)},b.plotX=b.shapeArgs.x+b.shapeArgs.width/2,b.plotY=b.shapeArgs.y+b.shapeArgs.height/2):(delete b.plotX,delete b.plotY)})},setColorRecursive:function(a,c,d,b,f){var r=this,t=r&&r.chart,t=t&&t.options&&t.options.colors,k;if(a){k=q(a,{colors:t,index:b,
-mapOptionsToLevel:r.mapOptionsToLevel,parentColor:c,parentColorIndex:d,series:r,siblings:f});if(c=r.points[a.i])c.color=k.color,c.colorIndex=k.colorIndex;(a.children||[]).forEach(function(c,d){r.setColorRecursive(c,k.color,k.colorIndex,d,a.children.length)})}},algorithmGroup:function(a,c,d,b){this.height=a;this.width=c;this.plot=b;this.startDirection=this.direction=d;this.lH=this.nH=this.lW=this.nW=this.total=0;this.elArr=[];this.lP={total:0,lH:0,nH:0,lW:0,nW:0,nR:0,lR:0,aspectRatio:function(a,c){return Math.max(a/
-c,c/a)}};this.addElement=function(a){this.lP.total=this.elArr[this.elArr.length-1];this.total+=a;0===this.direction?(this.lW=this.nW,this.lP.lH=this.lP.total/this.lW,this.lP.lR=this.lP.aspectRatio(this.lW,this.lP.lH),this.nW=this.total/this.height,this.lP.nH=this.lP.total/this.nW,this.lP.nR=this.lP.aspectRatio(this.nW,this.lP.nH)):(this.lH=this.nH,this.lP.lW=this.lP.total/this.lH,this.lP.lR=this.lP.aspectRatio(this.lP.lW,this.lH),this.nH=this.total/this.width,this.lP.nW=this.lP.total/this.nH,this.lP.nR=
-this.lP.aspectRatio(this.lP.nW,this.nH));this.elArr.push(a)};this.reset=function(){this.lW=this.nW=0;this.elArr=[];this.total=0}},algorithmCalcPoints:function(a,c,d,b){var f,t,e,k,l=d.lW,h=d.lH,g=d.plot,m,p=0,n=d.elArr.length-1;c?(l=d.nW,h=d.nH):m=d.elArr[d.elArr.length-1];d.elArr.forEach(function(a){if(c||p<n)0===d.direction?(f=g.x,t=g.y,e=l,k=a/e):(f=g.x,t=g.y,k=h,e=a/k),b.push({x:f,y:t,width:e,height:k}),0===d.direction?g.y+=k:g.x+=e;p+=1});d.reset();0===d.direction?d.width-=l:d.height-=h;g.y=
-g.parent.y+(g.parent.height-d.height);g.x=g.parent.x+(g.parent.width-d.width);a&&(d.direction=1-d.direction);c||d.addElement(m)},algorithmLowAspectRatio:function(a,c,d){var b=[],f=this,e,g={x:c.x,y:c.y,parent:c},k=0,l=d.length-1,h=new this.algorithmGroup(c.height,c.width,c.direction,g);d.forEach(function(d){e=d.val/c.val*c.height*c.width;h.addElement(e);h.lP.nR>h.lP.lR&&f.algorithmCalcPoints(a,!1,h,b,g);k===l&&f.algorithmCalcPoints(a,!0,h,b,g);k+=1});return b},algorithmFill:function(a,c,d){var b=
-[],f,e=c.direction,g=c.x,k=c.y,h=c.width,l=c.height,m,p,n,q;d.forEach(function(d){f=d.val/c.val*c.height*c.width;m=g;p=k;0===e?(q=l,n=f/q,h-=n,g+=n):(n=h,q=f/n,l-=q,k+=q);b.push({x:m,y:p,width:n,height:q});a&&(e=1-e)});return b},strip:function(a,c){return this.algorithmLowAspectRatio(!1,a,c)},squarified:function(a,c){return this.algorithmLowAspectRatio(!0,a,c)},sliceAndDice:function(a,c){return this.algorithmFill(!0,a,c)},stripes:function(a,c){return this.algorithmFill(!1,a,c)},translate:function(){var a=
-this,c=a.options,d=G(a),b,f;e.prototype.translate.call(a);f=a.tree=a.getTree();b=a.nodeMap[d];a.mapOptionsToLevel=l({from:b.level+1,levels:c.levels,to:f.height,defaults:{levelIsConstant:a.options.levelIsConstant,colorByPoint:c.colorByPoint}});""===d||b&&b.children.length||(a.drillToNode("",!1),d=a.rootNode,b=a.nodeMap[d]);A(a.nodeMap[a.rootNode],function(c){var b=!1,d=c.parent;c.visible=!0;if(d||""===d)b=a.nodeMap[d];return b});A(a.nodeMap[a.rootNode].children,function(a){var c=!1;a.forEach(function(a){a.visible=
-!0;a.children.length&&(c=(c||[]).concat(a.children))});return c});a.setTreeValues(f);a.axisRatio=a.xAxis.len/a.yAxis.len;a.nodeMap[""].pointValues=d={x:0,y:0,width:100,height:100};a.nodeMap[""].values=d=u(d,{width:d.width*a.axisRatio,direction:"vertical"===c.layoutStartingDirection?0:1,val:f.val});a.calculateChildrenAreas(f,d);a.colorAxis?a.translateColors():c.colorByPoint||a.setColorRecursive(a.tree);c.allowDrillToNode&&(c=b.pointValues,a.xAxis.setExtremes(c.x,c.x+c.width,!1),a.yAxis.setExtremes(c.y,
-c.y+c.height,!1),a.xAxis.setScale(),a.yAxis.setScale());a.setPointValues()},drawDataLabels:function(){var a=this,c=a.mapOptionsToLevel,d,b;a.points.filter(function(a){return a.node.visible}).forEach(function(f){b=c[f.node.level];d={style:{}};f.node.isLeaf||(d.enabled=!1);b&&b.dataLabels&&(d=u(d,b.dataLabels),a._hasPointLabels=!0);f.shapeArgs&&(d.style.width=f.shapeArgs.width,f.dataLabel&&f.dataLabel.css({width:f.shapeArgs.width+"px"}));f.dlOptions=u(d,f.options.dataLabels)});e.prototype.drawDataLabels.call(this)},
-alignDataLabel:function(a){g.column.prototype.alignDataLabel.apply(this,arguments);a.dataLabel&&a.dataLabel.attr({zIndex:(a.node.zIndex||0)+1})},pointAttribs:function(a,c){var b=C(this.mapOptionsToLevel)?this.mapOptionsToLevel:{},e=a&&b[a.node.level]||{},b=this.options,f=c&&b.states[c]||{},g=a&&a.getClassName()||"";a={stroke:a&&a.borderColor||e.borderColor||f.borderColor||b.borderColor,"stroke-width":n(a&&a.borderWidth,e.borderWidth,f.borderWidth,b.borderWidth),dashstyle:a&&a.borderDashStyle||e.borderDashStyle||
-f.borderDashStyle||b.borderDashStyle,fill:a&&a.color||this.color};-1!==g.indexOf("highcharts-above-level")?(a.fill="none",a["stroke-width"]=0):-1!==g.indexOf("highcharts-internal-node-interactive")?(c=n(f.opacity,b.opacity),a.fill=h(a.fill).setOpacity(c).get(),a.cursor="pointer"):-1!==g.indexOf("highcharts-internal-node")?a.fill="none":c&&(a.fill=h(a.fill).brighten(f.brightness).get());return a},drawPoints:function(){var a=this,c=a.points.filter(function(a){return a.node.visible});c.forEach(function(c){var b=
-"level-group-"+c.node.levelDynamic;a[b]||(a[b]=a.chart.renderer.g(b).attr({zIndex:1E3-c.node.levelDynamic}).add(a.group));c.group=a[b]});g.column.prototype.drawPoints.call(this);this.colorAttribs&&a.chart.styledMode&&this.points.forEach(function(a){a.graphic&&a.graphic.css(this.colorAttribs(a))},this);a.options.allowDrillToNode&&c.forEach(function(c){c.graphic&&(c.drillId=a.options.interactByLeaf?a.drillToByLeaf(c):a.drillToByGroup(c))})},onClickDrillToNode:function(a){var c=(a=a.point)&&a.drillId;
-w(c)&&(a.setState(""),this.drillToNode(c))},drillToByGroup:function(a){var c=!1;1!==a.node.level-this.nodeMap[this.rootNode].level||a.node.isLeaf||(c=a.id);return c},drillToByLeaf:function(a){var c=!1;if(a.node.parent!==this.rootNode&&a.node.isLeaf)for(a=a.node;!c;)a=this.nodeMap[a.parent],a.parent===this.rootNode&&(c=a.id);return c},drillUp:function(){var a=this.nodeMap[this.rootNode];a&&w(a.parent)&&this.drillToNode(a.parent)},drillToNode:function(a,c){var b=this.nodeMap[a];this.idPreviousRoot=
-this.rootNode;this.rootNode=a;""===a?this.drillUpButton=this.drillUpButton.destroy():this.showDrillUpButton(b&&b.name||a);this.isDirty=!0;n(c,!0)&&this.chart.redraw()},showDrillUpButton:function(a){var c=this;a=a||"\x3c Back";var b=c.options.drillUpButton,e,f;b.text&&(a=b.text);this.drillUpButton?(this.drillUpButton.placed=!1,this.drillUpButton.attr({text:a}).align()):(f=(e=b.theme)&&e.states,this.drillUpButton=this.chart.renderer.button(a,null,null,function(){c.drillUp()},e,f&&f.hover,f&&f.select).addClass("highcharts-drillup-button").attr({align:b.position.align,
-zIndex:7}).add().align(b.position,!1,b.relativeTo||"plotBox"))},buildKDTree:z,drawLegendSymbol:b.LegendSymbolMixin.drawRectangle,getExtremes:function(){e.prototype.getExtremes.call(this,this.colorValueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;e.prototype.getExtremes.call(this)},getExtremesFromAll:!0,bindAxes:function(){var a={endOnTick:!1,gridLineWidth:0,lineWidth:0,min:0,dataMin:0,minPadding:0,max:100,dataMax:100,maxPadding:0,startOnTick:!1,title:null,tickPositions:[]};e.prototype.bindAxes.call(this);
-b.extend(this.yAxis.options,a);b.extend(this.xAxis.options,a)},utils:{recursive:A}},{getClassName:function(){var a=b.Point.prototype.getClassName.call(this),c=this.series,d=c.options;this.node.level<=c.nodeMap[c.rootNode].level?a+=" highcharts-above-level":this.node.isLeaf||n(d.interactByLeaf,!d.allowDrillToNode)?this.node.isLeaf||(a+=" highcharts-internal-node"):a+=" highcharts-internal-node-interactive";return a},isValid:function(){return this.id||m(this.value)},setState:function(a){b.Point.prototype.setState.call(this,
-a);this.graphic&&this.graphic.attr({zIndex:"hover"===a?1:0})},setVisible:g.pie.prototype.pointClass.prototype.setVisible})})(p,C)});
-//# sourceMappingURL=treemap.js.map
-</script>
-<script>/*
-  Highcharts JS v7.0.1 (2018-12-19)
- Sankey diagram module
-
- (c) 2010-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(g){"object"===typeof module&&module.exports?module.exports=g:"function"===typeof define&&define.amd?define(function(){return g}):g("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(g){(function(c){c.NodesMixin={createNode:function(g){function r(b,a){return c.find(b,function(b){return b.id===a})}var d=r(this.nodes,g),k=this.pointClass,b;d||(b=this.options.nodes&&r(this.options.nodes,g),d=(new k).init(this,c.extend({className:"highcharts-node",isNode:!0,id:g,y:1},b)),d.linksTo=
-[],d.linksFrom=[],d.formatPrefix="node",d.name=d.name||d.options.id,d.getSum=function(){var b=0,a=0;d.linksTo.forEach(function(a){b+=a.weight});d.linksFrom.forEach(function(b){a+=b.weight});return Math.max(b,a)},d.offset=function(b,a){for(var e=0,f=0;f<d[a].length;f++){if(d[a][f]===b)return e;e+=d[a][f].weight}},d.hasShape=function(){var b=0;d.linksTo.forEach(function(a){a.outgoing&&b++});return!d.linksTo.length||b!==d.linksTo.length},this.nodes.push(d));return d}}})(g);(function(c){var g=c.defined,
-r=c.seriesType,d=c.pick,k=c.Point;r("sankey","column",{colorByPoint:!0,curveFactor:.33,dataLabels:{enabled:!0,backgroundColor:"none",crop:!1,nodeFormat:void 0,nodeFormatter:function(){return this.point.name},format:void 0,formatter:function(){return""},inside:!0},linkOpacity:.5,nodeWidth:20,nodePadding:10,showInLegend:!1,states:{hover:{linkOpacity:1}},tooltip:{followPointer:!0,headerFormat:'\x3cspan style\x3d"font-size: 10px"\x3e{series.name}\x3c/span\x3e\x3cbr/\x3e',pointFormat:"{point.fromNode.name} \u2192 {point.toNode.name}: \x3cb\x3e{point.weight}\x3c/b\x3e\x3cbr/\x3e",
-nodeFormat:"{point.name}: \x3cb\x3e{point.sum}\x3c/b\x3e\x3cbr/\x3e"}},{isCartesian:!1,forceDL:!0,createNode:c.NodesMixin.createNode,createNodeColumn:function(){var b=this.chart,e=[],a=this.options.nodePadding;e.sum=function(){var a=0;this.forEach(function(b){a+=b.getSum()});return a};e.offset=function(b,d){for(var f=0,c=0;c<e.length;c++){if(e[c]===b)return f+(b.options.offset||0);f+=e[c].getSum()*d+a}};e.top=function(d){for(var f=0,c=0;c<e.length;c++)0<c&&(f+=a),f+=e[c].getSum()*d;return(b.plotSizeY-
-f)/2};return e},createNodeColumns:function(){var b=[];this.nodes.forEach(function(a){var e=-1,d,g;if(!c.defined(a.options.column))if(0===a.linksTo.length)a.column=0;else{for(d=0;d<a.linksTo.length;d++)g=a.linksTo[0],g.fromNode.column>e&&(e=g.fromNode.column);a.column=e+1}b[a.column]||(b[a.column]=this.createNodeColumn());b[a.column].push(a)},this);for(var e=0;e<b.length;e++)void 0===b[e]&&(b[e]=this.createNodeColumn());return b},pointAttribs:function(b,e){var a=this.options.linkOpacity,d=b.color;
-e&&(a=this.options.states[e].linkOpacity||a,d=this.options.states[e].color||b.color);return{fill:b.isNode?d:c.color(d).setOpacity(a).get()}},generatePoints:function(){var b={},e=this.chart;c.Series.prototype.generatePoints.call(this);this.nodes||(this.nodes=[]);this.colorCounter=0;this.nodes.forEach(function(a){a.linksFrom.length=0;a.linksTo.length=0});this.points.forEach(function(a){g(a.from)&&(b[a.from]||(b[a.from]=this.createNode(a.from)),b[a.from].linksFrom.push(a),a.fromNode=b[a.from],e.styledMode?
-a.colorIndex=d(a.options.colorIndex,b[a.from].colorIndex):a.color=a.options.color||b[a.from].color);g(a.to)&&(b[a.to]||(b[a.to]=this.createNode(a.to)),b[a.to].linksTo.push(a),a.toNode=b[a.to]);a.name=a.name||a.options.id},this)},translate:function(){this.processedXData||this.processData();this.generatePoints();this.nodeColumns=this.createNodeColumns();var b=this.chart,d=b.inverted,a=this.options,c=0,g=a.nodeWidth,r=this.nodeColumns,A=(b.plotSizeX-g)/(r.length-1),B=(d?-A:A)*a.curveFactor,m=Infinity;
-this.nodeColumns.forEach(function(d){m=Math.min(m,(b.plotSizeY-(d.length-1)*a.nodePadding)/d.sum())});this.nodeColumns.forEach(function(a){a.forEach(function(e){var f=e.getSum(),k=f*m,E=a.top(m)+a.offset(e,m),l=d?b.plotSizeX-c:c;e.sum=f;e.shapeType="rect";e.shapeArgs=d?{x:l-g,y:b.plotSizeY-E-k,width:g,height:k}:{x:l,y:E,width:g,height:k};e.shapeArgs.display=e.hasShape()?"":"none";e.plotY=1;e.linksFrom.forEach(function(a){var c=a.weight*m,f=e.offset(a,"linksFrom")*m,f=E+f,h=a.toNode,n=r[h.column].top(m)+
-h.offset(a,"linksTo")*m+r[h.column].offset(h,m),p=g,h=h.column*A,k=a.outgoing,q=h>l;d&&(f=b.plotSizeY-f,n=b.plotSizeY-n,h=b.plotSizeX-h,p=-p,c=-c,q=l>h);a.shapeType="path";if(q)a.shapeArgs={d:["M",l+p,f,"C",l+p+B,f,h-B,n,h,n,"L",h+(k?p:0),n+c/2,"L",h,n+c,"C",h-B,n+c,l+p+B,f+c,l+p,f+c,"z"]};else{var k=h-20-c,q=h-20,w=h,v=l+p,u=v+20,C=u+c,H=f,x=f+c,F=x+20,y=F+(b.plotHeight-f-c),t=y+20,D=t+c,G=n,z=G+c,I=z+20,J=t+.7*c,K=w-.7*c,L=v+.7*c;a.shapeArgs={d:["M",v,H,"C",L,H,C,x-.7*c,C,F,"L",C,y,"C",C,J,L,D,
-v,D,"L",w,D,"C",K,D,k,J,k,y,"L",k,I,"C",k,z-.7*c,K,G,w,G,"L",w,z,"C",q,z,q,z,q,I,"L",q,y,"C",q,t,q,t,w,t,"L",v,t,"C",u,t,u,t,u,y,"L",u,F,"C",u,x,u,x,v,x,"z"]}}a.dlBox={x:l+(h-l+p)/2,y:f+(n-f)/2,height:c,width:0};a.y=a.plotY=1;a.color||(a.color=e.color)})});c+=A},this)},render:function(){var b=this.points;this.points=this.points.concat(this.nodes);c.seriesTypes.column.prototype.render.call(this);this.points=b},animate:c.Series.prototype.animate,destroy:function(){this.data=[].concat(this.points,this.nodes);
-c.Series.prototype.destroy.call(this)}},{getClassName:function(){return(this.isNode?"highcharts-node ":"highcharts-link ")+k.prototype.getClassName.call(this)},isValid:function(){return this.isNode||"number"===typeof this.weight}})})(g)});
-//# sourceMappingURL=sankey.js.map
-</script>
-<script>/*
-  Highcharts JS v7.0.1 (2018-12-19)
- Solid angular gauge module
-
- (c) 2010-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(l){"object"===typeof module&&module.exports?module.exports=l:"function"===typeof define&&define.amd?define(function(){return l}):l("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(l){(function(f){var l=f.pInt,u=f.pick,q=f.isNumber,w=f.wrap,v;w(f.Renderer.prototype.symbols,"arc",function(a,g,d,c,f,b){a=a(g,d,c,f,b);b.rounded&&(c=((b.r||c)-b.innerR)/2,b=["A",c,c,0,1,1,a[12],a[13]],a.splice.apply(a,[a.length-1,0].concat(["A",c,c,0,1,1,a[1],a[2]])),a.splice.apply(a,[11,3].concat(b)));
-return a});v={initDataClasses:function(a){var g=this.chart,d,c=0,r=this.options;this.dataClasses=d=[];a.dataClasses.forEach(function(b,h){b=f.merge(b);d.push(b);b.color||("category"===r.dataClassColor?(h=g.options.colors,b.color=h[c++],c===h.length&&(c=0)):b.color=f.color(r.minColor).tweenTo(f.color(r.maxColor),h/(a.dataClasses.length-1)))})},initStops:function(a){this.stops=a.stops||[[0,this.options.minColor],[1,this.options.maxColor]];this.stops.forEach(function(a){a.color=f.color(a[1])})},toColor:function(a,
-g){var d=this.stops,c,f,b=this.dataClasses,h,e;if(b)for(e=b.length;e--;){if(h=b[e],c=h.from,d=h.to,(void 0===c||a>=c)&&(void 0===d||a<=d)){f=h.color;g&&(g.dataClass=e);break}}else{this.isLog&&(a=this.val2lin(a));a=1-(this.max-a)/(this.max-this.min);for(e=d.length;e--&&!(a>d[e][0]););c=d[e]||d[e+1];d=d[e+1]||c;a=1-(d[0]-a)/(d[0]-c[0]||1);f=c.color.tweenTo(d.color,a)}return f}};f.seriesType("solidgauge","gauge",{colorByPoint:!0},{translate:function(){var a=this.yAxis;f.extend(a,v);!a.dataClasses&&a.options.dataClasses&&
-a.initDataClasses(a.options);a.initStops(a.options);f.seriesTypes.gauge.prototype.translate.call(this)},drawPoints:function(){var a=this,g=a.yAxis,d=g.center,c=a.options,r=a.chart.renderer,b=c.overshoot,h=q(b)?b/180*Math.PI:0,e;q(c.threshold)&&(e=g.startAngleRad+g.translate(c.threshold,null,null,null,!0));this.thresholdAngleRad=u(e,g.startAngleRad);a.points.forEach(function(b){var e=b.graphic,k=g.startAngleRad+g.translate(b.y,null,null,null,!0),t=l(u(b.options.radius,c.radius,100))*d[2]/200,m=l(u(b.options.innerRadius,
-c.innerRadius,60))*d[2]/200,n=g.toColor(b.y,b),p=Math.min(g.startAngleRad,g.endAngleRad),q=Math.max(g.startAngleRad,g.endAngleRad);"none"===n&&(n=b.color||a.color||"none");"none"!==n&&(b.color=n);k=Math.max(p-h,Math.min(q+h,k));!1===c.wrap&&(k=Math.max(p,Math.min(q,k)));p=Math.min(k,a.thresholdAngleRad);k=Math.max(k,a.thresholdAngleRad);k-p>2*Math.PI&&(k=p+2*Math.PI);b.shapeArgs=m={x:d[0],y:d[1],r:t,innerR:m,start:p,end:k,rounded:c.rounded};b.startR=t;e?(t=m.d,e.animate(f.extend({fill:n},m)),t&&(m.d=
-t)):(b.graphic=e=r.arc(m).attr({fill:n,"sweep-flag":0}).add(a.group),a.chart.styledMode||("square"!==c.linecap&&e.attr({"stroke-linecap":"round","stroke-linejoin":"round"}),e.attr({stroke:c.borderColor||"none","stroke-width":c.borderWidth||0})));e&&e.addClass(b.getClassName(),!0)})},animate:function(a){a||(this.startAngleRad=this.thresholdAngleRad,f.seriesTypes.pie.prototype.animate.call(this,a))}})})(l)});
-//# sourceMappingURL=solid-gauge.js.map
-</script>
-<script>/*
-  Highcharts JS v7.0.1 (2018-12-19)
- Streamgraph module
-
- (c) 2010-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(a){(function(a){a=a.seriesType;a("streamgraph","areaspline",{fillOpacity:1,lineWidth:0,marker:{enabled:!1},stacking:"stream"},{negStacks:!1,streamStacker:function(a,b,c){a[0]-=b.total/2;a[1]-=b.total/2;this.stackedYData[c]=a}})})(a)});
-//# sourceMappingURL=streamgraph.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
-
- (c) 2016-2018 Highsoft AS
- Authors: Jon Arild Nygard
-
- License: www.highcharts.com/license
-*/
-(function(z){"object"===typeof module&&module.exports?module.exports=z:"function"===typeof define&&define.amd?define(function(){return z}):z("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(z){var N=function(){return function(c){var w=this,k=w.graphic,h=c.animatableAttribs,n=c.onComplete,B=c.css,y=c.renderer;w.shouldDraw()?(k||(w.graphic=k=y[c.shapeType](c.shapeArgs).add(c.group)),k.css(B).attr(c.attribs).animate(h,c.isNew?!1:void 0,n)):k&&k.animate(h,void 0,function(){w.graphic=k=k.destroy();
-"function"===typeof n&&n()});k&&k.addClass(w.getClassName(),!0)}}(),K=function(c){var w=c.extend,k=c.isArray,h=c.isObject,n=c.isNumber,B=c.merge,y=c.pick;return{getColor:function(t,l){var D=l.index,f=l.mapOptionsToLevel,h=l.parentColor,k=l.parentColorIndex,x=l.series,C=l.colors,w=l.siblings,p=x.points,n=x.chart.options.chart,E,B,a,b;if(t){p=p[t.i];t=f[t.level]||{};if(f=p&&t.colorByPoint)B=p.index%(C?C.length:n.colorCount),E=C&&C[B];if(!x.chart.styledMode){C=p&&p.options.color;n=t&&t.color;if(a=h)a=
-(a=t&&t.colorVariation)&&"brightness"===a.key?c.color(h).brighten(D/w*a.to).get():h;a=y(C,n,E,a,x.color)}b=y(p&&p.options.colorIndex,t&&t.colorIndex,B,k,l.colorIndex)}return{color:a,colorIndex:b}},getLevelOptions:function(c){var l=null,D,f,F,t;if(h(c))for(l={},F=n(c.from)?c.from:1,t=c.levels,f={},D=h(c.defaults)?c.defaults:{},k(t)&&(f=t.reduce(function(c,f){var l,p;h(f)&&n(f.level)&&(p=B({},f),l="boolean"===typeof p.levelIsConstant?p.levelIsConstant:D.levelIsConstant,delete p.levelIsConstant,delete p.level,
-f=f.level+(l?0:F-1),h(c[f])?w(c[f],p):c[f]=p);return c},{})),t=n(c.to)?c.to:1,c=0;c<=t;c++)l[c]=B({},D,h(f[c])?f[c]:{});return l},setTreeValues:function l(c,f){var h=f.before,n=f.idRoot,x=f.mapIdToNode[n],k=f.points[c.i],D=k&&k.options||{},p=0,B=[];w(c,{levelDynamic:c.level-(("boolean"===typeof f.levelIsConstant?f.levelIsConstant:1)?0:x.level),name:y(k&&k.name,""),visible:n===c.id||("boolean"===typeof f.visible?f.visible:!1)});"function"===typeof h&&(c=h(c,f));c.children.forEach(function(h,k){var a=
-w({},f);w(a,{index:k,siblings:c.children.length,visible:c.visible});h=l(h,a);B.push(h);h.visible&&(p+=h.val)});c.visible=0<p||c.visible;h=y(D.value,p);w(c,{children:B,childrenTotal:p,isLeaf:c.visible&&!p,val:h});return c},updateRootId:function(c){var k;h(c)&&(k=h(c.options)?c.options:{},k=y(c.rootNode,k.rootId,""),h(c.userOptions)&&(c.userOptions.rootId=k),c.rootNode=k);return k}}}(z);(function(c,w){var k=c.seriesType,h=c.seriesTypes,n=c.merge,B=c.extend,y=c.noop,t=w.getColor,l=w.getLevelOptions,
-D=c.isArray,f=c.isNumber,F=c.isObject,z=c.isString,x=c.pick,C=c.Series,L=c.stableSort,p=c.Color,H=function(a,b,d){d=d||this;c.objectEach(a,function(c,e){b.call(d,c,e,a)})},E=function(a,b,d){d=d||this;a=b.call(d,a);!1!==a&&E(a,b,d)},M=w.updateRootId;k("treemap","scatter",{showInLegend:!1,marker:!1,colorByPoint:!1,dataLabels:{enabled:!0,defer:!1,verticalAlign:"middle",formatter:function(){var a=this&&this.point?this.point:{};return z(a.name)?a.name:""},inside:!0},tooltip:{headerFormat:"",pointFormat:"\x3cb\x3e{point.name}\x3c/b\x3e: {point.value}\x3cbr/\x3e"},
-ignoreHiddenPoint:!0,layoutAlgorithm:"sliceAndDice",layoutStartingDirection:"vertical",alternateStartingDirection:!1,levelIsConstant:!0,drillUpButton:{position:{align:"right",x:-10,y:10}},borderColor:"#e6e6e6",borderWidth:1,opacity:.15,states:{hover:{borderColor:"#999999",brightness:h.heatmap?0:.1,halo:!1,opacity:.75,shadow:!1}}},{pointArrayMap:["value"],directTouch:!0,optionalAxis:"colorAxis",getSymbol:y,parallelArrays:["x","y","value","colorValue"],colorKey:"colorValue",trackerGroups:["group","dataLabelsGroup"],
-getListOfParents:function(a,b){a=D(a)?a:[];var d=D(b)?b:[];b=a.reduce(function(a,b,d){b=x(b.parent,"");void 0===a[b]&&(a[b]=[]);a[b].push(d);return a},{"":[]});H(b,function(a,b,c){""!==b&&-1===d.indexOf(b)&&(a.forEach(function(a){c[""].push(a)}),delete c[b])});return b},getTree:function(){var a=this.data.map(function(a){return a.id}),a=this.getListOfParents(this.data,a);this.nodeMap=[];return this.buildNode("",-1,0,a,null)},init:function(a,b){var d=c.colorSeriesMixin;c.colorSeriesMixin&&(this.translateColors=
-d.translateColors,this.colorAttribs=d.colorAttribs,this.axisTypes=d.axisTypes);C.prototype.init.call(this,a,b);this.options.allowDrillToNode&&c.addEvent(this,"click",this.onClickDrillToNode)},buildNode:function(a,b,d,c,e){var g=this,m=[],v=g.points[b],q=0,I;(c[a]||[]).forEach(function(b){I=g.buildNode(g.points[b].id,b,d+1,c,a);q=Math.max(I.height+1,q);m.push(I)});b={id:a,i:b,children:m,height:q,level:d,parent:e,visible:!1};g.nodeMap[b.id]=b;v&&(v.node=b);return b},setTreeValues:function(a){var b=
-this,d=b.options,c=b.nodeMap[b.rootNode],d="boolean"===typeof d.levelIsConstant?d.levelIsConstant:!0,e=0,g=[],m,u=b.points[a.i];a.children.forEach(function(a){a=b.setTreeValues(a);g.push(a);a.ignore||(e+=a.val)});L(g,function(a,b){return a.sortIndex-b.sortIndex});m=x(u&&u.options.value,e);u&&(u.value=m);B(a,{children:g,childrenTotal:e,ignore:!(x(u&&u.visible,!0)&&0<m),isLeaf:a.visible&&!e,levelDynamic:a.level-(d?0:c.level),name:x(u&&u.name,""),sortIndex:x(u&&u.sortIndex,-m),val:m});return a},calculateChildrenAreas:function(a,
-b){var d=this,c=d.options,e=d.mapOptionsToLevel[a.level+1],g=x(d[e&&e.layoutAlgorithm]&&e.layoutAlgorithm,c.layoutAlgorithm),m=c.alternateStartingDirection,u=[];a=a.children.filter(function(a){return!a.ignore});e&&e.layoutStartingDirection&&(b.direction="vertical"===e.layoutStartingDirection?0:1);u=d[g](b,a);a.forEach(function(a,c){c=u[c];a.values=n(c,{val:a.childrenTotal,direction:m?1-b.direction:b.direction});a.pointValues=n(c,{x:c.x/d.axisRatio,width:c.width/d.axisRatio});a.children.length&&d.calculateChildrenAreas(a,
-a.values)})},setPointValues:function(){var a=this,b=a.xAxis,d=a.yAxis;a.points.forEach(function(c){var e=c.node,g=e.pointValues,m,u,v=0;a.chart.styledMode||(v=(a.pointAttribs(c)["stroke-width"]||0)%2/2);g&&e.visible?(e=Math.round(b.translate(g.x,0,0,0,1))-v,m=Math.round(b.translate(g.x+g.width,0,0,0,1))-v,u=Math.round(d.translate(g.y,0,0,0,1))-v,g=Math.round(d.translate(g.y+g.height,0,0,0,1))-v,c.shapeType="rect",c.shapeArgs={x:Math.min(e,m),y:Math.min(u,g),width:Math.abs(m-e),height:Math.abs(g-u)},
-c.plotX=c.shapeArgs.x+c.shapeArgs.width/2,c.plotY=c.shapeArgs.y+c.shapeArgs.height/2):(delete c.plotX,delete c.plotY)})},setColorRecursive:function(a,b,d,c,e){var g=this,m=g&&g.chart,m=m&&m.options&&m.options.colors,v;if(a){v=t(a,{colors:m,index:c,mapOptionsToLevel:g.mapOptionsToLevel,parentColor:b,parentColorIndex:d,series:g,siblings:e});if(b=g.points[a.i])b.color=v.color,b.colorIndex=v.colorIndex;(a.children||[]).forEach(function(b,d){g.setColorRecursive(b,v.color,v.colorIndex,d,a.children.length)})}},
-algorithmGroup:function(a,b,d,c){this.height=a;this.width=b;this.plot=c;this.startDirection=this.direction=d;this.lH=this.nH=this.lW=this.nW=this.total=0;this.elArr=[];this.lP={total:0,lH:0,nH:0,lW:0,nW:0,nR:0,lR:0,aspectRatio:function(a,b){return Math.max(a/b,b/a)}};this.addElement=function(a){this.lP.total=this.elArr[this.elArr.length-1];this.total+=a;0===this.direction?(this.lW=this.nW,this.lP.lH=this.lP.total/this.lW,this.lP.lR=this.lP.aspectRatio(this.lW,this.lP.lH),this.nW=this.total/this.height,
-this.lP.nH=this.lP.total/this.nW,this.lP.nR=this.lP.aspectRatio(this.nW,this.lP.nH)):(this.lH=this.nH,this.lP.lW=this.lP.total/this.lH,this.lP.lR=this.lP.aspectRatio(this.lP.lW,this.lH),this.nH=this.total/this.width,this.lP.nW=this.lP.total/this.nH,this.lP.nR=this.lP.aspectRatio(this.lP.nW,this.nH));this.elArr.push(a)};this.reset=function(){this.lW=this.nW=0;this.elArr=[];this.total=0}},algorithmCalcPoints:function(a,b,d,c){var e,g,m,v,q=d.lW,f=d.lH,r=d.plot,h,k=0,p=d.elArr.length-1;b?(q=d.nW,f=d.nH):
-h=d.elArr[d.elArr.length-1];d.elArr.forEach(function(a){if(b||k<p)0===d.direction?(e=r.x,g=r.y,m=q,v=a/m):(e=r.x,g=r.y,v=f,m=a/v),c.push({x:e,y:g,width:m,height:v}),0===d.direction?r.y+=v:r.x+=m;k+=1});d.reset();0===d.direction?d.width-=q:d.height-=f;r.y=r.parent.y+(r.parent.height-d.height);r.x=r.parent.x+(r.parent.width-d.width);a&&(d.direction=1-d.direction);b||d.addElement(h)},algorithmLowAspectRatio:function(a,b,d){var c=[],e=this,g,m={x:b.x,y:b.y,parent:b},u=0,q=d.length-1,f=new this.algorithmGroup(b.height,
-b.width,b.direction,m);d.forEach(function(d){g=d.val/b.val*b.height*b.width;f.addElement(g);f.lP.nR>f.lP.lR&&e.algorithmCalcPoints(a,!1,f,c,m);u===q&&e.algorithmCalcPoints(a,!0,f,c,m);u+=1});return c},algorithmFill:function(a,b,d){var c=[],e,g=b.direction,m=b.x,u=b.y,q=b.width,f=b.height,r,h,k,p;d.forEach(function(d){e=d.val/b.val*b.height*b.width;r=m;h=u;0===g?(p=f,k=e/p,q-=k,m+=k):(k=q,p=e/k,f-=p,u+=p);c.push({x:r,y:h,width:k,height:p});a&&(g=1-g)});return c},strip:function(a,b){return this.algorithmLowAspectRatio(!1,
-a,b)},squarified:function(a,b){return this.algorithmLowAspectRatio(!0,a,b)},sliceAndDice:function(a,b){return this.algorithmFill(!0,a,b)},stripes:function(a,b){return this.algorithmFill(!1,a,b)},translate:function(){var a=this,b=a.options,d=M(a),c,e;C.prototype.translate.call(a);e=a.tree=a.getTree();c=a.nodeMap[d];a.mapOptionsToLevel=l({from:c.level+1,levels:b.levels,to:e.height,defaults:{levelIsConstant:a.options.levelIsConstant,colorByPoint:b.colorByPoint}});""===d||c&&c.children.length||(a.drillToNode("",
-!1),d=a.rootNode,c=a.nodeMap[d]);E(a.nodeMap[a.rootNode],function(b){var d=!1,c=b.parent;b.visible=!0;if(c||""===c)d=a.nodeMap[c];return d});E(a.nodeMap[a.rootNode].children,function(a){var b=!1;a.forEach(function(a){a.visible=!0;a.children.length&&(b=(b||[]).concat(a.children))});return b});a.setTreeValues(e);a.axisRatio=a.xAxis.len/a.yAxis.len;a.nodeMap[""].pointValues=d={x:0,y:0,width:100,height:100};a.nodeMap[""].values=d=n(d,{width:d.width*a.axisRatio,direction:"vertical"===b.layoutStartingDirection?
-0:1,val:e.val});a.calculateChildrenAreas(e,d);a.colorAxis?a.translateColors():b.colorByPoint||a.setColorRecursive(a.tree);b.allowDrillToNode&&(b=c.pointValues,a.xAxis.setExtremes(b.x,b.x+b.width,!1),a.yAxis.setExtremes(b.y,b.y+b.height,!1),a.xAxis.setScale(),a.yAxis.setScale());a.setPointValues()},drawDataLabels:function(){var a=this,b=a.mapOptionsToLevel,d,c;a.points.filter(function(a){return a.node.visible}).forEach(function(e){c=b[e.node.level];d={style:{}};e.node.isLeaf||(d.enabled=!1);c&&c.dataLabels&&
-(d=n(d,c.dataLabels),a._hasPointLabels=!0);e.shapeArgs&&(d.style.width=e.shapeArgs.width,e.dataLabel&&e.dataLabel.css({width:e.shapeArgs.width+"px"}));e.dlOptions=n(d,e.options.dataLabels)});C.prototype.drawDataLabels.call(this)},alignDataLabel:function(a){h.column.prototype.alignDataLabel.apply(this,arguments);a.dataLabel&&a.dataLabel.attr({zIndex:(a.node.zIndex||0)+1})},pointAttribs:function(a,b){var d=F(this.mapOptionsToLevel)?this.mapOptionsToLevel:{},c=a&&d[a.node.level]||{},d=this.options,e=
-b&&d.states[b]||{},g=a&&a.getClassName()||"";a={stroke:a&&a.borderColor||c.borderColor||e.borderColor||d.borderColor,"stroke-width":x(a&&a.borderWidth,c.borderWidth,e.borderWidth,d.borderWidth),dashstyle:a&&a.borderDashStyle||c.borderDashStyle||e.borderDashStyle||d.borderDashStyle,fill:a&&a.color||this.color};-1!==g.indexOf("highcharts-above-level")?(a.fill="none",a["stroke-width"]=0):-1!==g.indexOf("highcharts-internal-node-interactive")?(b=x(e.opacity,d.opacity),a.fill=p(a.fill).setOpacity(b).get(),
-a.cursor="pointer"):-1!==g.indexOf("highcharts-internal-node")?a.fill="none":b&&(a.fill=p(a.fill).brighten(e.brightness).get());return a},drawPoints:function(){var a=this,b=a.points.filter(function(a){return a.node.visible});b.forEach(function(b){var d="level-group-"+b.node.levelDynamic;a[d]||(a[d]=a.chart.renderer.g(d).attr({zIndex:1E3-b.node.levelDynamic}).add(a.group));b.group=a[d]});h.column.prototype.drawPoints.call(this);this.colorAttribs&&a.chart.styledMode&&this.points.forEach(function(a){a.graphic&&
-a.graphic.css(this.colorAttribs(a))},this);a.options.allowDrillToNode&&b.forEach(function(b){b.graphic&&(b.drillId=a.options.interactByLeaf?a.drillToByLeaf(b):a.drillToByGroup(b))})},onClickDrillToNode:function(a){var b=(a=a.point)&&a.drillId;z(b)&&(a.setState(""),this.drillToNode(b))},drillToByGroup:function(a){var b=!1;1!==a.node.level-this.nodeMap[this.rootNode].level||a.node.isLeaf||(b=a.id);return b},drillToByLeaf:function(a){var b=!1;if(a.node.parent!==this.rootNode&&a.node.isLeaf)for(a=a.node;!b;)a=
-this.nodeMap[a.parent],a.parent===this.rootNode&&(b=a.id);return b},drillUp:function(){var a=this.nodeMap[this.rootNode];a&&z(a.parent)&&this.drillToNode(a.parent)},drillToNode:function(a,b){var c=this.nodeMap[a];this.idPreviousRoot=this.rootNode;this.rootNode=a;""===a?this.drillUpButton=this.drillUpButton.destroy():this.showDrillUpButton(c&&c.name||a);this.isDirty=!0;x(b,!0)&&this.chart.redraw()},showDrillUpButton:function(a){var b=this;a=a||"\x3c Back";var c=b.options.drillUpButton,f,e;c.text&&
-(a=c.text);this.drillUpButton?(this.drillUpButton.placed=!1,this.drillUpButton.attr({text:a}).align()):(e=(f=c.theme)&&f.states,this.drillUpButton=this.chart.renderer.button(a,null,null,function(){b.drillUp()},f,e&&e.hover,e&&e.select).addClass("highcharts-drillup-button").attr({align:c.position.align,zIndex:7}).add().align(c.position,!1,c.relativeTo||"plotBox"))},buildKDTree:y,drawLegendSymbol:c.LegendSymbolMixin.drawRectangle,getExtremes:function(){C.prototype.getExtremes.call(this,this.colorValueData);
-this.valueMin=this.dataMin;this.valueMax=this.dataMax;C.prototype.getExtremes.call(this)},getExtremesFromAll:!0,bindAxes:function(){var a={endOnTick:!1,gridLineWidth:0,lineWidth:0,min:0,dataMin:0,minPadding:0,max:100,dataMax:100,maxPadding:0,startOnTick:!1,title:null,tickPositions:[]};C.prototype.bindAxes.call(this);c.extend(this.yAxis.options,a);c.extend(this.xAxis.options,a)},utils:{recursive:E}},{getClassName:function(){var a=c.Point.prototype.getClassName.call(this),b=this.series,d=b.options;
-this.node.level<=b.nodeMap[b.rootNode].level?a+=" highcharts-above-level":this.node.isLeaf||x(d.interactByLeaf,!d.allowDrillToNode)?this.node.isLeaf||(a+=" highcharts-internal-node"):a+=" highcharts-internal-node-interactive";return a},isValid:function(){return this.id||f(this.value)},setState:function(a){c.Point.prototype.setState.call(this,a);this.graphic&&this.graphic.attr({zIndex:"hover"===a?1:0})},setVisible:h.pie.prototype.pointClass.prototype.setVisible})})(z,K);(function(c,w,k){var h=c.CenteredSeriesMixin,
-n=c.Series,B=c.extend,y=h.getCenter,t=k.getColor,l=k.getLevelOptions,D=h.getStartAndEndRadians,f=c.isNumber,z=c.isObject,K=c.isString,x=c.merge,C=180/Math.PI,h=c.seriesType,L=k.setTreeValues,p=k.updateRootId,H=function(a,b){var c=[];if(f(a)&&f(b)&&a<=b)for(;a<=b;a++)c.push(a);return c},E=function(a,b){var c;b=z(b)?b:{};var k=0,e,g,m,u;z(a)&&(c=x({},a),a=f(b.from)?b.from:0,u=f(b.to)?b.to:0,g=H(a,u),a=Object.keys(c).filter(function(a){return-1===g.indexOf(+a)}),e=m=f(b.diffRadius)?b.diffRadius:0,g.forEach(function(a){a=
-c[a];var b=a.levelSize.unit,d=a.levelSize.value;"weight"===b?k+=d:"percentage"===b?(a.levelSize={unit:"pixels",value:d/100*e},m-=a.levelSize.value):"pixels"===b&&(m-=d)}),g.forEach(function(a){var b=c[a];"weight"===b.levelSize.unit&&(b=b.levelSize.value,c[a].levelSize={unit:"pixels",value:b/k*m})}),a.forEach(function(a){c[a].levelSize={value:0,unit:"pixels"}}));return c},M=function(a,b){var c=b.mapIdToNode[a.parent],f=b.series,e=f.chart,g=f.points[a.i],c=t(a,{colors:e&&e.options&&e.options.colors,
-colorIndex:f.colorIndex,index:b.index,mapOptionsToLevel:b.mapOptionsToLevel,parentColor:c&&c.color,parentColorIndex:c&&c.colorIndex,series:b.series,siblings:b.siblings});a.color=c.color;a.colorIndex=c.colorIndex;g&&(g.color=a.color,g.colorIndex=a.colorIndex,a.sliced=a.id!==b.idRoot?g.sliced:!1);return a};h("sunburst","treemap",{center:["50%","50%"],colorByPoint:!1,dataLabels:{allowOverlap:!0,defer:!0,style:{textOverflow:"ellipsis"},rotationMode:"auto"},rootId:void 0,levelIsConstant:!0,levelSize:{value:1,
-unit:"weight"},slicedOffset:10},{drawDataLabels:c.noop,drawPoints:function(){var a=this,b=a.mapOptionsToLevel,c=a.shapeRoot,k=a.group,e=a.hasRendered,g=a.rootNode,m=a.idPreviousRoot,u=a.nodeMap,h=u[m],p=h&&h.shapeArgs,h=a.points,r=a.startAndEndRadians,t=a.chart,l=t&&t.options&&t.options.chart||{},w="boolean"===typeof l.animation?l.animation:!0,y=a.center[3]/2,D=a.chart.renderer,E,F=!1,H=!1;if(l=!!(w&&e&&g!==m&&a.dataLabelsGroup))a.dataLabelsGroup.attr({opacity:0}),E=function(){F=!0;a.dataLabelsGroup&&
-a.dataLabelsGroup.animate({opacity:1,visibility:"visible"})};h.forEach(function(d){var h,v,q=d.node,l=b[q.level];h=d.shapeExisting||{};var n=q.shapeArgs||{},I,F=!(!q.visible||!q.shapeArgs);if(e&&w){var J={};v={end:n.end,start:n.start,innerR:n.innerR,r:n.r,x:n.x,y:n.y};F?!d.graphic&&p&&(J=g===d.id?{start:r.start,end:r.end}:p.end<=n.start?{start:r.end,end:r.end}:{start:r.start,end:r.start},J.innerR=J.r=y):d.graphic&&(m===d.id?v={innerR:y,r:y}:c&&(v=c.end<=h.start?{innerR:y,r:y,start:r.end,end:r.end}:
-{innerR:y,r:y,start:r.start,end:r.start}));h=J}else v=n,h={};var J=[n.plotX,n.plotY],A;d.node.isLeaf||(g===d.id?(A=u[g],A=A.parent):A=d.id);B(d,{shapeExisting:n,tooltipPos:J,drillId:A,name:""+(d.name||d.id||d.index),plotX:n.plotX,plotY:n.plotY,value:q.val,isNull:!F});A=d.options;q=z(n)?n:{};A=z(A)?A.dataLabels:{};var l=z(l)?l.dataLabels:{},l=x({style:{}},l,A),G;A=l.rotationMode;f(l.rotation)||("auto"===A&&(1>d.innerArcLength&&d.outerArcLength>q.radius?G=0:A=1<d.innerArcLength&&d.outerArcLength>1.5*
-q.radius?"parallel":"perpendicular"),"auto"!==A&&(G=q.end-(q.end-q.start)/2),l.style.width="parallel"===A?Math.min(2.5*q.radius,(d.outerArcLength+d.innerArcLength)/2):q.radius,"perpendicular"===A&&d.series.chart.renderer.fontMetrics(l.style.fontSize).h>d.outerArcLength&&(l.style.width=1),l.style.width=Math.max(l.style.width-2*(l.padding||0),1),G=G*C%180,"parallel"===A&&(G-=90),90<G?G-=180:-90>G&&(G+=180),l.rotation=G);0===l.rotation&&(l.rotation=.001);d.dlOptions=l;!H&&F&&(H=!0,I=E);d.draw({animatableAttribs:v,
-attribs:B(h,!t.styledMode&&a.pointAttribs(d,d.selected&&"select")),onComplete:I,group:k,renderer:D,shapeType:"arc",shapeArgs:n})});l&&H?(a.hasRendered=!1,a.options.dataLabels.defer=!0,n.prototype.drawDataLabels.call(a),a.hasRendered=!0,F&&E()):n.prototype.drawDataLabels.call(a)},pointAttribs:c.seriesTypes.column.prototype.pointAttribs,layoutAlgorithm:function(a,b,c){var d=a.start,e=a.end-d,g=a.val,m=a.x,h=a.y,k=c&&z(c.levelSize)&&f(c.levelSize.value)?c.levelSize.value:0,l=a.r,n=l+k,p=c&&f(c.slicedOffset)?
-c.slicedOffset:0;return(b||[]).reduce(function(a,b){var c=1/g*b.val*e,f=d+c/2,q=m+Math.cos(f)*p,f=h+Math.sin(f)*p;b={x:b.sliced?q:m,y:b.sliced?f:h,innerR:l,r:n,radius:k,start:d,end:d+c};a.push(b);d=b.end;return a},[])},setShapeArgs:function(a,b,c){var d=[],e=c[a.level+1];a=a.children.filter(function(a){return a.visible});d=this.layoutAlgorithm(b,a,e);a.forEach(function(a,b){b=d[b];var e=b.start+(b.end-b.start)/2,f=b.innerR+(b.r-b.innerR)/2,g=b.end-b.start,f=0===b.innerR&&6.28<g?{x:b.x,y:b.y}:{x:b.x+
-Math.cos(e)*f,y:b.y+Math.sin(e)*f},h=a.val?a.childrenTotal>a.val?a.childrenTotal:a.val:a.childrenTotal;this.points[a.i]&&(this.points[a.i].innerArcLength=g*b.innerR,this.points[a.i].outerArcLength=g*b.r);a.shapeArgs=x(b,{plotX:f.x,plotY:f.y+4*Math.abs(Math.cos(e))});a.values=x(b,{val:h});a.children.length&&this.setShapeArgs(a,a.values,c)},this)},translate:function(){var a=this.options,b=this.center=y.call(this),c=this.startAndEndRadians=D(a.startAngle,a.endAngle),f=b[3]/2,e=b[2]/2-f,g=p(this),h=this.nodeMap,
-k,q=h&&h[g],t,r;this.shapeRoot=q&&q.shapeArgs;n.prototype.translate.call(this);r=this.tree=this.getTree();h=this.nodeMap;q=h[g];k=K(q.parent)?q.parent:"";t=h[k];k=l({from:0<q.level?q.level:1,levels:this.options.levels,to:r.height,defaults:{colorByPoint:a.colorByPoint,dataLabels:a.dataLabels,levelIsConstant:a.levelIsConstant,levelSize:a.levelSize,slicedOffset:a.slicedOffset}});k=E(k,{diffRadius:e,from:0<q.level?q.level:1,to:r.height});L(r,{before:M,idRoot:g,levelIsConstant:a.levelIsConstant,mapOptionsToLevel:k,
-mapIdToNode:h,points:this.points,series:this});a=h[""].shapeArgs={end:c.end,r:f,start:c.start,val:q.val,x:b[0],y:b[1]};this.setShapeArgs(t,a,k);this.mapOptionsToLevel=k},animate:function(a){var b=this.chart,c=[b.plotWidth/2,b.plotHeight/2],f=b.plotLeft,e=b.plotTop,b=this.group;a?(a={translateX:c[0]+f,translateY:c[1]+e,scaleX:.001,scaleY:.001,rotation:10,opacity:.01},b.attr(a)):(a={translateX:f,translateY:e,scaleX:1,scaleY:1,rotation:0,opacity:1},b.animate(a,this.options.animation),this.animate=null)},
-utils:{calculateLevelSizes:E,range:H}},{draw:w,shouldDraw:function(){return!this.isNull}})})(z,N,K)});
-//# sourceMappingURL=sunburst.js.map
-</script>
-<script>/*
-  Highcharts JS v7.0.1 (2018-12-19)
- Vector plot series module
-
- (c) 2010-2018 Torstein Honsi
-
- License: www.highcharts.com/license
-*/
-(function(c){"object"===typeof module&&module.exports?module.exports=c:"function"===typeof define&&define.amd?define(function(){return c}):c("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(c){(function(d){var c=d.seriesType;c("vector","scatter",{lineWidth:2,marker:null,rotationOrigin:"center",states:{hover:{lineWidthPlus:1}},tooltip:{pointFormat:"\x3cb\x3e[{point.x}, {point.y}]\x3c/b\x3e\x3cbr/\x3eLength: \x3cb\x3e{point.length}\x3c/b\x3e\x3cbr/\x3eDirection: \x3cb\x3e{point.direction}\u00b0\x3c/b\x3e\x3cbr/\x3e"},
-vectorLength:20},{pointArrayMap:["y","length","direction"],parallelArrays:["x","y","length","direction"],pointAttribs:function(a,b){var c=this.options;a=a.color||this.color;var d=this.options.lineWidth;b&&(a=c.states[b].color||a,d=(c.states[b].lineWidth||d)+(c.states[b].lineWidthPlus||0));return{stroke:a,"stroke-width":d}},markerAttribs:d.noop,getSymbol:d.noop,arrow:function(a){a=a.length/this.lengthMax*this.options.vectorLength/20;var b={start:10*a,center:0,end:-10*a}[this.options.rotationOrigin]||
-0;return["M",0,7*a+b,"L",-1.5*a,7*a+b,0,10*a+b,1.5*a,7*a+b,0,7*a+b,0,-10*a+b]},translate:function(){d.Series.prototype.translate.call(this);this.lengthMax=d.arrayMax(this.lengthData)},drawPoints:function(){var a=this.chart;this.points.forEach(function(b){var c=b.plotX,d=b.plotY;a.isInsidePlot(c,d,a.inverted)?(b.graphic||(b.graphic=this.chart.renderer.path().add(this.markerGroup)),b.graphic.attr({d:this.arrow(b),translateX:c,translateY:d,rotation:b.direction}).attr(this.pointAttribs(b))):b.graphic&&
-(b.graphic=b.graphic.destroy())},this)},drawGraph:d.noop,animate:function(a){a?this.markerGroup.attr({opacity:.01}):(this.markerGroup.animate({opacity:1},d.animObject(this.options.animation)),this.animate=null)}})})(c)});
-//# sourceMappingURL=vector.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
-
- (c) 2016-2018 Highsoft AS
- Authors: Jon Arild Nygard
-
- License: www.highcharts.com/license
-*/
-(function(h){"object"===typeof module&&module.exports?module.exports=h:"function"===typeof define&&define.amd?define(function(){return h}):h("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(h){var y=function(){return function(f){var v=this,k=v.graphic,h=f.animatableAttribs,t=f.onComplete,w=f.css,A=f.renderer;v.shouldDraw()?(k||(v.graphic=k=A[f.shapeType](f.shapeArgs).add(f.group)),k.css(w).attr(f.attribs).animate(h,f.isNew?!1:void 0,t)):k&&k.animate(h,void 0,function(){v.graphic=k=k.destroy();
-"function"===typeof t&&t()});k&&k.addClass(v.getClassName(),!0)}}(),C=function(f){var h=f.deg2rad,k=f.find,J=f.isArray,t=f.isNumber,w=function(a,d){d=t(d)?d:14;d=Math.pow(10,d);return Math.round(a*d)/d},A=function(a,d){var e=d[0]-a[0];a=d[1]-a[1];return[[-a,e],[a,-e]]},q=function(a,d){a=a.map(function(a){return a[0]*d[0]+a[1]*d[1]});return{min:Math.min.apply(this,a),max:Math.max.apply(this,a)}},E=function(a,d){var e=a[0];a=a[1];var m=h*-d;d=Math.cos(m);m=Math.sin(m);return[w(e*d-a*m),w(e*m+a*d)]},
-z=function(a,d,e){a=E([a[0]-d[0],a[1]-d[1]],e);return[a[0]+d[0],a[1]+d[1]]},B=function(a){var d,e=a.axes;J(e)||(e=[],d=d=a.concat([a[0]]),d.reduce(function(a,d){var m=A(a,d)[0];k(e,function(a){return a[0]===m[0]&&a[1]===m[1]})||e.push(m);return d}),a.axes=e);return e},G=function(a,d){a=B(a);d=B(d);return a.concat(d)};return{getBoundingBoxFromPolygon:function(a){return a.reduce(function(a,e){var d=e[0];e=e[1];a.left=Math.min(d,a.left);a.right=Math.max(d,a.right);a.bottom=Math.max(e,a.bottom);a.top=
-Math.min(e,a.top);return a},{left:Number.MAX_VALUE,right:-Number.MAX_VALUE,bottom:-Number.MAX_VALUE,top:Number.MAX_VALUE})},getPolygon:function(a,d,e,m,f){var k=[a,d],h=a-e/2;a+=e/2;e=d-m/2;d+=m/2;return[[h,e],[a,e],[a,d],[h,d]].map(function(a){return z(a,k,-f)})},isPolygonsColliding:function(a,d){var e=G(a,d);return!k(e,function(e){var f=q(a,e);e=q(d,e);return!!(e.min>f.max||e.max<f.min)})},movePolygon:function(a,d,e){return e.map(function(e){return[e[0]+a,e[1]+d]})},rotate2DToOrigin:E,rotate2DToPoint:z}}(h);
-(function(f,h,k){function v(g,c){var b=!1,a=g.rect,e=g.polygon,d=g.lastCollidedWith,f=function(c){var b;b=c.rect;(b=!(b.left>a.right||b.right<a.left||b.top>a.bottom||b.bottom<a.top))&&(g.rotation%90||c.roation%90)&&(b=D(e,c.polygon));return b};d&&((b=f(d))||delete g.lastCollidedWith);b||(b=!!C(c,function(c){var b=f(c);b&&(g.lastCollidedWith=c);return b}));return b}function t(g){var c=4*g,b=Math.ceil((Math.sqrt(c)-1)/2),a=2*b+1,d=Math.pow(a,2),e=!1,a=a-1;1E4>=g&&("boolean"===typeof e&&c>=d-a&&(e={x:b-
-(d-c),y:-b}),d-=a,"boolean"===typeof e&&c>=d-a&&(e={x:-b,y:-b+(d-c)}),d-=a,"boolean"===typeof e&&(e=c>=d-a?{x:-b+(d-c),y:b}:{x:b,y:b-(d-c-a)}),e.x*=5,e.y*=5);return e}function w(g,c,b){var a=2*Math.max(Math.abs(b.top),Math.abs(b.bottom));b=2*Math.max(Math.abs(b.left),Math.abs(b.right));return Math.min(0<b?1/b*g:1,0<a?1/a*c:1)}function A(a,c,b){b=b.reduce(function(a,c){c=c.dimensions;var b=Math.max(c.width,c.height);a.maxHeight=Math.max(a.maxHeight,c.height);a.maxWidth=Math.max(a.maxWidth,c.width);
-a.area+=b*b;return a},{maxHeight:0,maxWidth:0,area:0});b=Math.max(b.maxHeight,b.maxWidth,.85*Math.sqrt(b.area));var g=a>c?a/c:1;a=c>a?c/a:1;return{width:b*g,height:b*a,ratioX:g,ratioY:a}}function q(a,c,b,d){var g=!1;e(a)&&e(c)&&e(b)&&e(d)&&-1<a&&-1<c&&d>b&&(g=b+c%a*((d-b)/(a-1)));return g}function E(a,c){var b,g=[];for(b=1;1E4>b;b++)g.push(a(b,c));return function(a){return 1E4>=a?g[a-1]:!1}}function z(a,c){var b=c.width/2,g=-(c.height/2),d=c.height/2;return!(-(c.width/2)<a.left&&b>a.right&&g<a.top&&
-d>a.bottom)}function B(g,c){var b=c.placed,d=c.field,e=c.rectangle,f=c.polygon,k=c.spiral,h=1,p={x:0,y:0},n=g.rect=a({},e);g.polygon=f;for(g.rotation=c.rotation;!1!==p&&(v(g,b)||z(n,d));)p=k(h),m(p)&&(n.left=e.left+p.x,n.right=e.right+p.x,n.top=e.top+p.y,n.bottom=e.bottom+p.y,g.polygon=L(p.x,p.y,f)),h++;return p}function G(a,c){var b,g,d;m(a)&&m(c)&&(b=c.bottom-c.top,g=c.right-c.left,c=a.ratioX,d=a.ratioY,b=g*c>b*d?g:b,a=y(a,{width:a.width+b*c*2,height:a.height+b*d*2}));return a}var a=f.extend,d=
-f.isArray,e=f.isNumber,m=f.isObject,y=f.merge,F=f.noop,C=f.find,K=k.getBoundingBoxFromPolygon,M=k.getPolygon,D=k.isPolygonsColliding,L=k.movePolygon,I=f.Series;f.seriesType("wordcloud","column",{allowExtendPlayingField:!0,animation:{duration:500},borderWidth:0,clip:!1,colorByPoint:!0,minFontSize:1,maxFontSize:25,placementStrategy:"center",rotation:{from:0,orientations:2,to:90},showInLegend:!1,spiral:"rectangular",style:{fontFamily:"sans-serif",fontWeight:"900"},tooltip:{followPointer:!0,pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.weight}\x3c/b\x3e\x3cbr/\x3e'}},
-{animate:I.prototype.animate,animateDrilldown:F,animateDrillupFrom:F,bindAxes:function(){var g={endOnTick:!1,gridLineWidth:0,lineWidth:0,maxPadding:0,startOnTick:!1,title:null,tickPositions:[]};I.prototype.bindAxes.call(this);a(this.yAxis.options,g);a(this.xAxis.options,g)},deriveFontSize:function(a,c,b){a=e(a)?a:0;c=e(c)?c:1;b=e(b)?b:1;return Math.floor(Math.max(b,a*c))},drawPoints:function(){var d=this,c=d.hasRendered,b=d.xAxis,f=d.yAxis,k=d.group,h=d.options,t=h.animation,v=h.allowExtendPlayingField,
-p=d.chart.renderer,n=p.text().add(k),q=[],z=d.placementStrategy[h.placementStrategy],y,C=h.rotation,F=d.points.map(function(a){return a.weight}),D=Math.max.apply(null,F),H=d.points.sort(function(a,c){return c.weight-a.weight}),u;H.forEach(function(c){var b=d.deriveFontSize(1/D*c.weight,h.maxFontSize,h.minFontSize),b=a({fontSize:b+"px"},h.style);n.css(b).attr({x:0,y:0,text:c.name});b=n.getBBox(!0);c.dimensions={height:b.height,width:b.width}});u=A(b.len,f.len,H);y=E(d.spirals[h.spiral],{field:u});
-H.forEach(function(b){var g=d.deriveFontSize(1/D*b.weight,h.maxFontSize,h.minFontSize),g=a({fontSize:g+"px",fill:b.color},h.style),f=z(b,{data:H,field:u,placed:q,rotation:C}),r={align:"center","alignment-baseline":"middle",x:f.x,y:f.y,text:b.name,rotation:f.rotation},n=M(f.x,f.y,b.dimensions.width,b.dimensions.height,f.rotation),l=K(n),x=B(b,{rectangle:l,polygon:n,field:u,placed:q,spiral:y,rotation:f.rotation}),w;!x&&v&&(u=G(u,l),x=B(b,{rectangle:l,polygon:n,field:u,placed:q,spiral:y,rotation:f.rotation}));
-if(m(x)){r.x+=x.x;r.y+=x.y;l.left+=x.x;l.right+=x.x;l.top+=x.y;l.bottom+=x.y;f=u;if(!e(f.left)||f.left>l.left)f.left=l.left;if(!e(f.right)||f.right<l.right)f.right=l.right;if(!e(f.top)||f.top>l.top)f.top=l.top;if(!e(f.bottom)||f.bottom<l.bottom)f.bottom=l.bottom;u=f;q.push(b);b.isNull=!1}else b.isNull=!0;t&&(w={x:r.x,y:r.y},c?(delete r.x,delete r.y):(r.x=0,r.y=0));b.draw({animatableAttribs:w,attribs:r,css:g,group:k,renderer:p,shapeArgs:void 0,shapeType:"text"})});n=n.destroy();b=w(b.len,f.len,u);
-d.group.attr({scaleX:b,scaleY:b})},hasData:function(){return m(this)&&!0===this.visible&&d(this.points)&&0<this.points.length},placementStrategy:{random:function(a,c){var b=c.field;c=c.rotation;return{x:Math.round(b.width*(Math.random()+.5)/2)-b.width/2,y:Math.round(b.height*(Math.random()+.5)/2)-b.height/2,rotation:q(c.orientations,a.index,c.from,c.to)}},center:function(a,c){c=c.rotation;return{x:0,y:0,rotation:q(c.orientations,a.index,c.from,c.to)}}},pointArrayMap:["weight"],spirals:{archimedean:function(a,
-c){var b=c.field;c=!1;var b=b.width*b.width+b.height*b.height,d=.8*a;1E4>=a&&(c={x:d*Math.cos(d),y:d*Math.sin(d)},Math.min(Math.abs(c.x),Math.abs(c.y))<b||(c=!1));return c},rectangular:function(a,c){a=t(a,c);c=c.field;a&&(a.x*=c.ratioX,a.y*=c.ratioY);return a},square:t},utils:{extendPlayingField:G,getRotation:q,isPolygonsColliding:D,rotate2DToOrigin:k.rotate2DToOrigin,rotate2DToPoint:k.rotate2DToPoint},getPlotBox:function(){var a=this.chart,c=a.inverted,b=this[c?"yAxis":"xAxis"],c=this[c?"xAxis":
-"yAxis"];return{translateX:(b?b.left:a.plotLeft)+(b?b.len:a.plotWidth)/2,translateY:(c?c.top:a.plotTop)+(c?c.len:a.plotHeight)/2,scaleX:1,scaleY:1}}},{draw:h,shouldDraw:function(){return!this.isNull},weight:1})})(h,y,C)});
-//# sourceMappingURL=wordcloud.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
- X-range series
-
- (c) 2010-2018 Torstein Honsi, Lars A. V. Cabrera
-
- License: www.highcharts.com/license
-*/
-(function(g){"object"===typeof module&&module.exports?module.exports=g:"function"===typeof define&&define.amd?define(function(){return g}):g("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(g){(function(c){var g=c.addEvent,t=c.defined,x=c.Color,u=c.seriesTypes.column,y=c.correctFloat,v=c.isNumber,r=c.isObject,p=c.merge,n=c.pick,z=c.seriesType,A=c.Axis,f=c.Point,B=c.Series;z("xrange","column",{colorByPoint:!0,dataLabels:{verticalAlign:"middle",inside:!0,formatter:function(){var a=this.point.partialFill;
-r(a)&&(a=a.amount);t(a)||(a=0);return y(100*a)+"%"}},tooltip:{headerFormat:'\x3cspan style\x3d"font-size: 10px"\x3e{point.x} - {point.x2}\x3c/span\x3e\x3cbr/\x3e',pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.yCategory}\x3c/b\x3e\x3cbr/\x3e'},borderRadius:3,pointRange:0},{type:"xrange",parallelArrays:["x","x2","y"],requireSorting:!1,animate:c.seriesTypes.line.prototype.animate,cropShoulder:1,getExtremesFromAll:!0,autoIncrement:c.noop,getColumnMetrics:function(){function a(){d.series.forEach(function(a){var b=
-a.xAxis;a.xAxis=a.yAxis;a.yAxis=b})}var b,d=this.chart;a();b=u.prototype.getColumnMetrics.call(this);a();return b},cropData:function(a,b,d,e){b=B.prototype.cropData.call(this,this.x2Data,b,d,e);b.xData=a.slice(b.start,b.end);return b},translatePoint:function(a){var b=this.xAxis,d=this.yAxis,e=this.columnMetrics,l=this.options,c=l.minPointLength||0,m=a.plotX,k=n(a.x2,a.x+(a.len||0)),h=b.translate(k,0,0,0,1),k=Math.abs(h-m),w=this.chart.inverted,g=n(l.borderWidth,1)%2/2,q=e.offset,f=Math.round(e.width);
-c&&(c-=k,0>c&&(c=0),m-=c/2,h+=c/2);m=Math.max(m,-10);h=Math.min(Math.max(h,-10),b.len+10);t(a.options.pointWidth)&&(q-=(Math.ceil(a.options.pointWidth)-f)/2,f=Math.ceil(a.options.pointWidth));l.pointPlacement&&v(a.plotY)&&d.categories&&(a.plotY=d.translate(a.y,0,1,0,1,l.pointPlacement));a.shapeArgs={x:Math.floor(Math.min(m,h))+g,y:Math.floor(a.plotY+q)+g,width:Math.round(Math.abs(h-m)),height:f,r:this.options.borderRadius};d=a.shapeArgs.x;l=d+a.shapeArgs.width;0>d||l>b.len?(d=Math.min(b.len,Math.max(0,
-d)),l=Math.max(0,Math.min(l,b.len)),b=l-d,a.dlBox=p(a.shapeArgs,{x:d,width:l-d,centerX:b?b/2:null})):a.dlBox=null;a.tooltipPos[0]+=w?0:k/2;a.tooltipPos[1]-=w?-k/2:e.width/2;if(b=a.partialFill)r(b)&&(b=b.amount),v(b)||(b=0),e=a.shapeArgs,a.partShapeArgs={x:e.x,y:e.y,width:e.width,height:e.height,r:this.options.borderRadius},a.clipRectArgs={x:e.x,y:e.y,width:Math.max(Math.round(k*b+(a.plotX-m)),0),height:e.height}},translate:function(){u.prototype.translate.apply(this,arguments);this.points.forEach(function(a){this.translatePoint(a)},
-this)},drawPoint:function(a,b){var d=this.options,e=this.chart.renderer,c=a.graphic,g=a.shapeType,m=a.shapeArgs,k=a.partShapeArgs,h=a.clipRectArgs,f=a.partialFill,n=a.selected&&"select",q=d.stacking&&!d.borderRadius;if(a.isNull)c&&(a.graphic=c.destroy());else{if(c)a.graphicOriginal[b](p(m));else a.graphic=c=e.g("point").addClass(a.getClassName()).add(a.group||this.group),a.graphicOriginal=e[g](m).addClass(a.getClassName()).addClass("highcharts-partfill-original").add(c);k&&(a.graphicOverlay?(a.graphicOverlay[b](p(k)),
-a.clipRect.animate(p(h))):(a.clipRect=e.clipRect(h.x,h.y,h.width,h.height),a.graphicOverlay=e[g](k).addClass("highcharts-partfill-overlay").add(c).clip(a.clipRect)));this.chart.styledMode||(a.graphicOriginal.attr(this.pointAttribs(a,n)).shadow(d.shadow,null,q),k&&(r(f)||(f={}),r(d.partialFill)&&(f=p(f,d.partialFill)),b=f.fill||x(a.color||this.color).brighten(-.3).get(),a.graphicOverlay.attr(this.pointAttribs(a,n)).attr({fill:b}).shadow(d.shadow,null,q)))}},drawPoints:function(){var a=this,b=a.getAnimationVerb();
-a.points.forEach(function(d){a.drawPoint(d,b)})},getAnimationVerb:function(){return this.chart.pointCount<(this.options.animationLimit||250)?"animate":"attr"}},{applyOptions:function(){var a,b=f.prototype.applyOptions.apply(this,arguments),d=b.series;if(d.options.colorByPoint&&!b.options.color){a=d.options.colors||d.chart.options.colors;var c=b.y%(a?a.length:d.chart.options.chart.colorCount);a=a&&a[c];d.chart.styledMode||(b.color=a);b.options.colorIndex||(b.colorIndex=c)}return b},init:function(){f.prototype.init.apply(this,
-arguments);this.y||(this.y=0);return this},setState:function(){f.prototype.setState.apply(this,arguments);this.series.drawPoint(this,this.series.getAnimationVerb())},getLabelConfig:function(){var a=f.prototype.getLabelConfig.call(this),b=this.series.yAxis.categories;a.x2=this.x2;a.yCategory=this.yCategory=b&&b[this.y];return a},tooltipDateKeys:["x","x2"],isValid:function(){return"number"===typeof this.x&&"number"===typeof this.x2}});g(A,"afterGetSeriesExtremes",function(){var a=this.series,b,c;this.isXAxis&&
-(b=n(this.dataMax,-Number.MAX_VALUE),a.forEach(function(a){a.x2Data&&a.x2Data.forEach(function(a){a>b&&(b=a,c=!0)})}),c&&(this.dataMax=b))})})(g)});
-//# sourceMappingURL=xrange.js.map
-</script>
-<script>/*
-  Highcharts JS v7.0.1 (2018-12-19)
- Tilemap module
-
- (c) 2010-2018 Highsoft AS
-
- License: www.highcharts.com/license
-*/
-(function(k){"object"===typeof module&&module.exports?module.exports=k:"function"===typeof define&&define.amd?define(function(){return k}):k("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(k){(function(d){var k=d.defined,v=d.noop,e=d.seriesTypes;d.colorPointMixin={isValid:function(){return null!==this.value&&Infinity!==this.value&&-Infinity!==this.value},setVisible:function(d){var a=this,b=d?"show":"hide";a.visible=!!d;["graphic","dataLabel"].forEach(function(c){if(a[c])a[c][b]()})},
-setState:function(e){d.Point.prototype.setState.call(this,e);this.graphic&&this.graphic.attr({zIndex:"hover"===e?1:0})}};d.colorSeriesMixin={pointArrayMap:["value"],axisTypes:["xAxis","yAxis","colorAxis"],optionalAxis:"colorAxis",trackerGroups:["group","markerGroup","dataLabelsGroup"],getSymbol:v,parallelArrays:["x","y","value"],colorKey:"value",pointAttribs:e.column.prototype.pointAttribs,translateColors:function(){var d=this,a=this.options.nullColor,b=this.colorAxis,c=this.colorKey;this.data.forEach(function(f){var g=
-f[c];if(g=f.options.color||(f.isNull?a:b&&void 0!==g?b.toColor(g,f):f.color||d.color))f.color=g})},colorAttribs:function(d){var a={};k(d.color)&&(a[this.colorProp||"fill"]=d.color);return a}}})(k);(function(d){var k=d.colorPointMixin,v=d.merge,e=d.noop,r=d.pick,a=d.Series,b=d.seriesType,c=d.seriesTypes;b("heatmap","scatter",{animation:!1,borderWidth:0,nullColor:"#f7f7f7",dataLabels:{formatter:function(){return this.point.value},inside:!0,verticalAlign:"middle",crop:!1,overflow:!1,padding:0},marker:null,
-pointRange:null,tooltip:{pointFormat:"{point.x}, {point.y}: {point.value}\x3cbr/\x3e"},states:{hover:{halo:!1,brightness:.2}}},v(d.colorSeriesMixin,{pointArrayMap:["y","value"],hasPointSpecificOptions:!0,getExtremesFromAll:!0,directTouch:!0,init:function(){var b;c.scatter.prototype.init.apply(this,arguments);b=this.options;b.pointRange=r(b.pointRange,b.colsize||1);this.yAxis.axisPointRange=b.rowsize||1},translate:function(){var b=this.options,a=this.xAxis,c=this.yAxis,d=b.pointPadding||0,l=function(b,
-a,c){return Math.min(Math.max(a,b),c)};this.generatePoints();this.points.forEach(function(g){var f=(b.colsize||1)/2,e=(b.rowsize||1)/2,u=l(Math.round(a.len-a.translate(g.x-f,0,1,0,1)),-a.len,2*a.len),f=l(Math.round(a.len-a.translate(g.x+f,0,1,0,1)),-a.len,2*a.len),m=l(Math.round(c.translate(g.y-e,0,1,0,1)),-c.len,2*c.len),e=l(Math.round(c.translate(g.y+e,0,1,0,1)),-c.len,2*c.len),h=r(g.pointPadding,d);g.plotX=g.clientX=(u+f)/2;g.plotY=(m+e)/2;g.shapeType="rect";g.shapeArgs={x:Math.min(u,f)+h,y:Math.min(m,
-e)+h,width:Math.abs(f-u)-2*h,height:Math.abs(e-m)-2*h}});this.translateColors()},drawPoints:function(){var b=this.chart.styledMode?"css":"attr";c.column.prototype.drawPoints.call(this);this.points.forEach(function(a){a.graphic[b](this.colorAttribs(a))},this)},animate:e,getBox:e,drawLegendSymbol:d.LegendSymbolMixin.drawRectangle,alignDataLabel:c.column.prototype.alignDataLabel,getExtremes:function(){a.prototype.getExtremes.call(this,this.valueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;
-a.prototype.getExtremes.call(this)}}),d.extend({haloPath:function(b){if(!b)return[];var a=this.shapeArgs;return["M",a.x-b,a.y-b,"L",a.x-b,a.y+a.height+b,a.x+a.width+b,a.y+a.height+b,a.x+a.width+b,a.y-b,"Z"]}},k))})(k);(function(d){var k=d.seriesType,v=d.pick,e=function(a,b,c){return Math.min(Math.max(b,a),c)},r=function(a,b,c){a=a.options;return{xPad:(a.colsize||1)/-b,yPad:(a.rowsize||1)/-c}};d.tileShapeTypes={hexagon:{alignDataLabel:d.seriesTypes.scatter.prototype.alignDataLabel,getSeriesPadding:function(a){return r(a,
-3,2)},haloPath:function(a){if(!a)return[];var b=this.tileEdges;return["M",b.x2-a,b.y1+a,"L",b.x3+a,b.y1+a,b.x4+1.5*a,b.y2,b.x3+a,b.y3-a,b.x2-a,b.y3-a,b.x1-1.5*a,b.y2,"Z"]},translate:function(){var a=this.options,b=this.xAxis,c=this.yAxis,d=a.pointPadding||0,g=(a.colsize||1)/3,k=(a.rowsize||1)/2,q;this.generatePoints();this.points.forEach(function(a){var l=e(Math.floor(b.len-b.translate(a.x-2*g,0,1,0,1)),-b.len,2*b.len),f=e(Math.floor(b.len-b.translate(a.x-g,0,1,0,1)),-b.len,2*b.len),t=e(Math.floor(b.len-
-b.translate(a.x+g,0,1,0,1)),-b.len,2*b.len),u=e(Math.floor(b.len-b.translate(a.x+2*g,0,1,0,1)),-b.len,2*b.len),m=e(Math.floor(c.translate(a.y-k,0,1,0,1)),-c.len,2*c.len),h=e(Math.floor(c.translate(a.y,0,1,0,1)),-c.len,2*c.len),n=e(Math.floor(c.translate(a.y+k,0,1,0,1)),-c.len,2*c.len),p=v(a.pointPadding,d),w=p*Math.abs(f-l)/Math.abs(n-h),w=b.reversed?-w:w,r=b.reversed?-p:p,p=c.reversed?-p:p;a.x%2&&(q=q||Math.round(Math.abs(n-m)/2)*(c.reversed?-1:1),m+=q,h+=q,n+=q);a.plotX=a.clientX=(f+t)/2;a.plotY=
-h;l+=w+r;f+=r;t-=r;u-=w+r;m-=p;n+=p;a.tileEdges={x1:l,x2:f,x3:t,x4:u,y1:m,y2:h,y3:n};a.shapeType="path";a.shapeArgs={d:["M",f,m,"L",t,m,u,h,t,n,f,n,l,h,"Z"]}});this.translateColors()}},diamond:{alignDataLabel:d.seriesTypes.scatter.prototype.alignDataLabel,getSeriesPadding:function(a){return r(a,2,2)},haloPath:function(a){if(!a)return[];var b=this.tileEdges;return["M",b.x2,b.y1+a,"L",b.x3+a,b.y2,b.x2,b.y3-a,b.x1-a,b.y2,"Z"]},translate:function(){var a=this.options,b=this.xAxis,c=this.yAxis,d=a.pointPadding||
-0,g=a.colsize||1,k=(a.rowsize||1)/2,q;this.generatePoints();this.points.forEach(function(a){var f=e(Math.round(b.len-b.translate(a.x-g,0,1,0,0)),-b.len,2*b.len),l=e(Math.round(b.len-b.translate(a.x,0,1,0,0)),-b.len,2*b.len),t=e(Math.round(b.len-b.translate(a.x+g,0,1,0,0)),-b.len,2*b.len),u=e(Math.round(c.translate(a.y-k,0,1,0,0)),-c.len,2*c.len),m=e(Math.round(c.translate(a.y,0,1,0,0)),-c.len,2*c.len),h=e(Math.round(c.translate(a.y+k,0,1,0,0)),-c.len,2*c.len),n=v(a.pointPadding,d),p=n*Math.abs(l-
-f)/Math.abs(h-m),p=b.reversed?-p:p,n=c.reversed?-n:n;a.x%2&&(q=Math.abs(h-u)/2*(c.reversed?-1:1),u+=q,m+=q,h+=q);a.plotX=a.clientX=l;a.plotY=m;f+=p;t-=p;u-=n;h+=n;a.tileEdges={x1:f,x2:l,x3:t,y1:u,y2:m,y3:h};a.shapeType="path";a.shapeArgs={d:["M",l,u,"L",t,m,l,h,f,m,"Z"]}});this.translateColors()}},circle:{alignDataLabel:d.seriesTypes.scatter.prototype.alignDataLabel,getSeriesPadding:function(a){return r(a,2,2)},haloPath:function(a){return d.seriesTypes.scatter.prototype.pointClass.prototype.haloPath.call(this,
-a+(a&&this.radius))},translate:function(){var a=this.options,b=this.xAxis,c=this.yAxis,d=a.pointPadding||0,g=(a.rowsize||1)/2,k=a.colsize||1,q,l,r,v,t=!1;this.generatePoints();this.points.forEach(function(a){var f=e(Math.round(b.len-b.translate(a.x,0,1,0,0)),-b.len,2*b.len),h=e(Math.round(c.translate(a.y,0,1,0,0)),-c.len,2*c.len),n=d,p=!1;void 0!==a.pointPadding&&(n=a.pointPadding,t=p=!0);if(!v||t)q=Math.abs(e(Math.floor(b.len-b.translate(a.x+k,0,1,0,0)),-b.len,2*b.len)-f),l=Math.abs(e(Math.floor(c.translate(a.y+
-g,0,1,0,0)),-c.len,2*c.len)-h),r=Math.floor(Math.sqrt(q*q+l*l)/2),v=Math.min(q,r,l)-n,t&&!p&&(t=!1);a.x%2&&(h+=l*(c.reversed?-1:1));a.plotX=a.clientX=f;a.plotY=h;a.radius=v;a.shapeType="circle";a.shapeArgs={x:f,y:h,r:v}});this.translateColors()}},square:{alignDataLabel:d.seriesTypes.heatmap.prototype.alignDataLabel,translate:d.seriesTypes.heatmap.prototype.translate,getSeriesPadding:function(){},haloPath:d.seriesTypes.heatmap.prototype.pointClass.prototype.haloPath}};d.wrap(d.Axis.prototype,"setAxisTranslation",
-function(a){a.apply(this,Array.prototype.slice.call(arguments,1));var b=this,c=b.series.map(function(a){return a.getSeriesPixelPadding&&a.getSeriesPixelPadding(b)}).reduce(function(a,b){return(a&&a.padding)>(b&&b.padding)?a:b},void 0)||{padding:0,axisLengthFactor:1},d=Math.round(c.padding*c.axisLengthFactor);c.padding&&(b.len-=d,a.apply(b,Array.prototype.slice.call(arguments,1)),b.minPixelPadding+=c.padding,b.len+=d)});k("tilemap","heatmap",{states:{hover:{halo:{enabled:!0,size:2,opacity:.5,attributes:{zIndex:3}}}},
-pointPadding:2,tileShape:"hexagon"},{setOptions:function(){var a=d.seriesTypes.heatmap.prototype.setOptions.apply(this,Array.prototype.slice.call(arguments));this.tileShape=d.tileShapeTypes[a.tileShape];return a},alignDataLabel:function(){return this.tileShape.alignDataLabel.apply(this,Array.prototype.slice.call(arguments))},getSeriesPixelPadding:function(a){var b=a.isXAxis,c=this.tileShape.getSeriesPadding(this),d;if(!c)return{padding:0,axisLengthFactor:1};d=Math.round(a.translate(b?2*c.xPad:c.yPad,
-0,1,0,1));a=Math.round(a.translate(b?c.xPad:0,0,1,0,1));return{padding:Math.abs(d-a)||0,axisLengthFactor:b?2:1.1}},translate:function(){return this.tileShape.translate.apply(this,Array.prototype.slice.call(arguments))}},d.extend({haloPath:function(){return this.series.tileShape.haloPath.apply(this,Array.prototype.slice.call(arguments))}},d.colorPointMixin))})(k)});
-//# sourceMappingURL=tilemap.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
-
- (c) 2017-2018 Highsoft AS
- Authors: Jon Arild Nygard
-
- License: www.highcharts.com/license
-*/
-(function(n){"object"===typeof module&&module.exports?module.exports=n:"function"===typeof define&&define.amd?define(function(){return n}):n("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(n){var A=function(){return function(f){var h=this,e=h.graphic,t=f.animatableAttribs,m=f.onComplete,w=f.css,u=f.renderer;h.shouldDraw()?(e||(h.graphic=e=u[f.shapeType](f.shapeArgs).add(f.group)),e.css(w).attr(f.attribs).animate(t,f.isNew?!1:void 0,m)):e&&e.animate(t,void 0,function(){h.graphic=e=e.destroy();
-"function"===typeof m&&m()});e&&e.addClass(h.getClassName(),!0)}}(),x=function(){return{getAngleBetweenPoints:function(f,h){return Math.atan2(h.x-f.x,h.y-f.y)},getCenterOfPoints:function(f){var h=f.reduce(function(e,f){e.x+=f.x;e.y+=f.y;return e},{x:0,y:0});return{x:h.x/f.length,y:h.y/f.length}},getDistanceBetweenPoints:function(f,h){return Math.sqrt(Math.pow(h.x-f.x,2)+Math.pow(h.y-f.y,2))}}}(),B=function(f){var h=f.getAngleBetweenPoints,e=f.getCenterOfPoints,t=f.getDistanceBetweenPoints,m=function(l,
-a){a=Math.pow(10,a);return Math.round(l*a)/a},w=function(l,a){var p=t(l,a),k=l.r,f=a.r,e=[];if(p<k+f&&p>Math.abs(k-f)){var k=k*k,h=(k-f*f+p*p)/(2*p),f=Math.sqrt(k-h*h),k=l.x,e=a.x;l=l.y;var y=a.y;a=k+h*(e-k)/p;h=l+h*(y-l)/p;l=f/p*-(y-l);p=f/p*-(e-k);e=[{x:m(a+l,14),y:m(h-p,14)},{x:m(a-l,14),y:m(h+p,14)}]}return e},u=function(f){return f.reduce(function(a,f,k,l){l=l.slice(k+1).reduce(function(a,l,p){var e=[k,p+k+1];return a.concat(w(f,l).map(function(a){a.indexes=e;return a}))},[]);return a.concat(l)},
-[])},n=function(f,a){return t(f,a)<=a.r+1e-10},z=function(f,a){return!a.some(function(a){return!n(f,a)})};return{getAreaOfIntersectionBetweenCircles:function(f){var a=u(f).filter(function(a){return z(a,f)}),p;if(1<a.length){var k=e(a),a=a.map(function(a){a.angle=h(k,a);return a}).sort(function(a,f){return f.angle-a.angle}),l=a[a.length-1],a=a.reduce(function(a,k){var p=a.startPoint,l=e([p,k]),m=k.indexes.filter(function(a){return-1<p.indexes.indexOf(a)}).reduce(function(a,e){e=f[e];var m=h(e,k),n=
-h(e,p),m=n-(n-m+(n<m?2*Math.PI:0))/2,m=t(l,{x:e.x+e.r*Math.sin(m),y:e.y+e.r*Math.cos(m)});e=e.r;m>2*e&&(m=2*e);if(!a||a.width>m)a={r:e,largeArc:m>e?1:0,width:m,x:k.x,y:k.y};return a},null);if(m){var n=m.r;a.arcs.push(["A",n,n,0,m.largeArc,1,m.x,m.y]);a.startPoint=k}return a},{startPoint:l,arcs:[]}).arcs;0!==a.length&&1!==a.length&&(a.unshift(["M",l.x,l.y]),p={center:k,d:a})}return p},getCircleCircleIntersection:w,getCirclesIntersectionPoints:u,getOverlapBetweenCircles:function(f,a,e){var k=0;if(e<
-f+a){var k=f*f,l=a*a;if(e<=Math.abs(a-f))k=Math.PI*Math.min(k,l);else{e=(k-l+e*e)/(2*e);var h=Math.sqrt(k-e*e),k=k*Math.asin(h/f)+l*Math.asin(h/a)-h*(e+Math.sqrt(e*e+l-k))}k=m(k,14)}return k},isPointInsideCircle:n,isPointInsideAllCircles:z,isPointOutsideAllCircles:function(e,a){return!a.some(function(a){return n(e,a)})},round:m}}(x);(function(f,h,e,n){var m=n.Color,t=n.extend,u=e.getAreaOfIntersectionBetweenCircles,x=e.getCircleCircleIntersection,z=h.getCenterOfPoints,l=h.getDistanceBetweenPoints,
-a=e.getOverlapBetweenCircles,p=n.isArray,k=n.isNumber,D=n.isObject,A=e.isPointInsideAllCircles,B=e.isPointOutsideAllCircles,y=n.isString,L=n.merge,M=e.round,P=n.seriesType,N=function(d){return Object.keys(d).map(function(b){return d[b]})},O=function(d){var b=0;2===d.length&&(b=d[0],d=d[1],b=a(b.r,d.r,l(b,d)));return b},E=function(d,b){return b.reduce(function(b,g){var c=0;1<g.sets.length&&(c=g.value,g=O(g.sets.map(function(c){return d[c]})),g=c-g,c=Math.round(g*g*1E11)/1E11);return b+c},0)},F=function(d,
-b,q){for(var g=0,c=d.length-1,a=Math.floor((g+c)/2),e;(e=q(d[a],b))!==b&&g<c;)b<e?c=a-1:g=a+1,a=Math.floor((g+c)/2);return e===b?a:-1},Q=function(d,b,q){var g=q||1;return Array.apply(0,Array(Math.round((d+b)/g))).map(function(d,b){return b*g})},C=function(d,b,q){var g=Q(0,d+b,.001),c=F(g,0,function(c){c=a(d,b,c);c=q-c;return.01>Math.abs(c)?0:c});return M(g[c],14)},v=function(d){return p(d.sets)&&1===d.sets.length},R=function(d,b){var q=function(c,d){return c.fx-d.fx},g=function(c,d,b,g){return d.map(function(d,
-a){return c*d+b*g[a]})},c=function(c,b){b.fx=d(b);c[c.length-1]=b;return c},a=function(c){var b=c[0];return c.map(function(c){c=g(.5,b,.5,c);c.fx=d(c);return c})},e=function(c){for(var d=c.slice(0,-1).length,b=[],g=function(c,d){c.sum+=d[c.i];return c},a=0;a<d;a++)b[a]=c.reduce(g,{sum:0,i:a}).sum/d;return b},f=function(c,b,a,q){c=g(a,c,q,b);c.fx=d(c);return c};b=function(c){var b=c.length,a=Array(b+1);a[0]=c;a[0].fx=d(c);for(var g=0;g<b;++g){var q=c.slice();q[g]=q[g]?1.05*q[g]:.001;q.fx=d(q);a[g+
-1]=q}return a}(b);for(var k=0;100>k;k++){b.sort(q);var r=b[b.length-1],h=e(b),l=f(h,r,2,-1);l.fx<b[0].fx?(r=f(h,r,3,-2),b=c(b,r.fx<l.fx?r:l)):l.fx>=b[b.length-2].fx?l.fx>r.fx?(h=f(h,r,.5,.5),b=h.fx<r.fx?c(b,h):a(b)):(h=f(h,r,1.5,-.5),b=h.fx<l.fx?c(b,h):a(b)):b=c(b,l)}return b[0]},G=function(d,b,a){b=b.reduce(function(b,c){c=c.r-l(d,c);return c<=b?c:b},Number.MAX_VALUE);return b=a.reduce(function(b,c){c=l(d,c)-c.r;return c<=b?c:b},b)},S=function(d,b){var a=d.reduce(function(a,c){var g=c.r/2;return[{x:c.x,
-y:c.y},{x:c.x+g,y:c.y},{x:c.x-g,y:c.y},{x:c.x,y:c.y+g},{x:c.x,y:c.y-g}].reduce(function(c,a){var g=G(a,d,b);c.margin<g&&(c.point=a,c.margin=g);return c},a)},{point:void 0,margin:-Number.MAX_VALUE}).point,a=R(function(a){return-G({x:a[0],y:a[1]},d,b)},[a.x,a.y]),a={x:a[0],y:a[1]};A(a,d)&&B(a,b)||(a=z(d));return a},T=function(a){var b=a.filter(v);return a.reduce(function(a,d){if(d.value){var c=d.sets;d=c.join();var g=b.reduce(function(a,b){var d=-1<c.indexOf(b.sets[0]);a[d?"internal":"external"].push(b.circle);
-return a},{internal:[],external:[]});a[d]=S(g.internal,g.external)}return a},{})},H=function(a){var b=a.filter(function(a){return 2===a.sets.length}).reduce(function(a,b){b.sets.forEach(function(c,d,g){D(a[c])||(a[c]={overlapping:{},totalOverlap:0});a[c].totalOverlap+=b.value;a[c].overlapping[g[1-d]]=b.value});return a},{});a.filter(v).forEach(function(a){t(a,b[a.sets[0]])});return a},I=function(a,b){return b.totalOverlap-a.totalOverlap},U=function(a){var b=[],d={};a.filter(function(a){return 1===
-a.sets.length}).forEach(function(a){d[a.sets[0]]=a.circle={x:Number.MAX_VALUE,y:Number.MAX_VALUE,r:Math.sqrt(a.value/Math.PI)}});var g=function(a,c){var d=a.circle;d.x=c.x;d.y=c.y;b.push(a)};H(a);var c=a.filter(v).sort(I);g(c.pop(),{x:0,y:0});var e=a.filter(function(a){return 2===a.sets.length});c.forEach(function(a){var c=a.circle,f=c.r,q=a.overlapping,k=b.reduce(function(a,g,k){var h=g.circle;g=C(f,h.r,q[g.sets[0]]);var l=[{x:h.x+g,y:h.y},{x:h.x-g,y:h.y},{x:h.x,y:h.y+g},{x:h.x,y:h.y-g}];b.slice(k+
-1).forEach(function(a){var c=a.circle;a=C(f,c.r,q[a.sets[0]]);l=l.concat(x({x:h.x,y:h.y,r:a},{x:c.x,y:c.y,r:a}))});l.forEach(function(b){c.x=b.x;c.y=b.y;var g=E(d,e);g<a.loss&&(a.loss=g,a.coordinates=b)});return a},{loss:Number.MAX_VALUE,coordinates:void 0});g(a,k.coordinates)});return d},V=function(a){var b={};0<a.length&&(b=U(a),a.filter(function(a){return!v(a)}).forEach(function(a){var d=a.sets;a=d.join();d=d.map(function(a){return b[a]});b[a]=u(d)}));return b},J=function(a){var b={};return D(a)&&
-k(a.value)&&-1<a.value&&p(a.sets)&&0<a.sets.length&&!a.sets.some(function(a){var d=!1;!b[a]&&y(a)?b[a]=!0:d=!0;return d})},K=function(a){a=p(a)?a:[];var b=a.reduce(function(a,c){J(c)&&v(c)&&0<c.value&&-1===a.indexOf(c.sets[0])&&a.push(c.sets[0]);return a},[]).sort(),d=a.reduce(function(a,c){J(c)&&!c.sets.some(function(a){return-1===b.indexOf(a)})&&(a[c.sets.sort().join()]=c);return a},{});b.reduce(function(a,c,b,d){d.slice(b+1).forEach(function(b){a.push(c+","+b)});return a},[]).forEach(function(a){if(!d[a]){var c=
-{sets:a.split(","),value:0};d[a]=c}});return N(d)},W=function(a,b,e){var d=e.bottom-e.top,c=e.right-e.left,d=Math.min(0<c?1/c*a:1,0<d?1/d*b:1);return{scale:d,centerX:a/2-(e.right+e.left)/2*d,centerY:b/2-(e.top+e.bottom)/2*d}};P("venn","scatter",{borderColor:"#cccccc",borderDashStyle:"solid",borderWidth:1,brighten:0,clip:!1,colorByPoint:!0,dataLabels:{enabled:!0,formatter:function(){return this.point.name}},marker:!1,opacity:.75,showInLegend:!1,states:{hover:{opacity:1,halo:!1,borderColor:"#333333"},
-select:{color:"#cccccc",borderColor:"#000000",animation:!1}},tooltip:{pointFormat:"{point.name}: {point.value}"}},{isCartesian:!1,axisTypes:[],directTouch:!0,translate:function(){var a=this.chart;this.processedXData=this.xData;this.generatePoints();var b=K(this.options.data),e=V(b),g=T(b),b=Object.keys(e).filter(function(a){return(a=e[a])&&k(a.r)}).reduce(function(a,c){var b=e[c];c=b.x-b.r;var d=b.x+b.r,f=b.y+b.r,b=b.y-b.r;if(!k(a.left)||a.left>c)a.left=c;if(!k(a.right)||a.right<d)a.right=d;if(!k(a.top)||
-a.top>b)a.top=b;if(!k(a.bottom)||a.bottom<f)a.bottom=f;return a},{top:0,bottom:0,left:0,right:0}),a=W(a.plotWidth,a.plotHeight,b),c=a.scale,f=a.centerX,h=a.centerY;this.points.forEach(function(a){var b=p(a.sets)?a.sets:[],d=b.join(),k=e[d],l,d=g[d];k&&(k.r?l={x:f+k.x*c,y:h+k.y*c,r:k.r*c}:k.d&&(l={d:k.d.reduce(function(a,b){"M"===b[0]?(b[1]=f+b[1]*c,b[2]=h+b[2]*c):"A"===b[0]&&(b[1]*=c,b[2]*=c,b[6]=f+b[6]*c,b[7]=h+b[7]*c);return a.concat(b)},[]).join(" ")}),d?(d.x=f+d.x*c,d.y=h+d.y*c):d={});a.shapeArgs=
-l;d&&l&&(a.plotX=d.x,a.plotY=d.y);a.name=a.options.name||b.join("\u2229")})},drawPoints:function(){var a=this,b=a.chart,e=a.group,f=b.renderer;(a.points||[]).forEach(function(c){var d,g=c.shapeArgs;b.styledMode||(d=a.pointAttribs(c,c.state));c.draw({isNew:!c.graphic,animatableAttribs:g,attribs:d,group:e,renderer:f,shapeType:g&&g.d?"path":"circle"})})},pointAttribs:function(a,b){var d=this.options||{};a=L(d,{color:a&&a.color},a&&a.options||{},b&&d.states[b]||{});return{fill:m(a.color).setOpacity(a.opacity).brighten(a.brightness).get(),
-stroke:a.borderColor,"stroke-width":a.borderWidth,dashstyle:a.borderDashStyle}},animate:function(a){if(!a){var b=n.animObject(this.options.animation);this.points.forEach(function(a){var d=a.shapeArgs;if(a.graphic&&d){var c={},e={};d.d?c.opacity=.001:(c.r=0,e.r=d.r);a.graphic.attr(c).animate(e,b);d.d&&setTimeout(function(){a&&a.graphic&&a.graphic.animate({opacity:1})},b.duration)}},this);this.animate=null}},utils:{addOverlapToSets:H,binarySearch:F,geometry:h,geometryCircles:e,getDistanceBetweenCirclesByOverlap:C,
-loss:E,processVennData:K,sortByTotalOverlap:I}},{draw:f,shouldDraw:function(){return!!this.shapeArgs},isValid:function(){return k(this.value)}})})(A,x,B,n)});
-//# sourceMappingURL=venn.js.map
-</script>
-<script>/*
- Highcharts JS v7.0.1 (2018-12-19)
- Gantt series
-
- (c) 2016-2018 Lars A. V. Cabrera
-
- License: www.highcharts.com/license
-*/
-(function(C){"object"===typeof module&&module.exports?module.exports=C:"function"===typeof define&&define.amd?define(function(){return C}):C("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(C){(function(c){var v=c.addEvent,x=c.PlotLineOrBand,k=c.merge,m={currentDateIndicator:!0,color:"#ccd6eb",width:2,label:{format:"%a, %b %d %Y, %H:%M",formatter:void 0,rotation:0,style:{fontSize:"10px"}}};v(c.Axis,"afterSetOptions",function(){var c=this.options,q=c.currentDateIndicator;q&&("object"===
-typeof q?(q.label&&q.label.format&&(q.label.formatter=void 0),q=k(m,q)):q=k(m),q.value=new Date,c.plotLines||(c.plotLines=[]),c.plotLines.push(q))});v(x,"render",function(){var k=this.options,q,n;k.currentDateIndicator&&k.label&&(q=k.label.format,n=k.label.formatter,k.value=new Date,k.label.text="function"===typeof n?n(this):c.dateFormat(q,new Date),this.label&&this.label.attr({text:k.label.text}))})})(C);(function(c){var v=function(a){return Array.prototype.slice.call(a,1)},x=c.dateFormat,k=c.defined,
-m=c.isArray,t=c.isNumber,q=function(a){return c.isObject(a,!0)},n=c.merge,B=c.pick,a=c.wrap,g=c.Axis,f=c.Tick,A={top:0,right:1,bottom:2,left:3,0:"top",1:"right",2:"bottom",3:"left"};g.prototype.isNavigatorAxis=function(){return/highcharts-navigator-[xy]axis/.test(this.options.className)};g.prototype.isOuterAxis=function(){var a=this,e=-1,b=!0;a.chart.axes.forEach(function(d,h){d.side!==a.side||d.isNavigatorAxis()||(d===a?e=h:0<=e&&h>e&&(b=!1))});return b};g.prototype.getMaxLabelDimensions=function(a,
-e){var b={width:0,height:0};e.forEach(function(d){d=a[d];var e;q(d)&&(e=q(d.label)?d.label:{},d=e.getBBox?e.getBBox().height:0,e=t(e.textPxLength)?e.textPxLength:0,b.height=Math.max(d,b.height),b.width=Math.max(e,b.width))});return b};c.dateFormats={W:function(a){a=new Date(a);var e;a.setHours(0,0,0,0);a.setDate(a.getDate()-(a.getDay()||7));e=new Date(a.getFullYear(),0,1);return Math.ceil(((a-e)/864E5+1)/7)},E:function(a){return x("%a",a,!0).charAt(0)}};a(g.prototype,"autoLabelAlign",function(a){return this.chart.isStock?
-"left":a.apply(this,v(arguments))});a(f.prototype,"getLabelPosition",function(a,e,b,d,h,l,f,c){var r=this.axis,w=r.reversed,u=r.chart,p=r.options,z=p&&q(p.grid)?p.grid:{},p=l.align,g=A[r.side],y=r.tickPositions,I=this.pos-f,J=t(y[c+1])?y[c+1]-f:r.max+f,G=r.tickSize("tick",!0),y=m(G)?G[0]:0,G=G&&G[1]/2,n;!0===z.enabled?("top"===g?(z=r.top+r.offset,n=z-y):"bottom"===g?(n=u.chartHeight-r.bottom+r.offset,z=n+y):(z=r.top+r.len-r.translate(w?J:I),n=r.top+r.len-r.translate(w?I:J)),"right"===g?(g=u.chartWidth-
-r.right+r.offset,w=g+y):"left"===g?(w=r.left+r.offset,g=w-y):(g=Math.round(r.left+r.translate(w?J:I))-G,w=Math.round(r.left+r.translate(w?I:J))-G),this.slotWidth=w-g,w={x:"left"===p?g:"right"===p?w:g+(w-g)/2,y:n+(z-n)/2},u=u.renderer.fontMetrics(l.style.fontSize,d.element),p=d.getBBox().height,l.useHTML?w.y+=u.b+-(p/2):(p=Math.round(p/u.h),w.y+=(u.b-(u.h-u.f))/2+-((p-1)*u.h/2)),w.x+=r.horiz&&l.x||0):w=a.apply(this,v(arguments));return w});a(g.prototype,"tickSize",function(a){var e=this.maxLabelDimensions,
-b=this.options,d=b&&q(b.grid)?b.grid:{},b=a.apply(this,v(arguments));!0===d.enabled&&(d=2*Math.abs(this.defaultLeftAxisOptions.labels.x),e=d+(this.horiz?e.height:e.width),m(b)?b[0]=e:b=[e]);return b});a(g.prototype,"getTitlePosition",function(a){var e=this.options;if(!0===(e&&q(e.grid)?e.grid:{}).enabled){var b=this.axisTitle,d=b&&b.getBBox().width,h=this.horiz,l=this.left,r=this.top,f=this.width,c=this.height,u=e.title,e=this.opposite,g=this.offset,p=this.tickSize()||[0],F=u.x||0,D=u.y||0,y=B(u.margin,
-h?5:10),b=this.chart.renderer.fontMetrics(u.style&&u.style.fontSize,b).f,p=(h?r+c:l)+p[0]/2*(e?-1:1)*(h?1:-1)+(this.side===A.bottom?b:0);return{x:h?l-d/2-y+F:p+(e?f:0)+g+F,y:h?p-(e?c:0)+(e?b:-b)/2+g+D:r-y+D}}return a.apply(this,v(arguments))});a(g.prototype,"unsquish",function(a){var e=this.options;return!0===(e&&q(e.grid)?e.grid:{}).enabled&&this.categories?this.tickInterval:a.apply(this,v(arguments))});c.addEvent(g,"afterSetOptions",function(a){var e=this.options;a=a.userOptions;var b,d=e&&q(e.grid)?
-e.grid:{};!0===d.enabled&&(b=n(!0,{className:"highcharts-grid-axis "+(a.className||""),dateTimeLabelFormats:{hour:{list:["%H:%M","%H"]},day:{list:["%A, %e. %B","%a, %e. %b","%E"]},week:{list:["Week %W","W%W"]},month:{list:["%B","%b","%o"]}},grid:{borderWidth:1},labels:{padding:2,style:{fontSize:"13px"}},title:{text:null,reserveSpace:!1,rotation:0},units:[["millisecond",[1,10,100]],["second",[1,10]],["minute",[1,5,15]],["hour",[1,6]],["day",[1]],["week",[1]],["month",[1]],["year",null]]},a),"xAxis"===
-this.coll&&(k(a.linkedTo)&&!k(a.tickPixelInterval)&&(b.tickPixelInterval=350),k(a.tickPixelInterval)||!k(a.linkedTo)||k(a.tickPositioner)||k(a.tickInterval)||(b.tickPositioner=function(d,e){var a=this.linkedParent&&this.linkedParent.tickPositions&&this.linkedParent.tickPositions.info;if(a){var h,l,f,g,p=b.units;for(g=0;g<p.length;g++)if(p[g][0]===a.unitName){h=g;break}if(p[h][1])return p[h+1]&&(f=p[h+1][0],l=(p[h+1][1]||[1])[0]),a=c.timeUnits[f],this.tickInterval=a*l,this.getTimeTicks({unitRange:a,
-count:l,unitName:f},d,e,this.options.startOfWeek)}})),n(!0,this.options,b),this.horiz&&(e.minPadding=B(a.minPadding,0),e.maxPadding=B(a.maxPadding,0)),t(e.grid.borderWidth)&&(e.tickWidth=e.lineWidth=d.borderWidth))});a(g.prototype,"setAxisTranslation",function(a){var e=this.options,b=e&&q(e.grid)?e.grid:{},d=this.tickPositions&&this.tickPositions.info,h=this.userOptions.labels||{};this.horiz&&(!0===b.enabled&&this.series.forEach(function(b){b.options.pointRange=0}),d&&(!1===e.dateTimeLabelFormats[d.unitName].range||
-1<d.count)&&!k(h.align)&&(e.labels.align="left",k(h.x)||(e.labels.x=3)));a.apply(this,v(arguments))});a(g.prototype,"trimTicks",function(a){var e=this.options,b=e&&q(e.grid)?e.grid:{},d=this.categories,h=this.tickPositions,l=h[0],f=h[h.length-1],c=this.linkedParent&&this.linkedParent.min||this.min,g=this.linkedParent&&this.linkedParent.max||this.max,u=this.tickInterval,A=l>c,p=f<g,l=l<c&&l+u>c,f=f>g&&f-u<g;!0!==b.enabled||d||!this.horiz&&!this.isLinked||(!A&&!l||e.startOnTick||(h[0]=c),!p&&!f||e.endOnTick||
-(h[h.length-1]=g));a.apply(this,v(arguments))});a(g.prototype,"render",function(a){var e=this.options,b=e&&q(e.grid)?e.grid:{},d,h,l,f,c,g=this.chart.renderer,w=this.horiz;if(!0===b.enabled){if(b=2*Math.abs(this.defaultLeftAxisOptions.labels.x),this.maxLabelDimensions=this.getMaxLabelDimensions(this.ticks,this.tickPositions),b=this.maxLabelDimensions.width+b,d=e.lineWidth,this.rightWall&&this.rightWall.destroy(),a.apply(this),a=this.axisGroup.getBBox(),this.isOuterAxis()&&this.axisLine&&(w&&(b=a.height-
-1),d)){a=this.getLinePath(d);f=a.indexOf("M")+1;c=a.indexOf("L")+1;h=a.indexOf("M")+2;l=a.indexOf("L")+2;if(this.side===A.top||this.side===A.left)b=-b;w?(a[h]+=b,a[l]+=b):(a[f]+=b,a[c]+=b);this.axisLineExtra?this.axisLineExtra.animate({d:a}):this.axisLineExtra=g.path(a).attr({stroke:e.lineColor,"stroke-width":d,zIndex:7}).addClass("highcharts-axis-line").add(this.axisGroup);this.axisLine[this.showAxis?"show":"hide"](!0)}}else a.apply(this)});a(g.prototype,"init",function(f,e,b){function d(b){var a=
-b.options,d=25/11,e=b.chart.renderer.fontMetrics(a.labels.style.fontSize);a.labels||(a.labels={});a.labels.align=B(a.labels.align,"center");b.categories||(a.showLastLabel=!1);b.horiz&&(a.tickLength=h.cellHeight||e.h*d);b.labelRotation=0;a.labels.rotation=0}var h=b&&q(b.grid)?b.grid:{},l,r,z;if(h.enabled)if(k(h.borderColor)&&(b.tickColor=b.lineColor=h.borderColor),m(h.columns))for(r=0,z=h.columns.length;z--;)l=n(b,h.columns[z],{type:"category"}),delete l.grid.columns,l=new g(e,l),l.isColumn=!0,l.columnIndex=
-r,a(l,"labelFormatter",function(b){var a=this.axis,d=a.tickPositions,e=this.value,h=e===d[0],d=e===d[d.length-1],f=c.find(a.series[0].options.data,function(b){return b[a.isXAxis?"x":"y"]===e});this.isFirst=h;this.isLast=d;this.point=f;return b.call(this)}),r++;else f.apply(this,v(arguments)),d(this);else f.apply(this,v(arguments))})})(C);(function(c){var v=c.Chart,x=c.pick;c.addEvent(c.Axis,"afterSetOptions",function(){this.horiz||!c.isNumber(this.options.staticScale)||this.chart.options.chart.height||
-(this.staticScale=this.options.staticScale)});v.prototype.adjustHeight=function(){"adjustHeight"!==this.redrawTrigger&&((this.axes||[]).forEach(function(k){var m=k.chart,v=!!m.initiatedScale&&m.options.animation,q=k.options.staticScale,n;k.staticScale&&c.defined(k.min)&&(n=x(k.unitLength,k.max+k.tickInterval-k.min)*q,n=Math.max(n,q),q=n-m.plotHeight,1<=Math.abs(q)&&(m.plotHeight=n,m.redrawTrigger="adjustHeight",m.setSize(void 0,m.chartHeight+q,v)),k.series.forEach(function(c){(c=c.sharedClipKey&&
-m[c.sharedClipKey])&&c.attr({height:m.plotHeight})}))}),this.initiatedScale=!0);this.redrawTrigger=null};c.addEvent(v,"render",v.prototype.adjustHeight)})(C);var K=function(c){var v=c.extend,x=c.isNumber,k=c.pick,m=function(c,n){var q=c.reduce(function(a,c){var f=k(c.parent,"");void 0===a[f]&&(a[f]=[]);a[f].push(c);return a},{});Object.keys(q).forEach(function(a,c){var f=q[a];""!==a&&-1===n.indexOf(a)&&(f.forEach(function(a){c[""].push(a)}),delete c[a])});return q},t=function(c,n,m,a,g,f){var A=0,
-u=0,e=f&&f.after,b=f&&f.before;n={data:a,depth:m-1,id:c,level:m,parent:n};var d,h;"function"===typeof b&&b(n,f);b=(g[c]||[]).map(function(b){var a=t(b.id,c,m+1,b,g,f),e=b.start;b=!0===b.milestone?e:b.end;d=!x(d)||e<d?e:d;h=!x(h)||b>h?b:h;A=A+1+a.descendants;u=Math.max(a.height+1,u);return a});a&&(a.start=k(a.start,d),a.end=k(a.end,h));v(n,{children:b,descendants:A,height:u});"function"===typeof e&&e(n,f);return n};return{getListOfParents:m,getNode:t,getTree:function(c,n){var k=c.map(function(a){return a.id});
-c=m(c,k);return t("",null,1,null,c,n)}}}(C),L=function(c){var v=c.extend,x=c.isArray,k=c.isObject,m=c.isNumber,t=c.merge,q=c.pick;return{getColor:function(n,k){var a=k.index,g=k.mapOptionsToLevel,f=k.parentColor,A=k.parentColorIndex,u=k.series,e=k.colors,b=k.siblings,d=u.points,h=u.chart.options.chart,l,r,z,E;if(n){d=d[n.i];n=g[n.level]||{};if(g=d&&n.colorByPoint)r=d.index%(e?e.length:h.colorCount),l=e&&e[r];if(!u.chart.styledMode){e=d&&d.options.color;h=n&&n.color;if(z=f)z=(z=n&&n.colorVariation)&&
-"brightness"===z.key?c.color(f).brighten(a/b*z.to).get():f;z=q(e,h,l,z,u.color)}E=q(d&&d.options.colorIndex,n&&n.colorIndex,r,A,k.colorIndex)}return{color:z,colorIndex:E}},getLevelOptions:function(c){var n=null,a,g,f,A;if(k(c))for(n={},f=m(c.from)?c.from:1,A=c.levels,g={},a=k(c.defaults)?c.defaults:{},x(A)&&(g=A.reduce(function(c,e){var b,d;k(e)&&m(e.level)&&(d=t({},e),b="boolean"===typeof d.levelIsConstant?d.levelIsConstant:a.levelIsConstant,delete d.levelIsConstant,delete d.level,e=e.level+(b?0:
-f-1),k(c[e])?v(c[e],d):c[e]=d);return c},{})),A=m(c.to)?c.to:1,c=0;c<=A;c++)n[c]=t({},a,k(g[c])?g[c]:{});return n},setTreeValues:function B(a,c){var f=c.before,g=c.idRoot,u=c.mapIdToNode[g],e=c.points[a.i],b=e&&e.options||{},d=0,h=[];v(a,{levelDynamic:a.level-(("boolean"===typeof c.levelIsConstant?c.levelIsConstant:1)?0:u.level),name:q(e&&e.name,""),visible:g===a.id||("boolean"===typeof c.visible?c.visible:!1)});"function"===typeof f&&(a=f(a,c));a.children.forEach(function(b,e){var f=v({},c);v(f,
-{index:e,siblings:a.children.length,visible:a.visible});b=B(b,f);h.push(b);b.visible&&(d+=b.val)});a.visible=0<d||a.visible;f=q(b.value,d);v(a,{children:h,childrenTotal:d,isLeaf:a.visible&&!d,val:f});return a},updateRootId:function(c){var a;k(c)&&(a=k(c.options)?c.options:{},a=q(c.rootNode,a.rootId,""),k(c.userOptions)&&(c.userOptions.rootId=a),c.rootNode=a);return a}}}(C);(function(c){function v(){return Array.prototype.slice.call(arguments,1)}function x(a){a.apply(this);this.drawBreaks(this.xAxis,
-["x"]);this.drawBreaks(this.yAxis,m(this.pointArrayMap,["y"]))}var k=c.addEvent,m=c.pick,t=c.wrap,q=c.extend,n=c.isArray,B=c.fireEvent,a=c.Axis,g=c.Series;q(a.prototype,{isInBreak:function(a,c){var f=a.repeat||Infinity,e=a.from,b=a.to-a.from;c=c>=e?(c-e)%f:f-(e-c)%f;return a.inclusive?c<=b:c<b&&0!==c},isInAnyBreak:function(a,c){var f=this.options.breaks,e=f&&f.length,b,d,h;if(e){for(;e--;)this.isInBreak(f[e],a)&&(b=!0,d||(d=m(f[e].showPoints,this.isXAxis?!1:!0)));h=b&&c?b&&!d:b}return h}});k(a,"afterInit",
-function(){"function"===typeof this.setBreaks&&this.setBreaks(this.options.breaks,!1)});k(a,"afterSetTickPositions",function(){if(this.isBroken){var a=this.tickPositions,c=this.tickPositions.info,g=[],e;for(e=0;e<a.length;e++)this.isInAnyBreak(a[e])||g.push(a[e]);this.tickPositions=g;this.tickPositions.info=c}});k(a,"afterSetOptions",function(){this.isBroken&&(this.options.ordinal=!1)});a.prototype.setBreaks=function(c,g){function f(a){var d=a,e,c;for(c=0;c<b.breakArray.length;c++)if(e=b.breakArray[c],
-e.to<=a)d-=e.len;else if(e.from>=a)break;else if(b.isInBreak(e,a)){d-=a-e.from;break}return d}function e(a){var d,e;for(e=0;e<b.breakArray.length&&!(d=b.breakArray[e],d.from>=a);e++)d.to<a?a+=d.len:b.isInBreak(d,a)&&(a+=d.len);return a}var b=this,d=n(c)&&!!c.length;b.isDirty=b.isBroken!==d;b.isBroken=d;b.options.breaks=b.userOptions.breaks=c;b.forceRedraw=!0;d||b.val2lin!==f||(delete b.val2lin,delete b.lin2val);d&&(b.userOptions.ordinal=!1,b.val2lin=f,b.lin2val=e,b.setExtremes=function(b,d,e,c,f){if(this.isBroken){for(;this.isInAnyBreak(b);)b-=
-this.closestPointRange;for(;this.isInAnyBreak(d);)d-=this.closestPointRange}a.prototype.setExtremes.call(this,b,d,e,c,f)},b.setAxisTranslation=function(d){a.prototype.setAxisTranslation.call(this,d);this.unitLength=null;if(this.isBroken){d=b.options.breaks;var e=[],c=[],h=0,f,g,k=b.userMin||b.min,p=b.userMax||b.max,F=m(b.pointRangePadding,0),D,y;d.forEach(function(a){g=a.repeat||Infinity;b.isInBreak(a,k)&&(k+=a.to%g-k%g);b.isInBreak(a,p)&&(p-=p%g-a.from%g)});d.forEach(function(b){D=b.from;for(g=b.repeat||
-Infinity;D-g>k;)D-=g;for(;D<k;)D+=g;for(y=D;y<p;y+=g)e.push({value:y,move:"in"}),e.push({value:y+(b.to-b.from),move:"out",size:b.breakSize})});e.sort(function(b,a){return b.value===a.value?("in"===b.move?0:1)-("in"===a.move?0:1):b.value-a.value});f=0;D=k;e.forEach(function(b){f+="in"===b.move?1:-1;1===f&&"in"===b.move&&(D=b.value);0===f&&(c.push({from:D,to:b.value,len:b.value-D-(b.size||0)}),h+=b.value-D-(b.size||0))});b.breakArray=c;b.unitLength=p-k-h+F;B(b,"afterBreaks");b.staticScale?b.transA=
-b.staticScale:b.unitLength&&(b.transA*=(p-b.min+F)/b.unitLength);F&&(b.minPixelPadding=b.transA*b.minPointOffset);b.min=k;b.max=p}});m(g,!0)&&this.chart.redraw()};t(g.prototype,"generatePoints",function(a){a.apply(this,v(arguments));var c=this.xAxis,f=this.yAxis,e=this.points,b,d=e.length,h=this.options.connectNulls,g;if(c&&f&&(c.options.breaks||f.options.breaks))for(;d--;)b=e[d],g=null===b.y&&!1===h,g||!c.isInAnyBreak(b.x,!0)&&!f.isInAnyBreak(b.y,!0)||(e.splice(d,1),this.data[d]&&this.data[d].destroyElements())});
-c.Series.prototype.drawBreaks=function(a,c){var f=this,e=f.points,b,d,h,g;a&&c.forEach(function(c){b=a.breakArray||[];d=a.isXAxis?a.min:m(f.options.threshold,a.min);e.forEach(function(e){g=m(e["stack"+c.toUpperCase()],e[c]);b.forEach(function(b){h=!1;if(d<b.from&&g>b.to||d>b.from&&g<b.from)h="pointBreak";else if(d<b.from&&g>b.from&&g<b.to||d>b.from&&g>b.to&&g<b.from)h="pointInBreak";h&&B(a,h,{point:e,brk:b})})})})};c.Series.prototype.gappedPath=function(){var a=this.currentDataGrouping,g=a&&a.totalRange,
-a=this.options.gapSize,k=this.points.slice(),e=k.length-1,b=this.yAxis;if(a&&0<e)for("value"!==this.options.gapUnit&&(a*=this.closestPointRange),g&&g>a&&(a=g);e--;)k[e+1].x-k[e].x>a&&(g=(k[e].x+k[e+1].x)/2,k.splice(e+1,0,{isNull:!0,x:g}),this.options.stacking&&(g=b.stacks[this.stackKey][g]=new c.StackItem(b,b.options.stackLabels,!1,g,this.stack),g.total=0));return this.getGraphPath(k)};t(c.seriesTypes.column.prototype,"drawPoints",x);t(c.Series.prototype,"drawPoints",x)})(C);(function(c,v,x){var k=
-function(b){return Array.prototype.slice.call(b,1)},m=c.defined,t=c.extend,q=c.find,n=c.fireEvent,B=x.getLevelOptions,a=c.merge,g=c.isNumber,f=function(b){return c.isObject(b,!0)},A=c.isString,u=c.pick,e=c.wrap;x=c.Axis;var b=c.Tick,d=function(b,a){var d,c;for(d in a)a.hasOwnProperty(d)&&(c=a[d],e(b,d,c))},h=function(b,a){var d=b.collapseStart;b=b.collapseEnd;b>=a&&(d-=.5);return{from:d,to:b,showPoints:!1}},l=function(b){return Object.keys(b.mapOfPosToGridNode).reduce(function(a,d){d=+d;b.min<=d&&
-b.max>=d&&!b.isInAnyBreak(d)&&a.push(d);return a},[])},r=function(b,a){var d=b.options.breaks||[],e=h(a,b.max);return d.some(function(b){return b.from===e.from&&b.to===e.to})},z=function(b,a){var d=b.options.breaks||[];b=h(a,b.max);d.push(b);return d},E=function(b,a){var d=b.options.breaks||[],e=h(a,b.max);return d.reduce(function(b,a){a.to===e.to&&a.from===e.from||b.push(a);return b},[])},w=function(b,a){var d=b.labelIcon,e=!d,h=a.renderer,g=a.xy,f=a.options,l=f.width,r=f.height,p=g.x-l/2-f.padding,
-g=g.y-r/2,k=a.collapsed?90:180,w=a.show&&c.isNumber(g);e&&(b.labelIcon=d=h.path(h.symbols[f.type](f.x,f.y,l,r)).addClass("highcharts-label-icon").add(a.group));w||d.attr({y:-9999});h.styledMode||d.attr({"stroke-width":1,fill:u(a.color,"#666666")}).css({cursor:"pointer",stroke:f.lineColor,strokeWidth:f.lineWidth});d[e?"attr":"animate"]({translateX:p,translateY:g,rotation:k})},H=function(b,a,d){var e=[],c=[],h={},g={},l=-1,r="boolean"===typeof a?a:!1;b=v.getTree(b,{after:function(b){b=g[b.pos];var a=
-0,d=0;b.children.forEach(function(b){d+=b.descendants+1;a=Math.max(b.height+1,a)});b.descendants=d;b.height=a;b.collapsed&&c.push(b)},before:function(b){var a=f(b.data)?b.data:{},d=A(a.name)?a.name:"",c=h[b.parent],c=f(c)?g[c.pos]:null,p=function(b){return b.name===d},k;r&&f(c)&&(k=q(c.children,p))?(p=k.pos,k.nodes.push(b)):p=l++;g[p]||(g[p]=k={depth:c?c.depth+1:0,name:d,nodes:[b],children:[],pos:p},-1!==p&&e.push(d),f(c)&&c.children.push(k));A(b.id)&&(h[b.id]=b);!0===a.collapsed&&(k.collapsed=!0);
-b.pos=p}});g=function(b,a){var d=function(b,e,c){var h=e+(-1===e?0:a-1),g=(h-e)/2,l=e+g;b.nodes.forEach(function(b){var a=b.data;f(a)&&(a.y=e+a.seriesIndex,delete a.seriesIndex);b.pos=l});c[l]=b;b.pos=l;b.tickmarkOffset=g+.5;b.collapseStart=h+.5;b.children.forEach(function(b){d(b,h+1,c);h=b.collapseEnd-.5});b.collapseEnd=h+.5;return c};return d(b["-1"],-1,{})}(g,d);return{categories:e,mapOfIdToNode:h,mapOfPosToGridNode:g,collapsedNodes:c,tree:b}};d(x.prototype,{init:function(b,d,e){var h=this,g,f=
-"treegrid"===e.type;f&&(e=a({grid:{enabled:!0},labels:{align:"left",levels:[{level:void 0},{level:1,style:{fontWeight:"bold"}}],symbol:{type:"triangle",x:-5,y:-5,height:10,width:10,padding:5}},uniqueNames:!1},e,{reversed:!0,grid:{columns:void 0}}));b.apply(h,[d,e]);f&&(c.addEvent(h.chart,"beforeRender",function(){var b=h.options&&h.options.labels;h.updateYNames();h.series.forEach(function(b){b.yData=b.options.data.map(function(b){return b.y})});h.mapOptionsToLevel=B({defaults:b,from:1,levels:b.levels,
-to:h.tree.height});g=c.addEvent(h,"foundExtremes",function(){h.collapsedNodes.forEach(function(b){b=z(h,b);h.setBreaks(b,!1)});g()})}),h.hasNames=!0,h.options.showLastLabel=!0)},getMaxLabelDimensions:function(b){var a=this.options,d=a&&a.labels,a=d&&g(d.indentation)?a.labels.indentation:0,d=b.apply(this,k(arguments)),e;"treegrid"===this.options.type&&(e=this.mapOfPosToGridNode[-1].height,d.width+=a*(e-1));return d},generateTick:function(a,d){var e=f(this.mapOptionsToLevel)?this.mapOptionsToLevel:
-{},c=this.ticks,h=c[d],g,l;"treegrid"===this.options.type?(l=this.mapOfPosToGridNode[d],(e=e[l.depth])&&(g={labels:e}),h?(h.parameters.category=l.name,h.options=g,h.addLabel()):c[d]=new b(this,d,null,void 0,{category:l.name,tickmarkOffset:l.tickmarkOffset,options:g})):a.apply(this,k(arguments))},setTickInterval:function(b){var a=this.options;"treegrid"===a.type?(this.min=u(this.userMin,a.min,this.dataMin),this.max=u(this.userMax,a.max,this.dataMax),n(this,"foundExtremes"),this.setAxisTranslation(!0),
-this.tickmarkOffset=.5,this.tickInterval=1,this.tickPositions=l(this)):b.apply(this,k(arguments))}});d(b.prototype,{getLabelPosition:function(b,a,d,e,c,h,l,r,k){var p=u(this.options&&this.options.labels,h);h=this.pos;var w=this.axis,z="treegrid"===w.options.type;b=b.apply(this,[a,d,e,c,p,l,r,k]);z&&(a=p&&f(p.symbol)?p.symbol:{},p=p&&g(p.indentation)?p.indentation:0,h=(h=(w=w.mapOfPosToGridNode)&&w[h])&&h.depth||1,b.x+=a.width+2*a.padding+(h-1)*p);return b},renderLabel:function(b){var a=this,d=a.pos,
-e=a.axis,h=a.label,g=e.mapOfPosToGridNode,l=e.options,p=u(a.options&&a.options.labels,l&&l.labels),z=p&&f(p.symbol)?p.symbol:{},n=(g=g&&g[d])&&g.depth,l="treegrid"===l.type,A=!(!h||!h.element),q=-1<e.tickPositions.indexOf(d),d=e.chart.styledMode;l&&g&&A&&h.addClass("highcharts-treegrid-node-level-"+n);b.apply(a,k(arguments));l&&g&&A&&0<g.descendants&&(e=r(e,g),w(a,{color:!d&&h.styles.color,collapsed:e,group:h.parentGroup,options:z,renderer:h.renderer,show:q,xy:h.xy}),z="highcharts-treegrid-node-"+
-(e?"expanded":"collapsed"),h.addClass("highcharts-treegrid-node-"+(e?"collapsed":"expanded")).removeClass(z),d||h.css({cursor:"pointer"}),[h,a.labelIcon].forEach(function(b){b.attachedTreeGridEvents||(c.addEvent(b.element,"mouseover",function(){var b=h;b.addClass("highcharts-treegrid-node-active");b.renderer.styledMode||b.css({textDecoration:"underline"})}),c.addEvent(b.element,"mouseout",function(){var b=h,a=p,a=m(a.style)?a.style:{};b.removeClass("highcharts-treegrid-node-active");b.renderer.styledMode||
-b.css({textDecoration:a.textDecoration})}),c.addEvent(b.element,"click",function(){a.toggleCollapse()}),b.attachedTreeGridEvents=!0)}))}});t(b.prototype,{collapse:function(b){var a=this.axis,d=z(a,a.mapOfPosToGridNode[this.pos]);a.setBreaks(d,u(b,!0))},expand:function(b){var a=this.axis,d=E(a,a.mapOfPosToGridNode[this.pos]);a.setBreaks(d,u(b,!0))},toggleCollapse:function(b){var a=this.axis,d;d=a.mapOfPosToGridNode[this.pos];d=r(a,d)?E(a,d):z(a,d);a.setBreaks(d,u(b,!0))}});x.prototype.updateYNames=
-function(){var b=this.options,a=b.uniqueNames,d=!this.isXAxis,e=this.series,c=0;"treegrid"===b.type&&d&&(b=e.reduce(function(b,d){d.visible&&(d.options.data.forEach(function(a){f(a)&&(a.seriesIndex=c,b.push(a))}),!0===a&&c++);return b},[]),b=H(b,a,!0===a?c:1),this.categories=b.categories,this.mapOfPosToGridNode=b.mapOfPosToGridNode,this.collapsedNodes=b.collapsedNodes,this.hasNames=!0,this.tree=b.tree)};x.prototype.utils={getNode:v.getNode}})(C,K,L);K=function(c){function v(a,c,f){f=f||0;var g=a.length-
-1;c-=1e-7;for(var k,e;f<=g;)if(k=g+f>>1,e=c-a[k].xMin,0<e)f=k+1;else if(0>e)g=k-1;else return k;return 0<f?f-1:0}function x(a,c){for(var g=v(a,c.x+1)+1;g--;){var k;if(k=a[g].xMax>=c.x)k=a[g],k=c.x<=k.xMax&&c.x>=k.xMin&&c.y<=k.yMax&&c.y>=k.yMin;if(k)return g}return-1}function k(a){var c=[];if(a.length){c.push("M",a[0].start.x,a[0].start.y);for(var f=0;f<a.length;++f)c.push("L",a[f].end.x,a[f].end.y)}return c}function m(a,c){a.yMin=q(a.yMin,c.yMin);a.yMax=t(a.yMax,c.yMax);a.xMin=q(a.xMin,c.xMin);a.xMax=
-t(a.xMax,c.xMax)}var t=Math.min,q=Math.max,n=Math.abs,B=c.pick;return{straight:function(a,c){return{path:["M",a.x,a.y,"L",c.x,c.y],obstacles:[{start:a,end:c}]}},simpleConnect:c.extend(function(a,c,f){function g(b,a,d,c,e){b={x:b.x,y:b.y};b[a]=d[c||a]+(e||0);return b}function m(b,a,d){var c=n(a[d]-b[d+"Min"])>n(a[d]-b[d+"Max"]);return g(a,d,b,d+(c?"Max":"Min"),c?1:-1)}var e=[],b,d=B(f.startDirectionX,n(c.x-a.x)>n(c.y-a.y))?"x":"y",h=f.chartObstacles,l=x(h,a);f=x(h,c);var r;-1<f?(b=h[f],f=m(b,c,d),
-b={start:f,end:c},r=f):r=c;-1<l&&(h=h[l],f=m(h,a,d),e.push({start:a,end:f}),f[d]>a[d]===f[d]>r[d]&&(d="y"===d?"x":"y",c=a[d]<c[d],e.push({start:f,end:g(f,d,h,d+(c?"Max":"Min"),c?1:-1)}),d="y"===d?"x":"y"));a=e.length?e[e.length-1].end:a;f=g(a,d,r);e.push({start:a,end:f});d=g(f,"y"===d?"x":"y",r);e.push({start:f,end:d});e.push(b);return{path:k(e),obstacles:e}},{requiresObstacles:!0}),fastAvoid:c.extend(function(a,c,f){function g(b,a,d){var c,e,h,g,f,l=b.x<a.x?1:-1;b.x<a.x?(c=b,e=a):(c=a,e=b);b.y<a.y?
-(g=b,h=a):(g=a,h=b);for(f=0>l?t(v(y,e.x),y.length-1):0;y[f]&&(0<l&&y[f].xMin<=e.x||0>l&&y[f].xMax>=c.x);){if(y[f].xMin<=e.x&&y[f].xMax>=c.x&&y[f].yMin<=h.y&&y[f].yMax>=g.y)return d?{y:b.y,x:b.x<a.x?y[f].xMin-1:y[f].xMax+1,obstacle:y[f]}:{x:b.x,y:b.y<a.y?y[f].yMin-1:y[f].yMax+1,obstacle:y[f]};f+=l}return a}function u(b,a,d,c,e){var h=e.soft,f=e.hard,l=c?"x":"y",r={x:a.x,y:a.y},k={x:a.x,y:a.y};e=b[l+"Max"]>=h[l+"Max"];var h=b[l+"Min"]<=h[l+"Min"],w=b[l+"Max"]>=f[l+"Max"],f=b[l+"Min"]<=f[l+"Min"],p=
-n(b[l+"Min"]-a[l]),z=n(b[l+"Max"]-a[l]);d=10>n(p-z)?a[l]<d[l]:z<p;k[l]=b[l+"Min"];r[l]=b[l+"Max"];b=g(a,k,c)[l]!==k[l];a=g(a,r,c)[l]!==r[l];d=b?a?d:!0:a?!1:d;d=h?e?d:!0:e?!1:d;return f?w?d:!0:w?!1:d}function e(b,a,d){if(b.x===a.x&&b.y===a.y)return[];var c=d?"x":"y",h,l,r,k,w=f.obstacleOptions.margin;h={soft:{xMin:H,xMax:p,yMin:F,yMax:D},hard:f.hardBounds};l=x(y,b);-1<l?(l=y[l],h=u(l,b,a,d,h),m(l,f.hardBounds),k=d?{y:b.y,x:l[h?"xMax":"xMin"]+(h?1:-1)}:{x:b.x,y:l[h?"yMax":"yMin"]+(h?1:-1)},r=x(y,k),
--1<r&&(r=y[r],m(r,f.hardBounds),k[c]=h?q(l[c+"Max"]-w+1,(r[c+"Min"]+l[c+"Max"])/2):t(l[c+"Min"]+w-1,(r[c+"Max"]+l[c+"Min"])/2),b.x===k.x&&b.y===k.y?(E&&(k[c]=h?q(l[c+"Max"],r[c+"Max"])+1:t(l[c+"Min"],r[c+"Min"])-1),E=!E):E=!1),b=[{start:b,end:k}]):(c=g(b,{x:d?a.x:b.x,y:d?b.y:a.y},d),b=[{start:b,end:{x:c.x,y:c.y}}],c[d?"x":"y"]!==a[d?"x":"y"]&&(h=u(c.obstacle,c,a,!d,h),m(c.obstacle,f.hardBounds),h={x:d?c.x:c.obstacle[h?"xMax":"xMin"]+(h?1:-1),y:d?c.obstacle[h?"yMax":"yMin"]+(h?1:-1):c.y},d=!d,b=b.concat(e({x:c.x,
-y:c.y},h,d))));return b=b.concat(e(b[b.length-1].end,a,!d))}function b(b,a,d){var c=t(b.xMax-a.x,a.x-b.xMin)<t(b.yMax-a.y,a.y-b.yMin);d=u(b,a,d,c,{soft:f.hardBounds,hard:f.hardBounds});return c?{y:a.y,x:b[d?"xMax":"xMin"]+(d?1:-1)}:{x:a.x,y:b[d?"yMax":"yMin"]+(d?1:-1)}}var d=B(f.startDirectionX,n(c.x-a.x)>n(c.y-a.y)),h=d?"x":"y",l,r,z=[],E=!1,w=f.obstacleMetrics,H=t(a.x,c.x)-w.maxWidth-10,p=q(a.x,c.x)+w.maxWidth+10,F=t(a.y,c.y)-w.maxHeight-10,D=q(a.y,c.y)+w.maxHeight+10,y=f.chartObstacles;l=v(y,H);
-w=v(y,p);y=y.slice(l,w+1);-1<(w=x(y,c))&&(r=b(y[w],c,a),z.push({end:c,start:r}),c=r);for(;-1<(w=x(y,c));)l=0>c[h]-a[h],r={x:c.x,y:c.y},r[h]=y[w][l?h+"Max":h+"Min"]+(l?1:-1),z.push({end:c,start:r}),c=r;a=e(a,c,d);a=a.concat(z.reverse());return{path:k(a),obstacles:a}},{requiresObstacles:!0})}}(C);(function(c){c.SVGRenderer.prototype.symbols.arrow=function(c,x,k,m){return["M",c,x+m/2,"L",c+k,x,"L",c,x+m/2,"L",c+k,x+m]};c.SVGRenderer.prototype.symbols["arrow-half"]=function(v,x,k,m){return c.SVGRenderer.prototype.symbols.arrow(v,
-x,k/2,m)};c.SVGRenderer.prototype.symbols["triangle-left"]=function(c,x,k,m){return["M",c+k,x,"L",c,x+m/2,"L",c+k,x+m,"Z"]};c.SVGRenderer.prototype.symbols["arrow-filled"]=c.SVGRenderer.prototype.symbols["triangle-left"];c.SVGRenderer.prototype.symbols["triangle-left-half"]=function(v,x,k,m){return c.SVGRenderer.prototype.symbols["triangle-left"](v,x,k/2,m)};c.SVGRenderer.prototype.symbols["arrow-filled-half"]=c.SVGRenderer.prototype.symbols["triangle-left-half"]})(C);(function(c,v){function x(b){var a=
-b.shapeArgs;return a?{xMin:a.x,xMax:a.x+a.width,yMin:a.y,yMax:a.y+a.height}:(a=b.graphic&&b.graphic.getBBox())?{xMin:b.plotX-a.width/2,xMax:b.plotX+a.width/2,yMin:b.plotY-a.height/2,yMax:b.plotY+a.height/2}:null}function k(b){for(var a=b.length,c=0,f,g,k=[],n=function(b,a,c){c=A(c,10);var d=b.yMax+c>a.yMin-c&&b.yMin-c<a.yMax+c,h=b.xMax+c>a.xMin-c&&b.xMin-c<a.xMax+c,f=d?b.xMin>a.xMax?b.xMin-a.xMax:a.xMin-b.xMax:Infinity,l=h?b.yMin>a.yMax?b.yMin-a.yMax:a.yMin-b.yMax:Infinity;return h&&d?c?n(b,a,Math.floor(c/
-2)):Infinity:e(f,l)};c<a;++c)for(f=c+1;f<a;++f)g=n(b[c],b[f]),80>g&&k.push(g);k.push(80);return u(Math.floor(k.sort(function(b,a){return b-a})[Math.floor(k.length/10)]/2-1),1)}function m(b,a,c){this.init(b,a,c)}function t(b){this.init(b)}function q(b){if(b.options.pathfinder||b.series.reduce(function(b,a){a.options&&f(!0,a.options.connectors=a.options.connectors||{},a.options.pathfinder);return b||a.options&&a.options.pathfinder},!1))f(!0,b.options.connectors=b.options.connectors||{},b.options.pathfinder),
-c.error('WARNING: Pathfinder options have been renamed. Use "chart.connectors" or "series.connectors" instead.')}var n=c.defined,B=c.deg2rad,a=c.extend,g=c.addEvent,f=c.merge,A=c.pick,u=Math.max,e=Math.min;a(c.defaultOptions,{connectors:{type:"straight",lineWidth:1,marker:{enabled:!1,align:"center",verticalAlign:"middle",inside:!1,lineWidth:1},startMarker:{symbol:"diamond"},endMarker:{symbol:"arrow-filled"}}});m.prototype={init:function(b,a,c){this.fromPoint=b;this.toPoint=a;this.options=c;this.chart=
-b.series.chart;this.pathfinder=this.chart.pathfinder},renderPath:function(b,a,c){var d=this.chart,e=d.styledMode,h=d.pathfinder,f=!d.options.chart.forExport&&!1!==c,g=this.graphics&&this.graphics.path;h.group||(h.group=d.renderer.g().addClass("highcharts-pathfinder-group").attr({zIndex:-1}).add(d.seriesGroup));h.group.translate(d.plotLeft,d.plotTop);g&&g.renderer||(g=d.renderer.path().add(h.group),e||g.attr({opacity:0}));g.attr(a);b={d:b};e||(b.opacity=1);g[f?"animate":"attr"](b,c);this.graphics=
-this.graphics||{};this.graphics.path=g},addMarker:function(b,a,c){var d=this.fromPoint.series.chart,e=d.pathfinder,d=d.renderer,h="start"===b?this.fromPoint:this.toPoint,f=h.getPathfinderAnchorPoint(a),g,k;a.enabled&&(c="start"===b?{x:c[4],y:c[5]}:{x:c[c.length-5],y:c[c.length-4]},c=h.getRadiansToVector(c,f),f=h.getMarkerVector(c,a.radius,f),c=-c/B,a.width&&a.height?(g=a.width,k=a.height):g=k=2*a.radius,this.graphics=this.graphics||{},f={x:f.x-g/2,y:f.y-k/2,width:g,height:k,rotation:c,rotationOriginX:f.x,
-rotationOriginY:f.y},this.graphics[b]?this.graphics[b].animate(f):(this.graphics[b]=d.symbol(a.symbol).addClass("highcharts-point-connecting-path-"+b+"-marker").attr(f).add(e.group),d.styledMode||this.graphics[b].attr({fill:a.color||this.fromPoint.color,stroke:a.lineColor,"stroke-width":a.lineWidth,opacity:0}).animate({opacity:1},h.series.options.animation)))},getPath:function(b){var a=this.pathfinder,e=this.chart,g=a.algorithms[b.type],k=a.chartObstacles;if("function"!==typeof g)c.error('"'+b.type+
-'" is not a Pathfinder algorithm.');else return g.requiresObstacles&&!k&&(k=a.chartObstacles=a.getChartObstacles(b),e.options.connectors.algorithmMargin=b.algorithmMargin,a.chartObstacleMetrics=a.getObstacleMetrics(k)),g(this.fromPoint.getPathfinderAnchorPoint(b.startMarker),this.toPoint.getPathfinderAnchorPoint(b.endMarker),f({chartObstacles:k,lineObstacles:a.lineObstacles||[],obstacleMetrics:a.chartObstacleMetrics,hardBounds:{xMin:0,xMax:e.plotWidth,yMin:0,yMax:e.plotHeight},obstacleOptions:{margin:b.algorithmMargin},
-startDirectionX:a.getAlgorithmStartDirection(b.startMarker)},b))},render:function(){var b=this.fromPoint,a=b.series,c=a.chart,g=c.pathfinder,k=f(c.options.connectors,a.options.connectors,b.options.connectors,this.options),z={};c.styledMode||(z.stroke=k.lineColor||b.color,z["stroke-width"]=k.lineWidth,k.dashStyle&&(z.dashstyle=k.dashStyle));z.class="highcharts-point-connecting-path highcharts-color-"+b.colorIndex;k=f(z,k);n(k.marker.radius)||(k.marker.radius=e(u(Math.ceil((k.algorithmMargin||8)/2)-
-1,1),5));b=this.getPath(k);c=b.path;b.obstacles&&(g.lineObstacles=g.lineObstacles||[],g.lineObstacles=g.lineObstacles.concat(b.obstacles));this.renderPath(c,z,a.options.animation);this.addMarker("start",f(k.marker,k.startMarker),c);this.addMarker("end",f(k.marker,k.endMarker),c)},destroy:function(){this.graphics&&(c.objectEach(this.graphics,function(b){b.destroy()}),delete this.graphics)}};t.prototype={algorithms:v,init:function(b){this.chart=b;this.connections=[];g(b,"redraw",function(){this.pathfinder.update()})},
-update:function(b){var a=this.chart,e=this,f=e.connections;e.connections=[];a.series.forEach(function(b){b.visible&&b.points.forEach(function(b){var d,h=b.options&&b.options.connect&&c.splat(b.options.connect);b.visible&&!1!==b.isInside&&h&&h.forEach(function(h){d=a.get("string"===typeof h?h:h.to);d instanceof c.Point&&d.series.visible&&d.visible&&!1!==d.isInside&&e.connections.push(new m(b,d,"string"===typeof h?{}:h))})})});for(var g=0,k,n,w=f.length,q=e.connections.length;g<w;++g){n=!1;for(k=0;k<
-q;++k)if(f[g].fromPoint===e.connections[k].fromPoint&&f[g].toPoint===e.connections[k].toPoint){e.connections[k].graphics=f[g].graphics;n=!0;break}n||f[g].destroy()}delete this.chartObstacles;delete this.lineObstacles;e.renderConnections(b)},renderConnections:function(b){b?this.chart.series.forEach(function(b){var a=function(){var a=b.chart.pathfinder;(a&&a.connections||[]).forEach(function(a){a.fromPoint&&a.fromPoint.series===b&&a.render()});b.pathfinderRemoveRenderEvent&&(b.pathfinderRemoveRenderEvent(),
-delete b.pathfinderRemoveRenderEvent)};!1===b.options.animation?a():b.pathfinderRemoveRenderEvent=g(b,"afterAnimate",a)}):this.connections.forEach(function(b){b.render()})},getChartObstacles:function(b){for(var a=[],c=this.chart.series,e=A(b.algorithmMargin,0),f,g=0,m=c.length;g<m;++g)if(c[g].visible)for(var w=0,q=c[g].points.length,p;w<q;++w)p=c[g].points[w],p.visible&&(p=x(p))&&a.push({xMin:p.xMin-e,xMax:p.xMax+e,yMin:p.yMin-e,yMax:p.yMax+e});a=a.sort(function(b,a){return b.xMin-a.xMin});n(b.algorithmMargin)||
-(f=b.algorithmMargin=k(a),a.forEach(function(b){b.xMin-=f;b.xMax+=f;b.yMin-=f;b.yMax+=f}));return a},getObstacleMetrics:function(b){for(var a=0,c=0,e,f,g=b.length;g--;)e=b[g].xMax-b[g].xMin,f=b[g].yMax-b[g].yMin,a<e&&(a=e),c<f&&(c=f);return{maxHeight:c,maxWidth:a}},getAlgorithmStartDirection:function(b){var a="top"!==b.verticalAlign&&"bottom"!==b.verticalAlign;return"left"!==b.align&&"right"!==b.align?a?void 0:!1:a?!0:void 0}};c.Connection=m;c.Pathfinder=t;a(c.Point.prototype,{getPathfinderAnchorPoint:function(b){var a=
-x(this),c,e;switch(b.align){case "right":c="xMax";break;case "left":c="xMin"}switch(b.verticalAlign){case "top":e="yMin";break;case "bottom":e="yMax"}return{x:c?a[c]:(a.xMin+a.xMax)/2,y:e?a[e]:(a.yMin+a.yMax)/2}},getRadiansToVector:function(b,a){n(a)||(a=x(this),a={x:(a.xMin+a.xMax)/2,y:(a.yMin+a.yMax)/2});return Math.atan2(a.y-b.y,b.x-a.x)},getMarkerVector:function(b,a,c){for(var e=2*Math.PI,d=x(this),f=d.xMax-d.xMin,g=d.yMax-d.yMin,h=Math.atan2(g,f),k=!1,f=f/2,n=g/2,m=d.xMin+f,d=d.yMin+n,q=m,u=
-d,t={},v=1,A=1;b<-Math.PI;)b+=e;for(;b>Math.PI;)b-=e;e=Math.tan(b);b>-h&&b<=h?(A=-1,k=!0):b>h&&b<=Math.PI-h?A=-1:b>Math.PI-h||b<=-(Math.PI-h)?(v=-1,k=!0):v=-1;k?(q+=v*f,u+=A*f*e):(q+=g/(2*e)*v,u+=A*n);c.x!==m&&(q=c.x);c.y!==d&&(u=c.y);t.x=q+a*Math.cos(b);t.y=u-a*Math.sin(b);return t}});c.Chart.prototype.callbacks.push(function(b){!1!==b.options.connectors.enabled&&(q(b),this.pathfinder=new t(this),this.pathfinder.update(!0))})})(C,K);(function(c){var v=c.addEvent,x=c.defined,k=c.Color,m=c.seriesTypes.column,
-t=c.correctFloat,q=c.isNumber,n=c.isObject,B=c.merge,a=c.pick,g=c.seriesType,f=c.Axis,A=c.Point,u=c.Series;g("xrange","column",{colorByPoint:!0,dataLabels:{verticalAlign:"middle",inside:!0,formatter:function(){var a=this.point.partialFill;n(a)&&(a=a.amount);x(a)||(a=0);return t(100*a)+"%"}},tooltip:{headerFormat:'\x3cspan style\x3d"font-size: 10px"\x3e{point.x} - {point.x2}\x3c/span\x3e\x3cbr/\x3e',pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.yCategory}\x3c/b\x3e\x3cbr/\x3e'},
-borderRadius:3,pointRange:0},{type:"xrange",parallelArrays:["x","x2","y"],requireSorting:!1,animate:c.seriesTypes.line.prototype.animate,cropShoulder:1,getExtremesFromAll:!0,autoIncrement:c.noop,getColumnMetrics:function(){function a(){c.series.forEach(function(b){var a=b.xAxis;b.xAxis=b.yAxis;b.yAxis=a})}var b,c=this.chart;a();b=m.prototype.getColumnMetrics.call(this);a();return b},cropData:function(a,b,c,f){b=u.prototype.cropData.call(this,this.x2Data,b,c,f);b.xData=a.slice(b.start,b.end);return b},
-translatePoint:function(c){var b=this.xAxis,e=this.yAxis,f=this.columnMetrics,g=this.options,k=g.minPointLength||0,m=c.plotX,u=a(c.x2,c.x+(c.len||0)),w=b.translate(u,0,0,0,1),u=Math.abs(w-m),t=this.chart.inverted,p=a(g.borderWidth,1)%2/2,v=f.offset,A=Math.round(f.width);k&&(k-=u,0>k&&(k=0),m-=k/2,w+=k/2);m=Math.max(m,-10);w=Math.min(Math.max(w,-10),b.len+10);x(c.options.pointWidth)&&(v-=(Math.ceil(c.options.pointWidth)-A)/2,A=Math.ceil(c.options.pointWidth));g.pointPlacement&&q(c.plotY)&&e.categories&&
-(c.plotY=e.translate(c.y,0,1,0,1,g.pointPlacement));c.shapeArgs={x:Math.floor(Math.min(m,w))+p,y:Math.floor(c.plotY+v)+p,width:Math.round(Math.abs(w-m)),height:A,r:this.options.borderRadius};e=c.shapeArgs.x;g=e+c.shapeArgs.width;0>e||g>b.len?(e=Math.min(b.len,Math.max(0,e)),g=Math.max(0,Math.min(g,b.len)),b=g-e,c.dlBox=B(c.shapeArgs,{x:e,width:g-e,centerX:b?b/2:null})):c.dlBox=null;c.tooltipPos[0]+=t?0:u/2;c.tooltipPos[1]-=t?-u/2:f.width/2;if(b=c.partialFill)n(b)&&(b=b.amount),q(b)||(b=0),f=c.shapeArgs,
-c.partShapeArgs={x:f.x,y:f.y,width:f.width,height:f.height,r:this.options.borderRadius},c.clipRectArgs={x:f.x,y:f.y,width:Math.max(Math.round(u*b+(c.plotX-m)),0),height:f.height}},translate:function(){m.prototype.translate.apply(this,arguments);this.points.forEach(function(a){this.translatePoint(a)},this)},drawPoint:function(a,b){var c=this.options,e=this.chart.renderer,f=a.graphic,g=a.shapeType,m=a.shapeArgs,u=a.partShapeArgs,q=a.clipRectArgs,t=a.partialFill,p=a.selected&&"select",v=c.stacking&&
-!c.borderRadius;if(a.isNull)f&&(a.graphic=f.destroy());else{if(f)a.graphicOriginal[b](B(m));else a.graphic=f=e.g("point").addClass(a.getClassName()).add(a.group||this.group),a.graphicOriginal=e[g](m).addClass(a.getClassName()).addClass("highcharts-partfill-original").add(f);u&&(a.graphicOverlay?(a.graphicOverlay[b](B(u)),a.clipRect.animate(B(q))):(a.clipRect=e.clipRect(q.x,q.y,q.width,q.height),a.graphicOverlay=e[g](u).addClass("highcharts-partfill-overlay").add(f).clip(a.clipRect)));this.chart.styledMode||
-(a.graphicOriginal.attr(this.pointAttribs(a,p)).shadow(c.shadow,null,v),u&&(n(t)||(t={}),n(c.partialFill)&&(t=B(t,c.partialFill)),b=t.fill||k(a.color||this.color).brighten(-.3).get(),a.graphicOverlay.attr(this.pointAttribs(a,p)).attr({fill:b}).shadow(c.shadow,null,v)))}},drawPoints:function(){var a=this,b=a.getAnimationVerb();a.points.forEach(function(c){a.drawPoint(c,b)})},getAnimationVerb:function(){return this.chart.pointCount<(this.options.animationLimit||250)?"animate":"attr"}},{applyOptions:function(){var a,
-b=A.prototype.applyOptions.apply(this,arguments),c=b.series;if(c.options.colorByPoint&&!b.options.color){a=c.options.colors||c.chart.options.colors;var f=b.y%(a?a.length:c.chart.options.chart.colorCount);a=a&&a[f];c.chart.styledMode||(b.color=a);b.options.colorIndex||(b.colorIndex=f)}return b},init:function(){A.prototype.init.apply(this,arguments);this.y||(this.y=0);return this},setState:function(){A.prototype.setState.apply(this,arguments);this.series.drawPoint(this,this.series.getAnimationVerb())},
-getLabelConfig:function(){var a=A.prototype.getLabelConfig.call(this),b=this.series.yAxis.categories;a.x2=this.x2;a.yCategory=this.yCategory=b&&b[this.y];return a},tooltipDateKeys:["x","x2"],isValid:function(){return"number"===typeof this.x&&"number"===typeof this.x2}});v(f,"afterGetSeriesExtremes",function(){var c=this.series,b,d;this.isXAxis&&(b=a(this.dataMax,-Number.MAX_VALUE),c.forEach(function(a){a.x2Data&&a.x2Data.forEach(function(a){a>b&&(b=a,d=!0)})}),d&&(this.dataMax=b))})})(C);(function(c){var v=
-c.dateFormat,x=c.isObject,k=c.isNumber,m=c.merge,t=c.pick,q=c.seriesType,n=c.stop,B=c.seriesTypes.xrange;q("gantt","xrange",{grouping:!1,dataLabels:{enabled:!0,formatter:function(){var a=this.point.partialFill;x(a)&&(a=a.amount);if(k(a)&&0<a)return 100*a+"%"}},tooltip:{headerFormat:'\x3cspan style\x3d"font-size: 10px"\x3e{series.name}\x3c/span\x3e\x3cbr/\x3e',pointFormat:null,pointFormatter:function(){var a=this.series,g=a.chart.tooltip,f=a.xAxis,k=f.options.dateTimeLabelFormats,n=f.options.startOfWeek,
-e=a.tooltipOptions,b=e.xDateFormat,d=this.end?this.end-this.start:0,a=this.options.milestone,f="\x3cb\x3e"+(this.name||this.yCategory)+"\x3c/b\x3e";if(e.pointFormat)return this.tooltipFormatter(e.pointFormat);b||(b=c.splat(g.getDateFormat(d,this.start,n,k))[0]);g=v(b,this.start);k=v(b,this.end);f+="\x3cbr/\x3e";return a?f+("Date "+g+"\x3cbr/\x3e"):f+("Start: "+g+"\x3cbr/\x3e")+("End: "+k+"\x3cbr/\x3e")}},connectors:{type:"simpleConnect",animation:{reversed:!0},startMarker:{enabled:!0,symbol:"arrow-filled",
-radius:4,fill:"#fa0",align:"left"},endMarker:{enabled:!1,align:"right"}}},{pointArrayMap:["start","end","y"],keyboardMoveVertical:!1,translatePoint:function(a){var c,f;B.prototype.translatePoint.call(this,a);a.options.milestone&&(c=a.shapeArgs,f=c.height,a.shapeArgs={x:c.x-f/2,y:c.y,width:f,height:f})},drawPoint:function(a,c){var f=this.options,g=this.chart.renderer,m=a.shapeArgs,e=a.plotY,b=a.graphic,d=a.selected&&"select",h=f.stacking&&!f.borderRadius;a.options.milestone?k(e)&&null!==a.y?(m=g.symbols.diamond(m.x,
-m.y,m.width,m.height),b?(n(b),b[c]({d:m})):a.graphic=g.path(m).addClass(a.getClassName(),!0).add(a.group||this.group),this.chart.styledMode||a.graphic.attr(this.pointAttribs(a,d)).shadow(f.shadow,null,h)):b&&(a.graphic=b.destroy()):B.prototype.drawPoint.call(this,a,c)},setData:c.Series.prototype.setData,setGanttPointAliases:function(a){function c(c,g){void 0!==g&&(a[c]=g)}c("x",t(a.start,a.x));c("x2",t(a.end,a.x2));c("partialFill",t(a.completed,a.partialFill));c("connect",t(a.dependency,a.connect))}},
-m(B.prototype.pointClass.prototype,{applyOptions:function(a,g){a=m(a);c.seriesTypes.gantt.prototype.setGanttPointAliases(a);return a=B.prototype.pointClass.prototype.applyOptions.call(this,a,g)}}))})(C);(function(c){var v=c.merge,x=c.splat,k=c.Chart;c.ganttChart=function(m,t,q){var n="string"===typeof m||m.nodeName,B=t.series,a=c.getOptions(),g,f=t;t=arguments[n?1:0];c.isArray(t.xAxis)||(t.xAxis=[t.xAxis||{},{}]);t.xAxis=t.xAxis.map(function(c,f){1===f&&(g=0);return v(a.xAxis,{grid:{enabled:!0},opposite:!0,
-linkedTo:g},c,{type:"datetime"})});t.yAxis=x(t.yAxis||{}).map(function(c){return v(a.yAxis,{grid:{enabled:!0},staticScale:50,reversed:!0,type:c.categories?c.type:"treegrid"},c)});t.series=null;t=v(!0,{chart:{type:"gantt"},title:{text:null},legend:{enabled:!1}},t,{isGantt:!0});t.series=f.series=B;t.series.forEach(function(a){a.data.forEach(function(a){c.seriesTypes.gantt.prototype.setGanttPointAliases(a)})});return n?new k(m,t,q):new k(t,t)}})(C)});
-//# sourceMappingURL=gantt.js.map
-</script>
-<script>/*
-  Highcharts JS v7.0.1 (2018-12-19)
- Timeline series
-
- (c) 2010-2018 Highsoft AS
- Author: Daniel Studencki
-
- License: www.highcharts.com/license
-*/
-(function(l){"object"===typeof module&&module.exports?module.exports=l:"function"===typeof define&&define.amd?define(function(){return l}):l("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(l){(function(k){var l=k.addEvent,q=k.extend,r=k.defined,p=k.merge,m=k.pick,t=k.Point,n=k.Series,u=k.seriesType,v=k.wrap;u("timeline","line",{colorByPoint:!0,stickyTracking:!1,ignoreHiddenPoint:!0,legendType:"point",lineWidth:0,tooltip:{headerFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf \x3c/span\x3e\x3cspan style\x3d"font-weight: bold;"\x3e{point.point.date}\x3c/span\x3e\x3cbr/\x3e',
-pointFormat:"{point.description}"},states:{hover:{lineWidthPlus:5,halo:{size:0}}},dataLabels:{enabled:!0,allowOverlap:!0,connectorWidth:1,connectorColor:"#000000",backgroundColor:"#ffffff",formatter:function(){return this.series.chart.styledMode?"\x3cspan\x3e\u25cf \x3c/span\x3e\x3cspan\x3e"+(this.point.date||"")+"\x3c/span\x3e\x3cbr/\x3e"+(this.point.label||""):'\x3cspan style\x3d"color:'+this.point.color+'"\x3e\u25cf \x3c/span\x3e\x3cspan style\x3d"font-weight: bold;" \x3e '+(this.point.date||"")+
-"\x3c/span\x3e\x3cbr/\x3e"+(this.point.label||"")},borderWidth:1,borderColor:"#666666",distance:100,alternate:!0,verticalAlign:"middle",color:"#333333"},marker:{enabledThreshold:0,symbol:"square",height:15}},{requireSorting:!1,trackerGroups:["markerGroup","dataLabelsGroup"],drawLegendSymbol:k.LegendSymbolMixin.drawRectangle,drawTracker:k.TrackerMixin.drawTrackerPoint,init:function(){var a=this;n.prototype.init.apply(a,arguments);l(a,"drawDataLabels",function(){a.options.dataLabels.useHTML&&a.points.forEach(function(a){a.visible&&
-a.dataLabel&&delete a.dataLabel.text.oldTextWidth});a.distributeDL()});l(a,"afterDrawDataLabels",function(){var c=a.options,b=c.dataLabels,d=a.hasRendered||0,e=m(b.defer,!!c.animation),f=a.connectorsGroup,g,f=a.plotGroup("connectorsGroup","data-labels-connectors",e&&!d?"hidden":"visible",b.zIndex||5);a.points.forEach(function(a){if(g=a.dataLabel)return v(g,"animate",function(a,b){this.targetPosition&&(this.targetPosition=b);return a.apply(this,Array.prototype.slice.call(arguments,1))}),g.targetPosition||
-(g.targetPosition={}),a.connector?a.alignConnector():a.drawConnector()});e&&(f.attr({opacity:+d}),d||l(a,"afterAnimate",function(){a.visible&&f.show(!0);f[c.animation?"animate":"attr"]({opacity:1},{duration:200})}))})},alignDataLabel:function(a,c){var b=this.chart.inverted,d=this.visibilityMap.filter(function(a){return a}),e=this.visiblePointsCount,f=d.indexOf(a),d=this.options.dataLabels,g=a.userDLOptions||{},f=d.alternate?f&&f!==e-1?2:1.5:1,h,e=Math.floor(this.xAxis.len/e),k=c.padding;a.visible&&
-(h=Math.abs(g.x||a.options.dataLabels.x),b?(b=2*(h-k)-a.itemHeight/2,b={width:b,textOverflow:c.width/b*c.height/2>e*f?"ellipsis":"none"}):b={width:g.width||d.width||e*f-2*k},c.css(b),this.chart.styledMode||c.shadow({}));n.prototype.alignDataLabel.apply(this,arguments)},processData:function(){var a=this,c=[],b,d=0,e;a.visibilityMap=a.getVisibilityMap();a.visibilityMap.forEach(function(a){a&&d++});a.visiblePointsCount=d;b=a.xAxis.options.max/d;for(e=1;e<=d;e++)c.push(b*e-b/2);a.visibilityMap.forEach(function(b,
-d){b||c.splice(d,0,null===a.yData[d]?null:-99)});a.xData=c;a.yData=c.map(function(a){return r(a)?1:null});n.prototype.processData.call(this,arguments)},generatePoints:function(){var a=this;n.prototype.generatePoints.apply(a);a.points.forEach(function(c,b){c.applyOptions({x:a.xData[b]})})},getVisibilityMap:function(){return(this.data.length?this.data:this.userOptions.data).map(function(a){return a&&!1!==a.visible&&!a.isNull?a:!1})},distributeDL:function(){var a=this,c=a.options.dataLabels,b,d,e={},
-f=1,g=c.distance;a.points.forEach(function(h){h.visible&&!h.isNull&&(b=h.options,d=h.options.dataLabels,a.hasRendered||(h.userDLOptions=p({},d)),e[a.chart.inverted?"x":"y"]=c.alternate&&f%2?-g:g,b.dataLabels=p(e,h.userDLOptions),f++)})},markerAttribs:function(a,c){var b=this.options.marker,d=a.marker||{},e=d.symbol||b.symbol,f=m(d.width,b.width,this.xAxis.len/this.visiblePointsCount),g=m(d.height,b.height),h=0;c&&(b=b.states[c]||{},c=d.states&&d.states[c]||{},h=m(c.radius,b.radius,h+(b.radiusPlus||
-0)));a.hasImage=e&&0===e.indexOf("url");return{x:Math.floor(a.plotX)-f/2-h/2,y:a.plotY-g/2-h/2,width:f+h,height:g+h}},bindAxes:function(){n.prototype.bindAxes.call(this);q(this.xAxis.options,{gridLineWidth:0,lineWidth:0,min:0,dataMin:0,minPadding:0,max:100,dataMax:100,maxPadding:0,title:null,tickPositions:[]});q(this.yAxis.options,{gridLineWidth:0,min:.5,dataMin:.5,minPadding:0,max:1.5,dataMax:1.5,maxPadding:0,title:null,labels:{enabled:!1}})}},{init:function(){var a=t.prototype.init.apply(this,arguments);
-a.name=m(a.name,a.date,"Event");a.y=1;return a},setVisible:function(a,c){var b=this,d=b.series,e=d.chart,f=d.options.ignoreHiddenPoint;c=m(c,f);a!==b.visible&&(b.visible=b.options.visible=a=void 0===a?!b.visible:a,d.options.data[d.data.indexOf(b)]=b.options,["graphic","dataLabel","connector"].forEach(function(c){if(b[c])b[c][a?"show":"hide"](!0)}),b.legendItem&&e.legend.colorizeItem(b,a),a||"hover"!==b.state||b.setState(""),f&&(d.isDirty=!0),c&&e.redraw())},setState:function(){var a=n.prototype.pointClass.prototype.setState;
-this.isNull||a.apply(this,arguments)},getConnectorPath:function(){var a=this.series.chart,c=this.series.xAxis.len,b=a.inverted,d=b?"x2":"y2",e=this.dataLabel,f=e.targetPosition,g={x1:this.plotX,y1:this.plotY,x2:this.plotX,y2:f.y||e.y},h=g[d]<this.series.yAxis.len/2;b&&(g={x1:this.plotY,y1:c-this.plotX,x2:f.x||e.x,y2:c-this.plotX});h&&(g[d]+=e[b?"width":"height"]);return a.renderer.crispLine(["M",g.x1,g.y1,"L",g.x2,g.y2],e.options.connectorWidth||1)},drawConnector:function(){var a=this.series,c=this.dataLabel.options=
-p({},a.options.dataLabels,this.options.dataLabels);this.connector=a.chart.renderer.path(this.getConnectorPath()).add(a.connectorsGroup);a.chart.styledMode||this.connector.attr({stroke:c.connectorColor,"stroke-width":c.connectorWidth,opacity:this.dataLabel.opacity})},alignConnector:function(){var a=this.connector,c=0<a.getBBox().y;a[c?"animate":"attr"]({d:this.getConnectorPath()})}});l(k.Chart,"afterHideOverlappingLabels",function(){var a,c;this.series.forEach(function(b){b.points&&b.points.forEach(function(b){a=
-b.dataLabel;c=b.connector;a&&a.targetPosition&&c&&c.attr({opacity:a.targetPosition.opacity||a.newOpacity})})})})})(l)});
-//# sourceMappingURL=timeline.js.map
-</script>
-<script>/*
-  Highcharts JS v7.0.1 (2018-12-19)
-
- Support for parallel coordinates in Highcharts
-
- (c) 2010-2018 Pawel Fus
-
- License: www.highcharts.com/license
-*/
-(function(e){"object"===typeof module&&module.exports?module.exports=e:"function"===typeof define&&define.amd?define(function(){return e}):e("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(e){(function(b){function e(a){var c=this.series&&this.series.chart,h=a.apply(this,Array.prototype.slice.call(arguments,1)),k,e,d;c&&c.hasParallelCoordinates&&!m(h.formattedValue)&&(d=c.yAxis[this.x],k=d.options,c=(e=q(k.tooltipValueFormat,k.labels.format))?b.format(e,n(this,{value:this.y}),c.time):
-d.isDatetimeAxis?c.time.dateFormat(c.time.resolveDTLFormat(k.dateTimeLabelFormats[d.tickPositions.info.unitName]).main,this.y):k.categories?k.categories[this.y]:this.y,h.formattedValue=h.point.formattedValue=c);return h}var r=b.Axis,p=b.Chart,x=b.Series.prototype,y=p.prototype,t=b.Axis.prototype,f=b.addEvent,q=b.pick,u=b.wrap,l=b.merge,z=b.erase,v=b.splat,n=b.extend,m=b.defined,A=b.arrayMin,B=b.arrayMax,w={lineWidth:0,tickLength:0,opposite:!0,type:"category"};b.setOptions({chart:{parallelCoordinates:!1,
-parallelAxes:{lineWidth:1,title:{text:"",reserveSpace:!1},labels:{x:0,y:4,align:"center",reserveSpace:!1},offset:0}}});f(p,"init",function(a){a=a.args[0];var c=v(a.yAxis||{}),h=c.length,b=[];if(this.hasParallelCoordinates=a.chart&&a.chart.parallelCoordinates){for(this.setParallelInfo(a);h<=this.parallelInfo.counter;h++)b.push({});a.legend||(a.legend={});void 0===a.legend.enabled&&(a.legend.enabled=!1);l(!0,a,{boost:{seriesThreshold:Number.MAX_VALUE},plotOptions:{series:{boostThreshold:Number.MAX_VALUE}}});
-a.yAxis=c.concat(b);a.xAxis=l(w,v(a.xAxis||{})[0])}});f(p,"update",function(a){a=a.options;a.chart&&(m(a.chart.parallelCoordinates)&&(this.hasParallelCoordinates=a.chart.parallelCoordinates),this.hasParallelCoordinates&&a.chart.parallelAxes&&(this.options.chart.parallelAxes=l(this.options.chart.parallelAxes,a.chart.parallelAxes),this.yAxis.forEach(function(a){a.update({},!1)})))});n(y,{setParallelInfo:function(a){var c=this;a=a.series;c.parallelInfo={counter:0};a.forEach(function(a){a.data&&(c.parallelInfo.counter=
-Math.max(c.parallelInfo.counter,a.data.length-1))})}});t.keepProps.push("parallelPosition");f(r,"afterSetOptions",function(a){var c=this.chart,b=["left","width","height","top"];c.hasParallelCoordinates&&(c.inverted&&(b=b.reverse()),this.isXAxis?this.options=l(this.options,w,a.userOptions):(this.options=l(this.options,this.chart.options.chart.parallelAxes,a.userOptions),this.parallelPosition=q(this.parallelPosition,c.yAxis.length),this.setParallelPosition(b,this.options)))});f(r,"getSeriesExtremes",
-function(a){if(this.chart&&this.chart.hasParallelCoordinates&&!this.isXAxis){var c=this.parallelPosition,b=[];this.series.forEach(function(a){a.visible&&m(a.yData[c])&&b.push(a.yData[c])});this.dataMin=A(b);this.dataMax=B(b);a.preventDefault()}});n(t,{setParallelPosition:function(a,c){var b=(this.parallelPosition+.5)/(this.chart.parallelInfo.counter+1);this.chart.polar?c.angle=360*b:(c[a[0]]=100*b+"%",this[a[1]]=c[a[1]]=0,this[a[2]]=c[a[2]]=null,this[a[3]]=c[a[3]]=null)}});u(x,"bindAxes",function(a){if(this.chart.hasParallelCoordinates){var c=
-this;this.chart.axes.forEach(function(a){c.insert(a.series);a.isDirty=!0});c.xAxis=this.chart.xAxis[0];c.yAxis=this.chart.yAxis[0]}else a.apply(this,Array.prototype.slice.call(arguments,1))});f(b.Series,"afterTranslate",function(){var a=this.chart,c=this.points,b=c&&c.length,e=Number.MAX_VALUE,f,d,g;if(this.chart.hasParallelCoordinates){for(g=0;g<b;g++)d=c[g],m(d.y)?(d.plotX=a.polar?a.yAxis[g].angleRad||0:a.inverted?a.plotHeight-a.yAxis[g].top+a.plotTop:a.yAxis[g].left-a.plotLeft,d.clientX=d.plotX,
-d.plotY=a.yAxis[g].translate(d.y,!1,!0,null,!0),void 0!==f&&(e=Math.min(e,Math.abs(d.plotX-f))),f=d.plotX,d.isInside=a.isInsidePlot(d.plotX,d.plotY,a.inverted)):d.isNull=!0;this.closestPointRangePx=e}},{order:1});b.addEvent(b.Series,"destroy",function(){this.chart.hasParallelCoordinates&&(this.chart.axes||[]).forEach(function(a){a&&a.series&&(z(a.series,this),a.isDirty=a.forceRedraw=!0)},this)});["line","spline"].forEach(function(a){u(b.seriesTypes[a].prototype.pointClass.prototype,"getLabelConfig",
-e)})})(e)});
-//# sourceMappingURL=parallel-coordinates.js.map
-</script>
-<script>/* global Highcharts module window:true */
-(function (factory) {
-	if (typeof module === 'object' && module.exports) {
-		module.exports = factory;
-	} else {
-		factory(Highcharts);
-	}
-}(function (HC) {
-	'use strict';
-	/**
-	 * Grouped Categories v1.1.3 (2017-03-27)
-	 *
-	 * (c) 2012-2016 Black Label
-	 *
-	 * License: Creative Commons Attribution (CC)
-	 */
-
-	/* jshint expr:true, boss:true */
-	var UNDEFINED = void 0,
-		mathRound = Math.round,
-		mathMin = Math.min,
-		mathMax = Math.max,
-		merge = HC.merge,
-		pick = HC.pick,
-		each = HC.each,
-		// #74, since Highcharts 4.1.10 HighchartsAdapter is only provided by the Highcharts Standalone Framework
-		inArray = (window.HighchartsAdapter && window.HighchartsAdapter.inArray) || HC.inArray,
-
-		// cache prototypes
-		axisProto = HC.Axis.prototype,
-		tickProto = HC.Tick.prototype,
-
-		// cache original methods
-		protoAxisInit = axisProto.init,
-		protoAxisRender = axisProto.render,
-		protoAxisSetCategories = axisProto.setCategories,
-		protoTickGetLabelSize = tickProto.getLabelSize,
-		protoTickAddLabel = tickProto.addLabel,
-		protoTickDestroy = tickProto.destroy,
-		protoTickRender = tickProto.render;
-
-	function deepClone(thing) {
-		return JSON.parse(JSON.stringify(thing));
-	}
-
-	function Category(obj, parent) {
-		this.userOptions = deepClone(obj);
-		this.name = obj.name || obj;
-		this.parent = parent;
-
-		return this;
-	}
-
-	Category.prototype.toString = function () {
-		var parts = [],
-			cat = this;
-
-		while (cat) {
-			parts.push(cat.name);
-			cat = cat.parent;
-		}
-
-		return parts.join(', ');
-	};
-
-	// returns sum of an array
-	function sum(arr) {
-		var l = arr.length,
-			x = 0;
-
-		while (l--) {
-			x += arr[l];
-		}
-
-		return x;
-	}
-
-	// Adds category leaf to array
-	function addLeaf(out, cat, parent) {
-		out.unshift(new Category(cat, parent));
-
-		while (parent) {
-			parent.leaves = parent.leaves ? (parent.leaves + 1) : 1;
-			parent = parent.parent;
-		}
-	}
-
-	// Builds reverse category tree
-	function buildTree(cats, out, options, parent, depth) {
-		var len = cats.length,
-			cat;
-
-		depth = depth ? depth : 0;
-		options.depth = options.depth ? options.depth : 0;
-
-		while (len--) {
-			cat = cats[len];
-			
-			if (cat.categories) {
-				if (parent) {
-					cat.parent = parent;
-				}
-				buildTree(cat.categories, out, options, cat, depth + 1);
-			} else {
-				addLeaf(out, cat, parent);
-			}
-		}
-		options.depth = mathMax(options.depth, depth);
-	}
-
-	// Pushes part of grid to path
-	function addGridPart(path, d, width) {
-		// Based on crispLine from HC (#65)
-		if (d[0] === d[2]) {
-			d[0] = d[2] = mathRound(d[0]) - (width % 2 / 2);
-		}
-		if (d[1] === d[3]) {
-			d[1] = d[3] = mathRound(d[1]) + (width % 2 / 2);
-		}
-
-		path.push(
-			'M',
-			d[0], d[1],
-			'L',
-			d[2], d[3]
-		);
-	}
-
-	// Returns tick position
-	function tickPosition(tick, pos) {
-		return tick.getPosition(tick.axis.horiz, pos, tick.axis.tickmarkOffset);
-	}
-
-	function walk(arr, key, fn) {
-		var l = arr.length,
-			children;
-
-		while (l--) {
-			children = arr[l][key];
-
-			if (children) {
-				walk(children, key, fn);
-			}
-			fn(arr[l]);
-		}
-	}
-
-	//
-	// Axis prototype
-	//
-
-	axisProto.init = function (chart, options) {
-		// default behaviour
-		protoAxisInit.call(this, chart, options);
-
-		if (typeof options === 'object' && options.categories) {
-			this.setupGroups(options);
-		}
-	};
-
-	// setup required axis options
-	axisProto.setupGroups = function (options) {
-		var categories = deepClone(options.categories),
-			reverseTree = [],
-			stats = {},
-			labelOptions = this.options.labels,
-			userAttr = labelOptions.groupedOptions,
-			css = labelOptions.style;
-
-		// build categories tree
-		buildTree(categories, reverseTree, stats);
-
-		// set axis properties
-		this.categoriesTree = categories;
-		this.categories = reverseTree;
-		this.isGrouped = stats.depth !== 0;
-		this.labelsDepth = stats.depth;
-		this.labelsSizes = [];
-		this.labelsGridPath = [];
-		this.tickLength = options.tickLength || this.tickLength || null;
-		// #66: tickWidth for x axis defaults to 1, for y to 0
-		this.tickWidth = pick(options.tickWidth, this.isXAxis ? 1 : 0);
-		this.directionFactor = [-1, 1, 1, -1][this.side];
-		this.options.lineWidth = pick(options.lineWidth, 1);
-		// #85: align labels vertically
-		this.groupFontHeights = [];
-		for (var i = 0; i <= stats.depth; i++) {
-			var hasOptions = userAttr && userAttr[i - 1],
-				mergedCSS = hasOptions && userAttr[i - 1].style ? merge(css, userAttr[i - 1].style) : css;
-			this.groupFontHeights[i] = Math.round(this.chart.renderer.fontMetrics(mergedCSS ? mergedCSS.fontSize : 0).b * 0.3);
-		}
-	};
-
-
-	axisProto.render = function () {
-		// clear grid path
-		if (this.isGrouped) {
-			this.labelsGridPath = [];
-		}
-
-		// cache original tick length
-		if (this.originalTickLength === UNDEFINED) {
-			this.originalTickLength = this.options.tickLength;
-		}
-
-		// use default tickLength for not-grouped axis
-		// and generate grid on grouped axes,
-		// use tiny number to force highcharts to hide tick
-		this.options.tickLength = this.isGrouped ? 0.001 : this.originalTickLength;
-
-		protoAxisRender.call(this);
-
-		if (!this.isGrouped) {
-			if (this.labelsGrid) {
-				this.labelsGrid.attr({
-					visibility: 'hidden'
-				});
-			}
-			return false;
-		}
-
-		var axis = this,
-			options = axis.options,
-			top = axis.top,
-			left = axis.left,
-			right = left + axis.width,
-			bottom = top + axis.height,
-			visible = axis.hasVisibleSeries || axis.hasData,
-			depth = axis.labelsDepth,
-			grid = axis.labelsGrid,
-			horiz = axis.horiz,
-			d = axis.labelsGridPath,
-			i = options.drawHorizontalBorders === false ? (depth + 1) : 0,
-			offset = axis.opposite ? (horiz ? top : right) : (horiz ? bottom : left),
-			tickWidth = axis.tickWidth,
-			part;
-
-		if (axis.userTickLength) {
-			depth -= 1;
-		}
-
-		// render grid path for the first time
-		if (!grid) {
-			grid = axis.labelsGrid = axis.chart.renderer.path()
-			.attr({
-				// #58: use tickWidth/tickColor instead of lineWidth/lineColor:
-				strokeWidth: tickWidth, // < 4.0.3
-				'stroke-width': tickWidth, // 4.0.3+ #30
-				stroke: options.tickColor || '' // for styled mode (tickColor === undefined)
-			})
-			.add(axis.axisGroup);
-			// for styled mode - add class
-			if (!options.tickColor) {
-				grid.addClass('highcharts-tick');
-			}
-		}
-
-		// go through every level and draw horizontal grid line
-		while (i <= depth) {
-			offset += axis.groupSize(i);
-
-			part = horiz ?
-				[left, offset, right, offset] :
-				[offset, top, offset, bottom];
-
-			addGridPart(d, part, tickWidth);
-			i++;
-		}
-
-		// draw grid path
-		grid.attr({
-			d: d,
-			visibility: visible ? 'visible' : 'hidden'
-		});
-
-		axis.labelGroup.attr({
-			visibility: visible ? 'visible' : 'hidden'
-		});
-
-
-		walk(axis.categoriesTree, 'categories', function (group) {
-			var tick = group.tick;
-
-			if (!tick) {
-				return false;
-			}
-			if (tick.startAt + tick.leaves - 1 < axis.min || tick.startAt > axis.max) {
-				tick.label.hide();
-				tick.destroyed = 0;
-			} else {
-				tick.label.attr({
-					visibility: visible ? 'visible' : 'hidden'
-				});
-			}
-			return true;
-		});
-		return true;
-	};
-
-	axisProto.setCategories = function (newCategories, doRedraw) {
-		if (this.categories) {
-			this.cleanGroups();
-		}
-		this.setupGroups({
-			categories: newCategories
-		});
-		this.categories = this.userOptions.categories = newCategories;
-		protoAxisSetCategories.call(this, this.categories, doRedraw);
-	};
-
-	// cleans old categories
-	axisProto.cleanGroups = function () {
-		var ticks = this.ticks,
-			n;
-
-		for (n in ticks) {
-			if (ticks[n].parent) {
-				delete ticks[n].parent;
-			}
-		}
-		walk(this.categoriesTree, 'categories', function (group) {
-			var tick = group.tick;
-			
-			if (!tick) {
-				return false;
-			}
-			tick.label.destroy();
-			
-			each(tick, function (v, i) {
-				delete tick[i];
-			});
-			delete group.tick;
-			
-			return true;
-		});
-		this.labelsGrid = null;
-	};
-
-	// keeps size of each categories level
-	axisProto.groupSize = function (level, position) {
-		var positions = this.labelsSizes,
-			direction = this.directionFactor,
-			groupedOptions = this.options.labels.groupedOptions ? this.options.labels.groupedOptions[level - 1] : false,
-			userXY = 0;
-
-		if (groupedOptions) {
-			if (direction === -1) {
-				userXY = groupedOptions.x ? groupedOptions.x : 0;
-			} else {
-				userXY = groupedOptions.y ? groupedOptions.y : 0;
-			}
-		}
-
-		if (position !== UNDEFINED) {
-			positions[level] = mathMax(positions[level] || 0, position + 10 + Math.abs(userXY));
-		}
-
-		if (level === true) {
-			return sum(positions) * direction;
-		} else if (positions[level]) {
-			return positions[level] * direction;
-		}
-
-		return 0;
-	};
-
-	//
-	// Tick prototype
-	//
-
-	// Override methods prototypes
-	tickProto.addLabel = function () {
-		var tick = this,
-			axis = tick.axis,
-			category;
-		
-		protoTickAddLabel.call(tick);
-		
-		if (!axis.categories || !(category = axis.categories[tick.pos])) {
-			return false;
-		}
-		
-		// set label text - but applied after formatter #46
-		if (tick.label) {
-			tick.label.attr('text', tick.axis.labelFormatter.call({
-				axis: axis,
-				chart: axis.chart,
-				isFirst: tick.isFirst,
-				isLast: tick.isLast,
-				value: category.name,
-				pos: tick.pos
-			}));
-		}
-		
-		// create elements for parent categories
-		if (axis.isGrouped && axis.options.labels.enabled) {
-			tick.addGroupedLabels(category);
-		}
-		return true;
-	};
-
-	// render ancestor label
-	tickProto.addGroupedLabels = function (category) {
-		var tick = this,
-			axis = this.axis,
-			chart = axis.chart,
-			options = axis.options.labels,
-			useHTML = options.useHTML,
-			css = options.style,
-			userAttr = options.groupedOptions,
-			attr = {
-				align: 'center',
-				rotation: options.rotation,
-				x: 0,
-				y: 0
-			},
-			size = axis.horiz ? 'height' : 'width',
-			depth = 0,
-			label;
-
-
-		while (tick) {
-			if (depth > 0 && !category.tick) {
-				// render label element
-				this.value = category.name;
-				var name = options.formatter ? options.formatter.call(this, category) : category.name,
-					hasOptions = userAttr && userAttr[depth - 1],
-					mergedAttrs = hasOptions ? merge(attr, userAttr[depth - 1]) : attr,
-					mergedCSS = hasOptions && userAttr[depth - 1].style ? merge(css, userAttr[depth - 1].style) : css;
-
-				// #63: style is passed in CSS and not as an attribute
-				delete mergedAttrs.style;
-
-				label = chart.renderer.text(name, 0, 0, useHTML)
-					.attr(mergedAttrs)
-					.css(mergedCSS)
-					.add(axis.labelGroup);
-
-				// tick properties
-				tick.startAt = this.pos;
-				tick.childCount = category.categories.length;
-				tick.leaves = category.leaves;
-				tick.visible = this.childCount;
-				tick.label = label;
-				tick.labelOffsets = {
-					x: mergedAttrs.x,
-					y: mergedAttrs.y
-				};
-
-				// link tick with category
-				category.tick = tick;
-			}
-
-			// set level size, #93
-			if (tick) {
-				axis.groupSize(depth, tick.label.getBBox()[size]);
-			}
-
-			// go up to the parent category
-			category = category.parent;
-
-			if (category) {
-				tick = tick.parent = category.tick || {};
-			} else {
-				tick = null;
-			}
-
-			depth++;
-		}
-	};
-
-	// set labels position & render categories grid
-	tickProto.render = function (index, old, opacity) {
-		protoTickRender.call(this, index, old, opacity);
-
-		var treeCat = this.axis.categories[this.pos];
-
-		if (!this.axis.isGrouped || !treeCat || this.pos > this.axis.max) {
-			return;
-		}
-
-		var tick = this,
-			group = tick,
-			axis = tick.axis,
-			tickPos = tick.pos,
-			isFirst = tick.isFirst,
-			max = axis.max,
-			min = axis.min,
-			horiz = axis.horiz,
-			grid = axis.labelsGridPath,
-			size = axis.groupSize(0),
-			tickWidth = axis.tickWidth,
-			xy = tickPosition(tick, tickPos),
-			start = horiz ? xy.y : xy.x,
-			baseLine = axis.chart.renderer.fontMetrics(axis.options.labels.style ? axis.options.labels.style.fontSize : 0).b,
-			depth = 1,
-			reverseCrisp = ((horiz && xy.x === axis.pos + axis.len) || (!horiz && xy.y === axis.pos)) ? -1 : 0, // adjust grid lines for edges
-			gridAttrs,
-			lvlSize,
-			minPos,
-			maxPos,
-			attrs,
-			bBox;
-
-		// render grid for "normal" categories (first-level), render left grid line only for the first category
-		if (isFirst) {
-			gridAttrs = horiz ?
-				[axis.left, xy.y, axis.left, xy.y + axis.groupSize(true)] : axis.isXAxis ?
-					[xy.x, axis.top, xy.x + axis.groupSize(true), axis.top] : [xy.x, axis.top + axis.len, xy.x + axis.groupSize(true), axis.top + axis.len];
-
-			addGridPart(grid, gridAttrs, tickWidth);
-		}
-
-		if (horiz && axis.left < xy.x) {
-			addGridPart(grid, [xy.x - reverseCrisp, xy.y, xy.x - reverseCrisp, xy.y + size], tickWidth);
-		} else if (!horiz && axis.top <= xy.y) {
-			addGridPart(grid, [xy.x, xy.y + reverseCrisp, xy.x + size, xy.y + reverseCrisp], tickWidth);
-		}
-
-		size = start + size;
-
-		function fixOffset(tCat) {
-			var ret = 0;
-			if (isFirst) {
-				ret = inArray(tCat.name, tCat.parent.categories);
-				ret = ret < 0 ? 0 : ret;
-				return ret;
-			}
-			return ret;
-		}
-
-
-		while (group.parent) {
-			group = group.parent;
-			
-			var fix = fixOffset(treeCat),
-				userX = group.labelOffsets.x,
-				userY = group.labelOffsets.y;
-			
-			minPos = tickPosition(tick, mathMax(group.startAt - 1, min - 1));
-			maxPos = tickPosition(tick, mathMin(group.startAt + group.leaves - 1 - fix, max));
-			bBox = group.label.getBBox(true);
-			lvlSize = axis.groupSize(depth);
-			// check if on the edge to adjust
-			reverseCrisp = ((horiz && maxPos.x === axis.pos + axis.len) || (!horiz && maxPos.y === axis.pos)) ? -1 : 0;
-			
-			attrs = horiz ? {
-				x: (minPos.x + maxPos.x) / 2 + userX,
-				y: size + axis.groupFontHeights[depth] + lvlSize / 2 + userY / 2
-			} : {
-				x: size + lvlSize / 2 + userX,
-				y: (minPos.y + maxPos.y - bBox.height) / 2 + baseLine + userY
-			};
-			
-			if (!isNaN(attrs.x) && !isNaN(attrs.y)) {
-				group.label.attr(attrs);
-
-				if (grid) {
-					if (horiz && axis.left < maxPos.x) {
-						addGridPart(grid, [maxPos.x - reverseCrisp, size, maxPos.x - reverseCrisp, size + lvlSize], tickWidth);
-					} else if (!horiz && axis.top <= maxPos.y) {
-						addGridPart(grid, [size, maxPos.y + reverseCrisp, size + lvlSize, maxPos.y + reverseCrisp], tickWidth);
-					}
-				}
-			}
-
-			size += lvlSize;
-			depth++;
-		}
-	};
-
-	tickProto.destroy = function () {
-		var group = this.parent;
-
-		while (group) {
-			group.destroyed = group.destroyed ? (group.destroyed + 1) : 1;
-			group = group.parent;
-		}
-
-		protoTickDestroy.call(this);
-	};
-
-	// return size of the label (height for horizontal, width for vertical axes)
-	tickProto.getLabelSize = function () {
-		if (this.axis.isGrouped === true) {
-			// #72, getBBox might need recalculating when chart is tall
-			var size = protoTickGetLabelSize.call(this) + 10,
-				topLabelSize = this.axis.labelsSizes[0];
-			if (topLabelSize < size) {
-				this.axis.labelsSizes[0] = size;
-			}
-			return sum(this.axis.labelsSizes);
-		}
-		return protoTickGetLabelSize.call(this);
-	};
-
-}));</script>
-<script>/**
- * @license http://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
- * @author  Lars Cabrera
- * @version 1.0.9
- */
-
-// JSLint options:
-/*global Highcharts, window*/
-
-(function (H) {
-    // Check if object is array
-    function isArray(obj) {
-        return Object.prototype.toString.call(obj) === '[object Array]';
-    }
-
-
-    // Sets up motion ready to use
-    function Motion(chart) {
-        var motion = this;
-
-        this.chart = chart;
-        this.paused = true;
-        this.options = H.merge(this.defaultOptions, this.chart.options.motion);
-        this.dataSeries = [];
-        this.dataLength = 0;
-        motion.options.series = H.splat(motion.options.series);
-        Highcharts.each(this.chart.series, function (series, index) {
-            if (motion.options.series.indexOf(index) >= 0) {
-                motion.dataSeries[index] = series;
-                for (var i = 0; i < series.data.length; i++) {
-                    if (series.data[i].sequence) {
-                        motion.dataLength = Math.max(motion.dataLength, series.data[i].sequence.length);
-                    }
-                }
-            }
-        });
-
-        // Play-controls HTML-div
-        this.playControls = H.createElement('div', {
-            id: 'play-controls'
-        }, null, this.chart.renderTo, null);
-
-        // Play/pause HTML-button
-        this.playPauseBtn = H.createElement('button', {
-            id: 'play-pause-button',
-            title: 'play'
-        }, null, this.playControls, null);
-        this.playPauseBtn.className = this.options.playIcon;
-
-        // Play-range HTML-input
-        this.playRange = H.createElement('input', {
-            id: 'play-range',
-            type: 'range',
-            min: 0,
-            max: this.dataLength - 1,
-            step: this.options.magnet.step
-        }, null, this.playControls, null);
-        // Important: max must be set before value in order to allow for
-        // higher numbers than 100.
-        this.playRange.value = H.pick(this.options.startIndex, this.dataLength - 1);
-
-        // Play-range HTML-output
-        this.playOutput = H.createElement('label', {
-            id: 'play-output',
-            name: this.options.axisLabel
-        }, null, this.playControls, null);
-        if (isArray(this.options.labels)) {
-            this.playOutput.innerHTML = this.options.labels[this.dataLength - 1] || '';
-        } else {
-            this.playOutput.innerHTML = this.dataLength - 1;
-        }
-
-        // Common key event handler function
-        function handleKeyEvents(e) {
-            e = e || window.event;
-            switch (e.which) {
-            case 32: // Space
-                motion.togglePlayPause();
-                break;
-            case 37: // Left
-                motion.playRange.value = motion.round(parseFloat(motion.playRange.value) - 1);
-                motion.updateChart(motion.playRange.value);
-                break;
-            case 39: // Right
-                motion.playRange.value = motion.round(parseFloat(motion.playRange.value) + 1);
-                motion.updateChart(motion.playRange.value);
-                break;
-            default:
-                return;
-            }
-            e.preventDefault();
-        }
-
-        // Bind controls to events
-        Highcharts.addEvent(this.playPauseBtn, 'click', function () {
-            motion.togglePlayPause();
-        });
-        Highcharts.addEvent(this.playRange, 'mouseup', function () {
-            motion.attractToStep();
-        });
-        Highcharts.addEvent(this.playRange, 'input', function () {
-            motion.updateChart(this.value);
-        });
-
-        // Request focus to the controls when clicking on controls div
-        Highcharts.addEvent(this.playControls, 'click', function () {
-            motion.playRange.focus();
-        });
-        // Bind keys to events
-        Highcharts.addEvent(this.playPauseBtn, 'keydown', handleKeyEvents);
-        Highcharts.addEvent(this.playRange, 'keydown', handleKeyEvents);
-
-        // Initial value
-        this.inputValue = parseFloat(this.playRange.value);
-
-        // Initial update
-        this.updateChart(this.inputValue);
-
-        // Auto-play
-        if (this.options.autoPlay) {
-            this.play();
-        }
-    }
-
-    // Default options for Motion
-    Motion.prototype.defaultOptions = {
-        enabled: true,
-        axisLabel: 'year',
-        autoPlay : false,
-        loop: false,
-        series: 0,
-        updateInterval: 10,
-        magnet: {
-            round: 'round',
-            step: 0.01
-        },
-        playIcon: "fa fa-play",
-        pauseIcon: "fa fa-pause"
-    };
-
-    // Toggles between Play and Pause states, and makes calls to changeButtonType()
-    // From http://www.creativebloq.com/html5/build-custom-html5-video-player-9134473
-    Motion.prototype.togglePlayPause = function () {
-        this[this.paused ? 'play' : 'pause']();
-    };
-
-    // Plays the motion, continuously updating the chart
-    Motion.prototype.play = function () {
-        var motion = this;
-        if (this.paused && parseFloat(this.playRange.value) === parseFloat(this.playRange.max)) {
-            this.reset();
-        }
-        this.changeButtonType('pause');
-        this.paused = false;
-        this.timer = setInterval(function () {
-            motion.playUpdate();
-        }, this.options.updateInterval);
-    };
-
-    // Pauses the motion, which stops updating the chart
-    Motion.prototype.pause = function () {
-        this.changeButtonType('play');
-        this.paused = true;
-        window.clearInterval(this.timer);
-        this.attractToStep();
-    };
-
-    // Resets the motion and updates the chart. Does not pause
-    Motion.prototype.reset = function () {
-        this.playRange.value = this.playRange.min;
-        this.updateChart(this.playRange.value);
-    };
-
-    // Updates a button's title, innerHTML and CSS class to a certain value
-    Motion.prototype.changeButtonType = function (value) {
-        this.playPauseBtn.title = value;
-        this.playPauseBtn.className = value + " ";
-        if (value == 'play') {
-            this.playPauseBtn.className += this.options.playIcon;
-        } else if (value == 'pause') {
-            this.playPauseBtn.className += this.options.pauseIcon;;
-        }
-    };
-
-    // Called continuously while playing
-    Motion.prototype.playUpdate = function () {
-        if (!this.paused) {
-            this.inputValue = parseFloat(this.playRange.value);
-            this.playRange.value = this.inputValue + this.options.magnet.step;
-            this.attractToStep();
-            this.updateChart(this.playRange.value); // Use playRange.value to get updated value
-            if (this.playRange.value >= parseFloat(this.playRange.max)) { // Auto-pause
-                if (this.options.loop) {
-                    this.reset();
-                } else {
-                    this.pause();
-                }
-            }
-        }
-    };
-
-    // Updates chart data and redraws the chart
-    Motion.prototype.updateChart = function (inputValue) {
-        var seriesKey,
-            series,
-            point,
-            roundedInput = this.round(inputValue),
-            i;
-        if (this.currentAxisValue !== roundedInput) {
-            this.currentAxisValue = roundedInput;
-            this.chart.options.motion.startIndex = roundedInput;
-            for (seriesKey in this.dataSeries) {
-                if (this.dataSeries.hasOwnProperty(seriesKey)) {
-                    series = this.dataSeries[seriesKey];
-                    for (i = 0; i < series.data.length; i++) {
-                        point = series.data[i];
-                        try {
-                            if (point.sequence) {
-                                point.update(point.sequence[roundedInput], false, false);
-                            }
-                        } catch (e) {
-                            console.error('Error:', e, ' \nat point:', point, ' \nwith new value:', point.sequence[roundedInput]);
-                        }
-                    }
-                }
-            }
-            this.chart.redraw();
-            this.attractToStep();
-        }
-    };
-
-    // Moves output value to data point
-    Motion.prototype.attractToStep = function () {
-        if (isArray(this.options.labels)) {
-            this.playOutput.innerHTML = this.options.labels[this.round(this.playRange.value)] || '';
-        } else {
-            this.playOutput.innerHTML = this.round(this.playRange.value);
-        }
-    };
-
-    // Returns an integer rounded up, down or even depending on
-    // motion.magnet.round options.
-    Motion.prototype.round = function (number) {
-        return Math[this.options.magnet.round](number);
-    };
-
-    // Initiates motion automatically if motion options object exists and
-    // is not disabled
-    H.Chart.prototype.callbacks.push(function (chart) {
-        if (chart.options.motion && chart.options.motion.enabled) {
-            chart.motion = new Motion(chart);
-        }
-    });
-
-    H.Motion = Motion;
-}(Highcharts));
-</script>
-<script>/**
-* Multicolor Series v2.2.4 (2018-03-27)
-*
-* (c) 2012-2016 Black Label
-*
-* License: Creative Commons Attribution (CC)
-*/
-/* global Highcharts window document module:true */
-/**
- * @fileoverview
- * @suppress {checkTypes}
- */
-(function (factory) {
-	if (typeof module === 'object' && module.exports) {
-		module.exports = factory;
-	} else {
-		factory(Highcharts);
-	}
-}(function (H) {
-	var each = H.each,
-		seriesTypes = H.seriesTypes,
-		pick = H.pick,
-		UNDEFINED,
-		NORMAL_STATE = '',
-		VISIBLE = 'visible',
-		HIDDEN = 'hidden',
-		PREFIX = 'highcharts-',
-		NONE = 'none',
-		hasTouch = document.documentElement.ontouchstart !== UNDEFINED,
-		TRACKER_FILL = 'rgba(192,192,192,' + (H.hasSVG ? 0.0001 : 0.002) + ')', // invisible but clickable
-		M = 'M',
-		L = 'L';
-	
-	// handle unsorted data, throw error anyway
-	function error(code, stop) {
-		var msg = 'Highcharts error #' + code + ': www.highcharts.com/errors/' + code;
-		if (stop) {
-			throw msg;
-		} else if (window.console) {
-			console.log(msg); // eslint-disable-line
-		}
-	}
-	
-	/**
-	If replacing L and M in tracker will be necessary use that getPath():
-	
-	function getPath(arr){
-	var ret = [];
-	each(arr, function(el, ind) {
-	var len = el[0].length;
-	for(var i = 0; i < len; i++){
-	var p = el[0][i];
-	if(p == M && ind != 0 && i == 0) {
-	p = L;
-	}
-	ret.push(p);
-	}
-	});
-	return ret;
-	}
-	**/
-	
-	
-	function getPath(arr) {
-		var ret = [];
-		each(arr, function (el) {
-			ret = ret.concat(el[0]);
-		});
-		return ret;
-	}
-
-	/**
-	 * Return the graph path of a segment - compatibility with 4.2.3+
-	 * @param {Object} segment of the path
-	 * @returns {Array} Path (SVG)
-	 */
-	H.Series.prototype.getSegmentPath = function (segment) {
-		var series = this,
-			segmentPath = [],
-			step = series.options.step;
-
-		// build the segment line
-		each(segment, function (point, i) {
-			var plotX = point.plotX,
-				plotY = point.plotY,
-				lastPoint;
-
-			if (series.getPointSpline) {
-				// generate the spline as defined in the SplineSeries object
-				segmentPath.push.apply(segmentPath, series.getPointSpline(segment, point, i));
-			} else {
-				// moveTo or lineTo
-				segmentPath.push(i ? L : M);
-
-				// step line?
-				if (step && i) {
-					lastPoint = segment[i - 1];
-					if (step === 'right') {
-						segmentPath.push(
-							lastPoint.plotX,
-							plotY,
-							L
-						);
-					} else if (step === 'center') {
-						segmentPath.push(
-							(lastPoint.plotX + plotX) / 2,
-							lastPoint.plotY,
-							L,
-							(lastPoint.plotX + plotX) / 2,
-							plotY,
-							L
-						);
-					} else {
-						segmentPath.push(
-							plotX,
-							lastPoint.plotY,
-							L
-						);
-					}
-				}
-
-				// normal line to next point
-				segmentPath.push(
-					point.plotX,
-					point.plotY
-				);
-			}
-		});
-
-		return segmentPath;
-	};
-
-	/**
-	*
-	*   ColoredLine series type
-	*
-	**/
-	
-	seriesTypes.coloredline = H.extendClass(seriesTypes.line);
-	
-	H.seriesTypes.coloredline.prototype.processData = function (force) {
-		var series = this,
-			processedXData = series.xData, // copied during slice operation below
-			processedYData = series.yData,
-			cropStart = 0,
-			cropped,
-			distance,
-			closestPointRange,
-			xAxis = series.xAxis,
-			i, // loop variable
-			options = series.options,
-			isCartesian = series.isCartesian;
-		
-		// If the series data or axes haven't changed, don't go through this. Return false to pass
-		// the message on to override methods like in data grouping.
-		if (isCartesian && !series.isDirty && !xAxis.isDirty && !series.yAxis.isDirty && !force) {
-			return false;
-		}
-		
-		// Find the closest distance between processed points
-		for (i = processedXData.length - 1; i >= 0; i--) {
-			distance = processedXData[i] - processedXData[i - 1];
-			if (distance > 0 && (closestPointRange === UNDEFINED || distance < closestPointRange)) {
-				closestPointRange = distance;
-				
-				// Unsorted data is not supported by the line tooltip, as well as data grouping and
-				// navigation in Stock charts (#725) and width calculation of columns (#1900)
-			} else if (distance < 0 && series.requireSorting) {
-				error(15);
-			}
-		}
-		
-		// Record the properties
-		series.cropped = cropped; // undefined or true
-		series.cropStart = cropStart;
-		series.processedXData = processedXData;
-		series.processedYData = processedYData;
-		
-		if (options.pointRange === null) { // null means auto, as for columns, candlesticks and OHLC
-			series.pointRange = closestPointRange || 1;
-		}
-		series.closestPointRange = closestPointRange;
-		return true;
-	};
-	
-	H.seriesTypes.coloredline.prototype.drawTracker = function () {
-		var series = this,
-			options = series.options,
-			trackByArea = options.trackByArea,
-			trackerPath = [].concat(trackByArea ? series.areaPath : getPath(series.graphPath)),
-			trackerPathLength = trackerPath.length,
-			chart = series.chart,
-			pointer = chart.pointer,
-			renderer = chart.renderer,
-			snap = chart.options.tooltip.snap,
-			tracker = series.tracker,
-			cursor = options.cursor,
-			css = cursor && { cursor: cursor },
-			singlePoints = series.singlePoints,
-			singlePoint,
-			i,
-			onMouseOver;
-
-		onMouseOver = function () {
-			if (chart.hoverSeries !== series) {
-				series.onMouseOver();
-			}
-		};
-		// Extend end points. A better way would be to use round linecaps,
-		// but those are not clickable in VML.
-		if (trackerPathLength && !trackByArea) {
-			i = trackerPathLength + 1;
-			while (i--) {
-				if (trackerPath[i] === M) { // extend left side
-					trackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], L);
-				}
-				if ((i && trackerPath[i] === M) || i === trackerPathLength) { // extend right side
-					trackerPath.splice(i, 0, L, trackerPath[i - 2] + snap, trackerPath[i - 1]);
-				}
-			}
-		}
-		
-		// handle single points
-		for (i = 0; i < singlePoints.length; i++) {
-			singlePoint = singlePoints[i];
-			if (singlePoint.plotX && singlePoint.plotY) {
-				trackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY,
-					L, singlePoint.plotX + snap, singlePoint.plotY);
-			}
-		}
-		
-		// draw the tracker
-		if (tracker) {
-			tracker.attr({ d: trackerPath });
-		} else { // create
-			series.tracker = renderer.path(trackerPath)
-			.attr({
-				'stroke-linejoin': 'round', // #1225
-				visibility: series.visible ? VISIBLE : HIDDEN,
-				stroke: TRACKER_FILL,
-				fill: trackByArea ? TRACKER_FILL : NONE,
-				'stroke-width': options.lineWidth + (trackByArea ? 0 : 2 * snap),
-				zIndex: 2
-			})
-			.add(series.group);
-			
-			// The tracker is added to the series group, which is clipped, but is covered
-			// by the marker group. So the marker group also needs to capture events.
-			each([series.tracker, series.markerGroup], function (track) {
-				track.addClass(PREFIX + 'tracker')
-				.on('mouseover', onMouseOver)
-				.on('mouseout', function (e) { pointer.onTrackerMouseOut(e); })
-				.css(css);
-				
-				if (hasTouch) {
-					track.on('touchstart', onMouseOver);
-				}
-			});
-		}
-		
-	};
-	
-	H.seriesTypes.coloredline.prototype.setState = function (state) {
-		var series = this,
-			options = series.options,
-			graph = series.graph,
-			stateOptions = options.states,
-			lineWidth = options.lineWidth,
-			attribs;
-		
-		state = state || NORMAL_STATE;
-		
-		if (series.state !== state) {
-			series.state = state;
-			
-			if (stateOptions[state] && stateOptions[state].enabled === false) {
-				return;
-			}
-			
-			if (state) {
-				lineWidth = stateOptions[state].lineWidth || lineWidth + 1;
-			}
-			
-			if (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML
-				attribs = {
-					'stroke-width': lineWidth
-				};
-				// use attr because animate will cause any other animation on the graph to stop
-				each(graph, function (seg) {
-					seg.attr(attribs);
-				});
-			}
-		}
-	};
-	
-	/**
-	* The main change to get multi color isFinite changes segments array.
-	* From array of points to object with color and array of points.
-	* @returns {undefined}
-	**/
-	H.seriesTypes.coloredline.prototype.getSegments = function () {
-		var series = this,
-			lastColor = 0,
-			segments = [],
-			i,
-			points = series.points,
-			pointsLength = points.length;
-		
-		if (pointsLength) { // no action required for []
-			
-			// if connect nulls, just remove null points
-			if (series.options.connectNulls) {
-				// iterate backwars for secure point removal
-				for (i = pointsLength - 1; i >= 0; --i) {
-					if (points[i].y === null) {
-						points.splice(i, 1);
-					}
-				}
-				pointsLength = points.length;
-				
-				each(points, function (point, j) {
-					if (j > 0 && points[j].segmentColor !== points[j - 1].segmentColor) {
-						segments.push({
-							points: points.slice(lastColor, j + 1),
-							color: points[j - 1].segmentColor
-						});
-						lastColor = j;
-					}
-				});
-
-				if (pointsLength) {
-					// add the last segment (only single-point last segement is added)
-					if (lastColor !== pointsLength - 1) {
-						segments.push({
-							points: points.slice(lastColor, pointsLength),
-							color: points[pointsLength - 1].segmentColor
-						});
-					}
-				}
-				
-				if (points.length && segments.length === 0) {
-					segments = [points];
-				}
-				
-				// else, split on null points or different colors
-			} else {
-				var previousColor = null;
-				each(points, function (point, j) {
-					var colorChanged = j > 0 && (point.y === null || points[j - 1].y === null || (point.segmentColor !== points[j - 1].segmentColor && points[j].segmentColor !== previousColor)),
-						colorExists = points[j - 1] && points[j - 1].segmentColor && points[j - 1].y !== null ? true : false;
-					
-					if (colorChanged) {
-						var p = points.slice(lastColor, j + 1);
-						if (p.length > 0) {
-							// do not create segments with null ponits
-							each(p, function (pointObject, k) {
-								if (pointObject.y === null) {
-									// remove null points (might be on edges)
-									p.splice(k, 1);
-								}
-							});
-							
-							segments.push({
-								points: p,
-								color: colorExists ? points[j - 1].segmentColor : previousColor
-							});
-							lastColor = j;
-						}
-					} else if (j === pointsLength - 1) {
-						var next = j + 1;
-						if (point.y === null) {
-							next--;
-						}
-						p = points.slice(lastColor, next);
-						if (p.length > 0) {
-							// do not create segments with null ponits
-							each(p, function (pointObject, k) {
-								if (pointObject.y === null) {
-									// remove null points (might be on edges)
-									p.splice(k, 1);
-								}
-							});
-							segments.push({
-								points: p,
-								color: colorExists ? points[j - 1].segmentColor : previousColor
-							});
-							lastColor = j;
-						}
-						
-					}
-					
-					// store previous color
-					if (point) {
-						previousColor = point.segmentColor;
-					}
-				});
-			}
-		}
-		// register it
-		series.segments = segments;
-	};
-	
-	H.seriesTypes.coloredline.prototype.getGraphPath = function () {
-		// var ret = f.apply(this, Array.prototype.slice.call(arguments, 1));
-		var series = this,
-			graphPath = [],
-			segmentPath,
-			singlePoints = []; // used in drawTracker
-		// Divide into segments and build graph and area paths
-		each(series.segments, function (segment) {
-			segmentPath = series.getSegmentPath(segment.points);
-			// add the segment to the graph, or a single point for tracking
-			if (segment.points.length > 1) {
-				graphPath.push([segmentPath, segment.color]);
-			} else {
-				singlePoints.push(segment.points);
-			}
-		});
-		
-		// Record it for use in drawGraph and drawTracker, and return graphPath
-		series.singlePoints = singlePoints;
-		series.graphPath = graphPath;
-		
-		return graphPath;
-	};
-	
-	H.seriesTypes.coloredline.prototype.drawGraph = function () {
-		var series = this,
-			options = series.options,
-			props = [['graph', options.lineColor || series.color]],
-			lineWidth = options.lineWidth,
-			dashStyle = options.dashStyle,
-			roundCap = options.linecap !== 'square',
-			graphPath = series.getGraphPath(),
-			graphPathLength = graphPath.length,
-			graphSegmentsLength = 0;
-		
-		function getSegment(segment, prop, i) {
-			var attribs = {
-					stroke: prop[1],
-					'stroke-width': lineWidth,
-					fill: 'none',
-					zIndex: 1 // #1069
-				},
-				item;
-			if (dashStyle) {
-				attribs.dashstyle = dashStyle;
-			} else if (roundCap) {
-				attribs['stroke-linecap'] = attribs['stroke-linejoin'] = 'round';
-			}
-			if (segment[1]) {
-				attribs.stroke = segment[1];
-			}
-			
-			item = series.chart.renderer.path(segment[0])
-			.attr(attribs)
-			.add(series.group);
-
-
-			if (item.shadow) {
-				item.shadow(!i && options.shadow);
-			}
-			
-			return item;
-		}
-
-		// draw the graph
-		each(props, function (prop, i) {
-			var graphKey = prop[0],
-				graph = series[graphKey],
-				g;
-			
-			if (graph) { // cancel running animations, #459
-				// do we have animation
-				each(graphPath, function (segment, j) {
-					// update color and path
-					
-					if (series[graphKey][j]) {
-						series[graphKey][j].attr({ d: segment[0], stroke: segment[1] });
-					} else {
-						series[graphKey][j] = getSegment(segment, prop, i);
-					}
-				});
-				
-			} else if (graphPath.length) { // #1487
-				graph = [];
-				each(graphPath, function (segment, j) {
-					graph[j] = getSegment(segment, prop, i);
-				});
-				series[graphKey] = graph;
-				// add destroying elements
-				series[graphKey].destroy = function () {
-					for (g in series[graphKey]) {  // eslint-disable-line
-						var el = series[graphKey][g];
-						if (el && el.destroy) {
-							el.destroy();
-						}
-					}
-				};
-			}
-			// Checks if series.graph exists. #3
-			graphSegmentsLength = (series.graph && series.graph.length) || -1;
-			
-			for (var j = graphSegmentsLength; j >= graphPathLength; j--) {
-				if (series[graphKey][j]) {
-					series[graphKey][j].destroy();
-					series[graphKey].splice(j, 1);
-				}
-			}
-		});
-	};
-
-	H.wrap(seriesTypes.coloredline.prototype, 'translate', function (proceed) {
-		proceed.apply(this, [].slice.call(arguments, 1));
-		if (this.getSegments) {
-			this.getSegments();
-		}
-	});
-	
-	
-	
-	/**
-	*
-	*   ColoredArea series type
-	*
-	**/
-	seriesTypes.coloredarea = H.extendClass(seriesTypes.coloredline);
-	
-	H.seriesTypes.coloredarea.prototype.init = function (chart, options) {
-		options.threshold = options.threshold || null;
-		H.Series.prototype.init.call(this, chart, options);
-	};
-	
-	H.seriesTypes.coloredarea.prototype.closeSegment = function (path, segment, translatedThreshold) {
-		path.push(
-			L,
-			segment[segment.length - 1].plotX,
-			translatedThreshold,
-			L,
-			segment[0].plotX,
-			translatedThreshold
-		);
-	};
-	
-	H.seriesTypes.coloredarea.prototype.drawGraph = function (f) {
-		H.seriesTypes.coloredline.prototype.drawGraph.call(this, f);
-		var series = this,
-			options = this.options,
-			props = [['graph', options.lineColor || series.color]];
-
-		each(props, function (prop) {
-			var graphKey = prop[0],
-				graph = series[graphKey];
-			
-			if (graph) { // cancel running animations, #459
-				// do we have animation
-				each(series.graphPath, function (segment, j) {
-					// update color and path
-					
-					if (series[graphKey][j]) {
-						series[graphKey][j].attr({ fill: segment[1] });
-					}
-				});
-				
-			}
-		});
-	};
-
-	/**
-	* Extend the base Series getSegmentPath method by adding the path for the area.
-	* This path is pushed to the series.areaPath property.
-	* @param {Object} segment of the path
-	* @returns {Array} Path (SVG)
-	**/
-	H.seriesTypes.coloredarea.prototype.getSegmentPath = function (segment) {
-		var segmentPath = H.Series.prototype.getSegmentPath.call(this, segment), // call base method
-			areaSegmentPath = [].concat(segmentPath), // work on a copy for the area path
-			i,
-			options = this.options,
-			segLength = segmentPath.length,
-			translatedThreshold = this.yAxis.getThreshold(options.threshold), // #2181
-			yBottom;
-
-		if (segLength === 3) { // for animation from 1 to two points
-			areaSegmentPath.push(L, segmentPath[1], segmentPath[2]);
-		}
-		if (options.stacking && !this.closedStacks) {
-			for (i = segment.length - 1; i >= 0; i--) {
-
-				yBottom = pick(segment[i].yBottom, translatedThreshold);
-
-				// step line?
-				if (i < segment.length - 1 && options.step) {
-					areaSegmentPath.push(segment[i + 1].plotX, yBottom);
-				}
-				areaSegmentPath.push(segment[i].plotX, yBottom);
-			}
-		} else { // follow zero line back
-			this.closeSegment(areaSegmentPath, segment, translatedThreshold);
-		}
-		return areaSegmentPath;
-	};
-	
-	H.seriesTypes.coloredarea.prototype.getGraphPath = function () {
-		var series = this,
-			graphPath = [],
-			segmentPath,
-			singlePoints = []; // used in drawTracker
-		// Divide into segments and build graph and area paths
-		
-		this.areaPath = [];
-		each(series.segments, function (segment) {
-			segmentPath = series.getSegmentPath(segment.points);
-			// add the segment to the graph, or a single point for tracking
-			if (segment.points.length > 1) {
-				graphPath.push([segmentPath, segment.color]);
-			} else {
-				singlePoints.push(segment.points);
-			}
-		});
-		
-		// Record it for use in drawGraph and drawTracker, and return graphPath
-		series.singlePoints = singlePoints;
-		series.graphPath = graphPath;
-		return graphPath;
-	
-	};
-	
-	H.seriesTypes.coloredarea.prototype.drawLegendSymbol = H.LegendSymbolMixin.drawRectangle;
-}));</script>
-<script>var HCDefaults = $.extend(true, {}, Highcharts.getOptions(), {});
-
-function ResetHighchartsOptions() {
-    // Fortunately, Highcharts returns the reference to defaultOptions itself
-    // We can manipulate this and delete all the properties
-    var defaultOptions = Highcharts.getOptions();
-    for (var prop in defaultOptions) {
-        if (typeof defaultOptions[prop] !== 'function') delete defaultOptions[prop];
-    }
-    // Fall back to the defaults that we captured initially, this resets the theme
-    Highcharts.setOptions(HCDefaults);
-}
-</script>
-<script>(function (H) {
-  
-  // cross http://stackoverflow.com/a/25379352/829971
-  Highcharts.Renderer.prototype.symbols.cross = function (x, y, radius) {
-    var r = radius * 0.4,
-        e = r * 0.8,
-        a = e / Math.sqrt(2),
-        p = r / Math.sqrt(2);
-    return [
-        'M', x, y + a,
-        'L', x + p, y + a + p,
-        x, y + a + (2 * p),
-        x + a, y + (2 * a) + (2 * p),
-        x + a + p, y + (2 * a) + p,
-        x + a + (2 * p), y + (2 * a) + (2 * p),
-        x + (2 * a) + (2 * p), y + a + (2 * p),
-        x + (2 * a) + p, y + a + p,
-        x + (2 * a) + (2 * p), y + a,
-        x + a + (2 * p), y,
-        x + a + p, y + p,
-        x + a, y,
-        'Z'];
-    };
-
-  // plus http://stackoverflow.com/a/36270224/829971
-  Highcharts.SVGRenderer.prototype.symbols.plus = function (x, y, w, h) {
-    return [
-        'M', x, y + (5 * h) / 8,
-        'L', x, y + (3 * h) / 8,
-        'L', x + (3 * w) / 8, y + (3 * h) / 8,
-        'L', x + (3 * w) / 8, y,
-        'L', x + (5 * w) / 8, y,
-        'L', x + (5 * w) / 8, y + (3 * h) / 8,
-        'L', x + w, y + (3 * h) / 8,
-        'L', x + w, y + (5 * h) / 8,
-        'L', x + (5 * w) / 8, y + (5 * h) / 8,
-        'L', x + (5 * w) / 8, y + h,
-        'L', x + (3 * w) / 8, y + h,
-        'L', x + (3 * w) / 8, y + (5 * h) / 8,
-        'L', x, y + (5 * h) / 8,
-        'z'
-    ];
-  };
-  
-  
-}(Highcharts));
-</script>
-<script>/* Highcharts plugin to handle text symbols */
-(function (H) {
-    function symbolWrap(proceed, symbol, x, y, w, h, options) {
-        if (symbol.indexOf('text:') === 0) {
-            var text = unescape(JSON.parse('"\\u' + symbol.split(':')[1] + '"')),
-                svgElem = this.text(text, x, y)
-                  .attr({
-                    translateY: h,
-                    translateX: -1
-                  })
-                  .css({
-                    fontFamily: 'FontAwesome',
-                    fontSize: h * 2
-                  });
-                
-            if (svgElem.renderer.isVML) {
-                svgElem.fillSetter = function (value, key, element) {
-                    element.style.color = H.Color(value).get('rgb');
-                };
-            }
-            return svgElem;
-        }
-        return proceed.apply(this, [].slice.call(arguments, 1));
-    }
-    H.wrap(H.SVGRenderer.prototype, 'symbol', symbolWrap);
-    if (H.VMLRenderer) {
-        H.wrap(H.VMLRenderer.prototype, 'symbol', symbolWrap);
-    }
-    
-    // Load the font for SVG files also
-    /*
-    H.wrap(H.Chart.prototype, 'getSVG', function (proceed) {
-        var svg = proceed.call(this);
-        svg = '<?xml-stylesheet type="text/css" ' +
-            'href="http://netdna.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" ?>' + 
-            svg;
-        return svg;
-    });
-    */
-}(Highcharts));
-</script>
-<script>HTMLWidgets.widget({
-
-  name: 'highchart',
-
-  type: 'output',
-
-  initialize: function(el, width, height) {
-
-    return {
-      // TODO: add instance fields as required
-    };
-
-  },
-
-  renderValue: function(el, x, instance) {
-    
-    if(x.debug) {
-      window.xclone = JSON.parse(JSON.stringify(x));
-      window.elclone = $(el);
-      console.log(el);
-      console.log("hc_opts", x.hc_opts);
-      console.log("theme", x.theme);
-      console.log("conf_opts", x.conf_opts);
-    }
-
-    if(x.fonts !== undefined) {
-      
-      x.fonts = ((typeof(x.fonts) == "string") ? [x.fonts] : x.fonts);
-    
-      x.fonts.forEach(function(s){
-        /* http://stackoverflow.com/questions/4724606 */
-        var urlfont = 'https://fonts.googleapis.com/css?family=' + s;
-        if (!$("link[href='" + urlfont + "']").length) {
-          $('<link href="' + urlfont + '" rel="stylesheet" type="text/css">').appendTo("head");
-        }
-        
-      });
-      
-    }
-    
-    ResetHighchartsOptions();
-    
-    if(x.theme !== null) {
-      
-      if(x.debug) console.log("adding THEME");
-      
-      Highcharts.setOptions(x.theme);
-      
-    }
-    
-    if((x.theme && x.theme.chart.divBackgroundImage !== undefined) |
-         (x.hc_opts.chart  && x.hc_opts.chart.divBackgroundImage !== undefined)) {
-           
-      if(x.debug) console.log("adding BackgroundImage");     
-           
-      var bkgrnd = x.theme.chart.divBackgroundImage || x.hc_opts.chart.divBackgroundImage;
-      
-      Highcharts.wrap(Highcharts.Chart.prototype, "getContainer", function (proceed) {
-        
-        proceed.call(this);
-        
-        $("#" + el.id).css("background-image", "url(" + bkgrnd + ")");
-        $("#" + el.id).css("-webkit-background-size", "cover");
-        $("#" + el.id).css("-moz-background-size", "cover");
-        $("#" + el.id).css("-o-background-size", "cover");
-        $("#" + el.id).css("background-size", "cover");
-        
-      });
-      
-    }
-    
-    Highcharts.setOptions(x.conf_opts);
-    
-    if(x.type == "chart") {
-      if(x.debug) console.log("charting CHART");
-      $("#" + el.id).highcharts(x.hc_opts);
-    } else if (x.type == "stock") {
-      if(x.debug) console.log("charting STOCK");
-      $("#" + el.id).highcharts('StockChart', x.hc_opts);  
-    } else if (x.type == "map"){
-      if(x.debug) console.log("charting MAP");
-
-      x.hc_opts.series = x.hc_opts.series.map(function(e){
-        if(e.geojson === true) {
-          if(x.debug) console.log("geojson\n\t", e.type, "\n\t", typeof(e.series));
-          e.data = Highcharts.geojson(e.data, e.type);
-        }
-        return e;
-      });
-      
-      $("#" + el.id).highcharts('Map', x.hc_opts); 
-      
-      if(x.hc_opts.mapNavigation !== undefined && x.hc_opts.mapNavigation.enabled === true){
-        /* if have navigation option and enabled true: http://stackoverflow.com/questions/7600454 */
-        $("#" + el.id).bind( 'mousewheel DOMMouseScroll', function ( e ) {
-          var e0 = e.originalEvent,
-          delta = e0.wheelDelta || -e0.detail;
-          this.scrollTop += ( delta < 0 ? 1 : -1 ) * 30;
-          e.preventDefault();
-
-        });
-        
-      }
-      
-    }
-    
-    if(x.hc_opts.motion !== undefined) {
-      
-      $("#" + el.id).css({"position" : "relative" });
-      
-      if(x.debug) console.log("setting MOTION options");
-      
-      var pc = $($("#" + el.id).find("#play-controls")[0]);
-      
-      var ct = x.theme.chart;
-      
-      if(ct.backgroundColor !== undefined) $(pc.find("#play-pause-button")[0]).css({backgroundColor : x.theme.chart.backgroundColor});
-      if(ct.style !== undefined)  $(pc.find("#play-output")[0]).css(x.theme.chart.style);
-      if(ct.style !== undefined && ct.style.color !== undefined) $(pc.find("#play-pause-button")[0]).css({color : x.theme.chart.style.color});
-      
-      
-    } 
-    
-  },
-
-  resize: function(el, width, height, instance) {
-    
-    /* http://stackoverflow.com/questions/18445784/ */
-    var chart = $("#" +el.id).highcharts();
-    var w = chart.renderTo.clientWidth; 
-    var h = chart.renderTo.clientHeight; 
-    chart.setSize(w, h); 
-
-  }
-
-});
-</script>
-
-</head>
-<body>
-<div id="htmlwidget_container">
-  <div id="htmlwidget-c35f66576b27eaeac90f" style="width:100%;height:500px;" class="highchart html-widget"></div>
-</div>
-<script type="application/json" data-for="htmlwidget-c35f66576b27eaeac90f">{"x":{"hc_opts":{"title":{"text":null},"yAxis":{"title":{"text":""},"ceiling":100,"floor":0,"labels":{"format":"{value} %"}},"credits":{"enabled":true,"text":"KorAP R Client Pakckage","href":"//github.com/KorAP/RKorAPClient/"},"exporting":{"enabled":true},"plotOptions":{"series":{"label":{"enabled":false},"turboThreshold":0},"treemap":{"layoutAlgorithm":"squarified"},"line":{"cursor":"pointer","point":{"events":{"click":"function() { window.open(this.click, 'korap'); }"}}}},"chart":{"zoomType":"xy"},"xAxis":{"allowDecimals":false},"tooltip":{"formatter":"function (tooltip) {\n        var str = tooltip.defaultFormatter.call(this, tooltip);\n        if(Array.isArray(str))  {\n          str = str.join('');\n        }\n       for (var i = 0; i < this.points.length; i++) {\n         str = str.replace(/([0-9.,]+.?)%/, this.points[i].point.count+' ($1@)');\n       }\n       return str.replace(/@/g, '%')\n      } ","crosshairs":true,"valueDecimals":2,"shared":true,"valueSuffix":" %"},"series":[{"group":"group","data":[{"year":1980,"value":95,"count":19,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201980&ql=poliqarp","x":1980,"y":95},{"year":1981,"value":92.8571428571429,"count":26,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201981&ql=poliqarp","x":1981,"y":92.8571428571429},{"year":1982,"value":91.4285714285714,"count":32,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201982&ql=poliqarp","x":1982,"y":91.4285714285714},{"year":1983,"value":88.8888888888889,"count":24,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201983&ql=poliqarp","x":1983,"y":88.8888888888889},{"year":1984,"value":82.9268292682927,"count":34,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201984&ql=poliqarp","x":1984,"y":82.9268292682927},{"year":1985,"value":86.7924528301887,"count":46,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201985&ql=poliqarp","x":1985,"y":86.7924528301887},{"year":1986,"value":77.1428571428572,"count":27,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201986&ql=poliqarp","x":1986,"y":77.1428571428572},{"year":1987,"value":97.6744186046512,"count":42,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201987&ql=poliqarp","x":1987,"y":97.6744186046512},{"year":1988,"value":94.8717948717949,"count":37,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201988&ql=poliqarp","x":1988,"y":94.8717948717949},{"year":1989,"value":93.4426229508197,"count":57,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201989&ql=poliqarp","x":1989,"y":93.4426229508197},{"year":1990,"value":93.5897435897436,"count":73,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201990&ql=poliqarp","x":1990,"y":93.5897435897436},{"year":1991,"value":90.2173913043478,"count":83,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201991&ql=poliqarp","x":1991,"y":90.2173913043478},{"year":1992,"value":91.6129032258064,"count":142,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201992&ql=poliqarp","x":1992,"y":91.6129032258064},{"year":1993,"value":88.2352941176471,"count":180,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201993&ql=poliqarp","x":1993,"y":88.2352941176471},{"year":1994,"value":89.9521531100478,"count":188,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201994&ql=poliqarp","x":1994,"y":89.9521531100478},{"year":1995,"value":93.6395759717314,"count":265,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201995&ql=poliqarp","x":1995,"y":93.6395759717314},{"year":1996,"value":95.0664136622391,"count":501,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201996&ql=poliqarp","x":1996,"y":95.0664136622391},{"year":1997,"value":94.1446613088404,"count":820,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201997&ql=poliqarp","x":1997,"y":94.1446613088404},{"year":1998,"value":95.6093189964158,"count":1067,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201998&ql=poliqarp","x":1998,"y":95.6093189964158},{"year":1999,"value":94.410480349345,"count":1081,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201999&ql=poliqarp","x":1999,"y":94.410480349345},{"year":2000,"value":94.3931398416887,"count":1431,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202000&ql=poliqarp","x":2000,"y":94.3931398416887},{"year":2001,"value":93.3433059087509,"count":1248,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202001&ql=poliqarp","x":2001,"y":93.3433059087509},{"year":2002,"value":92.2088353413655,"count":1148,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202002&ql=poliqarp","x":2002,"y":92.2088353413655},{"year":2003,"value":93.6958234830575,"count":1189,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202003&ql=poliqarp","x":2003,"y":93.6958234830575},{"year":2004,"value":91.7331399564902,"count":1265,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202004&ql=poliqarp","x":2004,"y":91.7331399564902},{"year":2005,"value":91.3284132841328,"count":1485,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202005&ql=poliqarp","x":2005,"y":91.3284132841328},{"year":2006,"value":91.3741820345033,"count":1536,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202006&ql=poliqarp","x":2006,"y":91.3741820345033},{"year":2007,"value":91.7490118577075,"count":1857,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202007&ql=poliqarp","x":2007,"y":91.7490118577075},{"year":2008,"value":90.4109589041096,"count":1848,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202008&ql=poliqarp","x":2008,"y":90.4109589041096},{"year":2009,"value":88.5201793721973,"count":1974,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202009&ql=poliqarp","x":2009,"y":88.5201793721973},{"year":2010,"value":88.6103542234332,"count":1626,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202010&ql=poliqarp","x":2010,"y":88.6103542234332},{"year":2011,"value":85.5329949238579,"count":1685,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202011&ql=poliqarp","x":2011,"y":85.5329949238579},{"year":2012,"value":86.0191637630662,"count":1975,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202012&ql=poliqarp","x":2012,"y":86.0191637630662},{"year":2013,"value":85.4394175767031,"count":1643,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202013&ql=poliqarp","x":2013,"y":85.4394175767031},{"year":2014,"value":82.6344086021505,"count":1537,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202014&ql=poliqarp","x":2014,"y":82.6344086021505},{"year":2015,"value":81.692573402418,"count":1419,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202015&ql=poliqarp","x":2015,"y":81.692573402418},{"year":2016,"value":79.7794117647059,"count":1736,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202016&ql=poliqarp","x":2016,"y":79.7794117647059},{"year":2017,"value":76.7591674925669,"count":1549,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202017&ql=poliqarp","x":2017,"y":76.7591674925669},{"year":2018,"value":76.6076823478636,"count":1775,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202018&ql=poliqarp","x":2018,"y":76.6076823478636}],"type":"line","marker":{"radius":2},"name":"macht []{0,3} Sinn","colorIndex":0,"zIndex":1},{"group":"group","data":[{"year":1980,"conf.low":73.0556254428533,"conf.high":99.7384444863308,"x":1980,"low":73.0556254428533,"high":99.7384444863308},{"year":1981,"conf.low":75.0416182995313,"conf.high":98.7530739684036,"x":1981,"low":75.0416182995313,"high":98.7530739684036},{"year":1982,"conf.low":75.8135574242256,"conf.high":97.7598332506547,"x":1982,"low":75.8135574242256,"high":97.7598332506547},{"year":1983,"conf.low":69.7033791207719,"conf.high":97.0855730276021,"x":1983,"low":69.7033791207719,"high":97.0855730276021},{"year":1984,"conf.low":67.3539788176602,"conf.high":92.3044226330955,"x":1984,"low":67.3539788176602,"high":92.3044226330955},{"year":1985,"conf.low":74.0470006283946,"conf.high":94.0862847303049,"x":1985,"low":74.0470006283946,"high":94.0862847303049},{"year":1986,"conf.low":59.4479825671614,"conf.high":88.9555988147557,"x":1986,"low":59.4479825671614,"high":88.9555988147557},{"year":1987,"conf.low":86.2041579742542,"conf.high":99.8784845682876,"x":1987,"low":86.2041579742542,"high":99.8784845682876},{"year":1988,"conf.low":81.3702907377942,"conf.high":99.1067618864895,"x":1988,"low":81.3702907377942,"high":99.1067618864895},{"year":1989,"conf.low":83.2526021667365,"conf.high":97.878478711837,"x":1989,"low":83.2526021667365,"high":97.878478711837},{"year":1990,"conf.low":85.0313310022991,"conf.high":97.6161203738943,"x":1990,"low":85.0313310022991,"high":97.6161203738943},{"year":1991,"conf.low":81.7874365227723,"conf.high":95.1503602743896,"x":1991,"low":81.7874365227723,"high":95.1503602743896},{"year":1992,"conf.low":85.7943864616299,"conf.high":95.2755127963722,"x":1992,"low":85.7943864616299,"high":95.2755127963722},{"year":1993,"conf.low":82.8131666172552,"conf.high":92.1674041087979,"x":1993,"low":82.8131666172552,"high":92.1674041087979},{"year":1994,"conf.low":84.8524475330347,"conf.high":93.5271280408146,"x":1994,"low":84.8524475330347,"high":93.5271280408146},{"year":1995,"conf.low":89.9617269742647,"conf.high":96.0779057390259,"x":1995,"low":89.9617269742647,"high":96.0779057390259},{"year":1996,"conf.low":92.7588248047252,"conf.high":96.6889139250739,"x":1996,"low":92.7588248047252,"high":96.6889139250739},{"year":1997,"conf.low":92.3187801516029,"conf.high":95.5687285190094,"x":1997,"low":92.3187801516029,"high":95.5687285190094},{"year":1998,"conf.low":94.1922884077845,"conf.high":96.7018917906517,"x":1998,"low":94.1922884077845,"high":96.7018917906517},{"year":1999,"conf.low":92.8770023729847,"conf.high":95.6372910917686,"x":1999,"low":92.8770023729847,"high":95.6372910917686},{"year":2000,"conf.low":93.0828461889237,"conf.high":95.4726693219818,"x":2000,"low":93.0828461889237,"high":95.4726693219818},{"year":2001,"conf.low":91.8383944966634,"conf.high":94.5929521984824,"x":2001,"low":91.8383944966634,"high":94.5929521984824},{"year":2002,"conf.low":90.5432680262243,"conf.high":93.6077652407648,"x":2002,"low":90.5432680262243,"high":93.6077652407648},{"year":2003,"conf.low":92.1791498893459,"conf.high":94.9410251899362,"x":2003,"low":92.1791498893459,"high":94.9410251899362},{"year":2004,"conf.low":90.1221252311976,"conf.high":93.1065320575451,"x":2004,"low":90.1221252311976,"high":93.1065320575451},{"year":2005,"conf.low":89.8284370349406,"conf.high":92.6292079103436,"x":2005,"low":89.8284370349406,"high":92.6292079103436},{"year":2006,"conf.low":89.9042340640674,"conf.high":92.6512963935937,"x":2006,"low":89.9042340640674,"high":92.6512963935937},{"year":2007,"conf.low":90.4435099893752,"conf.high":92.8930888163329,"x":2007,"low":90.4435099893752,"high":92.8930888163329},{"year":2008,"conf.low":89.0317811592721,"conf.high":91.6356286412622,"x":2008,"low":89.0317811592721,"high":91.6356286412622},{"year":2009,"conf.low":87.1068400158732,"conf.high":89.798794728802,"x":2009,"low":87.1068400158732,"high":89.798794728802},{"year":2010,"conf.low":87.0467359370189,"conf.high":90.0096371872936,"x":2010,"low":87.0467359370189,"high":90.0096371872936},{"year":2011,"conf.low":83.8839987194577,"conf.high":87.0414282239757,"x":2011,"low":83.8839987194577,"high":87.0414282239757},{"year":2012,"conf.low":84.5177569547539,"conf.high":87.3983998187093,"x":2012,"low":84.5177569547539,"high":87.3983998187093},{"year":2013,"conf.low":83.7652021049103,"conf.high":86.9699990356046,"x":2013,"low":83.7652021049103,"high":86.9699990356046},{"year":2014,"conf.low":80.8181948805348,"conf.high":84.314003652223,"x":2014,"low":80.8181948805348,"high":84.314003652223},{"year":2015,"conf.low":79.7748079995102,"conf.high":83.4682591055029,"x":2015,"low":79.7748079995102,"high":83.4682591055029},{"year":2016,"conf.low":78.0163863298564,"conf.high":81.4360515897676,"x":2016,"low":78.0163863298564,"high":81.4360515897676},{"year":2017,"conf.low":74.8411618656268,"conf.high":78.5741239916616,"x":2017,"low":74.8411618656268,"high":78.5741239916616},{"year":2018,"conf.low":74.8187262167962,"conf.high":78.3074548915808,"x":2018,"low":74.8187262167962,"high":78.3074548915808}],"type":"arearange","name":"ci","fillOpacity":0.3,"lineWidth":0,"marker":{"enabled":false},"enableMouseTracking":false,"linkedTo":":previous","colorIndex":0,"zIndex":0},{"group":"group","data":[{"year":1980,"value":5,"count":1,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201980&ql=poliqarp","x":1980,"y":5},{"year":1981,"value":7.14285714285714,"count":2,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201981&ql=poliqarp","x":1981,"y":7.14285714285714},{"year":1982,"value":8.57142857142857,"count":3,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201982&ql=poliqarp","x":1982,"y":8.57142857142857},{"year":1983,"value":11.1111111111111,"count":3,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201983&ql=poliqarp","x":1983,"y":11.1111111111111},{"year":1984,"value":17.0731707317073,"count":7,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201984&ql=poliqarp","x":1984,"y":17.0731707317073},{"year":1985,"value":13.2075471698113,"count":7,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201985&ql=poliqarp","x":1985,"y":13.2075471698113},{"year":1986,"value":22.8571428571429,"count":8,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201986&ql=poliqarp","x":1986,"y":22.8571428571429},{"year":1987,"value":2.32558139534884,"count":1,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201987&ql=poliqarp","x":1987,"y":2.32558139534884},{"year":1988,"value":5.12820512820513,"count":2,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201988&ql=poliqarp","x":1988,"y":5.12820512820513},{"year":1989,"value":6.55737704918033,"count":4,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201989&ql=poliqarp","x":1989,"y":6.55737704918033},{"year":1990,"value":6.41025641025641,"count":5,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201990&ql=poliqarp","x":1990,"y":6.41025641025641},{"year":1991,"value":9.78260869565217,"count":9,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201991&ql=poliqarp","x":1991,"y":9.78260869565217},{"year":1992,"value":8.38709677419355,"count":13,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201992&ql=poliqarp","x":1992,"y":8.38709677419355},{"year":1993,"value":11.7647058823529,"count":24,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201993&ql=poliqarp","x":1993,"y":11.7647058823529},{"year":1994,"value":10.0478468899522,"count":21,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201994&ql=poliqarp","x":1994,"y":10.0478468899522},{"year":1995,"value":6.36042402826855,"count":18,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201995&ql=poliqarp","x":1995,"y":6.36042402826855},{"year":1996,"value":4.93358633776091,"count":26,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201996&ql=poliqarp","x":1996,"y":4.93358633776091},{"year":1997,"value":5.85533869115959,"count":51,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201997&ql=poliqarp","x":1997,"y":5.85533869115959},{"year":1998,"value":4.39068100358423,"count":49,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201998&ql=poliqarp","x":1998,"y":4.39068100358423},{"year":1999,"value":5.58951965065502,"count":64,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201999&ql=poliqarp","x":1999,"y":5.58951965065502},{"year":2000,"value":5.60686015831135,"count":85,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202000&ql=poliqarp","x":2000,"y":5.60686015831135},{"year":2001,"value":6.65669409124907,"count":89,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202001&ql=poliqarp","x":2001,"y":6.65669409124907},{"year":2002,"value":7.79116465863454,"count":97,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202002&ql=poliqarp","x":2002,"y":7.79116465863454},{"year":2003,"value":6.30417651694247,"count":80,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202003&ql=poliqarp","x":2003,"y":6.30417651694247},{"year":2004,"value":8.26686004350979,"count":114,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202004&ql=poliqarp","x":2004,"y":8.26686004350979},{"year":2005,"value":8.67158671586716,"count":141,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202005&ql=poliqarp","x":2005,"y":8.67158671586716},{"year":2006,"value":8.62581796549673,"count":145,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202006&ql=poliqarp","x":2006,"y":8.62581796549673},{"year":2007,"value":8.25098814229249,"count":167,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202007&ql=poliqarp","x":2007,"y":8.25098814229249},{"year":2008,"value":9.58904109589041,"count":196,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202008&ql=poliqarp","x":2008,"y":9.58904109589041},{"year":2009,"value":11.4798206278027,"count":256,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202009&ql=poliqarp","x":2009,"y":11.4798206278027},{"year":2010,"value":11.3896457765668,"count":209,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202010&ql=poliqarp","x":2010,"y":11.3896457765668},{"year":2011,"value":14.4670050761421,"count":285,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202011&ql=poliqarp","x":2011,"y":14.4670050761421},{"year":2012,"value":13.9808362369338,"count":321,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202012&ql=poliqarp","x":2012,"y":13.9808362369338},{"year":2013,"value":14.5605824232969,"count":280,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202013&ql=poliqarp","x":2013,"y":14.5605824232969},{"year":2014,"value":17.3655913978495,"count":323,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202014&ql=poliqarp","x":2014,"y":17.3655913978495},{"year":2015,"value":18.307426597582,"count":318,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202015&ql=poliqarp","x":2015,"y":18.307426597582},{"year":2016,"value":20.2205882352941,"count":440,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202016&ql=poliqarp","x":2016,"y":20.2205882352941},{"year":2017,"value":23.2408325074331,"count":469,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202017&ql=poliqarp","x":2017,"y":23.2408325074331},{"year":2018,"value":23.3923176521364,"count":542,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202018&ql=poliqarp","x":2018,"y":23.3923176521364}],"type":"line","marker":{"radius":2},"name":"ergibt []{0,3} Sinn","colorIndex":1,"zIndex":1},{"group":"group","data":[{"year":1980,"conf.low":0.261555513669134,"conf.high":26.9443745571467,"x":1980,"low":0.261555513669134,"high":26.9443745571467},{"year":1981,"conf.low":1.2469260315964,"conf.high":24.9583817004687,"x":1981,"low":1.2469260315964,"high":24.9583817004687},{"year":1982,"conf.low":2.24016674934531,"conf.high":24.1864425757744,"x":1982,"low":2.24016674934531,"high":24.1864425757744},{"year":1983,"conf.low":2.91442697239796,"conf.high":30.2966208792281,"x":1983,"low":2.91442697239796,"high":30.2966208792281},{"year":1984,"conf.low":7.69557736690451,"conf.high":32.6460211823398,"x":1984,"low":7.69557736690451,"high":32.6460211823398},{"year":1985,"conf.low":5.91371526969509,"conf.high":25.9529993716054,"x":1985,"low":5.91371526969509,"high":25.9529993716054},{"year":1986,"conf.low":11.0444011852443,"conf.high":40.5520174328386,"x":1986,"low":11.0444011852443,"high":40.5520174328386},{"year":1987,"conf.low":0.121515431712356,"conf.high":13.7958420257458,"x":1987,"low":0.121515431712356,"high":13.7958420257458},{"year":1988,"conf.low":0.893238113510509,"conf.high":18.6297092622058,"x":1988,"low":0.893238113510509,"high":18.6297092622058},{"year":1989,"conf.low":2.12152128816304,"conf.high":16.7473978332635,"x":1989,"low":2.12152128816304,"high":16.7473978332635},{"year":1990,"conf.low":2.3838796261057,"conf.high":14.9686689977009,"x":1990,"low":2.3838796261057,"high":14.9686689977009},{"year":1991,"conf.low":4.84963972561041,"conf.high":18.2125634772277,"x":1991,"low":4.84963972561041,"high":18.2125634772277},{"year":1992,"conf.low":4.72448720362782,"conf.high":14.2056135383702,"x":1992,"low":4.72448720362782,"high":14.2056135383702},{"year":1993,"conf.low":7.83259589120209,"conf.high":17.1868333827448,"x":1993,"low":7.83259589120209,"high":17.1868333827448},{"year":1994,"conf.low":6.4728719591854,"conf.high":15.1475524669653,"x":1994,"low":6.4728719591854,"high":15.1475524669653},{"year":1995,"conf.low":3.92209426097411,"conf.high":10.0382730257353,"x":1995,"low":3.92209426097411,"high":10.0382730257353},{"year":1996,"conf.low":3.31108607492606,"conf.high":7.24117519527483,"x":1996,"low":3.31108607492606,"high":7.24117519527483},{"year":1997,"conf.low":4.43127148099064,"conf.high":7.68121984839713,"x":1997,"low":4.43127148099064,"high":7.68121984839713},{"year":1998,"conf.low":3.29810820934828,"conf.high":5.80771159221546,"x":1998,"low":3.29810820934828,"high":5.80771159221546},{"year":1999,"conf.low":4.36270890823145,"conf.high":7.12299762701531,"x":1999,"low":4.36270890823145,"high":7.12299762701531},{"year":2000,"conf.low":4.52733067801824,"conf.high":6.91715381107628,"x":2000,"low":4.52733067801824,"high":6.91715381107628},{"year":2001,"conf.low":5.40704780151759,"conf.high":8.16160550333665,"x":2001,"low":5.40704780151759,"high":8.16160550333665},{"year":2002,"conf.low":6.3922347592352,"conf.high":9.45673197377574,"x":2002,"low":6.3922347592352,"high":9.45673197377574},{"year":2003,"conf.low":5.05897481006378,"conf.high":7.82085011065408,"x":2003,"low":5.05897481006378,"high":7.82085011065408},{"year":2004,"conf.low":6.89346794245487,"conf.high":9.87787476880238,"x":2004,"low":6.89346794245487,"high":9.87787476880238},{"year":2005,"conf.low":7.3707920896564,"conf.high":10.1715629650594,"x":2005,"low":7.3707920896564,"high":10.1715629650594},{"year":2006,"conf.low":7.34870360640627,"conf.high":10.0957659359326,"x":2006,"low":7.34870360640627,"high":10.0957659359326},{"year":2007,"conf.low":7.10691118366707,"conf.high":9.5564900106248,"x":2007,"low":7.10691118366707,"high":9.5564900106248},{"year":2008,"conf.low":8.36437135873775,"conf.high":10.9682188407279,"x":2008,"low":8.36437135873775,"high":10.9682188407279},{"year":2009,"conf.low":10.201205271198,"conf.high":12.8931599841268,"x":2009,"low":10.201205271198,"high":12.8931599841268},{"year":2010,"conf.low":9.99036281270643,"conf.high":12.9532640629811,"x":2010,"low":9.99036281270643,"high":12.9532640629811},{"year":2011,"conf.low":12.9585717760243,"conf.high":16.1160012805423,"x":2011,"low":12.9585717760243,"high":16.1160012805423},{"year":2012,"conf.low":12.6016001812907,"conf.high":15.4822430452461,"x":2012,"low":12.6016001812907,"high":15.4822430452461},{"year":2013,"conf.low":13.0300009643954,"conf.high":16.2347978950897,"x":2013,"low":13.0300009643954,"high":16.2347978950897},{"year":2014,"conf.low":15.685996347777,"conf.high":19.1818051194652,"x":2014,"low":15.685996347777,"high":19.1818051194652},{"year":2015,"conf.low":16.5317408944971,"conf.high":20.2251920004898,"x":2015,"low":16.5317408944971,"high":20.2251920004898},{"year":2016,"conf.low":18.5639484102324,"conf.high":21.9836136701436,"x":2016,"low":18.5639484102324,"high":21.9836136701436},{"year":2017,"conf.low":21.4258760083384,"conf.high":25.1588381343732,"x":2017,"low":21.4258760083384,"high":25.1588381343732},{"year":2018,"conf.low":21.6925451084192,"conf.high":25.1812737832038,"x":2018,"low":21.6925451084192,"high":25.1812737832038}],"type":"arearange","name":"ci","fillOpacity":0.3,"lineWidth":0,"marker":{"enabled":false},"enableMouseTracking":false,"linkedTo":":previous","colorIndex":1,"zIndex":0}]},"theme":{"colors":["#1F77B4","#FF7F0E","#2CA02C","#D62728","#9467BD","#8C564B","#E377C2","#7F7F7F","#BCBD22","#17BECF","#AEC7E8","#FFBB78","#98DF8A","#FF9896","#C5B0D5","#C49C94","#F7B6D2","#C7C7C7","#DBDB8D","#9EDAE5"],"chart":{"style":{"color":"#333","fontFamily":"Open Sans"}},"title":{"style":{"fontFamily":"Raleway","fontWeight":"100"}},"subtitle":{"style":{"fontFamily":"Raleway","fontWeight":"100"}},"legend":{"align":"right","verticalAlign":"bottom"},"xAxis":{"gridLineWidth":1,"gridLineColor":"#F3F3F3","lineColor":"#F3F3F3","minorGridLineColor":"#F3F3F3","tickColor":"#F3F3F3","tickWidth":1},"yAxis":{"gridLineColor":"#F3F3F3","lineColor":"#F3F3F3","minorGridLineColor":"#F3F3F3","tickColor":"#F3F3F3","tickWidth":1}},"conf_opts":{"global":{"Date":null,"VMLRadialGradientURL":"http =//code.highcharts.com/list(version)/gfx/vml-radial-gradient.png","canvasToolsURL":"http =//code.highcharts.com/list(version)/modules/canvas-tools.js","getTimezoneOffset":null,"timezoneOffset":0,"useUTC":true},"lang":{"contextButtonTitle":"Chart context menu","decimalPoint":".","downloadJPEG":"Download JPEG image","downloadPDF":"Download PDF document","downloadPNG":"Download PNG image","downloadSVG":"Download SVG vector image","drillUpText":"Back to {series.name}","invalidDate":null,"loading":"Loading...","months":["January","February","March","April","May","June","July","August","September","October","November","December"],"noData":"No data to display","numericSymbols":["k","M","G","T","P","E"],"printChart":"Print chart","resetZoom":"Reset zoom","resetZoomTitle":"Reset zoom level 1:1","shortMonths":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"thousandsSep":" ","weekdays":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]}},"type":"chart","fonts":["Open+Sans","Raleway"],"debug":false},"evals":["hc_opts.plotOptions.line.point.events.click","hc_opts.tooltip.formatter"],"jsHooks":[]}</script>
-<script type="application/htmlwidget-sizing" data-for="htmlwidget-c35f66576b27eaeac90f">{"viewer":{"width":"100%","height":350,"padding":0,"fill":true},"browser":{"width":"100%","height":500,"padding":0,"fill":true}}</script>
-</body>
-</html>
