CVE-2022-1379 (published 2022-05-14T10:15Z)

URL Restriction Bypass in GitHub repository plantuml/plantuml prior to V1.2022.5. An attacker can abuse this to bypass URL restrictions that are imposed by the different security profiles and achieve server side request forgery (SSRF). This allows accessing restricted internal resources/servers or sending requests to third party servers.

Severity: MEDIUM
CVSS v2 base score: 6.4 (AV:N/AC:L/Au:N/C:P/I:P/A:N)
CVSS v3 base score: 9.1, CRITICAL (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N)

Weakness information:
cwe_id: CWE-918
cwe_name: Server-Side Request Forgery (SSRF)
description: The web server receives a URL or similar request from an upstream component and retrieves the contents of this URL, but it does not sufficiently ensure that the request is being sent to the expected destination.
extended_description: By providing URLs to unexpected hosts or ports, attackers can make it appear that the server is sending the request, possibly bypassing access controls such as firewalls that prevent the attackers from accessing the URLs directly. The server can be used as a proxy to conduct port scanning of hosts in internal networks, use other URLs such as that can access documents on the system (using file://), or use other protocols such as gopher:// or tftp://, which may provide greater control over the contents of requests.
         

Fix information:
repo_url: https://github.com/plantuml/plantuml
commit_details: repo_url: https://github.com/plantuml/plantuml
author: Arnaud Roques
author_date: 2022-05-04 19:52:00+02:00
msg: Import version 1.2022.5
repository: repo_url: https://github.com/plantuml/plantuml
repo_name: plantuml/plantuml
description: Generate diagrams from textual description
repo_language: Java
owner: plantuml
file_changes: filename: build.xml
change_type: ModificationType.MODIFY
diff: @@ -20,7 +20,7 @@
 	<target name="compile">
 		<delete dir="build" />
 		<mkdir dir="build" />
-		<javac target="1.7" source="1.7" srcdir="src" destdir="build" debug="on" />
+		<javac target="1.8" source="1.8" srcdir="src" destdir="build" debug="on" />
 		<copy file="src/net/sourceforge/plantuml/version/logo.png"
 			todir="build/net/sourceforge/plantuml/version" />
 		<copy file="src/net/sourceforge/plantuml/version/favicon.png"

programming_language: Shell
filename: plantuml.skin
change_type: ModificationType.MODIFY
diff: @@ -423,7 +423,7 @@ timingDiagram {
 	  FontSize 12
 	  LineColor darkgreen
 	  BackgroundColor: var(--grey-blue);
-      LineThickness 2
+      LineThickness 1.5
 	}
 	robust {
 	  FontStyle plain

programming_language: Go
filename: rose.skin
change_type: ModificationType.MODIFY
diff: @@ -136,6 +136,14 @@ group {
     BackGroundColor transparent
 }
 
+componentDiagram {
+  node, rectangle {
+    LineColor black
+    LineThickness 1.5
+  }
+}
+
+
 sequenceDiagram {
   group {
     LineColor black
@@ -494,6 +502,7 @@ timingDiagram {
 	  FontSize 12
 	  LineColor darkgreen
 	  BackgroundColor #c
+      LineThickness 1.5
 	}
 	robust {
 	  FontStyle plain

programming_language: C#
filename: SkinParam.java
change_type: ModificationType.MODIFY
diff: @@ -217,7 +217,7 @@ public class SkinParam implements ISkinParam {
 
 	List<String> cleanForKeySlow(String key) {
 		key = StringUtils.trin(StringUtils.goLowerCase(key));
-		key = key.replaceAll("_|\\.|\\s", "");
+		key = key.replaceAll("_|\\.", "");
 		// key = replaceSmart(key, "partition", "package");
 		key = replaceSmart(key, "sequenceparticipant", "participant");
 		key = replaceSmart(key, "sequenceactor", "actor");

programming_language: Java
filename: CucaDiagramFileMakerElk.java
change_type: ModificationType.MODIFY
diff: @@ -258,7 +258,7 @@ public class CucaDiagramFileMakerElk implements CucaDiagramFileMaker {
 			final Style style = Cluster.getDefaultStyleDefinition(umlDiagramType.getStyleName(), group.getUSymbol())
 					.getMergedStyle(skinParam.getCurrentStyleBuilder());
 			final double shadowing = style.value(PName.Shadowing).asDouble();
-			final UStroke stroke = Cluster.getStrokeInternal(group, skinParam, style);
+			final UStroke stroke = Cluster.getStrokeInternal(group, style);
 
 			HColor backColor = getBackColor(umlDiagramType);
 			backColor = Cluster.getBackColor(backColor, skinParam, group.getStereotype(), umlDiagramType.getStyleName(),

programming_language: Java
filename: SURL.java
change_type: ModificationType.MODIFY
diff: @@ -110,7 +110,7 @@ public class SURL {
 	/**
 	 * Regex to remove the UserInfo part from a URL.
 	 */
-	private static final Pattern PATTERN_USERINFO = Pattern.compile("(^https?://)([-_:0-9a-zA-Z]+@)([^@]*)");
+	private static final Pattern PATTERN_USERINFO = Pattern.compile("(^https?://)([-_0-9a-zA-Z]+@)([^@]*)");
 
 	private static final ExecutorService EXE = Executors.newCachedThreadPool(new ThreadFactory() {
 		public Thread newThread(Runnable r) {

programming_language: Java
filename: CommandStyleMultilinesCSS.java
change_type: ModificationType.MODIFY
diff: @@ -37,7 +37,6 @@ package net.sourceforge.plantuml.style;
 
 import net.sourceforge.plantuml.SkinParam;
 import net.sourceforge.plantuml.TitledDiagram;
-import net.sourceforge.plantuml.UseStyle;
 import net.sourceforge.plantuml.command.BlocLines;
 import net.sourceforge.plantuml.command.CommandExecutionResult;
 import net.sourceforge.plantuml.command.CommandMultilines2;

programming_language: Java
filename: Context.java
change_type: ModificationType.MODIFY
diff: @@ -83,7 +83,7 @@ class Context {
 			final List<StyleSignatureBasic> tmp = new ArrayList<>();
 			for (StyleSignatureBasic ss : results)
 				for (String name : names)
-					tmp.add(ss.add(name));
+					tmp.add(ss.add(name.trim()));
 			results = tmp;
 		}
 

programming_language: Java
filename: FromSkinparamToStyle.java
change_type: ModificationType.MODIFY
diff: @@ -210,6 +210,14 @@ public class FromSkinparamToStyle {
 		addMagic(SName.usecase);
 		addMagic(SName.map);
 		addMagic(SName.archimate);
+		
+		
+//		addConvert("nodeStereotypeFontSize", PName.FontSize, SName.node, SName.stereotype);
+//		addConvert("sequenceStereotypeFontSize", PName.FontSize, SName.stereotype);
+//		addConvert("sequenceStereotypeFontStyle", PName.FontStyle, SName.stereotype);
+//		addConvert("sequenceStereotypeFontColor", PName.FontColor, SName.stereotype);
+//		addConvert("sequenceStereotypeFontName", PName.FontName, SName.stereotype);
+
 
 	}
 
@@ -221,8 +229,14 @@ public class FromSkinparamToStyle {
 		addConvert(cleanName + "RoundCorner", PName.RoundCorner, sname);
 		addConvert(cleanName + "DiagonalCorner", PName.DiagonalCorner, sname);
 		addConvert(cleanName + "BorderStyle", PName.LineStyle, sname);
-		addConvert(cleanName + "StereotypeFontColor", PName.FontColor, SName.stereotype, sname);
 		addConFont(cleanName, sname);
+		addConvert(cleanName + "Shadowing", PName.Shadowing, sname);
+		
+		addConvert(cleanName + "StereotypeFontSize", PName.FontSize, SName.stereotype, sname);
+		addConvert(cleanName + "StereotypeFontStyle", PName.FontStyle, SName.stereotype, sname);
+		addConvert(cleanName + "StereotypeFontColor", PName.FontColor, SName.stereotype, sname);
+		addConvert(cleanName + "StereotypeFontName", PName.FontName, SName.stereotype, sname);
+
 	}
 
 	private final List<Style> styles = new ArrayList<>();
@@ -234,7 +248,7 @@ public class FromSkinparamToStyle {
 		if (key.contains("<<")) {
 			final StringTokenizer st = new StringTokenizer(key, "<>");
 			this.key = st.nextToken();
-			this.stereo = st.hasMoreTokens() ? st.nextToken() : null;
+			this.stereo = st.hasMoreTokens() ? st.nextToken().trim() : null;
 		} else {
 			this.key = key;
 			this.stereo = null;
@@ -243,6 +257,12 @@ public class FromSkinparamToStyle {
 	}
 
 	public void convertNow(String value, final AutomaticCounter counter) {
+		if (key.endsWith("shadowing")) {
+			if (value.equalsIgnoreCase("false"))
+				value = "0";
+			else if (value.equalsIgnoreCase("true"))
+				value = "3";
+		}
 		if (value.equalsIgnoreCase("right:right"))
 			value = "right";
 		if (value.equalsIgnoreCase("dotted"))

programming_language: Java
filename: StyleLoader.java
change_type: ModificationType.MODIFY
diff: @@ -164,7 +164,7 @@ public class StyleLoader {
 
 			final Matcher2 mKeyNames = keyName.matcher(trimmed);
 			if (mKeyNames.find()) {
-				String names = mKeyNames.group(1).replace(" ", "");
+				String names = mKeyNames.group(1);
 				final boolean isRecurse = mKeyNames.group(2) != null;
 				if (isRecurse)
 					names += "*";

programming_language: Java
filename: Boundary.java
change_type: ModificationType.MODIFY
diff: @@ -35,9 +35,8 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.Dimension2DDouble;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.graphic.SymbolContext;

programming_language: Java
filename: CircleInterface2.java
change_type: ModificationType.MODIFY
diff: @@ -35,9 +35,8 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.Dimension2DDouble;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.graphic.TextBlock;

programming_language: Java
filename: Cluster.java
change_type: ModificationType.MODIFY
diff: @@ -74,11 +74,10 @@ import net.sourceforge.plantuml.graphic.USymbols;
 import net.sourceforge.plantuml.graphic.color.ColorType;
 import net.sourceforge.plantuml.graphic.color.Colors;
 import net.sourceforge.plantuml.posimo.Moveable;
-import net.sourceforge.plantuml.skin.rose.Rose;
-import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.PName;
 import net.sourceforge.plantuml.style.SName;
 import net.sourceforge.plantuml.style.Style;
+import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.StyleSignatureBasic;
 import net.sourceforge.plantuml.svek.image.EntityImageState;
 import net.sourceforge.plantuml.ugraphic.UComment;
@@ -308,7 +307,7 @@ public class Cluster implements Moveable {
 				.withTOBECHANGED(stereotype);
 	}
 
-	public void drawU(UGraphic ug, UmlDiagramType umlDiagramType, ISkinParam skinParam2) {
+	public void drawU(UGraphic ug, UmlDiagramType umlDiagramType, ISkinParam skinParam2unused) {
 		if (group.isHidden())
 			return;
 
@@ -316,40 +315,17 @@ public class Cluster implements Moveable {
 		if (fullName.startsWith("##") == false)
 			ug.draw(new UComment("cluster " + fullName));
 
+		final USymbol uSymbol = group.getUSymbol() == null ? USymbols.PACKAGE : group.getUSymbol();
+		Style style = getDefaultStyleDefinition(umlDiagramType.getStyleName(), uSymbol)
+				.withTOBECHANGED(group.getStereotype()).getMergedStyle(skinParam.getCurrentStyleBuilder());
+		final double shadowing = style.value(PName.Shadowing).asDouble();
 		HColor borderColor;
-		Style style = null;
-		final double rounded;
-		final double diagonalCorner;
-		final double shadowing;
-		if (UseStyle.useBetaStyle()) {
-			final USymbol uSymbol = group.getUSymbol() == null ? USymbols.PACKAGE : group.getUSymbol();
-			final StyleSignatureBasic tmp = getDefaultStyleDefinition(umlDiagramType.getStyleName(), uSymbol);
-			style = tmp.withTOBECHANGED(group.getStereotype()).getMergedStyle(skinParam.getCurrentStyleBuilder());
-			shadowing = style.value(PName.Shadowing).asDouble();
-			if (group.getColors().getColor(ColorType.LINE) != null)
-				borderColor = group.getColors().getColor(ColorType.LINE);
-			else
-				borderColor = style.value(PName.LineColor).asColor(skinParam2.getThemeStyle(),
-						skinParam2.getIHtmlColorSet());
-			rounded = style.value(PName.RoundCorner).asDouble();
-			diagonalCorner = style.value(PName.DiagonalCorner).asDouble();
-
-		} else {
-			if (group.getUSymbol() == null)
-				shadowing = skinParam2.shadowing2(group.getStereotype(), USymbols.PACKAGE.getSkinParameter()) ? 3 : 0;
-			else
-				shadowing = skinParam2.shadowing2(group.getStereotype(), group.getUSymbol().getSkinParameter()) ? 3 : 0;
-
-			rounded = IEntityImage.CORNER;
-			if (umlDiagramType == UmlDiagramType.STATE)
-				borderColor = getColor(ColorParam.stateBorder, skinParam, group.getStereotype());
-			else if (umlDiagramType == UmlDiagramType.ACTIVITY)
-				borderColor = getColor(ColorParam.packageBorder, skinParam, group.getStereotype());
-			else
-				borderColor = getColor(ColorParam.packageBorder, skinParam, group.getStereotype());
-			diagonalCorner = 0;
-
-		}
+		if (group.getColors().getColor(ColorType.LINE) != null)
+			borderColor = group.getColors().getColor(ColorType.LINE);
+		else
+			borderColor = style.value(PName.LineColor).asColor(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet());
+		final double rounded = style.value(PName.RoundCorner).asDouble();
+		final double diagonalCorner = style.value(PName.DiagonalCorner).asDouble();
 
 		ug.startGroup(Collections.singletonMap(UGroupType.ID, "cluster_" + fullName));
 
@@ -368,49 +344,30 @@ public class Cluster implements Moveable {
 			final boolean isState = umlDiagramType == UmlDiagramType.STATE;
 
 			if (isState && group.getUSymbol() == null) {
-				UStroke strokeForState = getDefaultStyleDefinition(SName.stateDiagram, null)
-						.getMergedStyle(skinParam.getCurrentStyleBuilder()).getStroke();
-				if (group.getColors().getSpecificLineStroke() != null)
-					strokeForState = group.getColors().getSpecificLineStroke();
-
-				if (group.getColors().getColor(ColorType.LINE) != null)
-					borderColor = group.getColors().getColor(ColorType.LINE);
-
-				drawUState(ug, borderColor, skinParam2, strokeForState, umlDiagramType, rounded, shadowing);
+				drawUState(ug, umlDiagramType, rounded, shadowing);
 				return;
 			}
 			PackageStyle packageStyle = group.getPackageStyle();
 			if (packageStyle == null)
-				packageStyle = skinParam2.packageStyle();
+				packageStyle = skinParam.packageStyle();
 
 			if (border != null) {
-				final HColor tmp = skinParam2.getHtmlColor(border, group.getStereotype(), false);
+				final HColor tmp = skinParam.getHtmlColor(border, group.getStereotype(), false);
 				if (tmp != null)
 					borderColor = tmp;
 			}
 
-			final UStroke stroke;
-			if (UseStyle.useBetaStyle())
-				stroke = getStrokeInternal(group, skinParam2, style);
-			else
-				stroke = getStrokeInternal(group, skinParam2, null);
+			final UStroke stroke = getStrokeInternal(group, style);
 
 			HColor backColor = getBackColor(umlDiagramType, style);
-			backColor = getBackColor(backColor, skinParam2, group.getStereotype(), umlDiagramType.getStyleName(),
+			backColor = getBackColor(backColor, skinParam, group.getStereotype(), umlDiagramType.getStyleName(),
 					group.getUSymbol());
 			if (ztitle != null || zstereo != null) {
-				final double roundCorner;
-				if (UseStyle.useBetaStyle())
-					roundCorner = rounded;
-				else
-					roundCorner = group.getUSymbol() == null ? 0
-							: group.getUSymbol().getSkinParameter().getRoundCorner(skinParam, group.getStereotype());
-
 				final ClusterDecoration decoration = new ClusterDecoration(packageStyle, group.getUSymbol(), ztitle,
 						zstereo, minX, minY, maxX, maxY, stroke);
-				decoration.drawU(ug, backColor, borderColor, shadowing, roundCorner,
-						skinParam2.getHorizontalAlignment(AlignmentParam.packageTitleAlignment, null, false, null),
-						skinParam2.getStereotypeAlignment(), diagonalCorner);
+				decoration.drawU(ug, backColor, borderColor, shadowing, rounded,
+						skinParam.getHorizontalAlignment(AlignmentParam.packageTitleAlignment, null, false, null),
+						skinParam.getStereotypeAlignment(), diagonalCorner);
 				return;
 			}
 			final URectangle rect = new URectangle(maxX - minX, maxY - minY);
@@ -425,18 +382,12 @@ public class Cluster implements Moveable {
 		}
 	}
 
-	static public UStroke getStrokeInternal(IGroup group, ISkinParam skinParam, Style style) {
+	static public UStroke getStrokeInternal(IGroup group, Style style) {
 		final Colors colors = group.getColors();
 		if (colors.getSpecificLineStroke() != null)
 			return colors.getSpecificLineStroke();
 
-		if (style != null)
-			return style.getStroke();
-
-		if (group.getUSymbol() != null && group.getUSymbol() != USymbols.PACKAGE)
-			return group.getUSymbol().getSkinParameter().getStroke(skinParam, group.getStereotype());
-
-		return GeneralImageBuilder.getForcedStroke(group.getStereotype(), skinParam);
+		return style.getStroke();
 	}
 
 	public void manageEntryExitPoint(StringBounder stringBounder) {
@@ -477,12 +428,19 @@ public class Cluster implements Moveable {
 
 	}
 
-	private HColor getColorLegacy(ISkinParam skinParam, ColorParam colorParam, Stereotype stereo) {
-		return new Rose().getHtmlColor(skinParam, stereo, colorParam);
+	// GroupPngMakerState
+	private Style getStyleStateHeader() {
+		return StyleSignatureBasic.of(SName.root, SName.element, SName.stateDiagram, SName.state, SName.header)
+				.withTOBECHANGED(group.getStereotype()).getMergedStyle(skinParam.getCurrentStyleBuilder());
 	}
 
-	private void drawUState(UGraphic ug, HColor borderColor, ISkinParam skinParam2, UStroke stroke,
-			UmlDiagramType umlDiagramType, double rounded, double shadowing) {
+	private Style getStyleState() {
+		return StyleSignatureBasic.of(SName.root, SName.element, SName.stateDiagram, SName.state)
+				.withTOBECHANGED(group.getStereotype()).getMergedStyle(skinParam.getCurrentStyleBuilder());
+	}
+	// GroupPngMakerState
+
+	private void drawUState(UGraphic ug, UmlDiagramType umlDiagramType, double rounded, double shadowing) {
 		final Dimension2D total = new Dimension2DDouble(maxX - minX, maxY - minY);
 		final double suppY;
 		if (ztitle == null)
@@ -494,26 +452,33 @@ public class Cluster implements Moveable {
 		final Style styleGroup = getDefaultStyleDefinitionStateGroup(group.getStereotype())
 				.getMergedStyle(skinParam.getCurrentStyleBuilder());
 
-		HColor stateBack = getBackColor(umlDiagramType, styleGroup);
-		if (UseStyle.useBetaStyle() == false && stateBack == null)
-			stateBack = getColorLegacy(skinParam2, ColorParam.stateBackground, group.getStereotype());
+		HColor borderColor = group.getColors().getColor(ColorType.LINE);
+		if (borderColor == null)
+			borderColor = getStyleState().value(PName.LineColor).asColor(skinParam.getThemeStyle(),
+					skinParam.getIHtmlColorSet());
 
-		final HColor background;
-		if (UseStyle.useBetaStyle() == false)
-			background = getColorLegacy(skinParam2, ColorParam.background, null);
-		else
-			background = stateBack;
+		HColor backColor = group.getColors().getColor(ColorType.BACK);
+		if (backColor == null)
+			backColor = getStyleState().value(PName.BackGroundColor).asColor(skinParam.getThemeStyle(),
+					skinParam.getIHtmlColorSet());
+
+		final HColor imgBackcolor = getBackColor(umlDiagramType, styleGroup);
 
 		// final Style style = getStyle(FontParam.STATE_ATTRIBUTE, skinParam2);
 
-		final TextBlock attribute = GeneralImageBuilder.stateHeader(group, styleGroup, skinParam2);
+		final TextBlock attribute = GeneralImageBuilder.stateHeader(group, styleGroup, skinParam);
 		final double attributeHeight = attribute.calculateDimension(ug.getStringBounder()).getHeight();
 		if (total.getWidth() == 0) {
 			System.err.println("Cluster::drawUState issue");
 			return;
 		}
+
+		UStroke stroke = group.getColors().getSpecificLineStroke();
+		if (stroke == null)
+			stroke = getStyleState().getStroke();
+
 		final RoundedContainer r = new RoundedContainer(total, suppY,
-				attributeHeight + (attributeHeight > 0 ? IEntityImage.MARGIN : 0), borderColor, stateBack, background,
+				attributeHeight + (attributeHeight > 0 ? IEntityImage.MARGIN : 0), borderColor, backColor, imgBackcolor,
 				stroke, rounded, shadowing);
 		r.drawU(ug.apply(new UTranslate(minX, minY)));
 
@@ -919,20 +884,19 @@ public class Cluster implements Moveable {
 
 		final Stereotype stereo = group.getStereotype();
 
-		if (UseStyle.useBetaStyle())
-			return style.value(PName.BackGroundColor).asColor(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet());
-
-		final USymbol sym = group.getUSymbol() == null ? USymbols.PACKAGE : group.getUSymbol();
-		final ColorParam backparam = umlDiagramType == UmlDiagramType.ACTIVITY ? ColorParam.partitionBackground
-				: sym.getColorParamBack();
-		final HColor c1 = skinParam.getHtmlColor(backparam, stereo, false);
-		if (c1 != null)
-			return c1;
-
-		if (parentCluster == null)
-			return null;
-
-		return parentCluster.getBackColor(umlDiagramType, style);
+		return style.value(PName.BackGroundColor).asColor(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet());
+
+//		final USymbol sym = group.getUSymbol() == null ? USymbols.PACKAGE : group.getUSymbol();
+//		final ColorParam backparam = umlDiagramType == UmlDiagramType.ACTIVITY ? ColorParam.partitionBackground
+//				: sym.getColorParamBack();
+//		final HColor c1 = skinParam.getHtmlColor(backparam, stereo, false);
+//		if (c1 != null)
+//			return c1;
+//
+//		if (parentCluster == null)
+//			return null;
+//
+//		return parentCluster.getBackColor(umlDiagramType, style);
 	}
 
 	public boolean isClusterOf(IEntity ent) {

programming_language: Java
filename: ClusterPosition.java
change_type: ModificationType.MODIFY
diff: @@ -36,10 +36,10 @@
 package net.sourceforge.plantuml.svek;
 
 import java.awt.geom.CubicCurve2D;
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
 
 import net.sourceforge.plantuml.Dimension2DDouble;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.posimo.BezierUtils;
 
 public class ClusterPosition {

programming_language: Java
filename: ConcurrentStateImage.java
change_type: ModificationType.MODIFY
diff: @@ -35,7 +35,6 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -43,6 +42,7 @@ import java.util.List;
 import net.sourceforge.plantuml.ColorParam;
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.ISkinParam;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.skin.rose.Rose;

programming_language: Java
filename: Control.java
change_type: ModificationType.MODIFY
diff: @@ -35,9 +35,8 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.Dimension2DDouble;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.graphic.SymbolContext;

programming_language: Java
filename: CucaDiagramFileMakerSvek2InternalImage.java
change_type: ModificationType.MODIFY
diff: @@ -35,13 +35,13 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.util.List;
 
 import net.sourceforge.plantuml.ColorParam;
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.Stereotype;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.StringBounder;

programming_language: Java
filename: DecorateEntityImage.java
change_type: ModificationType.MODIFY
diff: @@ -35,10 +35,10 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.util.Objects;
 
 import net.sourceforge.plantuml.Dimension2DDouble;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.HorizontalAlignment;
 import net.sourceforge.plantuml.graphic.StringBounder;

programming_language: Java
filename: DecorateEntityImage3.java
change_type: ModificationType.MODIFY
diff: @@ -36,7 +36,6 @@
 package net.sourceforge.plantuml.svek;
 
 import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.graphic.TextBlock;

programming_language: Java
filename: DirectionalTextBlock.java
change_type: ModificationType.MODIFY
diff: @@ -35,9 +35,8 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.Direction;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.graphic.TextBlock;

programming_language: Java
filename: EntityDomain.java
change_type: ModificationType.MODIFY
diff: @@ -35,9 +35,8 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.Dimension2DDouble;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.graphic.SymbolContext;

programming_language: Java
filename: EntityImageDegenerated.java
change_type: ModificationType.MODIFY
diff: @@ -35,11 +35,11 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Rectangle2D;
 
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.graphic.InnerStrategy;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.ugraphic.MinMax;

programming_language: Java
filename: EntityImageProtected.java
change_type: ModificationType.MODIFY
diff: @@ -35,10 +35,10 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Rectangle2D;
 
 import net.sourceforge.plantuml.Dimension2DDouble;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.dot.Neighborhood;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.InnerStrategy;

programming_language: Java
filename: GeneralImageBuilder.java
change_type: ModificationType.MODIFY
diff: @@ -102,10 +102,10 @@ import net.sourceforge.plantuml.graphic.USymbol;
 import net.sourceforge.plantuml.graphic.USymbolHexagon;
 import net.sourceforge.plantuml.graphic.USymbolInterface;
 import net.sourceforge.plantuml.graphic.USymbols;
-import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.PName;
 import net.sourceforge.plantuml.style.SName;
 import net.sourceforge.plantuml.style.Style;
+import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.StyleSignatureBasic;
 import net.sourceforge.plantuml.svek.image.EntityImageActivity;
 import net.sourceforge.plantuml.svek.image.EntityImageArcCircle;
@@ -703,24 +703,26 @@ public final class GeneralImageBuilder {
 			return TextBlockUtils.empty(0, 0);
 
 		final ISkinParam skinParam = dotData.getSkinParam();
-		final FontConfiguration fontConfiguration;
-		if (UseStyle.useBetaStyle()) {
-			final SName sname = dotData.getUmlDiagramType().getStyleName();
-			final StyleSignatureBasic signature;
-			final USymbol uSymbol = g.getUSymbol();
-			if (uSymbol == USymbols.RECTANGLE)
-				signature = StyleSignatureBasic.of(SName.root, SName.element, sname, uSymbol.getSName(), SName.title);
-			else
-				signature = StyleSignatureBasic.of(SName.root, SName.element, sname, SName.title);
 
-			final Style style = signature //
-					.withTOBECHANGED(g.getStereotype()) //
-					.with(g.getStereostyles()) //
-					.getMergedStyle(skinParam.getCurrentStyleBuilder());
+		final SName sname = dotData.getUmlDiagramType().getStyleName();
+		final StyleSignatureBasic signature;
+		final USymbol uSymbol = g.getUSymbol();
+		if (g.getGroupType() == GroupType.STATE)
+			signature = StyleSignatureBasic.of(SName.root, SName.element, SName.stateDiagram, SName.state,
+					SName.header);
+		else if (uSymbol == USymbols.RECTANGLE)
+			signature = StyleSignatureBasic.of(SName.root, SName.element, sname, uSymbol.getSName(), SName.title);
+		else
+			signature = StyleSignatureBasic.of(SName.root, SName.element, sname, SName.title);
+
+		final Style style = signature //
+				.withTOBECHANGED(g.getStereotype()) //
+				.with(g.getStereostyles()) //
+				.getMergedStyle(skinParam.getCurrentStyleBuilder());
+
+		final FontConfiguration fontConfiguration = style.getFontConfiguration(skinParam.getThemeStyle(),
+				skinParam.getIHtmlColorSet());
 
-			fontConfiguration = style.getFontConfiguration(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet());
-		} else
-			fontConfiguration = g.getFontConfigurationForTitle(skinParam);
 		final HorizontalAlignment alignment = HorizontalAlignment.CENTER;
 		return label.create(fontConfiguration, alignment, dotData.getSkinParam());
 	}

programming_language: Java
filename: GraphvizCrash.java
change_type: ModificationType.MODIFY
diff: @@ -36,7 +36,6 @@
 package net.sourceforge.plantuml.svek;
 
 import java.awt.Color;
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.image.BufferedImage;
 import java.util.ArrayList;
 import java.util.List;
@@ -44,6 +43,7 @@ import java.util.List;
 import net.sourceforge.plantuml.BackSlash;
 import net.sourceforge.plantuml.OptionPrint;
 import net.sourceforge.plantuml.StringUtils;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.command.CommandExecutionResult;
 import net.sourceforge.plantuml.cucadiagram.dot.GraphvizUtils;
 import net.sourceforge.plantuml.flashcode.FlashCodeFactory;

programming_language: Java
filename: GroupPngMakerState.java
change_type: ModificationType.MODIFY
diff: @@ -40,10 +40,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 
-import net.sourceforge.plantuml.ColorParam;
-import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.ISkinParam;
-import net.sourceforge.plantuml.UseStyle;
 import net.sourceforge.plantuml.cucadiagram.CucaDiagram;
 import net.sourceforge.plantuml.cucadiagram.Display;
 import net.sourceforge.plantuml.cucadiagram.EntityUtils;
@@ -62,7 +59,6 @@ import net.sourceforge.plantuml.graphic.HorizontalAlignment;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.graphic.TextBlock;
 import net.sourceforge.plantuml.graphic.color.ColorType;
-import net.sourceforge.plantuml.skin.rose.Rose;
 import net.sourceforge.plantuml.style.PName;
 import net.sourceforge.plantuml.style.SName;
 import net.sourceforge.plantuml.style.Style;
@@ -128,30 +124,18 @@ public final class GroupPngMakerState {
 	}
 
 	private Style getStyleState() {
-		return StyleSignatureBasic.of(SName.root, SName.element, SName.stateDiagram, SName.state).withTOBECHANGED(group.getStereotype())
-				.getMergedStyle(diagram.getSkinParam().getCurrentStyleBuilder());
+		return StyleSignatureBasic.of(SName.root, SName.element, SName.stateDiagram, SName.state)
+				.withTOBECHANGED(group.getStereotype()).getMergedStyle(diagram.getSkinParam().getCurrentStyleBuilder());
 	}
 
 	public IEntityImage getImage() {
 		final Display display = group.getDisplay();
 		final ISkinParam skinParam = diagram.getSkinParam();
 
-		final FontConfiguration fontConfiguration;
-		final double rounded;
-		double shadowing = 0;
-
-		if (UseStyle.useBetaStyle()) {
-			rounded = getStyleState().value(PName.RoundCorner).asDouble();
-			shadowing = getStyleState().value(PName.Shadowing).asDouble();
-			fontConfiguration = getStyleStateHeader().getFontConfiguration(skinParam.getThemeStyle(),
-					skinParam.getIHtmlColorSet());
-		} else {
-			rounded = IEntityImage.CORNER;
-			fontConfiguration = FontConfiguration.create(skinParam, FontParam.STATE, group.getStereotype());
-			if (skinParam.shadowing(group.getStereotype()))
-				shadowing = 3.0;
-		}
-
+		final double rounded = getStyleState().value(PName.RoundCorner).asDouble();
+		final double shadowing = getStyleState().value(PName.Shadowing).asDouble();
+		final FontConfiguration fontConfiguration = getStyleStateHeader()
+				.getFontConfiguration(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet());
 		final TextBlock title = display.create(fontConfiguration, HorizontalAlignment.CENTER, diagram.getSkinParam());
 
 		if (group.size() == 0 && group.getChildren().size() == 0)
@@ -175,30 +159,18 @@ public final class GroupPngMakerState {
 
 		HColor borderColor = group.getColors().getColor(ColorType.LINE);
 		if (borderColor == null)
-			if (UseStyle.useBetaStyle())
-				borderColor = getStyleState().value(PName.LineColor).asColor(skinParam.getThemeStyle(),
-						skinParam.getIHtmlColorSet());
-			else
-				borderColor = getColor(ColorParam.stateBorder, group.getStereotype());
+			borderColor = getStyleState().value(PName.LineColor).asColor(skinParam.getThemeStyle(),
+					skinParam.getIHtmlColorSet());
 
 		final Stereotype stereo = group.getStereotype();
-		final HColor tmp = group.getColors().getColor(ColorType.BACK);
-		final HColor backColor;
-		if (tmp == null)
-			if (UseStyle.useBetaStyle())
-				backColor = getStyleState().value(PName.BackGroundColor).asColor(skinParam.getThemeStyle(),
-						skinParam.getIHtmlColorSet());
-			else
-				backColor = getColor(ColorParam.stateBackground, stereo);
-		else
-			backColor = tmp;
+		HColor backColor = group.getColors().getColor(ColorType.BACK);
+		if (backColor == null)
+			backColor = getStyleState().value(PName.BackGroundColor).asColor(skinParam.getThemeStyle(),
+					skinParam.getIHtmlColorSet());
 
 		UStroke stroke = group.getColors().getSpecificLineStroke();
 		if (stroke == null)
-			if (UseStyle.useBetaStyle())
-				stroke = getStyleState().getStroke();
-			else
-				stroke = new UStroke(1.5);
+			stroke = getStyleState().getStroke();
 
 		final TextBlock attribute = GeneralImageBuilder.stateHeader((IEntity) group, null, skinParam);
 
@@ -236,10 +208,4 @@ public final class GroupPngMakerState {
 		return true;
 	}
 
-	private final Rose rose = new Rose();
-
-	private HColor getColor(ColorParam colorParam, Stereotype stereo) {
-		final ISkinParam skinParam = diagram.getSkinParam();
-		return rose.getHtmlColor(skinParam, stereo, colorParam);
-	}
 }

programming_language: Java
filename: HeaderLayout.java
change_type: ModificationType.MODIFY
diff: @@ -35,9 +35,8 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.Dimension2DDouble;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.graphic.TextBlock;
 import net.sourceforge.plantuml.graphic.TextBlockEmpty;

programming_language: Java
filename: InnerActivity.java
change_type: ModificationType.MODIFY
diff: @@ -36,7 +36,6 @@
 package net.sourceforge.plantuml.svek;
 
 import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.ugraphic.UGraphic;

programming_language: Java
filename: InnerStateAutonom.java
change_type: ModificationType.MODIFY
diff: @@ -35,10 +35,9 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.Url;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.graphic.TextBlock;

programming_language: Java
filename: PackageStyle.java
change_type: ModificationType.MODIFY
diff: @@ -36,10 +36,10 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.util.EnumSet;
 
 import net.sourceforge.plantuml.Dimension2DDouble;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.graphic.USymbol;
 import net.sourceforge.plantuml.graphic.USymbols;
 import net.sourceforge.plantuml.ugraphic.UGraphic;

programming_language: Java
filename: RoundedContainer.java
change_type: ModificationType.MODIFY
diff: @@ -36,13 +36,15 @@
 package net.sourceforge.plantuml.svek;
 
 import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.ugraphic.UGraphic;
 import net.sourceforge.plantuml.ugraphic.ULine;
+import net.sourceforge.plantuml.ugraphic.UPath;
 import net.sourceforge.plantuml.ugraphic.URectangle;
+import net.sourceforge.plantuml.ugraphic.UShape;
 import net.sourceforge.plantuml.ugraphic.UStroke;
 import net.sourceforge.plantuml.ugraphic.UTranslate;
 import net.sourceforge.plantuml.ugraphic.color.HColor;
+import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
 
 public final class RoundedContainer {
 
@@ -58,9 +60,9 @@ public final class RoundedContainer {
 
 	public RoundedContainer(Dimension2D dim, double titleHeight, double attributeHeight, HColor borderColor,
 			HColor backColor, HColor imgBackcolor, UStroke stroke, double rounded, double shadowing) {
-		if (dim.getWidth() == 0) {
+		if (dim.getWidth() == 0)
 			throw new IllegalArgumentException();
-		}
+
 		this.rounded = rounded;
 		this.dim = dim;
 		this.imgBackcolor = imgBackcolor;
@@ -73,28 +75,28 @@ public final class RoundedContainer {
 	}
 
 	public void drawU(UGraphic ug) {
-		ug = ug.apply(backColor.bg()).apply(borderColor);
+		ug = ug.apply(backColor.bg()).apply(borderColor).apply(stroke);
 		final URectangle rect = new URectangle(dim.getWidth(), dim.getHeight()).rounded(rounded);
-		rect.setDeltaShadow(shadowing);
-		ug.apply(stroke).draw(rect);
-
-		final double yLine = titleHeight + attributeHeight;
 
-		ug = ug.apply(imgBackcolor.bg());
+		if (shadowing > 0) {
+			rect.setDeltaShadow(shadowing);
+			ug.apply(HColorUtils.transparent().bg()).draw(rect);
+			rect.setDeltaShadow(0);
+			
+		}
+		final double headerHeight = titleHeight + attributeHeight;
 
-		final double thickness = stroke.getThickness();
+		new RoundedNorth(dim.getWidth(), headerHeight, backColor, rounded).drawU(ug);
+		new RoundedSouth(dim.getWidth(), dim.getHeight() - headerHeight, imgBackcolor, rounded)
+				.drawU(ug.apply(UTranslate.dy(headerHeight)));
 
-		final URectangle inner = new URectangle(dim.getWidth() - 4 * thickness,
-				dim.getHeight() - titleHeight - 4 * thickness - attributeHeight).rounded(rounded);
-		ug.apply(imgBackcolor).apply(new UTranslate(2 * thickness, yLine + 2 * thickness)).draw(inner);
+		ug.apply(HColorUtils.transparent().bg()).draw(rect);
 
-		if (titleHeight > 0) {
-			ug.apply(stroke).apply(UTranslate.dy(yLine)).draw(ULine.hline(dim.getWidth()));
-		}
+		if (headerHeight > 0)
+			ug.apply(UTranslate.dy(headerHeight)).draw(ULine.hline(dim.getWidth()));
 
-		if (attributeHeight > 0) {
-			ug.apply(stroke).apply(UTranslate.dy(yLine - attributeHeight)).draw(ULine.hline(dim.getWidth()));
-		}
+		if (attributeHeight > 0)
+			ug.apply(UTranslate.dy(titleHeight)).draw(ULine.hline(dim.getWidth()));
 
 	}
 }

programming_language: Java
filename: RoundedNorth.java
change_type: ModificationType.ADD
diff: @@ -0,0 +1,88 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2023, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML 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.
+ *
+ * PlantUML 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 library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.svek;
+
+import net.sourceforge.plantuml.graphic.UDrawable;
+import net.sourceforge.plantuml.ugraphic.UGraphic;
+import net.sourceforge.plantuml.ugraphic.UPath;
+import net.sourceforge.plantuml.ugraphic.URectangle;
+import net.sourceforge.plantuml.ugraphic.UShape;
+import net.sourceforge.plantuml.ugraphic.UStroke;
+import net.sourceforge.plantuml.ugraphic.color.HColor;
+import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
+
+public final class RoundedNorth implements UDrawable {
+
+	private final double width;
+	private final double height;
+	private final HColor backColor;
+	private final double rounded;
+
+	public RoundedNorth(double width, double height, HColor backColor, double rounded) {
+		if (width == 0)
+			throw new IllegalArgumentException();
+		if (height == 0)
+			throw new IllegalArgumentException();
+
+		this.width = width;
+		this.height = height;
+		this.rounded = rounded;
+		this.backColor = backColor;
+	}
+
+	public void drawU(UGraphic ug) {
+		if (HColorUtils.isTransparent(backColor))
+			return;
+
+		final UShape header;
+		if (rounded == 0) {
+			header = new URectangle(width, height);
+		} else {
+			final UPath path = new UPath();
+			path.moveTo(rounded / 2, 0);
+			path.lineTo(width - rounded / 2, 0);
+			path.arcTo(rounded / 2, rounded / 2, 0, 0, 1, width, rounded / 2);
+			path.lineTo(width, height);
+			path.lineTo(0, height);
+			path.lineTo(0, rounded / 2);
+			path.arcTo(rounded / 2, rounded / 2, 0, 0, 1, rounded / 2, 0);
+			path.closePath();
+			header = path;
+		}
+		ug.apply(new UStroke()).apply(backColor).apply(backColor.bg()).draw(header);
+
+	}
+}

programming_language: Java
filename: RoundedSouth.java
change_type: ModificationType.ADD
diff: @@ -0,0 +1,88 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2023, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML 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.
+ *
+ * PlantUML 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 library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.svek;
+
+import net.sourceforge.plantuml.graphic.UDrawable;
+import net.sourceforge.plantuml.ugraphic.UGraphic;
+import net.sourceforge.plantuml.ugraphic.UPath;
+import net.sourceforge.plantuml.ugraphic.URectangle;
+import net.sourceforge.plantuml.ugraphic.UShape;
+import net.sourceforge.plantuml.ugraphic.UStroke;
+import net.sourceforge.plantuml.ugraphic.color.HColor;
+import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
+
+public final class RoundedSouth implements UDrawable {
+
+	private final double width;
+	private final double height;
+	private final HColor backColor;
+	private final double rounded;
+
+	public RoundedSouth(double width, double height, HColor backColor, double rounded) {
+		if (width == 0)
+			throw new IllegalArgumentException();
+		if (height == 0)
+			throw new IllegalArgumentException();
+
+		this.width = width;
+		this.height = height;
+		this.rounded = rounded;
+		this.backColor = backColor;
+	}
+
+	public void drawU(UGraphic ug) {
+		if (HColorUtils.isTransparent(backColor))
+			return;
+
+		final UShape header;
+		if (rounded == 0) {
+			header = new URectangle(width, height);
+		} else {
+			final UPath path = new UPath();
+			path.moveTo(0, 0);
+			path.lineTo(width, 0);
+			path.lineTo(width, height - rounded / 2);
+			path.arcTo(rounded / 2, rounded / 2, 0, 0, 1, width - rounded / 2, height);
+			path.lineTo(rounded / 2, height);
+			path.arcTo(rounded / 2, rounded / 2, 0, 0, 1, 0, height - rounded / 2);
+			path.lineTo(0, 0);
+			path.closePath();
+			header = path;
+		}
+		ug.apply(new UStroke()).apply(backColor).apply(backColor.bg()).draw(header);
+
+	}
+}

programming_language: Java
filename: SvekLine.java
change_type: ModificationType.MODIFY
diff: @@ -35,7 +35,6 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -57,6 +56,7 @@ import net.sourceforge.plantuml.Pragma;
 import net.sourceforge.plantuml.StringUtils;
 import net.sourceforge.plantuml.UmlDiagramType;
 import net.sourceforge.plantuml.Url;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.command.Position;
 import net.sourceforge.plantuml.cucadiagram.Display;
 import net.sourceforge.plantuml.cucadiagram.EntityPort;

programming_language: Java
filename: SvekNode.java
change_type: ModificationType.MODIFY
diff: @@ -35,13 +35,13 @@
  */
 package net.sourceforge.plantuml.svek;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
 import java.util.List;
 
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.Hideable;
 import net.sourceforge.plantuml.StringUtils;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.EntityPosition;
 import net.sourceforge.plantuml.cucadiagram.IGroup;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;

programming_language: Java
filename: SvekResult.java
change_type: ModificationType.MODIFY
diff: @@ -49,11 +49,11 @@ import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.graphic.TextBlockUtils;
 import net.sourceforge.plantuml.skin.rose.Rose;
-import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.PName;
 import net.sourceforge.plantuml.style.SName;
 import net.sourceforge.plantuml.style.Style;
 import net.sourceforge.plantuml.style.StyleBuilder;
+import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.StyleSignatureBasic;
 import net.sourceforge.plantuml.ugraphic.MinMax;
 import net.sourceforge.plantuml.ugraphic.UGraphic;

programming_language: Java
filename: AbstractEntityImageBorder.java
change_type: ModificationType.MODIFY
diff: @@ -36,10 +36,9 @@
 
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.ISkinParam;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.EntityPosition;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.cucadiagram.Rankdir;

programming_language: Java
filename: EntityImageActivity.java
change_type: ModificationType.MODIFY
diff: @@ -50,10 +50,10 @@ import net.sourceforge.plantuml.graphic.HorizontalAlignment;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.graphic.TextBlock;
 import net.sourceforge.plantuml.graphic.color.ColorType;
-import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.PName;
 import net.sourceforge.plantuml.style.SName;
 import net.sourceforge.plantuml.style.Style;
+import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.StyleSignatureBasic;
 import net.sourceforge.plantuml.svek.AbstractEntityImage;
 import net.sourceforge.plantuml.svek.Bibliotekon;

programming_language: Java
filename: EntityImageArcCircle.java
change_type: ModificationType.MODIFY
diff: @@ -35,12 +35,11 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.Guillemet;
 import net.sourceforge.plantuml.ISkinParam;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.Display;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.cucadiagram.Stereotype;

programming_language: Java
filename: EntityImageAssociation.java
change_type: ModificationType.MODIFY
diff: @@ -35,13 +35,12 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.ColorParam;
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.style.PName;

programming_language: Java
filename: EntityImageAssociationPoint.java
change_type: ModificationType.MODIFY
diff: @@ -35,10 +35,9 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.ISkinParam;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.svek.AbstractEntityImage;

programming_language: Java
filename: EntityImageBranch.java
change_type: ModificationType.MODIFY
diff: @@ -35,7 +35,6 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.util.EnumMap;
 import java.util.Map;
 
@@ -44,6 +43,7 @@ import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.style.PName;

programming_language: Java
filename: EntityImageCircleEnd.java
change_type: ModificationType.MODIFY
diff: @@ -35,13 +35,12 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.ColorParam;
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.style.PName;

programming_language: Java
filename: EntityImageCircleStart.java
change_type: ModificationType.MODIFY
diff: @@ -35,13 +35,12 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.ColorParam;
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.style.PName;

programming_language: Java
filename: EntityImageClass.java
change_type: ModificationType.MODIFY
diff: @@ -35,7 +35,6 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Rectangle2D;
 import java.util.EnumMap;
 import java.util.Map;
@@ -50,6 +49,7 @@ import net.sourceforge.plantuml.LineParam;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.Url;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.creole.Stencil;
 import net.sourceforge.plantuml.cucadiagram.EntityPortion;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;

programming_language: Java
filename: EntityImageClassHeader.java
change_type: ModificationType.MODIFY
diff: @@ -35,14 +35,13 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.ColorParam;
 import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.Guillemet;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.Display;
 import net.sourceforge.plantuml.cucadiagram.EntityPortion;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;

programming_language: Java
filename: EntityImageEmptyPackage.java
change_type: ModificationType.MODIFY
diff: @@ -61,10 +61,10 @@ import net.sourceforge.plantuml.graphic.TextBlockUtils;
 import net.sourceforge.plantuml.graphic.USymbols;
 import net.sourceforge.plantuml.graphic.color.ColorType;
 import net.sourceforge.plantuml.graphic.color.Colors;
-import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.PName;
 import net.sourceforge.plantuml.style.SName;
 import net.sourceforge.plantuml.style.Style;
+import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.StyleSignatureBasic;
 import net.sourceforge.plantuml.svek.AbstractEntityImage;
 import net.sourceforge.plantuml.svek.Cluster;

programming_language: Java
filename: EntityImageGroup.java
change_type: ModificationType.MODIFY
diff: @@ -35,10 +35,9 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.ISkinParam;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.svek.AbstractEntityImage;

programming_language: Java
filename: EntityImageJson.java
change_type: ModificationType.MODIFY
diff: @@ -35,9 +35,6 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import java.util.EnumMap;
-import java.util.Map;
-
 import net.sourceforge.plantuml.ColorParam;
 import net.sourceforge.plantuml.CornerParam;
 import net.sourceforge.plantuml.Dimension2DDouble;
@@ -76,7 +73,6 @@ import net.sourceforge.plantuml.ugraphic.PlacementStrategyY1Y2;
 import net.sourceforge.plantuml.ugraphic.Shadowable;
 import net.sourceforge.plantuml.ugraphic.UGraphic;
 import net.sourceforge.plantuml.ugraphic.UGraphicStencil;
-import net.sourceforge.plantuml.ugraphic.UGroupType;
 import net.sourceforge.plantuml.ugraphic.ULayoutGroup;
 import net.sourceforge.plantuml.ugraphic.URectangle;
 import net.sourceforge.plantuml.ugraphic.UStroke;

programming_language: Java
filename: EntityImageLollipopInterface.java
change_type: ModificationType.MODIFY
diff: @@ -35,7 +35,6 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.util.EnumMap;
 import java.util.Map;
 
@@ -46,6 +45,7 @@ import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.Url;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.cucadiagram.LeafType;
 import net.sourceforge.plantuml.cucadiagram.Stereotype;

programming_language: Java
filename: EntityImageLollipopInterfaceEye1.java
change_type: ModificationType.MODIFY
diff: @@ -35,7 +35,6 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
 import java.util.List;
 
@@ -45,6 +44,7 @@ import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.Url;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.cucadiagram.Stereotype;
 import net.sourceforge.plantuml.graphic.FontConfiguration;

programming_language: Java
filename: EntityImageLollipopInterfaceEye2.java
change_type: ModificationType.MODIFY
diff: @@ -35,7 +35,6 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.util.Objects;
 
 import net.sourceforge.plantuml.Dimension2DDouble;
@@ -44,6 +43,7 @@ import net.sourceforge.plantuml.Guillemet;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.Url;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.BodyFactory;
 import net.sourceforge.plantuml.cucadiagram.Display;
 import net.sourceforge.plantuml.cucadiagram.EntityPortion;

programming_language: Java
filename: EntityImageNote.java
change_type: ModificationType.MODIFY
diff: @@ -35,7 +35,6 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Line2D;
 import java.awt.geom.Point2D;
 import java.util.EnumMap;
@@ -55,6 +54,7 @@ import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.UmlDiagramType;
 import net.sourceforge.plantuml.Url;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.creole.Stencil;
 import net.sourceforge.plantuml.cucadiagram.BodyFactory;
 import net.sourceforge.plantuml.cucadiagram.Display;

programming_language: Java
filename: EntityImageNoteLink.java
change_type: ModificationType.MODIFY
diff: @@ -35,10 +35,9 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.ISkinParam;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.Display;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.StringBounder;

programming_language: Java
filename: EntityImagePort.java
change_type: ModificationType.MODIFY
diff: @@ -36,7 +36,6 @@
 
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
 
 import net.sourceforge.plantuml.ColorParam;
@@ -45,6 +44,7 @@ import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.EntityPosition;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.graphic.StringBounder;

programming_language: Java
filename: EntityImagePseudoState.java
change_type: ModificationType.MODIFY
diff: @@ -35,14 +35,13 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.ColorParam;
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.Display;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.cucadiagram.Stereotype;

programming_language: Java
filename: EntityImageState.java
change_type: ModificationType.MODIFY
diff: @@ -35,13 +35,13 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.util.Collections;
 
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.creole.CreoleMode;
 import net.sourceforge.plantuml.cucadiagram.Display;
 import net.sourceforge.plantuml.cucadiagram.IEntity;

programming_language: Java
filename: EntityImageState2.java
change_type: ModificationType.MODIFY
diff: @@ -35,12 +35,11 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.Url;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.BodyFactory;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.cucadiagram.Stereotype;

programming_language: Java
filename: EntityImageStateBorder.java
change_type: ModificationType.MODIFY
diff: @@ -35,7 +35,6 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
 
 import net.sourceforge.plantuml.ColorParam;
@@ -43,6 +42,7 @@ import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.EntityPosition;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.graphic.color.ColorType;

programming_language: Java
filename: EntityImageStateCommon.java
change_type: ModificationType.MODIFY
diff: @@ -35,8 +35,6 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.ColorParam;
 import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.ISkinParam;
@@ -44,6 +42,7 @@ import net.sourceforge.plantuml.LineConfigurable;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.Url;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.creole.CreoleMode;
 import net.sourceforge.plantuml.cucadiagram.IEntity;
 import net.sourceforge.plantuml.cucadiagram.Stereotype;

programming_language: Java
filename: EntityImageStateEmptyDescription.java
change_type: ModificationType.MODIFY
diff: @@ -35,11 +35,10 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.IEntity;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.ugraphic.UGraphic;

programming_language: Java
filename: EntityImageSynchroBar.java
change_type: ModificationType.MODIFY
diff: @@ -35,13 +35,12 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.ColorParam;
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.SkinParamUtils;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.ILeaf;
 import net.sourceforge.plantuml.cucadiagram.Rankdir;
 import net.sourceforge.plantuml.graphic.StringBounder;

programming_language: Java
filename: EntityImageTips.java
change_type: ModificationType.MODIFY
diff: @@ -35,7 +35,6 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
 import java.util.Map;
@@ -48,6 +47,7 @@ import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.LineBreakStrategy;
 import net.sourceforge.plantuml.UmlDiagramType;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.command.Position;
 import net.sourceforge.plantuml.cucadiagram.BodyFactory;
 import net.sourceforge.plantuml.cucadiagram.Display;

programming_language: Java
filename: EntityImageUseCase.java
change_type: ModificationType.MODIFY
diff: @@ -64,10 +64,10 @@ import net.sourceforge.plantuml.graphic.TextBlock;
 import net.sourceforge.plantuml.graphic.TextBlockUtils;
 import net.sourceforge.plantuml.graphic.color.ColorType;
 import net.sourceforge.plantuml.graphic.color.Colors;
-import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.PName;
 import net.sourceforge.plantuml.style.SName;
 import net.sourceforge.plantuml.style.Style;
+import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.StyleSignatureBasic;
 import net.sourceforge.plantuml.svek.AbstractEntityImage;
 import net.sourceforge.plantuml.svek.ShapeType;

programming_language: Java
filename: Footprint.java
change_type: ModificationType.MODIFY
diff: @@ -37,11 +37,11 @@ package net.sourceforge.plantuml.svek.image;
 
 import static net.sourceforge.plantuml.utils.ObjectUtils.instanceOfAny;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
 import java.util.ArrayList;
 import java.util.List;
 
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.graphic.UDrawable;
 import net.sourceforge.plantuml.ugraphic.UBackground;

programming_language: Java
filename: Opale.java
change_type: ModificationType.MODIFY
diff: @@ -35,11 +35,11 @@
  */
 package net.sourceforge.plantuml.svek.image;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
 
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.Direction;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.graphic.TextBlock;

programming_language: Java
filename: SvgGraphics.java
change_type: ModificationType.MODIFY
diff: @@ -35,7 +35,6 @@
  */
 package net.sourceforge.plantuml.svg;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.PathIterator;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayOutputStream;
@@ -45,9 +44,7 @@ import java.io.OutputStream;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.HashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -71,6 +68,7 @@ import org.w3c.dom.Element;
 import net.sourceforge.plantuml.FileUtils;
 import net.sourceforge.plantuml.Log;
 import net.sourceforge.plantuml.SignatureUtils;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.code.Base64Coder;
 import net.sourceforge.plantuml.security.SImageIO;
 import net.sourceforge.plantuml.security.SecurityUtils;
@@ -895,8 +893,14 @@ public class SvgGraphics {
 
 			String svg = manageScale(image);
 
-			final String svgHeader = "<svg height=\"" + (int) (image.getHeight() * scale) + "\" width=\""
-					+ (int) (image.getWidth() * scale) + "\" xmlns=\"http://www.w3.org/2000/svg\" >";
+			final String svgHeader;
+			if (image.containsXlink())
+				svgHeader = "<svg height=\"" + (int) (image.getHeight() * scale) + "\" width=\""
+						+ (int) (image.getWidth() * scale)
+						+ "\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"http://www.w3.org/2000/svg\" >";
+			else
+				svgHeader = "<svg height=\"" + (int) (image.getHeight() * scale) + "\" width=\""
+						+ (int) (image.getWidth() * scale) + "\" xmlns=\"http://www.w3.org/2000/svg\" >";
 
 			svg = svgHeader + svg.substring(5);
 

programming_language: Java
filename: ChangeState.java
change_type: ModificationType.MODIFY
diff: @@ -54,9 +54,9 @@ public class ChangeState implements Comparable<ChangeState> {
 	private final Colors colors;
 
 	public ChangeState(TimeTick when, String comment, Colors colors, String... states) {
-		if (states.length == 0) {
+		if (states.length == 0)
 			throw new IllegalArgumentException();
-		}
+
 		this.when = when;
 		this.states = states;
 		this.comment = comment;
@@ -84,28 +84,26 @@ public class ChangeState implements Comparable<ChangeState> {
 	}
 
 	public final HColor getBackColor(ISkinParam skinParam, Style style) {
-		if (colors == null || colors.getColor(ColorType.BACK) == null) {
-			if (UseStyle.useBetaStyle() == false)
-				return HColorUtils.COL_D7E0F2;
-
+		if (colors == null || colors.getColor(ColorType.BACK) == null)
 			return style.value(PName.BackGroundColor).asColor(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet());
-		}
+
 		return colors.getColor(ColorType.BACK);
 	}
 
 	private final HColor getLineColor(ISkinParam skinParam, Style style) {
-		if (colors == null || colors.getColor(ColorType.LINE) == null) {
-			if (UseStyle.useBetaStyle() == false)
-				return HColorUtils.COL_038048;
-
+		if (colors == null || colors.getColor(ColorType.LINE) == null)
 			return style.value(PName.LineColor).asColor(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet());
-		}
+
 		return colors.getColor(ColorType.LINE);
 	}
 
+	private UStroke getStroke(Style style) {
+		return style.getStroke();
+	}
+
 	public SymbolContext getContext(ISkinParam skinParam, Style style) {
 		return new SymbolContext(getBackColor(skinParam, style), getLineColor(skinParam, style))
-				.withStroke(new UStroke(1.5));
+				.withStroke(getStroke(style));
 	}
 
 	public final boolean isBlank() {

programming_language: Java
filename: Player.java
change_type: ModificationType.MODIFY
diff: @@ -34,11 +34,10 @@
  */
 package net.sourceforge.plantuml.timingdiagram;
 
-import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.ISkinParam;
-import net.sourceforge.plantuml.UseStyle;
 import net.sourceforge.plantuml.command.Position;
 import net.sourceforge.plantuml.cucadiagram.Display;
+import net.sourceforge.plantuml.cucadiagram.Stereotype;
 import net.sourceforge.plantuml.graphic.FontConfiguration;
 import net.sourceforge.plantuml.graphic.HorizontalAlignment;
 import net.sourceforge.plantuml.graphic.StringBounder;
@@ -49,10 +48,10 @@ import net.sourceforge.plantuml.graphic.color.Colors;
 import net.sourceforge.plantuml.style.PName;
 import net.sourceforge.plantuml.style.SName;
 import net.sourceforge.plantuml.style.Style;
+import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.StyleSignatureBasic;
 import net.sourceforge.plantuml.ugraphic.UStroke;
 import net.sourceforge.plantuml.ugraphic.color.HColor;
-import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
 
 public abstract class Player implements TimeProjected {
 
@@ -61,8 +60,10 @@ public abstract class Player implements TimeProjected {
 	private final boolean compact;
 	private final Display title;
 	protected int suggestedHeight;
+	protected final Stereotype stereotype;
 
-	public Player(String title, ISkinParam skinParam, TimingRuler ruler, boolean compact) {
+	public Player(String title, ISkinParam skinParam, TimingRuler ruler, boolean compact, Stereotype stereotype) {
+		this.stereotype = stereotype;
 		this.skinParam = skinParam;
 		this.compact = compact;
 		this.ruler = ruler;
@@ -73,23 +74,15 @@ public abstract class Player implements TimeProjected {
 		return compact;
 	}
 
-	protected abstract StyleSignatureBasic getStyleSignature();
-
-	protected abstract SymbolContext getContextLegacy();
-//	private StyleSignature getStyleSignature() {
-//		return StyleSignature.of(SName.root, SName.element, SName.timingDiagram);
-//	}
+	protected abstract StyleSignature getStyleSignature();
 
 	final protected Style getStyle() {
 		return getStyleSignature().getMergedStyle(skinParam.getCurrentStyleBuilder());
-
 	}
 
 	final protected FontConfiguration getFontConfiguration() {
-		if (UseStyle.useBetaStyle() == false)
-			return FontConfiguration.create(skinParam, FontParam.TIMING, null);
-		return FontConfiguration.create(skinParam, StyleSignatureBasic.of(SName.root, SName.element, SName.timingDiagram)
-				.getMergedStyle(skinParam.getCurrentStyleBuilder()));
+		return FontConfiguration.create(skinParam, StyleSignatureBasic
+				.of(SName.root, SName.element, SName.timingDiagram).getMergedStyle(skinParam.getCurrentStyleBuilder()));
 	}
 
 	final protected UStroke getStroke() {
@@ -98,8 +91,6 @@ public abstract class Player implements TimeProjected {
 	}
 
 	final protected SymbolContext getContext() {
-		if (UseStyle.useBetaStyle() == false)
-			return getContextLegacy();
 
 		final Style style = getStyleSignature().getMergedStyle(skinParam.getCurrentStyleBuilder());
 		final HColor lineColor = style.value(PName.LineColor).asColor(skinParam.getThemeStyle(),

programming_language: Java
filename: PlayerAnalog.java
change_type: ModificationType.MODIFY
diff: @@ -34,7 +34,6 @@
  */
 package net.sourceforge.plantuml.timingdiagram;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -43,12 +42,12 @@ import java.util.TreeMap;
 
 import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.ISkinParam;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.command.Position;
 import net.sourceforge.plantuml.cucadiagram.Display;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.HorizontalAlignment;
 import net.sourceforge.plantuml.graphic.StringBounder;
-import net.sourceforge.plantuml.graphic.SymbolContext;
 import net.sourceforge.plantuml.graphic.TextBlock;
 import net.sourceforge.plantuml.graphic.UDrawable;
 import net.sourceforge.plantuml.graphic.color.Colors;
@@ -57,9 +56,7 @@ import net.sourceforge.plantuml.style.StyleSignatureBasic;
 import net.sourceforge.plantuml.timingdiagram.graphic.IntricatedPoint;
 import net.sourceforge.plantuml.ugraphic.UGraphic;
 import net.sourceforge.plantuml.ugraphic.ULine;
-import net.sourceforge.plantuml.ugraphic.UStroke;
 import net.sourceforge.plantuml.ugraphic.UTranslate;
-import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
 
 public class PlayerAnalog extends Player {
 
@@ -71,7 +68,7 @@ public class PlayerAnalog extends Player {
 	private Integer ticksEvery;
 
 	public PlayerAnalog(String code, ISkinParam skinParam, TimingRuler ruler, boolean compact) {
-		super(code, skinParam, ruler, compact);
+		super(code, skinParam, ruler, compact, null);
 		this.suggestedHeight = 100;
 	}
 
@@ -100,11 +97,6 @@ public class PlayerAnalog extends Player {
 		return suggestedHeight;
 	}
 
-	@Override
-	protected SymbolContext getContextLegacy() {
-		return new SymbolContext(HColorUtils.COL_D7E0F2, HColorUtils.COL_038048).withStroke(new UStroke(1.5));
-	}
-
 	public IntricatedPoint getTimeProjection(StringBounder stringBounder, TimeTick tick) {
 		final double x = ruler.getPosInPixel(tick);
 		final double value = getValueAt(tick);

programming_language: Java
filename: PlayerBinary.java
change_type: ModificationType.MODIFY
diff: @@ -34,7 +34,6 @@
  */
 package net.sourceforge.plantuml.timingdiagram;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
 import java.util.ArrayList;
 import java.util.List;
@@ -46,27 +45,24 @@ import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.command.Position;
 import net.sourceforge.plantuml.cucadiagram.Display;
+import net.sourceforge.plantuml.cucadiagram.Stereotype;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.FontConfiguration;
 import net.sourceforge.plantuml.graphic.HorizontalAlignment;
 import net.sourceforge.plantuml.graphic.StringBounder;
-import net.sourceforge.plantuml.graphic.SymbolContext;
 import net.sourceforge.plantuml.graphic.TextBlock;
 import net.sourceforge.plantuml.graphic.UDrawable;
 import net.sourceforge.plantuml.graphic.color.Colors;
-import net.sourceforge.plantuml.style.PName;
 import net.sourceforge.plantuml.style.SName;
-import net.sourceforge.plantuml.style.Style;
+import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.StyleSignatureBasic;
 import net.sourceforge.plantuml.timingdiagram.graphic.IntricatedPoint;
 import net.sourceforge.plantuml.ugraphic.UGraphic;
 import net.sourceforge.plantuml.ugraphic.ULine;
-import net.sourceforge.plantuml.ugraphic.UStroke;
 import net.sourceforge.plantuml.ugraphic.UTranslate;
-import net.sourceforge.plantuml.ugraphic.color.HColor;
-import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
 
 public class PlayerBinary extends Player {
 
@@ -76,11 +72,9 @@ public class PlayerBinary extends Player {
 	private final List<TimeConstraint> constraints = new ArrayList<>();
 	private final SortedMap<TimeTick, ChangeState> values = new TreeMap<>();
 	private ChangeState initialState;
-	private final Style style;
 
-	public PlayerBinary(String code, ISkinParam skinParam, TimingRuler ruler, boolean compact) {
-		super(code, skinParam, ruler, compact);
-		this.style = getStyleSignature().getMergedStyle(skinParam.getCurrentStyleBuilder());
+	public PlayerBinary(String code, ISkinParam skinParam, TimingRuler ruler, boolean compact, Stereotype stereotype) {
+		super(code, skinParam, ruler, compact, stereotype);
 		this.suggestedHeight = 30;
 	}
 
@@ -93,23 +87,8 @@ public class PlayerBinary extends Player {
 	}
 
 	@Override
-	protected StyleSignatureBasic getStyleSignature() {
-		return StyleSignatureBasic.of(SName.root, SName.element, SName.timingDiagram, SName.binary);
-	}
-
-	@Override
-	protected SymbolContext getContextLegacy() {
-
-		if (UseStyle.useBetaStyle() == false)
-			return new SymbolContext(HColorUtils.COL_D7E0F2, HColorUtils.COL_038048).withStroke(new UStroke(2));
-
-		final HColor lineColor = style.value(PName.LineColor).asColor(skinParam.getThemeStyle(),
-				skinParam.getIHtmlColorSet());
-		final HColor backgroundColor = style.value(PName.BackGroundColor).asColor(skinParam.getThemeStyle(),
-				skinParam.getIHtmlColorSet());
-
-		return new SymbolContext(backgroundColor, lineColor).withStroke(getStroke());
-
+	protected StyleSignature getStyleSignature() {
+		return StyleSignatureBasic.of(SName.root, SName.element, SName.timingDiagram, SName.binary).withTOBECHANGED(stereotype);
 	}
 
 	public IntricatedPoint getTimeProjection(StringBounder stringBounder, TimeTick tick) {

programming_language: Java
filename: PlayerClock.java
change_type: ModificationType.MODIFY
diff: @@ -34,32 +34,25 @@
  */
 package net.sourceforge.plantuml.timingdiagram;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.math.BigDecimal;
 
-import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.ISkinParam;
-import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.command.Position;
 import net.sourceforge.plantuml.cucadiagram.Display;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
-import net.sourceforge.plantuml.graphic.FontConfiguration;
 import net.sourceforge.plantuml.graphic.StringBounder;
-import net.sourceforge.plantuml.graphic.SymbolContext;
 import net.sourceforge.plantuml.graphic.TextBlock;
 import net.sourceforge.plantuml.graphic.TextBlockUtils;
 import net.sourceforge.plantuml.graphic.UDrawable;
 import net.sourceforge.plantuml.graphic.color.Colors;
 import net.sourceforge.plantuml.style.SName;
-import net.sourceforge.plantuml.style.Style;
 import net.sourceforge.plantuml.style.StyleSignatureBasic;
 import net.sourceforge.plantuml.timingdiagram.graphic.IntricatedPoint;
 import net.sourceforge.plantuml.timingdiagram.graphic.PlayerFrame;
 import net.sourceforge.plantuml.ugraphic.UGraphic;
 import net.sourceforge.plantuml.ugraphic.ULine;
-import net.sourceforge.plantuml.ugraphic.UStroke;
 import net.sourceforge.plantuml.ugraphic.UTranslate;
-import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
 
 public class PlayerClock extends Player {
 
@@ -71,7 +64,7 @@ public class PlayerClock extends Player {
 
 	public PlayerClock(String title, ISkinParam skinParam, TimingRuler ruler, int period, int pulse, int offset,
 			boolean compact) {
-		super(title, skinParam, ruler, compact);
+		super(title, skinParam, ruler, compact, null);
 		this.displayTitle = title.length() > 0;
 		this.period = period;
 		this.pulse = pulse;
@@ -93,11 +86,6 @@ public class PlayerClock extends Player {
 		return 0;
 	}
 
-	@Override
-	protected SymbolContext getContextLegacy() {
-		return new SymbolContext(HColorUtils.COL_D7E0F2, HColorUtils.COL_038048).withStroke(new UStroke(1.5));
-	}
-
 	protected StyleSignatureBasic getStyleSignature() {
 		return StyleSignatureBasic.of(SName.root, SName.element, SName.timingDiagram, SName.clock);
 	}

programming_language: Java
filename: PlayerRobustConcise.java
change_type: ModificationType.MODIFY
diff: @@ -34,7 +34,6 @@
  */
 package net.sourceforge.plantuml.timingdiagram;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -44,16 +43,18 @@ import java.util.TreeSet;
 
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.command.Position;
 import net.sourceforge.plantuml.cucadiagram.Display;
+import net.sourceforge.plantuml.cucadiagram.Stereotype;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;
 import net.sourceforge.plantuml.graphic.StringBounder;
-import net.sourceforge.plantuml.graphic.SymbolContext;
 import net.sourceforge.plantuml.graphic.TextBlock;
 import net.sourceforge.plantuml.graphic.UDrawable;
 import net.sourceforge.plantuml.graphic.color.Colors;
 import net.sourceforge.plantuml.style.SName;
 import net.sourceforge.plantuml.style.Style;
+import net.sourceforge.plantuml.style.StyleSignature;
 import net.sourceforge.plantuml.style.StyleSignatureBasic;
 import net.sourceforge.plantuml.timingdiagram.graphic.Histogram;
 import net.sourceforge.plantuml.timingdiagram.graphic.IntricatedPoint;
@@ -75,27 +76,22 @@ public final class PlayerRobustConcise extends Player {
 	private PDrawing cached;
 	private Colors initialColors;
 
-	public PlayerRobustConcise(TimingStyle type, String full, ISkinParam skinParam, TimingRuler ruler,
-			boolean compact) {
-		super(full, skinParam, ruler, compact);
+	public PlayerRobustConcise(TimingStyle type, String full, ISkinParam skinParam, TimingRuler ruler, boolean compact,
+			Stereotype stereotype) {
+		super(full, skinParam, ruler, compact, stereotype);
 		this.type = type;
 		this.suggestedHeight = 0;
 	}
 
 	@Override
-	protected StyleSignatureBasic getStyleSignature() {
+	protected StyleSignature getStyleSignature() {
 		if (type == TimingStyle.CONCISE)
-			return StyleSignatureBasic.of(SName.root, SName.element, SName.timingDiagram, SName.concise);
+			return StyleSignatureBasic.of(SName.root, SName.element, SName.timingDiagram, SName.concise).withTOBECHANGED(stereotype);
 		if (type == TimingStyle.ROBUST)
-			return StyleSignatureBasic.of(SName.root, SName.element, SName.timingDiagram, SName.robust);
+			return StyleSignatureBasic.of(SName.root, SName.element, SName.timingDiagram, SName.robust).withTOBECHANGED(stereotype);
 		throw new IllegalStateException();
 	}
 
-	@Override
-	protected SymbolContext getContextLegacy() {
-		throw new UnsupportedOperationException();
-	}
-
 	private PDrawing buildPDrawing() {
 		final Style style = getStyleSignature().getMergedStyle(skinParam.getCurrentStyleBuilder());
 		if (type == TimingStyle.CONCISE)

programming_language: Java
filename: TimeConstraint.java
change_type: ModificationType.MODIFY
diff: @@ -34,13 +34,13 @@
  */
 package net.sourceforge.plantuml.timingdiagram;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
 import java.util.List;
 import java.util.Objects;
 
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.Display;
 import net.sourceforge.plantuml.graphic.FontConfiguration;
 import net.sourceforge.plantuml.graphic.HorizontalAlignment;

programming_language: Java
filename: TimingDiagram.java
change_type: ModificationType.MODIFY
diff: @@ -34,7 +34,6 @@
  */
 package net.sourceforge.plantuml.timingdiagram;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Rectangle2D;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -51,11 +50,13 @@ import net.sourceforge.plantuml.UmlDiagram;
 import net.sourceforge.plantuml.UmlDiagramType;
 import net.sourceforge.plantuml.UseStyle;
 import net.sourceforge.plantuml.api.ThemeStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.command.CommandExecutionResult;
 import net.sourceforge.plantuml.core.DiagramDescription;
 import net.sourceforge.plantuml.core.ImageData;
 import net.sourceforge.plantuml.core.UmlSource;
 import net.sourceforge.plantuml.cucadiagram.Display;
+import net.sourceforge.plantuml.cucadiagram.Stereotype;
 import net.sourceforge.plantuml.graphic.InnerStrategy;
 import net.sourceforge.plantuml.graphic.StringBounder;
 import net.sourceforge.plantuml.graphic.TextBlock;
@@ -296,8 +297,10 @@ public class TimingDiagram extends UmlDiagram implements Clocks {
 		throw new IllegalArgumentException();
 	}
 
-	public CommandExecutionResult createRobustConcise(String code, String full, TimingStyle type, boolean compact) {
-		final Player player = new PlayerRobustConcise(type, full, getSkinParam(), ruler, compactByDefault || compact);
+	public CommandExecutionResult createRobustConcise(String code, String full, TimingStyle type, boolean compact,
+			Stereotype stereotype) {
+		final Player player = new PlayerRobustConcise(type, full, getSkinParam(), ruler, compactByDefault || compact,
+				stereotype);
 		players.put(code, player);
 		lastPlayer = player;
 		return CommandExecutionResult.ok();
@@ -320,8 +323,8 @@ public class TimingDiagram extends UmlDiagram implements Clocks {
 		return player;
 	}
 
-	public CommandExecutionResult createBinary(String code, String full, boolean compact) {
-		final Player player = new PlayerBinary(full, getSkinParam(), ruler, compactByDefault);
+	public CommandExecutionResult createBinary(String code, String full, boolean compact, Stereotype stereotype) {
+		final Player player = new PlayerBinary(full, getSkinParam(), ruler, compactByDefault, stereotype);
 		players.put(code, player);
 		return CommandExecutionResult.ok();
 	}

programming_language: Java
filename: TimingRuler.java
change_type: ModificationType.MODIFY
diff: @@ -34,7 +34,6 @@
  */
 package net.sourceforge.plantuml.timingdiagram;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.Comparator;
@@ -46,6 +45,7 @@ import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.UseStyle;
 import net.sourceforge.plantuml.api.ThemeStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.Display;
 import net.sourceforge.plantuml.graphic.FontConfiguration;
 import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@@ -61,7 +61,6 @@ import net.sourceforge.plantuml.ugraphic.UStroke;
 import net.sourceforge.plantuml.ugraphic.UTranslate;
 import net.sourceforge.plantuml.ugraphic.color.HColor;
 import net.sourceforge.plantuml.ugraphic.color.HColorSet;
-import net.sourceforge.plantuml.ugraphic.color.HColorSimple;
 import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
 
 public class TimingRuler {

programming_language: Java
filename: CommandBinary.java
change_type: ModificationType.MODIFY
diff: @@ -43,6 +43,7 @@ import net.sourceforge.plantuml.command.regex.RegexConcat;
 import net.sourceforge.plantuml.command.regex.RegexLeaf;
 import net.sourceforge.plantuml.command.regex.RegexOptional;
 import net.sourceforge.plantuml.command.regex.RegexResult;
+import net.sourceforge.plantuml.cucadiagram.Stereotype;
 import net.sourceforge.plantuml.timingdiagram.TimingDiagram;
 
 public class CommandBinary extends SingleLineCommand2<TimingDiagram> {
@@ -60,10 +61,16 @@ public class CommandBinary extends SingleLineCommand2<TimingDiagram> {
 				new RegexLeaf("binary"), //
 				RegexLeaf.spaceOneOrMore(), //
 				new RegexLeaf("FULL", "[%g]([^%g]+)[%g]"), //
+				RegexLeaf.spaceZeroOrMore(), //
+				new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
 				RegexLeaf.spaceOneOrMore(), //
 				new RegexLeaf("as"), //
 				RegexLeaf.spaceOneOrMore(), //
-				new RegexLeaf("CODE", "([%pLN_.@]+)"), RegexLeaf.end());
+				new RegexLeaf("CODE", "([%pLN_.@]+)"), //
+				RegexLeaf.spaceZeroOrMore(), //
+				new RegexLeaf("STEREOTYPE2", "(\\<\\<.*\\>\\>)?"), //
+				RegexLeaf.spaceZeroOrMore(), //
+				RegexLeaf.end());
 	}
 
 	@Override
@@ -71,7 +78,14 @@ public class CommandBinary extends SingleLineCommand2<TimingDiagram> {
 		final String compact = arg.get("COMPACT", 0);
 		final String code = arg.get("CODE", 0);
 		final String full = arg.get("FULL", 0);
-		return diagram.createBinary(code, full, compact != null);
+
+		Stereotype stereotype = null;
+		if (arg.get("STEREOTYPE", 0) != null)
+			stereotype = Stereotype.build(arg.get("STEREOTYPE", 0));
+		else if (arg.get("STEREOTYPE2", 0) != null)
+			stereotype = Stereotype.build(arg.get("STEREOTYPE2", 0));
+
+		return diagram.createBinary(code, full, compact != null, stereotype);
 	}
 
 }

programming_language: Java
filename: CommandRobustConcise.java
change_type: ModificationType.MODIFY
diff: @@ -43,6 +43,7 @@ import net.sourceforge.plantuml.command.regex.RegexConcat;
 import net.sourceforge.plantuml.command.regex.RegexLeaf;
 import net.sourceforge.plantuml.command.regex.RegexOptional;
 import net.sourceforge.plantuml.command.regex.RegexResult;
+import net.sourceforge.plantuml.cucadiagram.Stereotype;
 import net.sourceforge.plantuml.timingdiagram.TimingDiagram;
 import net.sourceforge.plantuml.timingdiagram.TimingStyle;
 
@@ -64,9 +65,14 @@ public class CommandRobustConcise extends SingleLineCommand2<TimingDiagram> {
 						new RegexConcat( //
 								new RegexLeaf("FULL", "[%g]([^%g]+)[%g]"), //
 								RegexLeaf.spaceOneOrMore(), //
+								new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
+								RegexLeaf.spaceZeroOrMore(), //
 								new RegexLeaf("as"), //
 								RegexLeaf.spaceOneOrMore())), //
 				new RegexLeaf("CODE", "([%pLN_.@]+)"), //
+				RegexLeaf.spaceZeroOrMore(), //
+				new RegexLeaf("STEREOTYPE2", "(\\<\\<.*\\>\\>)?"), //
+				RegexLeaf.spaceZeroOrMore(), //
 				RegexLeaf.end());
 	}
 
@@ -75,11 +81,17 @@ public class CommandRobustConcise extends SingleLineCommand2<TimingDiagram> {
 		final String compact = arg.get("COMPACT", 0);
 		final String code = arg.get("CODE", 0);
 		String full = arg.get("FULL", 0);
-		if (full == null) {
+		if (full == null)
 			full = code;
-		}
+
+		Stereotype stereotype = null;
+		if (arg.get("STEREOTYPE", 0) != null)
+			stereotype = Stereotype.build(arg.get("STEREOTYPE", 0));
+		else if (arg.get("STEREOTYPE2", 0) != null)
+			stereotype = Stereotype.build(arg.get("STEREOTYPE2", 0));
+
 		final TimingStyle type = TimingStyle.valueOf(arg.get("TYPE", 0).toUpperCase());
-		return diagram.createRobustConcise(code, full, type, compact != null);
+		return diagram.createRobustConcise(code, full, type, compact != null, stereotype);
 	}
 
 }

programming_language: Java
filename: PlayerFrame.java
change_type: ModificationType.MODIFY
diff: @@ -34,10 +34,9 @@
  */
 package net.sourceforge.plantuml.timingdiagram.graphic;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
-
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.graphic.TextBlock;
 import net.sourceforge.plantuml.style.PName;
 import net.sourceforge.plantuml.style.SName;

programming_language: Java
filename: Ribbon.java
change_type: ModificationType.MODIFY
diff: @@ -34,7 +34,6 @@
  */
 package net.sourceforge.plantuml.timingdiagram.graphic;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
 import java.util.ArrayList;
 import java.util.List;
@@ -43,6 +42,7 @@ import net.sourceforge.plantuml.Dimension2DDouble;
 import net.sourceforge.plantuml.FontParam;
 import net.sourceforge.plantuml.ISkinParam;
 import net.sourceforge.plantuml.UseStyle;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.command.Position;
 import net.sourceforge.plantuml.cucadiagram.Display;
 import net.sourceforge.plantuml.graphic.AbstractTextBlock;

programming_language: Java
filename: TimeArrow.java
change_type: ModificationType.MODIFY
diff: @@ -34,10 +34,10 @@
  */
 package net.sourceforge.plantuml.timingdiagram.graphic;
 
-import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
 
 import net.sourceforge.plantuml.ISkinSimple;
+import net.sourceforge.plantuml.awt.geom.Dimension2D;
 import net.sourceforge.plantuml.cucadiagram.Display;
 import net.sourceforge.plantuml.cucadiagram.WithLinkType;
 import net.sourceforge.plantuml.graphic.FontConfiguration;

programming_language: Java
filename: UImageSvg.java
change_type: ModificationType.MODIFY
diff: @@ -55,6 +55,10 @@ public class UImageSvg implements UShape {
 		return SignatureUtils.getMD5Hex(svg);
 	}
 
+	public boolean containsXlink() {
+		return svg.contains("xmlns:xlink=\"http://www.w3.org/1999/xlink\"");
+	}
+
 	public String getSvg(boolean raw) {
 		String result = svg;
 		if (raw)

programming_language: Java
filename: HColorUtils.java
change_type: ModificationType.MODIFY
diff: @@ -119,17 +119,17 @@ public class HColorUtils {
 	}
 
 	public static HColor noGradient(HColor color) {
-		if (color instanceof HColorGradient) {
+		if (color instanceof HColorGradient)
 			return ((HColorGradient) color).getColor1();
-		}
+
 		return color;
 	}
 
 	public static UChange changeBack(UGraphic ug) {
 		final HColor color = ug.getParam().getColor();
-		if (color == null) {
+		if (color == null)
 			return new HColorNone().bg();
-		}
+
 		return color.bg();
 	}
 
@@ -140,28 +140,28 @@ public class HColorUtils {
 	}
 
 	public static boolean isTransparent(HColor back) {
-		if (back == TRANSPARENT) {
+		if (back == TRANSPARENT)
 			return true;
-		}
-		if (back instanceof HColorBackground && ((HColorBackground) back).getBack() == TRANSPARENT) {
+
+		if (back instanceof HColorBackground && ((HColorBackground) back).getBack() == TRANSPARENT)
 			return true;
-		}
-		if (back instanceof HColorSimple && ((HColorSimple) back).isTransparent()) {
+
+		if (back instanceof HColorSimple && ((HColorSimple) back).isTransparent())
 			return true;
-		}
+
 		return false;
 	}
 
 	public static HColor unlinear(HColor color1, HColor color2, int completion) {
-		if (completion == 0) {
+		if (completion == 0)
 			return color1;
-		}
-		if (completion == 100) {
+
+		if (completion == 100)
 			return color2;
-		}
-		if (color1 instanceof HColorSimple && color2 instanceof HColorSimple) {
+
+		if (color1 instanceof HColorSimple && color2 instanceof HColorSimple)
 			return HColorSimple.unlinear((HColorSimple) color1, (HColorSimple) color2, completion);
-		}
+
 		return color1;
 	}
 

programming_language: Java
filename: UPathHand.java
change_type: ModificationType.MODIFY
diff: @@ -75,11 +75,15 @@ public class UPathHand {
 				final double y = segment.getCoord()[1];
 				final HandJiggle jiggle = new HandJiggle(last.getX(), last.getY(), defaultVariation, rnd);
 				jiggle.lineTo(x, y);
-				for (USegment seg2 : jiggle.toUPath()) {
-					if (seg2.getSegmentType() == USegmentType.SEG_LINETO) {
+				for (USegment seg2 : jiggle.toUPath())
+					if (seg2.getSegmentType() == USegmentType.SEG_LINETO)
 						result.lineTo(seg2.getCoord()[0], seg2.getCoord()[1]);
-					}
-				}
+
+				last = new Point2D.Double(x, y);
+			} else if (type == USegmentType.SEG_ARCTO) {
+				final double x = segment.getCoord()[5];
+				final double y = segment.getCoord()[6];
+				result.lineTo(x, y);
 				last = new Point2D.Double(x, y);
 			} else {
 				this.path = source;

programming_language: Java
filename: Version.java
change_type: ModificationType.MODIFY
diff: @@ -44,7 +44,7 @@ public class Version {
 	private static final int MAJOR_SEPARATOR = 1000000;
 
 	public static int version() {
-		return 1202204;
+		return 1202205;
 	}
 
 	public static int versionPatched() {
@@ -80,7 +80,7 @@ public class Version {
 	}
 
 	public static int beta() {
-		final int beta = 1;
+		final int beta = 0;
 		return beta;
 	}
 
@@ -93,7 +93,7 @@ public class Version {
 	}
 
 	public static long compileTime() {
-		return 1649510957985L;
+		return 1651316152000L;
 	}
 
 	public static String compileTimeString() {

programming_language: Java
filename: classy-c4-dex.repx
change_type: ModificationType.ADD
diff: @@ -0,0 +1 @@
+;
\ No newline at end of file

programming_language: SQL
filename: classy-dex.repx
change_type: ModificationType.ADD
diff: @@ -0,0 +1 @@
+;
\ No newline at end of file

programming_language: SQL
filename: domainstory-dex.repx
change_type: ModificationType.ADD
diff: @@ -0,0 +1 @@
+;
\ No newline at end of file

programming_language: SQL
filename: home.repx
change_type: ModificationType.MODIFY
diff: @@ -1,14 +1,17 @@
-azure
+archimate
 aws
 awslib
+azure
+c4
+classy
+classy-c4
 cloudinsight
 cloudogu
-tupadr3
+domainstory
+elastic
+kubernetes
+logos
 material
 office
-c4
 osa
-kubernetes
-logos
-elastic
-archimate
\ No newline at end of file
+tupadr3

programming_language: Batchfile