chart = {
const svg = d3.create('svg')
.attr('viewBox', [0, 0, width, height])
svg.append('g')
.append('rect')
.attr('width', width)
.attr('height', height)
.attr('x', 0)
.attr('y', 0)
.attr('fill', paper)
svg.append('g')
.append("path")
.attr("fill", paper)
.attr("stroke", 'white')
.attr("stroke-width", 1)
.attr('vector-effect', 'non-scaling-stroke')
.style("pointer-events", "none")
.attr("d", path(topojson.feature(nuts2, nuts2.objects.nutsrg)))
svg.append('g')
.append("path")
.attr("fill", 'none')
.attr("stroke", pontoni)
.attr("stroke-width", 1)
.attr('vector-effect', 'non-scaling-stroke')
.style("pointer-events", "none")
.attr("d", path(topojson.feature(nuts0, nuts0.objects.nutsrg)))
svg.append('g')
.append('path')
.attr('fill', 'none')
.attr('stroke', pontoni)
.attr("stroke-width", 2)
.attr('stroke-dasharray', "5,5")
.attr('d', curve(projectedRoute))
svg.append('g')
.selectAll('circle')
.data(Object.values(projectedCities))
.enter()
.append('circle')
.attr('fill', pontoni)
.attr('cx', d=> d.point[0])
.attr('cy', d=> d.point[1])
.attr('r', 3)
svg.append('g')
.selectAll('rect')
.data(Object.values(projectedCities))
.enter()
.append('rect')
.attr('fill', paper)
.attr('width', 80)
.attr('height', 28)
.attr('x', d => d.point[0] - 40)
.attr('y', d => d.point[1] - 10 - 28)
svg.append('g')
.selectAll('text')
.data(Object.values(projectedCities))
.enter()
.append('text')
.attr('font-size', fontSize)
.attr('font-family', 'blacksword')
.attr('fill', pontoni)
.text(d => d.label)
.attr('x', d => d.point[0])
.attr('y', d => d.point[1] - 15)
.attr('text-anchor', 'middle')
svg.append('g')
.attr('id', 'plane')
.node()
.append(plane)
svg.select('#plane')
.attr('fill', pontoni)
.attr('transform', 'scale(0.05) translate(3730 3550) rotate(238)')
return svg.node()
}