text: /* -----------------------------------------------
  /* Author : Vincent Garreau  - vincentgarreau.com
  /* MIT license: http://opensource.org/licenses/MIT
  /* GitHub : https://github.com/VincentGarreau/particles.js
  /* How to use? : Check the GitHub README
  /* v1.0.3
  /* ----------------------------------------------- */
  
  function launchParticlesJS( tag_id, params ){
  
    var canvas_el;
  
    if ( params.group ){
      canvas_el = tag_id.querySelector('canvas');
    } else {
      if( !params.canvas ){
          canvas_el = document.querySelector('#'+tag_id+' > canvas');
      } else {
          canvas_el = params.canvas.el;
      }
    }
  
    /*  if ( tag_id === "string" ){
      var canvas_el = document.querySelector('#'+tag_id+' > canvas');
    } else {
      var canvas_el = tag_id.querySelector('canvas');
    }
    */
  
    /* particles.js variables with default values */
    pJS = {
      canvas: {
        el: canvas_el,
        w: canvas_el.offsetWidth,
        h: canvas_el.offsetHeight,
        bgc: ""
      },
      particles: {
        color: '#fff',
        shape: 'circle',
        opacity: 1,
        size: 2.5,
        size_random: true,
        nb: 200,
        line_linked: {
          enable_auto: true,
          distance: 100,
          color: '#fff',
          opacity: 1,
          width: 1,
          condensed_mode: {
            enable: true,
            rotateX: 65000,
            rotateY: 65000
          }
        },
        anim: {
          enable: true,
            speed: 1
        },
        array: []
      },
      interactivity: {
        enable: true,
        mouse: {
          distance: 100
        },
        detect_on: 'canvas',
        mode: 'grab',
        line_linked: {
          opacity: 1
        },
        events: {
          onclick: {
            enable: true,
            mode: 'push',
            nb: 4
          }
        }
      },
      retina_detect: false,
      fn: {
        vendors:{
          interactivity: {}
        }
      }
    };
  
    /* params settings */
    if(params){
      if(params.particles){
        var paramsForParticles = params.particles;
        if(paramsForParticles.color) pJS.particles.color = paramsForParticles.color;
        if(paramsForParticles.shape) pJS.particles.shape = paramsForParticles.shape;
        if(paramsForParticles.opacity) pJS.particles.opacity = paramsForParticles.opacity;
        if(paramsForParticles.size) pJS.particles.size = paramsForParticles.size;
        if(paramsForParticles.size_random === false) pJS.particles.size_random = paramsForParticles.size_random;
        if(paramsForParticles.nb) pJS.particles.nb = paramsForParticles.nb;
        if(paramsForParticles.line_linked){
          var paramsForLineLinked = paramsForParticles.line_linked;
          if(paramsForLineLinked.enable_auto === false) pJS.particles.line_linked.enable_auto = paramsForLineLinked.enable_auto;
          if(paramsForLineLinked.distance) pJS.particles.line_linked.distance = paramsForLineLinked.distance;
          if(paramsForLineLinked.color) pJS.particles.line_linked.color = paramsForLineLinked.color;
          if(paramsForLineLinked.opacity) pJS.particles.line_linked.opacity = paramsForLineLinked.opacity;
          if(paramsForLineLinked.width) pJS.particles.line_linked.width = paramsForLineLinked.width;
          if(paramsForLineLinked.condensed_mode){
            var paramsForCondensedMode = paramsForLineLinked.condensed_mode;
            if(paramsForCondensedMode.enable === false) pJS.particles.line_linked.condensed_mode.enable = paramsForCondensedMode.enable;
            if(paramsForCondensedMode.rotateX) pJS.particles.line_linked.condensed_mode.rotateX = paramsForCondensedMode.rotateX;
            if(paramsForCondensedMode.rotateY) pJS.particles.line_linked.condensed_mode.rotateY = paramsForCondensedMode.rotateY;
          }
        }
        if(paramsForParticles.anim){
          var paramsForAnim = paramsForParticles.anim;
          if(paramsForAnim.enable === false) pJS.particles.anim.enable = paramsForAnim.enable;
          if(paramsForAnim.speed) pJS.particles.anim.speed = paramsForAnim.speed;
        }
      }
      if(params.interactivity){
        var paramsForInteractivity = params.interactivity;
        if(paramsForInteractivity.enable === false) pJS.interactivity.enable = paramsForInteractivity.enable;
        if(paramsForInteractivity.mouse){
          if(paramsForInteractivity.mouse.distance) pJS.interactivity.mouse.distance = paramsForInteractivity.mouse.distance;
        }
        if(paramsForInteractivity.detect_on) pJS.interactivity.detect_on = paramsForInteractivity.detect_on;
        if(paramsForInteractivity.mode) pJS.interactivity.mode = paramsForInteractivity.mode;
        if(paramsForInteractivity.line_linked){
          if(paramsForInteractivity.line_linked.opacity) pJS.interactivity.line_linked.opacity = paramsForInteractivity.line_linked.opacity;
        }
        if(paramsForInteractivity.events){
          var paramsForEvents = paramsForInteractivity.events;
          if(paramsForEvents.onclick){
            var paramsForOnclick = paramsForEvents.onclick;
            if(paramsForOnclick.enable === false) pJS.interactivity.events.onclick.enable = false;
            if(paramsForOnclick.mode != 'push') pJS.interactivity.events.onclick.mode = paramsForOnclick.mode;
            if(paramsForOnclick.nb) pJS.interactivity.events.onclick.nb = paramsForOnclick.nb;
          }
        }
      }
      pJS.retina_detect = params.retina_detect;
    }
  
    /* convert hex colors to rgb */
    pJS.particles.color_rgb = hexToRgb(pJS.particles.color);
    pJS.particles.line_linked.color_rgb_line = hexToRgb(pJS.particles.line_linked.color);
  
    /* detect retina */
    if(pJS.retina_detect && window.devicePixelRatio > 1){
      pJS.retina = true;
    
      pJS.canvas.pxratio = window.devicePixelRatio
      pJS.canvas.w = pJS.canvas.el.offsetWidth * pJS.canvas.pxratio;
      pJS.canvas.h = pJS.canvas.el.offsetHeight * pJS.canvas.pxratio;
      pJS.particles.anim.speed = pJS.particles.anim.speed * pJS.canvas.pxratio;
      pJS.particles.line_linked.distance = pJS.particles.line_linked.distance * pJS.canvas.pxratio;
      pJS.particles.line_linked.width = pJS.particles.line_linked.width * pJS.canvas.pxratio;
      pJS.interactivity.mouse.distance = pJS.interactivity.mouse.distance * pJS.canvas.pxratio;
    }
  
  
    /* ---------- CANVAS functions ------------ */
  
    pJS.fn.canvasInit = function(){
      pJS.canvas.ctx = pJS.canvas.el.getContext('2d');
    };
  
    pJS.fn.canvasSize = function(){
      if( params.group ){
          pJS.canvas.el.width = pJS.canvas.w;
          pJS.canvas.el.height = pJS.canvas.h;
      } else {
          pJS.canvas.el.width = params.canvas.w;
          pJS.canvas.el.height = params.canvas.h;
          pJS.canvas.w = params.canvas.w;
          pJS.canvas.h = params.canvas.h;
      }
  
        window.onresize = function(){
        if(pJS){
          pJS.canvas.w = pJS.canvas.el.offsetWidth;
          pJS.canvas.h = pJS.canvas.el.offsetHeight;
  
          /* resize canvas */
          if(pJS.retina){
            pJS.canvas.w *= pJS.canvas.pxratio;
            pJS.canvas.h *= pJS.canvas.pxratio;
          }
  
          pJS.canvas.el.width = pJS.canvas.w;
          pJS.canvas.el.height = pJS.canvas.h;
  
          /* repaint canvas */
          pJS.fn.canvasPaint();
          if(!pJS.particles.anim.enable){
            pJS.fn.particlesRemove();
            pJS.fn.canvasRemove();
            launchParticles();
          }
        }
      }
    };
  
    pJS.fn.canvasPaint = function(){
      pJS.canvas.ctx.fillRect(0, 0, pJS.canvas.w, pJS.canvas.h);
    };
  
    pJS.fn.canvasRemove = function(){
      pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h);
    }
  
  
    /* --------- PARTICLES functions ----------- */
  
    pJS.fn.particle = function(color, opacity, position){
  
      /* position */
      this.x = position ? position.x : Math.random() * pJS.canvas.w;
      this.y = position ? position.y : Math.random() * pJS.canvas.h;
  
      /* size */
      this.radius = (pJS.particles.size_random ? Math.random() : 1) * pJS.particles.size;
      if (pJS.retina) this.radius *= pJS.canvas.pxratio;
  
      /* color */
      this.color = color;
  
      /* opacity */
      this.opacity = opacity;
  
      /* animation - velocity for speed */
      this.vx = -.5 + Math.random();
      this.vy = -.5 + Math.random();
  
      /* draw function */
      this.draw = function(){
        pJS.canvas.ctx.fillStyle = 'rgba('+this.color.r+','+this.color.g+','+this.color.b+','+this.opacity+')';
        pJS.canvas.ctx.beginPath();
  
        switch(pJS.particles.shape){
          case 'circle':
            pJS.canvas.ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2, false);
          break;
  
          case 'edge':
            pJS.canvas.ctx.rect(this.x, this.y, this.radius*2, this.radius*2);
          break;
  
          case 'triangle':
            pJS.canvas.ctx.moveTo(this.x,this.y-this.radius);
            pJS.canvas.ctx.lineTo(this.x+this.radius,this.y+this.radius);
            pJS.canvas.ctx.lineTo(this.x-this.radius,this.y+this.radius);
            pJS.canvas.ctx.closePath();
          break;
        }
  
        pJS.canvas.ctx.fill();
      }
  
    };
  
    pJS.fn.particlesCreate = function(){
      for(var i = 0; i < pJS.particles.nb; i++) {
        pJS.particles.array.push(new pJS.fn.particle(pJS.particles.color_rgb, pJS.particles.opacity));
      }
    };
  
    pJS.fn.particlesAnimate = function(){
      for(var i = 0; i < pJS.particles.array.length; i++){
        /* the particle */
        var p = pJS.particles.array[i];
  
        /* move the particle */
        p.x += p.vx * (pJS.particles.anim.speed/2);
        p.y += p.vy * (pJS.particles.anim.speed/2);
  
        /* change particle position if it is out of canvas */
        if(p.x - p.radius > pJS.canvas.w) p.x = p.radius;
        else if(p.x + p.radius < 0) p.x = pJS.canvas.w + p.radius;
        if(p.y - p.radius > pJS.canvas.h) p.y = p.radius;
        else if(p.y + p.radius < 0) p.y = pJS.canvas.h + p.radius;
  
        /* Check distance between each particle and mouse position */
        for(var j = i + 1; j < pJS.particles.array.length; j++){
          var p2 = pJS.particles.array[j];
  
          /* link particles if enable */
          if(pJS.particles.line_linked.enable_auto){
            pJS.fn.vendors.distanceParticles(p,p2);
          }
  
          /* set interactivity if enable */
          if(pJS.interactivity.enable){
  
            /* interactivity mode */
            switch(pJS.interactivity.mode){
              case 'grab':
                pJS.fn.vendors.interactivity.grabParticles(p,p2);
              break;
            }
  
          }
  
  
        }
      }
    };
  
    pJS.fn.particlesDraw = function(){
  
      /* clear canvas */
      pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h);
  
      /* move particles */
      pJS.fn.particlesAnimate();
  
      /* draw each particle */
      for(var i = 0; i < pJS.particles.array.length; i++){
        var p = pJS.particles.array[i];
        p.draw('rgba('+p.color.r+','+p.color.g+','+p.color.b+','+p.opacity+')');
      }
  
    };
  
    pJS.fn.particlesRemove = function(){
      pJS.particles.array = [];
    };
  
  
    /* ---------- VENDORS functions ------------ */
  
    pJS.fn.vendors.distanceParticles = function(p1, p2){
  
      var dx = p1.x - p2.x,
        dy = p1.y - p2.y,
        dist = Math.sqrt(dx*dx + dy*dy);
  
      /* Check distance between particle and mouse mos */
      if(dist <= pJS.particles.line_linked.distance) {
  
        /* draw the line */
        var color_line = pJS.particles.line_linked.color_rgb_line;
        pJS.canvas.ctx.beginPath();
        pJS.canvas.ctx.strokeStyle = 'rgba('+color_line.r+','+color_line.g+','+color_line.b+','+ (pJS.particles.line_linked.opacity-dist/pJS.particles.line_linked.distance) +')';
        pJS.canvas.ctx.moveTo(p1.x, p1.y);
        pJS.canvas.ctx.lineTo(p2.x, p2.y);
        pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width;
        pJS.canvas.ctx.stroke();
        pJS.canvas.ctx.closePath();
  
        /* condensed particles */
        if(pJS.particles.line_linked.condensed_mode.enable){
          var dx = p1.x - p2.x,
              dy = p1.y - p2.y,
              ax = dx/(pJS.particles.line_linked.condensed_mode.rotateX*1000),
              ay = dy/(pJS.particles.line_linked.condensed_mode.rotateY*1000);
          p2.vx += ax;
          p2.vy += ay;
        }
  
      }
    };
  
    pJS.fn.vendors.interactivity.listeners = function(){
  
      /* init el */
      if(pJS.interactivity.detect_on == 'window'){
        var detect_el = window;
      }else{
        var detect_el = pJS.canvas.el;
      }
  
      /* el on mousemove */
      detect_el.onmousemove = function(e){
  
        if(detect_el == window){
          var pos_x = e.clientX,
              pos_y = e.clientY;
        }
        else{
          var pos_x = e.offsetX||e.clientX,
              pos_y = e.offsetY||e.clientY;
        }
  
        if(pJS){
  
          pJS.interactivity.mouse.pos_x = pos_x;
          pJS.interactivity.mouse.pos_y = pos_y;
  
          if(pJS.retina){
            pJS.interactivity.mouse.pos_x *= pJS.canvas.pxratio;
            pJS.interactivity.mouse.pos_y *= pJS.canvas.pxratio;
          }
  
          pJS.interactivity.status = 'mousemove';
        }
  
      };
  
      /* el on onmouseleave */
      detect_el.onmouseleave = function(){
  
        if(pJS){
          pJS.interactivity.mouse.pos_x = 0;
          pJS.interactivity.mouse.pos_y = 0;
          pJS.interactivity.status = 'mouseleave';
        }
  
      };
  
      /* el on onclick */
      if(pJS.interactivity.events.onclick.enable){
        switch(pJS.interactivity.events.onclick.mode){
          case 'push':
            detect_el.onclick = function(){
              if(pJS){
                for(var i = 0; i < pJS.interactivity.events.onclick.nb; i++){
                  pJS.particles.array.push(
                    new pJS.fn.particle(
                      pJS.particles.color_rgb,
                      pJS.particles.opacity,
                      {
                        'x': pJS.interactivity.mouse.pos_x,
                        'y': pJS.interactivity.mouse.pos_y
                      }
                    )
                  )
                }
              }
            }
          break;
  
          case 'remove':
            detect_el.onclick = function(){
              pJS.particles.array.splice(0, pJS.interactivity.events.onclick.nb);
            }
          break;
        }
      }
    };
  
  
    pJS.fn.vendors.interactivity.grabParticles = function(p1, p2){
      var dx = p1.x - p2.x,
          dy = p1.y - p2.y,
          dist = Math.sqrt(dx*dx + dy*dy);
  
      var dx_mouse = p1.x - pJS.interactivity.mouse.pos_x,
          dy_mouse = p1.y - pJS.interactivity.mouse.pos_y,
          dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse);
  
      /* Check distance between 2 particles + Check distance between 1 particle and mouse position */
      if(dist <= pJS.particles.line_linked.distance && dist_mouse <= pJS.interactivity.mouse.distance && pJS.interactivity.status == 'mousemove'){
        /* Draw the line */
        var color_line = pJS.particles.line_linked.color_rgb_line;
        pJS.canvas.ctx.beginPath();
        pJS.canvas.ctx.strokeStyle = 'rgba('+color_line.r+','+color_line.g+','+color_line.b+','+ (pJS.interactivity.line_linked.opacity-dist_mouse/pJS.interactivity.mouse.distance) +')';
        pJS.canvas.ctx.moveTo(p1.x, p1.y);
        pJS.canvas.ctx.lineTo(pJS.interactivity.mouse.pos_x, pJS.interactivity.mouse.pos_y);
        pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width;
        pJS.canvas.ctx.stroke();
        pJS.canvas.ctx.closePath();
      }
    };
  
    pJS.fn.vendors.destroy = function(){
      cancelAnimationFrame(pJS.fn.requestAnimFrame);
      canvas_el.remove();
      delete pJS;
    };
  
  
    /* --------- LAUNCH ----------- */
  
    function launchParticles(){
      pJS.fn.canvasInit();
      pJS.fn.canvasSize();
      pJS.fn.canvasPaint();
      pJS.fn.particlesCreate();
      pJS.fn.particlesDraw();
    };
  
  
    function launchAnimation(){
      pJS.fn.particlesDraw();
      pJS.fn.requestAnimFrame = requestAnimFrame(launchAnimation);
    };
  
    launchParticles();
  
    ( pJS.particles.anim.enable ) && launchAnimation();
  
    ( pJS.interactivity.enable ) && pJS.fn.vendors.interactivity.listeners();
  
  };
  
  /* --- VENDORS --- */
  
  window.requestAnimFrame = (function(){
    return  window.requestAnimationFrame ||
      window.webkitRequestAnimationFrame ||
      window.mozRequestAnimationFrame    ||
      window.oRequestAnimationFrame      ||
      window.msRequestAnimationFrame     ||
      function(callback){
        window.setTimeout(callback, 1000 / 60);
      };
  })();
  
  window.cancelRequestAnimFrame = ( function() {
    return window.cancelAnimationFrame         ||
      window.webkitCancelRequestAnimationFrame ||
      window.mozCancelRequestAnimationFrame    ||
      window.oCancelRequestAnimationFrame      ||
      window.msCancelRequestAnimationFrame     ||
      clearTimeout
  } )();
  
  function hexToRgb(hex){
    // By Tim Down - http://stackoverflow.com/a/5624139/3493650
    // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
    var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
    hex = hex.replace(shorthandRegex, function(m, r, g, b) {
       return r + r + g + g + b + b;
    });
    var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
    return result ? {
        r: parseInt(result[1], 16),
        g: parseInt(result[2], 16),
        b: parseInt(result[3], 16)
    } : null;
  };
  
  
  /* --- LAUNCH --- */
  
  window.particlesJS = function(tag_id, params){
      
    /* no string id? so it's object params, and set the id with default id */
    if(typeof(tag_id) != 'string' && !tag_id.nodeType ){
      params = tag_id;
      tag_id = 'particles-js';
    }
  
    /* no id? set the id to default id */
    if(!tag_id){
      tag_id = 'particles-js';
    }
      
    /* create canvas element */
    var canvas_el = document.createElement('canvas');
  
    /* set size canvas */
    canvas_el.style.width = "100%";
    canvas_el.style.height = "100%";
  
    /* append canvas */
  
    if ( !tag_id.nodeType ){
        var canvas = document.getElementById(tag_id).appendChild(canvas_el);
    } else {
        var canvas = params.canvas.el;
    }
        
    /* launch particle.js */
    if(canvas != null){
      launchParticlesJS(tag_id, params);
    }
  
  };
  
  window.particlesInit = function( params ){
  
    var elements = document.querySelectorAll( ".particles-js, .particles-js-animated" );  
  
    [].slice.apply( elements ).forEach(function( el, index ){
  
      var _params = params;
  
      if ( el.classList.contains("light_section") ){  // light_section
        _p.debugLog("particles.JS: light_section DETECTED.");
        _params = params.light_section;
      } else {
        if ( el.classList.contains("dark_section") || el.classList.contains("black_section") ){ // dark_section
          _p.debugLog("particles.JS: dark_section/black_section DETECTED.");
          _params = params.dark_section;
        } else if ( el.classList.contains("secondary_section") ){
          _p.debugLog("particles.JS: secondary_section DETECTED.");
          _params = params.secondary_section;
        } else {  // skincolored_section
            _p.debugLog("particles.JS: Applying skincolored_section.");
          _params = params.skincolored_section;        
        }
      }
  
      var particleCanvasContainer = document.createElement("div");
          particleCanvasContainer.setAttribute("class","particles-js-container");
  
      el.insertBefore( particleCanvasContainer, el.firstChild );
  
      /* create canvas element */
      var canvas_el = document.createElement('canvas');
  
      /* set size canvas */
      canvas_el.style.width  = "100%";
      canvas_el.style.height = "100%";
  
      if ( typeof _params.canvas !== "undefined" && typeof _params.canvas.bgc !== "undefined" ){
        canvas_el.style.backgroundColor = _params.canvas.bgc;
      }
  
      /* append canvas */
      var canvas = particleCanvasContainer.appendChild(canvas_el);
  
      /* enable particles animation */
      _params.particles.anim = ( el.className.match(/particles-js-animated/) !== null )? { enable: true, speed: 1 } : { enable: false };
  
      /* launch particle.js */
      ( canvas !== null ) && launchParticlesJS( particleCanvasContainer, _params );
  
    });
  
  };