1
0
mirror of https://github.com/GNS3/gns3-server synced 2024-11-24 17:28:08 +00:00

Merge branch '2.2' into 3.0

# Conflicts:
#	gns3server/controller/node.py
#	gns3server/handlers/api/compute/server_handler.py
#	gns3server/version.py
This commit is contained in:
grossmj 2021-09-15 16:59:56 +09:30
commit 541a906f49
16 changed files with 294 additions and 67 deletions

View File

@ -1,5 +1,15 @@
# Change Log
## 2.2.25 14/09/2021
* Release web UI 2.2.25
* Fix issue preventing to use custom nested symbols. Fixes #1969
* Updated affinity symbols
* Fix qemu-img rebase code to support Qemu 6.1. Ref https://github.com/GNS3/gns3-server/pull/1962
* Reinstate qemu-img rebase
* Return disk usage for partition that contains the default project directory. Fixes #1947
* Explicitly require setuptools, utils/get_resource.py imports pkg_resources
## 2.2.24 25/08/2021
* Release web UI 2.2.24

View File

@ -0,0 +1,46 @@
{
"name": "Nokia vSIM",
"category": "router",
"description": "The Nokia Virtualized 7750 SR and 7950 XRS Simulator (vSIM) is a Virtualized Network Function (VNF) that simulates the control, management, and forwarding functions of a 7750 SR or 7950 XRS router. The vSIM runs the same Service Router Operating System (SR OS) as 7750 SR and 7950 XRS hardware-based routers and, therefore, has the same feature set and operational behavior as those platforms.",
"vendor_name": "Nokia",
"vendor_url": "https://www.nokia.com/networks/",
"documentation_url": "https://documentation.nokia.com/",
"product_name": "Nokia vSIM",
"product_url": "https://www.nokia.com/networks/products/virtualized-service-router/",
"registry_version": 4,
"status": "experimental",
"maintainer": "Vinicius Rocha",
"maintainer_email": "viniciusatr@gmail.com",
"usage": "Login is admin and password is admin. \n\nWe are using one IOM with one MDA 12x100G (w/ breakout).\n\nYou must add your license: file vi cf3:license.txt",
"first_port_name": "A/1",
"port_name_format": "1/1/{port1}",
"qemu": {
"adapter_type": "virtio-net-pci",
"adapters": 13,
"ram": 4096,
"cpus": 2,
"hda_disk_interface": "virtio",
"arch": "x86_64",
"console_type": "telnet",
"kvm": "require",
"options": "-nographic -smbios type=1,product=TIMOS:license-file=cf3:license.txt\\ slot=A\\ chassis=SR-1\\ card=cpm-1\\ mda/1=me12-100gb-qsfp28"
},
"images": [
{
"filename": "sros-vsr-21.7.R1.qcow2",
"version": "21.7.R1",
"md5sum": "7eed38c01350ebaf9c6105e26ce5307e",
"filesize": 568655872,
"download_url": "https://customer.nokia.com/support/s/",
"compression": "zip"
}
],
"versions": [
{
"name": "21.7.R1",
"images": {
"hda_disk_image": "sros-vsr-21.7.R1.qcow2"
}
}
]
}

View File

