@bytechain.cn/colamd 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/.github/workflows/release.yml +66 -0
  2. package/.trae/documents/fix-mermaid-colors-and-sankey.md +50 -0
  3. package/CLAUDE.md +87 -0
  4. package/LICENSE +21 -0
  5. package/README.md +540 -0
  6. package/README_CN.md +543 -0
  7. package/demo.md +486 -0
  8. package/dist/main/index.js +735 -0
  9. package/dist/preload/index.js +71 -0
  10. package/dist/renderer/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  11. package/dist/renderer/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  12. package/dist/renderer/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  13. package/dist/renderer/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  14. package/dist/renderer/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  15. package/dist/renderer/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  16. package/dist/renderer/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  17. package/dist/renderer/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  18. package/dist/renderer/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  19. package/dist/renderer/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  20. package/dist/renderer/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  21. package/dist/renderer/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  22. package/dist/renderer/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  23. package/dist/renderer/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  24. package/dist/renderer/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  25. package/dist/renderer/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  26. package/dist/renderer/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  27. package/dist/renderer/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  28. package/dist/renderer/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  29. package/dist/renderer/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  30. package/dist/renderer/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  31. package/dist/renderer/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  32. package/dist/renderer/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  33. package/dist/renderer/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  34. package/dist/renderer/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  35. package/dist/renderer/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  36. package/dist/renderer/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  37. package/dist/renderer/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  38. package/dist/renderer/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  39. package/dist/renderer/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  40. package/dist/renderer/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  41. package/dist/renderer/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  42. package/dist/renderer/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  43. package/dist/renderer/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  44. package/dist/renderer/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  45. package/dist/renderer/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  46. package/dist/renderer/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  47. package/dist/renderer/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  48. package/dist/renderer/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  49. package/dist/renderer/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  50. package/dist/renderer/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  51. package/dist/renderer/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  52. package/dist/renderer/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  53. package/dist/renderer/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  54. package/dist/renderer/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  55. package/dist/renderer/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  56. package/dist/renderer/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  57. package/dist/renderer/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  58. package/dist/renderer/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  59. package/dist/renderer/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  60. package/dist/renderer/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  61. package/dist/renderer/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  62. package/dist/renderer/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  63. package/dist/renderer/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  64. package/dist/renderer/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  65. package/dist/renderer/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  66. package/dist/renderer/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  67. package/dist/renderer/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  68. package/dist/renderer/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  69. package/dist/renderer/assets/arc-tTbbM8LO.js +131 -0
  70. package/dist/renderer/assets/architectureDiagram-3BPJPVTR-CEgYow6c.js +8720 -0
  71. package/dist/renderer/assets/blockDiagram-GPEHLZMM-LHyVtPwW.js +3825 -0
  72. package/dist/renderer/assets/c4Diagram-AAUBKEIU-C1P1eJrf.js +2482 -0
  73. package/dist/renderer/assets/channel-upve91Tq.js +7 -0
  74. package/dist/renderer/assets/chunk-2J33WTMH-lag2vhq9.js +24 -0
  75. package/dist/renderer/assets/chunk-4BX2VUAB-BXJ8Ggh-.js +16 -0
  76. package/dist/renderer/assets/chunk-55IACEB6-CiBpxRa1.js +13 -0
  77. package/dist/renderer/assets/chunk-727SXJPM-ODeKQFXC.js +2016 -0
  78. package/dist/renderer/assets/chunk-AQP2D5EJ-BK7xJolB.js +1953 -0
  79. package/dist/renderer/assets/chunk-FMBD7UC4-BxpCZPtz.js +19 -0
  80. package/dist/renderer/assets/chunk-ND2GUHAM-CqqaU9Ue.js +116 -0
  81. package/dist/renderer/assets/chunk-QZHKN3VN-Biq_K124.js +19 -0
  82. package/dist/renderer/assets/classDiagram-4FO5ZUOK-Cq95X99o.js +23 -0
  83. package/dist/renderer/assets/classDiagram-v2-Q7XG4LA2-Cq95X99o.js +23 -0
  84. package/dist/renderer/assets/cose-bilkent-S5V4N54A-XasiD0bu.js +4942 -0
  85. package/dist/renderer/assets/cytoscape.esm-CpHeHM5e.js +30269 -0
  86. package/dist/renderer/assets/dagre-BM42HDAG-Nq84Gfx4.js +705 -0
  87. package/dist/renderer/assets/defaultLocale-B2RvLBDe.js +206 -0
  88. package/dist/renderer/assets/diagram-2AECGRRQ-DwuB1GWt.js +301 -0
  89. package/dist/renderer/assets/diagram-5GNKFQAL-C2tgeI1h.js +169 -0
  90. package/dist/renderer/assets/diagram-KO2AKTUF-D5KzjNBc.js +632 -0
  91. package/dist/renderer/assets/diagram-LMA3HP47-C12xHS1c.js +212 -0
  92. package/dist/renderer/assets/diagram-OG6HWLK6-CnxI9oEa.js +851 -0
  93. package/dist/renderer/assets/erDiagram-TEJ5UH35-D_uPaKwn.js +1227 -0
  94. package/dist/renderer/assets/flowDiagram-I6XJVG4X-B6q_1-tE.js +2332 -0
  95. package/dist/renderer/assets/ganttDiagram-6RSMTGT7-CFo7ifF9.js +3720 -0
  96. package/dist/renderer/assets/gitGraphDiagram-PVQCEYII-WSexHTnq.js +1373 -0
  97. package/dist/renderer/assets/graph-DyX_9f6d.js +1988 -0
  98. package/dist/renderer/assets/index-DW7LS8C1.js +72292 -0
  99. package/dist/renderer/assets/index-dyHEFYvY.css +2184 -0
  100. package/dist/renderer/assets/infoDiagram-5YYISTIA-DaeJdLRq.js +31 -0
  101. package/dist/renderer/assets/init-ZxktEp_H.js +16 -0
  102. package/dist/renderer/assets/ishikawaDiagram-YF4QCWOH-DDCZc35f.js +967 -0
  103. package/dist/renderer/assets/journeyDiagram-JHISSGLW-BEdmpAgl.js +1255 -0
  104. package/dist/renderer/assets/kanban-definition-UN3LZRKU-BEFtQcFb.js +1052 -0
  105. package/dist/renderer/assets/layout-CAJgQHdw.js +2610 -0
  106. package/dist/renderer/assets/linear-B2ggJ8Am.js +340 -0
  107. package/dist/renderer/assets/mindmap-definition-RKZ34NQL-DSxVgHB5.js +1180 -0
  108. package/dist/renderer/assets/ordinal-DSZU4PqD.js +76 -0
  109. package/dist/renderer/assets/pieDiagram-4H26LBE5-CwYoJBuL.js +246 -0
  110. package/dist/renderer/assets/quadrantDiagram-W4KKPZXB-CST9Fvg9.js +1344 -0
  111. package/dist/renderer/assets/requirementDiagram-4Y6WPE33-DtrH52jS.js +1204 -0
  112. package/dist/renderer/assets/sankeyDiagram-5OEKKPKP-ca1tPzJ_.js +1274 -0
  113. package/dist/renderer/assets/sequenceDiagram-3UESZ5HK-Dfp1EJZ7.js +4514 -0
  114. package/dist/renderer/assets/stateDiagram-AJRCARHV-Bha2QoNB.js +450 -0
  115. package/dist/renderer/assets/stateDiagram-v2-BHNVJYJU-DWgFUYu1.js +21 -0
  116. package/dist/renderer/assets/timeline-definition-PNZ67QCA-C3h_-OTj.js +1596 -0
  117. package/dist/renderer/assets/vennDiagram-CIIHVFJN-DFzjSrZi.js +2486 -0
  118. package/dist/renderer/assets/wardley-L42UT6IY-Cx-VbqoS.js +30699 -0
  119. package/dist/renderer/assets/wardleyDiagram-YWT4CUSO-S2D9XqX6.js +975 -0
  120. package/dist/renderer/assets/xychartDiagram-2RQKCTM6-Cfxigbts.js +1932 -0
  121. package/dist/renderer/index.html +19 -0
  122. package/docs/agent-diff-view.md +48 -0
  123. package/electron-builder.yml +57 -0
  124. package/electron.vite.config.ts +30 -0
  125. package/package.json +40 -0
  126. package/resources/entitlements.mac.plist +12 -0
  127. package/resources/icon.icns +0 -0
  128. package/resources/icon.png +0 -0
  129. package/resources/icon.svg +23 -0
  130. package/resources/templates/slides/icon.png +0 -0
  131. package/resources/templates/slides/slides-template.md +74 -0
  132. package/resources/templates/slides/template.html +535 -0
  133. package/scripts/afterPack.js +13 -0
  134. package/src/main/index.ts +881 -0
  135. package/src/preload/index.ts +110 -0
  136. package/src/renderer/editor/editor.ts +204 -0
  137. package/src/renderer/editor/html-view.ts +15 -0
  138. package/src/renderer/editor/plugins/index.ts +76 -0
  139. package/src/renderer/editor/plugins/math-plugin.ts +297 -0
  140. package/src/renderer/editor/plugins/mermaid-plugin-custom.css +431 -0
  141. package/src/renderer/editor/plugins/mermaid-plugin-dark.css +428 -0
  142. package/src/renderer/editor/plugins/mermaid-plugin-elegant.css +443 -0
  143. package/src/renderer/editor/plugins/mermaid-plugin-newsprint.css +208 -0
  144. package/src/renderer/editor/plugins/mermaid-plugin.css +111 -0
  145. package/src/renderer/editor/plugins/mermaid-plugin.ts +679 -0
  146. package/src/renderer/env.d.ts +7 -0
  147. package/src/renderer/index.html +18 -0
  148. package/src/renderer/main.ts +303 -0
  149. package/src/renderer/themes/base.css +509 -0
  150. package/src/renderer/themes/theme-manager.ts +40 -0
  151. package/themes/README.md +280 -0
  152. package/themes/elegant.css +664 -0
  153. package/themes/guizang.css +732 -0
  154. package/tsconfig.json +14 -0
  155. package/tsconfig.main.json +11 -0
  156. package/tsconfig.preload.json +11 -0
  157. package/tsconfig.renderer.json +12 -0
