650 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			650 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*!
 | |
|  * clipboard.js v2.0.8
 | |
|  * https://clipboardjs.com/
 | |
|  *
 | |
|  * Licensed MIT © Zeno Rocha
 | |
|  */
 | |
| !(function (t, e) {
 | |
|   "object" == typeof exports && "object" == typeof module
 | |
|     ? (module.exports = e())
 | |
|     : "function" == typeof define && define.amd
 | |
|     ? define([], e)
 | |
|     : "object" == typeof exports
 | |
|     ? (exports.ClipboardJS = e())
 | |
|     : (t.ClipboardJS = e());
 | |
| })(this, function () {
 | |
|   return (
 | |
|     (n = {
 | |
|       134: function (t, e, n) {
 | |
|         "use strict";
 | |
|         n.d(e, {
 | |
|           default: function () {
 | |
|             return r;
 | |
|           },
 | |
|         });
 | |
|         var e = n(279),
 | |
|           i = n.n(e),
 | |
|           e = n(370),
 | |
|           a = n.n(e),
 | |
|           e = n(817),
 | |
|           o = n.n(e);
 | |
|         function c(t) {
 | |
|           return (c =
 | |
|             "function" == typeof Symbol && "symbol" == typeof Symbol.iterator
 | |
|               ? function (t) {
 | |
|                   return typeof t;
 | |
|                 }
 | |
|               : function (t) {
 | |
|                   return t &&
 | |
|                     "function" == typeof Symbol &&
 | |
|                     t.constructor === Symbol &&
 | |
|                     t !== Symbol.prototype
 | |
|                     ? "symbol"
 | |
|                     : typeof t;
 | |
|                 })(t);
 | |
|         }
 | |
|         function u(t, e) {
 | |
|           for (var n = 0; n < e.length; n++) {
 | |
|             var r = e[n];
 | |
|             (r.enumerable = r.enumerable || !1),
 | |
|               (r.configurable = !0),
 | |
|               "value" in r && (r.writable = !0),
 | |
|               Object.defineProperty(t, r.key, r);
 | |
|           }
 | |
|         }
 | |
|         var l = (function () {
 | |
|           function e(t) {
 | |
|             !(function (t) {
 | |
|               if (!(t instanceof e))
 | |
|                 throw new TypeError("Cannot call a class as a function");
 | |
|             })(this),
 | |
|               this.resolveOptions(t),
 | |
|               this.initSelection();
 | |
|           }
 | |
|           var t, n, r;
 | |
|           return (
 | |
|             (t = e),
 | |
|             (n = [
 | |
|               {
 | |
|                 key: "resolveOptions",
 | |
|                 value: function () {
 | |
|                   var t =
 | |
|                     0 < arguments.length && void 0 !== arguments[0]
 | |
|                       ? arguments[0]
 | |
|                       : {};
 | |
|                   (this.action = t.action),
 | |
|                     (this.container = t.container),
 | |
|                     (this.emitter = t.emitter),
 | |
|                     (this.target = t.target),
 | |
|                     (this.text = t.text),
 | |
|                     (this.trigger = t.trigger),
 | |
|                     (this.selectedText = "");
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "initSelection",
 | |
|                 value: function () {
 | |
|                   this.text
 | |
|                     ? this.selectFake()
 | |
|                     : this.target && this.selectTarget();
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "createFakeElement",
 | |
|                 value: function () {
 | |
|                   var t =
 | |
|                     "rtl" === document.documentElement.getAttribute("dir");
 | |
|                   (this.fakeElem = document.createElement("textarea")),
 | |
|                     (this.fakeElem.style.fontSize = "12pt"),
 | |
|                     (this.fakeElem.style.border = "0"),
 | |
|                     (this.fakeElem.style.padding = "0"),
 | |
|                     (this.fakeElem.style.margin = "0"),
 | |
|                     (this.fakeElem.style.position = "absolute"),
 | |
|                     (this.fakeElem.style[t ? "right" : "left"] = "-9999px");
 | |
|                   t = window.pageYOffset || document.documentElement.scrollTop;
 | |
|                   return (
 | |
|                     (this.fakeElem.style.top = "".concat(t, "px")),
 | |
|                     this.fakeElem.setAttribute("readonly", ""),
 | |
|                     (this.fakeElem.value = this.text),
 | |
|                     this.fakeElem
 | |
|                   );
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "selectFake",
 | |
|                 value: function () {
 | |
|                   var t = this,
 | |
|                     e = this.createFakeElement();
 | |
|                   (this.fakeHandlerCallback = function () {
 | |
|                     return t.removeFake();
 | |
|                   }),
 | |
|                     (this.fakeHandler =
 | |
|                       this.container.addEventListener(
 | |
|                         "click",
 | |
|                         this.fakeHandlerCallback
 | |
|                       ) || !0),
 | |
|                     this.container.appendChild(e),
 | |
|                     (this.selectedText = o()(e)),
 | |
|                     this.copyText(),
 | |
|                     this.removeFake();
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "removeFake",
 | |
|                 value: function () {
 | |
|                   this.fakeHandler &&
 | |
|                     (this.container.removeEventListener(
 | |
|                       "click",
 | |
|                       this.fakeHandlerCallback
 | |
|                     ),
 | |
|                     (this.fakeHandler = null),
 | |
|                     (this.fakeHandlerCallback = null)),
 | |
|                     this.fakeElem &&
 | |
|                       (this.container.removeChild(this.fakeElem),
 | |
|                       (this.fakeElem = null));
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "selectTarget",
 | |
|                 value: function () {
 | |
|                   (this.selectedText = o()(this.target)), this.copyText();
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "copyText",
 | |
|                 value: function () {
 | |
|                   var e;
 | |
|                   try {
 | |
|                     e = document.execCommand(this.action);
 | |
|                   } catch (t) {
 | |
|                     e = !1;
 | |
|                   }
 | |
|                   this.handleResult(e);
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "handleResult",
 | |
|                 value: function (t) {
 | |
|                   this.emitter.emit(t ? "success" : "error", {
 | |
|                     action: this.action,
 | |
|                     text: this.selectedText,
 | |
|                     trigger: this.trigger,
 | |
|                     clearSelection: this.clearSelection.bind(this),
 | |
|                   });
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "clearSelection",
 | |
|                 value: function () {
 | |
|                   this.trigger && this.trigger.focus(),
 | |
|                     document.activeElement.blur(),
 | |
|                     window.getSelection().removeAllRanges();
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "destroy",
 | |
|                 value: function () {
 | |
|                   this.removeFake();
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "action",
 | |
|                 set: function () {
 | |
|                   var t =
 | |
|                     0 < arguments.length && void 0 !== arguments[0]
 | |
|                       ? arguments[0]
 | |
|                       : "copy";
 | |
|                   if (
 | |
|                     ((this._action = t),
 | |
|                     "copy" !== this._action && "cut" !== this._action)
 | |
|                   )
 | |
|                     throw new Error(
 | |
|                       'Invalid "action" value, use either "copy" or "cut"'
 | |
|                     );
 | |
|                 },
 | |
|                 get: function () {
 | |
|                   return this._action;
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "target",
 | |
|                 set: function (t) {
 | |
|                   if (void 0 !== t) {
 | |
|                     if (!t || "object" !== c(t) || 1 !== t.nodeType)
 | |
|                       throw new Error(
 | |
|                         'Invalid "target" value, use a valid Element'
 | |
|                       );
 | |
|                     if ("copy" === this.action && t.hasAttribute("disabled"))
 | |
|                       throw new Error(
 | |
|                         'Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'
 | |
|                       );
 | |
|                     if (
 | |
|                       "cut" === this.action &&
 | |
|                       (t.hasAttribute("readonly") || t.hasAttribute("disabled"))
 | |
|                     )
 | |
|                       throw new Error(
 | |
|                         'Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'
 | |
|                       );
 | |
|                     this._target = t;
 | |
|                   }
 | |
|                 },
 | |
|                 get: function () {
 | |
|                   return this._target;
 | |
|                 },
 | |
|               },
 | |
|             ]) && u(t.prototype, n),
 | |
|             r && u(t, r),
 | |
|             e
 | |
|           );
 | |
|         })();
 | |
|         function s(t) {
 | |
|           return (s =
 | |
|             "function" == typeof Symbol && "symbol" == typeof Symbol.iterator
 | |
|               ? function (t) {
 | |
|                   return typeof t;
 | |
|                 }
 | |
|               : function (t) {
 | |
|                   return t &&
 | |
|                     "function" == typeof Symbol &&
 | |
|                     t.constructor === Symbol &&
 | |
|                     t !== Symbol.prototype
 | |
|                     ? "symbol"
 | |
|                     : typeof t;
 | |
|                 })(t);
 | |
|         }
 | |
|         function f(t, e) {
 | |
|           for (var n = 0; n < e.length; n++) {
 | |
|             var r = e[n];
 | |
|             (r.enumerable = r.enumerable || !1),
 | |
|               (r.configurable = !0),
 | |
|               "value" in r && (r.writable = !0),
 | |
|               Object.defineProperty(t, r.key, r);
 | |
|           }
 | |
|         }
 | |
|         function h(t, e) {
 | |
|           return (h =
 | |
|             Object.setPrototypeOf ||
 | |
|             function (t, e) {
 | |
|               return (t.__proto__ = e), t;
 | |
|             })(t, e);
 | |
|         }
 | |
|         function d(n) {
 | |
|           var r = (function () {
 | |
|             if ("undefined" == typeof Reflect || !Reflect.construct) return !1;
 | |
|             if (Reflect.construct.sham) return !1;
 | |
|             if ("function" == typeof Proxy) return !0;
 | |
|             try {
 | |
|               return (
 | |
|                 Date.prototype.toString.call(
 | |
|                   Reflect.construct(Date, [], function () {})
 | |
|                 ),
 | |
|                 !0
 | |
|               );
 | |
|             } catch (t) {
 | |
|               return !1;
 | |
|             }
 | |
|           })();
 | |
|           return function () {
 | |
|             var t,
 | |
|               e = p(n);
 | |
|             return (
 | |
|               (t = r
 | |
|                 ? ((t = p(this).constructor),
 | |
|                   Reflect.construct(e, arguments, t))
 | |
|                 : e.apply(this, arguments)),
 | |
|               (e = this),
 | |
|               !(t = t) || ("object" !== s(t) && "function" != typeof t)
 | |
|                 ? (function (t) {
 | |
|                     if (void 0 !== t) return t;
 | |
|                     throw new ReferenceError(
 | |
|                       "this hasn't been initialised - super() hasn't been called"
 | |
|                     );
 | |
|                   })(e)
 | |
|                 : t
 | |
|             );
 | |
|           };
 | |
|         }
 | |
|         function p(t) {
 | |
|           return (p = Object.setPrototypeOf
 | |
|             ? Object.getPrototypeOf
 | |
|             : function (t) {
 | |
|                 return t.__proto__ || Object.getPrototypeOf(t);
 | |
|               })(t);
 | |
|         }
 | |
|         function y(t, e) {
 | |
|           t = "data-clipboard-".concat(t);
 | |
|           if (e.hasAttribute(t)) return e.getAttribute(t);
 | |
|         }
 | |
|         var r = (function () {
 | |
|           !(function (t, e) {
 | |
|             if ("function" != typeof e && null !== e)
 | |
|               throw new TypeError(
 | |
|                 "Super expression must either be null or a function"
 | |
|               );
 | |
|             (t.prototype = Object.create(e && e.prototype, {
 | |
|               constructor: { value: t, writable: !0, configurable: !0 },
 | |
|             })),
 | |
|               e && h(t, e);
 | |
|           })(o, i());
 | |
|           var t,
 | |
|             e,
 | |
|             n,
 | |
|             r = d(o);
 | |
|           function o(t, e) {
 | |
|             var n;
 | |
|             return (
 | |
|               (function (t) {
 | |
|                 if (!(t instanceof o))
 | |
|                   throw new TypeError("Cannot call a class as a function");
 | |
|               })(this),
 | |
|               (n = r.call(this)).resolveOptions(e),
 | |
|               n.listenClick(t),
 | |
|               n
 | |
|             );
 | |
|           }
 | |
|           return (
 | |
|             (t = o),
 | |
|             (n = [
 | |
|               {
 | |
|                 key: "isSupported",
 | |
|                 value: function () {
 | |
|                   var t =
 | |
|                       0 < arguments.length && void 0 !== arguments[0]
 | |
|                         ? arguments[0]
 | |
|                         : ["copy", "cut"],
 | |
|                     t = "string" == typeof t ? [t] : t,
 | |
|                     e = !!document.queryCommandSupported;
 | |
|                   return (
 | |
|                     t.forEach(function (t) {
 | |
|                       e = e && !!document.queryCommandSupported(t);
 | |
|                     }),
 | |
|                     e
 | |
|                   );
 | |
|                 },
 | |
|               },
 | |
|             ]),
 | |
|             (e = [
 | |
|               {
 | |
|                 key: "resolveOptions",
 | |
|                 value: function () {
 | |
|                   var t =
 | |
|                     0 < arguments.length && void 0 !== arguments[0]
 | |
|                       ? arguments[0]
 | |
|                       : {};
 | |
|                   (this.action =
 | |
|                     "function" == typeof t.action
 | |
|                       ? t.action
 | |
|                       : this.defaultAction),
 | |
|                     (this.target =
 | |
|                       "function" == typeof t.target
 | |
|                         ? t.target
 | |
|                         : this.defaultTarget),
 | |
|                     (this.text =
 | |
|                       "function" == typeof t.text ? t.text : this.defaultText),
 | |
|                     (this.container =
 | |
|                       "object" === s(t.container)
 | |
|                         ? t.container
 | |
|                         : document.body);
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "listenClick",
 | |
|                 value: function (t) {
 | |
|                   var e = this;
 | |
|                   this.listener = a()(t, "click", function (t) {
 | |
|                     return e.onClick(t);
 | |
|                   });
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "onClick",
 | |
|                 value: function (t) {
 | |
|                   t = t.delegateTarget || t.currentTarget;
 | |
|                   this.clipboardAction && (this.clipboardAction = null),
 | |
|                     (this.clipboardAction = new l({
 | |
|                       action: this.action(t),
 | |
|                       target: this.target(t),
 | |
|                       text: this.text(t),
 | |
|                       container: this.container,
 | |
|                       trigger: t,
 | |
|                       emitter: this,
 | |
|                     }));
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "defaultAction",
 | |
|                 value: function (t) {
 | |
|                   return y("action", t);
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "defaultTarget",
 | |
|                 value: function (t) {
 | |
|                   t = y("target", t);
 | |
|                   if (t) return document.querySelector(t);
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "defaultText",
 | |
|                 value: function (t) {
 | |
|                   return y("text", t);
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 key: "destroy",
 | |
|                 value: function () {
 | |
|                   this.listener.destroy(),
 | |
|                     this.clipboardAction &&
 | |
|                       (this.clipboardAction.destroy(),
 | |
|                       (this.clipboardAction = null));
 | |
|                 },
 | |
|               },
 | |
|             ]) && f(t.prototype, e),
 | |
|             n && f(t, n),
 | |
|             o
 | |
|           );
 | |
|         })();
 | |
|       },
 | |
|       828: function (t) {
 | |
|         var e;
 | |
|         "undefined" == typeof Element ||
 | |
|           Element.prototype.matches ||
 | |
|           ((e = Element.prototype).matches =
 | |
|             e.matchesSelector ||
 | |
|             e.mozMatchesSelector ||
 | |
|             e.msMatchesSelector ||
 | |
|             e.oMatchesSelector ||
 | |
|             e.webkitMatchesSelector),
 | |
|           (t.exports = function (t, e) {
 | |
|             for (; t && 9 !== t.nodeType; ) {
 | |
|               if ("function" == typeof t.matches && t.matches(e)) return t;
 | |
|               t = t.parentNode;
 | |
|             }
 | |
|           });
 | |
|       },
 | |
|       438: function (t, e, n) {
 | |
|         var a = n(828);
 | |
|         function i(t, e, n, r, o) {
 | |
|           var i = function (e, n, t, r) {
 | |
|             return function (t) {
 | |
|               (t.delegateTarget = a(t.target, n)),
 | |
|                 t.delegateTarget && r.call(e, t);
 | |
|             };
 | |
|           }.apply(this, arguments);
 | |
|           return (
 | |
|             t.addEventListener(n, i, o),
 | |
|             {
 | |
|               destroy: function () {
 | |
|                 t.removeEventListener(n, i, o);
 | |
|               },
 | |
|             }
 | |
|           );
 | |
|         }
 | |
|         t.exports = function (t, e, n, r, o) {
 | |
|           return "function" == typeof t.addEventListener
 | |
|             ? i.apply(null, arguments)
 | |
|             : "function" == typeof n
 | |
|             ? i.bind(null, document).apply(null, arguments)
 | |
|             : ("string" == typeof t && (t = document.querySelectorAll(t)),
 | |
|               Array.prototype.map.call(t, function (t) {
 | |
|                 return i(t, e, n, r, o);
 | |
|               }));
 | |
|         };
 | |
|       },
 | |
|       879: function (t, n) {
 | |
|         (n.node = function (t) {
 | |
|           return void 0 !== t && t instanceof HTMLElement && 1 === t.nodeType;
 | |
|         }),
 | |
|           (n.nodeList = function (t) {
 | |
|             var e = Object.prototype.toString.call(t);
 | |
|             return (
 | |
|               void 0 !== t &&
 | |
|               ("[object NodeList]" === e || "[object HTMLCollection]" === e) &&
 | |
|               "length" in t &&
 | |
|               (0 === t.length || n.node(t[0]))
 | |
|             );
 | |
|           }),
 | |
|           (n.string = function (t) {
 | |
|             return "string" == typeof t || t instanceof String;
 | |
|           }),
 | |
|           (n.fn = function (t) {
 | |
|             return "[object Function]" === Object.prototype.toString.call(t);
 | |
|           });
 | |
|       },
 | |
|       370: function (t, e, n) {
 | |
|         var l = n(879),
 | |
|           s = n(438);
 | |
|         t.exports = function (t, e, n) {
 | |
|           if (!t && !e && !n) throw new Error("Missing required arguments");
 | |
|           if (!l.string(e))
 | |
|             throw new TypeError("Second argument must be a String");
 | |
|           if (!l.fn(n))
 | |
|             throw new TypeError("Third argument must be a Function");
 | |
|           if (l.node(t))
 | |
|             return (
 | |
|               (c = e),
 | |
|               (u = n),
 | |
|               (a = t).addEventListener(c, u),
 | |
|               {
 | |
|                 destroy: function () {
 | |
|                   a.removeEventListener(c, u);
 | |
|                 },
 | |
|               }
 | |
|             );
 | |
|           if (l.nodeList(t))
 | |
|             return (
 | |
|               (r = t),
 | |
|               (o = e),
 | |
|               (i = n),
 | |
|               Array.prototype.forEach.call(r, function (t) {
 | |
|                 t.addEventListener(o, i);
 | |
|               }),
 | |
|               {
 | |
|                 destroy: function () {
 | |
|                   Array.prototype.forEach.call(r, function (t) {
 | |
|                     t.removeEventListener(o, i);
 | |
|                   });
 | |
|                 },
 | |
|               }
 | |
|             );
 | |
|           if (l.string(t))
 | |
|             return (t = t), (e = e), (n = n), s(document.body, t, e, n);
 | |
|           throw new TypeError(
 | |
|             "First argument must be a String, HTMLElement, HTMLCollection, or NodeList"
 | |
|           );
 | |
|           var r, o, i, a, c, u;
 | |
|         };
 | |
|       },
 | |
|       817: function (t) {
 | |
|         t.exports = function (t) {
 | |
|           var e,
 | |
|             n =
 | |
|               "SELECT" === t.nodeName
 | |
|                 ? (t.focus(), t.value)
 | |
|                 : "INPUT" === t.nodeName || "TEXTAREA" === t.nodeName
 | |
|                 ? ((e = t.hasAttribute("readonly")) ||
 | |
|                     t.setAttribute("readonly", ""),
 | |
|                   t.select(),
 | |
|                   t.setSelectionRange(0, t.value.length),
 | |
|                   e || t.removeAttribute("readonly"),
 | |
|                   t.value)
 | |
|                 : (t.hasAttribute("contenteditable") && t.focus(),
 | |
|                   (n = window.getSelection()),
 | |
|                   (e = document.createRange()).selectNodeContents(t),
 | |
|                   n.removeAllRanges(),
 | |
|                   n.addRange(e),
 | |
|                   n.toString());
 | |
|           return n;
 | |
|         };
 | |
|       },
 | |
|       279: function (t) {
 | |
|         function e() {}
 | |
|         (e.prototype = {
 | |
|           on: function (t, e, n) {
 | |
|             var r = this.e || (this.e = {});
 | |
|             return (r[t] || (r[t] = [])).push({ fn: e, ctx: n }), this;
 | |
|           },
 | |
|           once: function (t, e, n) {
 | |
|             var r = this;
 | |
|             function o() {
 | |
|               r.off(t, o), e.apply(n, arguments);
 | |
|             }
 | |
|             return (o._ = e), this.on(t, o, n);
 | |
|           },
 | |
|           emit: function (t) {
 | |
|             for (
 | |
|               var e = [].slice.call(arguments, 1),
 | |
|                 n = ((this.e || (this.e = {}))[t] || []).slice(),
 | |
|                 r = 0,
 | |
|                 o = n.length;
 | |
|               r < o;
 | |
|               r++
 | |
|             )
 | |
|               n[r].fn.apply(n[r].ctx, e);
 | |
|             return this;
 | |
|           },
 | |
|           off: function (t, e) {
 | |
|             var n = this.e || (this.e = {}),
 | |
|               r = n[t],
 | |
|               o = [];
 | |
|             if (r && e)
 | |
|               for (var i = 0, a = r.length; i < a; i++)
 | |
|                 r[i].fn !== e && r[i].fn._ !== e && o.push(r[i]);
 | |
|             return o.length ? (n[t] = o) : delete n[t], this;
 | |
|           },
 | |
|         }),
 | |
|           (t.exports = e),
 | |
|           (t.exports.TinyEmitter = e);
 | |
|       },
 | |
|     }),
 | |
|     (o = {}),
 | |
|     (r.n = function (t) {
 | |
|       var e =
 | |
|         t && t.__esModule
 | |
|           ? function () {
 | |
|               return t.default;
 | |
|             }
 | |
|           : function () {
 | |
|               return t;
 | |
|             };
 | |
|       return r.d(e, { a: e }), e;
 | |
|     }),
 | |
|     (r.d = function (t, e) {
 | |
|       for (var n in e)
 | |
|         r.o(e, n) &&
 | |
|           !r.o(t, n) &&
 | |
|           Object.defineProperty(t, n, { enumerable: !0, get: e[n] });
 | |
|     }),
 | |
|     (r.o = function (t, e) {
 | |
|       return Object.prototype.hasOwnProperty.call(t, e);
 | |
|     }),
 | |
|     r(134).default
 | |
|   );
 | |
|   function r(t) {
 | |
|     if (o[t]) return o[t].exports;
 | |
|     var e = (o[t] = { exports: {} });
 | |
|     return n[t](e, e.exports, r), e.exports;
 | |
|   }
 | |
|   var n, o;
 | |
| });
 |