@ -7,7 +7,7 @@
"documentation_url": "hhttps://docs.openmediavault.org",
"product_name": "OpenMediaVault",
"product_url": "https://www.openmediavault.org/",
"registry_version": 3,
"registry_version": 4,
"status": "stable",
"maintainer": "Savio D'souza",
"maintainer_email": "savio2002@yahoo.in",
@ -17,21 +17,29 @@
"adapter_type": "e1000",
"adapters": 1,
"ram": 2048,
"hda_disk_interface": "ide",
"hdb_disk_interface": "ide",
"arch": "x86_64",
"hda_disk_interface": "sata",
"hdb_disk_interface": "sata",
"arch": "x86_64",
"console_type": "vnc",
"boot_priority": "dc",
"kvm": "require"
},
"images": [
{
"filename": "openmediavault_5.6.13-amd64.iso",
"version": "5.6.13",
"md5sum": "f08b41a5111fffca0355d53e26ec47ab",
"filesize": 652214272,
"download_url": "https://www.openmediavault.org/download.html",
"direct_download_url": "https://sourceforge.net/projects/openmediavault/files/5.6.13/openmediavault_5.6.13-amd64.iso/download"
},
{
"filename": "openmediavault_5.5.11-amd64.iso",
"version": "5.5.11",
"md5sum": "76baad8e13dd49bee9b4b4a6936b7296",
"filesize": 608174080,
"download_url": "https://www.openmediavault.org/download.html",
"direct_download_url": "https://sourceforge.net/projects/openmediavault/files/latest/download"
"direct_download_url": "https://sourceforge.net/projects/openmediavault/files/5.5.11/openmediavault_5.5.11-amd64.iso/download"
},
{
"filename": "empty30G.qcow2",
@ -44,12 +52,20 @@
],
"versions": [
{
"name": "5.5.11",
"name": "5.6.13",
"images": {
"hda_disk_image": "empty30G.qcow2",
"hdb_disk_image": "empty30G.qcow2",
"cdrom_image": "openmediavault_5.5.11-amd64.iso"
"cdrom_image": "openmediavault_5.6.13-amd64.iso"
}
},
{
"name": "5.5.11",
"images": {
"hda_disk_image": "empty30G.qcow2",
"hdb_disk_image": "empty30G.qcow2",
"cdrom_image": "openmediavault_5.5.11-amd64.iso"
}
}
]
}

View File