@@ -0,0 +1,2610 @@
1
+ import { d as defineProperty, e as eq, a as isArrayLike, b as isIndex, c as baseRest, f as isPrototype, g as arrayLikeKeys, h as baseFlatten, s as setToString, o as overRest, j as overArg, k as keys, l as getSymbols, m as stubArray, n as arrayPush, p as baseGetAllKeys, U as Uint8Array, q as getTag, r as baseUnary, t as nodeUtil, u as isBuffer, S as Stack, v as arrayEach, w as isArray, x as getAllKeys, y as isTypedArray, z as isArrayLikeObject, A as isArguments, B as isFunction, C as baseFor, D as baseIteratee, E as baseFindIndex, F as baseEach, H as arrayMap, I as castFunction, J as baseForOwn, K as hasPath, L as identity, M as castPath, N as toKey, O as baseGet, P as hasIn, Q as toString, G as Graph, R as forEach, T as constant, i as isUndefined, V as filter, W as values, X as reduce } from "./graph-DyX_9f6d.js";
2
+ import { bn as toNumber, bo as isObject, bp as isObjectLike, bq as baseGetTag, br as root, bs as Symbol$1, bt as isSymbol } from "./index-DW7LS8C1.js";
3
+ var INFINITY = 1 / 0, MAX_INTEGER = 17976931348623157e292;
4
+ function toFinite(value) {
5
+ if (!value) {
6
+ return value === 0 ? value : 0;
7
+ }
8
+ value = toNumber(value);
9
+ if (value === INFINITY || value === -INFINITY) {
10
+ var sign = value < 0 ? -1 : 1;
11
+ return sign * MAX_INTEGER;
12
+ }
13
+ return value === value ? value : 0;
14
+ }
15
+ function toInteger(value) {
16
+ var result = toFinite(value), remainder = result % 1;
17
+ return result === result ? remainder ? result - remainder : result : 0;
18
+ }
19
+ var objectCreate = Object.create;
20
+ var baseCreate = /* @__PURE__ */ (function() {
21
+ function object() {
22
+ }
23
+ return function(proto) {
24
+ if (!isObject(proto)) {
25
+ return {};
26
+ }
27
+ if (objectCreate) {
28
+ return objectCreate(proto);
29
+ }
30
+ object.prototype = proto;
31
+ var result = new object();
32
+ object.prototype = void 0;
33
+ return result;
34
+ };
35
+ })();
36
+ function copyArray(source, array) {
37
+ var index = -1, length = source.length;
38
+ array || (array = Array(length));
39
+ while (++index < length) {
40
+ array[index] = source[index];
41
+ }
42
+ return array;
43
+ }
44
+ function baseAssignValue(object, key, value) {
45
+ if (key == "__proto__" && defineProperty) {
46
+ defineProperty(object, key, {
47
+ "configurable": true,
48
+ "enumerable": true,
49
+ "value": value,
50
+ "writable": true
51
+ });
52
+ } else {
53
+ object[key] = value;
54
+ }
55
+ }
56
+ var objectProto$5 = Object.prototype;
57
+ var hasOwnProperty$5 = objectProto$5.hasOwnProperty;
58
+ function assignValue(object, key, value) {
59
+ var objValue = object[key];
60
+ if (!(hasOwnProperty$5.call(object, key) && eq(objValue, value)) || value === void 0 && !(key in object)) {
61
+ baseAssignValue(object, key, value);
62
+ }
63
+ }
64
+ function copyObject(source, props, object, customizer) {
65
+ var isNew = !object;
66
+ object || (object = {});
67
+ var index = -1, length = props.length;
68
+ while (++index < length) {
69
+ var key = props[index];
70
+ var newValue = void 0;
71
+ if (newValue === void 0) {
72
+ newValue = source[key];
73
+ }
74
+ if (isNew) {
75
+ baseAssignValue(object, key, newValue);
76
+ } else {
77
+ assignValue(object, key, newValue);
78
+ }
79
+ }
80
+ return object;
81
+ }
82
+ function isIterateeCall(value, index, object) {
83
+ if (!isObject(object)) {
84
+ return false;
85
+ }
86
+ var type = typeof index;
87
+ if (type == "number" ? isArrayLike(object) && isIndex(index, object.length) : type == "string" && index in object) {
88
+ return eq(object[index], value);
89
+ }
90
+ return false;
91
+ }
92
+ function createAssigner(assigner) {
93
+ return baseRest(function(object, sources) {
94
+ var index = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : void 0, guard = length > 2 ? sources[2] : void 0;
95
+ customizer = assigner.length > 3 && typeof customizer == "function" ? (length--, customizer) : void 0;
96
+ if (guard && isIterateeCall(sources[0], sources[1], guard)) {
97
+ customizer = length < 3 ? void 0 : customizer;
98
+ length = 1;
99
+ }
100
+ object = Object(object);
101
+ while (++index < length) {
102
+ var source = sources[index];
103
+ if (source) {
104
+ assigner(object, source, index, customizer);
105
+ }
106
+ }
107
+ return object;
108
+ });
109
+ }
110
+ function nativeKeysIn(object) {
111
+ var result = [];
112
+ if (object != null) {
113
+ for (var key in Object(object)) {
114
+ result.push(key);
115
+ }
116
+ }
117
+ return result;
118
+ }
119
+ var objectProto$4 = Object.prototype;
120
+ var hasOwnProperty$4 = objectProto$4.hasOwnProperty;
121
+ function baseKeysIn(object) {
122
+ if (!isObject(object)) {
123
+ return nativeKeysIn(object);
124
+ }
125
+ var isProto = isPrototype(object), result = [];
126
+ for (var key in object) {
127
+ if (!(key == "constructor" && (isProto || !hasOwnProperty$4.call(object, key)))) {
128
+ result.push(key);
129
+ }
130
+ }
131
+ return result;
132
+ }
133
+ function keysIn(object) {
134
+ return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
135
+ }
136
+ function flatten(array) {
137
+ var length = array == null ? 0 : array.length;
138
+ return length ? baseFlatten(array) : [];
139
+ }
140
+ function flatRest(func) {
141
+ return setToString(overRest(func, void 0, flatten), func + "");
142
+ }
143
+ var getPrototype = overArg(Object.getPrototypeOf, Object);
144
+ var objectTag$1 = "[object Object]";
145
+ var funcProto = Function.prototype, objectProto$3 = Object.prototype;
146
+ var funcToString = funcProto.toString;
147
+ var hasOwnProperty$3 = objectProto$3.hasOwnProperty;
148
+ var objectCtorString = funcToString.call(Object);
149
+ function isPlainObject(value) {
150
+ if (!isObjectLike(value) || baseGetTag(value) != objectTag$1) {
151
+ return false;
152
+ }
153
+ var proto = getPrototype(value);
154
+ if (proto === null) {
155
+ return true;
156
+ }
157
+ var Ctor = hasOwnProperty$3.call(proto, "constructor") && proto.constructor;
158
+ return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
159
+ }
160
+ function baseAssign(object, source) {
161
+ return object && copyObject(source, keys(source), object);
162
+ }
163
+ function baseAssignIn(object, source) {
164
+ return object && copyObject(source, keysIn(source), object);
165
+ }
166
+ var freeExports = typeof exports == "object" && exports && !exports.nodeType && exports;
167
+ var freeModule = freeExports && typeof module == "object" && module && !module.nodeType && module;
168
+ var moduleExports = freeModule && freeModule.exports === freeExports;
169
+ var Buffer = moduleExports ? root.Buffer : void 0, allocUnsafe = Buffer ? Buffer.allocUnsafe : void 0;
170
+ function cloneBuffer(buffer, isDeep) {
171
+ if (isDeep) {
172
+ return buffer.slice();
173
+ }
174
+ var length = buffer.length, result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
175
+ buffer.copy(result);
176
+ return result;
177
+ }
178
+ function copySymbols(source, object) {
179
+ return copyObject(source, getSymbols(source), object);
180
+ }
181
+ var nativeGetSymbols = Object.getOwnPropertySymbols;
182
+ var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
183
+ var result = [];
184
+ while (object) {
185
+ arrayPush(result, getSymbols(object));
186
+ object = getPrototype(object);
187
+ }
188
+ return result;
189
+ };
190
+ function copySymbolsIn(source, object) {
191
+ return copyObject(source, getSymbolsIn(source), object);
192
+ }
193
+ function getAllKeysIn(object) {
194
+ return baseGetAllKeys(object, keysIn, getSymbolsIn);
195
+ }
196
+ var objectProto$2 = Object.prototype;
197
+ var hasOwnProperty$2 = objectProto$2.hasOwnProperty;
198
+ function initCloneArray(array) {
199
+ var length = array.length, result = new array.constructor(length);
200
+ if (length && typeof array[0] == "string" && hasOwnProperty$2.call(array, "index")) {
201
+ result.index = array.index;
202
+ result.input = array.input;
203
+ }
204
+ return result;
205
+ }
206
+ function cloneArrayBuffer(arrayBuffer) {
207
+ var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
208
+ new Uint8Array(result).set(new Uint8Array(arrayBuffer));
209
+ return result;
210
+ }
211
+ function cloneDataView(dataView, isDeep) {
212
+ var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
213
+ return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
214
+ }
215
+ var reFlags = /\w*$/;
216
+ function cloneRegExp(regexp) {
217
+ var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
218
+ result.lastIndex = regexp.lastIndex;
219
+ return result;
220
+ }
221
+ var symbolProto = Symbol$1 ? Symbol$1.prototype : void 0, symbolValueOf = symbolProto ? symbolProto.valueOf : void 0;
222
+ function cloneSymbol(symbol) {
223
+ return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
224
+ }
225
+ function cloneTypedArray(typedArray, isDeep) {
226
+ var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
227
+ return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
228
+ }
229
+ var boolTag$1 = "[object Boolean]", dateTag$1 = "[object Date]", mapTag$2 = "[object Map]", numberTag$1 = "[object Number]", regexpTag$1 = "[object RegExp]", setTag$2 = "[object Set]", stringTag$1 = "[object String]", symbolTag$1 = "[object Symbol]";
230
+ var arrayBufferTag$1 = "[object ArrayBuffer]", dataViewTag$1 = "[object DataView]", float32Tag$1 = "[object Float32Array]", float64Tag$1 = "[object Float64Array]", int8Tag$1 = "[object Int8Array]", int16Tag$1 = "[object Int16Array]", int32Tag$1 = "[object Int32Array]", uint8Tag$1 = "[object Uint8Array]", uint8ClampedTag$1 = "[object Uint8ClampedArray]", uint16Tag$1 = "[object Uint16Array]", uint32Tag$1 = "[object Uint32Array]";
231
+ function initCloneByTag(object, tag, isDeep) {
232
+ var Ctor = object.constructor;
233
+ switch (tag) {
234
+ case arrayBufferTag$1:
235
+ return cloneArrayBuffer(object);
236
+ case boolTag$1:
237
+ case dateTag$1:
238
+ return new Ctor(+object);
239
+ case dataViewTag$1:
240
+ return cloneDataView(object, isDeep);
241
+ case float32Tag$1:
242
+ case float64Tag$1:
243
+ case int8Tag$1:
244
+ case int16Tag$1:
245
+ case int32Tag$1:
246
+ case uint8Tag$1:
247
+ case uint8ClampedTag$1:
248
+ case uint16Tag$1:
249
+ case uint32Tag$1:
250
+ return cloneTypedArray(object, isDeep);
251
+ case mapTag$2:
252
+ return new Ctor();
253
+ case numberTag$1:
254
+ case stringTag$1:
255
+ return new Ctor(object);
256
+ case regexpTag$1:
257
+ return cloneRegExp(object);
258
+ case setTag$2:
259
+ return new Ctor();
260
+ case symbolTag$1:
261
+ return cloneSymbol(object);
262
+ }
263
+ }
264
+ function initCloneObject(object) {
265
+ return typeof object.constructor == "function" && !isPrototype(object) ? baseCreate(getPrototype(object)) : {};
266
+ }
267
+ var mapTag$1 = "[object Map]";
268
+ function baseIsMap(value) {
269
+ return isObjectLike(value) && getTag(value) == mapTag$1;
270
+ }
271
+ var nodeIsMap = nodeUtil && nodeUtil.isMap;
272
+ var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
273
+ var setTag$1 = "[object Set]";
274
+ function baseIsSet(value) {
275
+ return isObjectLike(value) && getTag(value) == setTag$1;
276
+ }
277
+ var nodeIsSet = nodeUtil && nodeUtil.isSet;
278
+ var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
279
+ var CLONE_DEEP_FLAG$1 = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG$1 = 4;
280
+ var argsTag = "[object Arguments]", arrayTag = "[object Array]", boolTag = "[object Boolean]", dateTag = "[object Date]", errorTag = "[object Error]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", mapTag = "[object Map]", numberTag = "[object Number]", objectTag = "[object Object]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag = "[object Symbol]", weakMapTag = "[object WeakMap]";
281
+ var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]", float32Tag = "[object Float32Array]", float64Tag = "[object Float64Array]", int8Tag = "[object Int8Array]", int16Tag = "[object Int16Array]", int32Tag = "[object Int32Array]", uint8Tag = "[object Uint8Array]", uint8ClampedTag = "[object Uint8ClampedArray]", uint16Tag = "[object Uint16Array]", uint32Tag = "[object Uint32Array]";
282
+ var cloneableTags = {};
283
+ cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
284
+ cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false;
285
+ function baseClone(value, bitmask, customizer, key, object, stack) {
286
+ var result, isDeep = bitmask & CLONE_DEEP_FLAG$1, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG$1;
287
+ if (result !== void 0) {
288
+ return result;
289
+ }
290
+ if (!isObject(value)) {
291
+ return value;
292
+ }
293
+ var isArr = isArray(value);
294
+ if (isArr) {
295
+ result = initCloneArray(value);
296
+ if (!isDeep) {
297
+ return copyArray(value, result);
298
+ }
299
+ } else {
300
+ var tag = getTag(value), isFunc = tag == funcTag || tag == genTag;
301
+ if (isBuffer(value)) {
302
+ return cloneBuffer(value, isDeep);
303
+ }
304
+ if (tag == objectTag || tag == argsTag || isFunc && !object) {
305
+ result = isFlat || isFunc ? {} : initCloneObject(value);
306
+ if (!isDeep) {
307
+ return isFlat ? copySymbolsIn(value, baseAssignIn(result, value)) : copySymbols(value, baseAssign(result, value));
308
+ }
309
+ } else {
310
+ if (!cloneableTags[tag]) {
311
+ return object ? value : {};
312
+ }
313
+ result = initCloneByTag(value, tag, isDeep);
314
+ }
315
+ }
316
+ stack || (stack = new Stack());
317
+ var stacked = stack.get(value);
318
+ if (stacked) {
319
+ return stacked;
320
+ }
321
+ stack.set(value, result);
322
+ if (isSet(value)) {
323
+ value.forEach(function(subValue) {
324
+ result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
325
+ });
326
+ } else if (isMap(value)) {
327
+ value.forEach(function(subValue, key2) {
328
+ result.set(key2, baseClone(subValue, bitmask, customizer, key2, value, stack));
329
+ });
330
+ }
331
+ var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys;
332
+ var props = isArr ? void 0 : keysFunc(value);
333
+ arrayEach(props || value, function(subValue, key2) {
334
+ if (props) {
335
+ key2 = subValue;
336
+ subValue = value[key2];
337
+ }
338
+ assignValue(result, key2, baseClone(subValue, bitmask, customizer, key2, value, stack));
339
+ });
340
+ return result;
341
+ }
342
+ var CLONE_DEEP_FLAG = 1, CLONE_SYMBOLS_FLAG = 4;
343
+ function cloneDeep(value) {
344
+ return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
345
+ }
346
+ var objectProto$1 = Object.prototype;
347
+ var hasOwnProperty$1 = objectProto$1.hasOwnProperty;
348
+ var defaults = baseRest(function(object, sources) {
349
+ object = Object(object);
350
+ var index = -1;
351
+ var length = sources.length;
352
+ var guard = length > 2 ? sources[2] : void 0;
353
+ if (guard && isIterateeCall(sources[0], sources[1], guard)) {
354
+ length = 1;
355
+ }
356
+ while (++index < length) {
357
+ var source = sources[index];
358
+ var props = keysIn(source);
359
+ var propsIndex = -1;
360
+ var propsLength = props.length;
361
+ while (++propsIndex < propsLength) {
362
+ var key = props[propsIndex];
363
+ var value = object[key];
364
+ if (value === void 0 || eq(value, objectProto$1[key]) && !hasOwnProperty$1.call(object, key)) {
365
+ object[key] = source[key];
366
+ }
367
+ }
368
+ }
369
+ return object;
370
+ });
371
+ function assignMergeValue(object, key, value) {
372
+ if (value !== void 0 && !eq(object[key], value) || value === void 0 && !(key in object)) {
373
+ baseAssignValue(object, key, value);
374
+ }
375
+ }
376
+ function safeGet(object, key) {
377
+ if (key === "constructor" && typeof object[key] === "function") {
378
+ return;
379
+ }
380
+ if (key == "__proto__") {
381
+ return;
382
+ }
383
+ return object[key];
384
+ }
385
+ function toPlainObject(value) {
386
+ return copyObject(value, keysIn(value));
387
+ }
388
+ function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
389
+ var objValue = safeGet(object, key), srcValue = safeGet(source, key), stacked = stack.get(srcValue);
390
+ if (stacked) {
391
+ assignMergeValue(object, key, stacked);
392
+ return;
393
+ }
394
+ var newValue = customizer ? customizer(objValue, srcValue, key + "", object, source, stack) : void 0;
395
+ var isCommon = newValue === void 0;
396
+ if (isCommon) {
397
+ var isArr = isArray(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue);
398
+ newValue = srcValue;
399
+ if (isArr || isBuff || isTyped) {
400
+ if (isArray(objValue)) {
401
+ newValue = objValue;
402
+ } else if (isArrayLikeObject(objValue)) {
403
+ newValue = copyArray(objValue);
404
+ } else if (isBuff) {
405
+ isCommon = false;
406
+ newValue = cloneBuffer(srcValue, true);
407
+ } else if (isTyped) {
408
+ isCommon = false;
409
+ newValue = cloneTypedArray(srcValue, true);
410
+ } else {
411
+ newValue = [];
412
+ }
413
+ } else if (isPlainObject(srcValue) || isArguments(srcValue)) {
414
+ newValue = objValue;
415
+ if (isArguments(objValue)) {
416
+ newValue = toPlainObject(objValue);
417
+ } else if (!isObject(objValue) || isFunction(objValue)) {
418
+ newValue = initCloneObject(srcValue);
419
+ }
420
+ } else {
421
+ isCommon = false;
422
+ }
423
+ }
424
+ if (isCommon) {
425
+ stack.set(srcValue, newValue);
426
+ mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
427
+ stack["delete"](srcValue);
428
+ }
429
+ assignMergeValue(object, key, newValue);
430
+ }
431
+ function baseMerge(object, source, srcIndex, customizer, stack) {
432
+ if (object === source) {
433
+ return;
434
+ }
435
+ baseFor(source, function(srcValue, key) {
436
+ stack || (stack = new Stack());
437
+ if (isObject(srcValue)) {
438
+ baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
439
+ } else {
440
+ var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + "", object, source, stack) : void 0;
441
+ if (newValue === void 0) {
442
+ newValue = srcValue;
443
+ }
444
+ assignMergeValue(object, key, newValue);
445
+ }
446
+ }, keysIn);
447
+ }
448
+ function last(array) {
449
+ var length = array == null ? 0 : array.length;
450
+ return length ? array[length - 1] : void 0;
451
+ }
452
+ function createFind(findIndexFunc) {
453
+ return function(collection, predicate, fromIndex) {
454
+ var iterable = Object(collection);
455
+ if (!isArrayLike(collection)) {
456
+ var iteratee = baseIteratee(predicate);
457
+ collection = keys(collection);
458
+ predicate = function(key) {
459
+ return iteratee(iterable[key], key, iterable);
460
+ };
461
+ }
462
+ var index = findIndexFunc(collection, predicate, fromIndex);
463
+ return index > -1 ? iterable[iteratee ? collection[index] : index] : void 0;
464
+ };
465
+ }
466
+ var nativeMax$1 = Math.max;
467
+ function findIndex(array, predicate, fromIndex) {
468
+ var length = array == null ? 0 : array.length;
469
+ if (!length) {
470
+ return -1;
471
+ }
472
+ var index = fromIndex == null ? 0 : toInteger(fromIndex);
473
+ if (index < 0) {
474
+ index = nativeMax$1(length + index, 0);
475
+ }
476
+ return baseFindIndex(array, baseIteratee(predicate), index);
477
+ }
478
+ var find = createFind(findIndex);
479
+ function baseMap(collection, iteratee) {
480
+ var index = -1, result = isArrayLike(collection) ? Array(collection.length) : [];
481
+ baseEach(collection, function(value, key, collection2) {
482
+ result[++index] = iteratee(value, key, collection2);
483
+ });
484
+ return result;
485
+ }
486
+ function map(collection, iteratee) {
487
+ var func = isArray(collection) ? arrayMap : baseMap;
488
+ return func(collection, baseIteratee(iteratee));
489
+ }
490
+ function forIn(object, iteratee) {
491
+ return object == null ? object : baseFor(object, castFunction(iteratee), keysIn);
492
+ }
493
+ function forOwn(object, iteratee) {
494
+ return object && baseForOwn(object, castFunction(iteratee));
495
+ }
496
+ function baseGt(value, other) {
497
+ return value > other;
498
+ }
499
+ var objectProto = Object.prototype;
500
+ var hasOwnProperty = objectProto.hasOwnProperty;
501
+ function baseHas(object, key) {
502
+ return object != null && hasOwnProperty.call(object, key);
503
+ }
504
+ function has(object, path) {
505
+ return object != null && hasPath(object, path, baseHas);
506
+ }
507
+ function baseLt(value, other) {
508
+ return value < other;
509
+ }
510
+ function mapValues(object, iteratee) {
511
+ var result = {};
512
+ iteratee = baseIteratee(iteratee);
513
+ baseForOwn(object, function(value, key, object2) {
514
+ baseAssignValue(result, key, iteratee(value, key, object2));
515
+ });
516
+ return result;
517
+ }
518
+ function baseExtremum(array, iteratee, comparator) {
519
+ var index = -1, length = array.length;
520
+ while (++index < length) {
521
+ var value = array[index], current = iteratee(value);
522
+ if (current != null && (computed === void 0 ? current === current && !isSymbol(current) : comparator(current, computed))) {
523
+ var computed = current, result = value;
524
+ }
525
+ }
526
+ return result;
527
+ }
528
+ function max(array) {
529
+ return array && array.length ? baseExtremum(array, identity, baseGt) : void 0;
530
+ }
531
+ var merge = createAssigner(function(object, source, srcIndex) {
532
+ baseMerge(object, source, srcIndex);
533
+ });
534
+ function min(array) {
535
+ return array && array.length ? baseExtremum(array, identity, baseLt) : void 0;
536
+ }
537
+ function minBy(array, iteratee) {
538
+ return array && array.length ? baseExtremum(array, baseIteratee(iteratee), baseLt) : void 0;
539
+ }
540
+ function baseSet(object, path, value, customizer) {
541
+ if (!isObject(object)) {
542
+ return object;
543
+ }
544
+ path = castPath(path, object);
545
+ var index = -1, length = path.length, lastIndex = length - 1, nested = object;
546
+ while (nested != null && ++index < length) {
547
+ var key = toKey(path[index]), newValue = value;
548
+ if (key === "__proto__" || key === "constructor" || key === "prototype") {
549
+ return object;
550
+ }
551
+ if (index != lastIndex) {
552
+ var objValue = nested[key];
553
+ newValue = void 0;
554
+ if (newValue === void 0) {
555
+ newValue = isObject(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {};
556
+ }
557
+ }
558
+ assignValue(nested, key, newValue);
559
+ nested = nested[key];
560
+ }
561
+ return object;
562
+ }
563
+ function basePickBy(object, paths, predicate) {
564
+ var index = -1, length = paths.length, result = {};
565
+ while (++index < length) {
566
+ var path = paths[index], value = baseGet(object, path);
567
+ if (predicate(value, path)) {
568
+ baseSet(result, castPath(path, object), value);
569
+ }
570
+ }
571
+ return result;
572
+ }
573
+ function baseSortBy(array, comparer) {
574
+ var length = array.length;
575
+ array.sort(comparer);
576
+ while (length--) {
577
+ array[length] = array[length].value;
578
+ }
579
+ return array;
580
+ }
581
+ function compareAscending(value, other) {
582
+ if (value !== other) {
583
+ var valIsDefined = value !== void 0, valIsNull = value === null, valIsReflexive = value === value, valIsSymbol = isSymbol(value);
584
+ var othIsDefined = other !== void 0, othIsNull = other === null, othIsReflexive = other === other, othIsSymbol = isSymbol(other);
585
+ if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) {
586
+ return 1;
587
+ }
588
+ if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) {
589
+ return -1;
590
+ }
591
+ }
592
+ return 0;
593
+ }
594
+ function compareMultiple(object, other, orders) {
595
+ var index = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length;
596
+ while (++index < length) {
597
+ var result = compareAscending(objCriteria[index], othCriteria[index]);
598
+ if (result) {
599
+ if (index >= ordersLength) {
600
+ return result;
601
+ }
602
+ var order2 = orders[index];
603
+ return result * (order2 == "desc" ? -1 : 1);
604
+ }
605
+ }
606
+ return object.index - other.index;
607
+ }
608
+ function baseOrderBy(collection, iteratees, orders) {
609
+ if (iteratees.length) {
610
+ iteratees = arrayMap(iteratees, function(iteratee) {
611
+ if (isArray(iteratee)) {
612
+ return function(value) {
613
+ return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);
614
+ };
615
+ }
616
+ return iteratee;
617
+ });
618
+ } else {
619
+ iteratees = [identity];
620
+ }
621
+ var index = -1;
622
+ iteratees = arrayMap(iteratees, baseUnary(baseIteratee));
623
+ var result = baseMap(collection, function(value, key, collection2) {
624
+ var criteria = arrayMap(iteratees, function(iteratee) {
625
+ return iteratee(value);
626
+ });
627
+ return { "criteria": criteria, "index": ++index, "value": value };
628
+ });
629
+ return baseSortBy(result, function(object, other) {
630
+ return compareMultiple(object, other, orders);
631
+ });
632
+ }
633
+ function basePick(object, paths) {
634
+ return basePickBy(object, paths, function(value, path) {
635
+ return hasIn(object, path);
636
+ });
637
+ }
638
+ var pick = flatRest(function(object, paths) {
639
+ return object == null ? {} : basePick(object, paths);
640
+ });
641
+ var nativeCeil = Math.ceil, nativeMax = Math.max;
642
+ function baseRange(start, end, step, fromRight) {
643
+ var index = -1, length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), result = Array(length);
644
+ while (length--) {
645
+ result[++index] = start;
646
+ start += step;
647
+ }
648
+ return result;
649
+ }
650
+ function createRange(fromRight) {
651
+ return function(start, end, step) {
652
+ if (step && typeof step != "number" && isIterateeCall(start, end, step)) {
653
+ end = step = void 0;
654
+ }
655
+ start = toFinite(start);
656
+ if (end === void 0) {
657
+ end = start;
658
+ start = 0;
659
+ } else {
660
+ end = toFinite(end);
661
+ }
662
+ step = step === void 0 ? start < end ? 1 : -1 : toFinite(step);
663
+ return baseRange(start, end, step);
664
+ };
665
+ }
666
+ var range = createRange();
667
+ var sortBy = baseRest(function(collection, iteratees) {
668
+ if (collection == null) {
669
+ return [];
670
+ }
671
+ var length = iteratees.length;
672
+ if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
673
+ iteratees = [];
674
+ } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
675
+ iteratees = [iteratees[0]];
676
+ }
677
+ return baseOrderBy(collection, baseFlatten(iteratees), []);
678
+ });
679
+ var idCounter = 0;
680
+ function uniqueId(prefix) {
681
+ var id = ++idCounter;
682
+ return toString(prefix) + id;
683
+ }
684
+ function baseZipObject(props, values2, assignFunc) {
685
+ var index = -1, length = props.length, valsLength = values2.length, result = {};
686
+ while (++index < length) {
687
+ var value = index < valsLength ? values2[index] : void 0;
688
+ assignFunc(result, props[index], value);
689
+ }
690
+ return result;
691
+ }
692
+ function zipObject(props, values2) {
693
+ return baseZipObject(props || [], values2 || [], assignValue);
694
+ }
695
+ class List {
696
+ constructor() {
697
+ var sentinel = {};
698
+ sentinel._next = sentinel._prev = sentinel;
699
+ this._sentinel = sentinel;
700
+ }
701
+ dequeue() {
702
+ var sentinel = this._sentinel;
703
+ var entry = sentinel._prev;
704
+ if (entry !== sentinel) {
705
+ unlink(entry);
706
+ return entry;
707
+ }
708
+ }
709
+ enqueue(entry) {
710
+ var sentinel = this._sentinel;
711
+ if (entry._prev && entry._next) {
712
+ unlink(entry);
713
+ }
714
+ entry._next = sentinel._next;
715
+ sentinel._next._prev = entry;
716
+ sentinel._next = entry;
717
+ entry._prev = sentinel;
718
+ }
719
+ toString() {
720
+ var strs = [];
721
+ var sentinel = this._sentinel;
722
+ var curr = sentinel._prev;
723
+ while (curr !== sentinel) {
724
+ strs.push(JSON.stringify(curr, filterOutLinks));
725
+ curr = curr._prev;
726
+ }
727
+ return "[" + strs.join(", ") + "]";
728
+ }
729
+ }
730
+ function unlink(entry) {
731
+ entry._prev._next = entry._next;
732
+ entry._next._prev = entry._prev;
733
+ delete entry._next;
734
+ delete entry._prev;
735
+ }
736
+ function filterOutLinks(k, v) {
737
+ if (k !== "_next" && k !== "_prev") {
738
+ return v;
739
+ }
740
+ }
741
+ var DEFAULT_WEIGHT_FN = constant(1);
742
+ function greedyFAS(g, weightFn) {
743
+ if (g.nodeCount() <= 1) {
744
+ return [];
745
+ }
746
+ var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);
747
+ var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);
748
+ return flatten(
749
+ map(results, function(e) {
750
+ return g.outEdges(e.v, e.w);
751
+ })
752
+ );
753
+ }
754
+ function doGreedyFAS(g, buckets, zeroIdx) {
755
+ var results = [];
756
+ var sources = buckets[buckets.length - 1];
757
+ var sinks = buckets[0];
758
+ var entry;
759
+ while (g.nodeCount()) {
760
+ while (entry = sinks.dequeue()) {
761
+ removeNode(g, buckets, zeroIdx, entry);
762
+ }
763
+ while (entry = sources.dequeue()) {
764
+ removeNode(g, buckets, zeroIdx, entry);
765
+ }
766
+ if (g.nodeCount()) {
767
+ for (var i = buckets.length - 2; i > 0; --i) {
768
+ entry = buckets[i].dequeue();
769
+ if (entry) {
770
+ results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));
771
+ break;
772
+ }
773
+ }
774
+ }
775
+ }
776
+ return results;
777
+ }
778
+ function removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {
779
+ var results = collectPredecessors ? [] : void 0;
780
+ forEach(g.inEdges(entry.v), function(edge) {
781
+ var weight = g.edge(edge);
782
+ var uEntry = g.node(edge.v);
783
+ if (collectPredecessors) {
784
+ results.push({ v: edge.v, w: edge.w });
785
+ }
786
+ uEntry.out -= weight;
787
+ assignBucket(buckets, zeroIdx, uEntry);
788
+ });
789
+ forEach(g.outEdges(entry.v), function(edge) {
790
+ var weight = g.edge(edge);
791
+ var w = edge.w;
792
+ var wEntry = g.node(w);
793
+ wEntry["in"] -= weight;
794
+ assignBucket(buckets, zeroIdx, wEntry);
795
+ });
796
+ g.removeNode(entry.v);
797
+ return results;
798
+ }
799
+ function buildState(g, weightFn) {
800
+ var fasGraph = new Graph();
801
+ var maxIn = 0;
802
+ var maxOut = 0;
803
+ forEach(g.nodes(), function(v) {
804
+ fasGraph.setNode(v, { v, in: 0, out: 0 });
805
+ });
806
+ forEach(g.edges(), function(e) {
807
+ var prevWeight = fasGraph.edge(e.v, e.w) || 0;
808
+ var weight = weightFn(e);
809
+ var edgeWeight = prevWeight + weight;
810
+ fasGraph.setEdge(e.v, e.w, edgeWeight);
811
+ maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);
812
+ maxIn = Math.max(maxIn, fasGraph.node(e.w)["in"] += weight);
813
+ });
814
+ var buckets = range(maxOut + maxIn + 3).map(function() {
815
+ return new List();
816
+ });
817
+ var zeroIdx = maxIn + 1;
818
+ forEach(fasGraph.nodes(), function(v) {
819
+ assignBucket(buckets, zeroIdx, fasGraph.node(v));
820
+ });
821
+ return { graph: fasGraph, buckets, zeroIdx };
822
+ }
823
+ function assignBucket(buckets, zeroIdx, entry) {
824
+ if (!entry.out) {
825
+ buckets[0].enqueue(entry);
826
+ } else if (!entry["in"]) {
827
+ buckets[buckets.length - 1].enqueue(entry);
828
+ } else {
829
+ buckets[entry.out - entry["in"] + zeroIdx].enqueue(entry);
830
+ }
831
+ }
832
+ function run$2(g) {
833
+ var fas = g.graph().acyclicer === "greedy" ? greedyFAS(g, weightFn(g)) : dfsFAS(g);
834
+ forEach(fas, function(e) {
835
+ var label = g.edge(e);
836
+ g.removeEdge(e);
837
+ label.forwardName = e.name;
838
+ label.reversed = true;
839
+ g.setEdge(e.w, e.v, label, uniqueId("rev"));
840
+ });
841
+ function weightFn(g2) {
842
+ return function(e) {
843
+ return g2.edge(e).weight;
844
+ };
845
+ }
846
+ }
847
+ function dfsFAS(g) {
848
+ var fas = [];
849
+ var stack = {};
850
+ var visited = {};
851
+ function dfs2(v) {
852
+ if (Object.prototype.hasOwnProperty.call(visited, v)) {
853
+ return;
854
+ }
855
+ visited[v] = true;
856
+ stack[v] = true;
857
+ forEach(g.outEdges(v), function(e) {
858
+ if (Object.prototype.hasOwnProperty.call(stack, e.w)) {
859
+ fas.push(e);
860
+ } else {
861
+ dfs2(e.w);
862
+ }
863
+ });
864
+ delete stack[v];
865
+ }
866
+ forEach(g.nodes(), dfs2);
867
+ return fas;
868
+ }
869
+ function undo$2(g) {
870
+ forEach(g.edges(), function(e) {
871
+ var label = g.edge(e);
872
+ if (label.reversed) {
873
+ g.removeEdge(e);
874
+ var forwardName = label.forwardName;
875
+ delete label.reversed;
876
+ delete label.forwardName;
877
+ g.setEdge(e.w, e.v, label, forwardName);
878
+ }
879
+ });
880
+ }
881
+ function addDummyNode(g, type, attrs, name) {
882
+ var v;
883
+ do {
884
+ v = uniqueId(name);
885
+ } while (g.hasNode(v));
886
+ attrs.dummy = type;
887
+ g.setNode(v, attrs);
888
+ return v;
889
+ }
890
+ function simplify(g) {
891
+ var simplified = new Graph().setGraph(g.graph());
892
+ forEach(g.nodes(), function(v) {
893
+ simplified.setNode(v, g.node(v));
894
+ });
895
+ forEach(g.edges(), function(e) {
896
+ var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 };
897
+ var label = g.edge(e);
898
+ simplified.setEdge(e.v, e.w, {
899
+ weight: simpleLabel.weight + label.weight,
900
+ minlen: Math.max(simpleLabel.minlen, label.minlen)
901
+ });
902
+ });
903
+ return simplified;
904
+ }
905
+ function asNonCompoundGraph(g) {
906
+ var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());
907
+ forEach(g.nodes(), function(v) {
908
+ if (!g.children(v).length) {
909
+ simplified.setNode(v, g.node(v));
910
+ }
911
+ });
912
+ forEach(g.edges(), function(e) {
913
+ simplified.setEdge(e, g.edge(e));
914
+ });
915
+ return simplified;
916
+ }
917
+ function intersectRect(rect, point) {
918
+ var x = rect.x;
919
+ var y = rect.y;
920
+ var dx = point.x - x;
921
+ var dy = point.y - y;
922
+ var w = rect.width / 2;
923
+ var h = rect.height / 2;
924
+ if (!dx && !dy) {
925
+ throw new Error("Not possible to find intersection inside of the rectangle");
926
+ }
927
+ var sx, sy;
928
+ if (Math.abs(dy) * w > Math.abs(dx) * h) {
929
+ if (dy < 0) {
930
+ h = -h;
931
+ }
932
+ sx = h * dx / dy;
933
+ sy = h;
934
+ } else {
935
+ if (dx < 0) {
936
+ w = -w;
937
+ }
938
+ sx = w;
939
+ sy = w * dy / dx;
940
+ }
941
+ return { x: x + sx, y: y + sy };
942
+ }
943
+ function buildLayerMatrix(g) {
944
+ var layering = map(range(maxRank(g) + 1), function() {
945
+ return [];
946
+ });
947
+ forEach(g.nodes(), function(v) {
948
+ var node = g.node(v);
949
+ var rank2 = node.rank;
950
+ if (!isUndefined(rank2)) {
951
+ layering[rank2][node.order] = v;
952
+ }
953
+ });
954
+ return layering;
955
+ }
956
+ function normalizeRanks(g) {
957
+ var min$1 = min(
958
+ map(g.nodes(), function(v) {
959
+ return g.node(v).rank;
960
+ })
961
+ );
962
+ forEach(g.nodes(), function(v) {
963
+ var node = g.node(v);
964
+ if (has(node, "rank")) {
965
+ node.rank -= min$1;
966
+ }
967
+ });
968
+ }
969
+ function removeEmptyRanks(g) {
970
+ var offset = min(
971
+ map(g.nodes(), function(v) {
972
+ return g.node(v).rank;
973
+ })
974
+ );
975
+ var layers = [];
976
+ forEach(g.nodes(), function(v) {
977
+ var rank2 = g.node(v).rank - offset;
978
+ if (!layers[rank2]) {
979
+ layers[rank2] = [];
980
+ }
981
+ layers[rank2].push(v);
982
+ });
983
+ var delta = 0;
984
+ var nodeRankFactor = g.graph().nodeRankFactor;
985
+ forEach(layers, function(vs, i) {
986
+ if (isUndefined(vs) && i % nodeRankFactor !== 0) {
987
+ --delta;
988
+ } else if (delta) {
989
+ forEach(vs, function(v) {
990
+ g.node(v).rank += delta;
991
+ });
992
+ }
993
+ });
994
+ }
995
+ function addBorderNode$1(g, prefix, rank2, order2) {
996
+ var node = {
997
+ width: 0,
998
+ height: 0
999
+ };
1000
+ if (arguments.length >= 4) {
1001
+ node.rank = rank2;
1002
+ node.order = order2;
1003
+ }
1004
+ return addDummyNode(g, "border", node, prefix);
1005
+ }
1006
+ function maxRank(g) {
1007
+ return max(
1008
+ map(g.nodes(), function(v) {
1009
+ var rank2 = g.node(v).rank;
1010
+ if (!isUndefined(rank2)) {
1011
+ return rank2;
1012
+ }
1013
+ })
1014
+ );
1015
+ }
1016
+ function partition(collection, fn) {
1017
+ var result = { lhs: [], rhs: [] };
1018
+ forEach(collection, function(value) {
1019
+ if (fn(value)) {
1020
+ result.lhs.push(value);
1021
+ } else {
1022
+ result.rhs.push(value);
1023
+ }
1024
+ });
1025
+ return result;
1026
+ }
1027
+ function notime(name, fn) {
1028
+ return fn();
1029
+ }
1030
+ function addBorderSegments(g) {
1031
+ function dfs2(v) {
1032
+ var children = g.children(v);
1033
+ var node = g.node(v);
1034
+ if (children.length) {
1035
+ forEach(children, dfs2);
1036
+ }
1037
+ if (Object.prototype.hasOwnProperty.call(node, "minRank")) {
1038
+ node.borderLeft = [];
1039
+ node.borderRight = [];
1040
+ for (var rank2 = node.minRank, maxRank2 = node.maxRank + 1; rank2 < maxRank2; ++rank2) {
1041
+ addBorderNode(g, "borderLeft", "_bl", v, node, rank2);
1042
+ addBorderNode(g, "borderRight", "_br", v, node, rank2);
1043
+ }
1044
+ }
1045
+ }
1046
+ forEach(g.children(), dfs2);
1047
+ }
1048
+ function addBorderNode(g, prop, prefix, sg, sgNode, rank2) {
1049
+ var label = { width: 0, height: 0, rank: rank2, borderType: prop };
1050
+ var prev = sgNode[prop][rank2 - 1];
1051
+ var curr = addDummyNode(g, "border", label, prefix);
1052
+ sgNode[prop][rank2] = curr;
1053
+ g.setParent(curr, sg);
1054
+ if (prev) {
1055
+ g.setEdge(prev, curr, { weight: 1 });
1056
+ }
1057
+ }
1058
+ function adjust(g) {
1059
+ var rankDir = g.graph().rankdir.toLowerCase();
1060
+ if (rankDir === "lr" || rankDir === "rl") {
1061
+ swapWidthHeight(g);
1062
+ }
1063
+ }
1064
+ function undo$1(g) {
1065
+ var rankDir = g.graph().rankdir.toLowerCase();
1066
+ if (rankDir === "bt" || rankDir === "rl") {
1067
+ reverseY(g);
1068
+ }
1069
+ if (rankDir === "lr" || rankDir === "rl") {
1070
+ swapXY(g);
1071
+ swapWidthHeight(g);
1072
+ }
1073
+ }
1074
+ function swapWidthHeight(g) {
1075
+ forEach(g.nodes(), function(v) {
1076
+ swapWidthHeightOne(g.node(v));
1077
+ });
1078
+ forEach(g.edges(), function(e) {
1079
+ swapWidthHeightOne(g.edge(e));
1080
+ });
1081
+ }
1082
+ function swapWidthHeightOne(attrs) {
1083
+ var w = attrs.width;
1084
+ attrs.width = attrs.height;
1085
+ attrs.height = w;
1086
+ }
1087
+ function reverseY(g) {
1088
+ forEach(g.nodes(), function(v) {
1089
+ reverseYOne(g.node(v));
1090
+ });
1091
+ forEach(g.edges(), function(e) {
1092
+ var edge = g.edge(e);
1093
+ forEach(edge.points, reverseYOne);
1094
+ if (Object.prototype.hasOwnProperty.call(edge, "y")) {
1095
+ reverseYOne(edge);
1096
+ }
1097
+ });
1098
+ }
1099
+ function reverseYOne(attrs) {
1100
+ attrs.y = -attrs.y;
1101
+ }
1102
+ function swapXY(g) {
1103
+ forEach(g.nodes(), function(v) {
1104
+ swapXYOne(g.node(v));
1105
+ });
1106
+ forEach(g.edges(), function(e) {
1107
+ var edge = g.edge(e);
1108
+ forEach(edge.points, swapXYOne);
1109
+ if (Object.prototype.hasOwnProperty.call(edge, "x")) {
1110
+ swapXYOne(edge);
1111
+ }
1112
+ });
1113
+ }
1114
+ function swapXYOne(attrs) {
1115
+ var x = attrs.x;
1116
+ attrs.x = attrs.y;
1117
+ attrs.y = x;
1118
+ }
1119
+ function run$1(g) {
1120
+ g.graph().dummyChains = [];
1121
+ forEach(g.edges(), function(edge) {
1122
+ normalizeEdge(g, edge);
1123
+ });
1124
+ }
1125
+ function normalizeEdge(g, e) {
1126
+ var v = e.v;
1127
+ var vRank = g.node(v).rank;
1128
+ var w = e.w;
1129
+ var wRank = g.node(w).rank;
1130
+ var name = e.name;
1131
+ var edgeLabel = g.edge(e);
1132
+ var labelRank = edgeLabel.labelRank;
1133
+ if (wRank === vRank + 1) return;
1134
+ g.removeEdge(e);
1135
+ var attrs = void 0;
1136
+ var dummy, i;
1137
+ for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {
1138
+ edgeLabel.points = [];
1139
+ attrs = {
1140
+ width: 0,
1141
+ height: 0,
1142
+ edgeLabel,
1143
+ edgeObj: e,
1144
+ rank: vRank
1145
+ };
1146
+ dummy = addDummyNode(g, "edge", attrs, "_d");
1147
+ if (vRank === labelRank) {
1148
+ attrs.width = edgeLabel.width;
1149
+ attrs.height = edgeLabel.height;
1150
+ attrs.dummy = "edge-label";
1151
+ attrs.labelpos = edgeLabel.labelpos;
1152
+ }
1153
+ g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);
1154
+ if (i === 0) {
1155
+ g.graph().dummyChains.push(dummy);
1156
+ }
1157
+ v = dummy;
1158
+ }
1159
+ g.setEdge(v, w, { weight: edgeLabel.weight }, name);
1160
+ }
1161
+ function undo(g) {
1162
+ forEach(g.graph().dummyChains, function(v) {
1163
+ var node = g.node(v);
1164
+ var origLabel = node.edgeLabel;
1165
+ var w;
1166
+ g.setEdge(node.edgeObj, origLabel);
1167
+ while (node.dummy) {
1168
+ w = g.successors(v)[0];
1169
+ g.removeNode(v);
1170
+ origLabel.points.push({ x: node.x, y: node.y });
1171
+ if (node.dummy === "edge-label") {
1172
+ origLabel.x = node.x;
1173
+ origLabel.y = node.y;
1174
+ origLabel.width = node.width;
1175
+ origLabel.height = node.height;
1176
+ }
1177
+ v = w;
1178
+ node = g.node(v);
1179
+ }
1180
+ });
1181
+ }
1182
+ function longestPath(g) {
1183
+ var visited = {};
1184
+ function dfs2(v) {
1185
+ var label = g.node(v);
1186
+ if (Object.prototype.hasOwnProperty.call(visited, v)) {
1187
+ return label.rank;
1188
+ }
1189
+ visited[v] = true;
1190
+ var rank2 = min(
1191
+ map(g.outEdges(v), function(e) {
1192
+ return dfs2(e.w) - g.edge(e).minlen;
1193
+ })
1194
+ );
1195
+ if (rank2 === Number.POSITIVE_INFINITY || // return value of _.map([]) for Lodash 3
1196
+ rank2 === void 0 || // return value of _.map([]) for Lodash 4
1197
+ rank2 === null) {
1198
+ rank2 = 0;
1199
+ }
1200
+ return label.rank = rank2;
1201
+ }
1202
+ forEach(g.sources(), dfs2);
1203
+ }
1204
+ function slack(g, e) {
1205
+ return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;
1206
+ }
1207
+ function feasibleTree(g) {
1208
+ var t = new Graph({ directed: false });
1209
+ var start = g.nodes()[0];
1210
+ var size = g.nodeCount();
1211
+ t.setNode(start, {});
1212
+ var edge, delta;
1213
+ while (tightTree(t, g) < size) {
1214
+ edge = findMinSlackEdge(t, g);
1215
+ delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);
1216
+ shiftRanks(t, g, delta);
1217
+ }
1218
+ return t;
1219
+ }
1220
+ function tightTree(t, g) {
1221
+ function dfs2(v) {
1222
+ forEach(g.nodeEdges(v), function(e) {
1223
+ var edgeV = e.v, w = v === edgeV ? e.w : edgeV;
1224
+ if (!t.hasNode(w) && !slack(g, e)) {
1225
+ t.setNode(w, {});
1226
+ t.setEdge(v, w, {});
1227
+ dfs2(w);
1228
+ }
1229
+ });
1230
+ }
1231
+ forEach(t.nodes(), dfs2);
1232
+ return t.nodeCount();
1233
+ }
1234
+ function findMinSlackEdge(t, g) {
1235
+ return minBy(g.edges(), function(e) {
1236
+ if (t.hasNode(e.v) !== t.hasNode(e.w)) {
1237
+ return slack(g, e);
1238
+ }
1239
+ });
1240
+ }
1241
+ function shiftRanks(t, g, delta) {
1242
+ forEach(t.nodes(), function(v) {
1243
+ g.node(v).rank += delta;
1244
+ });
1245
+ }
1246
+ function CycleException() {
1247
+ }
1248
+ CycleException.prototype = new Error();
1249
+ function dfs$1(g, vs, order2) {
1250
+ if (!isArray(vs)) {
1251
+ vs = [vs];
1252
+ }
1253
+ var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g);
1254
+ var acc = [];
1255
+ var visited = {};
1256
+ forEach(vs, function(v) {
1257
+ if (!g.hasNode(v)) {
1258
+ throw new Error("Graph does not have node: " + v);
1259
+ }
1260
+ doDfs(g, v, order2 === "post", visited, navigation, acc);
1261
+ });
1262
+ return acc;
1263
+ }
1264
+ function doDfs(g, v, postorder2, visited, navigation, acc) {
1265
+ if (!Object.prototype.hasOwnProperty.call(visited, v)) {
1266
+ visited[v] = true;
1267
+ if (!postorder2) {
1268
+ acc.push(v);
1269
+ }
1270
+ forEach(navigation(v), function(w) {
1271
+ doDfs(g, w, postorder2, visited, navigation, acc);
1272
+ });
1273
+ if (postorder2) {
1274
+ acc.push(v);
1275
+ }
1276
+ }
1277
+ }
1278
+ function postorder$1(g, vs) {
1279
+ return dfs$1(g, vs, "post");
1280
+ }
1281
+ function preorder(g, vs) {
1282
+ return dfs$1(g, vs, "pre");
1283
+ }
1284
+ networkSimplex.initLowLimValues = initLowLimValues;
1285
+ networkSimplex.initCutValues = initCutValues;
1286
+ networkSimplex.calcCutValue = calcCutValue;
1287
+ networkSimplex.leaveEdge = leaveEdge;
1288
+ networkSimplex.enterEdge = enterEdge;
1289
+ networkSimplex.exchangeEdges = exchangeEdges;
1290
+ function networkSimplex(g) {
1291
+ g = simplify(g);
1292
+ longestPath(g);
1293
+ var t = feasibleTree(g);
1294
+ initLowLimValues(t);
1295
+ initCutValues(t, g);
1296
+ var e, f;
1297
+ while (e = leaveEdge(t)) {
1298
+ f = enterEdge(t, g, e);
1299
+ exchangeEdges(t, g, e, f);
1300
+ }
1301
+ }
1302
+ function initCutValues(t, g) {
1303
+ var vs = postorder$1(t, t.nodes());
1304
+ vs = vs.slice(0, vs.length - 1);
1305
+ forEach(vs, function(v) {
1306
+ assignCutValue(t, g, v);
1307
+ });
1308
+ }
1309
+ function assignCutValue(t, g, child) {
1310
+ var childLab = t.node(child);
1311
+ var parent = childLab.parent;
1312
+ t.edge(child, parent).cutvalue = calcCutValue(t, g, child);
1313
+ }
1314
+ function calcCutValue(t, g, child) {
1315
+ var childLab = t.node(child);
1316
+ var parent = childLab.parent;
1317
+ var childIsTail = true;
1318
+ var graphEdge = g.edge(child, parent);
1319
+ var cutValue = 0;
1320
+ if (!graphEdge) {
1321
+ childIsTail = false;
1322
+ graphEdge = g.edge(parent, child);
1323
+ }
1324
+ cutValue = graphEdge.weight;
1325
+ forEach(g.nodeEdges(child), function(e) {
1326
+ var isOutEdge = e.v === child, other = isOutEdge ? e.w : e.v;
1327
+ if (other !== parent) {
1328
+ var pointsToHead = isOutEdge === childIsTail, otherWeight = g.edge(e).weight;
1329
+ cutValue += pointsToHead ? otherWeight : -otherWeight;
1330
+ if (isTreeEdge(t, child, other)) {
1331
+ var otherCutValue = t.edge(child, other).cutvalue;
1332
+ cutValue += pointsToHead ? -otherCutValue : otherCutValue;
1333
+ }
1334
+ }
1335
+ });
1336
+ return cutValue;
1337
+ }
1338
+ function initLowLimValues(tree, root2) {
1339
+ if (arguments.length < 2) {
1340
+ root2 = tree.nodes()[0];
1341
+ }
1342
+ dfsAssignLowLim(tree, {}, 1, root2);
1343
+ }
1344
+ function dfsAssignLowLim(tree, visited, nextLim, v, parent) {
1345
+ var low = nextLim;
1346
+ var label = tree.node(v);
1347
+ visited[v] = true;
1348
+ forEach(tree.neighbors(v), function(w) {
1349
+ if (!Object.prototype.hasOwnProperty.call(visited, w)) {
1350
+ nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);
1351
+ }
1352
+ });
1353
+ label.low = low;
1354
+ label.lim = nextLim++;
1355
+ if (parent) {
1356
+ label.parent = parent;
1357
+ } else {
1358
+ delete label.parent;
1359
+ }
1360
+ return nextLim;
1361
+ }
1362
+ function leaveEdge(tree) {
1363
+ return find(tree.edges(), function(e) {
1364
+ return tree.edge(e).cutvalue < 0;
1365
+ });
1366
+ }
1367
+ function enterEdge(t, g, edge) {
1368
+ var v = edge.v;
1369
+ var w = edge.w;
1370
+ if (!g.hasEdge(v, w)) {
1371
+ v = edge.w;
1372
+ w = edge.v;
1373
+ }
1374
+ var vLabel = t.node(v);
1375
+ var wLabel = t.node(w);
1376
+ var tailLabel = vLabel;
1377
+ var flip = false;
1378
+ if (vLabel.lim > wLabel.lim) {
1379
+ tailLabel = wLabel;
1380
+ flip = true;
1381
+ }
1382
+ var candidates = filter(g.edges(), function(edge2) {
1383
+ return flip === isDescendant(t, t.node(edge2.v), tailLabel) && flip !== isDescendant(t, t.node(edge2.w), tailLabel);
1384
+ });
1385
+ return minBy(candidates, function(edge2) {
1386
+ return slack(g, edge2);
1387
+ });
1388
+ }
1389
+ function exchangeEdges(t, g, e, f) {
1390
+ var v = e.v;
1391
+ var w = e.w;
1392
+ t.removeEdge(v, w);
1393
+ t.setEdge(f.v, f.w, {});
1394
+ initLowLimValues(t);
1395
+ initCutValues(t, g);
1396
+ updateRanks(t, g);
1397
+ }
1398
+ function updateRanks(t, g) {
1399
+ var root2 = find(t.nodes(), function(v) {
1400
+ return !g.node(v).parent;
1401
+ });
1402
+ var vs = preorder(t, root2);
1403
+ vs = vs.slice(1);
1404
+ forEach(vs, function(v) {
1405
+ var parent = t.node(v).parent, edge = g.edge(v, parent), flipped = false;
1406
+ if (!edge) {
1407
+ edge = g.edge(parent, v);
1408
+ flipped = true;
1409
+ }
1410
+ g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);
1411
+ });
1412
+ }
1413
+ function isTreeEdge(tree, u, v) {
1414
+ return tree.hasEdge(u, v);
1415
+ }
1416
+ function isDescendant(tree, vLabel, rootLabel) {
1417
+ return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;
1418
+ }
1419
+ function rank(g) {
1420
+ switch (g.graph().ranker) {
1421
+ case "network-simplex":
1422
+ networkSimplexRanker(g);
1423
+ break;
1424
+ case "tight-tree":
1425
+ tightTreeRanker(g);
1426
+ break;
1427
+ case "longest-path":
1428
+ longestPathRanker(g);
1429
+ break;
1430
+ default:
1431
+ networkSimplexRanker(g);
1432
+ }
1433
+ }
1434
+ var longestPathRanker = longestPath;
1435
+ function tightTreeRanker(g) {
1436
+ longestPath(g);
1437
+ feasibleTree(g);
1438
+ }
1439
+ function networkSimplexRanker(g) {
1440
+ networkSimplex(g);
1441
+ }
1442
+ function run(g) {
1443
+ var root2 = addDummyNode(g, "root", {}, "_root");
1444
+ var depths = treeDepths(g);
1445
+ var height = max(values(depths)) - 1;
1446
+ var nodeSep = 2 * height + 1;
1447
+ g.graph().nestingRoot = root2;
1448
+ forEach(g.edges(), function(e) {
1449
+ g.edge(e).minlen *= nodeSep;
1450
+ });
1451
+ var weight = sumWeights(g) + 1;
1452
+ forEach(g.children(), function(child) {
1453
+ dfs(g, root2, nodeSep, weight, height, depths, child);
1454
+ });
1455
+ g.graph().nodeRankFactor = nodeSep;
1456
+ }
1457
+ function dfs(g, root2, nodeSep, weight, height, depths, v) {
1458
+ var children = g.children(v);
1459
+ if (!children.length) {
1460
+ if (v !== root2) {
1461
+ g.setEdge(root2, v, { weight: 0, minlen: nodeSep });
1462
+ }
1463
+ return;
1464
+ }
1465
+ var top = addBorderNode$1(g, "_bt");
1466
+ var bottom = addBorderNode$1(g, "_bb");
1467
+ var label = g.node(v);
1468
+ g.setParent(top, v);
1469
+ label.borderTop = top;
1470
+ g.setParent(bottom, v);
1471
+ label.borderBottom = bottom;
1472
+ forEach(children, function(child) {
1473
+ dfs(g, root2, nodeSep, weight, height, depths, child);
1474
+ var childNode = g.node(child);
1475
+ var childTop = childNode.borderTop ? childNode.borderTop : child;
1476
+ var childBottom = childNode.borderBottom ? childNode.borderBottom : child;
1477
+ var thisWeight = childNode.borderTop ? weight : 2 * weight;
1478
+ var minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;
1479
+ g.setEdge(top, childTop, {
1480
+ weight: thisWeight,
1481
+ minlen,
1482
+ nestingEdge: true
1483
+ });
1484
+ g.setEdge(childBottom, bottom, {
1485
+ weight: thisWeight,
1486
+ minlen,
1487
+ nestingEdge: true
1488
+ });
1489
+ });
1490
+ if (!g.parent(v)) {
1491
+ g.setEdge(root2, top, { weight: 0, minlen: height + depths[v] });
1492
+ }
1493
+ }
1494
+ function treeDepths(g) {
1495
+ var depths = {};
1496
+ function dfs2(v, depth) {
1497
+ var children = g.children(v);
1498
+ if (children && children.length) {
1499
+ forEach(children, function(child) {
1500
+ dfs2(child, depth + 1);
1501
+ });
1502
+ }
1503
+ depths[v] = depth;
1504
+ }
1505
+ forEach(g.children(), function(v) {
1506
+ dfs2(v, 1);
1507
+ });
1508
+ return depths;
1509
+ }
1510
+ function sumWeights(g) {
1511
+ return reduce(
1512
+ g.edges(),
1513
+ function(acc, e) {
1514
+ return acc + g.edge(e).weight;
1515
+ },
1516
+ 0
1517
+ );
1518
+ }
1519
+ function cleanup(g) {
1520
+ var graphLabel = g.graph();
1521
+ g.removeNode(graphLabel.nestingRoot);
1522
+ delete graphLabel.nestingRoot;
1523
+ forEach(g.edges(), function(e) {
1524
+ var edge = g.edge(e);
1525
+ if (edge.nestingEdge) {
1526
+ g.removeEdge(e);
1527
+ }
1528
+ });
1529
+ }
1530
+ function addSubgraphConstraints(g, cg, vs) {
1531
+ var prev = {}, rootPrev;
1532
+ forEach(vs, function(v) {
1533
+ var child = g.parent(v), parent, prevChild;
1534
+ while (child) {
1535
+ parent = g.parent(child);
1536
+ if (parent) {
1537
+ prevChild = prev[parent];
1538
+ prev[parent] = child;
1539
+ } else {
1540
+ prevChild = rootPrev;
1541
+ rootPrev = child;
1542
+ }
1543
+ if (prevChild && prevChild !== child) {
1544
+ cg.setEdge(prevChild, child);
1545
+ return;
1546
+ }
1547
+ child = parent;
1548
+ }
1549
+ });
1550
+ }
1551
+ function buildLayerGraph(g, rank2, relationship) {
1552
+ var root2 = createRootNode(g), result = new Graph({ compound: true }).setGraph({ root: root2 }).setDefaultNodeLabel(function(v) {
1553
+ return g.node(v);
1554
+ });
1555
+ forEach(g.nodes(), function(v) {
1556
+ var node = g.node(v), parent = g.parent(v);
1557
+ if (node.rank === rank2 || node.minRank <= rank2 && rank2 <= node.maxRank) {
1558
+ result.setNode(v);
1559
+ result.setParent(v, parent || root2);
1560
+ forEach(g[relationship](v), function(e) {
1561
+ var u = e.v === v ? e.w : e.v, edge = result.edge(u, v), weight = !isUndefined(edge) ? edge.weight : 0;
1562
+ result.setEdge(u, v, { weight: g.edge(e).weight + weight });
1563
+ });
1564
+ if (Object.prototype.hasOwnProperty.call(node, "minRank")) {
1565
+ result.setNode(v, {
1566
+ borderLeft: node.borderLeft[rank2],
1567
+ borderRight: node.borderRight[rank2]
1568
+ });
1569
+ }
1570
+ }
1571
+ });
1572
+ return result;
1573
+ }
1574
+ function createRootNode(g) {
1575
+ var v;
1576
+ while (g.hasNode(v = uniqueId("_root"))) ;
1577
+ return v;
1578
+ }
1579
+ function crossCount(g, layering) {
1580
+ var cc = 0;
1581
+ for (var i = 1; i < layering.length; ++i) {
1582
+ cc += twoLayerCrossCount(g, layering[i - 1], layering[i]);
1583
+ }
1584
+ return cc;
1585
+ }
1586
+ function twoLayerCrossCount(g, northLayer, southLayer) {
1587
+ var southPos = zipObject(
1588
+ southLayer,
1589
+ map(southLayer, function(v, i) {
1590
+ return i;
1591
+ })
1592
+ );
1593
+ var southEntries = flatten(
1594
+ map(northLayer, function(v) {
1595
+ return sortBy(
1596
+ map(g.outEdges(v), function(e) {
1597
+ return { pos: southPos[e.w], weight: g.edge(e).weight };
1598
+ }),
1599
+ "pos"
1600
+ );
1601
+ })
1602
+ );
1603
+ var firstIndex = 1;
1604
+ while (firstIndex < southLayer.length) firstIndex <<= 1;
1605
+ var treeSize = 2 * firstIndex - 1;
1606
+ firstIndex -= 1;
1607
+ var tree = map(new Array(treeSize), function() {
1608
+ return 0;
1609
+ });
1610
+ var cc = 0;
1611
+ forEach(
1612
+ // @ts-expect-error
1613
+ southEntries.forEach(function(entry) {
1614
+ var index = entry.pos + firstIndex;
1615
+ tree[index] += entry.weight;
1616
+ var weightSum = 0;
1617
+ while (index > 0) {
1618
+ if (index % 2) {
1619
+ weightSum += tree[index + 1];
1620
+ }
1621
+ index = index - 1 >> 1;
1622
+ tree[index] += entry.weight;
1623
+ }
1624
+ cc += entry.weight * weightSum;
1625
+ })
1626
+ );
1627
+ return cc;
1628
+ }
1629
+ function initOrder(g) {
1630
+ var visited = {};
1631
+ var simpleNodes = filter(g.nodes(), function(v) {
1632
+ return !g.children(v).length;
1633
+ });
1634
+ var maxRank2 = max(
1635
+ map(simpleNodes, function(v) {
1636
+ return g.node(v).rank;
1637
+ })
1638
+ );
1639
+ var layers = map(range(maxRank2 + 1), function() {
1640
+ return [];
1641
+ });
1642
+ function dfs2(v) {
1643
+ if (has(visited, v)) return;
1644
+ visited[v] = true;
1645
+ var node = g.node(v);
1646
+ layers[node.rank].push(v);
1647
+ forEach(g.successors(v), dfs2);
1648
+ }
1649
+ var orderedVs = sortBy(simpleNodes, function(v) {
1650
+ return g.node(v).rank;
1651
+ });
1652
+ forEach(orderedVs, dfs2);
1653
+ return layers;
1654
+ }
1655
+ function barycenter(g, movable) {
1656
+ return map(movable, function(v) {
1657
+ var inV = g.inEdges(v);
1658
+ if (!inV.length) {
1659
+ return { v };
1660
+ } else {
1661
+ var result = reduce(
1662
+ inV,
1663
+ function(acc, e) {
1664
+ var edge = g.edge(e), nodeU = g.node(e.v);
1665
+ return {
1666
+ sum: acc.sum + edge.weight * nodeU.order,
1667
+ weight: acc.weight + edge.weight
1668
+ };
1669
+ },
1670
+ { sum: 0, weight: 0 }
1671
+ );
1672
+ return {
1673
+ v,
1674
+ barycenter: result.sum / result.weight,
1675
+ weight: result.weight
1676
+ };
1677
+ }
1678
+ });
1679
+ }
1680
+ function resolveConflicts(entries, cg) {
1681
+ var mappedEntries = {};
1682
+ forEach(entries, function(entry, i) {
1683
+ var tmp = mappedEntries[entry.v] = {
1684
+ indegree: 0,
1685
+ in: [],
1686
+ out: [],
1687
+ vs: [entry.v],
1688
+ i
1689
+ };
1690
+ if (!isUndefined(entry.barycenter)) {
1691
+ tmp.barycenter = entry.barycenter;
1692
+ tmp.weight = entry.weight;
1693
+ }
1694
+ });
1695
+ forEach(cg.edges(), function(e) {
1696
+ var entryV = mappedEntries[e.v];
1697
+ var entryW = mappedEntries[e.w];
1698
+ if (!isUndefined(entryV) && !isUndefined(entryW)) {
1699
+ entryW.indegree++;
1700
+ entryV.out.push(mappedEntries[e.w]);
1701
+ }
1702
+ });
1703
+ var sourceSet = filter(mappedEntries, function(entry) {
1704
+ return !entry.indegree;
1705
+ });
1706
+ return doResolveConflicts(sourceSet);
1707
+ }
1708
+ function doResolveConflicts(sourceSet) {
1709
+ var entries = [];
1710
+ function handleIn(vEntry) {
1711
+ return function(uEntry) {
1712
+ if (uEntry.merged) {
1713
+ return;
1714
+ }
1715
+ if (isUndefined(uEntry.barycenter) || isUndefined(vEntry.barycenter) || uEntry.barycenter >= vEntry.barycenter) {
1716
+ mergeEntries(vEntry, uEntry);
1717
+ }
1718
+ };
1719
+ }
1720
+ function handleOut(vEntry) {
1721
+ return function(wEntry) {
1722
+ wEntry["in"].push(vEntry);
1723
+ if (--wEntry.indegree === 0) {
1724
+ sourceSet.push(wEntry);
1725
+ }
1726
+ };
1727
+ }
1728
+ while (sourceSet.length) {
1729
+ var entry = sourceSet.pop();
1730
+ entries.push(entry);
1731
+ forEach(entry["in"].reverse(), handleIn(entry));
1732
+ forEach(entry.out, handleOut(entry));
1733
+ }
1734
+ return map(
1735
+ filter(entries, function(entry2) {
1736
+ return !entry2.merged;
1737
+ }),
1738
+ function(entry2) {
1739
+ return pick(entry2, ["vs", "i", "barycenter", "weight"]);
1740
+ }
1741
+ );
1742
+ }
1743
+ function mergeEntries(target, source) {
1744
+ var sum = 0;
1745
+ var weight = 0;
1746
+ if (target.weight) {
1747
+ sum += target.barycenter * target.weight;
1748
+ weight += target.weight;
1749
+ }
1750
+ if (source.weight) {
1751
+ sum += source.barycenter * source.weight;
1752
+ weight += source.weight;
1753
+ }
1754
+ target.vs = source.vs.concat(target.vs);
1755
+ target.barycenter = sum / weight;
1756
+ target.weight = weight;
1757
+ target.i = Math.min(source.i, target.i);
1758
+ source.merged = true;
1759
+ }
1760
+ function sort(entries, biasRight) {
1761
+ var parts = partition(entries, function(entry) {
1762
+ return Object.prototype.hasOwnProperty.call(entry, "barycenter");
1763
+ });
1764
+ var sortable = parts.lhs, unsortable = sortBy(parts.rhs, function(entry) {
1765
+ return -entry.i;
1766
+ }), vs = [], sum = 0, weight = 0, vsIndex = 0;
1767
+ sortable.sort(compareWithBias(!!biasRight));
1768
+ vsIndex = consumeUnsortable(vs, unsortable, vsIndex);
1769
+ forEach(sortable, function(entry) {
1770
+ vsIndex += entry.vs.length;
1771
+ vs.push(entry.vs);
1772
+ sum += entry.barycenter * entry.weight;
1773
+ weight += entry.weight;
1774
+ vsIndex = consumeUnsortable(vs, unsortable, vsIndex);
1775
+ });
1776
+ var result = { vs: flatten(vs) };
1777
+ if (weight) {
1778
+ result.barycenter = sum / weight;
1779
+ result.weight = weight;
1780
+ }
1781
+ return result;
1782
+ }
1783
+ function consumeUnsortable(vs, unsortable, index) {
1784
+ var last$1;
1785
+ while (unsortable.length && (last$1 = last(unsortable)).i <= index) {
1786
+ unsortable.pop();
1787
+ vs.push(last$1.vs);
1788
+ index++;
1789
+ }
1790
+ return index;
1791
+ }
1792
+ function compareWithBias(bias) {
1793
+ return function(entryV, entryW) {
1794
+ if (entryV.barycenter < entryW.barycenter) {
1795
+ return -1;
1796
+ } else if (entryV.barycenter > entryW.barycenter) {
1797
+ return 1;
1798
+ }
1799
+ return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;
1800
+ };
1801
+ }
1802
+ function sortSubgraph(g, v, cg, biasRight) {
1803
+ var movable = g.children(v);
1804
+ var node = g.node(v);
1805
+ var bl = node ? node.borderLeft : void 0;
1806
+ var br = node ? node.borderRight : void 0;
1807
+ var subgraphs = {};
1808
+ if (bl) {
1809
+ movable = filter(movable, function(w) {
1810
+ return w !== bl && w !== br;
1811
+ });
1812
+ }
1813
+ var barycenters = barycenter(g, movable);
1814
+ forEach(barycenters, function(entry) {
1815
+ if (g.children(entry.v).length) {
1816
+ var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);
1817
+ subgraphs[entry.v] = subgraphResult;
1818
+ if (Object.prototype.hasOwnProperty.call(subgraphResult, "barycenter")) {
1819
+ mergeBarycenters(entry, subgraphResult);
1820
+ }
1821
+ }
1822
+ });
1823
+ var entries = resolveConflicts(barycenters, cg);
1824
+ expandSubgraphs(entries, subgraphs);
1825
+ var result = sort(entries, biasRight);
1826
+ if (bl) {
1827
+ result.vs = flatten([bl, result.vs, br]);
1828
+ if (g.predecessors(bl).length) {
1829
+ var blPred = g.node(g.predecessors(bl)[0]), brPred = g.node(g.predecessors(br)[0]);
1830
+ if (!Object.prototype.hasOwnProperty.call(result, "barycenter")) {
1831
+ result.barycenter = 0;
1832
+ result.weight = 0;
1833
+ }
1834
+ result.barycenter = (result.barycenter * result.weight + blPred.order + brPred.order) / (result.weight + 2);
1835
+ result.weight += 2;
1836
+ }
1837
+ }
1838
+ return result;
1839
+ }
1840
+ function expandSubgraphs(entries, subgraphs) {
1841
+ forEach(entries, function(entry) {
1842
+ entry.vs = flatten(
1843
+ entry.vs.map(function(v) {
1844
+ if (subgraphs[v]) {
1845
+ return subgraphs[v].vs;
1846
+ }
1847
+ return v;
1848
+ })
1849
+ );
1850
+ });
1851
+ }
1852
+ function mergeBarycenters(target, other) {
1853
+ if (!isUndefined(target.barycenter)) {
1854
+ target.barycenter = (target.barycenter * target.weight + other.barycenter * other.weight) / (target.weight + other.weight);
1855
+ target.weight += other.weight;
1856
+ } else {
1857
+ target.barycenter = other.barycenter;
1858
+ target.weight = other.weight;
1859
+ }
1860
+ }
1861
+ function order(g) {
1862
+ var maxRank$1 = maxRank(g), downLayerGraphs = buildLayerGraphs(g, range(1, maxRank$1 + 1), "inEdges"), upLayerGraphs = buildLayerGraphs(g, range(maxRank$1 - 1, -1, -1), "outEdges");
1863
+ var layering = initOrder(g);
1864
+ assignOrder(g, layering);
1865
+ var bestCC = Number.POSITIVE_INFINITY, best;
1866
+ for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {
1867
+ sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);
1868
+ layering = buildLayerMatrix(g);
1869
+ var cc = crossCount(g, layering);
1870
+ if (cc < bestCC) {
1871
+ lastBest = 0;
1872
+ best = cloneDeep(layering);
1873
+ bestCC = cc;
1874
+ }
1875
+ }
1876
+ assignOrder(g, best);
1877
+ }
1878
+ function buildLayerGraphs(g, ranks, relationship) {
1879
+ return map(ranks, function(rank2) {
1880
+ return buildLayerGraph(g, rank2, relationship);
1881
+ });
1882
+ }
1883
+ function sweepLayerGraphs(layerGraphs, biasRight) {
1884
+ var cg = new Graph();
1885
+ forEach(layerGraphs, function(lg) {
1886
+ var root2 = lg.graph().root;
1887
+ var sorted = sortSubgraph(lg, root2, cg, biasRight);
1888
+ forEach(sorted.vs, function(v, i) {
1889
+ lg.node(v).order = i;
1890
+ });
1891
+ addSubgraphConstraints(lg, cg, sorted.vs);
1892
+ });
1893
+ }
1894
+ function assignOrder(g, layering) {
1895
+ forEach(layering, function(layer) {
1896
+ forEach(layer, function(v, i) {
1897
+ g.node(v).order = i;
1898
+ });
1899
+ });
1900
+ }
1901
+ function parentDummyChains(g) {
1902
+ var postorderNums = postorder(g);
1903
+ forEach(g.graph().dummyChains, function(v) {
1904
+ var node = g.node(v);
1905
+ var edgeObj = node.edgeObj;
1906
+ var pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w);
1907
+ var path = pathData.path;
1908
+ var lca = pathData.lca;
1909
+ var pathIdx = 0;
1910
+ var pathV = path[pathIdx];
1911
+ var ascending = true;
1912
+ while (v !== edgeObj.w) {
1913
+ node = g.node(v);
1914
+ if (ascending) {
1915
+ while ((pathV = path[pathIdx]) !== lca && g.node(pathV).maxRank < node.rank) {
1916
+ pathIdx++;
1917
+ }
1918
+ if (pathV === lca) {
1919
+ ascending = false;
1920
+ }
1921
+ }
1922
+ if (!ascending) {
1923
+ while (pathIdx < path.length - 1 && g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {
1924
+ pathIdx++;
1925
+ }
1926
+ pathV = path[pathIdx];
1927
+ }
1928
+ g.setParent(v, pathV);
1929
+ v = g.successors(v)[0];
1930
+ }
1931
+ });
1932
+ }
1933
+ function findPath(g, postorderNums, v, w) {
1934
+ var vPath = [];
1935
+ var wPath = [];
1936
+ var low = Math.min(postorderNums[v].low, postorderNums[w].low);
1937
+ var lim = Math.max(postorderNums[v].lim, postorderNums[w].lim);
1938
+ var parent;
1939
+ var lca;
1940
+ parent = v;
1941
+ do {
1942
+ parent = g.parent(parent);
1943
+ vPath.push(parent);
1944
+ } while (parent && (postorderNums[parent].low > low || lim > postorderNums[parent].lim));
1945
+ lca = parent;
1946
+ parent = w;
1947
+ while ((parent = g.parent(parent)) !== lca) {
1948
+ wPath.push(parent);
1949
+ }
1950
+ return { path: vPath.concat(wPath.reverse()), lca };
1951
+ }
1952
+ function postorder(g) {
1953
+ var result = {};
1954
+ var lim = 0;
1955
+ function dfs2(v) {
1956
+ var low = lim;
1957
+ forEach(g.children(v), dfs2);
1958
+ result[v] = { low, lim: lim++ };
1959
+ }
1960
+ forEach(g.children(), dfs2);
1961
+ return result;
1962
+ }
1963
+ function findType1Conflicts(g, layering) {
1964
+ var conflicts = {};
1965
+ function visitLayer(prevLayer, layer) {
1966
+ var k0 = 0, scanPos = 0, prevLayerLength = prevLayer.length, lastNode = last(layer);
1967
+ forEach(layer, function(v, i) {
1968
+ var w = findOtherInnerSegmentNode(g, v), k1 = w ? g.node(w).order : prevLayerLength;
1969
+ if (w || v === lastNode) {
1970
+ forEach(layer.slice(scanPos, i + 1), function(scanNode) {
1971
+ forEach(g.predecessors(scanNode), function(u) {
1972
+ var uLabel = g.node(u), uPos = uLabel.order;
1973
+ if ((uPos < k0 || k1 < uPos) && !(uLabel.dummy && g.node(scanNode).dummy)) {
1974
+ addConflict(conflicts, u, scanNode);
1975
+ }
1976
+ });
1977
+ });
1978
+ scanPos = i + 1;
1979
+ k0 = k1;
1980
+ }
1981
+ });
1982
+ return layer;
1983
+ }
1984
+ reduce(layering, visitLayer);
1985
+ return conflicts;
1986
+ }
1987
+ function findType2Conflicts(g, layering) {
1988
+ var conflicts = {};
1989
+ function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {
1990
+ var v;
1991
+ forEach(range(southPos, southEnd), function(i) {
1992
+ v = south[i];
1993
+ if (g.node(v).dummy) {
1994
+ forEach(g.predecessors(v), function(u) {
1995
+ var uNode = g.node(u);
1996
+ if (uNode.dummy && (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {
1997
+ addConflict(conflicts, u, v);
1998
+ }
1999
+ });
2000
+ }
2001
+ });
2002
+ }
2003
+ function visitLayer(north, south) {
2004
+ var prevNorthPos = -1, nextNorthPos, southPos = 0;
2005
+ forEach(south, function(v, southLookahead) {
2006
+ if (g.node(v).dummy === "border") {
2007
+ var predecessors = g.predecessors(v);
2008
+ if (predecessors.length) {
2009
+ nextNorthPos = g.node(predecessors[0]).order;
2010
+ scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);
2011
+ southPos = southLookahead;
2012
+ prevNorthPos = nextNorthPos;
2013
+ }
2014
+ }
2015
+ scan(south, southPos, south.length, nextNorthPos, north.length);
2016
+ });
2017
+ return south;
2018
+ }
2019
+ reduce(layering, visitLayer);
2020
+ return conflicts;
2021
+ }
2022
+ function findOtherInnerSegmentNode(g, v) {
2023
+ if (g.node(v).dummy) {
2024
+ return find(g.predecessors(v), function(u) {
2025
+ return g.node(u).dummy;
2026
+ });
2027
+ }
2028
+ }
2029
+ function addConflict(conflicts, v, w) {
2030
+ if (v > w) {
2031
+ var tmp = v;
2032
+ v = w;
2033
+ w = tmp;
2034
+ }
2035
+ if (!Object.prototype.hasOwnProperty.call(conflicts, v)) {
2036
+ Object.defineProperty(conflicts, v, {
2037
+ enumerable: true,
2038
+ configurable: true,
2039
+ value: {},
2040
+ writable: true
2041
+ });
2042
+ }
2043
+ var conflictsV = conflicts[v];
2044
+ Object.defineProperty(conflictsV, w, {
2045
+ enumerable: true,
2046
+ configurable: true,
2047
+ value: true,
2048
+ writable: true
2049
+ });
2050
+ }
2051
+ function hasConflict(conflicts, v, w) {
2052
+ if (v > w) {
2053
+ var tmp = v;
2054
+ v = w;
2055
+ w = tmp;
2056
+ }
2057
+ return !!conflicts[v] && Object.prototype.hasOwnProperty.call(conflicts[v], w);
2058
+ }
2059
+ function verticalAlignment(g, layering, conflicts, neighborFn) {
2060
+ var root2 = {}, align = {}, pos = {};
2061
+ forEach(layering, function(layer) {
2062
+ forEach(layer, function(v, order2) {
2063
+ root2[v] = v;
2064
+ align[v] = v;
2065
+ pos[v] = order2;
2066
+ });
2067
+ });
2068
+ forEach(layering, function(layer) {
2069
+ var prevIdx = -1;
2070
+ forEach(layer, function(v) {
2071
+ var ws = neighborFn(v);
2072
+ if (ws.length) {
2073
+ ws = sortBy(ws, function(w2) {
2074
+ return pos[w2];
2075
+ });
2076
+ var mp = (ws.length - 1) / 2;
2077
+ for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {
2078
+ var w = ws[i];
2079
+ if (align[v] === v && prevIdx < pos[w] && !hasConflict(conflicts, v, w)) {
2080
+ align[w] = v;
2081
+ align[v] = root2[v] = root2[w];
2082
+ prevIdx = pos[w];
2083
+ }
2084
+ }
2085
+ }
2086
+ });
2087
+ });
2088
+ return { root: root2, align };
2089
+ }
2090
+ function horizontalCompaction(g, layering, root2, align, reverseSep) {
2091
+ var xs = {}, blockG = buildBlockGraph(g, layering, root2, reverseSep), borderType = reverseSep ? "borderLeft" : "borderRight";
2092
+ function iterate(setXsFunc, nextNodesFunc) {
2093
+ var stack = blockG.nodes();
2094
+ var elem = stack.pop();
2095
+ var visited = {};
2096
+ while (elem) {
2097
+ if (visited[elem]) {
2098
+ setXsFunc(elem);
2099
+ } else {
2100
+ visited[elem] = true;
2101
+ stack.push(elem);
2102
+ stack = stack.concat(nextNodesFunc(elem));
2103
+ }
2104
+ elem = stack.pop();
2105
+ }
2106
+ }
2107
+ function pass1(elem) {
2108
+ xs[elem] = blockG.inEdges(elem).reduce(function(acc, e) {
2109
+ return Math.max(acc, xs[e.v] + blockG.edge(e));
2110
+ }, 0);
2111
+ }
2112
+ function pass2(elem) {
2113
+ var min2 = blockG.outEdges(elem).reduce(function(acc, e) {
2114
+ return Math.min(acc, xs[e.w] - blockG.edge(e));
2115
+ }, Number.POSITIVE_INFINITY);
2116
+ var node = g.node(elem);
2117
+ if (min2 !== Number.POSITIVE_INFINITY && node.borderType !== borderType) {
2118
+ xs[elem] = Math.max(xs[elem], min2);
2119
+ }
2120
+ }
2121
+ iterate(pass1, blockG.predecessors.bind(blockG));
2122
+ iterate(pass2, blockG.successors.bind(blockG));
2123
+ forEach(align, function(v) {
2124
+ xs[v] = xs[root2[v]];
2125
+ });
2126
+ return xs;
2127
+ }
2128
+ function buildBlockGraph(g, layering, root2, reverseSep) {
2129
+ var blockGraph = new Graph(), graphLabel = g.graph(), sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);
2130
+ forEach(layering, function(layer) {
2131
+ var u;
2132
+ forEach(layer, function(v) {
2133
+ var vRoot = root2[v];
2134
+ blockGraph.setNode(vRoot);
2135
+ if (u) {
2136
+ var uRoot = root2[u], prevMax = blockGraph.edge(uRoot, vRoot);
2137
+ blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));
2138
+ }
2139
+ u = v;
2140
+ });
2141
+ });
2142
+ return blockGraph;
2143
+ }
2144
+ function findSmallestWidthAlignment(g, xss) {
2145
+ return minBy(values(xss), function(xs) {
2146
+ var max2 = Number.NEGATIVE_INFINITY;
2147
+ var min2 = Number.POSITIVE_INFINITY;
2148
+ forIn(xs, function(x, v) {
2149
+ var halfWidth = width(g, v) / 2;
2150
+ max2 = Math.max(x + halfWidth, max2);
2151
+ min2 = Math.min(x - halfWidth, min2);
2152
+ });
2153
+ return max2 - min2;
2154
+ });
2155
+ }
2156
+ function alignCoordinates(xss, alignTo) {
2157
+ var alignToVals = values(alignTo), alignToMin = min(alignToVals), alignToMax = max(alignToVals);
2158
+ forEach(["u", "d"], function(vert) {
2159
+ forEach(["l", "r"], function(horiz) {
2160
+ var alignment = vert + horiz, xs = xss[alignment], delta;
2161
+ if (xs === alignTo) return;
2162
+ var xsVals = values(xs);
2163
+ delta = horiz === "l" ? alignToMin - min(xsVals) : alignToMax - max(xsVals);
2164
+ if (delta) {
2165
+ xss[alignment] = mapValues(xs, function(x) {
2166
+ return x + delta;
2167
+ });
2168
+ }
2169
+ });
2170
+ });
2171
+ }
2172
+ function balance(xss, align) {
2173
+ return mapValues(xss.ul, function(ignore, v) {
2174
+ if (align) {
2175
+ return xss[align.toLowerCase()][v];
2176
+ } else {
2177
+ var xs = sortBy(map(xss, v));
2178
+ return (xs[1] + xs[2]) / 2;
2179
+ }
2180
+ });
2181
+ }
2182
+ function positionX(g) {
2183
+ var layering = buildLayerMatrix(g);
2184
+ var conflicts = merge(findType1Conflicts(g, layering), findType2Conflicts(g, layering));
2185
+ var xss = {};
2186
+ var adjustedLayering;
2187
+ forEach(["u", "d"], function(vert) {
2188
+ adjustedLayering = vert === "u" ? layering : values(layering).reverse();
2189
+ forEach(["l", "r"], function(horiz) {
2190
+ if (horiz === "r") {
2191
+ adjustedLayering = map(adjustedLayering, function(inner) {
2192
+ return values(inner).reverse();
2193
+ });
2194
+ }
2195
+ var neighborFn = (vert === "u" ? g.predecessors : g.successors).bind(g);
2196
+ var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);
2197
+ var xs = horizontalCompaction(g, adjustedLayering, align.root, align.align, horiz === "r");
2198
+ if (horiz === "r") {
2199
+ xs = mapValues(xs, function(x) {
2200
+ return -x;
2201
+ });
2202
+ }
2203
+ xss[vert + horiz] = xs;
2204
+ });
2205
+ });
2206
+ var smallestWidth = findSmallestWidthAlignment(g, xss);
2207
+ alignCoordinates(xss, smallestWidth);
2208
+ return balance(xss, g.graph().align);
2209
+ }
2210
+ function sep(nodeSep, edgeSep, reverseSep) {
2211
+ return function(g, v, w) {
2212
+ var vLabel = g.node(v);
2213
+ var wLabel = g.node(w);
2214
+ var sum = 0;
2215
+ var delta;
2216
+ sum += vLabel.width / 2;
2217
+ if (Object.prototype.hasOwnProperty.call(vLabel, "labelpos")) {
2218
+ switch (vLabel.labelpos.toLowerCase()) {
2219
+ case "l":
2220
+ delta = -vLabel.width / 2;
2221
+ break;
2222
+ case "r":
2223
+ delta = vLabel.width / 2;
2224
+ break;
2225
+ }
2226
+ }
2227
+ if (delta) {
2228
+ sum += reverseSep ? delta : -delta;
2229
+ }
2230
+ delta = 0;
2231
+ sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;
2232
+ sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;
2233
+ sum += wLabel.width / 2;
2234
+ if (Object.prototype.hasOwnProperty.call(wLabel, "labelpos")) {
2235
+ switch (wLabel.labelpos.toLowerCase()) {
2236
+ case "l":
2237
+ delta = wLabel.width / 2;
2238
+ break;
2239
+ case "r":
2240
+ delta = -wLabel.width / 2;
2241
+ break;
2242
+ }
2243
+ }
2244
+ if (delta) {
2245
+ sum += reverseSep ? delta : -delta;
2246
+ }
2247
+ delta = 0;
2248
+ return sum;
2249
+ };
2250
+ }
2251
+ function width(g, v) {
2252
+ return g.node(v).width;
2253
+ }
2254
+ function position(g) {
2255
+ g = asNonCompoundGraph(g);
2256
+ positionY(g);
2257
+ forOwn(positionX(g), function(x, v) {
2258
+ g.node(v).x = x;
2259
+ });
2260
+ }
2261
+ function positionY(g) {
2262
+ var layering = buildLayerMatrix(g);
2263
+ var rankSep = g.graph().ranksep;
2264
+ var prevY = 0;
2265
+ forEach(layering, function(layer) {
2266
+ var maxHeight = max(
2267
+ map(layer, function(v) {
2268
+ return g.node(v).height;
2269
+ })
2270
+ );
2271
+ forEach(layer, function(v) {
2272
+ g.node(v).y = prevY + maxHeight / 2;
2273
+ });
2274
+ prevY += maxHeight + rankSep;
2275
+ });
2276
+ }
2277
+ function layout(g, opts) {
2278
+ var time = notime;
2279
+ time("layout", () => {
2280
+ var layoutGraph = time(" buildLayoutGraph", () => buildLayoutGraph(g));
2281
+ time(" runLayout", () => runLayout(layoutGraph, time));
2282
+ time(" updateInputGraph", () => updateInputGraph(g, layoutGraph));
2283
+ });
2284
+ }
2285
+ function runLayout(g, time) {
2286
+ time(" makeSpaceForEdgeLabels", () => makeSpaceForEdgeLabels(g));
2287
+ time(" removeSelfEdges", () => removeSelfEdges(g));
2288
+ time(" acyclic", () => run$2(g));
2289
+ time(" nestingGraph.run", () => run(g));
2290
+ time(" rank", () => rank(asNonCompoundGraph(g)));
2291
+ time(" injectEdgeLabelProxies", () => injectEdgeLabelProxies(g));
2292
+ time(" removeEmptyRanks", () => removeEmptyRanks(g));
2293
+ time(" nestingGraph.cleanup", () => cleanup(g));
2294
+ time(" normalizeRanks", () => normalizeRanks(g));
2295
+ time(" assignRankMinMax", () => assignRankMinMax(g));
2296
+ time(" removeEdgeLabelProxies", () => removeEdgeLabelProxies(g));
2297
+ time(" normalize.run", () => run$1(g));
2298
+ time(" parentDummyChains", () => parentDummyChains(g));
2299
+ time(" addBorderSegments", () => addBorderSegments(g));
2300
+ time(" order", () => order(g));
2301
+ time(" insertSelfEdges", () => insertSelfEdges(g));
2302
+ time(" adjustCoordinateSystem", () => adjust(g));
2303
+ time(" position", () => position(g));
2304
+ time(" positionSelfEdges", () => positionSelfEdges(g));
2305
+ time(" removeBorderNodes", () => removeBorderNodes(g));
2306
+ time(" normalize.undo", () => undo(g));
2307
+ time(" fixupEdgeLabelCoords", () => fixupEdgeLabelCoords(g));
2308
+ time(" undoCoordinateSystem", () => undo$1(g));
2309
+ time(" translateGraph", () => translateGraph(g));
2310
+ time(" assignNodeIntersects", () => assignNodeIntersects(g));
2311
+ time(" reversePoints", () => reversePointsForReversedEdges(g));
2312
+ time(" acyclic.undo", () => undo$2(g));
2313
+ }
2314
+ function updateInputGraph(inputGraph, layoutGraph) {
2315
+ forEach(inputGraph.nodes(), function(v) {
2316
+ var inputLabel = inputGraph.node(v);
2317
+ var layoutLabel = layoutGraph.node(v);
2318
+ if (inputLabel) {
2319
+ inputLabel.x = layoutLabel.x;
2320
+ inputLabel.y = layoutLabel.y;
2321
+ if (layoutGraph.children(v).length) {
2322
+ inputLabel.width = layoutLabel.width;
2323
+ inputLabel.height = layoutLabel.height;
2324
+ }
2325
+ }
2326
+ });
2327
+ forEach(inputGraph.edges(), function(e) {
2328
+ var inputLabel = inputGraph.edge(e);
2329
+ var layoutLabel = layoutGraph.edge(e);
2330
+ inputLabel.points = layoutLabel.points;
2331
+ if (Object.prototype.hasOwnProperty.call(layoutLabel, "x")) {
2332
+ inputLabel.x = layoutLabel.x;
2333
+ inputLabel.y = layoutLabel.y;
2334
+ }
2335
+ });
2336
+ inputGraph.graph().width = layoutGraph.graph().width;
2337
+ inputGraph.graph().height = layoutGraph.graph().height;
2338
+ }
2339
+ var graphNumAttrs = ["nodesep", "edgesep", "ranksep", "marginx", "marginy"];
2340
+ var graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: "tb" };
2341
+ var graphAttrs = ["acyclicer", "ranker", "rankdir", "align"];
2342
+ var nodeNumAttrs = ["width", "height"];
2343
+ var nodeDefaults = { width: 0, height: 0 };
2344
+ var edgeNumAttrs = ["minlen", "weight", "width", "height", "labeloffset"];
2345
+ var edgeDefaults = {
2346
+ minlen: 1,
2347
+ weight: 1,
2348
+ width: 0,
2349
+ height: 0,
2350
+ labeloffset: 10,
2351
+ labelpos: "r"
2352
+ };
2353
+ var edgeAttrs = ["labelpos"];
2354
+ function buildLayoutGraph(inputGraph) {
2355
+ var g = new Graph({ multigraph: true, compound: true });
2356
+ var graph = canonicalize(inputGraph.graph());
2357
+ g.setGraph(
2358
+ merge({}, graphDefaults, selectNumberAttrs(graph, graphNumAttrs), pick(graph, graphAttrs))
2359
+ );
2360
+ forEach(inputGraph.nodes(), function(v) {
2361
+ var node = canonicalize(inputGraph.node(v));
2362
+ g.setNode(v, defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));
2363
+ g.setParent(v, inputGraph.parent(v));
2364
+ });
2365
+ forEach(inputGraph.edges(), function(e) {
2366
+ var edge = canonicalize(inputGraph.edge(e));
2367
+ g.setEdge(
2368
+ e,
2369
+ merge({}, edgeDefaults, selectNumberAttrs(edge, edgeNumAttrs), pick(edge, edgeAttrs))
2370
+ );
2371
+ });
2372
+ return g;
2373
+ }
2374
+ function makeSpaceForEdgeLabels(g) {
2375
+ var graph = g.graph();
2376
+ graph.ranksep /= 2;
2377
+ forEach(g.edges(), function(e) {
2378
+ var edge = g.edge(e);
2379
+ edge.minlen *= 2;
2380
+ if (edge.labelpos.toLowerCase() !== "c") {
2381
+ if (graph.rankdir === "TB" || graph.rankdir === "BT") {
2382
+ edge.width += edge.labeloffset;
2383
+ } else {
2384
+ edge.height += edge.labeloffset;
2385
+ }
2386
+ }
2387
+ });
2388
+ }
2389
+ function injectEdgeLabelProxies(g) {
2390
+ forEach(g.edges(), function(e) {
2391
+ var edge = g.edge(e);
2392
+ if (edge.width && edge.height) {
2393
+ var v = g.node(e.v);
2394
+ var w = g.node(e.w);
2395
+ var label = { rank: (w.rank - v.rank) / 2 + v.rank, e };
2396
+ addDummyNode(g, "edge-proxy", label, "_ep");
2397
+ }
2398
+ });
2399
+ }
2400
+ function assignRankMinMax(g) {
2401
+ var maxRank2 = 0;
2402
+ forEach(g.nodes(), function(v) {
2403
+ var node = g.node(v);
2404
+ if (node.borderTop) {
2405
+ node.minRank = g.node(node.borderTop).rank;
2406
+ node.maxRank = g.node(node.borderBottom).rank;
2407
+ maxRank2 = max(maxRank2, node.maxRank);
2408
+ }
2409
+ });
2410
+ g.graph().maxRank = maxRank2;
2411
+ }
2412
+ function removeEdgeLabelProxies(g) {
2413
+ forEach(g.nodes(), function(v) {
2414
+ var node = g.node(v);
2415
+ if (node.dummy === "edge-proxy") {
2416
+ g.edge(node.e).labelRank = node.rank;
2417
+ g.removeNode(v);
2418
+ }
2419
+ });
2420
+ }
2421
+ function translateGraph(g) {
2422
+ var minX = Number.POSITIVE_INFINITY;
2423
+ var maxX = 0;
2424
+ var minY = Number.POSITIVE_INFINITY;
2425
+ var maxY = 0;
2426
+ var graphLabel = g.graph();
2427
+ var marginX = graphLabel.marginx || 0;
2428
+ var marginY = graphLabel.marginy || 0;
2429
+ function getExtremes(attrs) {
2430
+ var x = attrs.x;
2431
+ var y = attrs.y;
2432
+ var w = attrs.width;
2433
+ var h = attrs.height;
2434
+ minX = Math.min(minX, x - w / 2);
2435
+ maxX = Math.max(maxX, x + w / 2);
2436
+ minY = Math.min(minY, y - h / 2);
2437
+ maxY = Math.max(maxY, y + h / 2);
2438
+ }
2439
+ forEach(g.nodes(), function(v) {
2440
+ getExtremes(g.node(v));
2441
+ });
2442
+ forEach(g.edges(), function(e) {
2443
+ var edge = g.edge(e);
2444
+ if (Object.prototype.hasOwnProperty.call(edge, "x")) {
2445
+ getExtremes(edge);
2446
+ }
2447
+ });
2448
+ minX -= marginX;
2449
+ minY -= marginY;
2450
+ forEach(g.nodes(), function(v) {
2451
+ var node = g.node(v);
2452
+ node.x -= minX;
2453
+ node.y -= minY;
2454
+ });
2455
+ forEach(g.edges(), function(e) {
2456
+ var edge = g.edge(e);
2457
+ forEach(edge.points, function(p) {
2458
+ p.x -= minX;
2459
+ p.y -= minY;
2460
+ });
2461
+ if (Object.prototype.hasOwnProperty.call(edge, "x")) {
2462
+ edge.x -= minX;
2463
+ }
2464
+ if (Object.prototype.hasOwnProperty.call(edge, "y")) {
2465
+ edge.y -= minY;
2466
+ }
2467
+ });
2468
+ graphLabel.width = maxX - minX + marginX;
2469
+ graphLabel.height = maxY - minY + marginY;
2470
+ }
2471
+ function assignNodeIntersects(g) {
2472
+ forEach(g.edges(), function(e) {
2473
+ var edge = g.edge(e);
2474
+ var nodeV = g.node(e.v);
2475
+ var nodeW = g.node(e.w);
2476
+ var p1, p2;
2477
+ if (!edge.points) {
2478
+ edge.points = [];
2479
+ p1 = nodeW;
2480
+ p2 = nodeV;
2481
+ } else {
2482
+ p1 = edge.points[0];
2483
+ p2 = edge.points[edge.points.length - 1];
2484
+ }
2485
+ edge.points.unshift(intersectRect(nodeV, p1));
2486
+ edge.points.push(intersectRect(nodeW, p2));
2487
+ });
2488
+ }
2489
+ function fixupEdgeLabelCoords(g) {
2490
+ forEach(g.edges(), function(e) {
2491
+ var edge = g.edge(e);
2492
+ if (Object.prototype.hasOwnProperty.call(edge, "x")) {
2493
+ if (edge.labelpos === "l" || edge.labelpos === "r") {
2494
+ edge.width -= edge.labeloffset;
2495
+ }
2496
+ switch (edge.labelpos) {
2497
+ case "l":
2498
+ edge.x -= edge.width / 2 + edge.labeloffset;
2499
+ break;
2500
+ case "r":
2501
+ edge.x += edge.width / 2 + edge.labeloffset;
2502
+ break;
2503
+ }
2504
+ }
2505
+ });
2506
+ }
2507
+ function reversePointsForReversedEdges(g) {
2508
+ forEach(g.edges(), function(e) {
2509
+ var edge = g.edge(e);
2510
+ if (edge.reversed) {
2511
+ edge.points.reverse();
2512
+ }
2513
+ });
2514
+ }
2515
+ function removeBorderNodes(g) {
2516
+ forEach(g.nodes(), function(v) {
2517
+ if (g.children(v).length) {
2518
+ var node = g.node(v);
2519
+ var t = g.node(node.borderTop);
2520
+ var b = g.node(node.borderBottom);
2521
+ var l = g.node(last(node.borderLeft));
2522
+ var r = g.node(last(node.borderRight));
2523
+ node.width = Math.abs(r.x - l.x);
2524
+ node.height = Math.abs(b.y - t.y);
2525
+ node.x = l.x + node.width / 2;
2526
+ node.y = t.y + node.height / 2;
2527
+ }
2528
+ });
2529
+ forEach(g.nodes(), function(v) {
2530
+ if (g.node(v).dummy === "border") {
2531
+ g.removeNode(v);
2532
+ }
2533
+ });
2534
+ }
2535
+ function removeSelfEdges(g) {
2536
+ forEach(g.edges(), function(e) {
2537
+ if (e.v === e.w) {
2538
+ var node = g.node(e.v);
2539
+ if (!node.selfEdges) {
2540
+ node.selfEdges = [];
2541
+ }
2542
+ node.selfEdges.push({ e, label: g.edge(e) });
2543
+ g.removeEdge(e);
2544
+ }
2545
+ });
2546
+ }
2547
+ function insertSelfEdges(g) {
2548
+ var layers = buildLayerMatrix(g);
2549
+ forEach(layers, function(layer) {
2550
+ var orderShift = 0;
2551
+ forEach(layer, function(v, i) {
2552
+ var node = g.node(v);
2553
+ node.order = i + orderShift;
2554
+ forEach(node.selfEdges, function(selfEdge) {
2555
+ addDummyNode(
2556
+ g,
2557
+ "selfedge",
2558
+ {
2559
+ width: selfEdge.label.width,
2560
+ height: selfEdge.label.height,
2561
+ rank: node.rank,
2562
+ order: i + ++orderShift,
2563
+ e: selfEdge.e,
2564
+ label: selfEdge.label
2565
+ },
2566
+ "_se"
2567
+ );
2568
+ });
2569
+ delete node.selfEdges;
2570
+ });
2571
+ });
2572
+ }
2573
+ function positionSelfEdges(g) {
2574
+ forEach(g.nodes(), function(v) {
2575
+ var node = g.node(v);
2576
+ if (node.dummy === "selfedge") {
2577
+ var selfNode = g.node(node.e.v);
2578
+ var x = selfNode.x + selfNode.width / 2;
2579
+ var y = selfNode.y;
2580
+ var dx = node.x - x;
2581
+ var dy = selfNode.height / 2;
2582
+ g.setEdge(node.e, node.label);
2583
+ g.removeNode(v);
2584
+ node.label.points = [
2585
+ { x: x + 2 * dx / 3, y: y - dy },
2586
+ { x: x + 5 * dx / 6, y: y - dy },
2587
+ { x: x + dx, y },
2588
+ { x: x + 5 * dx / 6, y: y + dy },
2589
+ { x: x + 2 * dx / 3, y: y + dy }
2590
+ ];
2591
+ node.label.x = node.x;
2592
+ node.label.y = node.y;
2593
+ }
2594
+ });
2595
+ }
2596
+ function selectNumberAttrs(obj, attrs) {
2597
+ return mapValues(pick(obj, attrs), Number);
2598
+ }
2599
+ function canonicalize(attrs) {
2600
+ var newAttrs = {};
2601
+ forEach(attrs, function(v, k) {
2602
+ newAttrs[k.toLowerCase()] = v;
2603
+ });
2604
+ return newAttrs;
2605
+ }
2606
+ export {
2607
+ baseClone as b,
2608
+ layout as l,
2609
+ map as m
2610
+ };