@datagrok/bio 2.11.41 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +1 -1
  3. package/detectors.js +11 -11
  4. package/dist/36.js +1 -1
  5. package/dist/36.js.map +1 -1
  6. package/dist/413.js +1 -1
  7. package/dist/413.js.map +1 -1
  8. package/dist/590.js +1 -1
  9. package/dist/590.js.map +1 -1
  10. package/dist/709.js +1 -1
  11. package/dist/709.js.map +1 -1
  12. package/dist/895.js +1 -1
  13. package/dist/895.js.map +1 -1
  14. package/dist/package-test.js +2 -2
  15. package/dist/package-test.js.map +1 -1
  16. package/dist/package.js +2 -2
  17. package/dist/package.js.map +1 -1
  18. package/package.json +10 -10
  19. package/src/analysis/sequence-activity-cliffs.ts +9 -9
  20. package/src/analysis/sequence-diversity-viewer.ts +3 -3
  21. package/src/analysis/sequence-search-base-viewer.ts +2 -2
  22. package/src/analysis/sequence-similarity-viewer.ts +10 -10
  23. package/src/analysis/sequence-space.ts +26 -23
  24. package/src/calculations/monomerLevelMols.ts +13 -11
  25. package/src/const.ts +5 -0
  26. package/src/package.ts +8 -8
  27. package/src/tests/WebLogo-layout-tests.ts +5 -2
  28. package/src/tests/WebLogo-positions-test.ts +20 -16
  29. package/src/tests/bio-tests.ts +19 -7
  30. package/src/tests/converters-test.ts +4 -4
  31. package/src/tests/detectors-benchmark-tests.ts +5 -5
  32. package/src/tests/detectors-tests.ts +13 -13
  33. package/src/tests/fasta-export-tests.ts +10 -4
  34. package/src/tests/mm-distance-tests.ts +10 -10
  35. package/src/tests/msa-tests.ts +8 -15
  36. package/src/tests/renderers-monomer-placer.ts +3 -3
  37. package/src/tests/renderers-test.ts +6 -8
  38. package/src/tests/splitters-test.ts +14 -13
  39. package/src/tests/to-atomic-level-tests.ts +2 -2
  40. package/src/tests/units-handler-get-region.ts +4 -4
  41. package/src/tests/units-handler-splitted-tests.ts +19 -17
  42. package/src/tests/units-handler-tests.ts +32 -32
  43. package/src/utils/cell-renderer.ts +40 -34
  44. package/src/utils/check-input-column.ts +5 -5
  45. package/src/utils/context-menu.ts +9 -6
  46. package/src/utils/convert.ts +9 -9
  47. package/src/utils/get-region-func-editor.ts +11 -11
  48. package/src/utils/get-region.ts +10 -12
  49. package/src/utils/macromolecule-column-widget.ts +9 -5
  50. package/src/utils/monomer-lib/library-file-manager/event-manager.ts +1 -1
  51. package/src/utils/multiple-sequence-alignment-ui.ts +6 -6
  52. package/src/utils/pepsea.ts +1 -0
  53. package/src/utils/poly-tool/transformation.ts +3 -3
  54. package/src/utils/save-as-fasta.ts +14 -15
  55. package/src/utils/sequence-to-mol.ts +4 -4
  56. package/src/viewers/web-logo-viewer.ts +95 -110
  57. package/src/widgets/bio-substructure-filter.ts +3 -3
  58. package/src/widgets/composition-analysis-widget.ts +26 -19
