@datagrok/eda 1.4.4 → 1.4.6

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 (152) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/111.js +2 -0
  3. package/dist/111.js.map +1 -0
  4. package/dist/128.js +2 -0
  5. package/dist/128.js.map +1 -0
  6. package/dist/153.js +2 -0
  7. package/dist/153.js.map +1 -0
  8. package/dist/23.js +2 -0
  9. package/dist/23.js.map +1 -0
  10. package/dist/234.js +2 -0
  11. package/dist/234.js.map +1 -0
  12. package/dist/242.js +2 -0
  13. package/dist/242.js.map +1 -0
  14. package/dist/260.js +2 -0
  15. package/dist/260.js.map +1 -0
  16. package/dist/33.js +2 -0
  17. package/dist/33.js.map +1 -0
  18. package/dist/348.js +2 -0
  19. package/dist/348.js.map +1 -0
  20. package/dist/377.js +2 -0
  21. package/dist/377.js.map +1 -0
  22. package/dist/412.js +2 -0
  23. package/dist/412.js.map +1 -0
  24. package/dist/415.js +2 -0
  25. package/dist/415.js.map +1 -0
  26. package/dist/501.js +2 -0
  27. package/dist/501.js.map +1 -0
  28. package/dist/531.js +2 -0
  29. package/dist/531.js.map +1 -0
  30. package/dist/583.js +2 -0
  31. package/dist/583.js.map +1 -0
  32. package/dist/589.js +2 -0
  33. package/dist/589.js.map +1 -0
  34. package/dist/603.js +2 -0
  35. package/dist/603.js.map +1 -0
  36. package/dist/656.js +2 -0
  37. package/dist/656.js.map +1 -0
  38. package/dist/682.js +2 -0
  39. package/dist/682.js.map +1 -0
  40. package/dist/705.js +2 -0
  41. package/dist/705.js.map +1 -0
  42. package/dist/727.js +2 -0
  43. package/dist/727.js.map +1 -0
  44. package/dist/731.js +2 -0
  45. package/dist/731.js.map +1 -0
  46. package/dist/738.js +3 -0
  47. package/dist/738.js.LICENSE.txt +51 -0
  48. package/dist/738.js.map +1 -0
  49. package/dist/763.js +2 -0
  50. package/dist/763.js.map +1 -0
  51. package/dist/778.js +2 -0
  52. package/dist/778.js.map +1 -0
  53. package/dist/783.js +2 -0
  54. package/dist/783.js.map +1 -0
  55. package/dist/793.js +2 -0
  56. package/dist/793.js.map +1 -0
  57. package/dist/801.js +2 -0
  58. package/dist/801.js.map +1 -0
  59. package/dist/810.js +2 -0
  60. package/dist/810.js.map +1 -0
  61. package/dist/860.js +2 -0
  62. package/dist/860.js.map +1 -0
  63. package/dist/907.js +2 -0
  64. package/dist/907.js.map +1 -0
  65. package/dist/950.js +2 -0
  66. package/dist/950.js.map +1 -0
  67. package/dist/980.js +2 -0
  68. package/dist/980.js.map +1 -0
  69. package/dist/990.js +2 -0
  70. package/dist/990.js.map +1 -0
  71. package/dist/package-test.js +1 -26140
  72. package/dist/package-test.js.map +1 -1
  73. package/dist/package.js +1 -30337
  74. package/dist/package.js.map +1 -1
  75. package/package.json +2 -2
  76. package/src/anova/anova-ui.ts +39 -24
  77. package/src/package-api.ts +4 -0
  78. package/src/package.g.ts +33 -32
  79. package/src/package.ts +2 -2
  80. package/test-console-output-1.log +72 -93
  81. package/test-record-1.mp4 +0 -0
  82. package/webpack.config.js +1 -1
  83. package/dist/_d4c0.js +0 -279
  84. package/dist/_d4c0.js.map +0 -1
  85. package/dist/node_modules_datagrok-libraries_math_src_dbscan_wasm_clustering-worker_js.js +0 -279
  86. package/dist/node_modules_datagrok-libraries_math_src_dbscan_wasm_clustering-worker_js.js.map +0 -1
  87. package/dist/node_modules_datagrok-libraries_ml_src_MCL_mcl-sparse-matrix-mult-worker_js.js +0 -59
  88. package/dist/node_modules_datagrok-libraries_ml_src_MCL_mcl-sparse-matrix-mult-worker_js.js.map +0 -1
  89. package/dist/node_modules_datagrok-libraries_ml_src_distance-matrix_distance-matrix-worker_js.js +0 -284
  90. package/dist/node_modules_datagrok-libraries_ml_src_distance-matrix_distance-matrix-worker_js.js.map +0 -1
  91. package/dist/node_modules_datagrok-libraries_ml_src_distance-matrix_single-value-knn-worker_js.js +0 -265
  92. package/dist/node_modules_datagrok-libraries_ml_src_distance-matrix_single-value-knn-worker_js.js.map +0 -1
  93. package/dist/node_modules_datagrok-libraries_ml_src_distance-matrix_sparse-matrix-worker_js.js +0 -287
  94. package/dist/node_modules_datagrok-libraries_ml_src_distance-matrix_sparse-matrix-worker_js.js.map +0 -1
  95. package/dist/src_workers_softmax-worker_ts.js +0 -154
  96. package/dist/src_workers_softmax-worker_ts.js.map +0 -1
  97. package/dist/src_workers_tsne-worker_ts.js +0 -244
  98. package/dist/src_workers_tsne-worker_ts.js.map +0 -1
  99. package/dist/src_workers_umap-worker_ts.js +0 -252
  100. package/dist/src_workers_umap-worker_ts.js.map +0 -1
  101. package/dist/vendors-node_modules_datagrok-libraries_math_src_dbscan_wasm_dbscan_js.js +0 -1253
  102. package/dist/vendors-node_modules_datagrok-libraries_math_src_dbscan_wasm_dbscan_js.js.map +0 -1
  103. package/dist/vendors-node_modules_datagrok-libraries_math_src_hierarchical-clustering_wasm_clustering-worker_js.js +0 -942
  104. package/dist/vendors-node_modules_datagrok-libraries_math_src_hierarchical-clustering_wasm_clustering-worker_js.js.map +0 -1
  105. package/dist/vendors-node_modules_datagrok-libraries_math_src_webGPU_sparse-matrix_webGPU-sparse-matrix_js-07693f.js +0 -1525
  106. package/dist/vendors-node_modules_datagrok-libraries_math_src_webGPU_sparse-matrix_webGPU-sparse-matrix_js-07693f.js.map +0 -1
  107. package/dist/vendors-node_modules_datagrok-libraries_ml_src_MCL_mcl-worker_js-node_modules_datagrok-librar-e4203d.js +0 -2244
  108. package/dist/vendors-node_modules_datagrok-libraries_ml_src_MCL_mcl-worker_js-node_modules_datagrok-librar-e4203d.js.map +0 -1
  109. package/dist/vendors-node_modules_datagrok-libraries_ml_src_distance-matrix_knn-threshold-worker_js.js +0 -286
  110. package/dist/vendors-node_modules_datagrok-libraries_ml_src_distance-matrix_knn-threshold-worker_js.js.map +0 -1
  111. package/dist/vendors-node_modules_datagrok-libraries_ml_src_distance-matrix_knn-worker_js.js +0 -280
  112. package/dist/vendors-node_modules_datagrok-libraries_ml_src_distance-matrix_knn-worker_js.js.map +0 -1
  113. package/dist/vendors-node_modules_datagrok-libraries_ml_src_distance-matrix_sparse-matrix-threshold-worker_js.js +0 -282
  114. package/dist/vendors-node_modules_datagrok-libraries_ml_src_distance-matrix_sparse-matrix-threshold-worker_js.js.map +0 -1
  115. package/dist/vendors-node_modules_datagrok-libraries_ml_src_distance-matrix_utils_js-node_modules_datagrok-72c7b2.js +0 -1821
  116. package/dist/vendors-node_modules_datagrok-libraries_ml_src_distance-matrix_utils_js-node_modules_datagrok-72c7b2.js.map +0 -1
  117. package/dist/vendors-node_modules_datagrok-libraries_ml_src_multi-column-dimensionality-reduction_mulit-co-3800a0.js +0 -7776
  118. package/dist/vendors-node_modules_datagrok-libraries_ml_src_multi-column-dimensionality-reduction_mulit-co-3800a0.js.map +0 -1
  119. package/dist/vendors-node_modules_keckelt_tsne_lib_index_js.js +0 -379
  120. package/dist/vendors-node_modules_keckelt_tsne_lib_index_js.js.map +0 -1
  121. package/dist/vendors-node_modules_ml-matrix_matrix_mjs.js +0 -5946
  122. package/dist/vendors-node_modules_ml-matrix_matrix_mjs.js.map +0 -1
  123. package/dist/vendors-node_modules_umap-js_dist_index_js.js +0 -2284
  124. package/dist/vendors-node_modules_umap-js_dist_index_js.js.map +0 -1
  125. package/dist/wasm_EDAForWebWorker_js-wasm_callWasmForWebWorker_js.js +0 -779
  126. package/dist/wasm_EDAForWebWorker_js-wasm_callWasmForWebWorker_js.js.map +0 -1
  127. package/dist/wasm_workers_errorWorker_js.js +0 -267
  128. package/dist/wasm_workers_errorWorker_js.js.map +0 -1
  129. package/dist/wasm_workers_fitLinearRegressionParamsWithDataNormalizingWorker_js.js +0 -267
  130. package/dist/wasm_workers_fitLinearRegressionParamsWithDataNormalizingWorker_js.js.map +0 -1
  131. package/dist/wasm_workers_fitLinearRegressionParamsWorker_js.js +0 -267
  132. package/dist/wasm_workers_fitLinearRegressionParamsWorker_js.js.map +0 -1
  133. package/dist/wasm_workers_fitSoftmaxWorker_js.js +0 -267
  134. package/dist/wasm_workers_fitSoftmaxWorker_js.js.map +0 -1
  135. package/dist/wasm_workers_generateDatasetWorker_js.js +0 -267
  136. package/dist/wasm_workers_generateDatasetWorker_js.js.map +0 -1
  137. package/dist/wasm_workers_normalizeDatasetWorker_js.js +0 -267
  138. package/dist/wasm_workers_normalizeDatasetWorker_js.js.map +0 -1
  139. package/dist/wasm_workers_partialLeastSquareRegressionWorker_js.js +0 -267
  140. package/dist/wasm_workers_partialLeastSquareRegressionWorker_js.js.map +0 -1
  141. package/dist/wasm_workers_predictByLSSVMWorker_js.js +0 -267
  142. package/dist/wasm_workers_predictByLSSVMWorker_js.js.map +0 -1
  143. package/dist/wasm_workers_principalComponentAnalysisNipalsWorker_js.js +0 -267
  144. package/dist/wasm_workers_principalComponentAnalysisNipalsWorker_js.js.map +0 -1
  145. package/dist/wasm_workers_principalComponentAnalysisWorkerUpd_js.js +0 -271
  146. package/dist/wasm_workers_principalComponentAnalysisWorkerUpd_js.js.map +0 -1
  147. package/dist/wasm_workers_trainAndAnalyzeLSSVMWorker_js.js +0 -267
  148. package/dist/wasm_workers_trainAndAnalyzeLSSVMWorker_js.js.map +0 -1
  149. package/dist/wasm_workers_trainLSSVMWorker_js.js +0 -267
  150. package/dist/wasm_workers_trainLSSVMWorker_js.js.map +0 -1
  151. package/dist/wasm_workers_xgboostWorker_js.js +0 -279
  152. package/dist/wasm_workers_xgboostWorker_js.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"vendors-node_modules_datagrok-libraries_ml_src_MCL_mcl-worker_js-node_modules_datagrok-librar-e4203d.js","mappings":";;;;;;;;;;;;;;;;;;;;AAA4D;AACrD;AACP;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACO;AACP;AACA,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C;AACA,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,4BAA4B;AACnD,aAAa;AACb;AACO;AACP;AACA,oBAAoB,aAAa;AACjC,uBAAuB,yEAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,mgS;;;;;;;;;;;;;;;;;;AC1Ec;AACb;AACrC;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP,yBAAyB;AACzB,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,sEAAmB;AACnD,gBAAgB,WAAW;AAC3B;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA,sDAAsD,qBAAqB;AAC3E;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,4BAA4B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+BAA+B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,yDAAe;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,2CAA2C,25rB;;;;;;;;;;;;;;;ACpL3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA,sCAAsC,uKAAkD;AACxF;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,2CAA2C,muS;;;;;;;;;;;;;;;AC1FyE;AACrC;AAC3B;AACpD;AACA,YAAY,8GAA8G;AAC1H;AACA;AACA;AACA;AACA,2BAA2B,kIAA0B;AACrD;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,2BAA2B,uFAAmB;AAC9C;AACA;AACA;AACA;AACA,iBAAiB,uFAAmB;AACpC;AACA,8CAA8C,kCAAkC;AAChF,wBAAwB,6DAAgB,GAAG,gEAAgE;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,KAAK;AACvB;AACA,2CAA2C,+5K;;;;;;;;;;;;;;;;;;;AC3C3C;AAC+B;AACyB;AACxD;AACA;AACO;AACP,sBAAsB,mDAAK;AAC3B,oBAAoB,oBAAoB;AACxC,oCAAoC,oDAAoD;AACxF,qBAAqB,kCAAkC;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,oBAAoB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,GAAG,kFAAyB;AAChD;AACA,IAAI,2EAAkB;AACtB;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA,aAAa;AACb;AACA,2CAA2C,mhO;;;;;;;;;;;;;;;AC5DpC;AACP;AACA;AACA;AACA,CAAC,gEAAgE;AACjE;AACA,2CAA2C,mlB;;;;;;;;;;;;;;;;;;;ACNU;AAC9C;AACA;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,aAAa,8DAA0B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,29H;;;;;;;;;;AChC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY;AACZ;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;;AAEA,kCAAkC,OAAO;AACzC;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAY,aAAa;AACzB,YAAY;AACZ;AACA,wBAAwB;AACxB;AACA,YAAY;;AAEZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY;;AAEZ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;;AAEZ;AACA;AACA;AACA;AACA,YAAY;;AAEZ;AACA;AACA;AACA;AACA,YAAY;;AAEZ;AACA;AACA;AACA;AACA,YAAY;;AAEZ;AACA;AACA;AACA;AACA,YAAY;;AAEZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;;AAEZ;AACA;;AAEA;AACA;AACA;AACA,YAAY,UAAU;AACtB,YAAY,UAAU;AACtB,YAAY,wBAAwB;AACpC;AACA,yBAAyB;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;AAC3B;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,eAAe;AAC1B,WAAW,eAAe;AAC1B,WAAW,eAAe;AAC1B;AACA,2BAA2B;AAC3B;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB;AACA,0BAA0B;AAC1B;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,YAAY,eAAe;AAC3B,YAAY,eAAe;AAC3B,YAAY,eAAe;AAC3B,YAAY,6BAA6B;AACzC;AACA,4BAA4B;AAC5B;AACA;;AAEA,gDAAgD,OAAO;AACvD;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAY,WAAW;AACvB,YAAY;AACZ;AACA,oBAAoB;AACpB;AACA;AACA;AACA,yCAAyC,KAAK,wBAAwB;AACtE;AACA;AACA;;AAEA;AACA;;;;;;;;;;;ACpQA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,mBAAO,CAAC,8EAA2B;AACjD;AACA,EAAE,0HAA0D;AAC5D,cAAc,mBAAO,CAAC,6EAAc;AACpC,cAAc,mBAAO,CAAC,6EAAc;;AAEpC,uBAAuB,mBAAO,CAAC,+EAAe;;AAE9C;AACA;AACA;AACA,YAAY,eAAe;AAC3B,YAAY,eAAe;AAC3B,YAAY,eAAe;AAC3B,YAAY,iBAAiB;AAC7B,YAAY,iBAAiB;AAC7B,YAAY,iBAAiB;AAC7B,YAAY,iBAAiB;AAC7B,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEA,4CAA4C;;AAE5C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kCAAkC;AAClC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,cAAc,gBAAgB;AAC9B;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAY,cAAc;AAC1B,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAY,cAAc;AAC1B,YAAY,cAAc;AAC1B,YAAY,cAAc;AAC1B,YAAY,yBAAyB;AACrC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,mDAAmD;;AAEnD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B,gBAAgB;AAChB;AACA;AACA;AACA,uBAAuB;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,gBAAgB,WAAW;AAC3B;;AAEA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B;;AAE9B;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,4BAA4B;;AAE5B;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA,iBAAiB,YAAY;AAC7B,mBAAmB,SAAS;AAC5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACxxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,6BAA6B;AAC7B,6BAA6B;AAC7B,8BAA8B;AAC9B;AACA;;;;;;;;;;;ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,SAAS;AACrB,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtBA,eAAe,KAAoD,oBAAoB,CAAoH,CAAC,kBAAkB,aAAa,cAAc,iFAAiF,gBAAgB,aAAa,oGAAoG,MAAM,gBAAgB,wEAAwE,cAAc,wEAAwE,6CAA6C,MAAM,gBAAgB,0EAA0E,uBAAuB,QAAQ,aAAa,4DAA4D,mCAAmC,qCAAqC,IAAI,gFAAgF,OAAO,SAAS,UAAU,kBAAkB,sDAAsD,aAAa,kBAAkB,oCAAoC,6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oB,cAAc,SAAS,yBAAyB,IAAI,+IAA+I,gHAAgH,4BAA4B,gBAAgB,oBAAoB,cAAc,SAAS,2BAA2B,IAAI,iJAAiJ,oHAAoH,4BAA4B,gBAAgB,KAAK,eAAe,qBAAqB,UAAU,yBAAyB,sBAAsB,4PAA4P;AAC17wE;;;;;;;UCDA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;;;;WClCA;WACA;WACA;WACA;WACA,+BAA+B,wCAAwC;WACvE;WACA;WACA;WACA;WACA,iBAAiB,qBAAqB;WACtC;WACA;WACA,kBAAkB,qBAAqB;WACvC;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,E;;;;;WC3BA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF,E;;;;;WCRA;WACA;WACA;WACA;WACA,E;;;;;WCJA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC,I;;;;;WCPD,wF;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;WCNA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,kC;;;;;WClBA;;WAEA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,aAAa;WACb;WACA;WACA;WACA;;WAEA;WACA;WACA;;WAEA;;WAEA,kB;;;;;WCpCA;WACA;WACA;WACA,E;;;;;UEHA;UACA","sources":["webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/clustering-steps.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/markov-cluster.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/mcl-sparse-matrix-mult.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/mcl-worker.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/webCola.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/distance-matrix/types.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/distance-matrix/utils.js","webpack://eda/./node_modules/graphology-layout-forceatlas2/defaults.js","webpack://eda/./node_modules/graphology-layout-forceatlas2/helpers.js","webpack://eda/./node_modules/graphology-layout-forceatlas2/index.js","webpack://eda/./node_modules/graphology-layout-forceatlas2/iterate.js","webpack://eda/./node_modules/graphology-utils/getters.js","webpack://eda/./node_modules/graphology-utils/is-graph.js","webpack://eda/./node_modules/graphology/dist/graphology.umd.min.js","webpack://eda/webpack/bootstrap","webpack://eda/webpack/runtime/chunk loaded","webpack://eda/webpack/runtime/compat get default export","webpack://eda/webpack/runtime/define property getters","webpack://eda/webpack/runtime/ensure chunk","webpack://eda/webpack/runtime/get javascript chunk filename","webpack://eda/webpack/runtime/global","webpack://eda/webpack/runtime/hasOwnProperty shorthand","webpack://eda/webpack/runtime/make namespace object","webpack://eda/webpack/runtime/publicPath","webpack://eda/webpack/runtime/importScripts chunk loading","webpack://eda/webpack/runtime/startup chunk dependencies","webpack://eda/webpack/before-startup","webpack://eda/webpack/startup","webpack://eda/webpack/after-startup"],"sourcesContent":["import { multSparseMatrix } from './mcl-sparse-matrix-mult';\nexport function prune(sparseMatrix, pruneValue) {\n const is = [];\n const js = [];\n const ds = [];\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n if (sparseMatrix.distance[i] > pruneValue) {\n is.push(sparseMatrix.i[i]);\n js.push(sparseMatrix.j[i]);\n ds.push(sparseMatrix.distance[i]);\n }\n }\n return { i: new Uint32Array(is), j: new Uint32Array(js), distance: new Float32Array(ds) };\n}\nexport function mclInflate(sparseMatrix, pow) {\n const d = sparseMatrix.distance;\n for (let i = 0; i < sparseMatrix.i.length; i++)\n d[i] = Math.pow(d[i], pow);\n return sparseMatrix;\n}\nexport function colwiseNormilize(sparseMatrix, nRows, pruneValue, doPrune) {\n if (doPrune)\n sparseMatrix = prune(sparseMatrix, pruneValue);\n const colSums = new Float32Array(nRows);\n const d = sparseMatrix.distance;\n const js = sparseMatrix.j;\n for (let i = 0; i < sparseMatrix.i.length; i++)\n colSums[js[i]] += d[i];\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n const sum = colSums[js[i]];\n if (sum !== 0)\n d[i] /= sum;\n }\n return sparseMatrix;\n}\nexport function initMCLMatrix(sparseMatrix, nRows, pruneValue) {\n // here we get sparse matrix that is only a half of the matrix\n // also, the matrix contains distances, need to convert those into similarities\n // also, we need to add self loops\n const is = new Uint32Array(sparseMatrix.i.length * 2 + nRows);\n const js = new Uint32Array(sparseMatrix.j.length * 2 + nRows);\n const ds = new Float32Array(sparseMatrix.distance.length * 2 + nRows);\n for (let i = 0; i < nRows; i++) {\n is[i] = i;\n js[i] = i;\n ds[i] = 1;\n }\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n const start = i * 2 + nRows;\n is[start] = sparseMatrix.i[i];\n js[start] = sparseMatrix.j[i];\n ds[start] = 1 - sparseMatrix.distance[i];\n is[start + 1] = sparseMatrix.j[i];\n js[start + 1] = sparseMatrix.i[i];\n ds[start + 1] = 1 - sparseMatrix.distance[i];\n }\n // normalize\n colwiseNormilize({ i: is, j: js, distance: ds }, nRows, pruneValue, false);\n return { i: is, j: js, distance: ds };\n}\nexport async function runMarkovClustering(sparseMatrix, nRows, inflate, maxIter, pruneValue) {\n let matrix = initMCLMatrix(sparseMatrix, nRows, pruneValue);\n for (let i = 0; i < maxIter; i++) {\n matrix = await multSparseMatrix(matrix, nRows, pruneValue);\n // console.time('inflate');\n //@ts-ignore\n matrix = colwiseNormilize(matrix, nRows, pruneValue, false);\n matrix = mclInflate(matrix, inflate);\n //@ts-ignore\n matrix = colwiseNormilize(matrix, nRows, pruneValue, true);\n console.log('MCL iteration', i);\n }\n return matrix;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3RlcmluZy1zdGVwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNsdXN0ZXJpbmctc3RlcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFMUQsTUFBTSxVQUFVLEtBQUssQ0FBQyxZQUEwQixFQUFFLFVBQWtCO0lBQ2xFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNkLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNkLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQy9DLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQztZQUMxQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0FBQzFGLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLFlBQTBCLEVBQUUsR0FBVztJQUNoRSxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFD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RyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXJDLFlBQVk7UUFDWixNQUFNLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NwYXJzZU1hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoJztcbmltcG9ydCB7bXVsdFNwYXJzZU1hdHJpeH0gZnJvbSAnLi9tY2wtc3BhcnNlLW1hdHJpeC1tdWx0JztcblxuZXhwb3J0IGZ1bmN0aW9uIHBydW5lKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4LCBwcnVuZVZhbHVlOiBudW1iZXIpOiBTcGFyc2VNYXRyaXgge1xuICBjb25zdCBpcyA9IFtdO1xuICBjb25zdCBqcyA9IFtdO1xuICBjb25zdCBkcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXJzZU1hdHJpeC5pLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXSA+IHBydW5lVmFsdWUpIHtcbiAgICAgIGlzLnB1c2goc3BhcnNlTWF0cml4LmlbaV0pO1xuICAgICAganMucHVzaChzcGFyc2VNYXRyaXgualtpXSk7XG4gICAgICBkcy5wdXNoKHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7aTogbmV3IFVpbnQzMkFycmF5KGlzKSwgajogbmV3IFVpbnQzMkFycmF5KGpzKSwgZGlzdGFuY2U6IG5ldyBGbG9hdDMyQXJyYXkoZHMpfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1jbEluZmxhdGUoc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXgsIHBvdzogbnVtYmVyKSB7XG4gIGNvbnN0IGQgPSBzcGFyc2VNYXRyaXguZGlzdGFuY2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspXG4gICAgZFtpXSA9IE1hdGgucG93KGRbaV0sIHBvdyk7XG5cbiAgcmV0dXJuIHNwYXJzZU1hdHJpeDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbHdpc2VOb3JtaWxpemUoXG4gIHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4LCBuUm93czogbnVtYmVyLCBwcnVuZVZhbHVlOiBudW1iZXIsIGRvUHJ1bmU/OiBib29sZWFuXG4pOiBTcGFyc2VNYXRyaXgge1xuICBpZiAoZG9QcnVuZSlcbiAgICBzcGFyc2VNYXRyaXggPSBwcnVuZShzcGFyc2VNYXRyaXgsIHBydW5lVmFsdWUpO1xuXG4gIGNvbnN0IGNvbFN1bXMgPSBuZXcgRmxvYXQzMkFycmF5KG5Sb3dzKTtcbiAgY29uc3QgZCA9IHNwYXJzZU1hdHJpeC5kaXN0YW5jZTtcbiAgY29uc3QganMgPSBzcGFyc2VNYXRyaXguajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFyc2VNYXRyaXguaS5sZW5ndGg7IGkrKylcbiAgICBjb2xTdW1zW2pzW2ldXSArPSBkW2ldO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdW0gPSBjb2xTdW1zW2pzW2ldXTtcbiAgICBpZiAoc3VtICE9PSAwKVxuICAgICAgZFtpXSAvPSBzdW07XG4gIH1cbiAgcmV0dXJuIHNwYXJzZU1hdHJpeDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRNQ0xNYXRyaXgoc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXgsIG5Sb3dzOiBudW1iZXIsIHBydW5lVmFsdWU6IG51bWJlcik6IFNwYXJzZU1hdHJpeCB7XG4gIC8vIGhlcmUgd2UgZ2V0IHNwYXJzZSBtYXRyaXggdGhhdCBpcyBvbmx5IGEgaGFsZiBvZiB0aGUgbWF0cml4XG4gIC8vIGFsc28sIHRoZSBtYXRyaXggY29udGFpbnMgZGlzdGFuY2VzLCBuZWVkIHRvIGNvbnZlcnQgdGhvc2UgaW50byBzaW1pbGFyaXRpZXNcbiAgLy8gYWxzbywgd2UgbmVlZCB0byBhZGQgc2VsZiBsb29wc1xuICBjb25zdCBpcyA9IG5ldyBVaW50MzJBcnJheShzcGFyc2VNYXRyaXguaS5sZW5ndGggKiAyICsgblJvd3MpO1xuICBjb25zdCBqcyA9IG5ldyBVaW50MzJBcnJheShzcGFyc2VNYXRyaXguai5sZW5ndGggKiAyICsgblJvd3MpO1xuICBjb25zdCBkcyA9IG5ldyBGbG9hdDMyQXJyYXkoc3BhcnNlTWF0cml4LmRpc3RhbmNlLmxlbmd0aCAqIDIgKyBuUm93cyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgIGlzW2ldID0gaTtcbiAgICBqc1tpXSA9IGk7XG4gICAgZHNbaV0gPSAxO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFydCA9IGkgKiAyICsgblJvd3M7XG4gICAgaXNbc3RhcnRdID0gc3BhcnNlTWF0cml4LmlbaV07XG4gICAganNbc3RhcnRdID0gc3BhcnNlTWF0cml4LmpbaV07XG4gICAgZHNbc3RhcnRdID0gMSAtIHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXTtcblxuICAgIGlzW3N0YXJ0ICsgMV0gPSBzcGFyc2VNYXRyaXgualtpXTtcbiAgICBqc1tzdGFydCArIDFdID0gc3BhcnNlTWF0cml4LmlbaV07XG4gICAgZHNbc3RhcnQgKyAxXSA9IDEgLSBzcGFyc2VNYXRyaXguZGlzdGFuY2VbaV07XG4gIH1cblxuICAvLyBub3JtYWxpemVcbiAgY29sd2lzZU5vcm1pbGl6ZSh7aTogaXMsIGo6IGpzLCBkaXN0YW5jZTogZHN9LCBuUm93cywgcHJ1bmVWYWx1ZSwgZmFsc2UpO1xuXG4gIHJldHVybiB7aTogaXMsIGo6IGpzLCBkaXN0YW5jZTogZHN9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuTWFya292Q2x1c3RlcmluZyhcbiAgc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXgsIG5Sb3dzOiBudW1iZXIsIGluZmxhdGU6IG51bWJlciwgbWF4SXRlcjogbnVtYmVyLCBwcnVuZVZhbHVlOiBudW1iZXJcbikge1xuICBsZXQgbWF0cml4ID0gaW5pdE1DTE1hdHJpeChzcGFyc2VNYXRyaXgsIG5Sb3dzLCBwcnVuZVZhbHVlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhJdGVyOyBpKyspIHtcbiAgICBtYXRyaXggPSBhd2FpdCBtdWx0U3BhcnNlTWF0cml4KG1hdHJpeCwgblJvd3MsIHBydW5lVmFsdWUpO1xuICAgIC8vIGNvbnNvbGUudGltZSgnaW5mbGF0ZScpO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIG1hdHJpeCA9IGNvbHdpc2VOb3JtaWxpemUobWF0cml4LCBuUm93cywgcHJ1bmVWYWx1ZSwgZmFsc2UpO1xuICAgIG1hdHJpeCA9IG1jbEluZmxhdGUobWF0cml4LCBpbmZsYXRlKTtcblxuICAgIC8vQHRzLWlnbm9yZVxuICAgIG1hdHJpeCA9IGNvbHdpc2VOb3JtaWxpemUobWF0cml4LCBuUm93cywgcHJ1bmVWYWx1ZSwgdHJ1ZSk7XG4gICAgY29uc29sZS5sb2coJ01DTCBpdGVyYXRpb24nLCBpKTtcbiAgfVxuXG4gIHJldHVybiBtYXRyaXg7XG59XG4iXX0=","import { runMarkovClustering } from './clustering-steps';\nimport { getWebColaLayot } from './webCola';\nexport const defaultMCLOptions = {\n expandFactor: 2,\n maxIterations: 5,\n inflateFactor: 2,\n multFactor: 1,\n pruneValue: 1e-17,\n};\nexport class MCLSparseReducer {\n constructor(opts = {}) {\n this._options = { ...defaultMCLOptions, ...opts };\n }\n async transform(sparseMatrix, nRows) {\n // get the superClusters before the MCL\n // this will be used for layouting\n const superClusters = this.assignClusters(sparseMatrix, nRows);\n this.correctClusters(superClusters.clusters);\n // before beggining the mcl, we need to save the connections between original points,\n // as MCL might mutate the matrix\n const clusterConnectionMap = this.splitConnectionsIntoClusters(sparseMatrix, superClusters.clusters);\n // perform the MCL\n const mclMatrix = await runMarkovClustering(sparseMatrix, nRows, this._options.inflateFactor, this._options.maxIterations, this._options.pruneValue);\n const { clusters } = this.assignClusters(mclMatrix, nRows);\n this.correctClusters(clusters);\n const embeddings = this.layout(superClusters.clusters, clusterConnectionMap, nRows, clusters);\n return { clusters, embedX: embeddings.embedX, embedY: embeddings.embedY, is: sparseMatrix.i, js: sparseMatrix.j };\n }\n async transformWebGPU(sparseMatrix, nRows) {\n // TODO: implement correct webGPU version\n return this.transform(sparseMatrix, nRows);\n }\n // here as we operate on original sparse matrix, we know for sure that there are no duplicates or self loops\n splitConnectionsIntoClusters(sparseMatrix, clusters) {\n const clusterConnections = new Map();\n for (let i = 0; i < clusters.length; i++) {\n if (!clusterConnections.has(clusters[i]))\n clusterConnections.set(clusters[i], { i: [], j: [], v: [] });\n }\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n const cluster = clusters[sparseMatrix.i[i]];\n const cc = clusterConnections.get(cluster);\n cc.i.push(sparseMatrix.i[i]);\n cc.j.push(sparseMatrix.j[i]);\n cc.v.push(1 - sparseMatrix.distance[i]);\n }\n return clusterConnections;\n }\n assignClusters(sparseMatrix, nRows) {\n let clusterNum = 0;\n const is = [];\n const js = [];\n // array containing for each point which cluster it belongs to\n const clusters = new Array(nRows).fill(-1);\n for (let it = 0; it < sparseMatrix.i.length; it++) {\n const i = sparseMatrix.i[it];\n const j = sparseMatrix.j[it];\n if (i === j)\n continue;\n is.push(i);\n js.push(j);\n if (clusters[i] !== -1 && clusters[j] !== -1) {\n if (clusters[i] !== clusters[j])\n this.mergeClusters(clusters, i, j);\n }\n else if (clusters[i] !== -1) {\n clusters[j] = clusters[i];\n }\n else if (clusters[j] !== -1) {\n clusters[i] = clusters[j];\n }\n else {\n clusterNum++;\n clusters[i] = clusterNum;\n clusters[j] = clusterNum;\n }\n }\n // final step for the clusters that are not connected to anything\n for (let i = 0; i < clusters.length; i++) {\n if (clusters[i] === -1) {\n clusterNum++;\n clusters[i] = clusterNum;\n }\n }\n return { clusters, is: new Uint32Array(is), js: new Uint32Array(js) };\n }\n mergeClusters(clusters, i, j) {\n const iCluster = clusters[i];\n const jCluster = clusters[j];\n for (let k = 0; k < clusters.length; k++) {\n if (clusters[k] === jCluster)\n clusters[k] = iCluster;\n }\n }\n /** After assigning and merging, clusters will need reordering according to size */\n correctClusters(clusters) {\n const clusterSizeMap = {};\n for (const cluster of clusters) {\n if (!clusterSizeMap[cluster])\n clusterSizeMap[cluster] = 0;\n clusterSizeMap[cluster]++;\n }\n const sortedIndexes = Object.keys(clusterSizeMap).map(Number).sort((a, b) => clusterSizeMap[b] - clusterSizeMap[a]);\n const clusterMap = {};\n sortedIndexes.forEach((clusterIdx, i) => clusterMap[clusterIdx] = i + 1);\n for (let i = 0; i < clusters.length; i++)\n clusters[i] = clusterMap[clusters[i]];\n }\n /** notice that here, first argument is the superclusters and last is the subClusters\n * the second argument is the original sparse matrix, and the third is the number of rows\n */\n layout(clusters, clusterConnectionMap, nRows, subCluster) {\n const embedX = new Float32Array(nRows).fill(0);\n const embedY = new Float32Array(nRows).fill(0);\n const clusterMap = {};\n clusters.forEach((cluster, i) => {\n if (!clusterMap[cluster])\n clusterMap[cluster] = [];\n clusterMap[cluster].push(i);\n });\n // split sparse matrix connections into super-clusters, save only indexes\n let clusterNum = 0;\n const sortedClusterNames = Object.keys(clusterMap);\n sortedClusterNames.sort((a, b) => clusterMap[b].length - clusterMap[a].length);\n let perRow = 1;\n const perRowMultiplier = 3;\n let yOffset = 0;\n const layoutSize = 5;\n // cluster sizes could be different, but also very similar. first cluster size can be quite similar\n // to the second one. if not accounted for, the layout will be very unbalanced, and first cluster will\n // be very large\n const perRowSizes = [1];\n // if first two cluster sizes are very similar, first perrow should be 2\n if (sortedClusterNames.length > 1) {\n const clustSize1 = clusterMap[sortedClusterNames[0]].length;\n const clustSize2 = clusterMap[sortedClusterNames[1]].length;\n if (clustSize1 / clustSize2 < 2)\n perRowSizes[0] = 2;\n let curPerRowSize = perRowSizes[0];\n let maxClustersInNextRow = curPerRowSize * perRowMultiplier;\n let pointsInCurRow = curPerRowSize == 1 ? clustSize1 : clustSize1 + clustSize2;\n let pointsAccum = 0;\n let clustersAccum = 0;\n for (let i = 2; i < sortedClusterNames.length; i++) {\n pointsAccum += clusterMap[sortedClusterNames[i]].length;\n clustersAccum++;\n if (clustersAccum > maxClustersInNextRow || pointsAccum >= pointsInCurRow * 0.7 || i === sortedClusterNames.length - 1) {\n perRowSizes.push(i === sortedClusterNames.length - 1 ? maxClustersInNextRow : clustersAccum);\n curPerRowSize = clustersAccum;\n maxClustersInNextRow = curPerRowSize * perRowMultiplier;\n pointsInCurRow = Math.max(pointsAccum, pointsInCurRow);\n pointsAccum = 0;\n clustersAccum = 0;\n }\n }\n }\n perRow = perRowSizes[0];\n let perRowIdx = 0;\n for (const clusterName of sortedClusterNames) {\n const cluster = clusterMap[clusterName];\n const clusterConnections = clusterConnectionMap.get(Number(clusterName));\n const embeddings = getWebColaLayot(cluster, clusterConnections, subCluster);\n if (clusterNum === perRow) {\n clusterNum = 0;\n yOffset += layoutSize / perRow;\n perRowIdx++;\n perRow = Math.min(Math.ceil(perRowSizes[perRowIdx]), 45);\n }\n //const clustersPerRow = Math.ceil(perRow / 1.5);\n const offsetX = ((clusterNum) * layoutSize / perRow + layoutSize / perRow * (1 / 1.2 / 4));\n // const offsetY = Math.floor(clusterNum / perRow) * 2;\n for (let i = 0; i < embeddings.embedX.length; i++) {\n embedX[cluster[i]] = embeddings.embedX[i] * layoutSize / perRow / 1.2 + offsetX;\n embedY[cluster[i]] = embeddings.embedY[i] * layoutSize / perRow / 1.2 + yOffset;\n }\n clusterNum++;\n }\n return { embedX, embedY };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya292LWNsdXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYXJrb3YtY2x1c3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUV2RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRTFDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFlO0lBQzNDLFlBQVksRUFBRSxDQUFDO0lBQ2YsYUFBYSxFQUFFLENBQUM7SUFDaEIsYUFBYSxFQUFFLENBQUM7SUFDaEIsVUFBVSxFQUFFLENBQUM7SUFDYixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDO0FBRUYsTUFBTSxPQUFPLGdCQUFnQjtJQUd6QixZQUFZLE9BQTRCLEVBQUU7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFDLEdBQUcsaUJBQWlCLEVBQUUsR0FBRyxJQUFJLEVBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUEwQixFQUFFLEtBQWE7UUFDOUQsdUNBQXVDO1FBQ3ZDLGtDQUFrQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QyxxRkFBcUY7UUFDckYsaUNBQWlDO1FBQ2pDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckcsa0JBQWtCO1FBQ2xCLE1BQU0sU0FBUyxHQUFHLE1BQU0sbUJBQW1CLENBQ3pDLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRyxNQUFNLEVBQUMsUUFBUSxFQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzlGLE9BQU8sRUFBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUNsSCxDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWUsQ0FBQyxZQUEwQixFQUFFLEtBQWE7UUFDcEUseUNBQXlDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELDRHQUE0RztJQUNwRyw0QkFBNEIsQ0FBQyxZQUEwQixFQUFFLFFBQWtCO1FBQ2pGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQW1ELENBQUM7UUFDdEYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0MsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFFLENBQUM7WUFDNUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxPQUFPLGtCQUFrQixDQUFDO0lBQzVCLENBQUM7SUFFTyxjQUFjLENBQUMsWUFBMEIsRUFBRSxLQUFhO1FBQzlELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQixNQUFNLEVBQUUsR0FBYSxFQUFFLENBQUM7UUFDeEIsTUFBTSxFQUFFLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLDhEQUE4RDtRQUM5RCxNQUFNLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUNsRCxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDVCxTQUFTO1lBQ1gsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNYLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDWCxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7aUJBQU0sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixDQUFDO2lCQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFVBQVUsRUFBRSxDQUFDO2dCQUNiLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7Z0JBQ3pCLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFFRCxpRUFBaUU7UUFDakUsS0FBSyxJQUFJLENBQUMsR0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2QixVQUFVLEVBQUcsQ0FBQztnQkFDZCxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxFQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVPLGFBQWEsQ0FBQyxRQUFrQixFQUFFLENBQVMsRUFBRSxDQUFTO1FBQzVELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRO2dCQUMxQixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQsbUZBQW1GO0lBQzNFLGVBQWUsQ0FBQyxRQUFrQjtRQUN4QyxNQUFNLGNBQWMsR0FBMEIsRUFBRSxDQUFDO1FBQ2pELEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7Z0JBQzFCLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEcsTUFBTSxVQUFVLEdBQTBCLEVBQUUsQ0FBQztRQUM3QyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7WUFDdEMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBR0Q7O09BRUc7SUFDSyxNQUFNLENBQUMsUUFBa0IsRUFBRSxvQkFHakIsRUFBRSxLQUFhLEVBQUUsVUFBb0I7UUFDckQsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxNQUFNLFVBQVUsR0FBNEIsRUFBRSxDQUFDO1FBQy9DLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7Z0JBQ3RCLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDM0IsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUVILHlFQUF5RTtRQUN6RSxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkIsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdGLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBRTNCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDckIsbUdBQW1HO1FBQ25HLHNHQUFzRztRQUN0RyxnQkFBZ0I7UUFDaEIsTUFBTSxXQUFXLEdBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyx3RUFBd0U7UUFDeEUsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBUSxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ25FLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNuRSxJQUFJLFVBQVUsR0FBRyxVQUFVLEdBQUcsQ0FBQztnQkFDN0IsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQixJQUFJLGFBQWEsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsSUFBSSxvQkFBb0IsR0FBRyxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7WUFDNUQsSUFBSSxjQUFjLEdBQUcsYUFBYSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQy9FLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztZQUNwQixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7WUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNuRCxXQUFXLElBQUksVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBUSxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUMvRCxhQUFhLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxhQUFhLEdBQUcsb0JBQW9CLElBQUksV0FBVyxJQUFJLGNBQWMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdkgsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUM3RixhQUFhLEdBQUcsYUFBYSxDQUFDO29CQUM5QixvQkFBb0IsR0FBRyxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7b0JBQ3hELGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztvQkFDdkQsV0FBVyxHQUFHLENBQUMsQ0FBQztvQkFDaEIsYUFBYSxHQUFHLENBQUMsQ0FBQztnQkFDcEIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFFbEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQzdDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxXQUFrQixDQUFFLENBQUM7WUFDaEQsTUFBTSxrQkFBa0IsR0FBRyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFFLENBQUM7WUFDMUUsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM1RSxJQUFJLFVBQVUsS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDMUIsVUFBVSxHQUFHLENBQUMsQ0FBQztnQkFDZixPQUFPLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQztnQkFDL0IsU0FBUyxFQUFFLENBQUM7Z0JBQ1osTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsaURBQWlEO1lBQ2pELE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxVQUFVLEdBQUcsTUFBTSxHQUFHLFVBQVUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0YsdURBQXVEO1lBRXZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNsRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUM7Z0JBQ2hGLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQztZQUNsRixDQUFDO1lBQ0QsVUFBVSxFQUFFLENBQUM7UUFDZixDQUFDO1FBQ0QsT0FBTyxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUMsQ0FBQztJQUMxQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5pbXBvcnQge1NwYXJzZU1hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoJztcbmltcG9ydCB7TUNMT3B0aW9uc30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge3J1bk1hcmtvdkNsdXN0ZXJpbmd9IGZyb20gJy4vY2x1c3RlcmluZy1zdGVwcyc7XG5cbmltcG9ydCB7Z2V0V2ViQ29sYUxheW90fSBmcm9tICcuL3dlYkNvbGEnO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdE1DTE9wdGlvbnM6IE1DTE9wdGlvbnMgPSB7XG4gIGV4cGFuZEZhY3RvcjogMixcbiAgbWF4SXRlcmF0aW9uczogNSxcbiAgaW5mbGF0ZUZhY3RvcjogMixcbiAgbXVsdEZhY3RvcjogMSxcbiAgcHJ1bmVWYWx1ZTogMWUtMTcsXG59O1xuXG5leHBvcnQgY2xhc3MgTUNMU3BhcnNlUmVkdWNlciB7XG4gICAgcHJpdmF0ZSBfb3B0aW9uczogTUNMT3B0aW9ucztcblxuICAgIGNvbnN0cnVjdG9yKG9wdHM6IFBhcnRpYWw8TUNMT3B0aW9ucz4gPSB7fSkge1xuICAgICAgdGhpcy5fb3B0aW9ucyA9IHsuLi5kZWZhdWx0TUNMT3B0aW9ucywgLi4ub3B0c307XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHRyYW5zZm9ybShzcGFyc2VNYXRyaXg6IFNwYXJzZU1hdHJpeCwgblJvd3M6IG51bWJlcikge1xuICAgICAgLy8gZ2V0IHRoZSBzdXBlckNsdXN0ZXJzIGJlZm9yZSB0aGUgTUNMXG4gICAgICAvLyB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgbGF5b3V0aW5nXG4gICAgICBjb25zdCBzdXBlckNsdXN0ZXJzID0gdGhpcy5hc3NpZ25DbHVzdGVycyhzcGFyc2VNYXRyaXgsIG5Sb3dzKTtcbiAgICAgIHRoaXMuY29ycmVjdENsdXN0ZXJzKHN1cGVyQ2x1c3RlcnMuY2x1c3RlcnMpO1xuICAgICAgLy8gYmVmb3JlIGJlZ2dpbmluZyB0aGUgbWNsLCB3ZSBuZWVkIHRvIHNhdmUgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gb3JpZ2luYWwgcG9pbnRzLFxuICAgICAgLy8gYXMgTUNMIG1pZ2h0IG11dGF0ZSB0aGUgbWF0cml4XG4gICAgICBjb25zdCBjbHVzdGVyQ29ubmVjdGlvbk1hcCA9IHRoaXMuc3BsaXRDb25uZWN0aW9uc0ludG9DbHVzdGVycyhzcGFyc2VNYXRyaXgsIHN1cGVyQ2x1c3RlcnMuY2x1c3RlcnMpO1xuICAgICAgLy8gcGVyZm9ybSB0aGUgTUNMXG4gICAgICBjb25zdCBtY2xNYXRyaXggPSBhd2FpdCBydW5NYXJrb3ZDbHVzdGVyaW5nKFxuICAgICAgICBzcGFyc2VNYXRyaXgsIG5Sb3dzLCB0aGlzLl9vcHRpb25zLmluZmxhdGVGYWN0b3IsIHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9ucywgdGhpcy5fb3B0aW9ucy5wcnVuZVZhbHVlKTtcbiAgICAgIGNvbnN0IHtjbHVzdGVyc30gPSB0aGlzLmFzc2lnbkNsdXN0ZXJzKG1jbE1hdHJpeCwgblJvd3MpO1xuICAgICAgdGhpcy5jb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnMpO1xuICAgICAgY29uc3QgZW1iZWRkaW5ncyA9IHRoaXMubGF5b3V0KHN1cGVyQ2x1c3RlcnMuY2x1c3RlcnMsIGNsdXN0ZXJDb25uZWN0aW9uTWFwLCBuUm93cywgY2x1c3RlcnMpO1xuICAgICAgcmV0dXJuIHtjbHVzdGVycywgZW1iZWRYOiBlbWJlZGRpbmdzLmVtYmVkWCwgZW1iZWRZOiBlbWJlZGRpbmdzLmVtYmVkWSwgaXM6IHNwYXJzZU1hdHJpeC5pLCBqczogc3BhcnNlTWF0cml4Lmp9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB0cmFuc2Zvcm1XZWJHUFUoc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXgsIG5Sb3dzOiBudW1iZXIpIHtcbiAgICAgIC8vIFRPRE86IGltcGxlbWVudCBjb3JyZWN0IHdlYkdQVSB2ZXJzaW9uXG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0oc3BhcnNlTWF0cml4LCBuUm93cyk7XG4gICAgfVxuXG4gICAgLy8gaGVyZSBhcyB3ZSBvcGVyYXRlIG9uIG9yaWdpbmFsIHNwYXJzZSBtYXRyaXgsIHdlIGtub3cgZm9yIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlcyBvciBzZWxmIGxvb3BzXG4gICAgcHJpdmF0ZSBzcGxpdENvbm5lY3Rpb25zSW50b0NsdXN0ZXJzKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4LCBjbHVzdGVyczogbnVtYmVyW10pIHtcbiAgICAgIGNvbnN0IGNsdXN0ZXJDb25uZWN0aW9ucyA9IG5ldyBNYXA8bnVtYmVyLCB7aTogbnVtYmVyW10sIGo6IG51bWJlcltdLCB2OiBudW1iZXJbXX0+KCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghY2x1c3RlckNvbm5lY3Rpb25zLmhhcyhjbHVzdGVyc1tpXSkpXG4gICAgICAgICAgY2x1c3RlckNvbm5lY3Rpb25zLnNldChjbHVzdGVyc1tpXSwge2k6IFtdLCBqOiBbXSwgdjogW119KTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2x1c3RlciA9IGNsdXN0ZXJzW3NwYXJzZU1hdHJpeC5pW2ldXTtcbiAgICAgICAgY29uc3QgY2MgPSBjbHVzdGVyQ29ubmVjdGlvbnMuZ2V0KGNsdXN0ZXIpITtcbiAgICAgICAgY2MuaS5wdXNoKHNwYXJzZU1hdHJpeC5pW2ldKTtcbiAgICAgICAgY2Muai5wdXNoKHNwYXJzZU1hdHJpeC5qW2ldKTtcbiAgICAgICAgY2Mudi5wdXNoKDEgLSBzcGFyc2VNYXRyaXguZGlzdGFuY2VbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNsdXN0ZXJDb25uZWN0aW9ucztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzc2lnbkNsdXN0ZXJzKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4LCBuUm93czogbnVtYmVyKSB7XG4gICAgICBsZXQgY2x1c3Rlck51bSA9IDA7XG4gICAgICBjb25zdCBpczogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGpzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgLy8gYXJyYXkgY29udGFpbmluZyBmb3IgZWFjaCBwb2ludCB3aGljaCBjbHVzdGVyIGl0IGJlbG9uZ3MgdG9cbiAgICAgIGNvbnN0IGNsdXN0ZXJzOiBudW1iZXJbXSA9IG5ldyBBcnJheShuUm93cykuZmlsbCgtMSk7XG4gICAgICBmb3IgKGxldCBpdCA9IDA7IGl0IDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpdCsrKSB7XG4gICAgICAgIGNvbnN0IGkgPSBzcGFyc2VNYXRyaXguaVtpdF07XG4gICAgICAgIGNvbnN0IGogPSBzcGFyc2VNYXRyaXgualtpdF07XG4gICAgICAgIGlmIChpID09PSBqKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpcy5wdXNoKGkpO1xuICAgICAgICBqcy5wdXNoKGopO1xuICAgICAgICBpZiAoY2x1c3RlcnNbaV0gIT09IC0xICYmIGNsdXN0ZXJzW2pdICE9PSAtMSkge1xuICAgICAgICAgIGlmIChjbHVzdGVyc1tpXSAhPT0gY2x1c3RlcnNbal0pXG4gICAgICAgICAgICB0aGlzLm1lcmdlQ2x1c3RlcnMoY2x1c3RlcnMsIGksIGopO1xuICAgICAgICB9IGVsc2UgaWYgKGNsdXN0ZXJzW2ldICE9PSAtMSkge1xuICAgICAgICAgIGNsdXN0ZXJzW2pdID0gY2x1c3RlcnNbaV07XG4gICAgICAgIH0gZWxzZSBpZiAoY2x1c3RlcnNbal0gIT09IC0xKSB7XG4gICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyc1tqXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgIGNsdXN0ZXJzW2pdID0gY2x1c3Rlck51bTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBmaW5hbCBzdGVwIGZvciB0aGUgY2x1c3RlcnMgdGhhdCBhcmUgbm90IGNvbm5lY3RlZCB0byBhbnl0aGluZ1xuICAgICAgZm9yIChsZXQgaT0wOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNsdXN0ZXJzW2ldID09PSAtMSkge1xuICAgICAgICAgIGNsdXN0ZXJOdW0gKys7XG4gICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge2NsdXN0ZXJzLCBpczogbmV3IFVpbnQzMkFycmF5KGlzKSwganM6IG5ldyBVaW50MzJBcnJheShqcyl9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWVyZ2VDbHVzdGVycyhjbHVzdGVyczogbnVtYmVyW10sIGk6IG51bWJlciwgajogbnVtYmVyKSB7XG4gICAgICBjb25zdCBpQ2x1c3RlciA9IGNsdXN0ZXJzW2ldO1xuICAgICAgY29uc3QgakNsdXN0ZXIgPSBjbHVzdGVyc1tqXTtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY2x1c3RlcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgaWYgKGNsdXN0ZXJzW2tdID09PSBqQ2x1c3RlcilcbiAgICAgICAgICBjbHVzdGVyc1trXSA9IGlDbHVzdGVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBZnRlciBhc3NpZ25pbmcgYW5kIG1lcmdpbmcsIGNsdXN0ZXJzIHdpbGwgbmVlZCByZW9yZGVyaW5nIGFjY29yZGluZyB0byBzaXplICovXG4gICAgcHJpdmF0ZSBjb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnM6IG51bWJlcltdKSB7XG4gICAgICBjb25zdCBjbHVzdGVyU2l6ZU1hcDoge1tfOiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGNsdXN0ZXIgb2YgY2x1c3RlcnMpIHtcbiAgICAgICAgaWYgKCFjbHVzdGVyU2l6ZU1hcFtjbHVzdGVyXSlcbiAgICAgICAgICBjbHVzdGVyU2l6ZU1hcFtjbHVzdGVyXSA9IDA7XG4gICAgICAgIGNsdXN0ZXJTaXplTWFwW2NsdXN0ZXJdKys7XG4gICAgICB9XG4gICAgICBjb25zdCBzb3J0ZWRJbmRleGVzID1cbiAgICAgICAgT2JqZWN0LmtleXMoY2x1c3RlclNpemVNYXApLm1hcChOdW1iZXIpLnNvcnQoKGEsIGIpID0+IGNsdXN0ZXJTaXplTWFwW2JdIC0gY2x1c3RlclNpemVNYXBbYV0pO1xuICAgICAgY29uc3QgY2x1c3Rlck1hcDoge1tfOiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG4gICAgICBzb3J0ZWRJbmRleGVzLmZvckVhY2goKGNsdXN0ZXJJZHgsIGkpID0+IGNsdXN0ZXJNYXBbY2x1c3RlcklkeF0gPSBpICsgMSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dO1xuICAgIH1cblxuXG4gICAgLyoqIG5vdGljZSB0aGF0IGhlcmUsIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBzdXBlcmNsdXN0ZXJzIGFuZCBsYXN0IGlzIHRoZSBzdWJDbHVzdGVyc1xuICAgICAqIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG9yaWdpbmFsIHNwYXJzZSBtYXRyaXgsIGFuZCB0aGUgdGhpcmQgaXMgdGhlIG51bWJlciBvZiByb3dzXG4gICAgICovXG4gICAgcHJpdmF0ZSBsYXlvdXQoY2x1c3RlcnM6IG51bWJlcltdLCBjbHVzdGVyQ29ubmVjdGlvbk1hcDogTWFwPG51bWJlciwge1xuICAgICAgICBpOiBudW1iZXJbXTtcbiAgICAgICAgajogbnVtYmVyW107XG4gICAgICAgIHY6IG51bWJlcltdO30+LCBuUm93czogbnVtYmVyLCBzdWJDbHVzdGVyOiBudW1iZXJbXSkge1xuICAgICAgY29uc3QgZW1iZWRYID0gbmV3IEZsb2F0MzJBcnJheShuUm93cykuZmlsbCgwKTtcbiAgICAgIGNvbnN0IGVtYmVkWSA9IG5ldyBGbG9hdDMyQXJyYXkoblJvd3MpLmZpbGwoMCk7XG4gICAgICBjb25zdCBjbHVzdGVyTWFwOiB7W186IG51bWJlcl06IG51bWJlcltdfSA9IHt9O1xuICAgICAgY2x1c3RlcnMuZm9yRWFjaCgoY2x1c3RlciwgaSkgPT4ge1xuICAgICAgICBpZiAoIWNsdXN0ZXJNYXBbY2x1c3Rlcl0pXG4gICAgICAgICAgY2x1c3Rlck1hcFtjbHVzdGVyXSA9IFtdO1xuICAgICAgICBjbHVzdGVyTWFwW2NsdXN0ZXJdLnB1c2goaSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gc3BsaXQgc3BhcnNlIG1hdHJpeCBjb25uZWN0aW9ucyBpbnRvIHN1cGVyLWNsdXN0ZXJzLCBzYXZlIG9ubHkgaW5kZXhlc1xuICAgICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgY29uc3Qgc29ydGVkQ2x1c3Rlck5hbWVzID0gT2JqZWN0LmtleXMoY2x1c3Rlck1hcCk7XG4gICAgICBzb3J0ZWRDbHVzdGVyTmFtZXMuc29ydCgoYSwgYikgPT4gY2x1c3Rlck1hcFtiIGFzIGFueV0ubGVuZ3RoIC0gY2x1c3Rlck1hcFthIGFzIGFueV0ubGVuZ3RoKTtcbiAgICAgIGxldCBwZXJSb3cgPSAxO1xuICAgICAgY29uc3QgcGVyUm93TXVsdGlwbGllciA9IDM7XG5cbiAgICAgIGxldCB5T2Zmc2V0ID0gMDtcbiAgICAgIGNvbnN0IGxheW91dFNpemUgPSA1O1xuICAgICAgLy8gY2x1c3RlciBzaXplcyBjb3VsZCBiZSBkaWZmZXJlbnQsIGJ1dCBhbHNvIHZlcnkgc2ltaWxhci4gZmlyc3QgY2x1c3RlciBzaXplIGNhbiBiZSBxdWl0ZSBzaW1pbGFyXG4gICAgICAvLyB0byB0aGUgc2Vjb25kIG9uZS4gaWYgbm90IGFjY291bnRlZCBmb3IsIHRoZSBsYXlvdXQgd2lsbCBiZSB2ZXJ5IHVuYmFsYW5jZWQsIGFuZCBmaXJzdCBjbHVzdGVyIHdpbGxcbiAgICAgIC8vIGJlIHZlcnkgbGFyZ2VcbiAgICAgIGNvbnN0IHBlclJvd1NpemVzOiBudW1iZXJbXSA9IFsxXTtcbiAgICAgIC8vIGlmIGZpcnN0IHR3byBjbHVzdGVyIHNpemVzIGFyZSB2ZXJ5IHNpbWlsYXIsIGZpcnN0IHBlcnJvdyBzaG91bGQgYmUgMlxuICAgICAgaWYgKHNvcnRlZENsdXN0ZXJOYW1lcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IGNsdXN0U2l6ZTEgPSBjbHVzdGVyTWFwW3NvcnRlZENsdXN0ZXJOYW1lc1swXSBhcyBhbnldLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY2x1c3RTaXplMiA9IGNsdXN0ZXJNYXBbc29ydGVkQ2x1c3Rlck5hbWVzWzFdIGFzIGFueV0ubGVuZ3RoO1xuICAgICAgICBpZiAoY2x1c3RTaXplMSAvIGNsdXN0U2l6ZTIgPCAyKVxuICAgICAgICAgIHBlclJvd1NpemVzWzBdID0gMjtcbiAgICAgICAgbGV0IGN1clBlclJvd1NpemUgPSBwZXJSb3dTaXplc1swXTtcbiAgICAgICAgbGV0IG1heENsdXN0ZXJzSW5OZXh0Um93ID0gY3VyUGVyUm93U2l6ZSAqIHBlclJvd011bHRpcGxpZXI7XG4gICAgICAgIGxldCBwb2ludHNJbkN1clJvdyA9IGN1clBlclJvd1NpemUgPT0gMSA/IGNsdXN0U2l6ZTEgOiBjbHVzdFNpemUxICsgY2x1c3RTaXplMjtcbiAgICAgICAgbGV0IHBvaW50c0FjY3VtID0gMDtcbiAgICAgICAgbGV0IGNsdXN0ZXJzQWNjdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMjsgaSA8IHNvcnRlZENsdXN0ZXJOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHBvaW50c0FjY3VtICs9IGNsdXN0ZXJNYXBbc29ydGVkQ2x1c3Rlck5hbWVzW2ldIGFzIGFueV0ubGVuZ3RoO1xuICAgICAgICAgIGNsdXN0ZXJzQWNjdW0rKztcbiAgICAgICAgICBpZiAoY2x1c3RlcnNBY2N1bSA+IG1heENsdXN0ZXJzSW5OZXh0Um93IHx8IHBvaW50c0FjY3VtID49IHBvaW50c0luQ3VyUm93ICogMC43IHx8IGkgPT09IHNvcnRlZENsdXN0ZXJOYW1lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBwZXJSb3dTaXplcy5wdXNoKGkgPT09IHNvcnRlZENsdXN0ZXJOYW1lcy5sZW5ndGggLSAxID8gbWF4Q2x1c3RlcnNJbk5leHRSb3cgOiBjbHVzdGVyc0FjY3VtKTtcbiAgICAgICAgICAgIGN1clBlclJvd1NpemUgPSBjbHVzdGVyc0FjY3VtO1xuICAgICAgICAgICAgbWF4Q2x1c3RlcnNJbk5leHRSb3cgPSBjdXJQZXJSb3dTaXplICogcGVyUm93TXVsdGlwbGllcjtcbiAgICAgICAgICAgIHBvaW50c0luQ3VyUm93ID0gTWF0aC5tYXgocG9pbnRzQWNjdW0sIHBvaW50c0luQ3VyUm93KTtcbiAgICAgICAgICAgIHBvaW50c0FjY3VtID0gMDtcbiAgICAgICAgICAgIGNsdXN0ZXJzQWNjdW0gPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGVyUm93ID0gcGVyUm93U2l6ZXNbMF07XG4gICAgICBsZXQgcGVyUm93SWR4ID0gMDtcblxuICAgICAgZm9yIChjb25zdCBjbHVzdGVyTmFtZSBvZiBzb3J0ZWRDbHVzdGVyTmFtZXMpIHtcbiAgICAgICAgY29uc3QgY2x1c3RlciA9IGNsdXN0ZXJNYXBbY2x1c3Rlck5hbWUgYXMgYW55XSE7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJDb25uZWN0aW9ucyA9IGNsdXN0ZXJDb25uZWN0aW9uTWFwLmdldChOdW1iZXIoY2x1c3Rlck5hbWUpKSE7XG4gICAgICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBnZXRXZWJDb2xhTGF5b3QoY2x1c3RlciwgY2x1c3RlckNvbm5lY3Rpb25zLCBzdWJDbHVzdGVyKTtcbiAgICAgICAgaWYgKGNsdXN0ZXJOdW0gPT09IHBlclJvdykge1xuICAgICAgICAgIGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgICAgIHlPZmZzZXQgKz0gbGF5b3V0U2l6ZSAvIHBlclJvdztcbiAgICAgICAgICBwZXJSb3dJZHgrKztcbiAgICAgICAgICBwZXJSb3cgPSBNYXRoLm1pbihNYXRoLmNlaWwocGVyUm93U2l6ZXNbcGVyUm93SWR4XSksIDQ1KTtcbiAgICAgICAgfVxuICAgICAgICAvL2NvbnN0IGNsdXN0ZXJzUGVyUm93ID0gTWF0aC5jZWlsKHBlclJvdyAvIDEuNSk7XG4gICAgICAgIGNvbnN0IG9mZnNldFggPSAoKGNsdXN0ZXJOdW0pICogbGF5b3V0U2l6ZSAvIHBlclJvdyArIGxheW91dFNpemUgLyBwZXJSb3cgKiAoMSAvIDEuMiAvIDQpKTtcbiAgICAgICAgLy8gY29uc3Qgb2Zmc2V0WSA9IE1hdGguZmxvb3IoY2x1c3Rlck51bSAvIHBlclJvdykgKiAyO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW1iZWRkaW5ncy5lbWJlZFgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBlbWJlZFhbY2x1c3RlcltpXV0gPSBlbWJlZGRpbmdzLmVtYmVkWFtpXSAqIGxheW91dFNpemUgLyBwZXJSb3cgLyAxLjIgKyBvZmZzZXRYO1xuICAgICAgICAgIGVtYmVkWVtjbHVzdGVyW2ldXSA9IGVtYmVkZGluZ3MuZW1iZWRZW2ldICogbGF5b3V0U2l6ZSAvIHBlclJvdyAvIDEuMiArIHlPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY2x1c3Rlck51bSsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtlbWJlZFgsIGVtYmVkWX07XG4gICAgfVxufVxuXG5cbiJdfQ==","// simple semaphore\nlet semaphore = Promise.resolve();\nconst lock = async () => {\n await semaphore;\n let release = () => { };\n const promise = new Promise((resolve) => {\n release = resolve;\n });\n semaphore = promise;\n return release;\n};\n/** Multiplies sparse matrix by itself. note that it expects that sparse matrix is full\n * (i.e. not only the upper right corner) and it has self loops if any */\nexport async function multSparseMatrix(sparseMatrix, nRows, pruneValue) {\n const workersNum = Math.min(Math.min(Math.max(navigator.hardwareConcurrency - 2, 1), nRows), 10);\n // number of horizontal strips that we will divide the matrix into\n // we divide the matrix into horizontal strips, because its faster for indexing and better for cache\n const numOfHorizontalStrinps = workersNum * 5;\n const indexStarts = new Uint32Array(numOfHorizontalStrinps);\n const indexEnds = new Uint32Array(numOfHorizontalStrinps);\n const blockHeight = nRows / numOfHorizontalStrinps;\n for (let i = 0; i < numOfHorizontalStrinps; i++) {\n indexStarts[i] = Math.floor(i * blockHeight);\n indexEnds[i] = i === numOfHorizontalStrinps - 1 ? nRows : Math.floor((i + 1) * blockHeight);\n }\n const workers = new Array(workersNum).fill(0)\n .map(() => new Worker(new URL('./mcl-sparse-matrix-mult-worker', import.meta.url)));\n const availableIndexes = new Set();\n for (let i = 0; i < numOfHorizontalStrinps; i++)\n availableIndexes.add(i);\n const initPromises = workers.map((worker) => {\n return new Promise((resolve) => {\n worker.postMessage({\n is: sparseMatrix.i,\n js: sparseMatrix.j,\n ds: sparseMatrix.distance,\n nRows,\n pruneValue\n });\n worker.onmessage = () => {\n resolve();\n };\n });\n });\n await Promise.all(initPromises);\n const res = [];\n const takeChunk = async (workerIdx) => {\n const release = await lock();\n const index = availableIndexes.values().next().value;\n if (index == null) {\n release();\n return;\n }\n availableIndexes.delete(index);\n release();\n await new Promise((resolve) => {\n workers[workerIdx].postMessage({\n blockStart: indexStarts[index],\n blockEnd: indexEnds[index],\n workerIdx\n });\n workers[workerIdx].onmessage = (e) => {\n res.push(e.data);\n resolve();\n };\n });\n await takeChunk(workerIdx);\n };\n const promises = workers.map((_worker, i) => {\n return takeChunk(i);\n });\n await Promise.all(promises);\n workers.forEach((worker) => worker.terminate());\n let totLen = 0;\n for (const r of res)\n totLen += r.i.length;\n const i = new Uint32Array(totLen);\n const j = new Uint32Array(totLen);\n const d = new Float32Array(totLen);\n let offset = 0;\n for (const r of res) {\n i.set(r.i, offset);\n j.set(r.j, offset);\n d.set(r.distance, offset);\n offset += r.i.length;\n }\n // don't forget to get the updated values for the diagonal, their rows need to be basically squared and summed\n // also, the diagonal values are not pruned\n return { i, j, distance: d };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNsLXNwYXJzZS1tYXRyaXgtbXVsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1jbC1zcGFyc2UtbWF0cml4LW11bHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsbUJBQW1CO0FBQ25CLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUVsQyxNQUFNLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtJQUN0QixNQUFNLFNBQVMsQ0FBQztJQUNoQixJQUFJLE9BQU8sR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFDbkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM1QyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsU0FBUyxHQUFHLE9BQU8sQ0FBQztJQUNwQixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUM7QUFHRjt5RUFDeUU7QUFDekUsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsWUFBMEIsRUFBRSxLQUFhLEVBQUUsVUFBa0I7SUFFN0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVqRyxrRUFBa0U7SUFDbEUsb0dBQW9HO0lBQ3BHLE1BQU0sc0JBQXNCLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUU5QyxNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzVELE1BQU0sU0FBUyxHQUFHLElBQUksV0FBVyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFFMUQsTUFBTSxXQUFXLEdBQUcsS0FBSyxHQUFHLHNCQUFz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LENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBQyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NwYXJzZU1hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoJztcblxuLy8gc2ltcGxlIHNlbWFwaG9yZVxubGV0IHNlbWFwaG9yZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5jb25zdCBsb2NrID0gYXN5bmMgKCkgPT4ge1xuICBhd2FpdCBzZW1hcGhvcmU7XG4gIGxldCByZWxlYXNlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHJlbGVhc2UgPSByZXNvbHZlO1xuICB9KTtcbiAgc2VtYXBob3JlID0gcHJvbWlzZTtcbiAgcmV0dXJuIHJlbGVhc2U7XG59O1xuXG5cbi8qKiBNdWx0aXBsaWVzIHNwYXJzZSBtYXRyaXggYnkgaXRzZWxmLiBub3RlIHRoYXQgaXQgZXhwZWN0cyB0aGF0IHNwYXJzZSBtYXRyaXggaXMgZnVsbFxuICogKGkuZS4gbm90IG9ubHkgdGhlIHVwcGVyIHJpZ2h0IGNvcm5lcikgYW5kIGl0IGhhcyBzZWxmIGxvb3BzIGlmIGFueSAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG11bHRTcGFyc2VNYXRyaXgoXG4gIHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4LCBuUm93czogbnVtYmVyLCBwcnVuZVZhbHVlOiBudW1iZXJcbik6IFByb21pc2U8U3BhcnNlTWF0cml4PiB7XG4gIGNvbnN0IHdvcmtlcnNOdW0gPSBNYXRoLm1pbihNYXRoLm1pbihNYXRoLm1heChuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSAtIDIsIDEpLCBuUm93cyksIDEwKTtcblxuICAvLyBudW1iZXIgb2YgaG9yaXpvbnRhbCBzdHJpcHMgdGhhdCB3ZSB3aWxsIGRpdmlkZSB0aGUgbWF0cml4IGludG9cbiAgLy8gd2UgZGl2aWRlIHRoZSBtYXRyaXggaW50byBob3Jpem9udGFsIHN0cmlwcywgYmVjYXVzZSBpdHMgZmFzdGVyIGZvciBpbmRleGluZyBhbmQgYmV0dGVyIGZvciBjYWNoZVxuICBjb25zdCBudW1PZkhvcml6b250YWxTdHJpbnBzID0gd29ya2Vyc051bSAqIDU7XG5cbiAgY29uc3QgaW5kZXhTdGFydHMgPSBuZXcgVWludDMyQXJyYXkobnVtT2ZIb3Jpem9udGFsU3RyaW5wcyk7XG4gIGNvbnN0IGluZGV4RW5kcyA9IG5ldyBVaW50MzJBcnJheShudW1PZkhvcml6b250YWxTdHJpbnBzKTtcblxuICBjb25zdCBibG9ja0hlaWdodCA9IG5Sb3dzIC8gbnVtT2ZIb3Jpem9udGFsU3RyaW5wcztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1PZkhvcml6b250YWxTdHJpbnBzOyBpKyspIHtcbiAgICBpbmRleFN0YXJ0c1tpXSA9IE1hdGguZmxvb3IoaSAqIGJsb2NrSGVpZ2h0KTtcbiAgICBpbmRleEVuZHNbaV0gPSBpID09PSBudW1PZkhvcml6b250YWxTdHJpbnBzIC0gMSA/IG5Sb3dzIDogTWF0aC5mbG9vcigoaSArIDEpICogYmxvY2tIZWlnaHQpO1xuICB9XG5cblxuICBjb25zdCB3b3JrZXJzOiBXb3JrZXJbXSA9IG5ldyBBcnJheSh3b3JrZXJzTnVtKS5maWxsKDApXG4gICAgLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4vbWNsLXNwYXJzZS1tYXRyaXgtbXVsdC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG5cblxuICBjb25zdCBhdmFpbGFibGVJbmRleGVzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT2ZIb3Jpem9udGFsU3RyaW5wczsgaSsrKVxuICAgIGF2YWlsYWJsZUluZGV4ZXMuYWRkKGkpO1xuXG4gIGNvbnN0IGluaXRQcm9taXNlcyA9IHdvcmtlcnMubWFwKCh3b3JrZXIpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIGlzOiBzcGFyc2VNYXRyaXguaSxcbiAgICAgICAganM6IHNwYXJzZU1hdHJpeC5qLFxuICAgICAgICBkczogc3BhcnNlTWF0cml4LmRpc3RhbmNlLFxuICAgICAgICBuUm93cyxcbiAgICAgICAgcHJ1bmVWYWx1ZVxuICAgICAgfSk7XG5cbiAgICAgIHdvcmtlci5vbm1lc3NhZ2UgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChpbml0UHJvbWlzZXMpO1xuXG4gIGNvbnN0IHJlczogU3BhcnNlTWF0cml4W10gPSBbXTtcblxuICBjb25zdCB0YWtlQ2h1bmsgPSBhc3luYyAod29ya2VySWR4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCByZWxlYXNlID0gYXdhaXQgbG9jaygpO1xuICAgIGNvbnN0IGluZGV4ID0gYXZhaWxhYmxlSW5kZXhlcy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgaWYgKGluZGV4ID09IG51bGwpIHtcbiAgICAgIHJlbGVhc2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXZhaWxhYmxlSW5kZXhlcy5kZWxldGUoaW5kZXgpO1xuICAgIHJlbGVhc2UoKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgd29ya2Vyc1t3b3JrZXJJZHhdLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgYmxvY2tTdGFydDogaW5kZXhTdGFydHNbaW5kZXhdLFxuICAgICAgICBibG9ja0VuZDogaW5kZXhFbmRzW2luZGV4XSxcbiAgICAgICAgd29ya2VySWR4XG4gICAgICB9KTtcblxuICAgICAgd29ya2Vyc1t3b3JrZXJJZHhdLm9ubWVzc2FnZSA9IChlKSA9PiB7XG4gICAgICAgIHJlcy5wdXNoKGUuZGF0YSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgYXdhaXQgdGFrZUNodW5rKHdvcmtlcklkeCk7XG4gIH07XG5cblxuICBjb25zdCBwcm9taXNlcyA9IHdvcmtlcnMubWFwKChfd29ya2VyLCBpKSA9PiB7XG4gICAgcmV0dXJuIHRha2VDaHVuayhpKTtcbiAgfSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgd29ya2Vycy5mb3JFYWNoKCh3b3JrZXIpID0+IHdvcmtlci50ZXJtaW5hdGUoKSk7XG5cblxuICBsZXQgdG90TGVuID0gMDtcbiAgZm9yIChjb25zdCByIG9mIHJlcylcbiAgICB0b3RMZW4gKz0gci5pLmxlbmd0aDtcblxuICBjb25zdCBpID0gbmV3IFVpbnQzMkFycmF5KHRvdExlbik7XG4gIGNvbnN0IGogPSBuZXcgVWludDMyQXJyYXkodG90TGVuKTtcbiAgY29uc3QgZCA9IG5ldyBGbG9hdDMyQXJyYXkodG90TGVuKTtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGZvciAoY29uc3QgciBvZiByZXMpIHtcbiAgICBpLnNldChyLmksIG9mZnNldCk7XG4gICAgai5zZXQoci5qLCBvZmZzZXQpO1xuICAgIGQuc2V0KHIuZGlzdGFuY2UsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IHIuaS5sZW5ndGg7XG4gIH1cblxuICAvLyBkb24ndCBmb3JnZXQgdG8gZ2V0IHRoZSB1cGRhdGVkIHZhbHVlcyBmb3IgdGhlIGRpYWdvbmFsLCB0aGVpciByb3dzIG5lZWQgdG8gYmUgYmFzaWNhbGx5IHNxdWFyZWQgYW5kIHN1bW1lZFxuICAvLyBhbHNvLCB0aGUgZGlhZ29uYWwgdmFsdWVzIGFyZSBub3QgcHJ1bmVkXG5cbiAgcmV0dXJuIHtpLCBqLCBkaXN0YW5jZTogZH07XG59XG4iXX0=","import { multiColWebGPUSparseMatrix } from '@datagrok-libraries/math/src/webGPU/sparse-matrix/webGPU-sparse-matrix';\nimport { SparseMatrixService } from '../distance-matrix/sparse-matrix-service';\nimport { MCLSparseReducer } from './markov-cluster';\nonmessage = async (event) => {\n const { data, threshold, weights, aggregationMethod, distanceFnArgs, distanceFns, maxIterations, useWebGPU, inflate } = event.data;\n console.time('sparse matrix');\n let sparse = null;\n if (useWebGPU) {\n try {\n sparse = await multiColWebGPUSparseMatrix(data, threshold / 100, distanceFns, aggregationMethod, weights, distanceFnArgs);\n }\n catch (e) {\n console.error(e);\n }\n }\n if (!sparse) { // falsback to CPU\n if (useWebGPU)\n console.error('WEBGPU sparse matrix calculation failed, falling back to CPU implementation');\n sparse = await new SparseMatrixService()\n .calcMultiColumn(data, distanceFns, threshold / 100, distanceFnArgs, weights, aggregationMethod);\n }\n const MAX_MCL_CONNECTIONS = 1000000;\n if (sparse.i.length > MAX_MCL_CONNECTIONS)\n sparse = SparseMatrixService.pruneSparseMatrix(sparse, MAX_MCL_CONNECTIONS);\n console.timeEnd('sparse matrix');\n //const res = await new MCLSparseReducer({maxIterations: maxIterations ?? 5}).transform(sparse, data[0].length);\n const reducer = new MCLSparseReducer({ maxIterations: maxIterations ?? 5, inflateFactor: inflate ?? 2 });\n console.time('MCL');\n let res = null;\n if (useWebGPU) {\n try {\n res = await reducer.transformWebGPU(sparse, data[0].length);\n }\n catch (e) {\n console.error('webGPU MCL failed, falling back to CPU implementation');\n console.error(e);\n }\n }\n if (!res)\n res = await reducer.transform(sparse, data[0].length);\n console.timeEnd('MCL');\n postMessage({ res });\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNsLXdvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1jbC13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sd0VBQXdFLENBQUM7QUFDbEgsT0FBTyxFQUFxQixtQkFBbUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBR2pHLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRWxELFNBQVMsR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7SUFDMUIsTUFBTSxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsR0FNL0csS0FBSyxDQUFDLElBQUksQ0FBQztJQUVmLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDOUIsSUFBSSxNQUFNLEdBQThCLElBQUksQ0FBQztJQUM3QyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sMEJBQTBCLENBQ3ZDLElBQUksRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFFLFdBQWtCLEVBQUUsaUJBQXdCLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2xHLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQjtRQUMvQixJQUFJLFNBQVM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLDZFQUE2RSxDQUFDLENBQUM7UUFFL0YsTUFBTSxHQUFHLE1BQU0sSUFBSSxtQkFBbUIsRUFBRTthQUNyQyxlQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsTUFBTSxtQkFBbUIsR0FBRyxPQUFTLENBQUM7SUFDdEMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxtQkFBbUI7UUFDdkMsTUFBTSxHQUFHLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQzlFLE9BQU8sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFakMsZ0hBQWdIO0lBQ2hILE1BQU0sT0FBTyxHQUFHLElBQUksZ0JBQWdCLENBQUMsRUFBQyxhQUFhLEVBQUUsYUFBYSxJQUFJLENBQUMsRUFBRSxhQUFhLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBQyxDQUFDLENBQUM7SUFDdkcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQixJQUFJLEdBQUcsR0FBUSxJQUFJLENBQUM7SUFDcEIsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQztZQUNILEdBQUcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztZQUN2RSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxDQUFDLEdBQUc7UUFDTixHQUFHLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV2QixXQUFXLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7bXVsdGlDb2xXZWJHUFVTcGFyc2VNYXRyaXh9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL3NwYXJzZS1tYXRyaXgvd2ViR1BVLXNwYXJzZS1tYXRyaXgnO1xuaW1wb3J0IHtTcGFyc2VNYXRyaXhSZXN1bHQsIFNwYXJzZU1hdHJpeFNlcnZpY2V9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC9zcGFyc2UtbWF0cml4LXNlcnZpY2UnO1xuaW1wb3J0IHtEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kfSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgvdHlwZXMnO1xuaW1wb3J0IHtLbm93bk1ldHJpY3N9IGZyb20gJy4uL3R5cGVkLW1ldHJpY3MnO1xuaW1wb3J0IHtNQ0xTcGFyc2VSZWR1Y2VyfSBmcm9tICcuL21hcmtvdi1jbHVzdGVyJztcblxub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHtkYXRhLCB0aHJlc2hvbGQsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kLCBkaXN0YW5jZUZuQXJncywgZGlzdGFuY2VGbnMsIG1heEl0ZXJhdGlvbnMsIHVzZVdlYkdQVSwgaW5mbGF0ZX06XG4gICB7XG4gICAgZGF0YTogYW55W11bXSwgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgd2VpZ2h0czogbnVtYmVyW10sIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kLFxuICAgIGRpc3RhbmNlRm5zOiBLbm93bk1ldHJpY3NbXSwgZGlzdGFuY2VGbkFyZ3M6IGFueVtdLCBtYXhJdGVyYXRpb25zOiBudW1iZXIsXG4gICAgdXNlV2ViR1BVPzogYm9vbGVhbiwgaW5mbGF0ZT86IG51bWJlclxuICB9ID0gZXZlbnQuZGF0YTtcblxuICBjb25zb2xlLnRpbWUoJ3NwYXJzZSBtYXRyaXgnKTtcbiAgbGV0IHNwYXJzZTogU3BhcnNlTWF0cml4UmVzdWx0IHwgbnVsbCA9IG51bGw7XG4gIGlmICh1c2VXZWJHUFUpIHtcbiAgICB0cnkge1xuICAgICAgc3BhcnNlID0gYXdhaXQgbXVsdGlDb2xXZWJHUFVTcGFyc2VNYXRyaXgoXG4gICAgICAgIGRhdGEsIHRocmVzaG9sZCAvIDEwMCwgZGlzdGFuY2VGbnMgYXMgYW55LCBhZ2dyZWdhdGlvbk1ldGhvZCBhcyBhbnksIHdlaWdodHMsIGRpc3RhbmNlRm5BcmdzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbiAgfVxuICBpZiAoIXNwYXJzZSkgeyAvLyBmYWxzYmFjayB0byBDUFVcbiAgICBpZiAodXNlV2ViR1BVKVxuICAgICAgY29uc29sZS5lcnJvcignV0VCR1BVIHNwYXJzZSBtYXRyaXggY2FsY3VsYXRpb24gZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gQ1BVIGltcGxlbWVudGF0aW9uJyk7XG5cbiAgICBzcGFyc2UgPSBhd2FpdCBuZXcgU3BhcnNlTWF0cml4U2VydmljZSgpXG4gICAgICAuY2FsY011bHRpQ29sdW1uKGRhdGEsIGRpc3RhbmNlRm5zLCB0aHJlc2hvbGQgLyAxMDAsIGRpc3RhbmNlRm5BcmdzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCk7XG4gIH1cbiAgY29uc3QgTUFYX01DTF9DT05ORUNUSU9OUyA9IDFfMDAwXzAwMDtcbiAgaWYgKHNwYXJzZS5pLmxlbmd0aCA+IE1BWF9NQ0xfQ09OTkVDVElPTlMpXG4gICAgc3BhcnNlID0gU3BhcnNlTWF0cml4U2VydmljZS5wcnVuZVNwYXJzZU1hdHJpeChzcGFyc2UsIE1BWF9NQ0xfQ09OTkVDVElPTlMpO1xuICBjb25zb2xlLnRpbWVFbmQoJ3NwYXJzZSBtYXRyaXgnKTtcblxuICAvL2NvbnN0IHJlcyA9IGF3YWl0IG5ldyBNQ0xTcGFyc2VSZWR1Y2VyKHttYXhJdGVyYXRpb25zOiBtYXhJdGVyYXRpb25zID8/IDV9KS50cmFuc2Zvcm0oc3BhcnNlLCBkYXRhWzBdLmxlbmd0aCk7XG4gIGNvbnN0IHJlZHVjZXIgPSBuZXcgTUNMU3BhcnNlUmVkdWNlcih7bWF4SXRlcmF0aW9uczogbWF4SXRlcmF0aW9ucyA/PyA1LCBpbmZsYXRlRmFjdG9yOiBpbmZsYXRlID8/IDJ9KTtcbiAgY29uc29sZS50aW1lKCdNQ0wnKTtcbiAgbGV0IHJlczogYW55ID0gbnVsbDtcbiAgaWYgKHVzZVdlYkdQVSkge1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBhd2FpdCByZWR1Y2VyLnRyYW5zZm9ybVdlYkdQVShzcGFyc2UsIGRhdGFbMF0ubGVuZ3RoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd3ZWJHUFUgTUNMIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIENQVSBpbXBsZW1lbnRhdGlvbicpO1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFyZXMpXG4gICAgcmVzID0gYXdhaXQgcmVkdWNlci50cmFuc2Zvcm0oc3BhcnNlLCBkYXRhWzBdLmxlbmd0aCk7XG4gIGNvbnNvbGUudGltZUVuZCgnTUNMJyk7XG5cbiAgcG9zdE1lc3NhZ2Uoe3Jlc30pO1xufTtcbiJdfQ==","/* eslint-disable max-len */\nimport Graph from 'graphology';\nimport forceAtlas2 from 'graphology-layout-forceatlas2';\n// note: subCluster is of size nRows and contains for each point which subcluster it belongs to\n// note: cluster is of size of this concrete supercluster, and contains the indexes of the points in that supercluster\nexport function getWebColaLayot(cluster, clusterConnections, _subCluster) {\n const graph = new Graph();\n for (let i = 0; i < cluster.length; i++)\n graph.addNode(cluster[i], { x: Math.random() * 20000, y: Math.random() * 20000 });\n for (let it = 0; it < clusterConnections.i.length; it++) {\n const i = clusterConnections.i[it];\n const j = clusterConnections.j[it];\n const v = clusterConnections.v[it];\n if (i === j || v <= 0)\n continue;\n const weight = _subCluster[i] === _subCluster[j] ? 2 : 1;\n graph.addEdge(i, j, { weight: v * weight });\n }\n const settings = {\n iterations: 100,\n // edgeWeightInfluence: 1, // Influence of edge weights on the layout\n // scalingRatio: 1, // Scaling ratio to account for node sizes\n // //barnesHutOptimize: true,\n // //barnesHutTheta: 0.5,\n // adjustSizes: true,\n // weighted: true,\n // strongGravityMode: true,\n getEdgeWeight: 'weight',\n settings: { ...forceAtlas2.inferSettings(graph), weighted: true, edgeWeightInfluence: 1 }\n };\n forceAtlas2.assign(graph, settings);\n const embedX1 = new Float32Array(cluster.length);\n const embedY1 = new Float32Array(cluster.length);\n for (let i = 0; i < cluster.length; i++) {\n const node = graph.getNodeAttributes(cluster[i]);\n embedX1[i] = node.x;\n embedY1[i] = node.y;\n }\n let minX = embedX1[0];\n let minY = embedY1[0];\n let maxX = embedX1[0];\n let maxY = embedY1[0];\n for (let i = 1; i < cluster.length; i++) {\n minX = Math.min(minX, embedX1[i]);\n minY = Math.min(minY, embedY1[i]);\n maxX = Math.max(maxX, embedX1[i]);\n maxY = Math.max(maxY, embedY1[i]);\n }\n let scaleX = maxX - minX;\n let scaleY = maxY - minY;\n if (scaleX === 0)\n scaleX = 1;\n if (scaleY === 0)\n scaleY = 1;\n for (let i = 0; i < cluster.length; i++) {\n embedX1[i] = (embedX1[i] - minX) / scaleX;\n embedY1[i] = (embedY1[i] - minY) / scaleY;\n }\n return { embedX: embedX1, embedY: embedY1 };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViQ29sYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYkNvbGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNEJBQTRCO0FBRTVCLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLFdBQVcsTUFBTSwrQkFBK0IsQ0FBQztBQUV4RCwrRkFBK0Y7QUFDL0Ysc0hBQXNIO0FBQ3RILE1BQU0sVUFBVSxlQUFlLENBQzdCLE9BQWlCLEVBQUUsa0JBQTJELEVBQUUsV0FBcUI7SUFLckcsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFDckMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssRUFBQyxDQUFDLENBQUM7SUFFbEYsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN4RCxNQUFNLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkIsU0FBUztRQUNYLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUc7UUFDZixVQUFVLEVBQUUsR0FBRztRQUNmLHFFQUFxRTtRQUNyRSw4REFBOEQ7UUFDOUQsNkJBQTZCO1FBQzdCLHlCQUF5QjtRQUN6QixxQkFBcUI7UUFDckIsa0JBQWtCO1FBQ2xCLDJCQUEyQjtRQUMzQixhQUFhLEVBQUUsUUFBUTtRQUN2QixRQUFRLEVBQUUsRUFBQyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxDQUFDLEVBQUM7S0FDeEYsQ0FBQztJQUNGLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXBDLE1BQU0sT0FBTyxHQUFHLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN4QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEIsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3hDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztJQUN6QixJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLElBQUksTUFBTSxLQUFLLENBQUM7UUFDZCxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsSUFBSSxNQUFNLEtBQUssQ0FBQztRQUNkLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDMUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QyxDQUFDO0lBRUQsT0FBTyxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBQyxDQUFDO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbmltcG9ydCBHcmFwaCBmcm9tICdncmFwaG9sb2d5JztcbmltcG9ydCBmb3JjZUF0bGFzMiBmcm9tICdncmFwaG9sb2d5LWxheW91dC1mb3JjZWF0bGFzMic7XG5cbi8vIG5vdGU6IHN1YkNsdXN0ZXIgaXMgb2Ygc2l6ZSBuUm93cyBhbmQgY29udGFpbnMgZm9yIGVhY2ggcG9pbnQgd2hpY2ggc3ViY2x1c3RlciBpdCBiZWxvbmdzIHRvXG4vLyBub3RlOiBjbHVzdGVyIGlzIG9mIHNpemUgb2YgdGhpcyBjb25jcmV0ZSBzdXBlcmNsdXN0ZXIsIGFuZCBjb250YWlucyB0aGUgaW5kZXhlcyBvZiB0aGUgcG9pbnRzIGluIHRoYXQgc3VwZXJjbHVzdGVyXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViQ29sYUxheW90KFxuICBjbHVzdGVyOiBudW1iZXJbXSwgY2x1c3RlckNvbm5lY3Rpb25zOiB7aTogbnVtYmVyW10sIGo6IG51bWJlcltdLCB2OiBudW1iZXJbXX0sIF9zdWJDbHVzdGVyOiBudW1iZXJbXVxuKToge1xuICAgIGVtYmVkWDogRmxvYXQzMkFycmF5O1xuICAgIGVtYmVkWTogRmxvYXQzMkFycmF5O1xufSB7XG4gIGNvbnN0IGdyYXBoID0gbmV3IEdyYXBoKCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3Rlci5sZW5ndGg7IGkrKylcbiAgICBncmFwaC5hZGROb2RlKGNsdXN0ZXJbaV0sIHt4OiBNYXRoLnJhbmRvbSgpICogMjAwMDAsIHk6IE1hdGgucmFuZG9tKCkgKiAyMDAwMH0pO1xuXG4gIGZvciAobGV0IGl0ID0gMDsgaXQgPCBjbHVzdGVyQ29ubmVjdGlvbnMuaS5sZW5ndGg7IGl0KyspIHtcbiAgICBjb25zdCBpID0gY2x1c3RlckNvbm5lY3Rpb25zLmlbaXRdO1xuICAgIGNvbnN0IGogPSBjbHVzdGVyQ29ubmVjdGlvbnMualtpdF07XG4gICAgY29uc3QgdiA9IGNsdXN0ZXJDb25uZWN0aW9ucy52W2l0XTtcbiAgICBpZiAoaSA9PT0gaiB8fCB2IDw9IDApXG4gICAgICBjb250aW51ZTtcbiAgICBjb25zdCB3ZWlnaHQgPSBfc3ViQ2x1c3RlcltpXSA9PT0gX3N1YkNsdXN0ZXJbal0gPyAyIDogMTtcbiAgICBncmFwaC5hZGRFZGdlKGksIGosIHt3ZWlnaHQ6IHYgKiB3ZWlnaHR9KTtcbiAgfVxuXG4gIGNvbnN0IHNldHRpbmdzID0ge1xuICAgIGl0ZXJhdGlvbnM6IDEwMCxcbiAgICAvLyBlZGdlV2VpZ2h0SW5mbHVlbmNlOiAxLCAvLyBJbmZsdWVuY2Ugb2YgZWRnZSB3ZWlnaHRzIG9uIHRoZSBsYXlvdXRcbiAgICAvLyBzY2FsaW5nUmF0aW86IDEsIC8vIFNjYWxpbmcgcmF0aW8gdG8gYWNjb3VudCBmb3Igbm9kZSBzaXplc1xuICAgIC8vIC8vYmFybmVzSHV0T3B0aW1pemU6IHRydWUsXG4gICAgLy8gLy9iYXJuZXNIdXRUaGV0YTogMC41LFxuICAgIC8vIGFkanVzdFNpemVzOiB0cnVlLFxuICAgIC8vIHdlaWdodGVkOiB0cnVlLFxuICAgIC8vIHN0cm9uZ0dyYXZpdHlNb2RlOiB0cnVlLFxuICAgIGdldEVkZ2VXZWlnaHQ6ICd3ZWlnaHQnLFxuICAgIHNldHRpbmdzOiB7Li4uZm9yY2VBdGxhczIuaW5mZXJTZXR0aW5ncyhncmFwaCksIHdlaWdodGVkOiB0cnVlLCBlZGdlV2VpZ2h0SW5mbHVlbmNlOiAxfVxuICB9O1xuICBmb3JjZUF0bGFzMi5hc3NpZ24oZ3JhcGgsIHNldHRpbmdzKTtcblxuICBjb25zdCBlbWJlZFgxID0gbmV3IEZsb2F0MzJBcnJheShjbHVzdGVyLmxlbmd0aCk7XG4gIGNvbnN0IGVtYmVkWTEgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IGdyYXBoLmdldE5vZGVBdHRyaWJ1dGVzKGNsdXN0ZXJbaV0pO1xuICAgIGVtYmVkWDFbaV0gPSBub2RlLng7XG4gICAgZW1iZWRZMVtpXSA9IG5vZGUueTtcbiAgfVxuXG4gIGxldCBtaW5YID0gZW1iZWRYMVswXTtcbiAgbGV0IG1pblkgPSBlbWJlZFkxWzBdO1xuICBsZXQgbWF4WCA9IGVtYmVkWDFbMF07XG4gIGxldCBtYXhZID0gZW1iZWRZMVswXTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBjbHVzdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIGVtYmVkWDFbaV0pO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBlbWJlZFkxW2ldKTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgZW1iZWRYMVtpXSk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGVtYmVkWTFbaV0pO1xuICB9XG4gIGxldCBzY2FsZVggPSBtYXhYIC0gbWluWDtcbiAgbGV0IHNjYWxlWSA9IG1heFkgLSBtaW5ZO1xuICBpZiAoc2NhbGVYID09PSAwKVxuICAgIHNjYWxlWCA9IDE7XG4gIGlmIChzY2FsZVkgPT09IDApXG4gICAgc2NhbGVZID0gMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgZW1iZWRYMVtpXSA9IChlbWJlZFgxW2ldIC0gbWluWCkgLyBzY2FsZVg7XG4gICAgZW1iZWRZMVtpXSA9IChlbWJlZFkxW2ldIC0gbWluWSkgLyBzY2FsZVk7XG4gIH1cblxuICByZXR1cm4ge2VtYmVkWDogZW1iZWRYMSwgZW1iZWRZOiBlbWJlZFkxfTtcbn1cbiJdfQ==","export var DistanceAggregationMethods;\n(function (DistanceAggregationMethods) {\n DistanceAggregationMethods[\"EUCLIDEAN\"] = \"EUCLIDEAN\";\n DistanceAggregationMethods[\"MANHATTAN\"] = \"MANHATTAN\";\n})(DistanceAggregationMethods || (DistanceAggregationMethods = {}));\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSwwQkFHVDtBQUhILFdBQVksMEJBQTBCO0lBQ2xDLHFEQUF1QixDQUFBO0lBQ3ZCLHFEQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFIUywwQkFBMEIsS0FBMUIsMEJBQTBCLFFBR25DO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzIHtcbiAgICBFVUNMSURFQU4gPSAnRVVDTElERUFOJyxcbiAgICBNQU5IQVRUQU4gPSAnTUFOSEFUVEFOJyxcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IGtleW9mIHR5cGVvZiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcztcbiJdfQ==","import { DistanceAggregationMethods } from './types';\nexport const isNil = (x) => x === null || x === undefined;\nexport function insertSmaller(distancesAr, indexes, num, index) {\n if (num > distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num < v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function insertLarger(distancesAr, indexes, num, index) {\n if (num < distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num > v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function getAggregationFunction(aggregationMethod, weights) {\n switch (aggregationMethod) {\n case DistanceAggregationMethods.MANHATTAN:\n return (vs) => vs.reduce((acc, val, idx) => acc + val * weights[idx], 0);\n default:\n return (vs) => {\n // euclidean\n const sum = vs.reduce((acc, val, idx) => acc + (val * weights[idx]) ** 2, 0);\n return Math.sqrt(sum);\n };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBRS9ELE1BQU0sVUFBVSxhQUFhLENBQUMsV0FBcUIsRUFBRSxPQUFpQixFQUFFLEdBQVcsRUFBRSxLQUFhO0lBQ2hHLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPO0lBRVQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQixXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLFdBQXFCLEVBQUUsT0FBaUIsRUFBRSxHQUFXLEVBQUUsS0FBYTtJQUMvRixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTztJQUVULE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRCxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxpQkFBNEMsRUFBRSxPQUFpQjtJQUUvRCxRQUFRLGlCQUFpQixFQUFFLENBQUM7UUFDMUIsS0FBSywwQkFBMEIsQ0FBQyxTQUFTO1lBQ3ZDLE9BQU8sQ0FBQyxFQUFZLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckY7WUFDRSxPQUFPLENBQUMsRUFBWSxFQUFFLEVBQUU7Z0JBQ3RCLFlBQVk7Z0JBQ1osTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDO0lBQ04sQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGlzTmlsID0gKHg6IGFueSkgPT4geCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRTbWFsbGVyKGRpc3RhbmNlc0FyOiBudW1iZXJbXSwgaW5kZXhlczogbnVtYmVyW10sIG51bTogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gIGlmIChudW0gPiBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGgtMV0pXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPCB2KTtcbiAgZGlzdGFuY2VzQXIucG9wKCk7XG4gIGRpc3RhbmNlc0FyLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgbnVtKTtcbiAgaW5kZXhlcy5wb3AoKTtcbiAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExhcmdlcihkaXN0YW5jZXNBcjogbnVtYmVyW10sIGluZGV4ZXM6IG51bWJlcltdLCBudW06IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICBpZiAobnVtIDwgZGlzdGFuY2VzQXJbZGlzdGFuY2VzQXIubGVuZ3RoLTFdKVxuICAgIHJldHVybjtcblxuICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpc3RhbmNlc0FyLmZpbmRJbmRleCgodikgPT4gbnVtID4gdik7XG4gIGRpc3RhbmNlc0FyLnBvcCgpO1xuICBkaXN0YW5jZXNBci5zcGxpY2UobmV3UG9zaXRpb24sIDAsIG51bSk7XG4gIGluZGV4ZXMucG9wKCk7XG4gIGluZGV4ZXMuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpbmRleCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBZ2dyZWdhdGlvbkZ1bmN0aW9uKFxuICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgd2VpZ2h0czogbnVtYmVyW11cbik6ICh2YWx1ZXM6IG51bWJlcltdKSA9PiBudW1iZXIge1xuICBzd2l0Y2ggKGFnZ3JlZ2F0aW9uTWV0aG9kKSB7XG4gICAgY2FzZSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5NQU5IQVRUQU46XG4gICAgICByZXR1cm4gKHZzOiBudW1iZXJbXSkgPT4gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyB2YWwgKiB3ZWlnaHRzW2lkeF0sIDApO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gKHZzOiBudW1iZXJbXSkgPT4ge1xuICAgICAgICAvLyBldWNsaWRlYW5cbiAgICAgICAgY29uc3Qgc3VtID0gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyAodmFsICogd2VpZ2h0c1tpZHhdKSAqKiAyLCAwKTtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydChzdW0pO1xuICAgICAgfTtcbiAgfVxufVxuIl19","/**\n * Graphology ForceAtlas2 Layout Default Settings\n * ===============================================\n */\nmodule.exports = {\n linLogMode: false,\n outboundAttractionDistribution: false,\n adjustSizes: false,\n edgeWeightInfluence: 1,\n scalingRatio: 1,\n strongGravityMode: false,\n gravity: 1,\n slowDown: 1,\n barnesHutOptimize: false,\n barnesHutTheta: 0.5\n};\n","/**\n * Graphology ForceAtlas2 Helpers\n * ===============================\n *\n * Miscellaneous helper functions.\n */\n\n/**\n * Constants.\n */\nvar PPN = 10;\nvar PPE = 3;\n\n/**\n * Very simple Object.assign-like function.\n *\n * @param {object} target - First object.\n * @param {object} [...objects] - Objects to merge.\n * @return {object}\n */\nexports.assign = function (target) {\n target = target || {};\n\n var objects = Array.prototype.slice.call(arguments).slice(1),\n i,\n k,\n l;\n\n for (i = 0, l = objects.length; i < l; i++) {\n if (!objects[i]) continue;\n\n for (k in objects[i]) target[k] = objects[i][k];\n }\n\n return target;\n};\n\n/**\n * Function used to validate the given settings.\n *\n * @param {object} settings - Settings to validate.\n * @return {object|null}\n */\nexports.validateSettings = function (settings) {\n if ('linLogMode' in settings && typeof settings.linLogMode !== 'boolean')\n return {message: 'the `linLogMode` setting should be a boolean.'};\n\n if (\n 'outboundAttractionDistribution' in settings &&\n typeof settings.outboundAttractionDistribution !== 'boolean'\n )\n return {\n message:\n 'the `outboundAttractionDistribution` setting should be a boolean.'\n };\n\n if ('adjustSizes' in settings && typeof settings.adjustSizes !== 'boolean')\n return {message: 'the `adjustSizes` setting should be a boolean.'};\n\n if (\n 'edgeWeightInfluence' in settings &&\n typeof settings.edgeWeightInfluence !== 'number'\n )\n return {\n message: 'the `edgeWeightInfluence` setting should be a number.'\n };\n\n if (\n 'scalingRatio' in settings &&\n !(typeof settings.scalingRatio === 'number' && settings.scalingRatio >= 0)\n )\n return {message: 'the `scalingRatio` setting should be a number >= 0.'};\n\n if (\n 'strongGravityMode' in settings &&\n typeof settings.strongGravityMode !== 'boolean'\n )\n return {message: 'the `strongGravityMode` setting should be a boolean.'};\n\n if (\n 'gravity' in settings &&\n !(typeof settings.gravity === 'number' && settings.gravity >= 0)\n )\n return {message: 'the `gravity` setting should be a number >= 0.'};\n\n if (\n 'slowDown' in settings &&\n !(typeof settings.slowDown === 'number' || settings.slowDown >= 0)\n )\n return {message: 'the `slowDown` setting should be a number >= 0.'};\n\n if (\n 'barnesHutOptimize' in settings &&\n typeof settings.barnesHutOptimize !== 'boolean'\n )\n return {message: 'the `barnesHutOptimize` setting should be a boolean.'};\n\n if (\n 'barnesHutTheta' in settings &&\n !(\n typeof settings.barnesHutTheta === 'number' &&\n settings.barnesHutTheta >= 0\n )\n )\n return {message: 'the `barnesHutTheta` setting should be a number >= 0.'};\n\n return null;\n};\n\n/**\n * Function generating a flat matrix for both nodes & edges of the given graph.\n *\n * @param {Graph} graph - Target graph.\n * @param {function} getEdgeWeight - Edge weight getter function.\n * @return {object} - Both matrices.\n */\nexports.graphToByteArrays = function (graph, getEdgeWeight) {\n var order = graph.order;\n var size = graph.size;\n var index = {};\n var j;\n\n // NOTE: float32 could lead to issues if edge array needs to index large\n // number of nodes.\n var NodeMatrix = new Float32Array(order * PPN);\n var EdgeMatrix = new Float32Array(size * PPE);\n\n // Iterate through nodes\n j = 0;\n graph.forEachNode(function (node, attr) {\n // Node index\n index[node] = j;\n\n // Populating byte array\n NodeMatrix[j] = attr.x;\n NodeMatrix[j + 1] = attr.y;\n NodeMatrix[j + 2] = 0; // dx\n NodeMatrix[j + 3] = 0; // dy\n NodeMatrix[j + 4] = 0; // old_dx\n NodeMatrix[j + 5] = 0; // old_dy\n NodeMatrix[j + 6] = 1; // mass\n NodeMatrix[j + 7] = 1; // convergence\n NodeMatrix[j + 8] = attr.size || 1;\n NodeMatrix[j + 9] = attr.fixed ? 1 : 0;\n j += PPN;\n });\n\n // Iterate through edges\n j = 0;\n graph.forEachEdge(function (edge, attr, source, target, sa, ta, u) {\n var sj = index[source];\n var tj = index[target];\n\n var weight = getEdgeWeight(edge, attr, source, target, sa, ta, u);\n\n // Incrementing mass to be a node's weighted degree\n NodeMatrix[sj + 6] += weight;\n NodeMatrix[tj + 6] += weight;\n\n // Populating byte array\n EdgeMatrix[j] = sj;\n EdgeMatrix[j + 1] = tj;\n EdgeMatrix[j + 2] = weight;\n j += PPE;\n });\n\n return {\n nodes: NodeMatrix,\n edges: EdgeMatrix\n };\n};\n\n/**\n * Function applying the layout back to the graph.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n * @param {function|null} outputReducer - A node reducer.\n */\nexports.assignLayoutChanges = function (graph, NodeMatrix, outputReducer) {\n var i = 0;\n\n graph.updateEachNodeAttributes(function (node, attr) {\n attr.x = NodeMatrix[i];\n attr.y = NodeMatrix[i + 1];\n\n i += PPN;\n\n return outputReducer ? outputReducer(node, attr) : attr;\n });\n};\n\n/**\n * Function reading the positions (only) from the graph, to write them in the matrix.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n */\nexports.readGraphPositions = function (graph, NodeMatrix) {\n var i = 0;\n\n graph.forEachNode(function (node, attr) {\n NodeMatrix[i] = attr.x;\n NodeMatrix[i + 1] = attr.y;\n\n i += PPN;\n });\n};\n\n/**\n * Function collecting the layout positions.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n * @param {function|null} outputReducer - A nodes reducer.\n * @return {object} - Map to node positions.\n */\nexports.collectLayoutChanges = function (graph, NodeMatrix, outputReducer) {\n var nodes = graph.nodes(),\n positions = {};\n\n for (var i = 0, j = 0, l = NodeMatrix.length; i < l; i += PPN) {\n if (outputReducer) {\n var newAttr = Object.assign({}, graph.getNodeAttributes(nodes[j]));\n newAttr.x = NodeMatrix[i];\n newAttr.y = NodeMatrix[i + 1];\n newAttr = outputReducer(nodes[j], newAttr);\n positions[nodes[j]] = {\n x: newAttr.x,\n y: newAttr.y\n };\n } else {\n positions[nodes[j]] = {\n x: NodeMatrix[i],\n y: NodeMatrix[i + 1]\n };\n }\n\n j++;\n }\n\n return positions;\n};\n\n/**\n * Function returning a web worker from the given function.\n *\n * @param {function} fn - Function for the worker.\n * @return {DOMString}\n */\nexports.createWorker = function createWorker(fn) {\n var xURL = window.URL || window.webkitURL;\n var code = fn.toString();\n var objectUrl = xURL.createObjectURL(\n new Blob(['(' + code + ').call(this);'], {type: 'text/javascript'})\n );\n var worker = new Worker(objectUrl);\n xURL.revokeObjectURL(objectUrl);\n\n return worker;\n};\n","/**\n * Graphology ForceAtlas2 Layout\n * ==============================\n *\n * Library endpoint.\n */\nvar isGraph = require('graphology-utils/is-graph');\nvar createEdgeWeightGetter =\n require('graphology-utils/getters').createEdgeWeightGetter;\nvar iterate = require('./iterate.js');\nvar helpers = require('./helpers.js');\n\nvar DEFAULT_SETTINGS = require('./defaults.js');\n\n/**\n * Asbtract function used to run a certain number of iterations.\n *\n * @param {boolean} assign - Whether to assign positions.\n * @param {Graph} graph - Target graph.\n * @param {object|number} params - If number, params.iterations, else:\n * @param {function} getWeight - Edge weight getter function.\n * @param {number} iterations - Number of iterations.\n * @param {function|null} outputReducer - A node reducer\n * @param {object} [settings] - Settings.\n * @return {object|undefined}\n */\nfunction abstractSynchronousLayout(assign, graph, params) {\n if (!isGraph(graph))\n throw new Error(\n 'graphology-layout-forceatlas2: the given graph is not a valid graphology instance.'\n );\n\n if (typeof params === 'number') params = {iterations: params};\n\n var iterations = params.iterations;\n\n if (typeof iterations !== 'number')\n throw new Error(\n 'graphology-layout-forceatlas2: invalid number of iterations.'\n );\n\n if (iterations <= 0)\n throw new Error(\n 'graphology-layout-forceatlas2: you should provide a positive number of iterations.'\n );\n\n var getEdgeWeight = createEdgeWeightGetter(\n 'getEdgeWeight' in params ? params.getEdgeWeight : 'weight'\n ).fromEntry;\n\n var outputReducer =\n typeof params.outputReducer === 'function' ? params.outputReducer : null;\n\n // Validating settings\n var settings = helpers.assign({}, DEFAULT_SETTINGS, params.settings);\n var validationError = helpers.validateSettings(settings);\n\n if (validationError)\n throw new Error(\n 'graphology-layout-forceatlas2: ' + validationError.message\n );\n\n // Building matrices\n var matrices = helpers.graphToByteArrays(graph, getEdgeWeight);\n\n var i;\n\n // Iterating\n for (i = 0; i < iterations; i++)\n iterate(settings, matrices.nodes, matrices.edges);\n\n // Applying\n if (assign) {\n helpers.assignLayoutChanges(graph, matrices.nodes, outputReducer);\n return;\n }\n\n return helpers.collectLayoutChanges(graph, matrices.nodes);\n}\n\n/**\n * Function returning sane layout settings for the given graph.\n *\n * @param {Graph|number} graph - Target graph or graph order.\n * @return {object}\n */\nfunction inferSettings(graph) {\n var order = typeof graph === 'number' ? graph : graph.order;\n\n return {\n barnesHutOptimize: order > 2000,\n strongGravityMode: true,\n gravity: 0.05,\n scalingRatio: 10,\n slowDown: 1 + Math.log(order)\n };\n}\n\n/**\n * Exporting.\n */\nvar synchronousLayout = abstractSynchronousLayout.bind(null, false);\nsynchronousLayout.assign = abstractSynchronousLayout.bind(null, true);\nsynchronousLayout.inferSettings = inferSettings;\n\nmodule.exports = synchronousLayout;\n","/* eslint no-constant-condition: 0 */\n/**\n * Graphology ForceAtlas2 Iteration\n * =================================\n *\n * Function used to perform a single iteration of the algorithm.\n */\n\n/**\n * Matrices properties accessors.\n */\nvar NODE_X = 0;\nvar NODE_Y = 1;\nvar NODE_DX = 2;\nvar NODE_DY = 3;\nvar NODE_OLD_DX = 4;\nvar NODE_OLD_DY = 5;\nvar NODE_MASS = 6;\nvar NODE_CONVERGENCE = 7;\nvar NODE_SIZE = 8;\nvar NODE_FIXED = 9;\n\nvar EDGE_SOURCE = 0;\nvar EDGE_TARGET = 1;\nvar EDGE_WEIGHT = 2;\n\nvar REGION_NODE = 0;\nvar REGION_CENTER_X = 1;\nvar REGION_CENTER_Y = 2;\nvar REGION_SIZE = 3;\nvar REGION_NEXT_SIBLING = 4;\nvar REGION_FIRST_CHILD = 5;\nvar REGION_MASS = 6;\nvar REGION_MASS_CENTER_X = 7;\nvar REGION_MASS_CENTER_Y = 8;\n\nvar SUBDIVISION_ATTEMPTS = 3;\n\n/**\n * Constants.\n */\nvar PPN = 10;\nvar PPE = 3;\nvar PPR = 9;\n\nvar MAX_FORCE = 10;\n\n/**\n * Function used to perform a single interation of the algorithm.\n *\n * @param {object} options - Layout options.\n * @param {Float32Array} NodeMatrix - Node data.\n * @param {Float32Array} EdgeMatrix - Edge data.\n * @return {object} - Some metadata.\n */\nmodule.exports = function iterate(options, NodeMatrix, EdgeMatrix) {\n // Initializing variables\n var l, r, n, n1, n2, rn, e, w, g, s;\n\n var order = NodeMatrix.length,\n size = EdgeMatrix.length;\n\n var adjustSizes = options.adjustSizes;\n\n var thetaSquared = options.barnesHutTheta * options.barnesHutTheta;\n\n var outboundAttCompensation, coefficient, xDist, yDist, ewc, distance, factor;\n\n var RegionMatrix = [];\n\n // 1) Initializing layout data\n //-----------------------------\n\n // Resetting positions & computing max values\n for (n = 0; n < order; n += PPN) {\n NodeMatrix[n + NODE_OLD_DX] = NodeMatrix[n + NODE_DX];\n NodeMatrix[n + NODE_OLD_DY] = NodeMatrix[n + NODE_DY];\n NodeMatrix[n + NODE_DX] = 0;\n NodeMatrix[n + NODE_DY] = 0;\n }\n\n // If outbound attraction distribution, compensate\n if (options.outboundAttractionDistribution) {\n outboundAttCompensation = 0;\n for (n = 0; n < order; n += PPN) {\n outboundAttCompensation += NodeMatrix[n + NODE_MASS];\n }\n\n outboundAttCompensation /= order / PPN;\n }\n\n // 1.bis) Barnes-Hut computation\n //------------------------------\n\n if (options.barnesHutOptimize) {\n // Setting up\n var minX = Infinity,\n maxX = -Infinity,\n minY = Infinity,\n maxY = -Infinity,\n q,\n q2,\n subdivisionAttempts;\n\n // Computing min and max values\n for (n = 0; n < order; n += PPN) {\n minX = Math.min(minX, NodeMatrix[n + NODE_X]);\n maxX = Math.max(maxX, NodeMatrix[n + NODE_X]);\n minY = Math.min(minY, NodeMatrix[n + NODE_Y]);\n maxY = Math.max(maxY, NodeMatrix[n + NODE_Y]);\n }\n\n // squarify bounds, it's a quadtree\n var dx = maxX - minX,\n dy = maxY - minY;\n if (dx > dy) {\n minY -= (dx - dy) / 2;\n maxY = minY + dx;\n } else {\n minX -= (dy - dx) / 2;\n maxX = minX + dy;\n }\n\n // Build the Barnes Hut root region\n RegionMatrix[0 + REGION_NODE] = -1;\n RegionMatrix[0 + REGION_CENTER_X] = (minX + maxX) / 2;\n RegionMatrix[0 + REGION_CENTER_Y] = (minY + maxY) / 2;\n RegionMatrix[0 + REGION_SIZE] = Math.max(maxX - minX, maxY - minY);\n RegionMatrix[0 + REGION_NEXT_SIBLING] = -1;\n RegionMatrix[0 + REGION_FIRST_CHILD] = -1;\n RegionMatrix[0 + REGION_MASS] = 0;\n RegionMatrix[0 + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[0 + REGION_MASS_CENTER_Y] = 0;\n\n // Add each node in the tree\n l = 1;\n for (n = 0; n < order; n += PPN) {\n // Current region, starting with root\n r = 0;\n subdivisionAttempts = SUBDIVISION_ATTEMPTS;\n\n while (true) {\n // Are there sub-regions?\n\n // We look at first child index\n if (RegionMatrix[r + REGION_FIRST_CHILD] >= 0) {\n // There are sub-regions\n\n // We just iterate to find a \"leaf\" of the tree\n // that is an empty region or a region with a single node\n // (see next case)\n\n // Find the quadrant of n\n if (NodeMatrix[n + NODE_X] < RegionMatrix[r + REGION_CENTER_X]) {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n // Update center of mass and mass (we only do it for non-leave regions)\n RegionMatrix[r + REGION_MASS_CENTER_X] =\n (RegionMatrix[r + REGION_MASS_CENTER_X] *\n RegionMatrix[r + REGION_MASS] +\n NodeMatrix[n + NODE_X] * NodeMatrix[n + NODE_MASS]) /\n (RegionMatrix[r + REGION_MASS] + NodeMatrix[n + NODE_MASS]);\n\n RegionMatrix[r + REGION_MASS_CENTER_Y] =\n (RegionMatrix[r + REGION_MASS_CENTER_Y] *\n RegionMatrix[r + REGION_MASS] +\n NodeMatrix[n + NODE_Y] * NodeMatrix[n + NODE_MASS]) /\n (RegionMatrix[r + REGION_MASS] + NodeMatrix[n + NODE_MASS]);\n\n RegionMatrix[r + REGION_MASS] += NodeMatrix[n + NODE_MASS];\n\n // Iterate on the right quadrant\n r = q;\n continue;\n } else {\n // There are no sub-regions: we are in a \"leaf\"\n\n // Is there a node in this leave?\n if (RegionMatrix[r + REGION_NODE] < 0) {\n // There is no node in region:\n // we record node n and go on\n RegionMatrix[r + REGION_NODE] = n;\n break;\n } else {\n // There is a node in this region\n\n // We will need to create sub-regions, stick the two\n // nodes (the old one r[0] and the new one n) in two\n // subregions. If they fall in the same quadrant,\n // we will iterate.\n\n // Create sub-regions\n RegionMatrix[r + REGION_FIRST_CHILD] = l * PPR;\n w = RegionMatrix[r + REGION_SIZE] / 2; // new size (half)\n\n // NOTE: we use screen coordinates\n // from Top Left to Bottom Right\n\n // Top Left sub-region\n g = RegionMatrix[r + REGION_FIRST_CHILD];\n\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] - w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] - w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Bottom Left sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] - w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] + w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Top Right sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] + w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] - w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Bottom Right sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] + w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] + w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] =\n RegionMatrix[r + REGION_NEXT_SIBLING];\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n l += 4;\n\n // Now the goal is to find two different sub-regions\n // for the two nodes: the one previously recorded (r[0])\n // and the one we want to add (n)\n\n // Find the quadrant of the old node\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_X] <\n RegionMatrix[r + REGION_CENTER_X]\n ) {\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y] <\n RegionMatrix[r + REGION_CENTER_Y]\n ) {\n // Top Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y] <\n RegionMatrix[r + REGION_CENTER_Y]\n ) {\n // Top Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n // We remove r[0] from the region r, add its mass to r and record it in q\n RegionMatrix[r + REGION_MASS] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_MASS];\n RegionMatrix[r + REGION_MASS_CENTER_X] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_X];\n RegionMatrix[r + REGION_MASS_CENTER_Y] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y];\n\n RegionMatrix[q + REGION_NODE] = RegionMatrix[r + REGION_NODE];\n RegionMatrix[r + REGION_NODE] = -1;\n\n // Find the quadrant of n\n if (NodeMatrix[n + NODE_X] < RegionMatrix[r + REGION_CENTER_X]) {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Left quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Right quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n if (q === q2) {\n // If both nodes are in the same quadrant,\n // we have to try it again on this quadrant\n if (subdivisionAttempts--) {\n r = q;\n continue; // while\n } else {\n // we are out of precision here, and we cannot subdivide anymore\n // but we have to break the loop anyway\n subdivisionAttempts = SUBDIVISION_ATTEMPTS;\n break; // while\n }\n }\n\n // If both quadrants are different, we record n\n // in its quadrant\n RegionMatrix[q2 + REGION_NODE] = n;\n break;\n }\n }\n }\n }\n }\n\n // 2) Repulsion\n //--------------\n // NOTES: adjustSizes = antiCollision & scalingRatio = coefficient\n\n if (options.barnesHutOptimize) {\n coefficient = options.scalingRatio;\n\n // Applying repulsion through regions\n for (n = 0; n < order; n += PPN) {\n // Computing leaf quad nodes iteration\n\n r = 0; // Starting with root region\n while (true) {\n if (RegionMatrix[r + REGION_FIRST_CHILD] >= 0) {\n // The region has sub-regions\n\n // We run the Barnes Hut test to see if we are at the right distance\n distance =\n Math.pow(\n NodeMatrix[n + NODE_X] - RegionMatrix[r + REGION_MASS_CENTER_X],\n 2\n ) +\n Math.pow(\n NodeMatrix[n + NODE_Y] - RegionMatrix[r + REGION_MASS_CENTER_Y],\n 2\n );\n\n s = RegionMatrix[r + REGION_SIZE];\n\n if ((4 * s * s) / distance < thetaSquared) {\n // We treat the region as a single body, and we repulse\n\n xDist =\n NodeMatrix[n + NODE_X] - RegionMatrix[r + REGION_MASS_CENTER_X];\n yDist =\n NodeMatrix[n + NODE_Y] - RegionMatrix[r + REGION_MASS_CENTER_Y];\n\n if (adjustSizes === true) {\n //-- Linear Anti-collision Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n } else if (distance < 0) {\n factor =\n (-coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n Math.sqrt(distance);\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n }\n\n // When this is done, we iterate. We have to look at the next sibling.\n r = RegionMatrix[r + REGION_NEXT_SIBLING];\n if (r < 0) break; // No next sibling: we have finished the tree\n\n continue;\n } else {\n // The region is too close and we have to look at sub-regions\n r = RegionMatrix[r + REGION_FIRST_CHILD];\n continue;\n }\n } else {\n // The region has no sub-region\n // If there is a node r[0] and it is not n, then repulse\n rn = RegionMatrix[r + REGION_NODE];\n\n if (rn >= 0 && rn !== n) {\n xDist = NodeMatrix[n + NODE_X] - NodeMatrix[rn + NODE_X];\n yDist = NodeMatrix[n + NODE_Y] - NodeMatrix[rn + NODE_Y];\n\n distance = xDist * xDist + yDist * yDist;\n\n if (adjustSizes === true) {\n //-- Linear Anti-collision Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n } else if (distance < 0) {\n factor =\n (-coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n Math.sqrt(distance);\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n }\n }\n\n // When this is done, we iterate. We have to look at the next sibling.\n r = RegionMatrix[r + REGION_NEXT_SIBLING];\n\n if (r < 0) break; // No next sibling: we have finished the tree\n\n continue;\n }\n }\n }\n } else {\n coefficient = options.scalingRatio;\n\n // Square iteration\n for (n1 = 0; n1 < order; n1 += PPN) {\n for (n2 = 0; n2 < n1; n2 += PPN) {\n // Common to both methods\n xDist = NodeMatrix[n1 + NODE_X] - NodeMatrix[n2 + NODE_X];\n yDist = NodeMatrix[n1 + NODE_Y] - NodeMatrix[n2 + NODE_Y];\n\n if (adjustSizes === true) {\n //-- Anticollision Linear Repulsion\n distance =\n Math.sqrt(xDist * xDist + yDist * yDist) -\n NodeMatrix[n1 + NODE_SIZE] -\n NodeMatrix[n2 + NODE_SIZE];\n\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS]) /\n distance /\n distance;\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n } else if (distance < 0) {\n factor =\n 100 *\n coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS];\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n distance = Math.sqrt(xDist * xDist + yDist * yDist);\n\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS]) /\n distance /\n distance;\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n }\n }\n }\n }\n\n // 3) Gravity\n //------------\n g = options.gravity / options.scalingRatio;\n coefficient = options.scalingRatio;\n for (n = 0; n < order; n += PPN) {\n factor = 0;\n\n // Common to both methods\n xDist = NodeMatrix[n + NODE_X];\n yDist = NodeMatrix[n + NODE_Y];\n distance = Math.sqrt(Math.pow(xDist, 2) + Math.pow(yDist, 2));\n\n if (options.strongGravityMode) {\n //-- Strong gravity\n if (distance > 0) factor = coefficient * NodeMatrix[n + NODE_MASS] * g;\n } else {\n //-- Linear Anti-collision Repulsion n\n if (distance > 0)\n factor = (coefficient * NodeMatrix[n + NODE_MASS] * g) / distance;\n }\n\n // Updating node's dx and dy\n NodeMatrix[n + NODE_DX] -= xDist * factor;\n NodeMatrix[n + NODE_DY] -= yDist * factor;\n }\n\n // 4) Attraction\n //---------------\n coefficient =\n 1 * (options.outboundAttractionDistribution ? outboundAttCompensation : 1);\n\n // TODO: simplify distance\n // TODO: coefficient is always used as -c --> optimize?\n for (e = 0; e < size; e += PPE) {\n n1 = EdgeMatrix[e + EDGE_SOURCE];\n n2 = EdgeMatrix[e + EDGE_TARGET];\n w = EdgeMatrix[e + EDGE_WEIGHT];\n\n // Edge weight influence\n ewc = Math.pow(w, options.edgeWeightInfluence);\n\n // Common measures\n xDist = NodeMatrix[n1 + NODE_X] - NodeMatrix[n2 + NODE_X];\n yDist = NodeMatrix[n1 + NODE_Y] - NodeMatrix[n2 + NODE_Y];\n\n // Applying attraction to nodes\n if (adjustSizes === true) {\n distance =\n Math.sqrt(xDist * xDist + yDist * yDist) -\n NodeMatrix[n1 + NODE_SIZE] -\n NodeMatrix[n2 + NODE_SIZE];\n\n if (options.linLogMode) {\n if (options.outboundAttractionDistribution) {\n //-- LinLog Degree Distributed Anti-collision Attraction\n if (distance > 0) {\n factor =\n (-coefficient * ewc * Math.log(1 + distance)) /\n distance /\n NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- LinLog Anti-collision Attraction\n if (distance > 0) {\n factor = (-coefficient * ewc * Math.log(1 + distance)) / distance;\n }\n }\n } else {\n if (options.outboundAttractionDistribution) {\n //-- Linear Degree Distributed Anti-collision Attraction\n if (distance > 0) {\n factor = (-coefficient * ewc) / NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- Linear Anti-collision Attraction\n if (distance > 0) {\n factor = -coefficient * ewc;\n }\n }\n }\n } else {\n distance = Math.sqrt(Math.pow(xDist, 2) + Math.pow(yDist, 2));\n\n if (options.linLogMode) {\n if (options.outboundAttractionDistribution) {\n //-- LinLog Degree Distributed Attraction\n if (distance > 0) {\n factor =\n (-coefficient * ewc * Math.log(1 + distance)) /\n distance /\n NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- LinLog Attraction\n if (distance > 0)\n factor = (-coefficient * ewc * Math.log(1 + distance)) / distance;\n }\n } else {\n if (options.outboundAttractionDistribution) {\n //-- Linear Attraction Mass Distributed\n // NOTE: Distance is set to 1 to override next condition\n distance = 1;\n factor = (-coefficient * ewc) / NodeMatrix[n1 + NODE_MASS];\n } else {\n //-- Linear Attraction\n // NOTE: Distance is set to 1 to override next condition\n distance = 1;\n factor = -coefficient * ewc;\n }\n }\n }\n\n // Updating nodes' dx and dy\n // TODO: if condition or factor = 1?\n if (distance > 0) {\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n }\n\n // 5) Apply Forces\n //-----------------\n var force, swinging, traction, nodespeed, newX, newY;\n\n // MATH: sqrt and square distances\n if (adjustSizes === true) {\n for (n = 0; n < order; n += PPN) {\n if (NodeMatrix[n + NODE_FIXED] !== 1) {\n force = Math.sqrt(\n Math.pow(NodeMatrix[n + NODE_DX], 2) +\n Math.pow(NodeMatrix[n + NODE_DY], 2)\n );\n\n if (force > MAX_FORCE) {\n NodeMatrix[n + NODE_DX] =\n (NodeMatrix[n + NODE_DX] * MAX_FORCE) / force;\n NodeMatrix[n + NODE_DY] =\n (NodeMatrix[n + NODE_DY] * MAX_FORCE) / force;\n }\n\n swinging =\n NodeMatrix[n + NODE_MASS] *\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY])\n );\n\n traction =\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY])\n ) / 2;\n\n nodespeed = (0.1 * Math.log(1 + traction)) / (1 + Math.sqrt(swinging));\n\n // Updating node's positon\n newX =\n NodeMatrix[n + NODE_X] +\n NodeMatrix[n + NODE_DX] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_X] = newX;\n\n newY =\n NodeMatrix[n + NODE_Y] +\n NodeMatrix[n + NODE_DY] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_Y] = newY;\n }\n }\n } else {\n for (n = 0; n < order; n += PPN) {\n if (NodeMatrix[n + NODE_FIXED] !== 1) {\n swinging =\n NodeMatrix[n + NODE_MASS] *\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY])\n );\n\n traction =\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY])\n ) / 2;\n\n nodespeed =\n (NodeMatrix[n + NODE_CONVERGENCE] * Math.log(1 + traction)) /\n (1 + Math.sqrt(swinging));\n\n // Updating node convergence\n NodeMatrix[n + NODE_CONVERGENCE] = Math.min(\n 1,\n Math.sqrt(\n (nodespeed *\n (Math.pow(NodeMatrix[n + NODE_DX], 2) +\n Math.pow(NodeMatrix[n + NODE_DY], 2))) /\n (1 + Math.sqrt(swinging))\n )\n );\n\n // Updating node's positon\n newX =\n NodeMatrix[n + NODE_X] +\n NodeMatrix[n + NODE_DX] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_X] = newX;\n\n newY =\n NodeMatrix[n + NODE_Y] +\n NodeMatrix[n + NODE_DY] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_Y] = newY;\n }\n }\n }\n\n // We return the information about the layout (no need to return the matrices)\n return {};\n};\n","/**\n * Graphology Weight Getter\n * =========================\n *\n * Function creating weight getters.\n */\nfunction coerceWeight(value) {\n // Ensuring target value is a correct number\n if (typeof value !== 'number' || isNaN(value)) return 1;\n\n return value;\n}\n\nfunction createNodeValueGetter(nameOrFunction, defaultValue) {\n var getter = {};\n\n var coerceToDefault = function (v) {\n if (typeof v === 'undefined') return defaultValue;\n\n return v;\n };\n\n if (typeof defaultValue === 'function') coerceToDefault = defaultValue;\n\n var get = function (attributes) {\n return coerceToDefault(attributes[nameOrFunction]);\n };\n\n var returnDefault = function () {\n return coerceToDefault(undefined);\n };\n\n if (typeof nameOrFunction === 'string') {\n getter.fromAttributes = get;\n getter.fromGraph = function (graph, node) {\n return get(graph.getNodeAttributes(node));\n };\n getter.fromEntry = function (node, attributes) {\n return get(attributes);\n };\n } else if (typeof nameOrFunction === 'function') {\n getter.fromAttributes = function () {\n throw new Error(\n 'graphology-utils/getters/createNodeValueGetter: irrelevant usage.'\n );\n };\n getter.fromGraph = function (graph, node) {\n return coerceToDefault(\n nameOrFunction(node, graph.getNodeAttributes(node))\n );\n };\n getter.fromEntry = function (node, attributes) {\n return coerceToDefault(nameOrFunction(node, attributes));\n };\n } else {\n getter.fromAttributes = returnDefault;\n getter.fromGraph = returnDefault;\n getter.fromEntry = returnDefault;\n }\n\n return getter;\n}\n\nfunction createEdgeValueGetter(nameOrFunction, defaultValue) {\n var getter = {};\n\n var coerceToDefault = function (v) {\n if (typeof v === 'undefined') return defaultValue;\n\n return v;\n };\n\n if (typeof defaultValue === 'function') coerceToDefault = defaultValue;\n\n var get = function (attributes) {\n return coerceToDefault(attributes[nameOrFunction]);\n };\n\n var returnDefault = function () {\n return coerceToDefault(undefined);\n };\n\n if (typeof nameOrFunction === 'string') {\n getter.fromAttributes = get;\n getter.fromGraph = function (graph, edge) {\n return get(graph.getEdgeAttributes(edge));\n };\n getter.fromEntry = function (edge, attributes) {\n return get(attributes);\n };\n getter.fromPartialEntry = getter.fromEntry;\n getter.fromMinimalEntry = getter.fromEntry;\n } else if (typeof nameOrFunction === 'function') {\n getter.fromAttributes = function () {\n throw new Error(\n 'graphology-utils/getters/createEdgeValueGetter: irrelevant usage.'\n );\n };\n getter.fromGraph = function (graph, edge) {\n // TODO: we can do better, check #310\n var extremities = graph.extremities(edge);\n return coerceToDefault(\n nameOrFunction(\n edge,\n graph.getEdgeAttributes(edge),\n extremities[0],\n extremities[1],\n graph.getNodeAttributes(extremities[0]),\n graph.getNodeAttributes(extremities[1]),\n graph.isUndirected(edge)\n )\n );\n };\n getter.fromEntry = function (e, a, s, t, sa, ta, u) {\n return coerceToDefault(nameOrFunction(e, a, s, t, sa, ta, u));\n };\n getter.fromPartialEntry = function (e, a, s, t) {\n return coerceToDefault(nameOrFunction(e, a, s, t));\n };\n getter.fromMinimalEntry = function (e, a) {\n return coerceToDefault(nameOrFunction(e, a));\n };\n } else {\n getter.fromAttributes = returnDefault;\n getter.fromGraph = returnDefault;\n getter.fromEntry = returnDefault;\n getter.fromMinimalEntry = returnDefault;\n }\n\n return getter;\n}\n\nexports.createNodeValueGetter = createNodeValueGetter;\nexports.createEdgeValueGetter = createEdgeValueGetter;\nexports.createEdgeWeightGetter = function (name) {\n return createEdgeValueGetter(name, coerceWeight);\n};\n","/**\n * Graphology isGraph\n * ===================\n *\n * Very simple function aiming at ensuring the given variable is a\n * graphology instance.\n */\n\n/**\n * Checking the value is a graphology instance.\n *\n * @param {any} value - Target value.\n * @return {boolean}\n */\nmodule.exports = function isGraph(value) {\n return (\n value !== null &&\n typeof value === 'object' &&\n typeof value.addUndirectedEdgeWithKey === 'function' &&\n typeof value.dropNode === 'function' &&\n typeof value.multi === 'boolean'\n );\n};\n","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).graphology=e()}(this,(function(){\"use strict\";function t(e){return t=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},t(e)}function e(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,r(t,e)}function n(t){return n=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},n(t)}function r(t,e){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},r(t,e)}function i(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function o(t,e,n){return o=i()?Reflect.construct.bind():function(t,e,n){var i=[null];i.push.apply(i,e);var o=new(Function.bind.apply(t,i));return n&&r(o,n.prototype),o},o.apply(null,arguments)}function a(t){var e=\"function\"==typeof Map?new Map:void 0;return a=function(t){if(null===t||(i=t,-1===Function.toString.call(i).indexOf(\"[native code]\")))return t;var i;if(\"function\"!=typeof t)throw new TypeError(\"Super expression must either be null or a function\");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,a)}function a(){return o(t,arguments,n(this).constructor)}return a.prototype=Object.create(t.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),r(a,t)},a(t)}function c(t){if(void 0===t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return t}var u=function(){for(var t=arguments[0],e=1,n=arguments.length;e<n;e++)if(arguments[e])for(var r in arguments[e])t[r]=arguments[e][r];return t};function d(t,e,n,r){var i=t._nodes.get(e),o=null;return i?o=\"mixed\"===r?i.out&&i.out[n]||i.undirected&&i.undirected[n]:\"directed\"===r?i.out&&i.out[n]:i.undirected&&i.undirected[n]:o}function s(e){return\"object\"===t(e)&&null!==e}function h(t){var e;for(e in t)return!1;return!0}function p(t,e,n){Object.defineProperty(t,e,{enumerable:!1,configurable:!1,writable:!0,value:n})}function f(t,e,n){var r={enumerable:!0,configurable:!0};\"function\"==typeof n?r.get=n:(r.value=n,r.writable=!1),Object.defineProperty(t,e,r)}function l(t){return!!s(t)&&!(t.attributes&&!Array.isArray(t.attributes))}\"function\"==typeof Object.assign&&(u=Object.assign);var g,y={exports:{}},w=\"object\"==typeof Reflect?Reflect:null,v=w&&\"function\"==typeof w.apply?w.apply:function(t,e,n){return Function.prototype.apply.call(t,e,n)};g=w&&\"function\"==typeof w.ownKeys?w.ownKeys:Object.getOwnPropertySymbols?function(t){return Object.getOwnPropertyNames(t).concat(Object.getOwnPropertySymbols(t))}:function(t){return Object.getOwnPropertyNames(t)};var b=Number.isNaN||function(t){return t!=t};function m(){m.init.call(this)}y.exports=m,y.exports.once=function(t,e){return new Promise((function(n,r){function i(n){t.removeListener(e,o),r(n)}function o(){\"function\"==typeof t.removeListener&&t.removeListener(\"error\",i),n([].slice.call(arguments))}U(t,e,o,{once:!0}),\"error\"!==e&&function(t,e,n){\"function\"==typeof t.on&&U(t,\"error\",e,n)}(t,i,{once:!0})}))},m.EventEmitter=m,m.prototype._events=void 0,m.prototype._eventsCount=0,m.prototype._maxListeners=void 0;var k=10;function _(t){if(\"function\"!=typeof t)throw new TypeError('The \"listener\" argument must be of type Function. Received type '+typeof t)}function G(t){return void 0===t._maxListeners?m.defaultMaxListeners:t._maxListeners}function x(t,e,n,r){var i,o,a,c;if(_(n),void 0===(o=t._events)?(o=t._events=Object.create(null),t._eventsCount=0):(void 0!==o.newListener&&(t.emit(\"newListener\",e,n.listener?n.listener:n),o=t._events),a=o[e]),void 0===a)a=o[e]=n,++t._eventsCount;else if(\"function\"==typeof a?a=o[e]=r?[n,a]:[a,n]:r?a.unshift(n):a.push(n),(i=G(t))>0&&a.length>i&&!a.warned){a.warned=!0;var u=new Error(\"Possible EventEmitter memory leak detected. \"+a.length+\" \"+String(e)+\" listeners added. Use emitter.setMaxListeners() to increase limit\");u.name=\"MaxListenersExceededWarning\",u.emitter=t,u.type=e,u.count=a.length,c=u,console&&console.warn&&console.warn(c)}return t}function E(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function A(t,e,n){var r={fired:!1,wrapFn:void 0,target:t,type:e,listener:n},i=E.bind(r);return i.listener=n,r.wrapFn=i,i}function L(t,e,n){var r=t._events;if(void 0===r)return[];var i=r[e];return void 0===i?[]:\"function\"==typeof i?n?[i.listener||i]:[i]:n?function(t){for(var e=new Array(t.length),n=0;n<e.length;++n)e[n]=t[n].listener||t[n];return e}(i):D(i,i.length)}function S(t){var e=this._events;if(void 0!==e){var n=e[t];if(\"function\"==typeof n)return 1;if(void 0!==n)return n.length}return 0}function D(t,e){for(var n=new Array(e),r=0;r<e;++r)n[r]=t[r];return n}function U(t,e,n,r){if(\"function\"==typeof t.on)r.once?t.once(e,n):t.on(e,n);else{if(\"function\"!=typeof t.addEventListener)throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type '+typeof t);t.addEventListener(e,(function i(o){r.once&&t.removeEventListener(e,i),n(o)}))}}function N(t){if(\"function\"!=typeof t)throw new Error(\"obliterator/iterator: expecting a function!\");this.next=t}Object.defineProperty(m,\"defaultMaxListeners\",{enumerable:!0,get:function(){return k},set:function(t){if(\"number\"!=typeof t||t<0||b(t))throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received '+t+\".\");k=t}}),m.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},m.prototype.setMaxListeners=function(t){if(\"number\"!=typeof t||t<0||b(t))throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received '+t+\".\");return this._maxListeners=t,this},m.prototype.getMaxListeners=function(){return G(this)},m.prototype.emit=function(t){for(var e=[],n=1;n<arguments.length;n++)e.push(arguments[n]);var r=\"error\"===t,i=this._events;if(void 0!==i)r=r&&void 0===i.error;else if(!r)return!1;if(r){var o;if(e.length>0&&(o=e[0]),o instanceof Error)throw o;var a=new Error(\"Unhandled error.\"+(o?\" (\"+o.message+\")\":\"\"));throw a.context=o,a}var c=i[t];if(void 0===c)return!1;if(\"function\"==typeof c)v(c,this,e);else{var u=c.length,d=D(c,u);for(n=0;n<u;++n)v(d[n],this,e)}return!0},m.prototype.addListener=function(t,e){return x(this,t,e,!1)},m.prototype.on=m.prototype.addListener,m.prototype.prependListener=function(t,e){return x(this,t,e,!0)},m.prototype.once=function(t,e){return _(e),this.on(t,A(this,t,e)),this},m.prototype.prependOnceListener=function(t,e){return _(e),this.prependListener(t,A(this,t,e)),this},m.prototype.removeListener=function(t,e){var n,r,i,o,a;if(_(e),void 0===(r=this._events))return this;if(void 0===(n=r[t]))return this;if(n===e||n.listener===e)0==--this._eventsCount?this._events=Object.create(null):(delete r[t],r.removeListener&&this.emit(\"removeListener\",t,n.listener||e));else if(\"function\"!=typeof n){for(i=-1,o=n.length-1;o>=0;o--)if(n[o]===e||n[o].listener===e){a=n[o].listener,i=o;break}if(i<0)return this;0===i?n.shift():function(t,e){for(;e+1<t.length;e++)t[e]=t[e+1];t.pop()}(n,i),1===n.length&&(r[t]=n[0]),void 0!==r.removeListener&&this.emit(\"removeListener\",t,a||e)}return this},m.prototype.off=m.prototype.removeListener,m.prototype.removeAllListeners=function(t){var e,n,r;if(void 0===(n=this._events))return this;if(void 0===n.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==n[t]&&(0==--this._eventsCount?this._events=Object.create(null):delete n[t]),this;if(0===arguments.length){var i,o=Object.keys(n);for(r=0;r<o.length;++r)\"removeListener\"!==(i=o[r])&&this.removeAllListeners(i);return this.removeAllListeners(\"removeListener\"),this._events=Object.create(null),this._eventsCount=0,this}if(\"function\"==typeof(e=n[t]))this.removeListener(t,e);else if(void 0!==e)for(r=e.length-1;r>=0;r--)this.removeListener(t,e[r]);return this},m.prototype.listeners=function(t){return L(this,t,!0)},m.prototype.rawListeners=function(t){return L(this,t,!1)},m.listenerCount=function(t,e){return\"function\"==typeof t.listenerCount?t.listenerCount(e):S.call(t,e)},m.prototype.listenerCount=S,m.prototype.eventNames=function(){return this._eventsCount>0?g(this._events):[]},\"undefined\"!=typeof Symbol&&(N.prototype[Symbol.iterator]=function(){return this}),N.of=function(){var t=arguments,e=t.length,n=0;return new N((function(){return n>=e?{done:!0}:{done:!1,value:t[n++]}}))},N.empty=function(){return new N((function(){return{done:!0}}))},N.fromSequence=function(t){var e=0,n=t.length;return new N((function(){return e>=n?{done:!0}:{done:!1,value:t[e++]}}))},N.is=function(t){return t instanceof N||\"object\"==typeof t&&null!==t&&\"function\"==typeof t.next};var O=N,j={};j.ARRAY_BUFFER_SUPPORT=\"undefined\"!=typeof ArrayBuffer,j.SYMBOL_SUPPORT=\"undefined\"!=typeof Symbol;var C=O,M=j,z=M.ARRAY_BUFFER_SUPPORT,W=M.SYMBOL_SUPPORT;var P=function(t){var e=function(t){return\"string\"==typeof t||Array.isArray(t)||z&&ArrayBuffer.isView(t)?C.fromSequence(t):\"object\"!=typeof t||null===t?null:W&&\"function\"==typeof t[Symbol.iterator]?t[Symbol.iterator]():\"function\"==typeof t.next?t:null}(t);if(!e)throw new Error(\"obliterator: target is not iterable nor a valid iterator.\");return e},R=P,K=function(t,e){for(var n,r=arguments.length>1?e:1/0,i=r!==1/0?new Array(r):[],o=0,a=R(t);;){if(o===r)return i;if((n=a.next()).done)return o!==e&&(i.length=o),i;i[o++]=n.value}},T=function(t){function n(e){var n;return(n=t.call(this)||this).name=\"GraphError\",n.message=e,n}return e(n,t),n}(a(Error)),B=function(t){function n(e){var r;return(r=t.call(this,e)||this).name=\"InvalidArgumentsGraphError\",\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(c(r),n.prototype.constructor),r}return e(n,t),n}(T),F=function(t){function n(e){var r;return(r=t.call(this,e)||this).name=\"NotFoundGraphError\",\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(c(r),n.prototype.constructor),r}return e(n,t),n}(T),I=function(t){function n(e){var r;return(r=t.call(this,e)||this).name=\"UsageGraphError\",\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(c(r),n.prototype.constructor),r}return e(n,t),n}(T);function Y(t,e){this.key=t,this.attributes=e,this.clear()}function q(t,e){this.key=t,this.attributes=e,this.clear()}function J(t,e){this.key=t,this.attributes=e,this.clear()}function V(t,e,n,r,i){this.key=e,this.attributes=i,this.undirected=t,this.source=n,this.target=r}Y.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}},q.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}},J.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}},V.prototype.attach=function(){var t=\"out\",e=\"in\";this.undirected&&(t=e=\"undirected\");var n=this.source.key,r=this.target.key;this.source[t][r]=this,this.undirected&&n===r||(this.target[e][n]=this)},V.prototype.attachMulti=function(){var t=\"out\",e=\"in\",n=this.source.key,r=this.target.key;this.undirected&&(t=e=\"undirected\");var i=this.source[t],o=i[r];if(void 0===o)return i[r]=this,void(this.undirected&&n===r||(this.target[e][n]=this));o.previous=this,this.next=o,i[r]=this,this.target[e][n]=this},V.prototype.detach=function(){var t=this.source.key,e=this.target.key,n=\"out\",r=\"in\";this.undirected&&(n=r=\"undirected\"),delete this.source[n][e],delete this.target[r][t]},V.prototype.detachMulti=function(){var t=this.source.key,e=this.target.key,n=\"out\",r=\"in\";this.undirected&&(n=r=\"undirected\"),void 0===this.previous?void 0===this.next?(delete this.source[n][e],delete this.target[r][t]):(this.next.previous=void 0,this.source[n][e]=this.next,this.target[r][t]=this.next):(this.previous.next=this.next,void 0!==this.next&&(this.next.previous=this.previous))};function H(t,e,n,r,i,o,a){var c,u,d,s;if(r=\"\"+r,0===n){if(!(c=t._nodes.get(r)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(r,'\" node in the graph.'));d=i,s=o}else if(3===n){if(i=\"\"+i,!(u=t._edges.get(i)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(i,'\" edge in the graph.'));var h=u.source.key,p=u.target.key;if(r===h)c=u.target;else{if(r!==p)throw new F(\"Graph.\".concat(e,': the \"').concat(r,'\" node is not attached to the \"').concat(i,'\" edge (').concat(h,\", \").concat(p,\").\"));c=u.source}d=o,s=a}else{if(!(u=t._edges.get(r)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(r,'\" edge in the graph.'));c=1===n?u.source:u.target,d=i,s=o}return[c,d,s]}var Q=[{name:function(t){return\"get\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];return a.attributes[c]}}},{name:function(t){return\"get\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){return H(this,e,n,t,r)[0].attributes}}},{name:function(t){return\"has\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];return a.attributes.hasOwnProperty(c)}}},{name:function(t){return\"set\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i,o){var a=H(this,e,n,t,r,i,o),c=a[0],u=a[1],d=a[2];return c.attributes[u]=d,this.emit(\"nodeAttributesUpdated\",{key:c.key,type:\"set\",attributes:c.attributes,name:u}),this}}},{name:function(t){return\"update\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i,o){var a=H(this,e,n,t,r,i,o),c=a[0],u=a[1],d=a[2];if(\"function\"!=typeof d)throw new B(\"Graph.\".concat(e,\": updater should be a function.\"));var s=c.attributes,h=d(s[u]);return s[u]=h,this.emit(\"nodeAttributesUpdated\",{key:c.key,type:\"set\",attributes:c.attributes,name:u}),this}}},{name:function(t){return\"remove\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];return delete a.attributes[c],this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"remove\",attributes:a.attributes,name:c}),this}}},{name:function(t){return\"replace\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];if(!s(c))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return a.attributes=c,this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"replace\",attributes:a.attributes}),this}}},{name:function(t){return\"merge\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];if(!s(c))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return u(a.attributes,c),this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"merge\",attributes:a.attributes,data:c}),this}}},{name:function(t){return\"update\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];if(\"function\"!=typeof c)throw new B(\"Graph.\".concat(e,\": provided updater is not a function.\"));return a.attributes=c(a.attributes),this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"update\",attributes:a.attributes}),this}}}];var X=[{name:function(t){return\"get\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return i.attributes[r]}}},{name:function(t){return\"get\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t){var r;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>1){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var i=\"\"+t,o=\"\"+arguments[1];if(!(r=d(this,i,o,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(i,'\" - \"').concat(o,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(r=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return r.attributes}}},{name:function(t){return\"has\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return i.attributes.hasOwnProperty(r)}}},{name:function(t){return\"set\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>3){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var a=\"\"+t,c=\"\"+r;if(r=arguments[2],i=arguments[3],!(o=d(this,a,c,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(a,'\" - \"').concat(c,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(o=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return o.attributes[r]=i,this.emit(\"edgeAttributesUpdated\",{key:o.key,type:\"set\",attributes:o.attributes,name:r}),this}}},{name:function(t){return\"update\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>3){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var a=\"\"+t,c=\"\"+r;if(r=arguments[2],i=arguments[3],!(o=d(this,a,c,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(a,'\" - \"').concat(c,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(o=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(\"function\"!=typeof i)throw new B(\"Graph.\".concat(e,\": updater should be a function.\"));return o.attributes[r]=i(o.attributes[r]),this.emit(\"edgeAttributesUpdated\",{key:o.key,type:\"set\",attributes:o.attributes,name:r}),this}}},{name:function(t){return\"remove\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return delete i.attributes[r],this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"remove\",attributes:i.attributes,name:r}),this}}},{name:function(t){return\"replace\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(!s(r))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return i.attributes=r,this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"replace\",attributes:i.attributes}),this}}},{name:function(t){return\"merge\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(!s(r))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return u(i.attributes,r),this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"merge\",attributes:i.attributes,data:r}),this}}},{name:function(t){return\"update\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(\"function\"!=typeof r)throw new B(\"Graph.\".concat(e,\": provided updater is not a function.\"));return i.attributes=r(i.attributes),this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"update\",attributes:i.attributes}),this}}}];var Z=O,$=P,tt=function(){var t=arguments,e=null,n=-1;return new Z((function(){for(var r=null;;){if(null===e){if(++n>=t.length)return{done:!0};e=$(t[n])}if(!0!==(r=e.next()).done)break;e=null}return r}))},et=[{name:\"edges\",type:\"mixed\"},{name:\"inEdges\",type:\"directed\",direction:\"in\"},{name:\"outEdges\",type:\"directed\",direction:\"out\"},{name:\"inboundEdges\",type:\"mixed\",direction:\"in\"},{name:\"outboundEdges\",type:\"mixed\",direction:\"out\"},{name:\"directedEdges\",type:\"directed\"},{name:\"undirectedEdges\",type:\"undirected\"}];function nt(t,e,n,r){var i=!1;for(var o in e)if(o!==r){var a=e[o];if(i=n(a.key,a.attributes,a.source.key,a.target.key,a.source.attributes,a.target.attributes,a.undirected),t&&i)return a.key}}function rt(t,e,n,r){var i,o,a,c=!1;for(var u in e)if(u!==r){i=e[u];do{if(o=i.source,a=i.target,c=n(i.key,i.attributes,o.key,a.key,o.attributes,a.attributes,i.undirected),t&&c)return i.key;i=i.next}while(void 0!==i)}}function it(t,e){var n,r=Object.keys(t),i=r.length,o=0;return new O((function(){do{if(n)n=n.next;else{if(o>=i)return{done:!0};var a=r[o++];if(a===e){n=void 0;continue}n=t[a]}}while(!n);return{done:!1,value:{edge:n.key,attributes:n.attributes,source:n.source.key,target:n.target.key,sourceAttributes:n.source.attributes,targetAttributes:n.target.attributes,undirected:n.undirected}}}))}function ot(t,e,n,r){var i=e[n];if(i){var o=i.source,a=i.target;return r(i.key,i.attributes,o.key,a.key,o.attributes,a.attributes,i.undirected)&&t?i.key:void 0}}function at(t,e,n,r){var i=e[n];if(i){var o=!1;do{if(o=r(i.key,i.attributes,i.source.key,i.target.key,i.source.attributes,i.target.attributes,i.undirected),t&&o)return i.key;i=i.next}while(void 0!==i)}}function ct(t,e){var n=t[e];return void 0!==n.next?new O((function(){if(!n)return{done:!0};var t={edge:n.key,attributes:n.attributes,source:n.source.key,target:n.target.key,sourceAttributes:n.source.attributes,targetAttributes:n.target.attributes,undirected:n.undirected};return n=n.next,{done:!1,value:t}})):O.of({edge:n.key,attributes:n.attributes,source:n.source.key,target:n.target.key,sourceAttributes:n.source.attributes,targetAttributes:n.target.attributes,undirected:n.undirected})}function ut(t,e){if(0===t.size)return[];if(\"mixed\"===e||e===t.type)return\"function\"==typeof Array.from?Array.from(t._edges.keys()):K(t._edges.keys(),t._edges.size);for(var n,r,i=\"undirected\"===e?t.undirectedSize:t.directedSize,o=new Array(i),a=\"undirected\"===e,c=t._edges.values(),u=0;!0!==(n=c.next()).done;)(r=n.value).undirected===a&&(o[u++]=r.key);return o}function dt(t,e,n,r){if(0!==e.size)for(var i,o,a=\"mixed\"!==n&&n!==e.type,c=\"undirected\"===n,u=!1,d=e._edges.values();!0!==(i=d.next()).done;)if(o=i.value,!a||o.undirected===c){var s=o,h=s.key,p=s.attributes,f=s.source,l=s.target;if(u=r(h,p,f.key,l.key,f.attributes,l.attributes,o.undirected),t&&u)return h}}function st(t,e){if(0===t.size)return O.empty();var n=\"mixed\"!==e&&e!==t.type,r=\"undirected\"===e,i=t._edges.values();return new O((function(){for(var t,e;;){if((t=i.next()).done)return t;if(e=t.value,!n||e.undirected===r)break}return{value:{edge:e.key,attributes:e.attributes,source:e.source.key,target:e.target.key,sourceAttributes:e.source.attributes,targetAttributes:e.target.attributes,undirected:e.undirected},done:!1}}))}function ht(t,e,n,r,i,o){var a,c=e?rt:nt;if(\"undirected\"!==n){if(\"out\"!==r&&(a=c(t,i.in,o),t&&a))return a;if(\"in\"!==r&&(a=c(t,i.out,o,r?void 0:i.key),t&&a))return a}if(\"directed\"!==n&&(a=c(t,i.undirected,o),t&&a))return a}function pt(t,e,n,r){var i=[];return ht(!1,t,e,n,r,(function(t){i.push(t)})),i}function ft(t,e,n){var r=O.empty();return\"undirected\"!==t&&(\"out\"!==e&&void 0!==n.in&&(r=tt(r,it(n.in))),\"in\"!==e&&void 0!==n.out&&(r=tt(r,it(n.out,e?void 0:n.key)))),\"directed\"!==t&&void 0!==n.undirected&&(r=tt(r,it(n.undirected))),r}function lt(t,e,n,r,i,o,a){var c,u=n?at:ot;if(\"undirected\"!==e){if(void 0!==i.in&&\"out\"!==r&&(c=u(t,i.in,o,a),t&&c))return c;if(void 0!==i.out&&\"in\"!==r&&(r||i.key!==o)&&(c=u(t,i.out,o,a),t&&c))return c}if(\"directed\"!==e&&void 0!==i.undirected&&(c=u(t,i.undirected,o,a),t&&c))return c}function gt(t,e,n,r,i){var o=[];return lt(!1,t,e,n,r,i,(function(t){o.push(t)})),o}function yt(t,e,n,r){var i=O.empty();return\"undirected\"!==t&&(void 0!==n.in&&\"out\"!==e&&r in n.in&&(i=tt(i,ct(n.in,r))),void 0!==n.out&&\"in\"!==e&&r in n.out&&(e||n.key!==r)&&(i=tt(i,ct(n.out,r)))),\"directed\"!==t&&void 0!==n.undirected&&r in n.undirected&&(i=tt(i,ct(n.undirected,r))),i}var wt=[{name:\"neighbors\",type:\"mixed\"},{name:\"inNeighbors\",type:\"directed\",direction:\"in\"},{name:\"outNeighbors\",type:\"directed\",direction:\"out\"},{name:\"inboundNeighbors\",type:\"mixed\",direction:\"in\"},{name:\"outboundNeighbors\",type:\"mixed\",direction:\"out\"},{name:\"directedNeighbors\",type:\"directed\"},{name:\"undirectedNeighbors\",type:\"undirected\"}];function vt(){this.A=null,this.B=null}function bt(t,e,n,r,i){for(var o in r){var a=r[o],c=a.source,u=a.target,d=c===n?u:c;if(!e||!e.has(d.key)){var s=i(d.key,d.attributes);if(t&&s)return d.key}}}function mt(t,e,n,r,i){if(\"mixed\"!==e){if(\"undirected\"===e)return bt(t,null,r,r.undirected,i);if(\"string\"==typeof n)return bt(t,null,r,r[n],i)}var o,a=new vt;if(\"undirected\"!==e){if(\"out\"!==n){if(o=bt(t,null,r,r.in,i),t&&o)return o;a.wrap(r.in)}if(\"in\"!==n){if(o=bt(t,a,r,r.out,i),t&&o)return o;a.wrap(r.out)}}if(\"directed\"!==e&&(o=bt(t,a,r,r.undirected,i),t&&o))return o}function kt(t,e,n){var r=Object.keys(n),i=r.length,o=0;return new O((function(){var a=null;do{if(o>=i)return t&&t.wrap(n),{done:!0};var c=n[r[o++]],u=c.source,d=c.target;a=u===e?d:u,t&&t.has(a.key)&&(a=null)}while(null===a);return{done:!1,value:{neighbor:a.key,attributes:a.attributes}}}))}function _t(t,e){var n=e.name,r=e.type,i=e.direction;t.prototype[n]=function(t){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return[];t=\"\"+t;var e=this._nodes.get(t);if(void 0===e)throw new F(\"Graph.\".concat(n,': could not find the \"').concat(t,'\" node in the graph.'));return function(t,e,n){if(\"mixed\"!==t){if(\"undirected\"===t)return Object.keys(n.undirected);if(\"string\"==typeof e)return Object.keys(n[e])}var r=[];return mt(!1,t,e,n,(function(t){r.push(t)})),r}(\"mixed\"===r?this.type:r,i,e)}}function Gt(t,e){var n=e.name,r=e.type,i=e.direction,o=n.slice(0,-1)+\"Entries\";t.prototype[o]=function(t){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return O.empty();t=\"\"+t;var e=this._nodes.get(t);if(void 0===e)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return function(t,e,n){if(\"mixed\"!==t){if(\"undirected\"===t)return kt(null,n,n.undirected);if(\"string\"==typeof e)return kt(null,n,n[e])}var r=O.empty(),i=new vt;return\"undirected\"!==t&&(\"out\"!==e&&(r=tt(r,kt(i,n,n.in))),\"in\"!==e&&(r=tt(r,kt(i,n,n.out)))),\"directed\"!==t&&(r=tt(r,kt(i,n,n.undirected))),r}(\"mixed\"===r?this.type:r,i,e)}}function xt(t,e,n,r,i){for(var o,a,c,u,d,s,h,p=r._nodes.values(),f=r.type;!0!==(o=p.next()).done;){var l=!1;if(a=o.value,\"undirected\"!==f)for(c in u=a.out){d=u[c];do{if(s=d.target,l=!0,h=i(a.key,s.key,a.attributes,s.attributes,d.key,d.attributes,d.undirected),t&&h)return d;d=d.next}while(d)}if(\"directed\"!==f)for(c in u=a.undirected)if(!(e&&a.key>c)){d=u[c];do{if((s=d.target).key!==c&&(s=d.source),l=!0,h=i(a.key,s.key,a.attributes,s.attributes,d.key,d.attributes,d.undirected),t&&h)return d;d=d.next}while(d)}if(n&&!l&&(h=i(a.key,null,a.attributes,null,null,null,null),t&&h))return null}}function Et(t){if(!s(t))throw new B('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a \"key\" property.');if(!(\"key\"in t))throw new B(\"Graph.import: serialized node is missing its key.\");if(\"attributes\"in t&&(!s(t.attributes)||null===t.attributes))throw new B(\"Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.\")}function At(t){if(!s(t))throw new B('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a \"source\" & \"target\" property.');if(!(\"source\"in t))throw new B(\"Graph.import: serialized edge is missing its source.\");if(!(\"target\"in t))throw new B(\"Graph.import: serialized edge is missing its target.\");if(\"attributes\"in t&&(!s(t.attributes)||null===t.attributes))throw new B(\"Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.\");if(\"undirected\"in t&&\"boolean\"!=typeof t.undirected)throw new B(\"Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.\")}vt.prototype.wrap=function(t){null===this.A?this.A=t:null===this.B&&(this.B=t)},vt.prototype.has=function(t){return null!==this.A&&t in this.A||null!==this.B&&t in this.B};var Lt,St=(Lt=255&Math.floor(256*Math.random()),function(){return Lt++}),Dt=new Set([\"directed\",\"undirected\",\"mixed\"]),Ut=new Set([\"domain\",\"_events\",\"_eventsCount\",\"_maxListeners\"]),Nt={allowSelfLoops:!0,multi:!1,type:\"mixed\"};function Ot(t,e,n){var r=new t.NodeDataClass(e,n);return t._nodes.set(e,r),t.emit(\"nodeAdded\",{key:e,attributes:n}),r}function jt(t,e,n,r,i,o,a,c){if(!r&&\"undirected\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.\"));if(r&&\"directed\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.\"));if(c&&!s(c))throw new B(\"Graph.\".concat(e,': invalid attributes. Expecting an object but got \"').concat(c,'\"'));if(o=\"\"+o,a=\"\"+a,c=c||{},!t.allowSelfLoops&&o===a)throw new I(\"Graph.\".concat(e,': source & target are the same (\"').concat(o,\"\\\"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.\"));var u=t._nodes.get(o),d=t._nodes.get(a);if(!u)throw new F(\"Graph.\".concat(e,': source node \"').concat(o,'\" not found.'));if(!d)throw new F(\"Graph.\".concat(e,': target node \"').concat(a,'\" not found.'));var h={key:null,undirected:r,source:o,target:a,attributes:c};if(n)i=t._edgeKeyGenerator();else if(i=\"\"+i,t._edges.has(i))throw new I(\"Graph.\".concat(e,': the \"').concat(i,'\" edge already exists in the graph.'));if(!t.multi&&(r?void 0!==u.undirected[a]:void 0!==u.out[a]))throw new I(\"Graph.\".concat(e,': an edge linking \"').concat(o,'\" to \"').concat(a,\"\\\" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.\"));var p=new V(r,i,u,d,c);t._edges.set(i,p);var f=o===a;return r?(u.undirectedDegree++,d.undirectedDegree++,f&&(u.undirectedLoops++,t._undirectedSelfLoopCount++)):(u.outDegree++,d.inDegree++,f&&(u.directedLoops++,t._directedSelfLoopCount++)),t.multi?p.attachMulti():p.attach(),r?t._undirectedSize++:t._directedSize++,h.key=i,t.emit(\"edgeAdded\",h),i}function Ct(t,e,n,r,i,o,a,c,d){if(!r&&\"undirected\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.\"));if(r&&\"directed\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.\"));if(c)if(d){if(\"function\"!=typeof c)throw new B(\"Graph.\".concat(e,': invalid updater function. Expecting a function but got \"').concat(c,'\"'))}else if(!s(c))throw new B(\"Graph.\".concat(e,': invalid attributes. Expecting an object but got \"').concat(c,'\"'));var h;if(o=\"\"+o,a=\"\"+a,d&&(h=c,c=void 0),!t.allowSelfLoops&&o===a)throw new I(\"Graph.\".concat(e,': source & target are the same (\"').concat(o,\"\\\"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.\"));var p,f,l=t._nodes.get(o),g=t._nodes.get(a);if(!n&&(p=t._edges.get(i))){if(!(p.source.key===o&&p.target.key===a||r&&p.source.key===a&&p.target.key===o))throw new I(\"Graph.\".concat(e,': inconsistency detected when attempting to merge the \"').concat(i,'\" edge with \"').concat(o,'\" source & \"').concat(a,'\" target vs. (\"').concat(p.source.key,'\", \"').concat(p.target.key,'\").'));f=p}if(f||t.multi||!l||(f=r?l.undirected[a]:l.out[a]),f){var y=[f.key,!1,!1,!1];if(d?!h:!c)return y;if(d){var w=f.attributes;f.attributes=h(w),t.emit(\"edgeAttributesUpdated\",{type:\"replace\",key:f.key,attributes:f.attributes})}else u(f.attributes,c),t.emit(\"edgeAttributesUpdated\",{type:\"merge\",key:f.key,attributes:f.attributes,data:c});return y}c=c||{},d&&h&&(c=h(c));var v={key:null,undirected:r,source:o,target:a,attributes:c};if(n)i=t._edgeKeyGenerator();else if(i=\"\"+i,t._edges.has(i))throw new I(\"Graph.\".concat(e,': the \"').concat(i,'\" edge already exists in the graph.'));var b=!1,m=!1;l||(l=Ot(t,o,{}),b=!0,o===a&&(g=l,m=!0)),g||(g=Ot(t,a,{}),m=!0),p=new V(r,i,l,g,c),t._edges.set(i,p);var k=o===a;return r?(l.undirectedDegree++,g.undirectedDegree++,k&&(l.undirectedLoops++,t._undirectedSelfLoopCount++)):(l.outDegree++,g.inDegree++,k&&(l.directedLoops++,t._directedSelfLoopCount++)),t.multi?p.attachMulti():p.attach(),r?t._undirectedSize++:t._directedSize++,v.key=i,t.emit(\"edgeAdded\",v),[i,!0,b,m]}function Mt(t,e){t._edges.delete(e.key);var n=e.source,r=e.target,i=e.attributes,o=e.undirected,a=n===r;o?(n.undirectedDegree--,r.undirectedDegree--,a&&(n.undirectedLoops--,t._undirectedSelfLoopCount--)):(n.outDegree--,r.inDegree--,a&&(n.directedLoops--,t._directedSelfLoopCount--)),t.multi?e.detachMulti():e.detach(),o?t._undirectedSize--:t._directedSize--,t.emit(\"edgeDropped\",{key:e.key,attributes:i,source:n.key,target:r.key,undirected:o})}var zt=function(n){function r(t){var e;if(e=n.call(this)||this,\"boolean\"!=typeof(t=u({},Nt,t)).multi)throw new B(\"Graph.constructor: invalid 'multi' option. Expecting a boolean but got \\\"\".concat(t.multi,'\".'));if(!Dt.has(t.type))throw new B('Graph.constructor: invalid \\'type\\' option. Should be one of \"mixed\", \"directed\" or \"undirected\" but got \"'.concat(t.type,'\".'));if(\"boolean\"!=typeof t.allowSelfLoops)throw new B(\"Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got \\\"\".concat(t.allowSelfLoops,'\".'));var r=\"mixed\"===t.type?Y:\"directed\"===t.type?q:J;p(c(e),\"NodeDataClass\",r);var i=\"geid_\"+St()+\"_\",o=0;return p(c(e),\"_attributes\",{}),p(c(e),\"_nodes\",new Map),p(c(e),\"_edges\",new Map),p(c(e),\"_directedSize\",0),p(c(e),\"_undirectedSize\",0),p(c(e),\"_directedSelfLoopCount\",0),p(c(e),\"_undirectedSelfLoopCount\",0),p(c(e),\"_edgeKeyGenerator\",(function(){var t;do{t=i+o++}while(e._edges.has(t));return t})),p(c(e),\"_options\",t),Ut.forEach((function(t){return p(c(e),t,e[t])})),f(c(e),\"order\",(function(){return e._nodes.size})),f(c(e),\"size\",(function(){return e._edges.size})),f(c(e),\"directedSize\",(function(){return e._directedSize})),f(c(e),\"undirectedSize\",(function(){return e._undirectedSize})),f(c(e),\"selfLoopCount\",(function(){return e._directedSelfLoopCount+e._undirectedSelfLoopCount})),f(c(e),\"directedSelfLoopCount\",(function(){return e._directedSelfLoopCount})),f(c(e),\"undirectedSelfLoopCount\",(function(){return e._undirectedSelfLoopCount})),f(c(e),\"multi\",e._options.multi),f(c(e),\"type\",e._options.type),f(c(e),\"allowSelfLoops\",e._options.allowSelfLoops),f(c(e),\"implementation\",(function(){return\"graphology\"})),e}e(r,n);var i=r.prototype;return i._resetInstanceCounters=function(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0},i.hasNode=function(t){return this._nodes.has(\"\"+t)},i.hasDirectedEdge=function(t,e){if(\"undirected\"===this.type)return!1;if(1===arguments.length){var n=\"\"+t,r=this._edges.get(n);return!!r&&!r.undirected}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var i=this._nodes.get(t);return!!i&&i.out.hasOwnProperty(e)}throw new B(\"Graph.hasDirectedEdge: invalid arity (\".concat(arguments.length,\", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.\"))},i.hasUndirectedEdge=function(t,e){if(\"directed\"===this.type)return!1;if(1===arguments.length){var n=\"\"+t,r=this._edges.get(n);return!!r&&r.undirected}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var i=this._nodes.get(t);return!!i&&i.undirected.hasOwnProperty(e)}throw new B(\"Graph.hasDirectedEdge: invalid arity (\".concat(arguments.length,\", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.\"))},i.hasEdge=function(t,e){if(1===arguments.length){var n=\"\"+t;return this._edges.has(n)}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var r=this._nodes.get(t);return!!r&&(void 0!==r.out&&r.out.hasOwnProperty(e)||void 0!==r.undirected&&r.undirected.hasOwnProperty(e))}throw new B(\"Graph.hasEdge: invalid arity (\".concat(arguments.length,\", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.\"))},i.directedEdge=function(t,e){if(\"undirected\"!==this.type){if(t=\"\"+t,e=\"\"+e,this.multi)throw new I(\"Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.\");var n=this._nodes.get(t);if(!n)throw new F('Graph.directedEdge: could not find the \"'.concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F('Graph.directedEdge: could not find the \"'.concat(e,'\" target node in the graph.'));var r=n.out&&n.out[e]||void 0;return r?r.key:void 0}},i.undirectedEdge=function(t,e){if(\"directed\"!==this.type){if(t=\"\"+t,e=\"\"+e,this.multi)throw new I(\"Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.\");var n=this._nodes.get(t);if(!n)throw new F('Graph.undirectedEdge: could not find the \"'.concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F('Graph.undirectedEdge: could not find the \"'.concat(e,'\" target node in the graph.'));var r=n.undirected&&n.undirected[e]||void 0;return r?r.key:void 0}},i.edge=function(t,e){if(this.multi)throw new I(\"Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.\");t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.edge: could not find the \"'.concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F('Graph.edge: could not find the \"'.concat(e,'\" target node in the graph.'));var r=n.out&&n.out[e]||n.undirected&&n.undirected[e]||void 0;if(r)return r.key},i.areDirectedNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areDirectedNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&(e in n.in||e in n.out)},i.areOutNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areOutNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.out},i.areInNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areInNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.in},i.areUndirectedNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areUndirectedNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"directed\"!==this.type&&e in n.undirected},i.areNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&(e in n.in||e in n.out)||\"directed\"!==this.type&&e in n.undirected},i.areInboundNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areInboundNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.in||\"directed\"!==this.type&&e in n.undirected},i.areOutboundNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areOutboundNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.out||\"directed\"!==this.type&&e in n.undirected},i.inDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree},i.outDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.outDegree},i.directedDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.directedDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree+e.outDegree},i.undirectedDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.undirectedDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"directed\"===this.type?0:e.undirectedDegree},i.inboundDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inboundDegree: could not find the \"'.concat(t,'\" node in the graph.'));var n=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree),\"undirected\"!==this.type&&(n+=e.inDegree),n},i.outboundDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outboundDegree: could not find the \"'.concat(t,'\" node in the graph.'));var n=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree),\"undirected\"!==this.type&&(n+=e.outDegree),n},i.degree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.degree: could not find the \"'.concat(t,'\" node in the graph.'));var n=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree),\"undirected\"!==this.type&&(n+=e.inDegree+e.outDegree),n},i.inDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree-e.directedLoops},i.outDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.outDegree-e.directedLoops},i.directedDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.directedDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree+e.outDegree-2*e.directedLoops},i.undirectedDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.undirectedDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"directed\"===this.type?0:e.undirectedDegree-2*e.undirectedLoops},i.inboundDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inboundDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));var n=0,r=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree,r+=2*e.undirectedLoops),\"undirected\"!==this.type&&(n+=e.inDegree,r+=e.directedLoops),n-r},i.outboundDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outboundDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));var n=0,r=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree,r+=2*e.undirectedLoops),\"undirected\"!==this.type&&(n+=e.outDegree,r+=e.directedLoops),n-r},i.degreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.degreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));var n=0,r=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree,r+=2*e.undirectedLoops),\"undirected\"!==this.type&&(n+=e.inDegree+e.outDegree,r+=2*e.directedLoops),n-r},i.source=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.source: could not find the \"'.concat(t,'\" edge in the graph.'));return e.source.key},i.target=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.target: could not find the \"'.concat(t,'\" edge in the graph.'));return e.target.key},i.extremities=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.extremities: could not find the \"'.concat(t,'\" edge in the graph.'));return[e.source.key,e.target.key]},i.opposite=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._edges.get(e);if(!n)throw new F('Graph.opposite: could not find the \"'.concat(e,'\" edge in the graph.'));var r=n.source.key,i=n.target.key;if(t===r)return i;if(t===i)return r;throw new F('Graph.opposite: the \"'.concat(t,'\" node is not attached to the \"').concat(e,'\" edge (').concat(r,\", \").concat(i,\").\"))},i.hasExtremity=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._edges.get(t);if(!n)throw new F('Graph.hasExtremity: could not find the \"'.concat(t,'\" edge in the graph.'));return n.source.key===e||n.target.key===e},i.isUndirected=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.isUndirected: could not find the \"'.concat(t,'\" edge in the graph.'));return e.undirected},i.isDirected=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.isDirected: could not find the \"'.concat(t,'\" edge in the graph.'));return!e.undirected},i.isSelfLoop=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.isSelfLoop: could not find the \"'.concat(t,'\" edge in the graph.'));return e.source===e.target},i.addNode=function(t,e){var n=function(t,e,n){if(n&&!s(n))throw new B('Graph.addNode: invalid attributes. Expecting an object but got \"'.concat(n,'\"'));if(e=\"\"+e,n=n||{},t._nodes.has(e))throw new I('Graph.addNode: the \"'.concat(e,'\" node already exist in the graph.'));var r=new t.NodeDataClass(e,n);return t._nodes.set(e,r),t.emit(\"nodeAdded\",{key:e,attributes:n}),r}(this,t,e);return n.key},i.mergeNode=function(t,e){if(e&&!s(e))throw new B('Graph.mergeNode: invalid attributes. Expecting an object but got \"'.concat(e,'\"'));t=\"\"+t,e=e||{};var n=this._nodes.get(t);return n?(e&&(u(n.attributes,e),this.emit(\"nodeAttributesUpdated\",{type:\"merge\",key:t,attributes:n.attributes,data:e})),[t,!1]):(n=new this.NodeDataClass(t,e),this._nodes.set(t,n),this.emit(\"nodeAdded\",{key:t,attributes:e}),[t,!0])},i.updateNode=function(t,e){if(e&&\"function\"!=typeof e)throw new B('Graph.updateNode: invalid updater function. Expecting a function but got \"'.concat(e,'\"'));t=\"\"+t;var n=this._nodes.get(t);if(n){if(e){var r=n.attributes;n.attributes=e(r),this.emit(\"nodeAttributesUpdated\",{type:\"replace\",key:t,attributes:n.attributes})}return[t,!1]}var i=e?e({}):{};return n=new this.NodeDataClass(t,i),this._nodes.set(t,n),this.emit(\"nodeAdded\",{key:t,attributes:i}),[t,!0]},i.dropNode=function(t){t=\"\"+t;var e,n=this._nodes.get(t);if(!n)throw new F('Graph.dropNode: could not find the \"'.concat(t,'\" node in the graph.'));if(\"undirected\"!==this.type){for(var r in n.out){e=n.out[r];do{Mt(this,e),e=e.next}while(e)}for(var i in n.in){e=n.in[i];do{Mt(this,e),e=e.next}while(e)}}if(\"directed\"!==this.type)for(var o in n.undirected){e=n.undirected[o];do{Mt(this,e),e=e.next}while(e)}this._nodes.delete(t),this.emit(\"nodeDropped\",{key:t,attributes:n.attributes})},i.dropEdge=function(t){var e;if(arguments.length>1){var n=\"\"+arguments[0],r=\"\"+arguments[1];if(!(e=d(this,n,r,this.type)))throw new F('Graph.dropEdge: could not find the \"'.concat(n,'\" -> \"').concat(r,'\" edge in the graph.'))}else if(t=\"\"+t,!(e=this._edges.get(t)))throw new F('Graph.dropEdge: could not find the \"'.concat(t,'\" edge in the graph.'));return Mt(this,e),this},i.dropDirectedEdge=function(t,e){if(arguments.length<2)throw new I(\"Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.\");if(this.multi)throw new I(\"Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.\");var n=d(this,t=\"\"+t,e=\"\"+e,\"directed\");if(!n)throw new F('Graph.dropDirectedEdge: could not find a \"'.concat(t,'\" -> \"').concat(e,'\" edge in the graph.'));return Mt(this,n),this},i.dropUndirectedEdge=function(t,e){if(arguments.length<2)throw new I(\"Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.\");if(this.multi)throw new I(\"Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.\");var n=d(this,t,e,\"undirected\");if(!n)throw new F('Graph.dropUndirectedEdge: could not find a \"'.concat(t,'\" -> \"').concat(e,'\" edge in the graph.'));return Mt(this,n),this},i.clear=function(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit(\"cleared\")},i.clearEdges=function(){for(var t,e=this._nodes.values();!0!==(t=e.next()).done;)t.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit(\"edgesCleared\")},i.getAttribute=function(t){return this._attributes[t]},i.getAttributes=function(){return this._attributes},i.hasAttribute=function(t){return this._attributes.hasOwnProperty(t)},i.setAttribute=function(t,e){return this._attributes[t]=e,this.emit(\"attributesUpdated\",{type:\"set\",attributes:this._attributes,name:t}),this},i.updateAttribute=function(t,e){if(\"function\"!=typeof e)throw new B(\"Graph.updateAttribute: updater should be a function.\");var n=this._attributes[t];return this._attributes[t]=e(n),this.emit(\"attributesUpdated\",{type:\"set\",attributes:this._attributes,name:t}),this},i.removeAttribute=function(t){return delete this._attributes[t],this.emit(\"attributesUpdated\",{type:\"remove\",attributes:this._attributes,name:t}),this},i.replaceAttributes=function(t){if(!s(t))throw new B(\"Graph.replaceAttributes: provided attributes are not a plain object.\");return this._attributes=t,this.emit(\"attributesUpdated\",{type:\"replace\",attributes:this._attributes}),this},i.mergeAttributes=function(t){if(!s(t))throw new B(\"Graph.mergeAttributes: provided attributes are not a plain object.\");return u(this._attributes,t),this.emit(\"attributesUpdated\",{type:\"merge\",attributes:this._attributes,data:t}),this},i.updateAttributes=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.updateAttributes: provided updater is not a function.\");return this._attributes=t(this._attributes),this.emit(\"attributesUpdated\",{type:\"update\",attributes:this._attributes}),this},i.updateEachNodeAttributes=function(t,e){if(\"function\"!=typeof t)throw new B(\"Graph.updateEachNodeAttributes: expecting an updater function.\");if(e&&!l(e))throw new B(\"Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}\");for(var n,r,i=this._nodes.values();!0!==(n=i.next()).done;)(r=n.value).attributes=t(r.key,r.attributes);this.emit(\"eachNodeAttributesUpdated\",{hints:e||null})},i.updateEachEdgeAttributes=function(t,e){if(\"function\"!=typeof t)throw new B(\"Graph.updateEachEdgeAttributes: expecting an updater function.\");if(e&&!l(e))throw new B(\"Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}\");for(var n,r,i,o,a=this._edges.values();!0!==(n=a.next()).done;)i=(r=n.value).source,o=r.target,r.attributes=t(r.key,r.attributes,i.key,o.key,i.attributes,o.attributes,r.undirected);this.emit(\"eachEdgeAttributesUpdated\",{hints:e||null})},i.forEachAdjacencyEntry=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAdjacencyEntry: expecting a callback.\");xt(!1,!1,!1,this,t)},i.forEachAdjacencyEntryWithOrphans=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.\");xt(!1,!1,!0,this,t)},i.forEachAssymetricAdjacencyEntry=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAssymetricAdjacencyEntry: expecting a callback.\");xt(!1,!0,!1,this,t)},i.forEachAssymetricAdjacencyEntryWithOrphans=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.\");xt(!1,!0,!0,this,t)},i.nodes=function(){return\"function\"==typeof Array.from?Array.from(this._nodes.keys()):K(this._nodes.keys(),this._nodes.size)},i.forEachNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)t((n=e.value).key,n.attributes)},i.findNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.findNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)if(t((n=e.value).key,n.attributes))return n.key},i.mapNodes=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.mapNode: expecting a callback.\");for(var e,n,r=this._nodes.values(),i=new Array(this.order),o=0;!0!==(e=r.next()).done;)n=e.value,i[o++]=t(n.key,n.attributes);return i},i.someNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.someNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)if(t((n=e.value).key,n.attributes))return!0;return!1},i.everyNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.everyNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)if(!t((n=e.value).key,n.attributes))return!1;return!0},i.filterNodes=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.filterNodes: expecting a callback.\");for(var e,n,r=this._nodes.values(),i=[];!0!==(e=r.next()).done;)t((n=e.value).key,n.attributes)&&i.push(n.key);return i},i.reduceNodes=function(t,e){if(\"function\"!=typeof t)throw new B(\"Graph.reduceNodes: expecting a callback.\");if(arguments.length<2)throw new B(\"Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.\");for(var n,r,i=e,o=this._nodes.values();!0!==(n=o.next()).done;)i=t(i,(r=n.value).key,r.attributes);return i},i.nodeEntries=function(){var t=this._nodes.values();return new O((function(){var e=t.next();if(e.done)return e;var n=e.value;return{value:{node:n.key,attributes:n.attributes},done:!1}}))},i.export=function(){var t=this,e=new Array(this._nodes.size),n=0;this._nodes.forEach((function(t,r){e[n++]=function(t,e){var n={key:t};return h(e.attributes)||(n.attributes=u({},e.attributes)),n}(r,t)}));var r=new Array(this._edges.size);return n=0,this._edges.forEach((function(e,i){r[n++]=function(t,e,n){var r={key:e,source:n.source.key,target:n.target.key};return h(n.attributes)||(r.attributes=u({},n.attributes)),\"mixed\"===t&&n.undirected&&(r.undirected=!0),r}(t.type,i,e)})),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:e,edges:r}},i.import=function(t){var e,n,i,o,a,c=this,u=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(t instanceof r)return t.forEachNode((function(t,e){u?c.mergeNode(t,e):c.addNode(t,e)})),t.forEachEdge((function(t,e,n,r,i,o,a){u?a?c.mergeUndirectedEdgeWithKey(t,n,r,e):c.mergeDirectedEdgeWithKey(t,n,r,e):a?c.addUndirectedEdgeWithKey(t,n,r,e):c.addDirectedEdgeWithKey(t,n,r,e)})),this;if(!s(t))throw new B(\"Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.\");if(t.attributes){if(!s(t.attributes))throw new B(\"Graph.import: invalid attributes. Expecting a plain object.\");u?this.mergeAttributes(t.attributes):this.replaceAttributes(t.attributes)}if(t.nodes){if(i=t.nodes,!Array.isArray(i))throw new B(\"Graph.import: invalid nodes. Expecting an array.\");for(e=0,n=i.length;e<n;e++){Et(o=i[e]);var d=o,h=d.key,p=d.attributes;u?this.mergeNode(h,p):this.addNode(h,p)}}if(t.edges){var f=!1;if(\"undirected\"===this.type&&(f=!0),i=t.edges,!Array.isArray(i))throw new B(\"Graph.import: invalid edges. Expecting an array.\");for(e=0,n=i.length;e<n;e++){At(a=i[e]);var l=a,g=l.source,y=l.target,w=l.attributes,v=l.undirected,b=void 0===v?f:v;\"key\"in a?(u?b?this.mergeUndirectedEdgeWithKey:this.mergeDirectedEdgeWithKey:b?this.addUndirectedEdgeWithKey:this.addDirectedEdgeWithKey).call(this,a.key,g,y,w):(u?b?this.mergeUndirectedEdge:this.mergeDirectedEdge:b?this.addUndirectedEdge:this.addDirectedEdge).call(this,g,y,w)}}return this},i.nullCopy=function(t){var e=new r(u({},this._options,t));return e.replaceAttributes(u({},this.getAttributes())),e},i.emptyCopy=function(t){var e=this.nullCopy(t);return this._nodes.forEach((function(t,n){var r=u({},t.attributes);t=new e.NodeDataClass(n,r),e._nodes.set(n,t)})),e},i.copy=function(t){if(\"string\"==typeof(t=t||{}).type&&t.type!==this.type&&\"mixed\"!==t.type)throw new I('Graph.copy: cannot create an incompatible copy from \"'.concat(this.type,'\" type to \"').concat(t.type,'\" because this would mean losing information about the current graph.'));if(\"boolean\"==typeof t.multi&&t.multi!==this.multi&&!0!==t.multi)throw new I(\"Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.\");if(\"boolean\"==typeof t.allowSelfLoops&&t.allowSelfLoops!==this.allowSelfLoops&&!0!==t.allowSelfLoops)throw new I(\"Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.\");for(var e,n,r=this.emptyCopy(t),i=this._edges.values();!0!==(e=i.next()).done;)jt(r,\"copy\",!1,(n=e.value).undirected,n.key,n.source.key,n.target.key,u({},n.attributes));return r},i.toJSON=function(){return this.export()},i.toString=function(){return\"[object Graph]\"},i.inspect=function(){var e=this,n={};this._nodes.forEach((function(t,e){n[e]=t.attributes}));var r={},i={};this._edges.forEach((function(t,n){var o,a=t.undirected?\"--\":\"->\",c=\"\",u=t.source.key,d=t.target.key;t.undirected&&u>d&&(o=u,u=d,d=o);var s=\"(\".concat(u,\")\").concat(a,\"(\").concat(d,\")\");n.startsWith(\"geid_\")?e.multi&&(void 0===i[s]?i[s]=0:i[s]++,c+=\"\".concat(i[s],\". \")):c+=\"[\".concat(n,\"]: \"),r[c+=s]=t.attributes}));var o={};for(var a in this)this.hasOwnProperty(a)&&!Ut.has(a)&&\"function\"!=typeof this[a]&&\"symbol\"!==t(a)&&(o[a]=this[a]);return o.attributes=this._attributes,o.nodes=n,o.edges=r,p(o,\"constructor\",this.constructor),o},r}(y.exports.EventEmitter);\"undefined\"!=typeof Symbol&&(zt.prototype[Symbol.for(\"nodejs.util.inspect.custom\")]=zt.prototype.inspect),[{name:function(t){return\"\".concat(t,\"Edge\")},generateKey:!0},{name:function(t){return\"\".concat(t,\"DirectedEdge\")},generateKey:!0,type:\"directed\"},{name:function(t){return\"\".concat(t,\"UndirectedEdge\")},generateKey:!0,type:\"undirected\"},{name:function(t){return\"\".concat(t,\"EdgeWithKey\")}},{name:function(t){return\"\".concat(t,\"DirectedEdgeWithKey\")},type:\"directed\"},{name:function(t){return\"\".concat(t,\"UndirectedEdgeWithKey\")},type:\"undirected\"}].forEach((function(t){[\"add\",\"merge\",\"update\"].forEach((function(e){var n=t.name(e),r=\"add\"===e?jt:Ct;t.generateKey?zt.prototype[n]=function(i,o,a){return r(this,n,!0,\"undirected\"===(t.type||this.type),null,i,o,a,\"update\"===e)}:zt.prototype[n]=function(i,o,a,c){return r(this,n,!1,\"undirected\"===(t.type||this.type),i,o,a,c,\"update\"===e)}}))})),function(t){Q.forEach((function(e){var n=e.name,r=e.attacher;r(t,n(\"Node\"),0),r(t,n(\"Source\"),1),r(t,n(\"Target\"),2),r(t,n(\"Opposite\"),3)}))}(zt),function(t){X.forEach((function(e){var n=e.name,r=e.attacher;r(t,n(\"Edge\"),\"mixed\"),r(t,n(\"DirectedEdge\"),\"directed\"),r(t,n(\"UndirectedEdge\"),\"undirected\")}))}(zt),function(t){et.forEach((function(e){!function(t,e){var n=e.name,r=e.type,i=e.direction;t.prototype[n]=function(t,e){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return[];if(!arguments.length)return ut(this,r);if(1===arguments.length){t=\"\"+t;var o=this._nodes.get(t);if(void 0===o)throw new F(\"Graph.\".concat(n,': could not find the \"').concat(t,'\" node in the graph.'));return pt(this.multi,\"mixed\"===r?this.type:r,i,o)}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var a=this._nodes.get(t);if(!a)throw new F(\"Graph.\".concat(n,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(n,': could not find the \"').concat(e,'\" target node in the graph.'));return gt(r,this.multi,i,a,e)}throw new B(\"Graph.\".concat(n,\": too many arguments (expecting 0, 1 or 2 and got \").concat(arguments.length,\").\"))}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=\"forEach\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[o]=function(t,e,n){if(\"mixed\"===r||\"mixed\"===this.type||r===this.type){if(1===arguments.length)return dt(!1,this,r,n=t);if(2===arguments.length){t=\"\"+t,n=e;var a=this._nodes.get(t);if(void 0===a)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return ht(!1,this.multi,\"mixed\"===r?this.type:r,i,a,n)}if(3===arguments.length){t=\"\"+t,e=\"\"+e;var c=this._nodes.get(t);if(!c)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(o,': could not find the \"').concat(e,'\" target node in the graph.'));return lt(!1,r,this.multi,i,c,e,n)}throw new B(\"Graph.\".concat(o,\": too many arguments (expecting 1, 2 or 3 and got \").concat(arguments.length,\").\"))}};var a=\"map\"+n[0].toUpperCase()+n.slice(1);t.prototype[a]=function(){var t,e=Array.prototype.slice.call(arguments),n=e.pop();if(0===e.length){var i=0;\"directed\"!==r&&(i+=this.undirectedSize),\"undirected\"!==r&&(i+=this.directedSize),t=new Array(i);var a=0;e.push((function(e,r,i,o,c,u,d){t[a++]=n(e,r,i,o,c,u,d)}))}else t=[],e.push((function(e,r,i,o,a,c,u){t.push(n(e,r,i,o,a,c,u))}));return this[o].apply(this,e),t};var c=\"filter\"+n[0].toUpperCase()+n.slice(1);t.prototype[c]=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=[];return t.push((function(t,r,i,o,a,c,u){e(t,r,i,o,a,c,u)&&n.push(t)})),this[o].apply(this,t),n};var u=\"reduce\"+n[0].toUpperCase()+n.slice(1);t.prototype[u]=function(){var t,e,n=Array.prototype.slice.call(arguments);if(n.length<2||n.length>4)throw new B(\"Graph.\".concat(u,\": invalid number of arguments (expecting 2, 3 or 4 and got \").concat(n.length,\").\"));if(\"function\"==typeof n[n.length-1]&&\"function\"!=typeof n[n.length-2])throw new B(\"Graph.\".concat(u,\": missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.\"));2===n.length?(t=n[0],e=n[1],n=[]):3===n.length?(t=n[1],e=n[2],n=[n[0]]):4===n.length&&(t=n[2],e=n[3],n=[n[0],n[1]]);var r=e;return n.push((function(e,n,i,o,a,c,u){r=t(r,e,n,i,o,a,c,u)})),this[o].apply(this,n),r}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=\"find\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[o]=function(t,e,n){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return!1;if(1===arguments.length)return dt(!0,this,r,n=t);if(2===arguments.length){t=\"\"+t,n=e;var a=this._nodes.get(t);if(void 0===a)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return ht(!0,this.multi,\"mixed\"===r?this.type:r,i,a,n)}if(3===arguments.length){t=\"\"+t,e=\"\"+e;var c=this._nodes.get(t);if(!c)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(o,': could not find the \"').concat(e,'\" target node in the graph.'));return lt(!0,r,this.multi,i,c,e,n)}throw new B(\"Graph.\".concat(o,\": too many arguments (expecting 1, 2 or 3 and got \").concat(arguments.length,\").\"))};var a=\"some\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[a]=function(){var t=Array.prototype.slice.call(arguments),e=t.pop();return t.push((function(t,n,r,i,o,a,c){return e(t,n,r,i,o,a,c)})),!!this[o].apply(this,t)};var c=\"every\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[c]=function(){var t=Array.prototype.slice.call(arguments),e=t.pop();return t.push((function(t,n,r,i,o,a,c){return!e(t,n,r,i,o,a,c)})),!this[o].apply(this,t)}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=n.slice(0,-1)+\"Entries\";t.prototype[o]=function(t,e){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return O.empty();if(!arguments.length)return st(this,r);if(1===arguments.length){t=\"\"+t;var n=this._nodes.get(t);if(!n)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return ft(r,i,n)}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var a=this._nodes.get(t);if(!a)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(o,': could not find the \"').concat(e,'\" target node in the graph.'));return yt(r,i,a,e)}throw new B(\"Graph.\".concat(o,\": too many arguments (expecting 0, 1 or 2 and got \").concat(arguments.length,\").\"))}}(t,e)}))}(zt),function(t){wt.forEach((function(e){_t(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=\"forEach\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[o]=function(t,e){if(\"mixed\"===r||\"mixed\"===this.type||r===this.type){t=\"\"+t;var n=this._nodes.get(t);if(void 0===n)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));mt(!1,\"mixed\"===r?this.type:r,i,n,e)}};var a=\"map\"+n[0].toUpperCase()+n.slice(1);t.prototype[a]=function(t,e){var n=[];return this[o](t,(function(t,r){n.push(e(t,r))})),n};var c=\"filter\"+n[0].toUpperCase()+n.slice(1);t.prototype[c]=function(t,e){var n=[];return this[o](t,(function(t,r){e(t,r)&&n.push(t)})),n};var u=\"reduce\"+n[0].toUpperCase()+n.slice(1);t.prototype[u]=function(t,e,n){if(arguments.length<3)throw new B(\"Graph.\".concat(u,\": missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.\"));var r=n;return this[o](t,(function(t,n){r=e(r,t,n)})),r}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=n[0].toUpperCase()+n.slice(1,-1),a=\"find\"+o;t.prototype[a]=function(t,e){if(\"mixed\"===r||\"mixed\"===this.type||r===this.type){t=\"\"+t;var n=this._nodes.get(t);if(void 0===n)throw new F(\"Graph.\".concat(a,': could not find the \"').concat(t,'\" node in the graph.'));return mt(!0,\"mixed\"===r?this.type:r,i,n,e)}};var c=\"some\"+o;t.prototype[c]=function(t,e){return!!this[a](t,e)};var u=\"every\"+o;t.prototype[u]=function(t,e){return!this[a](t,(function(t,n){return!e(t,n)}))}}(t,e),Gt(t,e)}))}(zt);var Wt=function(t){function n(e){var n=u({type:\"directed\"},e);if(\"multi\"in n&&!1!==n.multi)throw new B(\"DirectedGraph.from: inconsistent indication that the graph should be multi in given options!\");if(\"directed\"!==n.type)throw new B('DirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt),Pt=function(t){function n(e){var n=u({type:\"undirected\"},e);if(\"multi\"in n&&!1!==n.multi)throw new B(\"UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!\");if(\"undirected\"!==n.type)throw new B('UndirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt),Rt=function(t){function n(e){var n=u({multi:!0},e);if(\"multi\"in n&&!0!==n.multi)throw new B(\"MultiGraph.from: inconsistent indication that the graph should be simple in given options!\");return t.call(this,n)||this}return e(n,t),n}(zt),Kt=function(t){function n(e){var n=u({type:\"directed\",multi:!0},e);if(\"multi\"in n&&!0!==n.multi)throw new B(\"MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!\");if(\"directed\"!==n.type)throw new B('MultiDirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt),Tt=function(t){function n(e){var n=u({type:\"undirected\",multi:!0},e);if(\"multi\"in n&&!0!==n.multi)throw new B(\"MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!\");if(\"undirected\"!==n.type)throw new B('MultiUndirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt);function Bt(t){t.from=function(e,n){var r=u({},e.options,n),i=new t(r);return i.import(e),i}}return Bt(zt),Bt(Wt),Bt(Pt),Bt(Rt),Bt(Kt),Bt(Tt),zt.Graph=zt,zt.DirectedGraph=Wt,zt.UndirectedGraph=Pt,zt.MultiGraph=Rt,zt.MultiDirectedGraph=Kt,zt.MultiUndirectedGraph=Tt,zt.InvalidArgumentsGraphError=B,zt.NotFoundGraphError=F,zt.UsageGraphError=I,zt}));\n//# sourceMappingURL=graphology.umd.min.js.map\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [\"vendors-node_modules_datagrok-libraries_math_src_webGPU_sparse-matrix_webGPU-sparse-matrix_js-07693f\"], () => (__webpack_require__(\"./node_modules/@datagrok-libraries/ml/src/MCL/mcl-worker.js\")))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = self.location + \"\";\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t\"vendors-node_modules_datagrok-libraries_ml_src_MCL_mcl-worker_js-node_modules_datagrok-librar-e4203d\": 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = self[\"webpackChunkeda\"] = self[\"webpackChunkeda\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(\"vendors-node_modules_datagrok-libraries_math_src_webGPU_sparse-matrix_webGPU-sparse-matrix_js-07693f\").then(next);\n};","","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n",""],"names":[],"sourceRoot":""}