text: /*!
  * ZeroClipboard
  * The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript userinterface.
  * Copyright (c) 2014 Jon Rohan, James M. Greene
  * Licensed MIT
  * http://zeroclipboard.org/
  * v2.0.0-beta.5
  */
  (function (window) {
      "use strict";
      var _currentElement;
      var _flashState = {
          bridge: null,
          version: "0.0.0",
          pluginType: "unknown",
          disabled: null,
          outdated: null,
          unavailable: null,
          deactivated: null,
          overdue: null,
          ready: null
      };
      var _clipData = {};
      var _clipDataFormatMap = null;
      var _clientIdCounter = 0;
      var _clientMeta = {};
      var _elementIdCounter = 0;
      var _elementMeta = {};
      var _swfPath = function () {
          var i, jsDir, tmpJsPath, jsPath, swfPath = "ZeroClipboard.swf";
          if (!(document.currentScript && (jsPath = document.currentScript.src))) {
              var scripts = document.getElementsByTagName("script");
              if ("readyState" in scripts[0]) {
                  for (i = scripts.length; i--;) {
                      if (scripts[i].readyState === "interactive" && (jsPath = scripts[i].src)) {
                          break;
                      }
                  }
              } else if (document.readyState === "loading") {
                  jsPath = scripts[scripts.length - 1].src;
              } else {
                  for (i = scripts.length; i--;) {
                      tmpJsPath = scripts[i].src;
                      if (!tmpJsPath) {
                          jsDir = null;
                          break;
                      }
                      tmpJsPath = tmpJsPath.split("#")[0].split("?")[0];
                      tmpJsPath = tmpJsPath.slice(0, tmpJsPath.lastIndexOf("/") + 1);
                      if (jsDir == null) {
                          jsDir = tmpJsPath;
                      } else if (jsDir !== tmpJsPath) {
                          jsDir = null;
                          break;
                      }
                  }
                  if (jsDir !== null) {
                      jsPath = jsDir;
                  }
              }
          }
          if (jsPath) {
              jsPath = jsPath.split("#")[0].split("?")[0];
              swfPath = jsPath.slice(0, jsPath.lastIndexOf("/") + 1) + swfPath;
          }
          return swfPath;
      }();
      var _camelizeCssPropName = function () {
          var matcherRegex = /\-([a-z])/g, replacerFn = function (match, group) {
              return group.toUpperCase();
          };
          return function (prop) {
              return prop.replace(matcherRegex, replacerFn);
          };
      }();
      var _getStyle = function (el, prop) {
          var value, camelProp, tagName;
          if (window.getComputedStyle) {
              value = window.getComputedStyle(el, null).getPropertyValue(prop);
          } else {
              camelProp = _camelizeCssPropName(prop);
              if (el.currentStyle) {
                  value = el.currentStyle[camelProp];
              } else {
                  value = el.style[camelProp];
              }
          }
          if (prop === "cursor") {
              if (!value || value === "auto") {
                  tagName = el.tagName.toLowerCase();
                  if (tagName === "a") {
                      return "pointer";
                  }
              }
          }
          return value;
      };
      var _elementMouseOver = function (event) {
          if (!event) {
              event = window.event;
          }
          var target;
          if (this !== window) {
              target = this;
          } else if (event.target) {
              target = event.target;
          } else if (event.srcElement) {
              target = event.srcElement;
          }
          ZeroClipboard.activate(target);
      };
      var _addEventHandler = function (element, method, func) {
          if (!element || element.nodeType !== 1) {
              return;
          }
          if (element.addEventListener) {
              element.addEventListener(method, func, false);
          } else if (element.attachEvent) {
              element.attachEvent("on" + method, func);
          }
      };
      var _removeEventHandler = function (element, method, func) {
          if (!element || element.nodeType !== 1) {
              return;
          }
          if (element.removeEventListener) {
              element.removeEventListener(method, func, false);
          } else if (element.detachEvent) {
              element.detachEvent("on" + method, func);
          }
      };
      var _addClass = function (element, value) {
          if (!element || element.nodeType !== 1) {
              return element;
          }
          if (element.classList) {
              if (!element.classList.contains(value)) {
                  element.classList.add(value);
              }
              return element;
          }
          if (value && typeof value === "string") {
              var classNames = (value || "").split(/\s+/);
              if (element.nodeType === 1) {
                  if (!element.className) {
                      element.className = value;
                  } else {
                      var className = " " + element.className + " ", setClass = element.className;
                      for (var c = 0, cl = classNames.length; c < cl; c++) {
                          if (className.indexOf(" " + classNames[c] + " ") < 0) {
                              setClass += " " + classNames[c];
                          }
                      }
                      element.className = setClass.replace(/^\s+|\s+$/g, "");
                  }
              }
          }
          return element;
      };
      var _removeClass = function (element, value) {
          if (!element || element.nodeType !== 1) {
              return element;
          }
          if (element.classList) {
              if (element.classList.contains(value)) {
                  element.classList.remove(value);
              }
              return element;
          }
          if (value && typeof value === "string" || value === undefined) {
              var classNames = (value || "").split(/\s+/);
              if (element.nodeType === 1 && element.className) {
                  if (value) {
                      var className = (" " + element.className + " ").replace(/[\n\t]/g, " ");
                      for (var c = 0, cl = classNames.length; c < cl; c++) {
                          className = className.replace(" " + classNames[c] + " ", " ");
                      }
                      element.className = className.replace(/^\s+|\s+$/g, "");
                  } else {
                      element.className = "";
                  }
              }
          }
          return element;
      };
      var _getZoomFactor = function () {
          var rect, physicalWidth, logicalWidth, zoomFactor = 1;
          if (typeof document.body.getBoundingClientRect === "function") {
              rect = document.body.getBoundingClientRect();
              physicalWidth = rect.right - rect.left;
              logicalWidth = document.body.offsetWidth;
              zoomFactor = Math.round(physicalWidth / logicalWidth * 100) / 100;
          }
          return zoomFactor;
      };
      var _getDOMObjectPosition = function (obj, defaultZIndex) {
          var info = {
              left: 0,
              top: 0,
              width: 0,
              height: 0,
              zIndex: _getSafeZIndex(defaultZIndex) - 1
          };
          if (obj.getBoundingClientRect) {
              var rect = obj.getBoundingClientRect();
              var pageXOffset, pageYOffset, zoomFactor;
              if ("pageXOffset" in window && "pageYOffset" in window) {
                  pageXOffset = window.pageXOffset;
                  pageYOffset = window.pageYOffset;
              } else {
                  zoomFactor = _getZoomFactor();
                  pageXOffset = Math.round(document.documentElement.scrollLeft / zoomFactor);
                  pageYOffset = Math.round(document.documentElement.scrollTop / zoomFactor);
              }
              var leftBorderWidth = document.documentElement.clientLeft || 0;
              var topBorderWidth = document.documentElement.clientTop || 0;
              info.left = rect.left + pageXOffset - leftBorderWidth;
              info.top = rect.top + pageYOffset - topBorderWidth;
              info.width = "width" in rect ? rect.width : rect.right - rect.left;
              info.height = "height" in rect ? rect.height : rect.bottom - rect.top;
          }
          return info;
      };
      var _cacheBust = function (path, options) {
          var cacheBust = options == null || options && options.cacheBust === true;
          if (cacheBust) {
              return (path.indexOf("?") === -1 ? "?" : "&") + "noCache=" + new Date().getTime();
          } else {
              return "";
          }
      };
      var _vars = function (options) {
          var i, len, domain, domains, str = "", trustedOriginsExpanded = [];
          if (options.trustedDomains) {
              if (typeof options.trustedDomains === "string") {
                  domains = [options.trustedDomains];
              } else if (typeof options.trustedDomains === "object" && "length" in options.trustedDomains) {
                  domains = options.trustedDomains;
              }
          }
          if (domains && domains.length) {
              for (i = 0, len = domains.length; i < len; i++) {
                  if (domains.hasOwnProperty(i) && domains[i] && typeof domains[i] === "string") {
                      domain = _extractDomain(domains[i]);
                      if (!domain) {
                          continue;
                      }
                      if (domain === "*") {
                          trustedOriginsExpanded = [domain];
                          break;
                      }
                      trustedOriginsExpanded.push.apply(trustedOriginsExpanded, [domain, "//" + domain, window.location.protocol + "//" + domain]);
                  }
              }
          }
          if (trustedOriginsExpanded.length) {
              str += "trustedOrigins=" + encodeURIComponent(trustedOriginsExpanded.join(","));
          }
          if (options.forceEnhancedClipboard === true) {
              str += (str ? "&" : "") + "forceEnhancedClipboard=true";
          }
          return str;
      };
      var _inArray = function (elem, array, fromIndex) {
          if (typeof array.indexOf === "function") {
              return array.indexOf(elem, fromIndex);
          }
          var i, len = array.length;
          if (typeof fromIndex === "undefined") {
              fromIndex = 0;
          } else if (fromIndex < 0) {
              fromIndex = len + fromIndex;
          }
          for (i = fromIndex; i < len; i++) {
              if (array.hasOwnProperty(i) && array[i] === elem) {
                  return i;
              }
          }
          return -1;
      };
      var _prepClip = function (elements) {
          if (typeof elements === "string") {
              throw new TypeError("ZeroClipboard doesn't accept query strings.");
          }
          return typeof elements.length !== "number" ? [elements] : elements;
      };
      var _dispatchCallback = function (func, context, args, async) {
          if (async) {
              window.setTimeout(function () {
                  func.apply(context, args);
              }, 0);
          } else {
              func.apply(context, args);
          }
      };
      var _getSafeZIndex = function (val) {
          var zIndex, tmp;
          if (val) {
              if (typeof val === "number" && val > 0) {
                  zIndex = val;
              } else if (typeof val === "string" && (tmp = parseInt(val, 10)) && !isNaN(tmp) && tmp > 0) {
                  zIndex = tmp;
              }
          }
          if (!zIndex) {
              if (typeof _globalConfig.zIndex === "number" && _globalConfig.zIndex > 0) {
                  zIndex = _globalConfig.zIndex;
              } else if (typeof _globalConfig.zIndex === "string" && (tmp = parseInt(_globalConfig.zIndex, 10)) && !isNaN(tmp) && tmp > 0) {
                  zIndex = tmp;
              }
          }
          return zIndex || 0;
      };
      var _extend = function () {
          var i, len, arg, prop, src, copy, target = arguments[0] || {};
          for (i = 1, len = arguments.length; i < len; i++) {
              if ((arg = arguments[i]) != null) {
                  for (prop in arg) {
                      if (arg.hasOwnProperty(prop)) {
                          src = target[prop];
                          copy = arg[prop];
                          if (target === copy) {
                              continue;
                          }
                          if (copy !== undefined) {
                              target[prop] = copy;
                          }
                      }
                  }
              }
          }
          return target;
      };
      var _extractDomain = function (originOrUrl) {
          if (originOrUrl == null || originOrUrl === "") {
              return null;
          }
          originOrUrl = originOrUrl.replace(/^\s+|\s+$/g, "");
          if (originOrUrl === "") {
              return null;
          }
          var protocolIndex = originOrUrl.indexOf("//");
          originOrUrl = protocolIndex === -1 ? originOrUrl : originOrUrl.slice(protocolIndex + 2);
          var pathIndex = originOrUrl.indexOf("/");
          originOrUrl = pathIndex === -1 ? originOrUrl : protocolIndex === -1 || pathIndex === 0 ? null : originOrUrl.slice(0, pathIndex);
          if (originOrUrl && originOrUrl.slice(-4).toLowerCase() === ".swf") {
              return null;
          }
          return originOrUrl || null;
      };
      var _determineScriptAccess = function () {
          var _extractAllDomains = function (origins, resultsArray) {
              var i, len, tmp;
              if (origins == null || resultsArray[0] === "*") {
                  return;
              }
              if (typeof origins === "string") {
                  origins = [origins];
              }
              if (!(typeof origins === "object" && typeof origins.length === "number")) {
                  return;
              }
              for (i = 0, len = origins.length; i < len; i++) {
                  if (origins.hasOwnProperty(i) && (tmp = _extractDomain(origins[i]))) {
                      if (tmp === "*") {
                          resultsArray.length = 0;
                          resultsArray.push("*");
                          break;
                      }
                      if (_inArray(tmp, resultsArray) === -1) {
                          resultsArray.push(tmp);
                      }
                  }
              }
          };
          return function (currentDomain, configOptions) {
              var swfDomain = _extractDomain(configOptions.swfPath);
              if (swfDomain === null) {
                  swfDomain = currentDomain;
              }
              var trustedDomains = [];
              _extractAllDomains(configOptions.trustedOrigins, trustedDomains);
              _extractAllDomains(configOptions.trustedDomains, trustedDomains);
              var len = trustedDomains.length;
              if (len > 0) {
                  if (len === 1 && trustedDomains[0] === "*") {
                      return "always";
                  }
                  if (_inArray(currentDomain, trustedDomains) !== -1) {
                      if (len === 1 && currentDomain === swfDomain) {
                          return "sameDomain";
                      }
                      return "always";
                  }
              }
              return "never";
          };
      }();
      var _objectKeys = function (obj) {
          if (obj == null) {
              return [];
          }
          if (Object.keys) {
              return Object.keys(obj);
          }
          var keys = [];
          for (var prop in obj) {
              if (obj.hasOwnProperty(prop)) {
                  keys.push(prop);
              }
          }
          return keys;
      };
      var _deleteOwnProperties = function (obj) {
          if (obj) {
              for (var prop in obj) {
                  if (obj.hasOwnProperty(prop)) {
                      delete obj[prop];
                  }
              }
          }
          return obj;
      };
      var _safeActiveElement = function () {
          try {
              return document.activeElement;
          } catch (err) {
          }
          return null;
      };
      var _pick = function (obj, keys) {
          var newObj = {};
          for (var i = 0, len = keys.length; i < len; i++) {
              if (keys[i] in obj) {
                  newObj[keys[i]] = obj[keys[i]];
              }
          }
          return newObj;
      };
      var _omit = function (obj, keys) {
          var newObj = {};
          for (var prop in obj) {
              if (_inArray(prop, keys) === -1) {
                  newObj[prop] = obj[prop];
              }
          }
          return newObj;
      };
      var _mapClipDataToFlash = function (clipData) {
          var newClipData = {}, formatMap = {};
          if (!(typeof clipData === "object" && clipData)) {
              return;
          }
          for (var dataFormat in clipData) {
              if (dataFormat && clipData.hasOwnProperty(dataFormat) && typeof clipData[dataFormat] === "string" && clipData[dataFormat]) {
                  switch (dataFormat.toLowerCase()) {
                      case "text/plain":
                      case "text":
                      case "air:text":
                      case "flash:text":
                          newClipData.text = clipData[dataFormat];
                          formatMap.text = dataFormat;
                          break;
  
                      case "text/html":
                      case "html":
                      case "air:html":
                      case "flash:html":
                          newClipData.html = clipData[dataFormat];
                          formatMap.html = dataFormat;
                          break;
  
                      case "application/rtf":
                      case "text/rtf":
                      case "rtf":
                      case "richtext":
                      case "air:rtf":
                      case "flash:rtf":
                          newClipData.rtf = clipData[dataFormat];
                          formatMap.rtf = dataFormat;
                          break;
  
                      default:
                          break;
                  }
              }
          }
          return {
              data: newClipData,
              formatMap: formatMap
          };
      };
      var _mapClipResultsFromFlash = function (clipResults, formatMap) {
          if (!(typeof clipResults === "object" && clipResults && typeof formatMap === "object" && formatMap)) {
              return clipResults;
          }
          var newResults = {};
          for (var prop in clipResults) {
              if (clipResults.hasOwnProperty(prop)) {
                  if (prop !== "success" && prop !== "data") {
                      newResults[prop] = clipResults[prop];
                      continue;
                  }
                  newResults[prop] = {};
                  var tmpHash = clipResults[prop];
                  for (var dataFormat in tmpHash) {
                      if (dataFormat && tmpHash.hasOwnProperty(dataFormat) && formatMap.hasOwnProperty(dataFormat)) {
                          newResults[prop][formatMap[dataFormat]] = tmpHash[dataFormat];
                      }
                  }
              }
          }
          return newResults;
      };
      var _args = function (arraySlice) {
          return function (args) {
              return arraySlice.call(args, 0);
          };
      }(window.Array.prototype.slice);
      var _detectFlashSupport = function () {
          var plugin, ax, mimeType, hasFlash = false, isActiveX = false, isPPAPI = false, flashVersion = "";
  
          function parseFlashVersion(desc) {
              var matches = desc.match(/[\d]+/g);
              matches.length = 3;
              return matches.join(".");
          }
  
          function isPepperFlash(flashPlayerFileName) {
              return !!flashPlayerFileName && (flashPlayerFileName = flashPlayerFileName.toLowerCase()) && (/^(pepflashplayer\.dll|libpepflashplayer\.so|pepperflashplayer\.plugin)$/.test(flashPlayerFileName) || flashPlayerFileName.slice(-13) === "chrome.plugin");
          }
  
          function inspectPlugin(plugin) {
              if (plugin) {
                  hasFlash = true;
                  if (plugin.version) {
                      flashVersion = parseFlashVersion(plugin.version);
                  }
                  if (!flashVersion && plugin.description) {
                      flashVersion = parseFlashVersion(plugin.description);
                  }
                  if (plugin.filename) {
                      isPPAPI = isPepperFlash(plugin.filename);
                  }
              }
          }
  
          if (navigator.plugins && navigator.plugins.length) {
              plugin = navigator.plugins["Shockwave Flash"];
              inspectPlugin(plugin);
              if (navigator.plugins["Shockwave Flash 2.0"]) {
                  hasFlash = true;
                  flashVersion = "2.0.0.11";
              }
          } else if (navigator.mimeTypes && navigator.mimeTypes.length) {
              mimeType = navigator.mimeTypes["application/x-shockwave-flash"];
              plugin = mimeType && mimeType.enabledPlugin;
              inspectPlugin(plugin);
          } else if (typeof ActiveXObject !== "undefined") {
              isActiveX = true;
              try {
                  ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
                  hasFlash = true;
                  flashVersion = parseFlashVersion(ax.GetVariable("$version"));
              } catch (e1) {
                  try {
                      ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
                      hasFlash = true;
                      flashVersion = "6.0.21";
                  } catch (e2) {
                      try {
                          ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
                          hasFlash = true;
                          flashVersion = parseFlashVersion(ax.GetVariable("$version"));
                      } catch (e3) {
                          isActiveX = false;
                      }
                  }
              }
          }
          _flashState.disabled = hasFlash !== true;
          _flashState.outdated = flashVersion && parseFloat(flashVersion) < 11;
          _flashState.version = flashVersion || "0.0.0";
          _flashState.pluginType = isPPAPI ? "pepper" : isActiveX ? "activex" : hasFlash ? "netscape" : "unknown";
      };
      _detectFlashSupport();
      var ZeroClipboard = function (elements) {
          if (!(this instanceof ZeroClipboard)) {
              return new ZeroClipboard(elements);
          }
          this.id = "" + _clientIdCounter++;
          _clientMeta[this.id] = {
              instance: this,
              elements: [],
              handlers: {}
          };
          if (elements) {
              this.clip(elements);
          }
          if (typeof _flashState.ready !== "boolean") {
              _flashState.ready = false;
          }
          if (!ZeroClipboard.isFlashUnusable() && _flashState.bridge === null) {
              var _client = this;
              var maxWait = _globalConfig.flashLoadTimeout;
              if (typeof maxWait === "number" && maxWait >= 0) {
                  setTimeout(function () {
                      if (typeof _flashState.deactivated !== "boolean") {
                          _flashState.deactivated = true;
                      }
                      if (_flashState.deactivated === true) {
                          ZeroClipboard.emit({
                              type: "error",
                              name: "flash-deactivated",
                              client: _client
                          });
                      }
                  }, maxWait);
              }
              _flashState.overdue = false;
              _bridge();
          }
      };
      ZeroClipboard.prototype.setText = function (text) {
          ZeroClipboard.setData("text/plain", text);
          return this;
      };
      ZeroClipboard.prototype.setHtml = function (html) {
          ZeroClipboard.setData("text/html", html);
          return this;
      };
      ZeroClipboard.prototype.setRichText = function (richText) {
          ZeroClipboard.setData("application/rtf", richText);
          return this;
      };
      ZeroClipboard.prototype.setData = function () {
          ZeroClipboard.setData.apply(ZeroClipboard, _args(arguments));
          return this;
      };
      ZeroClipboard.prototype.clearData = function () {
          ZeroClipboard.clearData.apply(ZeroClipboard, _args(arguments));
          return this;
      };
      ZeroClipboard.prototype.setSize = function (width, height) {
          _setSize(width, height);
          return this;
      };
      var _setHandCursor = function (enabled) {
          if (_flashState.ready === true && _flashState.bridge && typeof _flashState.bridge.setHandCursor === "function") {
              _flashState.bridge.setHandCursor(enabled);
          } else {
              _flashState.ready = false;
          }
      };
      ZeroClipboard.prototype.destroy = function () {
          this.unclip();
          this.off();
          delete _clientMeta[this.id];
      };
      var _getAllClients = function () {
          var i, len, client, clients = [], clientIds = _objectKeys(_clientMeta);
          for (i = 0, len = clientIds.length; i < len; i++) {
              client = _clientMeta[clientIds[i]].instance;
              if (client && client instanceof ZeroClipboard) {
                  clients.push(client);
              }
          }
          return clients;
      };
      ZeroClipboard.version = "2.0.0-beta.5";
      var _globalConfig = {
          swfPath: _swfPath,
          trustedDomains: window.location.host ? [window.location.host] : [],
          cacheBust: true,
          forceHandCursor: false,
          forceEnhancedClipboard: false,
          zIndex: 999999999,
          debug: false,
          title: null,
          autoActivate: true,
          flashLoadTimeout: 3e4
      };
      ZeroClipboard.isFlashUnusable = function () {
          return !!(_flashState.disabled || _flashState.outdated || _flashState.unavailable || _flashState.deactivated);
      };
      ZeroClipboard.config = function (options) {
          if (typeof options === "object" && options !== null) {
              _extend(_globalConfig, options);
          }
          if (typeof options === "string" && options) {
              if (_globalConfig.hasOwnProperty(options)) {
                  return _globalConfig[options];
              }
              return;
          }
          var copy = {};
          for (var prop in _globalConfig) {
              if (_globalConfig.hasOwnProperty(prop)) {
                  if (typeof _globalConfig[prop] === "object" && _globalConfig[prop] !== null) {
                      if ("length" in _globalConfig[prop]) {
                          copy[prop] = _globalConfig[prop].slice(0);
                      } else {
                          copy[prop] = _extend({}, _globalConfig[prop]);
                      }
                  } else {
                      copy[prop] = _globalConfig[prop];
                  }
              }
          }
          return copy;
      };
      ZeroClipboard.destroy = function () {
          ZeroClipboard.deactivate();
          for (var clientId in _clientMeta) {
              if (_clientMeta.hasOwnProperty(clientId) && _clientMeta[clientId]) {
                  var client = _clientMeta[clientId].instance;
                  if (client && typeof client.destroy === "function") {
                      client.destroy();
                  }
              }
          }
          var flashBridge = _flashState.bridge;
          if (flashBridge) {
              var htmlBridge = _getHtmlBridge(flashBridge);
              if (htmlBridge) {
                  if (_flashState.pluginType === "activex" && "readyState" in flashBridge) {
                      flashBridge.style.display = "none";
                      (function removeSwfFromIE() {
                          if (flashBridge.readyState === 4) {
                              for (var prop in flashBridge) {
                                  if (typeof flashBridge[prop] === "function") {
                                      flashBridge[prop] = null;
                                  }
                              }
                              flashBridge.parentNode.removeChild(flashBridge);
                              if (htmlBridge.parentNode) {
                                  htmlBridge.parentNode.removeChild(htmlBridge);
                              }
                          } else {
                              setTimeout(removeSwfFromIE, 10);
                          }
                      })();
                  } else {
                      flashBridge.parentNode.removeChild(flashBridge);
                      if (htmlBridge.parentNode) {
                          htmlBridge.parentNode.removeChild(htmlBridge);
                      }
                  }
              }
              _flashState.ready = null;
              _flashState.bridge = null;
              _flashState.deactivated = null;
          }
          ZeroClipboard.clearData();
      };
      ZeroClipboard.activate = function (element) {
          if (_currentElement) {
              _removeClass(_currentElement, _globalConfig.hoverClass);
              _removeClass(_currentElement, _globalConfig.activeClass);
          }
          _currentElement = element;
          _addClass(element, _globalConfig.hoverClass);
          _reposition();
          var newTitle = _globalConfig.title || element.getAttribute("title");
          if (newTitle) {
              var htmlBridge = _getHtmlBridge(_flashState.bridge);
              if (htmlBridge) {
                  htmlBridge.setAttribute("title", newTitle);
              }
          }
          var useHandCursor = _globalConfig.forceHandCursor === true || _getStyle(element, "cursor") === "pointer";
          _setHandCursor(useHandCursor);
      };
      ZeroClipboard.deactivate = function () {
          var htmlBridge = _getHtmlBridge(_flashState.bridge);
          if (htmlBridge) {
              htmlBridge.removeAttribute("title");
              htmlBridge.style.left = "0px";
              htmlBridge.style.top = "-9999px";
              _setSize(1, 1);
          }
          if (_currentElement) {
              _removeClass(_currentElement, _globalConfig.hoverClass);
              _removeClass(_currentElement, _globalConfig.activeClass);
              _currentElement = null;
          }
      };
      ZeroClipboard.state = function () {
          return {
              browser: _pick(window.navigator, ["userAgent", "platform", "appName"]),
              flash: _omit(_flashState, ["bridge"]),
              zeroclipboard: {
                  version: ZeroClipboard.version,
                  config: ZeroClipboard.config()
              }
          };
      };
      ZeroClipboard.setData = function (format, data) {
          var dataObj;
          if (typeof format === "object" && format && typeof data === "undefined") {
              dataObj = format;
              ZeroClipboard.clearData();
          } else if (typeof format === "string" && format) {
              dataObj = {};
              dataObj[format] = data;
          } else {
              return;
          }
          for (var dataFormat in dataObj) {
              if (dataFormat && dataObj.hasOwnProperty(dataFormat) && typeof dataObj[dataFormat] === "string" && dataObj[dataFormat]) {
                  _clipData[dataFormat] = dataObj[dataFormat];
              }
          }
      };
      ZeroClipboard.clearData = function (format) {
          if (typeof format === "undefined") {
              _deleteOwnProperties(_clipData);
              _clipDataFormatMap = null;
          } else if (typeof format === "string" && _clipData.hasOwnProperty(format)) {
              delete _clipData[format];
          }
      };
      var _bridge = function () {
          var flashBridge, len;
          var container = document.getElementById("global-zeroclipboard-html-bridge");
          if (!container) {
              var allowScriptAccess = _determineScriptAccess(window.location.host, _globalConfig);
              var allowNetworking = allowScriptAccess === "never" ? "none" : "all";
              var flashvars = _vars(_globalConfig);
              var swfUrl = _globalConfig.swfPath + _cacheBust(_globalConfig.swfPath, _globalConfig);
              container = _createHtmlBridge();
              var divToBeReplaced = document.createElement("div");
              container.appendChild(divToBeReplaced);
              document.body.appendChild(container);
              var tmpDiv = document.createElement("div");
              var oldIE = _flashState.pluginType === "activex";
              tmpDiv.innerHTML = '<object id="global-zeroclipboard-flash-bridge" name="global-zeroclipboard-flash-bridge" ' + 'width="100%" height="100%" ' + (oldIE ? 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"' : 'type="application/x-shockwave-flash" data="' + swfUrl + '"') + ">" + (oldIE ? '<param name="movie" value="' + swfUrl + '"/>' : "") + '<param name="allowScriptAccess" value="' + allowScriptAccess + '"/>' + '<param name="allowNetworking" value="' + allowNetworking + '"/>' + '<param name="menu" value="false"/>' + '<param name="wmode" value="transparent"/>' + '<param name="flashvars" value="' + flashvars + '"/>' + "</object>";
              flashBridge = tmpDiv.firstChild;
              tmpDiv = null;
              flashBridge.ZeroClipboard = ZeroClipboard;
              container.replaceChild(flashBridge, divToBeReplaced);
          }
          if (!flashBridge) {
              flashBridge = document["global-zeroclipboard-flash-bridge"];
              if (flashBridge && (len = flashBridge.length)) {
                  flashBridge = flashBridge[len - 1];
              }
              if (!flashBridge) {
                  flashBridge = container.firstChild;
              }
          }
          _flashState.bridge = flashBridge || null;
      };
      var _createHtmlBridge = function () {
          var container = document.createElement("div");
          container.id = "global-zeroclipboard-html-bridge";
          container.className = "global-zeroclipboard-container";
          container.style.position = "absolute";
          container.style.left = "0px";
          container.style.top = "-9999px";
          container.style.width = "1px";
          container.style.height = "1px";
          container.style.zIndex = "" + _getSafeZIndex(_globalConfig.zIndex);
          return container;
      };
      var _getHtmlBridge = function (flashBridge) {
          var htmlBridge = flashBridge && flashBridge.parentNode;
          while (htmlBridge && htmlBridge.nodeName === "OBJECT" && htmlBridge.parentNode) {
              htmlBridge = htmlBridge.parentNode;
          }
          return htmlBridge || null;
      };
      var _reposition = function () {
          if (_currentElement) {
              var pos = _getDOMObjectPosition(_currentElement, _globalConfig.zIndex);
              var htmlBridge = _getHtmlBridge(_flashState.bridge);
              if (htmlBridge) {
                  htmlBridge.style.top = pos.top + "px";
                  htmlBridge.style.left = pos.left + "px";
                  htmlBridge.style.width = pos.width + "px";
                  htmlBridge.style.height = pos.height + "px";
                  htmlBridge.style.zIndex = pos.zIndex + 1;
              }
              _setSize(pos.width, pos.height);
          }
      };
      var _setSize = function (width, height) {
          var htmlBridge = _getHtmlBridge(_flashState.bridge);
          if (htmlBridge) {
              htmlBridge.style.width = width + "px";
              htmlBridge.style.height = height + "px";
          }
      };
      ZeroClipboard.emit = function (event) {
          var eventType, eventObj, performCallbackAsync, clients, i, len, eventCopy, returnVal, tmp;
          if (typeof event === "string" && event) {
              eventType = event;
          }
          if (typeof event === "object" && event && typeof event.type === "string" && event.type) {
              eventType = event.type;
              eventObj = event;
          }
          if (!eventType) {
              return;
          }
          event = _createEvent(eventType, eventObj);
          _preprocessEvent(event);
          if (event.type === "ready" && _flashState.overdue === true) {
              return ZeroClipboard.emit({
                  type: "error",
                  name: "flash-overdue"
              });
          }
          performCallbackAsync = !/^(before)?copy$/.test(event.type);
          if (event.client) {
              _dispatchClientCallbacks.call(event.client, event, performCallbackAsync);
          } else {
              clients = event.target && event.target !== window && _globalConfig.autoActivate === true ? _getAllClientsClippedToElement(event.target) : _getAllClients();
              for (i = 0, len = clients.length; i < len; i++) {
                  eventCopy = _extend({}, event, {
                      client: clients[i]
                  });
                  _dispatchClientCallbacks.call(clients[i], eventCopy, performCallbackAsync);
              }
          }
          if (event.type === "copy") {
              tmp = _mapClipDataToFlash(_clipData);
              returnVal = tmp.data;
              _clipDataFormatMap = tmp.formatMap;
          }
          return returnVal;
      };
      var _dispatchClientCallbacks = function (event, async) {
          var handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers[event.type];
          if (handlers && handlers.length) {
              var i, len, func, context, originalContext = this;
              for (i = 0, len = handlers.length; i < len; i++) {
                  func = handlers[i];
                  context = originalContext;
                  if (typeof func === "string" && typeof window[func] === "function") {
                      func = window[func];
                  }
                  if (typeof func === "object" && func && typeof func.handleEvent === "function") {
                      context = func;
                      func = func.handleEvent;
                  }
                  if (typeof func === "function") {
                      _dispatchCallback(func, context, [event], async);
                  }
              }
          }
          return this;
      };
      var _eventMessages = {
          ready: "Flash communication is established",
          error: {
              "flash-disabled": "Flash is disabled or not installed",
              "flash-outdated": "Flash is too outdated to support ZeroClipboard",
              "flash-unavailable": "Flash is unable to communicate bidirectionally with JavaScript",
              "flash-deactivated": "Flash is too outdated for your browser and/or is configured as click-to-activate",
              "flash-overdue": "Flash communication was established but NOT within the acceptable time limit"
          }
      };
      var _createEvent = function (eventType, event) {
          if (!(eventType || event && event.type)) {
              return;
          }
          event = event || {};
          eventType = (eventType || event.type).toLowerCase();
          _extend(event, {
              type: eventType,
              target: event.target || _currentElement || null,
              relatedTarget: event.relatedTarget || null,
              currentTarget: _flashState && _flashState.bridge || null
          });
          var msg = _eventMessages[event.type];
          if (event.type === "error" && event.name && msg) {
              msg = msg[event.name];
          }
          if (msg) {
              event.message = msg;
          }
          if (event.type === "ready") {
              _extend(event, {
                  target: null,
                  version: _flashState.version
              });
          }
          if (event.type === "error") {
              event.target = null;
              if (/^flash-(outdated|unavailable|deactivated|overdue)$/.test(event.name)) {
                  _extend(event, {
                      version: _flashState.version,
                      minimumVersion: "11.0.0"
                  });
              }
          }
          if (event.type === "copy") {
              event.clipboardData = {
                  setData: ZeroClipboard.setData,
                  clearData: ZeroClipboard.clearData
              };
          }
          if (event.type === "aftercopy") {
              event = _mapClipResultsFromFlash(event, _clipDataFormatMap);
          }
          if (event.target && !event.relatedTarget) {
              event.relatedTarget = _getRelatedTarget(event.target);
          }
          return event;
      };
      var _getRelatedTarget = function (targetEl) {
          var relatedTargetId = targetEl && targetEl.getAttribute && targetEl.getAttribute("data-clipboard-target");
          return relatedTargetId ? document.getElementById(relatedTargetId) : null;
      };
      var _preprocessEvent = function (event) {
          var element = event.target || _currentElement;
          switch (event.type) {
              case "error":
                  if (_inArray(event.name, ["flash-disabled", "flash-outdated", "flash-deactivated", "flash-overdue"])) {
                      _extend(_flashState, {
                          disabled: event.name === "flash-disabled",
                          outdated: event.name === "flash-outdated",
                          unavailable: event.name === "flash-unavailable",
                          deactivated: event.name === "flash-deactivated",
                          overdue: event.name === "flash-overdue",
                          ready: false
                      });
                  }
                  break;
  
              case "ready":
                  var wasDeactivated = _flashState.deactivated === true;
                  _extend(_flashState, {
                      disabled: false,
                      outdated: false,
                      unavailable: false,
                      deactivated: false,
                      overdue: wasDeactivated,
                      ready: !wasDeactivated
                  });
                  break;
  
              case "copy":
                  var textContent, htmlContent, targetEl = event.relatedTarget;
                  if (!(_clipData["text/html"] || _clipData["text/plain"]) && targetEl && (htmlContent = targetEl.value || targetEl.outerHTML || targetEl.innerHTML) && (textContent = targetEl.value || targetEl.textContent || targetEl.innerText)) {
                      event.clipboardData.clearData();
                      event.clipboardData.setData("text/plain", textContent);
                      if (htmlContent !== textContent) {
                          event.clipboardData.setData("text/html", htmlContent);
                      }
                  } else if (!_clipData["text/plain"] && event.target && (textContent = event.target.getAttribute("data-clipboard-text"))) {
                      event.clipboardData.clearData();
                      event.clipboardData.setData("text/plain", textContent);
                  }
                  break;
  
              case "aftercopy":
                  ZeroClipboard.clearData();
                  if (element && element !== _safeActiveElement() && element.focus) {
                      element.focus();
                  }
                  break;
  
              case "mouseover":
                  _addClass(element, _globalConfig.hoverClass);
                  break;
  
              case "mouseout":
                  if (_globalConfig.autoActivate === true) {
                      ZeroClipboard.deactivate();
                  }
                  break;
  
              case "mousedown":
                  _addClass(element, _globalConfig.activeClass);
                  break;
  
              case "mouseup":
                  _removeClass(element, _globalConfig.activeClass);
                  break;
          }
      };
      ZeroClipboard.prototype.on = function (eventName, func) {
          var i, len, events, added = {}, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
          if (typeof eventName === "string" && eventName) {
              events = eventName.toLowerCase().split(/\s+/);
          } else if (typeof eventName === "object" && eventName && typeof func === "undefined") {
              for (i in eventName) {
                  if (eventName.hasOwnProperty(i) && typeof i === "string" && i && typeof eventName[i] === "function") {
                      this.on(i, eventName[i]);
                  }
              }
          }
          if (events && events.length) {
              for (i = 0, len = events.length; i < len; i++) {
                  eventName = events[i].replace(/^on/, "");
                  added[eventName] = true;
                  if (!handlers[eventName]) {
                      handlers[eventName] = [];
                  }
                  handlers[eventName].push(func);
              }
              if (added.ready && _flashState.ready) {
                  ZeroClipboard.emit({
                      type: "ready",
                      client: this
                  });
              }
              if (added.error) {
                  var errorTypes = ["disabled", "outdated", "unavailable", "deactivated", "overdue"];
                  for (i = 0, len = errorTypes.length; i < len; i++) {
                      if (_flashState[errorTypes[i]]) {
                          ZeroClipboard.emit({
                              type: "error",
                              name: "flash-" + errorTypes[i],
                              client: this
                          });
                          break;
                      }
                  }
              }
          }
          return this;
      };
      ZeroClipboard.prototype.off = function (eventName, func) {
          var i, len, foundIndex, events, perEventHandlers,
              handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
          if (arguments.length === 0) {
              events = _objectKeys(handlers);
          } else if (typeof eventName === "string" && eventName) {
              events = eventName.split(/\s+/);
          } else if (typeof eventName === "object" && eventName && typeof func === "undefined") {
              for (i in eventName) {
                  if (eventName.hasOwnProperty(i) && typeof i === "string" && i && typeof eventName[i] === "function") {
                      this.off(i, eventName[i]);
                  }
              }
          }
          if (events && events.length) {
              for (i = 0, len = events.length; i < len; i++) {
                  eventName = events[i].toLowerCase().replace(/^on/, "");
                  perEventHandlers = handlers[eventName];
                  if (perEventHandlers && perEventHandlers.length) {
                      if (func) {
                          foundIndex = _inArray(func, perEventHandlers);
                          while (foundIndex !== -1) {
                              perEventHandlers.splice(foundIndex, 1);
                              foundIndex = _inArray(func, perEventHandlers, foundIndex);
                          }
                      } else {
                          handlers[eventName].length = 0;
                      }
                  }
              }
          }
          return this;
      };
      ZeroClipboard.prototype.handlers = function (eventName) {
          var prop, copy = null, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
          if (handlers) {
              if (typeof eventName === "string" && eventName) {
                  return handlers[eventName] ? handlers[eventName].slice(0) : null;
              }
              copy = {};
              for (prop in handlers) {
                  if (handlers.hasOwnProperty(prop) && handlers[prop]) {
                      copy[prop] = handlers[prop].slice(0);
                  }
              }
          }
          return copy;
      };
      ZeroClipboard.prototype.clip = function (elements) {
          elements = _prepClip(elements);
          for (var i = 0; i < elements.length; i++) {
              if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) {
                  if (!elements[i].zcClippingId) {
                      elements[i].zcClippingId = "zcClippingId_" + _elementIdCounter++;
                      _elementMeta[elements[i].zcClippingId] = [this.id];
                      if (_globalConfig.autoActivate === true) {
                          _addEventHandler(elements[i], "mouseover", _elementMouseOver);
                      }
                  } else if (_inArray(this.id, _elementMeta[elements[i].zcClippingId]) === -1) {
                      _elementMeta[elements[i].zcClippingId].push(this.id);
                  }
                  var clippedElements = _clientMeta[this.id].elements;
                  if (_inArray(elements[i], clippedElements) === -1) {
                      clippedElements.push(elements[i]);
                  }
              }
          }
          return this;
      };
      ZeroClipboard.prototype.unclip = function (elements) {
          var meta = _clientMeta[this.id];
          if (!meta) {
              return this;
          }
          var clippedElements = meta.elements;
          var arrayIndex;
          if (typeof elements === "undefined") {
              elements = clippedElements.slice(0);
          } else {
              elements = _prepClip(elements);
          }
          for (var i = elements.length; i--;) {
              if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) {
                  arrayIndex = 0;
                  while ((arrayIndex = _inArray(elements[i], clippedElements, arrayIndex)) !== -1) {
                      clippedElements.splice(arrayIndex, 1);
                  }
                  var clientIds = _elementMeta[elements[i].zcClippingId];
                  if (clientIds) {
                      arrayIndex = 0;
                      while ((arrayIndex = _inArray(this.id, clientIds, arrayIndex)) !== -1) {
                          clientIds.splice(arrayIndex, 1);
                      }
                      if (clientIds.length === 0) {
                          if (_globalConfig.autoActivate === true) {
                              _removeEventHandler(elements[i], "mouseover", _elementMouseOver);
                          }
                          delete elements[i].zcClippingId;
                      }
                  }
              }
          }
          return this;
      };
      ZeroClipboard.prototype.elements = function () {
          var meta = _clientMeta[this.id];
          return meta && meta.elements ? meta.elements.slice(0) : [];
      };
      var _getAllClientsClippedToElement = function (element) {
          var elementMetaId, clientIds, i, len, client, clients = [];
          if (element && element.nodeType === 1 && (elementMetaId = element.zcClippingId) && _elementMeta.hasOwnProperty(elementMetaId)) {
              clientIds = _elementMeta[elementMetaId];
              if (clientIds && clientIds.length) {
                  for (i = 0, len = clientIds.length; i < len; i++) {
                      client = _clientMeta[clientIds[i]].instance;
                      if (client && client instanceof ZeroClipboard) {
                          clients.push(client);
                      }
                  }
              }
          }
          return clients;
      };
      _globalConfig.hoverClass = "zeroclipboard-is-hover";
      _globalConfig.activeClass = "zeroclipboard-is-active";
      if (typeof define === "function" && define.amd) {
          define(function () {
              return ZeroClipboard;
          });
      } else if (typeof module === "object" && module && typeof module.exports === "object" && module.exports) {
          module.exports = ZeroClipboard;
      } else {
          window.ZeroClipboard = ZeroClipboard;
      }
  })(function () {
      return this;
  }());