@ -22,6 +22,24 @@
"kvm": "allow"
},
"images": [
{
"filename": "openwrt-21.02.0-x86-64-generic-ext4-combined.img",
"version": "21.02.0",
"md5sum": "1ba2a5c5c05e592c36a469a8ecd3bcf5",
"filesize": 126353408,
"download_url": "https://downloads.openwrt.org/releases/21.02.0/targets/x86/64/",
"direct_download_url": "https://downloads.openwrt.org/releases/21.02.0/targets/x86/64/openwrt-21.02.0-x86-64-generic-ext4-combined.img.gz",
"compression": "gzip"
},
{
"filename": "openwrt-19.07.8-x86-64-combined-ext4.img",
"version": "19.07.8",
"md5sum": "a9d9776a96968a2042484330f285cae3",
"filesize": 285736960,
"download_url": "https://downloads.openwrt.org/releases/19.07.8/targets/x86/64/",
"direct_download_url": "https://downloads.openwrt.org/releases/19.07.8/targets/x86/64/openwrt-19.07.8-x86-64-combined-ext4.img",
"compression": "gzip"
},
{
"filename": "openwrt-19.07.7-x86-64-combined-ext4.img",
"version": "19.07.7",
@ -168,6 +186,18 @@
}
],
"versions": [
{
"name": "21.02.0",
"images": {
"hda_disk_image": "openwrt-21.02.0-x86-64-generic-ext4-combined.img"
}
},
{
"name": "19.07.8",
"images": {
"hda_disk_image": "openwrt-19.07.8-x86-64-combined-ext4.img"
}
},
{
"name": "19.07.7",
"images": {

View File

@ -1,24 +1,27 @@
{
"name": "Ostinato",
"category": "guest",
"description": "Ostinato is an open-source, cross-platform network packet crafter/traffic generator and analyzer with a friendly GUI. Craft and send packets of several streams with different protocols at different rates.",
"description": "Packet crafter and traffic generator for network engineers",
"vendor_name": "Ostinato",
"vendor_url": "http://ostinato.org/",
"documentation_url": "http://ostinato.org/docs.html",
"vendor_url": "https://ostinato.org/",
"documentation_url": "https://ostinato.org/docs",
"product_name": "Ostinato",
"product_url": "http://ostinato.org/",
"registry_version": 3,
"status": "experimental",
"maintainer": "Bernhard Ehlers",
"maintainer_email": "be@bernhard-ehlers.de",
"usage": "Use interfaces starting with eth1 as traffic interfaces, eth0 is only for the (optional) management of the server/drone.",
"symbol": "ostinato-3d-icon.svg",
"port_name_format": "eth{0}",
"product_url": "https://ostinato.org/",
"registry_version": 4,
"status": "stable",
"availability": "service-contract",
"maintainer": "Srivats P",
"maintainer_email": "support@ostinato.org",
"symbol": ":/symbols/affinity/circle/gray/cog.svg",
"first_port_name": "eth0/mgmt",
"port_name_format": "eth{port1}",
"linked_clone": true,
"qemu": {
"adapter_type": "e1000",
"adapters": 4,
"ram": 256,
"hda_disk_interface": "ide",
"cpus": 2,
"hda_disk_interface": "sata",
"arch": "i386",
"console_type": "vnc",
"kvm": "allow",
@ -26,33 +29,18 @@
},
"images": [
{
"filename": "ostinato-0.9-1.qcow2",
"version": "0.9",
"md5sum": "00b4856ec9fffbcbcab7a8f757355d69",
"filesize": 101646336,
"download_url": "http://www.bernhard-ehlers.de/projects/ostinato4gns3/index.html",
"direct_download_url": "http://www.bernhard-ehlers.de/projects/ostinato4gns3/ostinato-0.9-1.qcow2"
},
{
"filename": "ostinato-0.8-1.qcow2",
"version": "0.8",
"md5sum": "12e990ba695103cfac82f8771b8015d4",
"filesize": 57344000,
"download_url": "http://www.bernhard-ehlers.de/projects/ostinato4gns3/index.html",
"direct_download_url": "http://www.bernhard-ehlers.de/projects/ostinato4gns3/ostinato-0.8-1.qcow2"
"version": "1.1",
"filename": "ostinatostd-1.1-1.qcow2",
"filesize": 134217728,
"md5sum": "aa027e83cefea1c38d0102eb2f28956e",
"download_url": "https://ostinato.org/pricing/gns3"
}
],
"versions": [
{
"name": "0.9",
"name": "1.1",
"images": {
"hda_disk_image": "ostinato-0.9-1.qcow2"
}
},
{
"name": "0.8",
"images": {
"hda_disk_image": "ostinato-0.8-1.qcow2"
"hda_disk_image": "ostinatostd-1.1-1.qcow2"
}
}
]

View File

@ -11,7 +11,7 @@
"status": "stable",
"maintainer": "GNS3 Team",
"maintainer_email": "developers@gns3.net",
"usage": "Default username/password is vyos/vyos.\n\nAt first boot of versions 1.1.x/1.2.x the router will start from the cdrom. Login and then type \"install image\" and follow the instructions.",
"usage": "Default username/password is vyos/vyos.\n\nAt first boot the router will start from the cdrom. Login and then type \"install image\" and follow the instructions.",
"symbol": "vyos.svg",
"port_name_format": "eth{0}",
"qemu": {
@ -26,11 +26,12 @@
},
"images": [
{
"filename": "vyos-1.3.0-rc5-amd64.qcow2",
"version": "1.3.0-rc5",
"md5sum": "dd704f59afc0fccdf601cc750bf2c438",
"filesize": 361955328,
"direct_download_url": "https://www.mediafire.com/file/taspgxh4vj0a4j1/vyos-1.3.0-rc5-amd64.qcow2/file"
"filename": "vyos-1.3.0-rc6-amd64.iso",
"version": "1.3.0-rc6",
"md5sum": "b3939f82a35b23d428ee0ad4ac8be087",
"filesize": 331350016,
"download_url": "https://vyos.net/get/snapshots/",
"direct_download_url": "https://s3.amazonaws.com/s3-us.vyos.io/snapshot/vyos-1.3.0-rc6/vyos-1.3.0-rc6-amd64.iso"
},
{
"filename": "vyos-1.2.8-amd64.iso",
@ -65,9 +66,10 @@
],
"versions": [
{
"name": "1.3.0-rc5",
"name": "1.3.0-rc6",
"images": {
"hda_disk_image": "vyos-1.3.0-rc5-amd64.qcow2"
"hda_disk_image": "empty8G.qcow2",
"cdrom_image": "vyos-1.3.0-rc6-amd64.iso"
}
},
{

View File

@ -59,7 +59,7 @@ class CrashReport:
Report crash to a third party service
"""
DSN = "https://95f189bae52543e38be226cc1de2c8f3:e06825958e234a3e9ae5a81eaa21993d@o19455.ingest.sentry.io/38482"
DSN = "https://54d3363bab36489fb0f7cbbdda6ca7c5:9f1012f8aa1547f683e00c0aac9b99f6@o19455.ingest.sentry.io/38482"
_instance = None
def __init__(self):

View File

@ -0,0 +1,135 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2015 GNS3 Technologies Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import psutil
import platform
from gns3server.web.route import Route
from gns3server.config import Config
from gns3server.schemas.version import VERSION_SCHEMA
from gns3server.schemas.server_statistics import SERVER_STATISTICS_SCHEMA
from gns3server.compute.port_manager import PortManager
from gns3server.utils.cpu_percent import CpuPercent
from gns3server.utils.path import get_default_project_directory
from gns3server.version import __version__
from aiohttp.web import HTTPConflict
class ServerHandler:
@Route.get(
r"/version",
description="Retrieve the server version number",
output=VERSION_SCHEMA)
def version(request, response):
config = Config.instance()
local_server = config.get_section_config("Server").getboolean("local", False)
response.json({"version": __version__, "local": local_server})
@Route.get(
r"/statistics",
description="Retrieve server statistics",
output=SERVER_STATISTICS_SCHEMA,
status_codes={
200: "Statistics information returned",
409: "Conflict"
})
def statistics(request, response):
try:
memory_total = psutil.virtual_memory().total
memory_free = psutil.virtual_memory().available
memory_used = memory_total - memory_free # actual memory usage in a cross platform fashion
swap_total = psutil.swap_memory().total
swap_free = psutil.swap_memory().free
swap_used = psutil.swap_memory().used
cpu_percent = int(CpuPercent.get())
load_average_percent = [int(x / psutil.cpu_count() * 100) for x in psutil.getloadavg()]
memory_percent = int(psutil.virtual_memory().percent)
swap_percent = int(psutil.swap_memory().percent)
disk_usage_percent = int(psutil.disk_usage(get_default_project_directory()).percent)
except psutil.Error as e:
raise HTTPConflict(text="Psutil error detected: {}".format(e))
response.json({"memory_total": memory_total,
"memory_free": memory_free,
"memory_used": memory_used,
"swap_total": swap_total,
"swap_free": swap_free,
"swap_used": swap_used,
"cpu_usage_percent": cpu_percent,
"memory_usage_percent": memory_percent,
"swap_usage_percent": swap_percent,
"disk_usage_percent": disk_usage_percent,
"load_average_percent": load_average_percent})
@Route.get(
r"/debug",
description="Return debug information about the compute",
status_codes={
201: "Written"
})
def debug(request, response):
response.content_type = "text/plain"
response.text = ServerHandler._getDebugData()
@staticmethod
def _getDebugData():
try:
addrs = ["* {}: {}".format(key, val) for key, val in psutil.net_if_addrs().items()]
except UnicodeDecodeError:
addrs = ["INVALID ADDR WITH UNICODE CHARACTERS"]
data = """Version: {version}
OS: {os}
Python: {python}
CPU: {cpu}
Memory: {memory}
Networks:
{addrs}
""".format(
version=__version__,
os=platform.platform(),
python=platform.python_version(),
memory=psutil.virtual_memory(),
cpu=psutil.cpu_times(),
addrs="\n".join(addrs)
)
try:
connections = psutil.net_connections()
# You need to be root for OSX
except psutil.AccessDenied:
connections = None
if connections:
data += "\n\nConnections:\n"
for port in PortManager.instance().tcp_ports:
found = False
for open_port in connections:
if open_port.laddr[1] == port:
found = True
data += "TCP {}: {}\n".format(port, found)
for port in PortManager.instance().udp_ports:
found = False
for open_port in connections:
if open_port.laddr[1] == port:
found = True
data += "UDP {}: {}\n".format(port, found)
return data

View File

@ -2575,7 +2575,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
spark-md5
WTFPL
(WTFPL OR MIT)
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
!function(){"use strict";var e,v={},g={};function n(e){var u=g[e];if(void 0!==u)return u.exports;var t=g[e]={id:e,loaded:!1,exports:{}};return v[e](t,t.exports,n),t.loaded=!0,t.exports}n.m=v,e=[],n.O=function(u,t,a,o){if(!t){var r=1/0;for(i=0;i<e.length;i++){t=e[i][0],a=e[i][1],o=e[i][2];for(var l=!0,f=0;f<t.length;f++)(!1&o||r>=o)&&Object.keys(n.O).every(function(b){return n.O[b](t[f])})?t.splice(f--,1):(l=!1,o<r&&(r=o));if(l){e.splice(i--,1);var s=a();void 0!==s&&(u=s)}}return u}o=o||0;for(var i=e.length;i>0&&e[i-1][2]>o;i--)e[i]=e[i-1];e[i]=[t,a,o]},n.n=function(e){var u=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(u,{a:u}),u},n.d=function(e,u){for(var t in u)n.o(u,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:u[t]})},n.f={},n.e=function(e){return Promise.all(Object.keys(n.f).reduce(function(u,t){return n.f[t](e,u),u},[]))},n.u=function(e){return e+".b66762bd9b75f566201f.js"},n.miniCssF=function(e){return"styles.f77f6cd675ecc98f0177.css"},n.hmd=function(e){return(e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:function(){throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e},n.o=function(e,u){return Object.prototype.hasOwnProperty.call(e,u)},function(){var e={},u="gns3-web-ui:";n.l=function(t,a,o,i){if(e[t])e[t].push(a);else{var r,l;if(void 0!==o)for(var f=document.getElementsByTagName("script"),s=0;s<f.length;s++){var c=f[s];if(c.getAttribute("src")==t||c.getAttribute("data-webpack")==u+o){r=c;break}}r||(l=!0,(r=document.createElement("script")).charset="utf-8",r.timeout=120,n.nc&&r.setAttribute("nonce",n.nc),r.setAttribute("data-webpack",u+o),r.src=n.tu(t)),e[t]=[a];var d=function(h,b){r.onerror=r.onload=null,clearTimeout(p);var _=e[t];if(delete e[t],r.parentNode&&r.parentNode.removeChild(r),_&&_.forEach(function(m){return m(b)}),h)return h(b)},p=setTimeout(d.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=d.bind(null,r.onerror),r.onload=d.bind(null,r.onload),l&&document.head.appendChild(r)}}}(),n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},function(){var e;n.tu=function(u){return void 0===e&&(e={createScriptURL:function(t){return t}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("angular#bundler",e))),e.createScriptURL(u)}}(),n.p="",function(){var e={666:0};n.f.j=function(a,o){var i=n.o(e,a)?e[a]:void 0;if(0!==i)if(i)o.push(i[2]);else if(666!=a){var r=new Promise(function(c,d){i=e[a]=[c,d]});o.push(i[2]=r);var l=n.p+n.u(a),f=new Error;n.l(l,function(c){if(n.o(e,a)&&(0!==(i=e[a])&&(e[a]=void 0),i)){var d=c&&("load"===c.type?"missing":c.type),p=c&&c.target&&c.target.src;f.message="Loading chunk "+a+" failed.\n("+d+": "+p+")",f.name="ChunkLoadError",f.type=d,f.request=p,i[1](f)}},"chunk-"+a,a)}else e[a]=0},n.O.j=function(a){return 0===e[a]};var u=function(a,o){var f,s,i=o[0],r=o[1],l=o[2],c=0;for(f in r)n.o(r,f)&&(n.m[f]=r[f]);if(l)var d=l(n);for(a&&a(o);c<i.length;c++)n.o(e,s=i[c])&&e[s]&&e[s][0](),e[i[c]]=0;return n.O(d)},t=self.webpackChunkgns3_web_ui=self.webpackChunkgns3_web_ui||[];t.forEach(u.bind(null,0)),t.push=u.bind(null,t.push.bind(t))}()}();
!function(){"use strict";var e,v={},g={};function n(e){var u=g[e];if(void 0!==u)return u.exports;var t=g[e]={id:e,loaded:!1,exports:{}};return v[e](t,t.exports,n),t.loaded=!0,t.exports}n.m=v,e=[],n.O=function(u,t,a,o){if(!t){var r=1/0;for(i=0;i<e.length;i++){t=e[i][0],a=e[i][1],o=e[i][2];for(var l=!0,f=0;f<t.length;f++)(!1&o||r>=o)&&Object.keys(n.O).every(function(b){return n.O[b](t[f])})?t.splice(f--,1):(l=!1,o<r&&(r=o));if(l){e.splice(i--,1);var s=a();void 0!==s&&(u=s)}}return u}o=o||0;for(var i=e.length;i>0&&e[i-1][2]>o;i--)e[i]=e[i-1];e[i]=[t,a,o]},n.n=function(e){var u=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(u,{a:u}),u},n.d=function(e,u){for(var t in u)n.o(u,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:u[t]})},n.f={},n.e=function(e){return Promise.all(Object.keys(n.f).reduce(function(u,t){return n.f[t](e,u),u},[]))},n.u=function(e){return e+".30249f0e3aeb3f791226.js"},n.miniCssF=function(e){return"styles.bc7659e2cee2695de64b.css"},n.hmd=function(e){return(e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:function(){throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e},n.o=function(e,u){return Object.prototype.hasOwnProperty.call(e,u)},function(){var e={},u="gns3-web-ui:";n.l=function(t,a,o,i){if(e[t])e[t].push(a);else{var r,l;if(void 0!==o)for(var f=document.getElementsByTagName("script"),s=0;s<f.length;s++){var c=f[s];if(c.getAttribute("src")==t||c.getAttribute("data-webpack")==u+o){r=c;break}}r||(l=!0,(r=document.createElement("script")).charset="utf-8",r.timeout=120,n.nc&&r.setAttribute("nonce",n.nc),r.setAttribute("data-webpack",u+o),r.src=n.tu(t)),e[t]=[a];var d=function(h,b){r.onerror=r.onload=null,clearTimeout(p);var _=e[t];if(delete e[t],r.parentNode&&r.parentNode.removeChild(r),_&&_.forEach(function(m){return m(b)}),h)return h(b)},p=setTimeout(d.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=d.bind(null,r.onerror),r.onload=d.bind(null,r.onload),l&&document.head.appendChild(r)}}}(),n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},function(){var e;n.tu=function(u){return void 0===e&&(e={createScriptURL:function(t){return t}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("angular#bundler",e))),e.createScriptURL(u)}}(),n.p="",function(){var e={666:0};n.f.j=function(a,o){var i=n.o(e,a)?e[a]:void 0;if(0!==i)if(i)o.push(i[2]);else if(666!=a){var r=new Promise(function(c,d){i=e[a]=[c,d]});o.push(i[2]=r);var l=n.p+n.u(a),f=new Error;n.l(l,function(c){if(n.o(e,a)&&(0!==(i=e[a])&&(e[a]=void 0),i)){var d=c&&("load"===c.type?"missing":c.type),p=c&&c.target&&c.target.src;f.message="Loading chunk "+a+" failed.\n("+d+": "+p+")",f.name="ChunkLoadError",f.type=d,f.request=p,i[1](f)}},"chunk-"+a,a)}else e[a]=0},n.O.j=function(a){return 0===e[a]};var u=function(a,o){var f,s,i=o[0],r=o[1],l=o[2],c=0;for(f in r)n.o(r,f)&&(n.m[f]=r[f]);if(l)var d=l(n);for(a&&a(o);c<i.length;c++)n.o(e,s=i[c])&&e[s]&&e[s][0](),e[i[c]]=0;return n.O(d)},t=self.webpackChunkgns3_web_ui=self.webpackChunkgns3_web_ui||[];t.forEach(u.bind(null,0)),t.push=u.bind(null,t.push.bind(t))}()}();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long