function generateMandala(){function t(t,e,a){void 0===e&&(e="y1"),void 0===a&&(a="y2");var r=yScale(t[e]),i=yScale(t[a]),l=(sliceHeight-r)*Math.tan(-sliceAngle/2),n=(sliceHeight-i)*Math.tan(sliceAngle/2);return{x1:l,x2:n,y1:r,y2:i}}function e(t){var e=t.x1,a=t.x2,r=t.y1,i=t.y2;return"M"+e+","+r+" L"+a+","+i}var a=d3.select("#vis-container");a.selectAll("*").remove();var r=a.append("svg").attr("width",width).attr("height",height),i=Math.floor(360*Math.random()),l=.3*Math.random()+.7,n=.15*Math.random()+.05,s=d3.hsl(i,l,n);d3.select("body").style("background"),r.append("rect").attr("class","mandala-bg").attr("width",width).attr("height",height).style("fill",s);var d=r.append("g").attr("transform","translate("+padding.left+" "+padding.top+")");animate&&d.transition().duration(2500).attrTween("transform",function(){return d3.interpolateString("translate("+padding.left+" "+padding.top+") rotate(0 "+plotAreaWidth/2+" "+plotAreaHeight/2+")","translate("+padding.left+" "+padding.top+") rotate(360 "+plotAreaWidth/2+" "+plotAreaHeight/2+")")});var c=d.append("defs"),o=c.append("radialGradient").attr("id","bg-shading").attr("gradientUnits","userSpaceOnUse");o.append("stop").attr("offset","0%").attr("stop-color","#000").attr("stop-opacity",0),o.append("stop").attr("offset","100%").attr("stop-color","#000").attr("stop-opacity",.2),r.insert("rect","g").attr("class","mandala-bg-shading").attr("width",width).attr("height",height).style("fill","url(#bg-shading)");var p=c.append("clipPath").attr("id","marks-clip").append("circle").attr("cx",plotAreaWidth/2).attr("cy",plotAreaHeight/2).attr("r",0).style("fill","#fff");animate?p.transition().ease(d3.easeLinear).duration(2e3).attr("r",plotAreaHeight/2+5):p.attr("r",plotAreaHeight/2+5);var u=d.append("g").attr("class","slices-group").attr("clip-path","url(#marks-clip)"),h=u.append("g").attr("id","ref-slice").attr("class","slice").attr("transform","translate("+plotAreaWidth/2+" 0)").attr("clip-path","url(#slice-clip)"),y=d3.range(numSlices-1).map(function(t,e){return{id:e+1,href:"#ref-slice",transform:"rotate("+(e+1)*sliceAngle*(180/Math.PI)+" "+plotAreaWidth/2+" "+sliceHeight+")"}}),g=u.selectAll("copy-slice").data(y);g.enter().append("use").attr("xlink:href",function(t){return t.href}).attr("transform",function(t){return t.transform}),h.append("path").attr("class","slice-bg").attr("transform","translate(0 "+sliceHeight+")").attr("d",arc({innerRadius:0,outerRadius:sliceHeight,startAngle:-(sliceAngle/2),endAngle:sliceAngle/2})).style("fill","none").style("stroke","tomato").style("opacity",0);var f="#fff",m=h.selectAll(".point").data(dataByType.point||[]);m.enter().append("circle").attr("class","point").attr("r",function(t){return t.r}).attr("cx",0).attr("cy",function(t){return yScale(t.y)}).style("fill",function(t){return t.filled?f:"none"}).style("stroke",function(t){return t.filled?"none":f});var v=h.selectAll(".arc").data(dataByType.arc||[]),S=d3.arc().innerRadius(function(t){return rScale(t.y-t.thickness)}).outerRadius(function(t){return rScale(t.y)}).startAngle(-sliceAngle/2-.1).endAngle(sliceAngle/2+.1);v.enter().append("path").attr("transform","translate(0 "+sliceHeight+")").attr("class","arc").attr("d",S).style("fill",f);var z=h.selectAll(".diagonalUp").data(dataByType.diagonalUp||[]);z.enter().append("path").attr("class","diagonalUp").attr("d",function(a){return e(t(a))}).style("stroke",f).style("fill",f);var A=h.selectAll(".diagonalDown").data(dataByType.diagonalDown||[]);A.enter().append("path").attr("class","diagonalDown").attr("d",function(a){return e(t(a))}).style("stroke",f).style("fill",f);var M=h.selectAll(".x").data(dataByType.x||[]),k=M.enter().append("g").attr("class","x");k.append("path").attr("d",function(a){return e(t(a))}).style("stroke",f).style("fill",f),k.append("path").attr("d",function(a){return e(t(a,"y2","y1"))}).style("stroke",f).style("fill",f);var w=h.selectAll(".arrow").data(dataByType.arrow||[]),H=w.enter().append("g").attr("class","arrow");H.append("path").attr("d",function(a){return e(t(a,"y1","yMid"))}).style("stroke",f).style("fill",f),H.append("path").attr("d",function(a){return e(t(a,"y2","yMid"))}).style("stroke",f).style("fill",f)}var markTypes=["x","arrow","arc","point"],animate=!0,numMarks=30,cumulativeSize=0,prevType,data=d3.range(numMarks).map(function(t,e){var a,r;do r=!0,a=markTypes[Math.floor(Math.random()*markTypes.length)],e>5&&"arrow"===a&&(r=!1);while(!r);prevType=a;var i;if("point"===a){var l=Math.ceil(20*Math.random())+10;i={type:a,r:l/5,size:l,cumulativeSize:cumulativeSize,y:cumulativeSize+l/2,filled:Math.random()>.3}}else if("arc"===a){var n=Math.ceil(20*Math.random())+2;i={type:a,thickness:Math.round(n/4),size:n,cumulativeSize:cumulativeSize,y:cumulativeSize+n/2}}else if("diagonalUp"===a){var s=Math.ceil(10*Math.random())+3;i={type:a,size:s,cumulativeSize:cumulativeSize,y1:cumulativeSize,y2:cumulativeSize+s}}else if("diagonalDown"===a){var d=Math.ceil(10*Math.random())+3;i={type:a,size:d,cumulativeSize:cumulativeSize,y1:cumulativeSize+d,y2:cumulativeSize}}else if("x"===a){var c=Math.ceil(10*Math.random())+3;i={type:a,size:c,cumulativeSize:cumulativeSize,y1:cumulativeSize+c,y2:cumulativeSize}}else if("arrow"===a){var o=Math.ceil(10*Math.random())+3;i={type:a,size:o,cumulativeSize:cumulativeSize,y1:cumulativeSize+o,yMid:cumulativeSize+o/2,y2:cumulativeSize}}else i={size:0};return i.id=e,cumulativeSize+=i.size,i}),dataByType=d3.nest().key(function(t){return t.type}).object(data),width=600,height=600,padding={top:20,right:20,bottom:20,left:20},plotAreaWidth=width-padding.left-padding.right,plotAreaHeight=height-padding.top-padding.bottom,numSlices=32,sliceHeight=plotAreaHeight/2,sliceAngle=2*Math.PI/numSlices,yScale=d3.scaleLinear().domain([0,cumulativeSize]).range([sliceHeight,0]),rScale=d3.scaleLinear().domain([0,cumulativeSize]).range([0,sliceHeight]),arc=d3.arc();generateMandala(),d3.select("#make-mandala").on("click",generateMandala); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNjcmlwdC5qcyJdLCJuYW1lcyI6WyJnZW5lcmF0ZU1hbmRhbGEiLCJkVG9MaW5lIiwiZCIsInkxS2V5IiwieTJLZXkiLCJjb25zdCIsInkxIiwieVNjYWxlIiwieTIiLCJ4MSIsInNsaWNlSGVpZ2h0IiwiTWF0aCIsInRhbiIsInNsaWNlQW5nbGUiLCJ4MiIsInRvUGF0aCIsInJlZiIsImNvbnRhaW5lciIsImQzIiwic2VsZWN0Iiwic2VsZWN0QWxsIiwicmVtb3ZlIiwic3ZnIiwiYXBwZW5kIiwiYXR0ciIsIndpZHRoIiwiaGVpZ2h0IiwiYmdIdWUiLCJmbG9vciIsInJhbmRvbSIsImJnU2F0dXJhdGlvbiIsImJnTGlnaHRuZXNzIiwiYmciLCJoc2wiLCJzdHlsZSIsImciLCJwYWRkaW5nIiwiYW5pbWF0ZSIsInRyYW5zaXRpb24iLCJkdXJhdGlvbiIsImF0dHJUd2VlbiIsImludGVycG9sYXRlU3RyaW5nIiwicGxvdEFyZWFXaWR0aCIsInBsb3RBcmVhSGVpZ2h0IiwiZGVmcyIsIm1hbmRhbGFCZ0dyYWQiLCJpbnNlcnQiLCJtYXJrc0NsaXAiLCJlYXNlIiwiZWFzZUxpbmVhciIsImdTbGljZXMiLCJzbGljZSIsImNvcHlTbGljZXMiLCJyYW5nZSIsIm51bVNsaWNlcyIsIm1hcCIsImkiLCJpZCIsImhyZWYiLCJ0cmFuc2Zvcm0iLCJQSSIsInNsaWNlQmluZGluZyIsImRhdGEiLCJlbnRlciIsImFyYyIsImlubmVyUmFkaXVzIiwib3V0ZXJSYWRpdXMiLCJzdGFydEFuZ2xlIiwiZW5kQW5nbGUiLCJtYXJrQ29sb3IiLCJwb2ludHMiLCJkYXRhQnlUeXBlIiwicG9pbnQiLCJyIiwieSIsImZpbGxlZCIsImFyY3MiLCJpbnRlcmlvckFyYyIsInJTY2FsZSIsInRoaWNrbmVzcyIsImRpYWdVcCIsImRpYWdvbmFsVXAiLCJkaWFnRG93biIsImRpYWdvbmFsRG93biIsInhNYXJrcyIsIngiLCJ4TWFya0dzIiwiYXJyb3dNYXJrcyIsImFycm93IiwiYXJyb3dNYXJrR3MiLCJtYXJrVHlwZXMiLCJudW1NYXJrcyIsImN1bXVsYXRpdmVTaXplIiwicHJldlR5cGUiLCJsZXQiLCJ0eXBlIiwidmFsaWRUeXBlIiwibGVuZ3RoIiwiaXRlbSIsInNpemUiLCJjZWlsIiwicm91bmQiLCJ5TWlkIiwibmVzdCIsImtleSIsIm9iamVjdCIsInRvcCIsInJpZ2h0IiwiYm90dG9tIiwibGVmdCIsInNjYWxlTGluZWFyIiwiZG9tYWluIiwib24iXSwibWFwcGluZ3MiOiJBQXlIQSxRQUFTQSxtQkF5S1IsUUFBU0MsR0FBUUMsRUFBR0MsRUFBUUMsa0JBQUEscUJBQVcsS0FDckNDLElBQU1DLEdBQUtDLE9BQU9MLEVBQUVDLElBRDJCSyxFQUFBRCxPQUFBTCxFQUFBRSxJQUN2Q0ssR0FBR0MsWUFBaUJKLEdBQUFLLEtBQUFDLEtBQUFDLFdBQUEsR0FDcEJDLEdBQUdKLFlBQWlCRixHQUFBRyxLQUFBQyxJQUFBQyxXQUFBLEVBRTVCUixRQUdFSSxHQUFBQSxFQURGSyxHQUFBQSxFQUNFUixHQUFBQSxFQUNBRSxHQUFBQSxHQU1KLFFBRkNPLEdBQUFDLE1BQUFQLEdBQUFPLEVBQUFQLEdBQUFLLEVBQUFFLEVBQUFGLEdBQUFSLEVBQUFVLEVBQUFWLEdBQUFFLEVBQUFRLEVBQUFSLEVBR0MsT0FBTyxJQUFJQyxFQUFFLElBQUlILEVBQUUsS0FBS1EsRUFBRSxJQUFJTixFQXJMaENILEdBQU1ZLEdBQWNDLEdBQUNDLE9BQU8saUJBRzVCRixHQUFVRyxVQUFVLEtBQUtDLFFBR3pCaEIsSUFBTWlCLEdBQU1MLEVBQVVNLE9BQU8sT0FDMUJDLEtBQUssUUFBU0MsT0FDZEQsS0FBSyxTQUFVRSxRQUdaQyxFQUFRaEIsS0FBS2lCLE1BQXNCLElBQWhCakIsS0FBS2tCLFVBQ3hCQyxFQUFnQyxHQUFoQm5CLEtBQUtrQixTQUFrQixHQUN2Q0UsRUFBK0IsSUFBaEJwQixLQUFLa0IsU0FBbUIsSUFFckNHLEVBQUtkLEdBQUNlLElBQUlOLEVBQU9HLEVBQWNDLEVBQ3ZDYixJQUFHQyxPQUFPLFFB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TThGLEdBQU94RixLQUFLeUYsS0FBcUIsR0FBaEJ6RixLQUFLa0IsVUFBaUIsQ0FDN0NxRSxJQUNFSCxLQUFBQSxFQUNBSSxLQUFBQSxFQUNBUCxlQUFBQSxlQUNBdEYsR0FBSXNGLGVBQWlCTyxFQUNyQkcsS0FBTVYsZUFBa0JPLEVBQUksRUFDNUIzRixHQUFJb0Ysb0JBR05NLElBQVNDLEtBQU0sRUFNakIsT0FIQUQsR0FBS3pDLEdBQUtELEVBQ1ZvQyxnQkFBa0JNLEVBQUtDLEtBRWhCRCxJQUdIM0IsV0FBZXJELEdBQUNxRixPQUFPQyxJQUFJLFNBQUF0RyxHQUFBLE1BQUFBLEdBQUE2RixPQUFFVSxPQUFHM0MsTUFHaENyQyxNQUFRLElBQ1JDLE9BQVMsSUFHVFUsU0FDSnNFLElBQUssR0FDTEMsTUFBTyxHQUNQQyxPQUFRLEdBQ1JDLEtBQU0sSUFJRm5FLGNBQWdCakIsTUFBUVcsUUFBUXlFLEtBQU96RSxRQUFRdUUsTUFDL0NoRSxlQUFpQmpCLE9BQVNVLFFBQVFzRSxJQUFNdEUsUUFBUXdFLE9BR2hEdEQsVUFBYyxHQUNkNUMsWUFBY2lDLGVBQW1CLEVBQ2pDOUIsV0FBZSxFQUFHRixLQUFPaUQsR0FBSU4sVUFHN0IvQyxPQUFXVyxHQUFDNEYsY0FBY0MsUUFBUyxFQUFFbkIsaUJBQWlCdkMsT0FBTzNDLFlBQWUsSUFDNUVvRSxPQUFXNUQsR0FBQzRGLGNBQWNDLFFBQVMsRUFBRW5CLGlCQUFpQnZDLE9BQVEsRUFBRTNDLGNBRWhFc0QsSUFBUTlDLEdBQUM4QyxLQWtQZmhFLG1CQUVBa0IsR0FBR0MsT0FQTSxpQkFBTzZGLEdBQUEsUUFBR2hIIiwiZmlsZSI6InNjcmlwdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIG1hcmsgdHlwZXNcbi8vIGNvbnN0IG1hcmtUeXBlcyA9IFsnZGlhZ29uYWxVcCcsICdkaWFnb25hbERvd24nLCAneCcsICdhcmMnLCAncG9pbnQnXTsgLy8gJ3NxdWFyZSddO1xuY29uc3QgbWFya1R5cGVzID0gWyd4JywgJ2Fycm93JywgJ2FyYycsICdwb2ludCddOyAvLyAnc3F1YXJlJ107XG5jb25zdCBhbmltYXRlID0gdHJ1ZTtcbmNvbnN0IG51bU1hcmtzID0gMzA7XG5cbi8vIGdlbmVyYXRlIHJhbmRvbSBkYXRhXG5sZXQgY3VtdWxhdGl2ZVNpemUgPSAwO1xubGV0IHByZXZUeXBlO1xuY29uc3QgZGF0YSA9IGQzLnJhbmdlKG51bU1hcmtzKS5tYXAoKGQsIGkpID0+IHtcbiAgbGV0IHR5cGU7XG4gIGxldCB2YWxpZFR5cGU7XG4gIGRvIHtcbiAgICB2YWxpZFR5cGUgPSB0cnVlO1xuICAgIHR5cGUgPSBtYXJrVHlwZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbWFya1R5cGVzLmxlbmd0aCldO1xuXG4gICAgaWYgKGkgPiA1ICYmIHR5cGUgPT09ICdhcnJvdycpIHtcbiAgICAgIHZhbGlkVHlwZSA9IGZhbHNlO1xuICAgIH1cbiAgfSB3aGlsZSAoIXZhbGlkVHlwZSk7XG5cbiAgLy8gdHlwZSA9ICdhcnJvdyc7XG4gIHByZXZUeXBlID0gdHlwZTtcblxuICBsZXQgaXRlbTtcblxuICBpZiAodHlwZSA9PT0gJ3BvaW50Jykge1xuICAgIGNvbnN0IHNpemUgPSBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSAqIDIwKSArIDEwO1xuICAgIGl0ZW0gPSB7XG4gICAgICB0eXBlLFxuICAgICAgcjogc2l6ZSAvIDUsXG4gICAgICBzaXplLFxuICAgICAgY3VtdWxhdGl2ZVNpemUsXG4gICAgICB5OiBjdW11bGF0aXZlU2l6ZSArIChzaXplIC8gMiksXG4gICAgICBmaWxsZWQ6IE1hdGgucmFuZG9tKCkgPiAwLjMsXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnYXJjJykge1xuICAgIGNvbnN0IHNpemUgPSBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSAqIDIwKSArIDI7XG4gICAgaXRlbSA9IHtcbiAgICAgIHR5cGUsXG4gICAgICB0aGlja25lc3M6IE1hdGgucm91bmQoc2l6ZSAvIDQpLFxuICAgICAgc2l6ZSxcbiAgICAgIGN1bXVsYXRpdmVTaXplLFxuICAgICAgeTogY3VtdWxhdGl2ZVNpemUgKyAoc2l6ZSAvIDIpLFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RpYWdvbmFsVXAnKSB7XG4gICAgY29uc3Qgc2l6ZSA9IE1hdGguY2VpbChNYXRoLnJhbmRvbSgpICogMTApICsgMztcbiAgICBpdGVtID0ge1xuICAgICAgdHlwZSxcbiAgICAgIHNpemUsXG4gICAgICBjdW11bGF0aXZlU2l6ZSxcbiAgICAgIHkxOiBjdW11bGF0aXZlU2l6ZSxcbiAgICAgIHkyOiBjdW11bGF0aXZlU2l6ZSArIHNpemUsXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnZGlhZ29uYWxEb3duJykge1xuICAgIGNvbnN0IHNpemUgPSBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSAqIDEwKSArIDM7XG4gICAgaXRlbSA9IHtcbiAgICAgIHR5cGUsXG4gICAgICBzaXplLFxuICAgICAgY3VtdWxhdGl2ZVNpemUsXG4gICAgICB5MTogY3VtdWxhdGl2ZVNpemUgKyBzaXplLFxuICAgICAgeTI6IGN1bXVsYXRpdmVTaXplLFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3gnKSB7XG4gICAgY29uc3Qgc2l6ZSA9IE1hdGguY2VpbChNYXRoLnJhbmRvbSgpICogMTApICsgMztcbiAgICBpdGVtID0ge1xuICAgICAgdHlwZSxcbiAgICAgIHNpemUsXG4gICAgICBjdW11bGF0aXZlU2l6ZSxcbiAgICAgIHkxOiBjdW11bGF0aXZlU2l6ZSArIHNpemUsXG4gICAgICB5MjogY3VtdWxhdGl2ZVNpemUsXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnYXJyb3cnKSB7XG4gICAgY29uc3Qgc2l6ZSA9IE1hdGguY2VpbChNYXRoLnJhbmRvbSgpICogMTApICsgMztcbiAgICBpdGVtID0ge1xuICAgICAgdHlwZSxcbiAgICAgIHNpemUsXG4gICAgICBjdW11bGF0aXZlU2l6ZSxcbiAgICAgIHkxOiBjdW11bGF0aXZlU2l6ZSArIHNpemUsXG4gICAgICB5TWlkOiBjdW11bGF0aXZlU2l6ZSArIChzaXplIC8gMiksXG4gICAgICB5MjogY3VtdWxhdGl2ZVNpemUsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBpdGVtID0geyBzaXplOiAwIH07XG4gIH1cblxuICBpdGVtLmlkID0gaTtcbiAgY3VtdWxhdGl2ZVNpemUgKz0gaXRlbS5zaXplO1xuXG4gIHJldHVybiBpdGVtO1xufSk7XG5cbmNvbnN0IGRhdGFCeVR5cGUgPSBkMy5uZXN0KCkua2V5KGQgPT4gZC50eXBlKS5vYmplY3QoZGF0YSk7XG5cbi8vIG91dGVyIHN2ZyBkaW1lbnNpb25zXG5jb25zdCB3aWR0aCA9IDYwMDtcbmNvbnN0IGhlaWdodCA9IDYwMDtcblxuLy8gcGFkZGluZyBhcm91bmQgdGhlIGNoYXJ0XG5jb25zdCBwYWRkaW5nID0ge1xuICB0b3A6IDIwLFxuICByaWdodDogMjAsXG4gIGJvdHRvbTogMjAsXG4gIGxlZnQ6IDIwLFxufTtcblxuLy8gaW5uZXIgY2hhcnQgZGltZW5zaW9ucywgd2hlcmUgdGhlIGRvdHMgYXJlIHBsb3R0ZWRcbmNvbnN0IHBsb3RBcmVhV2lkdGggPSB3aWR0aCAtIHBhZGRpbmcubGVmdCAtIHBhZGRpbmcucmlnaHQ7XG5jb25zdCBwbG90QXJlYUhlaWdodCA9IGhlaWdodCAtIHBhZGRpbmcudG9wIC0gcGFkZGluZy5ib3R0b207XG5cbi8vIHNpemUgb2YgYW4gaW5kaXZpZHVhbCBzbGljZVxuY29uc3QgbnVtU2xpY2VzID0gMzI7XG5jb25zdCBzbGljZUhlaWdodCA9IHBsb3RBcmVhSGVpZ2h0IC8gMjtcbmNvbnN0IHNsaWNlQW5nbGUgPSAoMiAqIE1hdGguUEkpIC8gbnVtU2xpY2VzO1xuXG4vLyBpbml0aWFsaXplIHNjYWxlc1xuY29uc3QgeVNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsIGN1bXVsYXRpdmVTaXplXSkucmFuZ2UoW3NsaWNlSGVpZ2h0LCAwXSk7XG5jb25zdCByU2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCwgY3VtdWxhdGl2ZVNpemVdKS5yYW5nZShbMCwgc2xpY2VIZWlnaHRdKTtcblxuY29uc3QgYXJjID0gZDMuYXJjKCk7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFuZGFsYSgpIHtcblxuXHQvLyBzZWxlY3QgdGhlIHJvb3QgY29udGFpbmVyIHdoZXJlIHRoZSBjaGFydCB3aWxsIGJlIGFkZGVkXG5cdGNvbnN0IGNvbnRhaW5lciA9IGQzLnNlbGVjdCgnI3Zpcy1jb250YWluZXInKTtcblxuXHQvLyBjbGVhciBhbnkgb2xkIGNvbnRlbnRzXG5cdGNvbnRhaW5lci5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKTtcblxuXHQvLyBpbml0aWFsaXplIG1haW4gU1ZHXG5cdGNvbnN0IHN2ZyA9IGNvbnRhaW5lci5hcHBlbmQoJ3N2ZycpXG5cdCAgLmF0dHIoJ3dpZHRoJywgd2lkdGgpXG5cdCAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCk7XG5cblxuXHRjb25zdCBiZ0h1ZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDM2MCk7XG5cdGNvbnN0IGJnU2F0dXJhdGlvbiA9IChNYXRoLnJhbmRvbSgpICogMC4zKSArIDAuNztcblx0Y29uc3QgYmdMaWdodG5lc3MgPSAoTWF0aC5yYW5kb20oKSAqIDAuMTUpICsgMC4wNTtcblxuXHRjb25zdCBiZyA9IGQzLmhzbChiZ0h1ZSwgYmdTYXR1cmF0aW9uLCBiZ0xpZ2h0bmVzcyk7XG5cdGQzLnNlbGVjdCgnYm9keScpLnN0eWxlKCdiYWNrZ3JvdW5kJyk7XG5cblx0Ly8gZHJhdyB0aGUgYmFja2dyb3VuZFxuXHRzdmcuYXBwZW5kKCdyZWN0Jylcblx0ICAuYXR0cignY2xhc3MnLCAnbWFuZGFsYS1iZycpXG5cdCAgLmF0dHIoJ3dpZHRoJywgd2lkdGgpXG5cdCAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodClcblx0ICAuc3R5bGUoJ2ZpbGwnLCBiZyk7XG5cblx0Ly8gdGhlIG1haW4gPGc+IHdoZXJlIGFsbCB0aGUgY2hhcnQgY29udGVudCBnb2VzIGluc2lkZVxuXHRjb25zdCBnID0gc3ZnLmFwcGVuZCgnZycpXG5cdCAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHtwYWRkaW5nLmxlZnR9ICR7cGFkZGluZy50b3B9KWApO1xuXG5cdGlmIChhbmltYXRlKSB7XG5cdCAgZy50cmFuc2l0aW9uKClcblx0ICAgIC5kdXJhdGlvbigyNTAwKVxuXHQgICAgLmF0dHJUd2VlbigndHJhbnNmb3JtJywgKCkgPT5cblx0ICAgICAgZDMuaW50ZXJwb2xhdGVTdHJpbmcoYHRyYW5zbGF0ZSgke3BhZGRpbmcubGVmdH0gJHtwYWRkaW5nLnRvcH0pIHJvdGF0ZSgwICR7cGxvdEFyZWFXaWR0aCAvIDJ9ICR7cGxvdEFyZWFIZWlnaHQgLyAyfSlgLFxuXHQgICAgICAgIGB0cmFuc2xhdGUoJHtwYWRkaW5nLmxlZnR9ICR7cGFkZGluZy50b3B9KSByb3RhdGUoMzYwICR7cGxvdEFyZWFXaWR0aCAvIDJ9ICR7cGxvdEFyZWFIZWlnaHQgLyAyfSlgKSk7XG5cdH1cblxuXG5cdGNvbnN0IGRlZnMgPSBnLmFwcGVuZCgnZGVmcycpO1xuXG5cdC8vIGNsaXAgcGF0aCBmb3Igc2xpY2VzIGRpc2FibGVkIHRvIGFsbG93IHNvbWUgc2xpZ2h0IG92ZXJsYXAgZm9yIHRoaW5ncyBsaWtlIGFyY3Ncblx0Ly8gYWRkIHRoZSBzbGljZSBhcyBhIGNsaXAgcGF0aFxuXHQvLyBkZWZzLmFwcGVuZCgnY2xpcFBhdGgnKVxuXHQvLyAgIC5hdHRyKCdpZCcsICdzbGljZS1jbGlwJylcblx0Ly8gICAuYXBwZW5kKCdwYXRoJylcblx0Ly8gICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwICR7c2xpY2VIZWlnaHR9KWApXG5cdC8vICAgLmF0dHIoJ2QnLCBhcmMoe1xuXHQvLyAgICAgaW5uZXJSYWRpdXM6IDAsXG5cdC8vICAgICBvdXRlclJhZGl1czogc2xpY2VIZWlnaHQsXG5cdC8vICAgICBzdGFydEFuZ2xlOiAtKHNsaWNlQW5nbGUgLyAyKSxcblx0Ly8gICAgIGVuZEFuZ2xlOiBzbGljZUFuZ2xlIC8gMixcblx0Ly8gICB9KSlcblx0Ly8gICAuc3R5bGUoJ2ZpbGwnLCAndG9tYXRvJylcblx0Ly8gICAuc3R5bGUoJ3N0cm9rZScsICd0b21hdG8nKVxuXHQvLyAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgNSk7XG5cblx0Ly8gcmFkaWFsIGdyYWRpZW50IGZvciBiYWNrZ3JvdW5kXG5cdGNvbnN0IG1hbmRhbGFCZ0dyYWQgPSBkZWZzLmFwcGVuZCgncmFkaWFsR3JhZGllbnQnKVxuXHQgIC5hdHRyKCdpZCcsICdiZy1zaGFkaW5nJylcblx0ICAuYXR0cignZ3JhZGllbnRVbml0cycsICd1c2VyU3BhY2VPblVzZScpO1xuXG5cdG1hbmRhbGFCZ0dyYWQuYXBwZW5kKCdzdG9wJylcblx0ICAuYXR0cignb2Zmc2V0JywgJzAlJylcblx0ICAuYXR0cignc3RvcC1jb2xvcicsICcjMDAwJylcblx0ICAuYXR0cignc3RvcC1vcGFjaXR5JywgMC4wKTtcblxuXHRtYW5kYWxhQmdHcmFkLmFwcGVuZCgnc3RvcCcpXG5cdCAgLmF0dHIoJ29mZnNldCcsICcxMDAlJylcblx0ICAuYXR0cignc3RvcC1jb2xvcicsICcjMDAwJylcblx0ICAuYXR0cignc3RvcC1vcGFjaXR5JywgMC4yKTtcblxuXHRzdmcuaW5zZXJ0KCdyZWN0JywgJ2cnKVxuXHQgIC5hdHRyKCdjbGFzcycsICdtYW5kYWxhLWJnLXNoYWRpbmcnKVxuXHQgIC5hdHRyKCd3aWR0aCcsIHdpZHRoKVxuXHQgIC5hdHRyKCdoZWlnaHQnLCBoZWlnaHQpXG5cdCAgLnN0eWxlKCdmaWxsJywgJ3VybCgjYmctc2hhZGluZyknKTtcblxuXHQvLyBhZGQgaW4gYSBiaWcgY2xpcCBmb3IgYWxsIHRoZSBtYXJrc1xuXHRjb25zdCBtYXJrc0NsaXAgPSBkZWZzLmFwcGVuZCgnY2xpcFBhdGgnKVxuXHQgIC5hdHRyKCdpZCcsICdtYXJrcy1jbGlwJylcblx0ICAuYXBwZW5kKCdjaXJjbGUnKVxuXHQgIC5hdHRyKCdjeCcsIHBsb3RBcmVhV2lkdGggLyAyKVxuXHQgIC5hdHRyKCdjeScsIHBsb3RBcmVhSGVpZ2h0IC8gMilcblx0ICAuYXR0cigncicsIDApXG5cdCAgLnN0eWxlKCdmaWxsJywgJyNmZmYnKTtcblxuXHRpZiAoYW5pbWF0ZSkge1xuXHQgIG1hcmtzQ2xpcC50cmFuc2l0aW9uKClcblx0ICAgIC5lYXNlKGQzLmVhc2VMaW5lYXIpXG5cdCAgICAuZHVyYXRpb24oMjAwMClcblx0ICAgIC5hdHRyKCdyJywgKHBsb3RBcmVhSGVpZ2h0IC8gMikgKyA1KTtcblx0fSBlbHNlIHtcblx0ICBtYXJrc0NsaXBcblx0ICAgIC5hdHRyKCdyJywgKHBsb3RBcmVhSGVpZ2h0IC8gMikgKyA1KTtcblx0fVxuXG5cdGNvbnN0IGdTbGljZXMgPSBnLmFwcGVuZCgnZycpXG5cdCAgLmF0dHIoJ2NsYXNzJywgJ3NsaWNlcy1ncm91cCcpXG5cdCAgLmF0dHIoJ2NsaXAtcGF0aCcsICd1cmwoI21hcmtzLWNsaXApJyk7XG5cblx0Ly8gY3JlYXRlIHRoZSBncm91cCB0byBiZSByZXBlYXRlZFxuXHRjb25zdCBzbGljZSA9IGdTbGljZXMuYXBwZW5kKCdnJylcblx0ICAuYXR0cignaWQnLCAncmVmLXNsaWNlJylcblx0ICAuYXR0cignY2xhc3MnLCAnc2xpY2UnKVxuXHQgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7cGxvdEFyZWFXaWR0aCAvIDJ9IDApYClcblx0ICAuYXR0cignY2xpcC1wYXRoJywgJ3VybCgjc2xpY2UtY2xpcCknKTtcblxuXHQvLyBhZGQgaW4gY29waWVzIG9mIHRoaXMgc2xpY2Vcblx0Y29uc3QgY29weVNsaWNlcyA9IGQzLnJhbmdlKG51bVNsaWNlcyAtIDEpLm1hcCgoZCwgaSkgPT4gKHtcblx0ICBpZDogaSArIDEsXG5cdCAgaHJlZjogJyNyZWYtc2xpY2UnLFxuXHQgIHRyYW5zZm9ybTogYHJvdGF0ZSgkeyhpICsgMSkgKiBzbGljZUFuZ2xlICogKDE4MCAvIE1hdGguUEkpfSAke3Bsb3RBcmVhV2lkdGggLyAyfSAke3NsaWNlSGVpZ2h0fSlgLFxuXHR9KSk7XG5cblx0Y29uc3Qgc2xpY2VCaW5kaW5nID0gZ1NsaWNlcy5zZWxlY3RBbGwoJ2NvcHktc2xpY2UnKS5kYXRhKGNvcHlTbGljZXMpO1xuXHRzbGljZUJpbmRpbmcuZW50ZXIoKS5hcHBlbmQoJ3VzZScpXG5cdCAgLmF0dHIoJ3hsaW5rOmhyZWYnLCBkID0+IGQuaHJlZilcblx0ICAuYXR0cigndHJhbnNmb3JtJywgZCA9PiBkLnRyYW5zZm9ybSk7XG5cblx0Ly8gYnVpbGQgdXAgdGhlIHNsaWNlXG5cdHNsaWNlLmFwcGVuZCgncGF0aCcpXG5cdCAgLmF0dHIoJ2NsYXNzJywgJ3NsaWNlLWJnJylcblx0ICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwICR7c2xpY2VIZWlnaHR9KWApXG5cdCAgLmF0dHIoJ2QnLCBhcmMoe1xuXHQgICAgaW5uZXJSYWRpdXM6IDAsXG5cdCAgICBvdXRlclJhZGl1czogc2xpY2VIZWlnaHQsXG5cdCAgICBzdGFydEFuZ2xlOiAtKHNsaWNlQW5nbGUgLyAyKSxcblx0ICAgIGVuZEFuZ2xlOiBzbGljZUFuZ2xlIC8gMixcblx0ICB9KSlcblx0ICAuc3R5bGUoJ2ZpbGwnLCAnbm9uZScpXG5cdCAgLnN0eWxlKCdzdHJva2UnLCAndG9tYXRvJylcblx0ICAuc3R5bGUoJ29wYWNpdHknLCAwLjApO1xuXG5cdGNvbnN0IG1hcmtDb2xvciA9ICcjZmZmJztcblxuXHQvLyBhZGQgcG9pbnRzIHRvIHRoZSBzbGljZVxuXHRjb25zdCBwb2ludHMgPSBzbGljZS5zZWxlY3RBbGwoJy5wb2ludCcpLmRhdGEoZGF0YUJ5VHlwZS5wb2ludCB8fCBbXSk7XG5cblx0cG9pbnRzLmVudGVyKClcblx0ICAuYXBwZW5kKCdjaXJjbGUnKVxuXHQgIC5hdHRyKCdjbGFzcycsICdwb2ludCcpXG5cdCAgLmF0dHIoJ3InLCBkID0+IGQucilcblx0ICAuYXR0cignY3gnLCAwKVxuXHQgIC5hdHRyKCdjeScsIGQgPT4geVNjYWxlKGQueSkpXG5cdCAgLnN0eWxlKCdmaWxsJywgZCA9PiAoZC5maWxsZWQgPyBtYXJrQ29sb3IgOiAnbm9uZScpKVxuXHQgIC5zdHlsZSgnc3Ryb2tlJywgZCA9PiAoZC5maWxsZWQgPyAnbm9uZScgOiBtYXJrQ29sb3IpKTtcblxuXHQvLyBhZGQgYXJjc1xuXHRjb25zdCBhcmNzID0gc2xpY2Uuc2VsZWN0QWxsKCcuYXJjJykuZGF0YShkYXRhQnlUeXBlLmFyYyB8fCBbXSk7XG5cblx0Y29uc3QgaW50ZXJpb3JBcmMgPSBkMy5hcmMoKVxuXHQgIC5pbm5lclJhZGl1cyhkID0+IHJTY2FsZShkLnkgLSBkLnRoaWNrbmVzcykpXG5cdCAgLm91dGVyUmFkaXVzKGQgPT4gclNjYWxlKGQueSkpXG5cdCAgLnN0YXJ0QW5nbGUoKC1zbGljZUFuZ2xlIC8gMikgLSAwLjEpIC8vIHNsaWdodCBwYWRkaW5nIHRvIGVuc3VyZSBvdmVybGFwXG5cdCAgLmVuZEFuZ2xlKChzbGljZUFuZ2xlIC8gMikgKyAwLjEpO1xuXG5cdGFyY3MuZW50ZXIoKVxuXHQgIC5hcHBlbmQoJ3BhdGgnKVxuXHQgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAgJHtzbGljZUhlaWdodH0pYClcblx0ICAuYXR0cignY2xhc3MnLCAnYXJjJylcblx0ICAuYXR0cignZCcsIGludGVyaW9yQXJjKVxuXHQgIC5zdHlsZSgnZmlsbCcsIG1hcmtDb2xvcik7XG5cblx0Ly8gYWRkIGRpYWdvbmFsIGxpbmUgdXBcblx0Y29uc3QgZGlhZ1VwID0gc2xpY2Uuc2VsZWN0QWxsKCcuZGlhZ29uYWxVcCcpLmRhdGEoZGF0YUJ5VHlwZS5kaWFnb25hbFVwIHx8IFtdKTtcblxuXHRmdW5jdGlvbiBkVG9MaW5lKGQsIHkxS2V5ID0gJ3kxJywgeTJLZXkgPSAneTInKSB7XG5cdCAgY29uc3QgeTEgPSB5U2NhbGUoZFt5MUtleV0pO1xuXHQgIGNvbnN0IHkyID0geVNjYWxlKGRbeTJLZXldKTtcblx0ICBjb25zdCB4MSA9IChzbGljZUhlaWdodCAtIHkxKSAqIE1hdGgudGFuKC1zbGljZUFuZ2xlIC8gMik7XG5cdCAgY29uc3QgeDIgPSAoc2xpY2VIZWlnaHQgLSB5MikgKiBNYXRoLnRhbihzbGljZUFuZ2xlIC8gMik7XG5cblx0ICByZXR1cm4ge1xuXHQgICAgeDEsXG5cdCAgICB4Mixcblx0ICAgIHkxLFxuXHQgICAgeTIsXG5cdCAgfTtcblx0fVxuXG5cdGZ1bmN0aW9uIHRvUGF0aCh7IHgxLCB4MiwgeTEsIHkyIH0pIHtcblx0ICByZXR1cm4gYE0ke3gxfSwke3kxfSBMJHt4Mn0sJHt5Mn1gO1xuXHR9XG5cblx0ZGlhZ1VwLmVudGVyKClcblx0ICAuYXBwZW5kKCdwYXRoJylcblx0ICAuYXR0cignY2xhc3MnLCAnZGlhZ29uYWxVcCcpXG5cdCAgLmF0dHIoJ2QnLCBkID0+IHRvUGF0aChkVG9MaW5lKGQpKSlcblx0ICAuc3R5bGUoJ3N0cm9rZScsIG1hcmtDb2xvcilcblx0ICAuc3R5bGUoJ2ZpbGwnLCBtYXJrQ29sb3IpO1xuXG5cdC8vIGFkZCBkaWFnb25hbCBkb3duXG5cdGNvbnN0IGRpYWdEb3duID0gc2xpY2Uuc2VsZWN0QWxsKCcuZGlhZ29uYWxEb3duJykuZGF0YShkYXRhQnlUeXBlLmRpYWdvbmFsRG93biB8fCBbXSk7XG5cblx0ZGlhZ0Rvd24uZW50ZXIoKVxuXHQgIC5hcHBlbmQoJ3BhdGgnKVxuXHQgIC5hdHRyKCdjbGFzcycsICdkaWFnb25hbERvd24nKVxuXHQgIC5hdHRyKCdkJywgZCA9PiB0b1BhdGgoZFRvTGluZShkKSkpXG5cdCAgLnN0eWxlKCdzdHJva2UnLCBtYXJrQ29sb3IpXG5cdCAgLnN0eWxlKCdmaWxsJywgbWFya0NvbG9yKTtcblxuXG5cdC8vIGFkZCBYIG1hcmtzXG5cdGNvbnN0IHhNYXJrcyA9IHNsaWNlLnNlbGVjdEFsbCgnLngnKS5kYXRhKGRhdGFCeVR5cGUueCB8fCBbXSk7XG5cblx0Y29uc3QgeE1hcmtHcyA9IHhNYXJrcy5lbnRlcigpXG5cdCAgLmFwcGVuZCgnZycpXG5cdCAgLmF0dHIoJ2NsYXNzJywgJ3gnKTtcblxuXHR4TWFya0dzLmFwcGVuZCgncGF0aCcpXG5cdCAgLmF0dHIoJ2QnLCBkID0+IHRvUGF0aChkVG9MaW5lKGQpKSlcblx0ICAuc3R5bGUoJ3N0cm9rZScsIG1hcmtDb2xvcilcblx0ICAuc3R5bGUoJ2ZpbGwnLCBtYXJrQ29sb3IpO1xuXG5cdHhNYXJrR3MuYXBwZW5kKCdwYXRoJylcblx0ICAuYXR0cignZCcsIGQgPT4gdG9QYXRoKGRUb0xpbmUoZCwgJ3kyJywgJ3kxJykpKVxuXHQgIC5zdHlsZSgnc3Ryb2tlJywgbWFya0NvbG9yKVxuXHQgIC5zdHlsZSgnZmlsbCcsIG1hcmtDb2xvcik7XG5cblx0Ly8gYWRkIFggbWFya3Ncblx0Y29uc3QgYXJyb3dNYXJrcyA9IHNsaWNlLnNlbGVjdEFsbCgnLmFycm93JykuZGF0YShkYXRhQnlUeXBlLmFycm93IHx8IFtdKTtcblxuXHRjb25zdCBhcnJvd01hcmtHcyA9IGFycm93TWFya3MuZW50ZXIoKVxuXHQgIC5hcHBlbmQoJ2cnKVxuXHQgIC5hdHRyKCdjbGFzcycsICdhcnJvdycpO1xuXG5cdGFycm93TWFya0dzLmFwcGVuZCgncGF0aCcpXG5cdCAgLmF0dHIoJ2QnLCBkID0+IHRvUGF0aChkVG9MaW5lKGQsICd5MScsICd5TWlkJykpKVxuXHQgIC5zdHlsZSgnc3Ryb2tlJywgbWFya0NvbG9yKVxuXHQgIC5zdHlsZSgnZmlsbCcsIG1hcmtDb2xvcik7XG5cblx0YXJyb3dNYXJrR3MuYXBwZW5kKCdwYXRoJylcblx0ICAuYXR0cignZCcsIGQgPT4gdG9QYXRoKGRUb0xpbmUoZCwgJ3kyJywgJ3lNaWQnKSkpXG5cdCAgLnN0eWxlKCdzdHJva2UnLCBtYXJrQ29sb3IpXG5cdCAgLnN0eWxlKCdmaWxsJywgbWFya0NvbG9yKTtcbn1cblxuZ2VuZXJhdGVNYW5kYWxhKCk7XG5cbmQzLnNlbGVjdCgnI21ha2UtbWFuZGFsYScpLm9uKCdjbGljaycsIGdlbmVyYXRlTWFuZGFsYSk7XG5cbiJdfQ==