package/dist/590.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"590.js","mappings":"kIAEO,MAAMA,EACTC,aACAC,cACIC,KAAKF,aAAeG,KAAKC,IAAIC,UAAUC,oBAAsB,EAAG,EACpE,CACAC,sBAAsBC,EAAQC,EAASC,EAAWC,EAAO,CAAC,CAAC,GAAIC,EAAU,CAAC,GAAIC,EAAoB,IAA2BC,WACzH,MAAMC,EAAUP,EAAO,GAAGQ,QAAUR,EAAO,GAAGQ,OAAS,GAAK,EACtDC,EAAYd,KAAKe,MAAMH,EAAUb,KAAKF,cACtCmB,EAAeX,EAAO,GAAGQ,OAAS,UAC9Bd,KAAKkB,oBAAoBZ,EAAQC,EAASE,EAAMC,EAASC,GAAqB,EACpFH,EAAYS,IACZE,QAAQC,IAAI,mBAAmBH,KAC/BT,EAAYS,GAEhBR,EAAKY,SAAQ,CAACC,EAAGC,IAAMd,EAAKc,GAAc,UAAIf,IAC9C,MAAMgB,EAAW,IAAIC,MAAMzB,KAAKF,cAC1B4B,EAAU,IAAID,MAAMzB,KAAKF,cAC1B6B,KAAK,MAAMC,KAAI,IAAM,IAAIC,OAAO,IAAIC,IAAI,oBAC7C,IAAK,IAAIC,EAAM,EAAGA,EAAM/B,KAAKF,aAAciC,IACvCP,EAASO,GAAO,IAAIC,SAAQ,CAACC,EAAeC,KACxC,MAAMC,EAAWJ,EAAMhB,EACjBqB,EAASL,IAAQ/B,KAAKF,aAAe,EAAIe,GAAWkB,EAAM,GAAKhB,EACjEqB,GAAUD,GACVF,EAAc,CAAEV,EAAG,IAAIc,WAAW,GAAIC,EAAG,IAAID,WAAW,GAAIE,SAAU,IAAIC,aAAa,GAAIT,QAC/FL,EAAQK,GAAKU,YAAY,CAAEnC,SAAQ6B,WAAUC,SAAQ5B,YAAWD,UAASE,OAAMC,UAASC,sBACxFe,EAAQK,GAAKW,UAAY,EAAGC,MAAQC,QAAOrB,IAAGe,IAAGC,gBACzCK,GACAlB,EAAQK,GAAKc,YACbX,EAAaU,KAGblB,EAAQK,GAAKc,YACbZ,EAAc,CAAEV,IAAGe,IAAGC,WAAUR,QACpC,CACH,IAGT,MAAMe,QAAgBd,QAAQe,IAAIvB,GAC5BwB,EAAWF,EAAQG,QAAO,CAACC,EAAKC,IAAQD,EAAMC,EAAI5B,EAAET,QAAQ,GAC5DS,EAAI,IAAIc,WAAWW,GACnBV,EAAI,IAAID,WAAWW,GACnBT,EAAW,IAAIC,aAAaQ,GAClC,IAAII,EAAS,EAEb,IAAK,MAAMC,KAAOP,EACdvB,EAAE+B,IAAID,EAAI9B,EAAG6B,GACbd,EAAEgB,IAAID,EAAIf,EAAGc,GACbb,EAASe,IAAID,EAAId,SAAUa,GAC3BA,GAAUC,EAAI9B,EAAET,OAEpB,MAAO,CAAES,IAAGe,IAAGC,WACnB,CACAlC,WAAWC,EAAQiD,EAAQ/C,EAAWC,EAAO,CAAC,GAE1C,aAAaT,KAAKwD,gBAAgB,CAAClD,GAAS,CAACiD,GAAS/C,EAAW,CAACC,GAAO,CAAC,GAC9E,CACAJ,aAAaC,EAAQiD,EAAQE,EAAc,GAAIhD,EAAO,CAAC,GACnD,aAAaT,KAAK0D,eAAe,CAACpD,GAAS,CAACiD,GAASE,EAAa,CAAChD,GAAO,CAAC,GAC/E,CACAJ,sBAAsBC,EAAQiD,EAAQ/C,EAAY,GAAKC,EAAO,CAAC,GAC3D,aAAaT,KAAK2D,wBAAwB,CAACrD,GAAS,CAACiD,GAAS/C,EAAW,CAACC,GAAO,CAAC,GACtF,CACAJ,8BAA8BC,EAAQC,EAASC,EAAY,GAAKC,EAAMC,EAASC,EAAoB,IAA2BC,WAC1H,GAAIN,EAAOQ,SAAWP,EAAQO,QAAUR,EAAOQ,SAAWL,EAAKK,QAAUR,EAAOQ,SAAWJ,EAAQI,OAC/F,MAAM,IAAI8C,MAAM,sFACpB,GAAItD,EAAOuD,MAAMC,GAAMA,EAAEhD,SAAWR,EAAO,GAAGQ,SAC1C,MAAM,IAAI8C,MAAM,iDACpB,MAAM/C,EAAUP,EAAO,GAAGQ,QAAUR,EAAO,GAAGQ,OAAS,GAAK,EACtDC,EAAYd,KAAKe,MAAMH,EAAUb,KAAKF,cACtC0B,EAAW,IAAIC,MAAMzB,KAAKF,cAC1B4B,EAAU,IAAID,MAAMzB,KAAKF,cAC1B6B,KAAK,MAAMC,KAAI,IAAM,IAAIC,OAAO,IAAIC,IAAI,qBAC7C,IAAK,IAAIC,EAAM,EAAGA,EAAM/B,KAAKF,aAAciC,IACvCP,EAASO,GAAO,IAAIC,SAAQ,CAACC,EAAeC,KACxC,MAAMC,EAAWJ,EAAMhB,EACjBqB,EAASL,IAAQ/B,KAAKF,aAAe,EAAIe,GAAWkB,EAAM,GAAKhB,EACjEqB,GAAUD,GACVF,EAAc,CAAE8B,aAAc,IAAItC,MAAM,GAAIuC,WAAY,IAAIvC,MAAM,KACtEC,EAAQK,GAAKU,YAAY,CAAEnC,SAAQ6B,WAAUC,SAAQ7B,UAASE,OAAMD,YAAWE,UAASC,sBACxFe,EAAQK,GAAKW,UAAY,EAAGC,MAAQC,QAAOmB,eAAcC,kBACjDpB,GACAlB,EAAQK,GAAKc,YACbX,EAAaU,KAGblB,EAAQK,GAAKc,YACbZ,EAAc,CAAE8B,eAAcC,eAClC,CACH,IAGT,MAAMlB,QAAgBd,QAAQe,IAAIvB,GAC5ByC,EAAW,IAAI5B,WAAW/B,EAAO,GAAGQ,QAC1C,IAAK,MAAMuC,KAAOP,EACd,IAAK,IAAIvB,EAAI,EAAGA,EAAIjB,EAAO,GAAGQ,SAAUS,EACpC0C,EAAS1C,IAAM8B,EAAIW,WAAWzC,IAAIT,QAAU,EAEpD,MAAMoD,EAAS,CACXH,aAAc,IAAItC,MAAMnB,EAAO,GAAGQ,QAAQa,KAAK,MAAMC,KAAI,CAACN,EAAGC,IAAM,IAAIE,MAAMwC,EAAS1C,MACtFyC,WAAY,IAAIvC,MAAMnB,EAAO,GAAGQ,QAAQa,KAAK,MAAMC,KAAI,CAACN,EAAGC,IAAM,IAAIE,MAAMwC,EAAS1C,OAExF,IAAK,MAAM8B,KAAOP,EACd,IAAK,IAAIvB,EAAI,EAAGA,EAAIjB,EAAO,GAAGQ,SAAUS,EACpC,IAAK,IAAIe,EAAI,EAAGA,EAAIe,EAAIU,aAAaxC,IAAIT,SAAewB,EACpD4B,EAAOH,aAAaxC,GAAG0C,EAAS1C,GAAK,GAAK8B,EAAIU,aAAaxC,GAAGe,GAC9D4B,EAAOF,WAAWzC,GAAG0C,EAAS1C,GAAK,GAAK8B,EAAIW,WAAWzC,GAAGe,GAC1D2B,EAAS1C,IAAM,EAI3B,OAAO2C,CACX,CACA7D,qBAAqBC,EAAQC,EAASkD,EAAc,GAAIhD,EAAMC,EAASC,EAAoB,IAA2BC,WAClH,GAAIN,EAAOQ,SAAWP,EAAQO,QAAUR,EAAOQ,SAAWL,EAAKK,QAAUR,EAAOQ,SAAWJ,EAAQI,OAC/F,MAAM,IAAI8C,MAAM,sFACpB,GAAItD,EAAOuD,MAAMC,GAAMA,EAAEhD,SAAWR,EAAO,GAAGQ,SAC1C,MAAM,IAAI8C,MAAM,iDACpB,MAAM/C,EAAUP,EAAO,GAAGQ,QAAUR,EAAO,GAAGQ,OAAS,GAAK,EACtDC,EAAYd,KAAKe,MAAMH,EAAUb,KAAKF,cACtC0B,EAAW,IAAIC,MAAMzB,KAAKF,cAC1B4B,EAAU,IAAID,MAAMzB,KAAKF,cAC1B6B,KAAK,MAAMC,KAAI,IAAM,IAAIC,OAAO,IAAIC,IAAI,qBAC7C,IAAK,IAAIC,EAAM,EAAGA,EAAM/B,KAAKF,aAAciC,IACvCP,EAASO,GAAO,IAAIC,SAAQ,CAACC,EAAeC,KACxC,MAAMC,EAAWJ,EAAMhB,EACjBqB,EAASL,IAAQ/B,KAAKF,aAAe,EAAIe,GAAWkB,EAAM,GAAKhB,EACjEqB,GAAUD,GACVF,EAAc,CAAE8B,aAAc,IAAItC,MAAM,GAAIuC,WAAY,IAAIvC,MAAM,KACtEC,EAAQK,GAAKU,YAAY,CAAEnC,SAAQ6B,WAAUC,SAAQ7B,UAASE,OAAMgD,cAAa/C,UAASC,sBAC1Fe,EAAQK,GAAKW,UAAY,EAAGC,MAAQC,QAAOmB,eAAcC,kBACjDpB,GACAlB,EAAQK,GAAKc,YACbX,EAAaU,KAGblB,EAAQK,GAAKc,YACbZ,EAAc,CAAE8B,eAAcC,eAClC,CACH,IAGT,MAAMlB,QAAgBd,QAAQe,IAAIvB,GAC5B0C,EAAS,CACXH,aAAc,IAAItC,MAAMnB,EAAO,GAAGQ,QAAQa,KAAK,MAAMC,KAAI,IAAM,IAAIH,MAAMgC,GAAa9B,KAAK,SAC3FqC,WAAY,IAAIvC,MAAMnB,EAAO,GAAGQ,QAAQa,KAAK,MAAMC,KAAI,IAAM,IAAIH,MAAMgC,GAAa9B,MAAM,MAE9F,IAAK,MAAM0B,KAAOP,EACd,IAAK,IAAIvB,EAAI,EAAGA,EAAIjB,EAAO,GAAGQ,SAAUS,EACpC,IAAK,IAAIe,EAAI,EAAGA,EAAIe,EAAIU,aAAaxC,IAAIT,SAAewB,GACpD,QAAc4B,EAAOH,aAAaxC,GAAI2C,EAAOF,WAAWzC,GAAI8B,EAAIU,aAAaxC,GAAGe,GAAIe,EAAIW,WAAWzC,GAAGe,IAGlH,OAAO4B,CACX,CACA7D,yBAAyBC,EAAQC,EAASE,EAAO,GAAIC,EAASC,EAAoB,IAA2BC,WACzG,MAAMuD,EAAmB,IAAI1C,MAAMzB,KAAKF,cAAc6B,KAAK,MACtDC,KAAI,IAAM,IAAIC,OAAO,IAAIC,IAAI,oBAClC,IACI,MAAMjB,EAAUP,EAAO,GAAGQ,QAAUR,EAAO,GAAGQ,OAAS,GAAK,EACtDC,EAAYd,KAAKe,MAAMH,EAAUb,KAAKF,cACtCsE,EAAgB,IAChBC,EAAapE,KAAKC,IAAID,KAAKqE,IAAIzD,EAAU,IAAMuD,GAAgBnE,KAAKqE,IAAIzD,EAASuD,IACjFG,EAAuBtE,KAAKe,MAAMqD,EAAarE,KAAKF,cACpD0E,EAAY,IAAI/C,MAAMzB,KAAKF,cACjC,IAAK,IAAIiC,EAAM,EAAGA,EAAM/B,KAAKF,aAAciC,IACvCyC,EAAUzC,GAAO,IAAIC,SAAQ,CAACC,EAAeC,KACzC,MAAMC,EAAWJ,EAAMhB,EACjBqB,EAASL,IAAQ/B,KAAKF,aAAe,EAAIe,GAAWkB,EAAM,GAAKhB,EACrEoD,EAAiBpC,GAAKU,YAAY,CAC9BnC,OAAQA,EAAQ6B,WAAUC,SAAQqC,aAAcF,EAChDhE,UAASE,OAAMC,UAASC,sBAE5BwD,EAAiBpC,GAAKW,UAAY,EAAGC,MAAQC,QAAOL,gBAChD4B,EAAiBpC,GAAKc,YAClBD,EACAV,EAAaU,GAEbX,EAAc,CAAEM,YAAW,CAClC,IAGT,MAAMO,QAAgBd,QAAQe,IAAIyB,GAC5BxB,EAAWF,EAAQG,QAAO,CAACC,EAAKC,IAAQD,EAAMC,EAAIZ,SAASzB,QAAQ,GACnEyB,EAAW,IAAIC,aAAaQ,GAClC,IAAII,EAAS,EACb,IAAK,MAAMC,KAAOP,EACdP,EAASe,IAAID,EAAId,SAAUa,GAC3BA,GAAUC,EAAId,SAASzB,OAG3B,OADAyB,EAASmC,OACFnC,CACX,CACA,MAAOoC,GAGH,OAFAR,GAAkB9C,SAASuD,GAAMA,GAAG/B,cACpC1B,QAAQyB,MAAM+B,GACP,IAAInC,aAAa,GAAGb,KAAK,GACpC,CACJ,CACAtB,0BAA0BC,EAAQC,EAASE,EAAO,GAAIC,EAASC,EAAoB,IAA2BC,WAK1G,IACI,MAAMC,EAAUP,EAAOQ,QAAUR,EAAOQ,OAAS,GAAK,EAChDyB,QAAiBvC,KAAK6E,mBAAmBvE,EAAQC,EAASE,EAAMC,EAASC,GAI/E,OAFkB,EAAI4B,EADAtC,KAAKe,MAJH,IAI+BH,EAAU0B,EAASzB,QAI9E,CACA,MAAO6D,GAEH,OADAxD,QAAQyB,MAAM+B,GACP,EACX,CACJ,CACAG,gBAAgBxE,EAAQiD,EAAQwB,EAAYvE,GACxC,MAAMe,EAAI,GACJe,EAAI,GACJ0C,EAAY,GAClB,IAAIC,EAAM,EACNC,EAAK,EACLC,EAAK,EACT,MAAMnC,EAAW1C,EAAOQ,QAAUR,EAAOQ,OAAS,GAAK,EACvD,KAAOmE,EAAMjC,GAAU,CAEnB,MAAMoC,GAAS,QAAM9E,EAAO4E,MAAS,QAAM5E,EAAO6E,IACT,EAArCJ,EAAWzE,EAAO4E,GAAK5E,EAAO6E,IACf,EAAIC,GACL5E,IACde,EAAE8D,KAAKH,GACP5C,EAAE+C,KAAKF,GACPH,EAAUK,KAAKD,IAEnBH,IACAE,IACIA,IAAO7E,EAAOQ,SACdoE,IACAC,EAAKD,EAAK,EAElB,CAIA,MAAO,CAAE3D,EAHM,IAAIc,WAAWd,GAGVe,EAFL,IAAID,WAAWC,GAECC,SADT,IAAIC,aAAawC,GAE3C,E,iBCvPG,IAAIM,E,iBACX,SAAWA,GACPA,EAAsC,UAAI,YAC1CA,EAAsC,UAAI,WAC7C,CAHD,CAGGA,IAA+BA,EAA6B,CAAC,G","sources":["webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/sparse-matrix-service.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/types.js"],"sourcesContent":["import { DistanceAggregationMethods } from './types';\nimport { insertSmaller, isNil } from './utils';\nexport class SparseMatrixService {\n _workerCount;\n constructor() {\n this._workerCount = Math.max(navigator.hardwareConcurrency - 2, 1);\n }\n async calcMultiColumn(values, fnNames, threshold, opts = [{}], weights = [1], aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const minThreshold = values[0].length > 20000 ?\n await this.getMinimalThreshold(values, fnNames, opts, weights, aggregationMethod) : 0;\n if (threshold < minThreshold) {\n console.log(`using threshold ${minThreshold}`);\n threshold = minThreshold;\n }\n opts.forEach((_, i) => opts[i]['threshold'] = threshold);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./sparse-matrix-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ i: new Int32Array(0), j: new Int32Array(0), distance: new Float32Array(0), idx });\n workers[idx].postMessage({ values, startIdx, endIdx, threshold, fnNames, opts, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, i, j, distance } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ i, j, distance, idx });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const fullSize = results.reduce((acc, val) => acc + val.i.length, 0);\n const i = new Int32Array(fullSize);\n const j = new Int32Array(fullSize);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n // setting the results\n for (const res of results) {\n i.set(res.i, offset);\n j.set(res.j, offset);\n distance.set(res.distance, offset);\n offset += res.i.length;\n }\n return { i, j, distance };\n }\n async calc(values, fnName, threshold, opts = {}) {\n //size of full matrix\n return await this.calcMultiColumn([values], [fnName], threshold, [opts], [1]);\n }\n async getKNN(values, fnName, nNeighbours = 15, opts = {}) {\n return await this.multiColumnKNN([values], [fnName], nNeighbours, [opts], [1]);\n }\n async getThresholdKNN(values, fnName, threshold = 0.8, opts = {}) {\n return await this.multiColumnThresholdKnn([values], [fnName], threshold, [opts], [1]);\n }\n async multiColumnThresholdKnn(values, fnNames, threshold = 0.8, opts, weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n if (values.length !== fnNames.length || values.length !== opts.length || values.length !== weights.length)\n throw new Error('values, distance functions, options and weights arrays should have the same length');\n if (values.some((v) => v.length !== values[0].length))\n throw new Error('all values arrays should have the same length');\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./knn-threshold-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ knnDistances: new Array(0), knnIndexes: new Array(0) });\n workers[idx].postMessage({ values, startIdx, endIdx, fnNames, opts, threshold, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, knnDistances, knnIndexes } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ knnDistances, knnIndexes });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const knnSizes = new Int32Array(values[0].length);\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i)\n knnSizes[i] += res.knnIndexes[i]?.length ?? 0;\n }\n const knnRes = {\n knnDistances: new Array(values[0].length).fill(null).map((_, i) => new Array(knnSizes[i])),\n knnIndexes: new Array(values[0].length).fill(null).map((_, i) => new Array(knnSizes[i]))\n };\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i) {\n for (let j = 0; j < res.knnDistances[i]?.length ?? 0; ++j) {\n knnRes.knnDistances[i][knnSizes[i] - 1] = res.knnDistances[i][j];\n knnRes.knnIndexes[i][knnSizes[i] - 1] = res.knnIndexes[i][j];\n knnSizes[i] -= 1;\n }\n }\n }\n return knnRes;\n }\n async multiColumnKNN(values, fnNames, nNeighbours = 15, opts, weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n if (values.length !== fnNames.length || values.length !== opts.length || values.length !== weights.length)\n throw new Error('values, distance functions, options and weights arrays should have the same length');\n if (values.some((v) => v.length !== values[0].length))\n throw new Error('all values arrays should have the same length');\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./knn-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ knnDistances: new Array(0), knnIndexes: new Array(0) });\n workers[idx].postMessage({ values, startIdx, endIdx, fnNames, opts, nNeighbours, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, knnDistances, knnIndexes } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ knnDistances, knnIndexes });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const knnRes = {\n knnDistances: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(99999)),\n knnIndexes: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(-1))\n };\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i) {\n for (let j = 0; j < res.knnDistances[i]?.length ?? 0; ++j)\n insertSmaller(knnRes.knnDistances[i], knnRes.knnIndexes[i], res.knnDistances[i][j], res.knnIndexes[i][j]);\n }\n }\n return knnRes;\n }\n async getSampleDistances(values, fnNames, opts = [], weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n const thresholdWorkers = new Array(this._workerCount).fill(null)\n .map(() => new Worker(new URL('./sparse-matrix-threshold-worker', import.meta.url)));\n try {\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const maxSampleSize = 1000000;\n const sampleSise = Math.max(Math.min(matSize / 1000, maxSampleSize), Math.min(matSize, maxSampleSize));\n const testSetSizePerWorker = Math.floor(sampleSise / this._workerCount);\n const tPromises = new Array(this._workerCount);\n for (let idx = 0; idx < this._workerCount; idx++) {\n tPromises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n thresholdWorkers[idx].postMessage({\n values: values, startIdx, endIdx, sampleLength: testSetSizePerWorker,\n fnNames, opts, weights, aggregationMethod\n });\n thresholdWorkers[idx].onmessage = ({ data: { error, distance } }) => {\n thresholdWorkers[idx].terminate();\n if (error)\n rejectWorker(error);\n else\n resolveWorker({ distance });\n };\n });\n }\n const results = await Promise.all(tPromises);\n const fullSize = results.reduce((acc, val) => acc + val.distance.length, 0);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n for (const res of results) {\n distance.set(res.distance, offset);\n offset += res.distance.length;\n }\n distance.sort();\n return distance;\n }\n catch (e) {\n thresholdWorkers?.forEach((w) => w?.terminate());\n console.error(e);\n return new Float32Array(1).fill(0.5);\n }\n }\n async getMinimalThreshold(values, fnNames, opts = [], weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n //We need to calculate the minimal threshold first,\n //in order to get matrix such that it does not exceed the maximum size of 1GB\n //we have 3 return arrays, each 4 bites per element, so if the maximum size of the matrix is 1GB,\n const maxSparseMatrixSize = 70000000;\n try {\n const matSize = values.length * (values.length - 1) / 2;\n const distance = await this.getSampleDistances(values, fnNames, opts, weights, aggregationMethod);\n const fractionIndex = Math.floor(maxSparseMatrixSize / matSize * distance.length);\n const threshold = 1 - distance[fractionIndex];\n // threshold = Math.max(threshold, 0.3);\n return threshold;\n }\n catch (e) {\n console.error(e);\n return 0.5;\n }\n }\n static calcSync(values, fnName, distanceFn, threshold) {\n const i = [];\n const j = [];\n const distances = [];\n let cnt = 0;\n let mi = 0;\n let mj = 0;\n const fullSize = values.length * (values.length - 1) / 2;\n while (cnt < fullSize) {\n //const value = seq1List[mi] && seq1List[mj] ? hamming(seq1List[mi], seq1List[mj]) : 0;\n const value = !isNil(values[mi]) && !isNil(values[mj]) ?\n distanceFn(values[mi], values[mj]) : 1;\n const similarity = 1 - value;\n if (similarity >= threshold) {\n i.push(mi);\n j.push(mj);\n distances.push(value);\n }\n cnt++;\n mj++;\n if (mj === values.length) {\n mi++;\n mj = mi + 1;\n }\n }\n const iArray = new Int32Array(i);\n const jArray = new Int32Array(j);\n const distanceArray = new Float32Array(distances);\n return { i: iArray, j: jArray, distance: distanceArray };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBNEIsMEJBQTBCLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUUsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFhN0MsTUFBTSxPQUFPLG1CQUFtQjtJQUNwQixZQUFZLENBQVM7SUFDN0I7UUFDRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFvQixFQUFFLE9BQXVCLEVBQ3hFLFNBQWlCLEVBQUUsT0FBNkIsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFvQixDQUFDLENBQUMsQ0FBQyxFQUM3RSxvQkFBK0MsMEJBQTBCLENBQUMsU0FBUztRQUVuRixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTFELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBTSxDQUFDLENBQUM7WUFDOUMsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RixJQUFJLFNBQVMsR0FB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QyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ1gsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDWCxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3ZCO1lBQ0QsR0FBRyxFQUFFLENBQUM7WUFDTixFQUFFLEVBQUUsQ0FBQztZQUNMLElBQUksRUFBRSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUU7Z0JBQ3hCLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQ2I7U0FDRjtRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sYUFBYSxHQUFHLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWxELE9BQU8sRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBQyxDQUFDO0lBQ3pELENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7S25vd25NZXRyaWNzfSBmcm9tICcuLi90eXBlZC1tZXRyaWNzJztcbmltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHN9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtpbnNlcnRTbWFsbGVyLCBpc05pbH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIFNwYXJzZU1hdHJpeFJlc3VsdCA9IHtcbiAgaTogSW50MzJBcnJheSxcbiAgajogSW50MzJBcnJheSxcbiAgZGlzdGFuY2U6IEZsb2F0MzJBcnJheSxcbiAgaWR4PzogbnVtYmVyXG59O1xuXG5leHBvcnQgdHlwZSBLbm5SZXN1bHQgPSB7XG4gIGtubkRpc3RhbmNlczogbnVtYmVyW11bXSxcbiAga25uSW5kZXhlczogbnVtYmVyW11bXVxufVxuZXhwb3J0IGNsYXNzIFNwYXJzZU1hdHJpeFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX3dvcmtlckNvdW50OiBudW1iZXI7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl93b3JrZXJDb3VudCA9IE1hdGgubWF4KG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5IC0gMiwgMSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNhbGNNdWx0aUNvbHVtbih2YWx1ZXM6IEFycmF5PGFueVtdPiwgZm5OYW1lczogS25vd25NZXRyaWNzW10sXG4gICAgICB0aHJlc2hvbGQ6IG51bWJlciwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9W10gPSBbe31dLCB3ZWlnaHRzOiBudW1iZXJbXSA9IFsxXSxcbiAgICAgIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kID0gRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuRVVDTElERUFOXG4gICAgKSB7XG4gICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzWzBdLmxlbmd0aCAqICh2YWx1ZXNbMF0ubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuXG4gICAgICBjb25zdCBtaW5UaHJlc2hvbGQgPSB2YWx1ZXNbMF0ubGVuZ3RoID4gMjBfMDAwID9cbiAgICAgICAgYXdhaXQgdGhpcy5nZXRNaW5pbWFsVGhyZXNob2xkKHZhbHVlcywgZm5OYW1lcywgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QpIDogMDtcbiAgICAgIGlmICh0aHJlc2hvbGQgPCBtaW5UaHJlc2hvbGQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYHVzaW5nIHRocmVzaG9sZCAke21pblRocmVzaG9sZH1gKTtcbiAgICAgICAgdGhyZXNob2xkID0gbWluVGhyZXNob2xkO1xuICAgICAgfVxuICAgICAgb3B0cy5mb3JFYWNoKChfLCBpKSA9PiBvcHRzW2ldWyd0aHJlc2hvbGQnXSA9IHRocmVzaG9sZCk7XG4gICAgICBjb25zdCBwcm9taXNlcyA9XG4gICAgICAgIG5ldyBBcnJheTxQcm9taXNlPFNwYXJzZU1hdHJpeFJlc3VsdD4+KHRoaXMuX3dvcmtlckNvdW50KTtcblxuICAgICAgY29uc3Qgd29ya2VycyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudClcbiAgICAgICAgLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9zcGFyc2UtbWF0cml4LXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcbiAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHRoaXMuX3dvcmtlckNvdW50OyBpZHgrKykge1xuICAgICAgICBwcm9taXNlc1tpZHhdID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBpZiAoZW5kSWR4IDw9IHN0YXJ0SWR4KVxuICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7aTogbmV3IEludDMyQXJyYXkoMCksIGo6IG5ldyBJbnQzMkFycmF5KDApLCBkaXN0YW5jZTogbmV3IEZsb2F0MzJBcnJheSgwKSwgaWR4fSk7XG4gICAgICAgICAgd29ya2Vyc1tpZHhdLnBvc3RNZXNzYWdlKHt2YWx1ZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIHRocmVzaG9sZCwgZm5OYW1lcywgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2R9KTtcbiAgICAgICAgICB3b3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHtkYXRhOiB7ZXJyb3IsIGksIGosIGRpc3RhbmNlfX0pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIHJlamVjdFdvcmtlcihlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2ksIGosIGRpc3RhbmNlLCBpZHh9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgIGNvbnN0IGZ1bGxTaXplID0gcmVzdWx0cy5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyB2YWwuaS5sZW5ndGgsIDApO1xuICAgICAgY29uc3QgaSA9IG5ldyBJbnQzMkFycmF5KGZ1bGxTaXplKTtcbiAgICAgIGNvbnN0IGogPSBuZXcgSW50MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IG5ldyBGbG9hdDMyQXJyYXkoZnVsbFNpemUpO1xuICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAvLyBzZXR0aW5nIHRoZSByZXN1bHRzXG4gICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgIGkuc2V0KHJlcy5pLCBvZmZzZXQpO1xuICAgICAgICBqLnNldChyZXMuaiwgb2Zmc2V0KTtcbiAgICAgICAgZGlzdGFuY2Uuc2V0KHJlcy5kaXN0YW5jZSwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IHJlcy5pLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7aSwgaiwgZGlzdGFuY2V9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjYWxjPFQ+KHZhbHVlczogQXJyYXk8VD4sIGZuTmFtZTogS25vd25NZXRyaWNzLCB0aHJlc2hvbGQ6IG51bWJlciwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9ID0ge30pIHtcbiAgICAgIC8vc2l6ZSBvZiBmdWxsIG1hdHJpeFxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsY011bHRpQ29sdW1uKFt2YWx1ZXNdLCBbZm5OYW1lXSwgdGhyZXNob2xkLCBbb3B0c10sIFsxXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEtOTihcbiAgICAgIHZhbHVlczogQXJyYXk8YW55PiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsIG5OZWlnaGJvdXJzOiBudW1iZXIgPSAxNSwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9ID0ge31cbiAgICApIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm11bHRpQ29sdW1uS05OKFt2YWx1ZXNdLCBbZm5OYW1lXSwgbk5laWdoYm91cnMsIFtvcHRzXSwgWzFdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VGhyZXNob2xkS05OKFxuICAgICAgdmFsdWVzOiBBcnJheTxhbnk+LCBmbk5hbWU6IEtub3duTWV0cmljcywgdGhyZXNob2xkOiBudW1iZXIgPSAwLjgsIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fSA9IHt9XG4gICAgKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5tdWx0aUNvbHVtblRocmVzaG9sZEtubihbdmFsdWVzXSwgW2ZuTmFtZV0sIHRocmVzaG9sZCwgW29wdHNdLCBbMV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBtdWx0aUNvbHVtblRocmVzaG9sZEtubih2YWx1ZXM6IEFycmF5PEFycmF5PGFueT4+LCBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSwgdGhyZXNob2xkOiBudW1iZXIgPSAwLjgsXG4gICAgICBvcHRzOiB7W186IHN0cmluZ106IGFueX1bXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTlxuICAgICkge1xuICAgICAgaWYgKHZhbHVlcy5sZW5ndGggIT09IGZuTmFtZXMubGVuZ3RoIHx8IHZhbHVlcy5sZW5ndGggIT09IG9wdHMubGVuZ3RoIHx8IHZhbHVlcy5sZW5ndGggIT09IHdlaWdodHMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhbHVlcywgZGlzdGFuY2UgZnVuY3Rpb25zLCBvcHRpb25zIGFuZCB3ZWlnaHRzIGFycmF5cyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcblxuICAgICAgaWYgKHZhbHVlcy5zb21lKCh2KSA9PiB2Lmxlbmd0aCAhPT0gdmFsdWVzWzBdLmxlbmd0aCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYWxsIHZhbHVlcyBhcnJheXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIGNvbnN0IG1hdFNpemUgPSB2YWx1ZXNbMF0ubGVuZ3RoICogKHZhbHVlc1swXS5sZW5ndGggLSAxKSAvIDI7XG4gICAgICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKG1hdFNpemUgLyB0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICBjb25zdCBwcm9taXNlcyA9XG4gICAgICAgIG5ldyBBcnJheTxQcm9taXNlPEtublJlc3VsdD4+KHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgIGNvbnN0IHdvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpXG4gICAgICAgIC5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4va25uLXRocmVzaG9sZC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG4gICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCB0aGlzLl93b3JrZXJDb3VudDsgaWR4KyspIHtcbiAgICAgICAgcHJvbWlzZXNbaWR4XSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydElkeCA9IGlkeCAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSBpZHggPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSA/IG1hdFNpemUgOiAoaWR4ICsgMSkgKiBjaHVua1NpemU7XG4gICAgICAgICAgaWYgKGVuZElkeCA8PSBzdGFydElkeClcbiAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2tubkRpc3RhbmNlczogbmV3IEFycmF5KDApLCBrbm5JbmRleGVzOiBuZXcgQXJyYXkoMCl9KTtcbiAgICAgICAgICB3b3JrZXJzW2lkeF0ucG9zdE1lc3NhZ2Uoe3ZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgZm5OYW1lcywgb3B0cywgdGhyZXNob2xkLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZH0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwga25uRGlzdGFuY2VzLCBrbm5JbmRleGVzfX0pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIHJlamVjdFdvcmtlcihlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2tubkRpc3RhbmNlcywga25uSW5kZXhlc30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgY29uc3Qga25uU2l6ZXMgPSBuZXcgSW50MzJBcnJheSh2YWx1ZXNbMF0ubGVuZ3RoKTtcbiAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXNbMF0ubGVuZ3RoOyArK2kpXG4gICAgICAgICAga25uU2l6ZXNbaV0gKz0gcmVzLmtubkluZGV4ZXNbaV0/Lmxlbmd0aCA/PyAwO1xuICAgICAgfVxuICAgICAgY29uc3Qga25uUmVzOiBLbm5SZXN1bHQgPSB7XG4gICAgICAgIGtubkRpc3RhbmNlczogbmV3IEFycmF5KHZhbHVlc1swXS5sZW5ndGgpLmZpbGwobnVsbCkubWFwKChfLCBpKSA9PiBuZXcgQXJyYXk8bnVtYmVyPihrbm5TaXplc1tpXSkpLFxuICAgICAgICBrbm5JbmRleGVzOiBuZXcgQXJyYXkodmFsdWVzWzBdLmxlbmd0aCkuZmlsbChudWxsKS5tYXAoKF8sIGkpID0+IG5ldyBBcnJheTxudW1iZXI+KGtublNpemVzW2ldKSl9O1xuICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzdWx0cykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc1swXS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVzLmtubkRpc3RhbmNlc1tpXT8ubGVuZ3RoID8/IDA7ICsraikge1xuICAgICAgICAgICAga25uUmVzLmtubkRpc3RhbmNlc1tpXVtrbm5TaXplc1tpXSAtIDFdID0gcmVzLmtubkRpc3RhbmNlc1tpXVtqXTtcbiAgICAgICAgICAgIGtublJlcy5rbm5JbmRleGVzW2ldW2tublNpemVzW2ldIC0gMV0gPSByZXMua25uSW5kZXhlc1tpXVtqXTtcbiAgICAgICAgICAgIGtublNpemVzW2ldIC09IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ga25uUmVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBtdWx0aUNvbHVtbktOTih2YWx1ZXM6IEFycmF5PEFycmF5PGFueT4+LCBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSwgbk5laWdoYm91cnM6IG51bWJlciA9IDE1LFxuICAgICAgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9W10sIHdlaWdodHM6IG51bWJlcltdLFxuICAgICAgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU5cbiAgICApIHtcbiAgICAgIGlmICh2YWx1ZXMubGVuZ3RoICE9PSBmbk5hbWVzLmxlbmd0aCB8fCB2YWx1ZXMubGVuZ3RoICE9PSBvcHRzLmxlbmd0aCB8fCB2YWx1ZXMubGVuZ3RoICE9PSB3ZWlnaHRzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWx1ZXMsIGRpc3RhbmNlIGZ1bmN0aW9ucywgb3B0aW9ucyBhbmQgd2VpZ2h0cyBhcnJheXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIGlmICh2YWx1ZXMuc29tZSgodikgPT4gdi5sZW5ndGggIT09IHZhbHVlc1swXS5sZW5ndGgpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FsbCB2YWx1ZXMgYXJyYXlzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzWzBdLmxlbmd0aCAqICh2YWx1ZXNbMF0ubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPVxuICAgICAgICBuZXcgQXJyYXk8UHJvbWlzZTxLbm5SZXN1bHQ+Pih0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICBjb25zdCB3b3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KVxuICAgICAgICAuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL2tubi13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG4gICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCB0aGlzLl93b3JrZXJDb3VudDsgaWR4KyspIHtcbiAgICAgICAgcHJvbWlzZXNbaWR4XSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydElkeCA9IGlkeCAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSBpZHggPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSA/IG1hdFNpemUgOiAoaWR4ICsgMSkgKiBjaHVua1NpemU7XG4gICAgICAgICAgaWYgKGVuZElkeCA8PSBzdGFydElkeClcbiAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2tubkRpc3RhbmNlczogbmV3IEFycmF5KDApLCBrbm5JbmRleGVzOiBuZXcgQXJyYXkoMCl9KTtcbiAgICAgICAgICB3b3JrZXJzW2lkeF0ucG9zdE1lc3NhZ2Uoe3ZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgZm5OYW1lcywgb3B0cywgbk5laWdoYm91cnMsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kfSk7XG4gICAgICAgICAgd29ya2Vyc1tpZHhdLm9ubWVzc2FnZSA9ICh7ZGF0YToge2Vycm9yLCBrbm5EaXN0YW5jZXMsIGtubkluZGV4ZXN9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7a25uRGlzdGFuY2VzLCBrbm5JbmRleGVzfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICBjb25zdCBrbm5SZXM6IEtublJlc3VsdCA9IHtcbiAgICAgICAga25uRGlzdGFuY2VzOiBuZXcgQXJyYXkodmFsdWVzWzBdLmxlbmd0aCkuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IEFycmF5PG51bWJlcj4obk5laWdoYm91cnMpLmZpbGwoOTk5OTkpKSxcbiAgICAgICAga25uSW5kZXhlczogbmV3IEFycmF5KHZhbHVlc1swXS5sZW5ndGgpLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBBcnJheTxudW1iZXI+KG5OZWlnaGJvdXJzKS5maWxsKC0xKSl9O1xuICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzdWx0cykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc1swXS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVzLmtubkRpc3RhbmNlc1tpXT8ubGVuZ3RoID8/IDA7ICsrailcbiAgICAgICAgICAgIGluc2VydFNtYWxsZXIoa25uUmVzLmtubkRpc3RhbmNlc1tpXSwga25uUmVzLmtubkluZGV4ZXNbaV0sIHJlcy5rbm5EaXN0YW5jZXNbaV1bal0sIHJlcy5rbm5JbmRleGVzW2ldW2pdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGtublJlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2FtcGxlRGlzdGFuY2VzKHZhbHVlczogQXJyYXk8YW55W10+LFxuICAgICAgZm5OYW1lczogS25vd25NZXRyaWNzW10sIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fVtdID0gW10sIHdlaWdodHM6IG51bWJlcltdLFxuICAgICAgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU4pOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xuICAgICAgY29uc3QgdGhyZXNob2xkV29ya2VycyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudCkuZmlsbChudWxsKVxuICAgICAgICAubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9zcGFyc2UtbWF0cml4LXRocmVzaG9sZC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hdFNpemUgPSB2YWx1ZXNbMF0ubGVuZ3RoICogKHZhbHVlc1swXS5sZW5ndGggLSAxKSAvIDI7XG4gICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE1hdGguZmxvb3IobWF0U2l6ZSAvIHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgICAgY29uc3QgbWF4U2FtcGxlU2l6ZSA9IDFfMDAwXzAwMDtcbiAgICAgICAgY29uc3Qgc2FtcGxlU2lzZSA9IE1hdGgubWF4KE1hdGgubWluKG1hdFNpemUgLyAxMDAwLCBtYXhTYW1wbGVTaXplKSwgTWF0aC5taW4obWF0U2l6ZSwgbWF4U2FtcGxlU2l6ZSkpO1xuICAgICAgICBjb25zdCB0ZXN0U2V0U2l6ZVBlcldvcmtlciA9IE1hdGguZmxvb3Ioc2FtcGxlU2lzZSAvIHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgICAgY29uc3QgdFByb21pc2VzID0gbmV3IEFycmF5PFByb21pc2U8e2Rpc3RhbmNlOiBGbG9hdDMyQXJyYXl9Pj4odGhpcy5fd29ya2VyQ291bnQpO1xuXG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHRoaXMuX3dvcmtlckNvdW50OyBpZHgrKykge1xuICAgICAgICAgIHRQcm9taXNlc1tpZHhdID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBpZHggKiBjaHVua1NpemU7XG4gICAgICAgICAgICBjb25zdCBlbmRJZHggPSBpZHggPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSA/IG1hdFNpemUgOiAoaWR4ICsgMSkgKiBjaHVua1NpemU7XG4gICAgICAgICAgICB0aHJlc2hvbGRXb3JrZXJzW2lkeF0ucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICB2YWx1ZXM6IHZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgc2FtcGxlTGVuZ3RoOiB0ZXN0U2V0U2l6ZVBlcldvcmtlcixcbiAgICAgICAgICAgICAgZm5OYW1lcywgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyZXNob2xkV29ya2Vyc1tpZHhdLm9ubWVzc2FnZSA9ICh7ZGF0YToge2Vycm9yLCBkaXN0YW5jZX19KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgIHRocmVzaG9sZFdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgaWYgKGVycm9yKSByZWplY3RXb3JrZXIoZXJyb3IpOyBlbHNlXG4gICAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7ZGlzdGFuY2V9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwodFByb21pc2VzKTtcbiAgICAgICAgY29uc3QgZnVsbFNpemUgPSByZXN1bHRzLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHZhbC5kaXN0YW5jZS5sZW5ndGgsIDApO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IG5ldyBGbG9hdDMyQXJyYXkoZnVsbFNpemUpO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzdWx0cykge1xuICAgICAgICAgIGRpc3RhbmNlLnNldChyZXMuZGlzdGFuY2UsIG9mZnNldCk7XG4gICAgICAgICAgb2Zmc2V0ICs9IHJlcy5kaXN0YW5jZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZGlzdGFuY2Uuc29ydCgpO1xuXG4gICAgICAgIHJldHVybiBkaXN0YW5jZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyZXNob2xkV29ya2Vycz8uZm9yRWFjaCgodykgPT4gdz8udGVybWluYXRlKCkpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheSgxKS5maWxsKDAuNSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRNaW5pbWFsVGhyZXNob2xkKHZhbHVlczogQXJyYXk8YW55W10+LFxuICAgICAgZm5OYW1lczogS25vd25NZXRyaWNzW10sIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fVtdID0gW10sIHdlaWdodHM6IG51bWJlcltdLFxuICAgICAgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU4pIHtcbiAgICAgIC8vV2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIG1pbmltYWwgdGhyZXNob2xkIGZpcnN0LFxuICAgICAgLy9pbiBvcmRlciB0byBnZXQgbWF0cml4IHN1Y2ggdGhhdCBpdCBkb2VzIG5vdCBleGNlZWQgdGhlIG1heGltdW0gc2l6ZSBvZiAxR0JcbiAgICAgIC8vd2UgaGF2ZSAzIHJldHVybiBhcnJheXMsIGVhY2ggNCBiaXRlcyBwZXIgZWxlbWVudCwgc28gaWYgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWF0cml4IGlzIDFHQixcbiAgICAgIGNvbnN0IG1heFNwYXJzZU1hdHJpeFNpemUgPSA3MF8wMDBfMDAwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlcy5sZW5ndGggKiAodmFsdWVzLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBhd2FpdCB0aGlzLmdldFNhbXBsZURpc3RhbmNlcyh2YWx1ZXMsIGZuTmFtZXMsIG9wdHMsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kKTtcbiAgICAgICAgY29uc3QgZnJhY3Rpb25JbmRleCA9IE1hdGguZmxvb3IobWF4U3BhcnNlTWF0cml4U2l6ZSAvIG1hdFNpemUgKiBkaXN0YW5jZS5sZW5ndGgpO1xuICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSAxIC0gZGlzdGFuY2VbZnJhY3Rpb25JbmRleF07XG4gICAgICAgIC8vIHRocmVzaG9sZCA9IE1hdGgubWF4KHRocmVzaG9sZCwgMC4zKTtcbiAgICAgICAgcmV0dXJuIHRocmVzaG9sZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgcmV0dXJuIDAuNTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNhbGNTeW5jPFQ+KFxuICAgICAgdmFsdWVzOiBBcnJheTxUPiB8IEFycmF5TGlrZTxUPiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsIGRpc3RhbmNlRm46IEZ1bmN0aW9uLCB0aHJlc2hvbGQ6IG51bWJlclxuICAgICkge1xuICAgICAgY29uc3QgaTogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGo6IG51bWJlcltdID0gW107XG4gICAgICBjb25zdCBkaXN0YW5jZXM6IG51bWJlcltdID0gW107XG4gICAgICBsZXQgY250ID0gMDtcbiAgICAgIGxldCBtaSA9IDA7XG4gICAgICBsZXQgbWogPSAwO1xuICAgICAgY29uc3QgZnVsbFNpemUgPSB2YWx1ZXMubGVuZ3RoICogKHZhbHVlcy5sZW5ndGggLSAxKSAvIDI7XG4gICAgICB3aGlsZSAoY250IDwgZnVsbFNpemUpIHtcbiAgICAgICAgLy9jb25zdCB2YWx1ZSA9IHNlcTFMaXN0W21pXSAmJiBzZXExTGlzdFttal0gPyBoYW1taW5nKHNlcTFMaXN0W21pXSwgc2VxMUxpc3RbbWpdKSA6IDA7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gIWlzTmlsKHZhbHVlc1ttaV0pICYmICFpc05pbCh2YWx1ZXNbbWpdKSA/XG4gICAgICAgICAgZGlzdGFuY2VGbih2YWx1ZXNbbWldLCB2YWx1ZXNbbWpdKSA6IDE7XG4gICAgICAgIGNvbnN0IHNpbWlsYXJpdHkgPSAxIC0gdmFsdWU7XG4gICAgICAgIGlmIChzaW1pbGFyaXR5ID49IHRocmVzaG9sZCkge1xuICAgICAgICAgIGkucHVzaChtaSk7XG4gICAgICAgICAgai5wdXNoKG1qKTtcbiAgICAgICAgICBkaXN0YW5jZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY250Kys7XG4gICAgICAgIG1qKys7XG4gICAgICAgIGlmIChtaiA9PT0gdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgIG1pKys7XG4gICAgICAgICAgbWogPSBtaSArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaUFycmF5ID0gbmV3IEludDMyQXJyYXkoaSk7XG4gICAgICBjb25zdCBqQXJyYXkgPSBuZXcgSW50MzJBcnJheShqKTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGRpc3RhbmNlcyk7XG5cbiAgICAgIHJldHVybiB7aTogaUFycmF5LCBqOiBqQXJyYXksIGRpc3RhbmNlOiBkaXN0YW5jZUFycmF5fTtcbiAgICB9XG59XG4iXX0=","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=="],"names":["SparseMatrixService","_workerCount","constructor","this","Math","max","navigator","hardwareConcurrency","async","values","fnNames","threshold","opts","weights","aggregationMethod","EUCLIDEAN","matSize","length","chunkSize","floor","minThreshold","getMinimalThreshold","console","log","forEach","_","i","promises","Array","workers","fill","map","Worker","URL","idx","Promise","resolveWorker","rejectWorker","startIdx","endIdx","Int32Array","j","distance","Float32Array","postMessage","onmessage","data","error","terminate","results","all","fullSize","reduce","acc","val","offset","res","set","fnName","calcMultiColumn","nNeighbours","multiColumnKNN","multiColumnThresholdKnn","Error","some","v","knnDistances","knnIndexes","knnSizes","knnRes","thresholdWorkers","maxSampleSize","sampleSise","min","testSetSizePerWorker","tPromises","sampleLength","sort","e","w","getSampleDistances","static","distanceFn","distances","cnt","mi","mj","value","push","DistanceAggregationMethods"],"sourceRoot":""}
1
+ {"version":3,"file":"590.js","mappings":"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","sources":["webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/sparse-matrix-service.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/types.js"],"sourcesContent":["import { DistanceAggregationMethods } from './types';\nimport { insertSmaller, isNil } from './utils';\nexport class SparseMatrixService {\n constructor() {\n this._workerCount = Math.max(navigator.hardwareConcurrency - 2, 1);\n }\n async calcMultiColumn(values, fnNames, threshold, opts = [{}], weights = [1], aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const minThreshold = values[0].length > 20000 ?\n await this.getMinimalThreshold(values, fnNames, opts, weights, aggregationMethod) : 0;\n if (threshold < minThreshold) {\n console.log(`using threshold ${minThreshold}`);\n threshold = minThreshold;\n }\n opts.forEach((_, i) => opts[i]['threshold'] = threshold);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./sparse-matrix-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ i: new Int32Array(0), j: new Int32Array(0), distance: new Float32Array(0), idx });\n workers[idx].postMessage({ values, startIdx, endIdx, threshold, fnNames, opts, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, i, j, distance } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ i, j, distance, idx });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const fullSize = results.reduce((acc, val) => acc + val.i.length, 0);\n const i = new Int32Array(fullSize);\n const j = new Int32Array(fullSize);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n // setting the results\n for (const res of results) {\n i.set(res.i, offset);\n j.set(res.j, offset);\n distance.set(res.distance, offset);\n offset += res.i.length;\n }\n return { i, j, distance };\n }\n async calc(values, fnName, threshold, opts = {}) {\n //size of full matrix\n return await this.calcMultiColumn([values], [fnName], threshold, [opts], [1]);\n }\n async getKNN(values, fnName, nNeighbours = 15, opts = {}) {\n return await this.multiColumnKNN([values], [fnName], nNeighbours, [opts], [1]);\n }\n async getThresholdKNN(values, fnName, threshold = 0.8, opts = {}) {\n return await this.multiColumnThresholdKnn([values], [fnName], threshold, [opts], [1]);\n }\n async multiColumnThresholdKnn(values, fnNames, threshold = 0.8, opts, weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n if (values.length !== fnNames.length || values.length !== opts.length || values.length !== weights.length)\n throw new Error('values, distance functions, options and weights arrays should have the same length');\n if (values.some((v) => v.length !== values[0].length))\n throw new Error('all values arrays should have the same length');\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./knn-threshold-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ knnDistances: new Array(0), knnIndexes: new Array(0) });\n workers[idx].postMessage({ values, startIdx, endIdx, fnNames, opts, threshold, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, knnDistances, knnIndexes } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ knnDistances, knnIndexes });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const knnSizes = new Int32Array(values[0].length);\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i)\n knnSizes[i] += res.knnIndexes[i]?.length ?? 0;\n }\n const knnRes = {\n knnDistances: new Array(values[0].length).fill(null).map((_, i) => new Array(knnSizes[i])),\n knnIndexes: new Array(values[0].length).fill(null).map((_, i) => new Array(knnSizes[i]))\n };\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i) {\n for (let j = 0; j < res.knnDistances[i]?.length ?? 0; ++j) {\n knnRes.knnDistances[i][knnSizes[i] - 1] = res.knnDistances[i][j];\n knnRes.knnIndexes[i][knnSizes[i] - 1] = res.knnIndexes[i][j];\n knnSizes[i] -= 1;\n }\n }\n }\n return knnRes;\n }\n async multiColumnKNN(values, fnNames, nNeighbours = 15, opts, weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n if (values.length !== fnNames.length || values.length !== opts.length || values.length !== weights.length)\n throw new Error('values, distance functions, options and weights arrays should have the same length');\n if (values.some((v) => v.length !== values[0].length))\n throw new Error('all values arrays should have the same length');\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./knn-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ knnDistances: new Array(0), knnIndexes: new Array(0) });\n workers[idx].postMessage({ values, startIdx, endIdx, fnNames, opts, nNeighbours, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, knnDistances, knnIndexes } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ knnDistances, knnIndexes });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const knnRes = {\n knnDistances: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(99999)),\n knnIndexes: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(-1))\n };\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i) {\n for (let j = 0; j < res.knnDistances[i]?.length ?? 0; ++j)\n insertSmaller(knnRes.knnDistances[i], knnRes.knnIndexes[i], res.knnDistances[i][j], res.knnIndexes[i][j]);\n }\n }\n return knnRes;\n }\n async getSampleDistances(values, fnNames, opts = [], weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n const thresholdWorkers = new Array(this._workerCount).fill(null)\n .map(() => new Worker(new URL('./sparse-matrix-threshold-worker', import.meta.url)));\n try {\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const maxSampleSize = 1000000;\n const sampleSise = Math.max(Math.min(matSize / 1000, maxSampleSize), Math.min(matSize, maxSampleSize));\n const testSetSizePerWorker = Math.floor(sampleSise / this._workerCount);\n const tPromises = new Array(this._workerCount);\n for (let idx = 0; idx < this._workerCount; idx++) {\n tPromises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n thresholdWorkers[idx].postMessage({\n values: values, startIdx, endIdx, sampleLength: testSetSizePerWorker,\n fnNames, opts, weights, aggregationMethod\n });\n thresholdWorkers[idx].onmessage = ({ data: { error, distance } }) => {\n thresholdWorkers[idx].terminate();\n if (error)\n rejectWorker(error);\n else\n resolveWorker({ distance });\n };\n });\n }\n const results = await Promise.all(tPromises);\n const fullSize = results.reduce((acc, val) => acc + val.distance.length, 0);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n for (const res of results) {\n distance.set(res.distance, offset);\n offset += res.distance.length;\n }\n distance.sort();\n return distance;\n }\n catch (e) {\n thresholdWorkers?.forEach((w) => w?.terminate());\n console.error(e);\n return new Float32Array(1).fill(0.5);\n }\n }\n async getMinimalThreshold(values, fnNames, opts = [], weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n //We need to calculate the minimal threshold first,\n //in order to get matrix such that it does not exceed the maximum size of 1GB\n //we have 3 return arrays, each 4 bites per element, so if the maximum size of the matrix is 1GB,\n const maxSparseMatrixSize = 70000000;\n try {\n const matSize = values.length * (values.length - 1) / 2;\n const distance = await this.getSampleDistances(values, fnNames, opts, weights, aggregationMethod);\n const fractionIndex = Math.floor(maxSparseMatrixSize / matSize * distance.length);\n const threshold = 1 - distance[fractionIndex];\n // threshold = Math.max(threshold, 0.3);\n return threshold;\n }\n catch (e) {\n console.error(e);\n return 0.5;\n }\n }\n static calcSync(values, fnName, distanceFn, threshold) {\n const i = [];\n const j = [];\n const distances = [];\n let cnt = 0;\n let mi = 0;\n let mj = 0;\n const fullSize = values.length * (values.length - 1) / 2;\n while (cnt < fullSize) {\n //const value = seq1List[mi] && seq1List[mj] ? hamming(seq1List[mi], seq1List[mj]) : 0;\n const value = !isNil(values[mi]) && !isNil(values[mj]) ?\n distanceFn(values[mi], values[mj]) : 1;\n const similarity = 1 - value;\n if (similarity >= threshold) {\n i.push(mi);\n j.push(mj);\n distances.push(value);\n }\n cnt++;\n mj++;\n if (mj === values.length) {\n mi++;\n mj = mi + 1;\n }\n }\n const iArray = new Int32Array(i);\n const jArray = new Int32Array(j);\n const distanceArray = new Float32Array(distances);\n return { i: iArray, j: jArray, distance: distanceArray };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBNEIsMEJBQTBCLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUUsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFhN0MsTUFBTSxPQUFPLG1CQUFtQjtJQUU1QjtRQUNFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQW9CLEVBQUUsT0FBdUIsRUFDeEUsU0FBaUIsRUFBRSxPQUE2QixDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQzdFLG9CQUErQywwQkFBMEIsQ0FBQyxTQUFTO1FBRW5GLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFMUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFNLENBQUMsQ0FBQztZQUM5QyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLElBQUksU0FBUyxHQUFHLFlBQVksRUFBRTtZQUM1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LENBQUMsQ0FBQztnQkFDWCxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNYLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdkI7WUFDRCxHQUFHLEVBQUUsQ0FBQztZQUNOLEVBQUUsRUFBRSxDQUFDO1lBQ0wsSUFBSSxFQUFFLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRTtnQkFDeEIsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDYjtTQUNGO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxhQUFhLEdBQUcsSUFBSSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbEQsT0FBTyxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFDLENBQUM7SUFDekQsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtLbm93bk1ldHJpY3N9IGZyb20gJy4uL3R5cGVkLW1ldHJpY3MnO1xuaW1wb3J0IHtEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kLCBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kc30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge2luc2VydFNtYWxsZXIsIGlzTmlsfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IHR5cGUgU3BhcnNlTWF0cml4UmVzdWx0ID0ge1xuICBpOiBJbnQzMkFycmF5LFxuICBqOiBJbnQzMkFycmF5LFxuICBkaXN0YW5jZTogRmxvYXQzMkFycmF5LFxuICBpZHg/OiBudW1iZXJcbn07XG5cbmV4cG9ydCB0eXBlIEtublJlc3VsdCA9IHtcbiAga25uRGlzdGFuY2VzOiBudW1iZXJbXVtdLFxuICBrbm5JbmRleGVzOiBudW1iZXJbXVtdXG59XG5leHBvcnQgY2xhc3MgU3BhcnNlTWF0cml4U2VydmljZSB7XG4gICAgcHJpdmF0ZSBfd29ya2VyQ291bnQ6IG51bWJlcjtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuX3dvcmtlckNvdW50ID0gTWF0aC5tYXgobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kgLSAyLCAxKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2FsY011bHRpQ29sdW1uKHZhbHVlczogQXJyYXk8YW55W10+LCBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSxcbiAgICAgIHRocmVzaG9sZDogbnVtYmVyLCBvcHRzOiB7W186IHN0cmluZ106IGFueX1bXSA9IFt7fV0sIHdlaWdodHM6IG51bWJlcltdID0gWzFdLFxuICAgICAgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU5cbiAgICApIHtcbiAgICAgIGNvbnN0IG1hdFNpemUgPSB2YWx1ZXNbMF0ubGVuZ3RoICogKHZhbHVlc1swXS5sZW5ndGggLSAxKSAvIDI7XG4gICAgICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKG1hdFNpemUgLyB0aGlzLl93b3JrZXJDb3VudCk7XG5cbiAgICAgIGNvbnN0IG1pblRocmVzaG9sZCA9IHZhbHVlc1swXS5sZW5ndGggPiAyMF8wMDAgP1xuICAgICAgICBhd2FpdCB0aGlzLmdldE1pbmltYWxUaHJlc2hvbGQodmFsdWVzLCBmbk5hbWVzLCBvcHRzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCkgOiAwO1xuICAgICAgaWYgKHRocmVzaG9sZCA8IG1pblRocmVzaG9sZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgdXNpbmcgdGhyZXNob2xkICR7bWluVGhyZXNob2xkfWApO1xuICAgICAgICB0aHJlc2hvbGQgPSBtaW5UaHJlc2hvbGQ7XG4gICAgICB9XG4gICAgICBvcHRzLmZvckVhY2goKF8sIGkpID0+IG9wdHNbaV1bJ3RocmVzaG9sZCddID0gdGhyZXNob2xkKTtcbiAgICAgIGNvbnN0IHByb21pc2VzID1cbiAgICAgICAgbmV3IEFycmF5PFByb21pc2U8U3BhcnNlTWF0cml4UmVzdWx0Pj4odGhpcy5fd29ya2VyQ291bnQpO1xuXG4gICAgICBjb25zdCB3b3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KVxuICAgICAgICAuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL3NwYXJzZS1tYXRyaXgtd29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSkpO1xuICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5fd29ya2VyQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgIHByb21pc2VzW2lkeF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBpZHggKiBjaHVua1NpemU7XG4gICAgICAgICAgY29uc3QgZW5kSWR4ID0gaWR4ID09PSB0aGlzLl93b3JrZXJDb3VudCAtIDEgPyBtYXRTaXplIDogKGlkeCArIDEpICogY2h1bmtTaXplO1xuICAgICAgICAgIGlmIChlbmRJZHggPD0gc3RhcnRJZHgpXG4gICAgICAgICAgICByZXNvbHZlV29ya2VyKHtpOiBuZXcgSW50MzJBcnJheSgwKSwgajogbmV3IEludDMyQXJyYXkoMCksIGRpc3RhbmNlOiBuZXcgRmxvYXQzMkFycmF5KDApLCBpZHh9KTtcbiAgICAgICAgICB3b3JrZXJzW2lkeF0ucG9zdE1lc3NhZ2Uoe3ZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgdGhyZXNob2xkLCBmbk5hbWVzLCBvcHRzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZH0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwgaSwgaiwgZGlzdGFuY2V9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7aSwgaiwgZGlzdGFuY2UsIGlkeH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgY29uc3QgZnVsbFNpemUgPSByZXN1bHRzLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHZhbC5pLmxlbmd0aCwgMCk7XG4gICAgICBjb25zdCBpID0gbmV3IEludDMyQXJyYXkoZnVsbFNpemUpO1xuICAgICAgY29uc3QgaiA9IG5ldyBJbnQzMkFycmF5KGZ1bGxTaXplKTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gbmV3IEZsb2F0MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgIC8vIHNldHRpbmcgdGhlIHJlc3VsdHNcbiAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaS5zZXQocmVzLmksIG9mZnNldCk7XG4gICAgICAgIGouc2V0KHJlcy5qLCBvZmZzZXQpO1xuICAgICAgICBkaXN0YW5jZS5zZXQocmVzLmRpc3RhbmNlLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gcmVzLmkubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtpLCBqLCBkaXN0YW5jZX07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNhbGM8VD4odmFsdWVzOiBBcnJheTxUPiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsIHRocmVzaG9sZDogbnVtYmVyLCBvcHRzOiB7W186IHN0cmluZ106IGFueX0gPSB7fSkge1xuICAgICAgLy9zaXplIG9mIGZ1bGwgbWF0cml4XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jYWxjTXVsdGlDb2x1bW4oW3ZhbHVlc10sIFtmbk5hbWVdLCB0aHJlc2hvbGQsIFtvcHRzXSwgWzFdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0S05OKFxuICAgICAgdmFsdWVzOiBBcnJheTxhbnk+LCBmbk5hbWU6IEtub3duTWV0cmljcywgbk5laWdoYm91cnM6IG51bWJlciA9IDE1LCBvcHRzOiB7W186IHN0cmluZ106IGFueX0gPSB7fVxuICAgICkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubXVsdGlDb2x1bW5LTk4oW3ZhbHVlc10sIFtmbk5hbWVdLCBuTmVpZ2hib3VycywgW29wdHNdLCBbMV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRUaHJlc2hvbGRLTk4oXG4gICAgICB2YWx1ZXM6IEFycmF5PGFueT4sIGZuTmFtZTogS25vd25NZXRyaWNzLCB0aHJlc2hvbGQ6IG51bWJlciA9IDAuOCwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9ID0ge31cbiAgICApIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm11bHRpQ29sdW1uVGhyZXNob2xkS25uKFt2YWx1ZXNdLCBbZm5OYW1lXSwgdGhyZXNob2xkLCBbb3B0c10sIFsxXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG11bHRpQ29sdW1uVGhyZXNob2xkS25uKHZhbHVlczogQXJyYXk8QXJyYXk8YW55Pj4sIGZuTmFtZXM6IEtub3duTWV0cmljc1tdLCB0aHJlc2hvbGQ6IG51bWJlciA9IDAuOCxcbiAgICAgIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fVtdLCB3ZWlnaHRzOiBudW1iZXJbXSxcbiAgICAgIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kID0gRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuRVVDTElERUFOXG4gICAgKSB7XG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCAhPT0gZm5OYW1lcy5sZW5ndGggfHwgdmFsdWVzLmxlbmd0aCAhPT0gb3B0cy5sZW5ndGggfHwgdmFsdWVzLmxlbmd0aCAhPT0gd2VpZ2h0cy5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmFsdWVzLCBkaXN0YW5jZSBmdW5jdGlvbnMsIG9wdGlvbnMgYW5kIHdlaWdodHMgYXJyYXlzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICBpZiAodmFsdWVzLnNvbWUoKHYpID0+IHYubGVuZ3RoICE9PSB2YWx1ZXNbMF0ubGVuZ3RoKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbGwgdmFsdWVzIGFycmF5cyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcblxuICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE1hdGguZmxvb3IobWF0U2l6ZSAvIHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgIGNvbnN0IHByb21pc2VzID1cbiAgICAgICAgbmV3IEFycmF5PFByb21pc2U8S25uUmVzdWx0Pj4odGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgY29uc3Qgd29ya2VycyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudClcbiAgICAgICAgLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9rbm4tdGhyZXNob2xkLXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcbiAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHRoaXMuX3dvcmtlckNvdW50OyBpZHgrKykge1xuICAgICAgICBwcm9taXNlc1tpZHhdID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBpZiAoZW5kSWR4IDw9IHN0YXJ0SWR4KVxuICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7a25uRGlzdGFuY2VzOiBuZXcgQXJyYXkoMCksIGtubkluZGV4ZXM6IG5ldyBBcnJheSgwKX0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7dmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCBmbk5hbWVzLCBvcHRzLCB0aHJlc2hvbGQsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kfSk7XG4gICAgICAgICAgd29ya2Vyc1tpZHhdLm9ubWVzc2FnZSA9ICh7ZGF0YToge2Vycm9yLCBrbm5EaXN0YW5jZXMsIGtubkluZGV4ZXN9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7a25uRGlzdGFuY2VzLCBrbm5JbmRleGVzfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICBjb25zdCBrbm5TaXplcyA9IG5ldyBJbnQzMkFycmF5KHZhbHVlc1swXS5sZW5ndGgpO1xuICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzdWx0cykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc1swXS5sZW5ndGg7ICsraSlcbiAgICAgICAgICBrbm5TaXplc1tpXSArPSByZXMua25uSW5kZXhlc1tpXT8ubGVuZ3RoID8/IDA7XG4gICAgICB9XG4gICAgICBjb25zdCBrbm5SZXM6IEtublJlc3VsdCA9IHtcbiAgICAgICAga25uRGlzdGFuY2VzOiBuZXcgQXJyYXkodmFsdWVzWzBdLmxlbmd0aCkuZmlsbChudWxsKS5tYXAoKF8sIGkpID0+IG5ldyBBcnJheTxudW1iZXI+KGtublNpemVzW2ldKSksXG4gICAgICAgIGtubkluZGV4ZXM6IG5ldyBBcnJheSh2YWx1ZXNbMF0ubGVuZ3RoKS5maWxsKG51bGwpLm1hcCgoXywgaSkgPT4gbmV3IEFycmF5PG51bWJlcj4oa25uU2l6ZXNbaV0pKX07XG4gICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzWzBdLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZXMua25uRGlzdGFuY2VzW2ldPy5sZW5ndGggPz8gMDsgKytqKSB7XG4gICAgICAgICAgICBrbm5SZXMua25uRGlzdGFuY2VzW2ldW2tublNpemVzW2ldIC0gMV0gPSByZXMua25uRGlzdGFuY2VzW2ldW2pdO1xuICAgICAgICAgICAga25uUmVzLmtubkluZGV4ZXNbaV1ba25uU2l6ZXNbaV0gLSAxXSA9IHJlcy5rbm5JbmRleGVzW2ldW2pdO1xuICAgICAgICAgICAga25uU2l6ZXNbaV0gLT0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBrbm5SZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG11bHRpQ29sdW1uS05OKHZhbHVlczogQXJyYXk8QXJyYXk8YW55Pj4sIGZuTmFtZXM6IEtub3duTWV0cmljc1tdLCBuTmVpZ2hib3VyczogbnVtYmVyID0gMTUsXG4gICAgICBvcHRzOiB7W186IHN0cmluZ106IGFueX1bXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTlxuICAgICkge1xuICAgICAgaWYgKHZhbHVlcy5sZW5ndGggIT09IGZuTmFtZXMubGVuZ3RoIHx8IHZhbHVlcy5sZW5ndGggIT09IG9wdHMubGVuZ3RoIHx8IHZhbHVlcy5sZW5ndGggIT09IHdlaWdodHMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhbHVlcywgZGlzdGFuY2UgZnVuY3Rpb25zLCBvcHRpb25zIGFuZCB3ZWlnaHRzIGFycmF5cyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcblxuICAgICAgaWYgKHZhbHVlcy5zb21lKCh2KSA9PiB2Lmxlbmd0aCAhPT0gdmFsdWVzWzBdLmxlbmd0aCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYWxsIHZhbHVlcyBhcnJheXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIGNvbnN0IG1hdFNpemUgPSB2YWx1ZXNbMF0ubGVuZ3RoICogKHZhbHVlc1swXS5sZW5ndGggLSAxKSAvIDI7XG4gICAgICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKG1hdFNpemUgLyB0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICBjb25zdCBwcm9taXNlcyA9XG4gICAgICAgIG5ldyBBcnJheTxQcm9taXNlPEtublJlc3VsdD4+KHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgIGNvbnN0IHdvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpXG4gICAgICAgIC5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4va25uLXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcbiAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHRoaXMuX3dvcmtlckNvdW50OyBpZHgrKykge1xuICAgICAgICBwcm9taXNlc1tpZHhdID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBpZiAoZW5kSWR4IDw9IHN0YXJ0SWR4KVxuICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7a25uRGlzdGFuY2VzOiBuZXcgQXJyYXkoMCksIGtubkluZGV4ZXM6IG5ldyBBcnJheSgwKX0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7dmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCBmbk5hbWVzLCBvcHRzLCBuTmVpZ2hib3Vycywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2R9KTtcbiAgICAgICAgICB3b3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHtkYXRhOiB7ZXJyb3IsIGtubkRpc3RhbmNlcywga25uSW5kZXhlc319KTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICByZWplY3RXb3JrZXIoZXJyb3IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHtrbm5EaXN0YW5jZXMsIGtubkluZGV4ZXN9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgIGNvbnN0IGtublJlczogS25uUmVzdWx0ID0ge1xuICAgICAgICBrbm5EaXN0YW5jZXM6IG5ldyBBcnJheSh2YWx1ZXNbMF0ubGVuZ3RoKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgQXJyYXk8bnVtYmVyPihuTmVpZ2hib3VycykuZmlsbCg5OTk5OSkpLFxuICAgICAgICBrbm5JbmRleGVzOiBuZXcgQXJyYXkodmFsdWVzWzBdLmxlbmd0aCkuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IEFycmF5PG51bWJlcj4obk5laWdoYm91cnMpLmZpbGwoLTEpKX07XG4gICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzWzBdLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZXMua25uRGlzdGFuY2VzW2ldPy5sZW5ndGggPz8gMDsgKytqKVxuICAgICAgICAgICAgaW5zZXJ0U21hbGxlcihrbm5SZXMua25uRGlzdGFuY2VzW2ldLCBrbm5SZXMua25uSW5kZXhlc1tpXSwgcmVzLmtubkRpc3RhbmNlc1tpXVtqXSwgcmVzLmtubkluZGV4ZXNbaV1bal0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ga25uUmVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRTYW1wbGVEaXN0YW5jZXModmFsdWVzOiBBcnJheTxhbnlbXT4sXG4gICAgICBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9W10gPSBbXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTik6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XG4gICAgICBjb25zdCB0aHJlc2hvbGRXb3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KS5maWxsKG51bGwpXG4gICAgICAgIC5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL3NwYXJzZS1tYXRyaXgtdGhyZXNob2xkLXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICBjb25zdCBtYXhTYW1wbGVTaXplID0gMV8wMDBfMDAwO1xuICAgICAgICBjb25zdCBzYW1wbGVTaXNlID0gTWF0aC5tYXgoTWF0aC5taW4obWF0U2l6ZSAvIDEwMDAsIG1heFNhbXBsZVNpemUpLCBNYXRoLm1pbihtYXRTaXplLCBtYXhTYW1wbGVTaXplKSk7XG4gICAgICAgIGNvbnN0IHRlc3RTZXRTaXplUGVyV29ya2VyID0gTWF0aC5mbG9vcihzYW1wbGVTaXNlIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICBjb25zdCB0UHJvbWlzZXMgPSBuZXcgQXJyYXk8UHJvbWlzZTx7ZGlzdGFuY2U6IEZsb2F0MzJBcnJheX0+Pih0aGlzLl93b3JrZXJDb3VudCk7XG5cbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5fd29ya2VyQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgICAgdFByb21pc2VzW2lkeF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGFydElkeCA9IGlkeCAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgIHRocmVzaG9sZFdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCBzYW1wbGVMZW5ndGg6IHRlc3RTZXRTaXplUGVyV29ya2VyLFxuICAgICAgICAgICAgICBmbk5hbWVzLCBvcHRzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJlc2hvbGRXb3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHtkYXRhOiB7ZXJyb3IsIGRpc3RhbmNlfX0pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgdGhyZXNob2xkV29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICBpZiAoZXJyb3IpIHJlamVjdFdvcmtlcihlcnJvcik7IGVsc2VcbiAgICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHtkaXN0YW5jZX0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbCh0UHJvbWlzZXMpO1xuICAgICAgICBjb25zdCBmdWxsU2l6ZSA9IHJlc3VsdHMucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjICsgdmFsLmRpc3RhbmNlLmxlbmd0aCwgMCk7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gbmV3IEZsb2F0MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgZGlzdGFuY2Uuc2V0KHJlcy5kaXN0YW5jZSwgb2Zmc2V0KTtcbiAgICAgICAgICBvZmZzZXQgKz0gcmVzLmRpc3RhbmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBkaXN0YW5jZS5zb3J0KCk7XG5cbiAgICAgICAgcmV0dXJuIGRpc3RhbmNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJlc2hvbGRXb3JrZXJzPy5mb3JFYWNoKCh3KSA9PiB3Py50ZXJtaW5hdGUoKSk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KDEpLmZpbGwoMC41KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldE1pbmltYWxUaHJlc2hvbGQodmFsdWVzOiBBcnJheTxhbnlbXT4sXG4gICAgICBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9W10gPSBbXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTikge1xuICAgICAgLy9XZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbWluaW1hbCB0aHJlc2hvbGQgZmlyc3QsXG4gICAgICAvL2luIG9yZGVyIHRvIGdldCBtYXRyaXggc3VjaCB0aGF0IGl0IGRvZXMgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBzaXplIG9mIDFHQlxuICAgICAgLy93ZSBoYXZlIDMgcmV0dXJuIGFycmF5cywgZWFjaCA0IGJpdGVzIHBlciBlbGVtZW50LCBzbyBpZiB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBtYXRyaXggaXMgMUdCLFxuICAgICAgY29uc3QgbWF4U3BhcnNlTWF0cml4U2l6ZSA9IDcwXzAwMF8wMDA7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzLmxlbmd0aCAqICh2YWx1ZXMubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGF3YWl0IHRoaXMuZ2V0U2FtcGxlRGlzdGFuY2VzKHZhbHVlcywgZm5OYW1lcywgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QpO1xuICAgICAgICBjb25zdCBmcmFjdGlvbkluZGV4ID0gTWF0aC5mbG9vcihtYXhTcGFyc2VNYXRyaXhTaXplIC8gbWF0U2l6ZSAqIGRpc3RhbmNlLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDEgLSBkaXN0YW5jZVtmcmFjdGlvbkluZGV4XTtcbiAgICAgICAgLy8gdGhyZXNob2xkID0gTWF0aC5tYXgodGhyZXNob2xkLCAwLjMpO1xuICAgICAgICByZXR1cm4gdGhyZXNob2xkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICByZXR1cm4gMC41O1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2FsY1N5bmM8VD4oXG4gICAgICB2YWx1ZXM6IEFycmF5PFQ+IHwgQXJyYXlMaWtlPFQ+LCBmbk5hbWU6IEtub3duTWV0cmljcywgZGlzdGFuY2VGbjogRnVuY3Rpb24sIHRocmVzaG9sZDogbnVtYmVyXG4gICAgKSB7XG4gICAgICBjb25zdCBpOiBudW1iZXJbXSA9IFtdO1xuICAgICAgY29uc3QgajogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlczogbnVtYmVyW10gPSBbXTtcbiAgICAgIGxldCBjbnQgPSAwO1xuICAgICAgbGV0IG1pID0gMDtcbiAgICAgIGxldCBtaiA9IDA7XG4gICAgICBjb25zdCBmdWxsU2l6ZSA9IHZhbHVlcy5sZW5ndGggKiAodmFsdWVzLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgIHdoaWxlIChjbnQgPCBmdWxsU2l6ZSkge1xuICAgICAgICAvL2NvbnN0IHZhbHVlID0gc2VxMUxpc3RbbWldICYmIHNlcTFMaXN0W21qXSA/IGhhbW1pbmcoc2VxMUxpc3RbbWldLCBzZXExTGlzdFttal0pIDogMDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAhaXNOaWwodmFsdWVzW21pXSkgJiYgIWlzTmlsKHZhbHVlc1ttal0pID9cbiAgICAgICAgICBkaXN0YW5jZUZuKHZhbHVlc1ttaV0sIHZhbHVlc1ttal0pIDogMTtcbiAgICAgICAgY29uc3Qgc2ltaWxhcml0eSA9IDEgLSB2YWx1ZTtcbiAgICAgICAgaWYgKHNpbWlsYXJpdHkgPj0gdGhyZXNob2xkKSB7XG4gICAgICAgICAgaS5wdXNoKG1pKTtcbiAgICAgICAgICBqLnB1c2gobWopO1xuICAgICAgICAgIGRpc3RhbmNlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjbnQrKztcbiAgICAgICAgbWorKztcbiAgICAgICAgaWYgKG1qID09PSB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgbWkrKztcbiAgICAgICAgICBtaiA9IG1pICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpQXJyYXkgPSBuZXcgSW50MzJBcnJheShpKTtcbiAgICAgIGNvbnN0IGpBcnJheSA9IG5ldyBJbnQzMkFycmF5KGopO1xuICAgICAgY29uc3QgZGlzdGFuY2VBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoZGlzdGFuY2VzKTtcblxuICAgICAgcmV0dXJuIHtpOiBpQXJyYXksIGo6IGpBcnJheSwgZGlzdGFuY2U6IGRpc3RhbmNlQXJyYXl9O1xuICAgIH1cbn1cbiJdfQ==","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=="],"names":["SparseMatrixService","constructor","this","_workerCount","Math","max","navigator","hardwareConcurrency","async","values","fnNames","threshold","opts","weights","aggregationMethod","EUCLIDEAN","matSize","length","chunkSize","floor","minThreshold","getMinimalThreshold","console","log","forEach","_","i","promises","Array","workers","fill","map","Worker","URL","idx","Promise","resolveWorker","rejectWorker","startIdx","endIdx","Int32Array","j","distance","Float32Array","postMessage","onmessage","data","error","terminate","results","all","fullSize","reduce","acc","val","offset","res","set","fnName","calcMultiColumn","nNeighbours","multiColumnKNN","multiColumnThresholdKnn","Error","some","v","knnDistances","knnIndexes","knnSizes","knnRes","thresholdWorkers","maxSampleSize","sampleSise","min","testSetSizePerWorker","tPromises","sampleLength","sort","e","w","getSampleDistances","static","distanceFn","distances","cnt","mi","mj","value","push","DistanceAggregationMethods"],"sourceRoot":""}
package/dist/709.js CHANGED
@@ -1,2 +1,2 @@
1
- var bio;(()=>{"use strict";var t,e,r={2357:(t,e,r)=>{var o=r(2590);async function n(t,e,r){const o=t.length,n=[],s=[];for(let a=0;a<o;a++)for(let l=a+1;l<o;l++){const o=t[a],i=t[l];e[o]?.[i]>=r&&(n.push(a),s.push(l))}return function(t,e,r){const o=new Float32Array(r.length).fill(0).map((()=>10*Math.random())),n=new Float32Array(r.length).fill(0).map((()=>10*Math.random())),s=new Float32Array(r.length).fill(0),a=new Float32Array(r.length).fill(0);for(let l=0;l<100;l++){const i=1-l/100;s.fill(0),a.fill(0);for(let r=0;r<t.length;r++){const l=t[r],c=e[r],f=o[l]-o[c],h=n[l]-n[c];Math.abs(f)>=1&&(s[l]-=i*f,s[c]+=i*f),Math.abs(h)>=1&&(a[l]-=i*h,a[c]+=i*h)}for(let t=0;t<r.length;t++){const e=Math.sqrt(s[t]*s[t]+a[t]*a[t]);e>0&&(o[t]+=s[t]/e*i,n[t]+=a[t]/e*i)}}let l=o[0],i=n[0],c=o[0],f=n[0];for(let t=1;t<r.length;t++)l=Math.min(l,o[t]),i=Math.min(i,n[t]),c=Math.max(c,o[t]),f=Math.max(f,n[t]);let h=c-l,u=f-i;0===h&&(h=c);for(let t=0;t<r.length;t++)o[t]=(o[t]-l)/h/2+.5;0===u&&(u=f);for(let t=0;t<r.length;t++)n[t]=(n[t]-i)/u/2+.5;return{embedX:o,embedY:n}}(n,s,t)}const s={expandFactor:2,maxIterations:5,inflateFactor:2,multFactor:1};class a{_options;constructor(t={}){this._options={...s,...t}}async transform(t,e){let r=this.toObjectForm(t);if(this._options.maxIterations>0){this.addLoops(r,e),this.normalize(r);for(let t=0;t<this._options.maxIterations;t++)r=this.expand(r,e),this.inflate(r),this.normalize(r)}const{clusters:o,is:n,js:s}=this.assignClusters(r,e);this.correctClusters(o);const a=await this.layout(o,r,e);return{clusters:o,embedX:a.embedX,embedY:a.embedY,is:n,js:s}}correctClusters(t){const e={};for(const r of t)e[r]||(e[r]=0),e[r]++;const r=Object.keys(e).map(Number).sort(((t,r)=>e[t]-e[r])),o={};r.forEach(((t,e)=>o[t]=e+1));for(let e=0;e<t.length;e++)t[e]=o[t[e]]}async layout(t,e,r){const o=new Float32Array(r).fill(0),s=new Float32Array(r).fill(0),a={};t.forEach(((t,e)=>{a[t]||(a[t]=[]),a[t].push(e)}));let l=0;const i=Object.keys(a);i.sort(((t,e)=>a[e].length-a[t].length));let c=6,f=0;for(const t of i){const r=a[t],i=await n(r,e,.001);l===Math.ceil(c/1.5)&&(l=0,f+=5/c,c=Math.ceil(1.5*c));const h=l%c*5/c*1.5;for(let t=0;t<i.embedX.length;t++)o[r[t]]=5*i.embedX[t]/c+h,s[r[t]]=5*i.embedY[t]/c+f;l++}return{embedX:o,embedY:s}}mergeClusters(t,e,r){const o=t[e],n=t[r];for(let e=0;e<t.length;e++)t[e]===n&&(t[e]=o)}assignClusters(t,e){let r=0;const o=[],n=[],s=Math.floor(Math.max(Math.log10(e),2))+1,a=Math.pow(10,s),l=new Array(e).fill(-1);for(const e of Object.keys(t))for(const s of Object.keys(t[e]))Math.round(t[e][s]*a)/a>0&&t[e][s]!==Number(e)&&Number(s)>Number(e)&&(o.push(Number(e)),n.push(Number(s)),-1!==l[Number(e)]&&-1!==l[Number(s)]?l[Number(e)]!==l[Number(s)]&&this.mergeClusters(l,Number(e),Number(s)):-1!==l[Number(e)]?l[Number(s)]=l[Number(e)]:-1!==l[Number(s)]?l[Number(e)]=l[Number(s)]:(r++,l[Number(e)]=r,l[Number(s)]=r));for(let t=0;t<l.length;t++)-1===l[t]&&(r++,l[t]=r);return{clusters:l,is:o,js:n}}toObjectForm(t){const e={};for(let r=0;r<t.i.length;r++)e[t.i[r]]||(e[t.i[r]]={}),e[t.i[r]][t.j[r]]=1-t.distance[r],e[t.j[r]]||(e[t.j[r]]={}),e[t.j[r]][t.i[r]]=1-t.distance[r];return e}addLoops(t,e){for(let r=0;r<e;r++)t[r]||(t[r]={}),t[r][r]=this._options.multFactor}normalize(t){for(const e of Object.keys(t)){const r=t[e];let o=0;for(const t of Object.keys(r))o+=r[t];if(0!==o)for(const n of Object.keys(r))t[e][n]/=o}}expand(t,e){const r={},o=Math.floor(Math.max(Math.log10(e),2))+1,n=Math.pow(10,o);for(let o=0;o<e;o++)if(t[o]){r[o]={};for(let s=o;s<e;s++){if(!t[o]?.[s])continue;const e=this.getExpandValue(t,o,s);Math.round(e*n)/n>0&&(r[o][s]=e,r[s]||(r[s]={}),r[s][o]=e)}}return r}inflate(t){for(const e of Object.keys(t)){const r=t[e];for(const o of Object.keys(r))t[e][o]=Math.pow(t[e][o],this._options.inflateFactor)}}getExpandValue(t,e,r){let o=0;const n=Object.keys(t[e]??{}),s=Object.keys(t[r]??{});for(const a of n)s.includes(a)&&(o+=t[e][a]*t[r][a]);return o}}onmessage=async t=>{const{data:e,threshold:r,weights:n,aggregationMethod:s,distanceFnArgs:l,distanceFns:i,maxIterations:c}=t.data,f=await(new o._).calcMultiColumn(e,i,r/100,l,n,s),h=await new a({maxIterations:c??5}).transform(f,e[0].length);postMessage({res:h})}},6814:(t,e,r)=>{r.d(e,{cZ:()=>n,kK:()=>o}),r(7862);const o=t=>null==t;function n(t,e,r,o){if(r>t[t.length-1])return;const n=t.findIndex((t=>r<t));t.pop(),t.splice(n,0,r),e.pop(),e.splice(n,0,o)}}},o={};function n(t){var e=o[t];if(void 0!==e)return e.exports;var s=o[t]={exports:{}};return r[t](s,s.exports,n),s.exports}n.m=r,n.x=()=>{var t=n.O(void 0,[590],(()=>n(2357)));return n.O(t)},t=[],n.O=(e,r,o,s)=>{if(!r){var a=1/0;for(f=0;f<t.length;f++){for(var[r,o,s]=t[f],l=!0,i=0;i<r.length;i++)(!1&s||a>=s)&&Object.keys(n.O).every((t=>n.O[t](r[i])))?r.splice(i--,1):(l=!1,s<a&&(a=s));if(l){t.splice(f--,1);var c=o();void 0!==c&&(e=c)}}return e}s=s||0;for(var f=t.length;f>0&&t[f-1][2]>s;f--)t[f]=t[f-1];t[f]=[r,o,s]},n.d=(t,e)=>{for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.f={},n.e=t=>Promise.all(Object.keys(n.f).reduce(((e,r)=>(n.f[r](t,e),e)),[])),n.u=t=>t+".js",n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{var t;n.g.importScripts&&(t=n.g.location+"");var e=n.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var r=e.getElementsByTagName("script");if(r.length)for(var o=r.length-1;o>-1&&!t;)t=r[o--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=t})(),(()=>{n.b=self.location+"";var t={709:1};n.f.i=(e,r)=>{t[e]||importScripts(n.p+n.u(e))};var e=self.webpackChunkbio=self.webpackChunkbio||[],r=e.push.bind(e);e.push=e=>{var[o,s,a]=e;for(var l in s)n.o(s,l)&&(n.m[l]=s[l]);for(a&&a(n);o.length;)t[o.pop()]=1;r(e)}})(),e=n.x,n.x=()=>n.e(590).then(e);var s=n.x();bio=s})();
1
+ var bio;(()=>{"use strict";var t,e,r={2357:(t,e,r)=>{var o=r(2590);async function n(t,e,r){const o=t.length,n=[],s=[];for(let a=0;a<o;a++)for(let l=a+1;l<o;l++){const o=t[a],i=t[l];e[o]?.[i]>=r&&(n.push(a),s.push(l))}return function(t,e,r){const o=new Float32Array(r.length).fill(0).map((()=>10*Math.random())),n=new Float32Array(r.length).fill(0).map((()=>10*Math.random())),s=new Float32Array(r.length).fill(0),a=new Float32Array(r.length).fill(0);for(let l=0;l<100;l++){const i=1-l/100;s.fill(0),a.fill(0);for(let r=0;r<t.length;r++){const l=t[r],c=e[r],f=o[l]-o[c],h=n[l]-n[c];Math.abs(f)>=1&&(s[l]-=i*f,s[c]+=i*f),Math.abs(h)>=1&&(a[l]-=i*h,a[c]+=i*h)}for(let t=0;t<r.length;t++){const e=Math.sqrt(s[t]*s[t]+a[t]*a[t]);e>0&&(o[t]+=s[t]/e*i,n[t]+=a[t]/e*i)}}let l=o[0],i=n[0],c=o[0],f=n[0];for(let t=1;t<r.length;t++)l=Math.min(l,o[t]),i=Math.min(i,n[t]),c=Math.max(c,o[t]),f=Math.max(f,n[t]);let h=c-l,u=f-i;0===h&&(h=c);for(let t=0;t<r.length;t++)o[t]=(o[t]-l)/h/2+.5;0===u&&(u=f);for(let t=0;t<r.length;t++)n[t]=(n[t]-i)/u/2+.5;return{embedX:o,embedY:n}}(n,s,t)}const s={expandFactor:2,maxIterations:5,inflateFactor:2,multFactor:1};class a{constructor(t={}){this._options={...s,...t}}async transform(t,e){let r=this.toObjectForm(t);if(this._options.maxIterations>0){this.addLoops(r,e),this.normalize(r);for(let t=0;t<this._options.maxIterations;t++)r=this.expand(r,e),this.inflate(r),this.normalize(r)}const{clusters:o,is:n,js:s}=this.assignClusters(r,e);this.correctClusters(o);const a=await this.layout(o,r,e);return{clusters:o,embedX:a.embedX,embedY:a.embedY,is:n,js:s}}correctClusters(t){const e={};for(const r of t)e[r]||(e[r]=0),e[r]++;const r=Object.keys(e).map(Number).sort(((t,r)=>e[t]-e[r])),o={};r.forEach(((t,e)=>o[t]=e+1));for(let e=0;e<t.length;e++)t[e]=o[t[e]]}async layout(t,e,r){const o=new Float32Array(r).fill(0),s=new Float32Array(r).fill(0),a={};t.forEach(((t,e)=>{a[t]||(a[t]=[]),a[t].push(e)}));let l=0;const i=Object.keys(a);i.sort(((t,e)=>a[e].length-a[t].length));let c=6,f=0;for(const t of i){const r=a[t],i=await n(r,e,.001);l===Math.ceil(c/1.5)&&(l=0,f+=5/c,c=Math.ceil(1.5*c));const h=l%c*5/c*1.5;for(let t=0;t<i.embedX.length;t++)o[r[t]]=5*i.embedX[t]/c+h,s[r[t]]=5*i.embedY[t]/c+f;l++}return{embedX:o,embedY:s}}mergeClusters(t,e,r){const o=t[e],n=t[r];for(let e=0;e<t.length;e++)t[e]===n&&(t[e]=o)}assignClusters(t,e){let r=0;const o=[],n=[],s=Math.floor(Math.max(Math.log10(e),2))+1,a=Math.pow(10,s),l=new Array(e).fill(-1);for(const e of Object.keys(t))for(const s of Object.keys(t[e]))Math.round(t[e][s]*a)/a>0&&t[e][s]!==Number(e)&&Number(s)>Number(e)&&(o.push(Number(e)),n.push(Number(s)),-1!==l[Number(e)]&&-1!==l[Number(s)]?l[Number(e)]!==l[Number(s)]&&this.mergeClusters(l,Number(e),Number(s)):-1!==l[Number(e)]?l[Number(s)]=l[Number(e)]:-1!==l[Number(s)]?l[Number(e)]=l[Number(s)]:(r++,l[Number(e)]=r,l[Number(s)]=r));for(let t=0;t<l.length;t++)-1===l[t]&&(r++,l[t]=r);return{clusters:l,is:o,js:n}}toObjectForm(t){const e={};for(let r=0;r<t.i.length;r++)e[t.i[r]]||(e[t.i[r]]={}),e[t.i[r]][t.j[r]]=1-t.distance[r],e[t.j[r]]||(e[t.j[r]]={}),e[t.j[r]][t.i[r]]=1-t.distance[r];return e}addLoops(t,e){for(let r=0;r<e;r++)t[r]||(t[r]={}),t[r][r]=this._options.multFactor}normalize(t){for(const e of Object.keys(t)){const r=t[e];let o=0;for(const t of Object.keys(r))o+=r[t];if(0!==o)for(const n of Object.keys(r))t[e][n]/=o}}expand(t,e){const r={},o=Math.floor(Math.max(Math.log10(e),2))+1,n=Math.pow(10,o);for(let o=0;o<e;o++)if(t[o]){r[o]={};for(let s=o;s<e;s++){if(!t[o]?.[s])continue;const e=this.getExpandValue(t,o,s);Math.round(e*n)/n>0&&(r[o][s]=e,r[s]||(r[s]={}),r[s][o]=e)}}return r}inflate(t){for(const e of Object.keys(t)){const r=t[e];for(const o of Object.keys(r))t[e][o]=Math.pow(t[e][o],this._options.inflateFactor)}}getExpandValue(t,e,r){let o=0;const n=Object.keys(t[e]??{}),s=Object.keys(t[r]??{});for(const a of n)s.includes(a)&&(o+=t[e][a]*t[r][a]);return o}}onmessage=async t=>{const{data:e,threshold:r,weights:n,aggregationMethod:s,distanceFnArgs:l,distanceFns:i,maxIterations:c}=t.data,f=await(new o._).calcMultiColumn(e,i,r/100,l,n,s),h=await new a({maxIterations:c??5}).transform(f,e[0].length);postMessage({res:h})}},6814:(t,e,r)=>{r.d(e,{cZ:()=>n,kK:()=>o}),r(7862);const o=t=>null==t;function n(t,e,r,o){if(r>t[t.length-1])return;const n=t.findIndex((t=>r<t));t.pop(),t.splice(n,0,r),e.pop(),e.splice(n,0,o)}}},o={};function n(t){var e=o[t];if(void 0!==e)return e.exports;var s=o[t]={exports:{}};return r[t](s,s.exports,n),s.exports}n.m=r,n.x=()=>{var t=n.O(void 0,[590],(()=>n(2357)));return n.O(t)},t=[],n.O=(e,r,o,s)=>{if(!r){var a=1/0;for(f=0;f<t.length;f++){for(var[r,o,s]=t[f],l=!0,i=0;i<r.length;i++)(!1&s||a>=s)&&Object.keys(n.O).every((t=>n.O[t](r[i])))?r.splice(i--,1):(l=!1,s<a&&(a=s));if(l){t.splice(f--,1);var c=o();void 0!==c&&(e=c)}}return e}s=s||0;for(var f=t.length;f>0&&t[f-1][2]>s;f--)t[f]=t[f-1];t[f]=[r,o,s]},n.d=(t,e)=>{for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.f={},n.e=t=>Promise.all(Object.keys(n.f).reduce(((e,r)=>(n.f[r](t,e),e)),[])),n.u=t=>t+".js",n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{var t;n.g.importScripts&&(t=n.g.location+"");var e=n.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var r=e.getElementsByTagName("script");if(r.length)for(var o=r.length-1;o>-1&&!t;)t=r[o--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=t})(),(()=>{n.b=self.location+"";var t={709:1};n.f.i=(e,r)=>{t[e]||importScripts(n.p+n.u(e))};var e=self.webpackChunkbio=self.webpackChunkbio||[],r=e.push.bind(e);e.push=e=>{var[o,s,a]=e;for(var l in s)n.o(s,l)&&(n.m[l]=s[l]);for(a&&a(n);o.length;)t[o.pop()]=1;r(e)}})(),e=n.x,n.x=()=>n.e(590).then(e);var s=n.x();bio=s})();
2
2
  //# sourceMappingURL=709.js.map