Merge pull request #1384 from alixander/dagre-container

improve skewed container-container dagre layouts
This commit is contained in:
Alexander Wang 2023-06-08 18:59:32 -07:00 committed by GitHub
commit 0fbcf48d7c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 1749 additions and 632 deletions

View file

@ -18,6 +18,7 @@
- Common invalid array separator `,` usage in class arrays returns a helpful error message [#1376](https://github.com/terrastruct/d2/pull/1376)
- Invalid `constraint` usage is met with an error message, preventing a common mistake of omitting `shape: sql_table` [#1379](https://github.com/terrastruct/d2/pull/1379)
- Connections now stop at all outside labels. [#1381](https://github.com/terrastruct/d2/pull/1381)
- Container connections in `dagre` are more balanced [#1384](https://github.com/terrastruct/d2/pull/1384)
#### Bugfixes ⛑️

View file

@ -544,22 +544,7 @@ func getEdgeEndpoints(g *d2graph.Graph, edge *d2graph.Edge) (*d2graph.Object, *d
}
dst := edge.Dst
for len(dst.Children) > 0 && dst.Class == nil && dst.SQLTable == nil {
dst = dst.ChildrenArray[0]
// We want to get the top node of destinations
for _, child := range dst.ChildrenArray {
isHead := true
for _, e := range g.Edges {
if inContainer(e.Src, child) != nil && inContainer(e.Dst, dst) != nil {
isHead = false
break
}
}
if isHead {
dst = child
break
}
}
dst = getLongestEdgeChainHead(g, dst)
}
if edge.SrcArrow && !edge.DstArrow {
// for `b <- a`, edge.Edge is `a -> b` and we expect this routing result
@ -607,8 +592,73 @@ func generateAddEdgeLine(fromID, toID, edgeID string, width, height int) string
return fmt.Sprintf("g.setEdge({v:`%s`, w:`%s`, name:`%s`}, { width:%d, height:%d, labelpos: `c` });\n", escapeID(fromID), escapeID(toID), escapeID(edgeID), width, height)
}
// getLongestEdgeChainHead finds the longest chain in a container and gets its head
// If there are multiple chains of the same length, get the head closest to the center
func getLongestEdgeChainHead(g *d2graph.Graph, container *d2graph.Object) *d2graph.Object {
rank := make(map[*d2graph.Object]int)
chainLength := make(map[*d2graph.Object]int)
for _, obj := range container.ChildrenArray {
isHead := true
for _, e := range g.Edges {
if inContainer(e.Src, container) != nil && inContainer(e.Dst, obj) != nil {
isHead = false
break
}
}
if !isHead {
continue
}
rank[obj] = 1
chainLength[obj] = 1
// BFS
queue := []*d2graph.Object{obj}
visited := make(map[*d2graph.Object]struct{})
for len(queue) > 0 {
curr := queue[0]
queue = queue[1:]
if _, ok := visited[curr]; ok {
continue
}
visited[curr] = struct{}{}
for _, e := range g.Edges {
child := inContainer(e.Dst, container)
if child == curr {
continue
}
if child != nil && inContainer(e.Src, curr) != nil {
if rank[curr]+1 > rank[child] {
rank[child] = rank[curr] + 1
chainLength[obj] = go2.Max(chainLength[obj], rank[child])
}
queue = append(queue, child)
}
}
}
}
max := int(math.MinInt32)
for _, obj := range container.ChildrenArray {
if chainLength[obj] > max {
max = chainLength[obj]
}
}
var heads []*d2graph.Object
for i, obj := range container.ChildrenArray {
if rank[obj] == 1 && chainLength[obj] == max {
heads = append(heads, container.ChildrenArray[i])
}
}
if len(heads) > 0 {
return heads[int(math.Floor(float64(len(heads))/2.0))]
}
return container.ChildrenArray[0]
}
// getLongestEdgeChainTail gets the node at the end of the longest edge chain, because that will be the end of the container
// and is what external connections should connect with
// and is what external connections should connect with.
// If there are multiple of same length, get the one closest to the middle
func getLongestEdgeChainTail(g *d2graph.Graph, container *d2graph.Object) *d2graph.Object {
rank := make(map[*d2graph.Object]int)
@ -647,14 +697,20 @@ func getLongestEdgeChainTail(g *d2graph.Graph, container *d2graph.Object) *d2gra
}
}
max := int(math.MinInt32)
var tail *d2graph.Object
for _, obj := range container.ChildrenArray {
if rank[obj] >= max {
if rank[obj] > max {
max = rank[obj]
tail = obj
}
}
return tail
var tails []*d2graph.Object
for i, obj := range container.ChildrenArray {
if rank[obj] == max {
tails = append(tails, container.ChildrenArray[i])
}
}
return tails[int(math.Floor(float64(len(tails))/2.0))]
}
func inContainer(obj, container *d2graph.Object) *d2graph.Object {

View file

@ -2316,6 +2316,23 @@ Listen <-> Talk: {
target-arrowhead.shape: diamond
label: hear
}
`,
},
{
name: "dagre-container",
script: `a: {
a
b
c
}
b: {
a
b
c
}
a -> b
`,
},
{

View file

@ -10,7 +10,7 @@
"x": 0,
"y": 41
},
"width": 1221,
"width": 1175,
"height": 125,
"opacity": 1,
"strokeDash": 0,
@ -294,10 +294,10 @@
"id": "osvc",
"type": "rectangle",
"pos": {
"x": 796,
"x": 406,
"y": 328
},
"width": 415,
"width": 455,
"height": 125,
"opacity": 1,
"strokeDash": 0,
@ -335,7 +335,7 @@
"id": "osvc.vm1",
"type": "rectangle",
"pos": {
"x": 916,
"x": 446,
"y": 357
},
"width": 76,
@ -376,7 +376,7 @@
"id": "osvc.vm2",
"type": "rectangle",
"pos": {
"x": 1094,
"x": 645,
"y": 357
},
"width": 76,
@ -440,19 +440,19 @@
"labelPercentage": 0,
"route": [
{
"x": 854.75,
"x": 532.5,
"y": 166
},
{
"x": 854.75,
"x": 532.5,
"y": 214.39999389648438
},
{
"x": 854.75,
"x": 532.5,
"y": 246.89999389648438
},
{
"x": 854.75,
"x": 532.5,
"y": 328.5
}
],
@ -487,19 +487,19 @@
"labelPercentage": 0,
"route": [
{
"x": 956.75,
"x": 634.5,
"y": 166
},
{
"x": 956.75,
"x": 634.5,
"y": 214.39999389648438
},
{
"x": 956.75,
"x": 634.5,
"y": 238.6999969482422
},
{
"x": 956.75,
"x": 634.5,
"y": 287.5
}
],
@ -534,20 +534,20 @@
"labelPercentage": 0,
"route": [
{
"x": 1052.75,
"x": 730.5,
"y": 166
},
{
"x": 1052.75,
"x": 730.5,
"y": 214.39999389648438
},
{
"x": 1052.75,
"y": 238.6999969482422
"x": 730.5,
"y": 246.89999389648438
},
{
"x": 1052.75,
"y": 287.5
"x": 730.5,
"y": 328.5
}
],
"isCurve": true,
@ -581,19 +581,19 @@
"labelPercentage": 0,
"route": [
{
"x": 1157,
"x": 811.5,
"y": 166
},
{
"x": 1157,
"x": 811.5,
"y": 214.39999389648438
},
{
"x": 1157,
"x": 811.5,
"y": 246.89999389648438
},
{
"x": 1157,
"x": 811.5,
"y": 328.5
}
],

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View file

@ -10,7 +10,7 @@
"x": 0,
"y": 41
},
"width": 834,
"width": 813,
"height": 1314,
"opacity": 1,
"strokeDash": 0,
@ -51,7 +51,7 @@
"x": 20,
"y": 106
},
"width": 595,
"width": 574,
"height": 1219,
"opacity": 1,
"strokeDash": 0,
@ -92,7 +92,7 @@
"x": 40,
"y": 721
},
"width": 421,
"width": 343,
"height": 572,
"opacity": 1,
"strokeDash": 0,
@ -130,10 +130,10 @@
"id": "aa.bb.cc.dd",
"type": "rectangle",
"pos": {
"x": 60,
"x": 62,
"y": 782
},
"width": 223,
"width": 213,
"height": 140,
"opacity": 1,
"strokeDash": 0,
@ -171,7 +171,7 @@
"id": "aa.bb.cc.dd.ee",
"type": "text",
"pos": {
"x": 110,
"x": 102,
"y": 842
},
"width": 16,
@ -211,7 +211,7 @@
"id": "aa.bb.cc.dd.ff",
"type": "rectangle",
"pos": {
"x": 186,
"x": 178,
"y": 819
},
"width": 57,
@ -252,7 +252,7 @@
"id": "aa.bb.cc.gg",
"type": "text",
"pos": {
"x": 187,
"x": 171,
"y": 1043
},
"width": 17,
@ -292,7 +292,7 @@
"id": "aa.bb.cc.hh",
"type": "rectangle",
"pos": {
"x": 334,
"x": 177,
"y": 1189
},
"width": 63,
@ -333,10 +333,10 @@
"id": "aa.bb.ii",
"type": "package",
"pos": {
"x": 52,
"x": 140,
"y": 169
},
"width": 497,
"width": 434,
"height": 161,
"opacity": 1,
"strokeDash": 0,
@ -374,7 +374,7 @@
"id": "aa.bb.ii.jj",
"type": "diamond",
"pos": {
"x": 458,
"x": 434,
"y": 204
},
"width": 50,
@ -415,7 +415,7 @@
"id": "aa.bb.kk",
"type": "oval",
"pos": {
"x": 501,
"x": 451,
"y": 1169
},
"width": 74,
@ -456,7 +456,7 @@
"id": "aa.ll",
"type": "rectangle",
"pos": {
"x": 698,
"x": 676,
"y": 772
},
"width": 54,
@ -497,7 +497,7 @@
"id": "aa.mm",
"type": "cylinder",
"pos": {
"x": 689,
"x": 667,
"y": 433
},
"width": 71,
@ -538,7 +538,7 @@
"id": "aa.nn",
"type": "text",
"pos": {
"x": 655,
"x": 633,
"y": 1178
},
"width": 16,
@ -578,7 +578,7 @@
"id": "aa.oo",
"type": "rectangle",
"pos": {
"x": 731,
"x": 709,
"y": 1155
},
"width": 63,
@ -642,20 +642,20 @@
"labelPercentage": 0,
"route": [
{
"x": 118,
"x": 109.75,
"y": 863.5
},
{
"x": 118,
"x": 109.75,
"y": 910.2999877929688
},
{
"x": 131.8000030517578,
"y": 995.0999755859375
"x": 121.94999694824219,
"y": 994.9000244140625
},
{
"x": 187,
"y": 1045.5
"x": 170.75,
"y": 1044.5
}
],
"isCurve": true,
@ -689,20 +689,20 @@
"labelPercentage": 0,
"route": [
{
"x": 195.5,
"x": 179.75,
"y": 1064
},
{
"x": 195.5,
"x": 179.75,
"y": 1112.4000244140625
},
{
"x": 223.3000030517578,
"y": 1140.300048828125
"x": 183.5500030517578,
"y": 1137.5
},
{
"x": 334.5,
"y": 1203.5
"x": 198.75,
"y": 1189.5
}
],
"isCurve": true,
@ -736,43 +736,43 @@
"labelPercentage": 0,
"route": [
{
"x": 104,
"x": 192,
"y": 331
},
{
"x": 104,
"x": 192.1999969482422,
"y": 379
},
{
"x": 104,
"x": 192.25,
"y": 414.8999938964844
},
{
"x": 104,
"x": 192.25,
"y": 450.75
},
{
"x": 104,
"x": 192.25,
"y": 486.6000061035156
},
{
"x": 104,
"x": 192.25,
"y": 534.4000244140625
},
{
"x": 104,
"x": 192.25,
"y": 570.25
},
{
"x": 104,
"x": 192.25,
"y": 606.0999755859375
},
{
"x": 104,
"x": 192.25,
"y": 708.7999877929688
},
{
"x": 104,
"x": 192.25,
"y": 782
}
],
@ -807,12 +807,12 @@
"labelPercentage": 0,
"route": [
{
"x": 697.5,
"y": 811.427978515625
"x": 675.75,
"y": 796.2960205078125
},
{
"x": 614.5,
"y": 865.427978515625
"x": 593.75,
"y": 804.2960205078125
}
],
"animated": false,
@ -845,19 +845,19 @@
"labelPercentage": 0,
"route": [
{
"x": 689,
"y": 500
"x": 667,
"y": 502
},
{
"x": 290.20001220703125,
"y": 589.5999755859375
"x": 317.79901123046875,
"y": 590
},
{
"x": 190.5,
"x": 230.5,
"y": 634
},
{
"x": 190.5,
"x": 230.5,
"y": 722
}
],
@ -892,31 +892,31 @@
"labelPercentage": 0,
"route": [
{
"x": 725,
"x": 703,
"y": 552
},
{
"x": 724.5999755859375,
"x": 702.7999877929688,
"y": 600
},
{
"x": 724.5,
"x": 702.75,
"y": 624.0999755859375
},
{
"x": 724.5,
"x": 702.75,
"y": 642.25
},
{
"x": 724.5,
"x": 702.75,
"y": 660.4000244140625
},
{
"x": 724.5,
"x": 702.75,
"y": 732.5
},
{
"x": 724.5,
"x": 702.75,
"y": 772.5
}
],
@ -951,12 +951,12 @@
"labelPercentage": 0,
"route": [
{
"x": 689,
"y": 505
"x": 667,
"y": 464
},
{
"x": 615,
"y": 566.9949951171875
"x": 594.25,
"y": 441.12298583984375
}
],
"animated": false,
@ -989,20 +989,20 @@
"labelPercentage": 0,
"route": [
{
"x": 697.5,
"y": 810.8159790039062
"x": 675.75,
"y": 810.9920043945312
},
{
"x": 381.8999938964844,
"y": 872.9630126953125
"x": 370.95001220703125,
"y": 872.9979858398438
},
{
"x": 283.20001220703125,
"y": 968.7000122070312
"x": 273.45001220703125,
"y": 968.8499755859375
},
{
"x": 204,
"y": 1047.5
"x": 188.25,
"y": 1048.251953125
}
],
"isCurve": true,
@ -1036,19 +1036,19 @@
"labelPercentage": 0,
"route": [
{
"x": 689,
"y": 473
"x": 667,
"y": 472
},
{
"x": 545,
"y": 393
"x": 531.2000122070312,
"y": 392.79998779296875
},
{
"x": 509,
"x": 497.20001220703125,
"y": 364.6000061035156
},
{
"x": 509,
"x": 497,
"y": 331
}
],
@ -1083,12 +1083,12 @@
"labelPercentage": 0,
"route": [
{
"x": 461,
"y": 896.5
"x": 383,
"y": 895.5
},
{
"x": 697.5,
"y": 812.9320068359375
"x": 675.75,
"y": 811.5599975585938
}
],
"animated": false,
@ -1121,56 +1121,56 @@
"labelPercentage": 0,
"route": [
{
"x": 481,
"x": 403,
"y": 331
},
{
"x": 481,
"x": 402.79998779296875,
"y": 364.6000061035156
},
{
"x": 481,
"x": 402.75,
"y": 396.8999938964844
},
{
"x": 481,
"x": 402.75,
"y": 432.75
},
{
"x": 481,
"x": 402.75,
"y": 468.6000061035156
},
{
"x": 481,
"x": 402.75,
"y": 516.4000244140625
},
{
"x": 481,
"x": 402.75,
"y": 552.25
},
{
"x": 481,
"x": 402.75,
"y": 588.0999755859375
},
{
"x": 481,
"x": 402.75,
"y": 624.0999755859375
},
{
"x": 481,
"x": 402.75,
"y": 642.25
},
{
"x": 481,
"x": 402.75,
"y": 660.4000244140625
},
{
"x": 524.2999877929688,
"y": 737.2589721679688
"x": 457.3500061035156,
"y": 737.6060180664062
},
{
"x": 697.5,
"y": 796.2960205078125
"x": 675.75,
"y": 798.030029296875
}
],
"isCurve": true,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

View file

@ -7,7 +7,7 @@
"id": "a",
"type": "rectangle",
"pos": {
"x": 276,
"x": 40,
"y": 0
},
"width": 53,
@ -48,10 +48,10 @@
"id": "g",
"type": "rectangle",
"pos": {
"x": 193,
"x": 0,
"y": 207
},
"width": 177,
"width": 133,
"height": 657,
"opacity": 1,
"strokeDash": 0,
@ -89,7 +89,7 @@
"id": "g.b",
"type": "rectangle",
"pos": {
"x": 276,
"x": 40,
"y": 236
},
"width": 53,
@ -130,7 +130,7 @@
"id": "d",
"type": "rectangle",
"pos": {
"x": 0,
"x": 153,
"y": 423
},
"width": 173,
@ -171,7 +171,7 @@
"id": "d.h",
"type": "rectangle",
"pos": {
"x": 20,
"x": 173,
"y": 488
},
"width": 133,
@ -212,7 +212,7 @@
"id": "d.h.c",
"type": "rectangle",
"pos": {
"x": 60,
"x": 213,
"y": 520
},
"width": 53,
@ -253,7 +253,7 @@
"id": "g.e",
"type": "rectangle",
"pos": {
"x": 233,
"x": 40,
"y": 768
},
"width": 53,
@ -294,7 +294,7 @@
"id": "f",
"type": "rectangle",
"pos": {
"x": 267,
"x": 41,
"y": 964
},
"width": 51,
@ -358,19 +358,19 @@
"labelPercentage": 0,
"route": [
{
"x": 302.75,
"x": 66.5,
"y": 66
},
{
"x": 302.75,
"x": 66.5,
"y": 106
},
{
"x": 302.75,
"x": 66.5,
"y": 180.10000610351562
},
{
"x": 302.75,
"x": 66.5,
"y": 236.5
}
],
@ -405,32 +405,32 @@
"labelPercentage": 0,
"route": [
{
"x": 280.2860107421875,
"x": 66.5,
"y": 302.5
},
{
"x": 253.0570068359375,
"x": 66.5,
"y": 326.1000061035156
},
{
"x": 246.25,
"x": 66.5,
"y": 342
},
{
"x": 246.25,
"x": 66.5,
"y": 357
},
{
"x": 246.25,
"x": 66.5,
"y": 372
},
{
"x": 219.64999389648438,
"y": 453.5
"x": 95.9000015258789,
"y": 453.70001220703125
},
{
"x": 113.25,
"y": 539.5
"x": 213.5,
"y": 540.5
}
],
"isCurve": true,
@ -464,19 +464,19 @@
"labelPercentage": 0,
"route": [
{
"x": 73.25,
"x": 226.25,
"y": 648
},
{
"x": 203.64999389648438,
"x": 79.8499984741211,
"y": 688
},
{
"x": 239.0500030517578,
"x": 46.04999923706055,
"y": 712.0999755859375
},
{
"x": 250.25,
"x": 57.25,
"y": 768.5
}
],
@ -511,19 +511,19 @@
"labelPercentage": 0,
"route": [
{
"x": 259.5,
"x": 61.23099899291992,
"y": 834.5
},
{
"x": 259.5,
"x": 54.84600067138672,
"y": 858.0999755859375
},
{
"x": 263.5,
"x": 54.849998474121094,
"y": 924
},
{
"x": 279.5,
"x": 61.25,
"y": 964
}
],
@ -558,19 +558,19 @@
"labelPercentage": 0,
"route": [
{
"x": 305.968994140625,
"x": 75.74299621582031,
"y": 964
},
{
"x": 321.9930114746094,
"x": 86.947998046875,
"y": 924
},
{
"x": 326,
"x": 89.75,
"y": 904
},
{
"x": 326,
"x": 89.75,
"y": 864
}
],
@ -605,19 +605,19 @@
"labelPercentage": 0,
"route": [
{
"x": 192.75,
"y": 713
"x": 132.75,
"y": 726
},
{
"x": 126.3499984741211,
"y": 661
"x": 236.75,
"y": 663.5999755859375
},
{
"x": 109.75,
"x": 262.75,
"y": 642.0999755859375
},
{
"x": 109.75,
"x": 262.75,
"y": 618.5
}
],

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -0,0 +1,424 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{
"id": "a",
"type": "rectangle",
"pos": {
"x": 0,
"y": 41
},
"width": 359,
"height": 125,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B4",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "a",
"fontSize": 28,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 12,
"labelHeight": 36,
"labelPosition": "OUTSIDE_TOP_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "a.a",
"type": "rectangle",
"pos": {
"x": 40,
"y": 70
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B5",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "a",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 2
},
{
"id": "a.b",
"type": "rectangle",
"pos": {
"x": 153,
"y": 70
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B5",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "b",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 2
},
{
"id": "a.c",
"type": "rectangle",
"pos": {
"x": 266,
"y": 70
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B5",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "c",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 2
},
{
"id": "b",
"type": "rectangle",
"pos": {
"x": 0,
"y": 307
},
"width": 359,
"height": 125,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B4",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "b",
"fontSize": 28,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 13,
"labelHeight": 36,
"labelPosition": "OUTSIDE_TOP_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "b.a",
"type": "rectangle",
"pos": {
"x": 40,
"y": 336
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B5",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "a",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 2
},
{
"id": "b.b",
"type": "rectangle",
"pos": {
"x": 153,
"y": 336
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B5",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "b",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 2
},
{
"id": "b.c",
"type": "rectangle",
"pos": {
"x": 266,
"y": 336
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B5",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "c",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 2
}
],
"connections": [
{
"id": "(a -> b)[0]",
"src": "a",
"srcArrow": "none",
"dst": "b",
"dstArrow": "triangle",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "B1",
"borderRadius": 10,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N2",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "",
"labelPercentage": 0,
"route": [
{
"x": 179.5,
"y": 166
},
{
"x": 179.5,
"y": 206
},
{
"x": 179.5,
"y": 226
},
{
"x": 179.5,
"y": 266
}
],
"isCurve": true,
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 0
}
],
"root": {
"id": "",
"type": "",
"pos": {
"x": 0,
"y": 0
},
"width": 0,
"height": 0,
"opacity": 0,
"strokeDash": 0,
"strokeWidth": 0,
"borderRadius": 0,
"fill": "N7",
"stroke": "",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"zIndex": 0,
"level": 0
}
}

View file

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" d2Version="v0.4.2-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 361 433"><svg id="d2-svg" class="d2-1667188102" width="361" height="433" viewBox="-1 0 361 433"><rect x="-1.000000" y="0.000000" width="361.000000" height="433.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-1667188102 .text {
font-family: "d2-1667188102-font-regular";
}
@font-face {
font-family: d2-1667188102-font-regular;
src: url("data:application/font-woff;base64,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");
}
.d2-1667188102 .text-bold {
font-family: "d2-1667188102-font-bold";
}
@font-face {
font-family: d2-1667188102-font-bold;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-1667188102 .fill-N1{fill:#0A0F25;}
.d2-1667188102 .fill-N2{fill:#676C7E;}
.d2-1667188102 .fill-N3{fill:#9499AB;}
.d2-1667188102 .fill-N4{fill:#CFD2DD;}
.d2-1667188102 .fill-N5{fill:#DEE1EB;}
.d2-1667188102 .fill-N6{fill:#EEF1F8;}
.d2-1667188102 .fill-N7{fill:#FFFFFF;}
.d2-1667188102 .fill-B1{fill:#0D32B2;}
.d2-1667188102 .fill-B2{fill:#0D32B2;}
.d2-1667188102 .fill-B3{fill:#E3E9FD;}
.d2-1667188102 .fill-B4{fill:#E3E9FD;}
.d2-1667188102 .fill-B5{fill:#EDF0FD;}
.d2-1667188102 .fill-B6{fill:#F7F8FE;}
.d2-1667188102 .fill-AA2{fill:#4A6FF3;}
.d2-1667188102 .fill-AA4{fill:#EDF0FD;}
.d2-1667188102 .fill-AA5{fill:#F7F8FE;}
.d2-1667188102 .fill-AB4{fill:#EDF0FD;}
.d2-1667188102 .fill-AB5{fill:#F7F8FE;}
.d2-1667188102 .stroke-N1{stroke:#0A0F25;}
.d2-1667188102 .stroke-N2{stroke:#676C7E;}
.d2-1667188102 .stroke-N3{stroke:#9499AB;}
.d2-1667188102 .stroke-N4{stroke:#CFD2DD;}
.d2-1667188102 .stroke-N5{stroke:#DEE1EB;}
.d2-1667188102 .stroke-N6{stroke:#EEF1F8;}
.d2-1667188102 .stroke-N7{stroke:#FFFFFF;}
.d2-1667188102 .stroke-B1{stroke:#0D32B2;}
.d2-1667188102 .stroke-B2{stroke:#0D32B2;}
.d2-1667188102 .stroke-B3{stroke:#E3E9FD;}
.d2-1667188102 .stroke-B4{stroke:#E3E9FD;}
.d2-1667188102 .stroke-B5{stroke:#EDF0FD;}
.d2-1667188102 .stroke-B6{stroke:#F7F8FE;}
.d2-1667188102 .stroke-AA2{stroke:#4A6FF3;}
.d2-1667188102 .stroke-AA4{stroke:#EDF0FD;}
.d2-1667188102 .stroke-AA5{stroke:#F7F8FE;}
.d2-1667188102 .stroke-AB4{stroke:#EDF0FD;}
.d2-1667188102 .stroke-AB5{stroke:#F7F8FE;}
.d2-1667188102 .background-color-N1{background-color:#0A0F25;}
.d2-1667188102 .background-color-N2{background-color:#676C7E;}
.d2-1667188102 .background-color-N3{background-color:#9499AB;}
.d2-1667188102 .background-color-N4{background-color:#CFD2DD;}
.d2-1667188102 .background-color-N5{background-color:#DEE1EB;}
.d2-1667188102 .background-color-N6{background-color:#EEF1F8;}
.d2-1667188102 .background-color-N7{background-color:#FFFFFF;}
.d2-1667188102 .background-color-B1{background-color:#0D32B2;}
.d2-1667188102 .background-color-B2{background-color:#0D32B2;}
.d2-1667188102 .background-color-B3{background-color:#E3E9FD;}
.d2-1667188102 .background-color-B4{background-color:#E3E9FD;}
.d2-1667188102 .background-color-B5{background-color:#EDF0FD;}
.d2-1667188102 .background-color-B6{background-color:#F7F8FE;}
.d2-1667188102 .background-color-AA2{background-color:#4A6FF3;}
.d2-1667188102 .background-color-AA4{background-color:#EDF0FD;}
.d2-1667188102 .background-color-AA5{background-color:#F7F8FE;}
.d2-1667188102 .background-color-AB4{background-color:#EDF0FD;}
.d2-1667188102 .background-color-AB5{background-color:#F7F8FE;}
.d2-1667188102 .color-N1{color:#0A0F25;}
.d2-1667188102 .color-N2{color:#676C7E;}
.d2-1667188102 .color-N3{color:#9499AB;}
.d2-1667188102 .color-N4{color:#CFD2DD;}
.d2-1667188102 .color-N5{color:#DEE1EB;}
.d2-1667188102 .color-N6{color:#EEF1F8;}
.d2-1667188102 .color-N7{color:#FFFFFF;}
.d2-1667188102 .color-B1{color:#0D32B2;}
.d2-1667188102 .color-B2{color:#0D32B2;}
.d2-1667188102 .color-B3{color:#E3E9FD;}
.d2-1667188102 .color-B4{color:#E3E9FD;}
.d2-1667188102 .color-B5{color:#EDF0FD;}
.d2-1667188102 .color-B6{color:#F7F8FE;}
.d2-1667188102 .color-AA2{color:#4A6FF3;}
.d2-1667188102 .color-AA4{color:#EDF0FD;}
.d2-1667188102 .color-AA5{color:#F7F8FE;}
.d2-1667188102 .color-AB4{color:#EDF0FD;}
.d2-1667188102 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g id="a"><g class="shape" ><rect x="0.000000" y="41.000000" width="359.000000" height="125.000000" class=" stroke-B1 fill-B4" style="stroke-width:2;" /></g><text x="179.500000" y="28.000000" class="text fill-N1" style="text-anchor:middle;font-size:28px">a</text></g><g id="b"><g class="shape" ><rect x="0.000000" y="307.000000" width="359.000000" height="125.000000" class=" stroke-B1 fill-B4" style="stroke-width:2;" /></g><text x="179.500000" y="294.000000" class="text fill-N1" style="text-anchor:middle;font-size:28px">b</text></g><g id="a.a"><g class="shape" ><rect x="40.000000" y="70.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="66.500000" y="108.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="a.b"><g class="shape" ><rect x="153.000000" y="70.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="179.500000" y="108.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="a.c"><g class="shape" ><rect x="266.000000" y="70.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="292.500000" y="108.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">c</text></g><g id="b.a"><g class="shape" ><rect x="40.000000" y="336.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="66.500000" y="374.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="b.b"><g class="shape" ><rect x="153.000000" y="336.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="179.500000" y="374.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="b.c"><g class="shape" ><rect x="266.000000" y="336.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="292.500000" y="374.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">c</text></g><g id="(a -&gt; b)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 179.500000 168.000000 C 179.500000 206.000000 179.500000 226.000000 179.500000 262.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1667188102)" /></g><mask id="d2-1667188102" maskUnits="userSpaceOnUse" x="-1" y="0" width="361" height="433">
<rect x="-1" y="0" width="361" height="433" fill="white"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -0,0 +1,415 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{
"id": "a",
"type": "rectangle",
"pos": {
"x": 12,
"y": 12
},
"width": 299,
"height": 166,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B4",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "a",
"fontSize": 28,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 12,
"labelHeight": 36,
"labelPosition": "INSIDE_TOP_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "a.a",
"type": "rectangle",
"pos": {
"x": 62,
"y": 62
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B5",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "a",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 2
},
{
"id": "a.b",
"type": "rectangle",
"pos": {
"x": 135,
"y": 62
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B5",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "b",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 2
},
{
"id": "a.c",
"type": "rectangle",
"pos": {
"x": 208,
"y": 62
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B5",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "c",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 2
},
{
"id": "b",
"type": "rectangle",
"pos": {
"x": 12,
"y": 248
},
"width": 299,
"height": 166,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B4",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "b",
"fontSize": 28,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 13,
"labelHeight": 36,
"labelPosition": "INSIDE_TOP_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "b.a",
"type": "rectangle",
"pos": {
"x": 62,
"y": 298
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B5",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "a",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 2
},
{
"id": "b.b",
"type": "rectangle",
"pos": {
"x": 135,
"y": 298
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B5",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "b",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 2
},
{
"id": "b.c",
"type": "rectangle",
"pos": {
"x": 208,
"y": 298
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B5",
"stroke": "B1",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "c",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 2
}
],
"connections": [
{
"id": "(a -> b)[0]",
"src": "a",
"srcArrow": "none",
"dst": "b",
"dstArrow": "triangle",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "B1",
"borderRadius": 10,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N2",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "",
"labelPercentage": 0,
"route": [
{
"x": 161.5,
"y": 178
},
{
"x": 161.5,
"y": 248
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 0
}
],
"root": {
"id": "",
"type": "",
"pos": {
"x": 0,
"y": 0
},
"width": 0,
"height": 0,
"opacity": 0,
"strokeDash": 0,
"strokeWidth": 0,
"borderRadius": 0,
"fill": "N7",
"stroke": "",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"zIndex": 0,
"level": 0
}
}

View file

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" d2Version="v0.4.2-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 301 404"><svg id="d2-svg" class="d2-2957004972" width="301" height="404" viewBox="11 11 301 404"><rect x="11.000000" y="11.000000" width="301.000000" height="404.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-2957004972 .text {
font-family: "d2-2957004972-font-regular";
}
@font-face {
font-family: d2-2957004972-font-regular;
src: url("data:application/font-woff;base64,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");
}
.d2-2957004972 .text-bold {
font-family: "d2-2957004972-font-bold";
}
@font-face {
font-family: d2-2957004972-font-bold;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-2957004972 .fill-N1{fill:#0A0F25;}
.d2-2957004972 .fill-N2{fill:#676C7E;}
.d2-2957004972 .fill-N3{fill:#9499AB;}
.d2-2957004972 .fill-N4{fill:#CFD2DD;}
.d2-2957004972 .fill-N5{fill:#DEE1EB;}
.d2-2957004972 .fill-N6{fill:#EEF1F8;}
.d2-2957004972 .fill-N7{fill:#FFFFFF;}
.d2-2957004972 .fill-B1{fill:#0D32B2;}
.d2-2957004972 .fill-B2{fill:#0D32B2;}
.d2-2957004972 .fill-B3{fill:#E3E9FD;}
.d2-2957004972 .fill-B4{fill:#E3E9FD;}
.d2-2957004972 .fill-B5{fill:#EDF0FD;}
.d2-2957004972 .fill-B6{fill:#F7F8FE;}
.d2-2957004972 .fill-AA2{fill:#4A6FF3;}
.d2-2957004972 .fill-AA4{fill:#EDF0FD;}
.d2-2957004972 .fill-AA5{fill:#F7F8FE;}
.d2-2957004972 .fill-AB4{fill:#EDF0FD;}
.d2-2957004972 .fill-AB5{fill:#F7F8FE;}
.d2-2957004972 .stroke-N1{stroke:#0A0F25;}
.d2-2957004972 .stroke-N2{stroke:#676C7E;}
.d2-2957004972 .stroke-N3{stroke:#9499AB;}
.d2-2957004972 .stroke-N4{stroke:#CFD2DD;}
.d2-2957004972 .stroke-N5{stroke:#DEE1EB;}
.d2-2957004972 .stroke-N6{stroke:#EEF1F8;}
.d2-2957004972 .stroke-N7{stroke:#FFFFFF;}
.d2-2957004972 .stroke-B1{stroke:#0D32B2;}
.d2-2957004972 .stroke-B2{stroke:#0D32B2;}
.d2-2957004972 .stroke-B3{stroke:#E3E9FD;}
.d2-2957004972 .stroke-B4{stroke:#E3E9FD;}
.d2-2957004972 .stroke-B5{stroke:#EDF0FD;}
.d2-2957004972 .stroke-B6{stroke:#F7F8FE;}
.d2-2957004972 .stroke-AA2{stroke:#4A6FF3;}
.d2-2957004972 .stroke-AA4{stroke:#EDF0FD;}
.d2-2957004972 .stroke-AA5{stroke:#F7F8FE;}
.d2-2957004972 .stroke-AB4{stroke:#EDF0FD;}
.d2-2957004972 .stroke-AB5{stroke:#F7F8FE;}
.d2-2957004972 .background-color-N1{background-color:#0A0F25;}
.d2-2957004972 .background-color-N2{background-color:#676C7E;}
.d2-2957004972 .background-color-N3{background-color:#9499AB;}
.d2-2957004972 .background-color-N4{background-color:#CFD2DD;}
.d2-2957004972 .background-color-N5{background-color:#DEE1EB;}
.d2-2957004972 .background-color-N6{background-color:#EEF1F8;}
.d2-2957004972 .background-color-N7{background-color:#FFFFFF;}
.d2-2957004972 .background-color-B1{background-color:#0D32B2;}
.d2-2957004972 .background-color-B2{background-color:#0D32B2;}
.d2-2957004972 .background-color-B3{background-color:#E3E9FD;}
.d2-2957004972 .background-color-B4{background-color:#E3E9FD;}
.d2-2957004972 .background-color-B5{background-color:#EDF0FD;}
.d2-2957004972 .background-color-B6{background-color:#F7F8FE;}
.d2-2957004972 .background-color-AA2{background-color:#4A6FF3;}
.d2-2957004972 .background-color-AA4{background-color:#EDF0FD;}
.d2-2957004972 .background-color-AA5{background-color:#F7F8FE;}
.d2-2957004972 .background-color-AB4{background-color:#EDF0FD;}
.d2-2957004972 .background-color-AB5{background-color:#F7F8FE;}
.d2-2957004972 .color-N1{color:#0A0F25;}
.d2-2957004972 .color-N2{color:#676C7E;}
.d2-2957004972 .color-N3{color:#9499AB;}
.d2-2957004972 .color-N4{color:#CFD2DD;}
.d2-2957004972 .color-N5{color:#DEE1EB;}
.d2-2957004972 .color-N6{color:#EEF1F8;}
.d2-2957004972 .color-N7{color:#FFFFFF;}
.d2-2957004972 .color-B1{color:#0D32B2;}
.d2-2957004972 .color-B2{color:#0D32B2;}
.d2-2957004972 .color-B3{color:#E3E9FD;}
.d2-2957004972 .color-B4{color:#E3E9FD;}
.d2-2957004972 .color-B5{color:#EDF0FD;}
.d2-2957004972 .color-B6{color:#F7F8FE;}
.d2-2957004972 .color-AA2{color:#4A6FF3;}
.d2-2957004972 .color-AA4{color:#EDF0FD;}
.d2-2957004972 .color-AA5{color:#F7F8FE;}
.d2-2957004972 .color-AB4{color:#EDF0FD;}
.d2-2957004972 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g id="a"><g class="shape" ><rect x="12.000000" y="12.000000" width="299.000000" height="166.000000" class=" stroke-B1 fill-B4" style="stroke-width:2;" /></g><text x="161.500000" y="45.000000" class="text fill-N1" style="text-anchor:middle;font-size:28px">a</text></g><g id="b"><g class="shape" ><rect x="12.000000" y="248.000000" width="299.000000" height="166.000000" class=" stroke-B1 fill-B4" style="stroke-width:2;" /></g><text x="161.500000" y="281.000000" class="text fill-N1" style="text-anchor:middle;font-size:28px">b</text></g><g id="a.a"><g class="shape" ><rect x="62.000000" y="62.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="88.500000" y="100.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="a.b"><g class="shape" ><rect x="135.000000" y="62.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="161.500000" y="100.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="a.c"><g class="shape" ><rect x="208.000000" y="62.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="234.500000" y="100.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">c</text></g><g id="b.a"><g class="shape" ><rect x="62.000000" y="298.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="88.500000" y="336.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="b.b"><g class="shape" ><rect x="135.000000" y="298.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="161.500000" y="336.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="b.c"><g class="shape" ><rect x="208.000000" y="298.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="234.500000" y="336.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">c</text></g><g id="(a -&gt; b)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 161.500000 180.000000 L 161.500000 244.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2957004972)" /></g><mask id="d2-2957004972" maskUnits="userSpaceOnUse" x="11" y="11" width="301" height="404">
<rect x="11" y="11" width="301" height="404" fill="white"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 14 KiB