@jax-data-science/sci-image-visualizer 0.16.0 → 0.18.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 (127) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +4 -2
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
  4. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
  9. package/esm2022/lib/geometry/place.mjs +47 -0
  10. package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
  11. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
  12. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
  13. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  14. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +86 -18
  15. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
  16. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +343 -18
  17. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +427 -0
  18. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +11 -4
  19. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
  20. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
  21. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +35 -8
  22. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
  23. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +136 -28
  24. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +19 -3
  25. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +188 -52
  26. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +35 -11
  27. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
  28. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
  29. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
  30. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
  31. package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
  32. package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
  33. package/esm2022/lib/region-source/region-tiles.mjs +1 -1
  34. package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
  35. package/esm2022/lib/routing-visualizer.service.mjs +404 -7
  36. package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
  37. package/esm2022/lib/spatial/plane-cells.mjs +119 -0
  38. package/esm2022/lib/spatial/spatial-controls.facade.mjs +304 -8
  39. package/esm2022/lib/spatial/spatial-encoding.mjs +52 -3
  40. package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
  41. package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
  42. package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
  43. package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
  44. package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
  45. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
  46. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +6 -2
  47. package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
  48. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +51 -12
  49. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +7 -3
  50. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +21 -6
  51. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +94 -13
  52. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  53. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  54. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
  55. package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
  56. package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
  57. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
  58. package/esm2022/lib/store/region-source-scope.mjs +10 -1
  59. package/esm2022/lib/store/region-store.service.mjs +33 -2
  60. package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
  61. package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
  62. package/esm2022/lib/visualizer.component.mjs +40 -4
  63. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4838 -656
  64. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs.map +1 -0
  65. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs} +2 -2
  66. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs.map} +1 -1
  67. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  68. package/fesm2022/region-source.worker.js +84 -2
  69. package/lib/contracts/display-types.d.ts +99 -6
  70. package/lib/contracts/image.contract.d.ts +6 -0
  71. package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
  72. package/lib/contracts/region-editor-api.contract.d.ts +9 -0
  73. package/lib/contracts/region-store.contract.d.ts +6 -0
  74. package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
  75. package/lib/contracts/visualizer.contract.d.ts +43 -1
  76. package/lib/geometry/cell-meshes.d.ts +27 -0
  77. package/lib/geometry/place.d.ts +45 -0
  78. package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
  79. package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
  80. package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
  81. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
  82. package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
  83. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +89 -0
  84. package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +103 -0
  85. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +9 -2
  86. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
  87. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
  88. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +20 -6
  89. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
  90. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +48 -16
  91. package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
  92. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +54 -1
  93. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
  94. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
  95. package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
  96. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
  97. package/lib/region-editor/region-editor.component.d.ts +4 -0
  98. package/lib/region-source/region-source-ops.d.ts +12 -0
  99. package/lib/region-source/region-tiles.d.ts +8 -0
  100. package/lib/region-source/worker-region-source.d.ts +18 -0
  101. package/lib/routing-visualizer.service.d.ts +140 -1
  102. package/lib/spatial/observations-in-selection.d.ts +43 -0
  103. package/lib/spatial/plane-cells.d.ts +37 -0
  104. package/lib/spatial/spatial-controls.facade.d.ts +59 -0
  105. package/lib/spatial/spatial-encoding.d.ts +24 -1
  106. package/lib/spatial/spatial-hover.d.ts +23 -0
  107. package/lib/spatial/spatial-planes.d.ts +22 -0
  108. package/lib/spatial/spatial-selection.d.ts +2 -1
  109. package/lib/spatial/spatial-tile-merge.d.ts +9 -0
  110. package/lib/spatial/transcripts-in-selection.d.ts +95 -0
  111. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
  112. package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
  113. package/lib/spatial-controls/spatial-controls.component.d.ts +19 -2
  114. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +3 -1
  115. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +7 -0
  116. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +28 -7
  117. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
  118. package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
  119. package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
  120. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
  121. package/lib/store/region-source-scope.d.ts +4 -0
  122. package/lib/store/region-store.service.d.ts +21 -0
  123. package/lib/toolbar/toolbar.component.d.ts +6 -1
  124. package/lib/visualizer/spatial-region-set.d.ts +55 -0
  125. package/lib/visualizer.component.d.ts +14 -0
  126. package/package.json +2 -2
  127. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs.map +0 -1
@@ -121,6 +121,43 @@ export function filterTranscripts(t, px, hidden, hiddenGenes) {
121
121
  px: pick(px),
122
122
  };
123
123
  }
124
+ /**
125
+ * The transcripts of a tile whose z lies in `band` (`[lo, hi)`, see `planeBand`), with their
126
+ * marker sizes: the 2D view of one plane of a 3D assay. An aggregated entry stands for transcripts
127
+ * at several depths, so a tile of them is kept whole.
128
+ */
129
+ export function transcriptsInBand(t, px, band) {
130
+ if (t.aggregated)
131
+ return { merged: t, px };
132
+ const keep = [];
133
+ for (let i = 0; i < t.count; i++) {
134
+ const z = t.z[i];
135
+ if (Number.isFinite(z) && z >= band[0] && z < band[1])
136
+ keep.push(i);
137
+ }
138
+ if (keep.length === t.count)
139
+ return { merged: t, px };
140
+ const pick = (a) => {
141
+ const out = new a.constructor(keep.length);
142
+ keep.forEach((i, k) => {
143
+ out[k] = a[i];
144
+ });
145
+ return out;
146
+ };
147
+ return {
148
+ merged: {
149
+ count: keep.length,
150
+ aggregated: false,
151
+ x: pick(t.x),
152
+ y: pick(t.y),
153
+ z: pick(t.z),
154
+ weight: pick(t.weight),
155
+ observation: pick(t.observation),
156
+ gene: pick(t.gene),
157
+ },
158
+ px: pick(px),
159
+ };
160
+ }
124
161
  /** The median of `v`, from a sample of about 1024 values. */
125
162
  export function median(v) {
126
163
  if (!v.length)
@@ -257,4 +294,4 @@ export function clusterMarkers(rasters, slots, bin, area) {
257
294
  group: Int32Array.from(group),
258
295
  };
259
296
  }
260
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC10aWxlLW1lcmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtdGlsZS1tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFHSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDakUsT0FBTyxFQUNMLFdBQVcsRUFDWCxjQUFjLEdBSWYsTUFBTSx1Q0FBdUMsQ0FBQztBQUcvQyxrRUFBa0U7QUFDbEUsTUFBTSxVQUFVLFdBQVcsQ0FDekIsS0FBeUIsRUFDekIsTUFBeUQ7SUFFekQsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxQixNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFDMUIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxJQUFJLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQUUsU0FBUztRQUMxRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2IsUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxD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QyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3BELElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUM3QjtRQUNELEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVyZ2luZyBhbmQgZmlsdGVyaW5nIG9mIHRoZSBzcGF0aWFsLXRpbGUgd2lyZSBmb3JtYXQgKG9ic2VydmF0aW9uIGlkcywgTk9fQ0FURUdPUlkpOiB0aGVcbiAqIHBpZWNlcyBvZiB0aGUgMkQgdmlldydzIHRpbGUgbG9vcCB0aGF0IGFyZSBwdXJlIOKAlCBjb25jYXRlbmF0aW5nIHRpbGVzLCBkcm9wcGluZyBoaWRkZW5cbiAqIGdyb3VwcyBhbmQgZ2VuZXMsIGFuZCB0aGUgZGVuc2l0eS1ncmlkIG1hcmtlcnMgb2YgYSB6b29tZWQtb3V0IGdlbmUgc2VsZWN0aW9uLlxuICpcbiAqIFRoZXNlIHdvcmsgb24gU0lWJ3Mgb3duIHRpbGUgY29udHJhY3QsIHNvIHRoZXkgc3RheSBpbiBTSVYgcmF0aGVyIHRoYW4gbW92aW5nIHRvIG5hcGFyaS1qcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBBTExfR0VORVMgfSBmcm9tICcuLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHtcbiAgTk9fQ0FURUdPUlksXG4gIE5PX09CU0VSVkFUSU9OLFxuICBTcGF0aWFsRGVuc2l0eVJhc3RlcixcbiAgU3BhdGlhbFBvbHlnb25UaWxlLFxuICBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG59IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBEYXRhUmVjdCB9IGZyb20gJy4vbG9kJztcblxuLyoqIFJpbmdzIHdob3NlIG93bmluZyBjZWxsIGlzIGluIGEgc3dpdGNoZWQtb2ZmIGdyb3VwIHJlbW92ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyUmluZ3MoXG4gIHJpbmdzOiBTcGF0aWFsUG9seWdvblRpbGUsXG4gIGhpZGRlbjogeyBjb2RlczogVWludDE2QXJyYXk7IGhpZGRlbjogVWludDhBcnJheSB9IHwgbnVsbCxcbik6IFNwYXRpYWxQb2x5Z29uVGlsZSB7XG4gIGlmICghaGlkZGVuKSByZXR1cm4gcmluZ3M7XG4gIGNvbnN0IGtlZXA6IG51bWJlcltdID0gW107XG4gIGxldCB2ZXJ0aWNlcyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmluZ3MuY291bnQ7IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBoaWRkZW4uY29kZXNbcmluZ3Mub2JzZXJ2YXRpb25baV1dO1xuICAgIGlmIChjb2RlICE9PSBOT19DQVRFR09SWSAmJiBoaWRkZW4uaGlkZGVuW2NvZGVdKSBjb250aW51ZTtcbiAgICBrZWVwLnB1c2goaSk7XG4gICAgdmVydGljZXMgKz0gcmluZ3Mub2Zmc2V0c1tpICsgMV0gLSByaW5ncy5vZmZzZXRzW2ldO1xuICB9XG4gIGlmIChrZWVwLmxlbmd0aCA9PT0gcmluZ3MuY291bnQpIHJldHVybiByaW5ncztcbiAgY29uc3Qgb2JzZXJ2YXRpb24gPSBuZXcgVWludDMyQXJyYXkoa2VlcC5sZW5ndGgpO1xuICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KGtlZXAubGVuZ3RoICsgMSk7XG4gIGNvbnN0IGNvb3JkcyA9IG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXMgKiAyKTtcbiAgbGV0IHYgPSAwO1xuICBrZWVwLmZvckVhY2goKGksIHIpID0+IHtcbiAgICBvYnNlcnZhdGlvbltyXSA9IHJpbmdzLm9ic2VydmF0aW9uW2ldO1xuICAgIG9mZnNldHNbcl0gPSB2O1xuICAgIGNvbnN0IGEgPSByaW5ncy5vZmZzZXRzW2ldICogMjtcbiAgICBjb25zdCBiID0gcmluZ3Mub2Zmc2V0c1tpICsgMV0gKiAyO1xuICAgIGNvb3Jkcy5zZXQocmluZ3MuY29vcmRzLnN1YmFycmF5KGEsIGIpLCB2ICogMik7XG4gICAgdiArPSAoYiAtIGEpIC8gMjtcbiAgfSk7XG4gIG9mZnNldHNba2VlcC5sZW5ndGhdID0gdjtcbiAgcmV0dXJuIHsgY291bnQ6IGtlZXAubGVuZ3RoLCBvYnNlcnZhdGlvbiwgb2Zmc2V0cywgY29vcmRzIH07XG59XG5cbi8qKiBTbG90cyAoaW5kaWNlcyBpbnRvIHRoZSBzZWxlY3RlZCBnZW5lcykgc3dpdGNoZWQgb2ZmIHdpdGggdGhlaXIgZXllIHRvZ2dsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaWRkZW5HZW5lU2xvdHModmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgaWYgKCF2aWV3LnRyYW5zY3JpcHRIaWRkZW5HZW5lcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICBjb25zdCBvZmYgPSBuZXcgU2V0KHZpZXcudHJhbnNjcmlwdEhpZGRlbkdlbmVzKTtcbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbSh2aWV3LnRyYW5zY3JpcHRHZW5lcywgKGcpID0+IChvZmYuaGFzKGcpID8gMSA6IDApKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIFwiQWxsIGdlbmVzXCIgaXMgc3dpdGNoZWQgb2ZmIGFzIGEgd2hvbGUgd2l0aCB0aGUgZ2VuZSB0cmVlJ3Mgcm9vdCBleWU6IGl0cyBoaWRkZW5cbiAqIGxpc3QgaXMgYFtBTExfR0VORVNdYCAoZXZlcnkgZ2VuZSBoaWRkZW4sIG5vbmUgZXhjZXB0ZWQpLiBIaWRpbmcgZXZlcnkgZ2VuZSBieSBuYW1lIHdvdWxkXG4gKiBuZWVkIHRoZSBnZW5lIGxpc3QsIHdoaWNoIGEgZGF0YXNldCBuZWVkIG5vdCBoYXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsR2VuZXNIaWRkZW4oXG4gIHZpZXc6IFBpY2s8U3BhdGlhbFZpZXdTdGF0ZSwgJ3RyYW5zY3JpcHRBbGxHZW5lcycgfCAndHJhbnNjcmlwdEFsbEdlbmVzSGlkZGVuJz4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzICYmIGV2ZXJ5R2VuZU9mZih2aWV3LnRyYW5zY3JpcHRBbGxHZW5lc0hpZGRlbik7XG59XG5cbi8qKiBXaGV0aGVyIGFuIFwiQWxsIGdlbmVzXCIgaGlkZGVuIGxpc3QgaGlkZXMgZXZlcnkgZ2VuZSwgbm9uZSBleGNlcHRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVyeUdlbmVPZmYob2ZmOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2ZmLmxlbmd0aCA9PT0gMSAmJiBvZmZbMF0gPT09IEFMTF9HRU5FUztcbn1cblxuLyoqIFdoZXRoZXIgYSBnZW5lIG9mIFwiQWxsIGdlbmVzXCIgaXMgZHJhd24sIGJ5IGl0cyBoaWRkZW4gbGlzdCAoc2VlIGB0cmFuc2NyaXB0QWxsR2VuZXNIaWRkZW5gKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGxHZW5lU2hvd25CeShvZmY6IHJlYWRvbmx5IHN0cmluZ1tdKTogKGdlbmU6IHN0cmluZykgPT4gYm9vbGVhbiB7XG4gIGNvbnN0IGxpc3RlZCA9IG5ldyBTZXQob2ZmKTtcbiAgY29uc3QgZXhjZXB0ID0gb2ZmWzBdID09PSBBTExfR0VORVM7XG4gIHJldHVybiAoZ2VuZSkgPT4gbGlzdGVkLmhhcyhnZW5lKSA9PT0gZXhjZXB0O1xufVxuXG4vKiogXCJBbGwgZ2VuZXNcIidzIGhpZGRlbiBsaXN0IHdpdGggYGdlbmVgIHNob3duIChgb25gKSBvciBoaWRkZW4sIGluIHRoZSBsaXN0J3Mgb3duIGZvcm0uICovXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlQWxsR2VuZUhpZGRlbihvZmY6IHJlYWRvbmx5IHN0cmluZ1tdLCBnZW5lOiBzdHJpbmcsIG9uOiBib29sZWFuKTogc3RyaW5nW10ge1xuICBjb25zdCBleGNlcHQgPSBvZmZbMF0gPT09IEFMTF9HRU5FUztcbiAgLy8gSGlkZGVuIGJ5IG5hbWU6IGxpc3RlZCBtZWFucyBvZmYuIExlZCBieSBBTExfR0VORVM6IGxpc3RlZCBtZWFucyBvbi5cbiAgY29uc3QgbGlzdGVkID0gbmV3IFNldChleGNlcHQgPyBvZmYuc2xpY2UoMSkgOiBvZmYpO1xuICBpZiAob24gPT09IGV4Y2VwdCkgbGlzdGVkLmFkZChnZW5lKTtcbiAgZWxzZSBsaXN0ZWQuZGVsZXRlKGdlbmUpO1xuICByZXR1cm4gZXhjZXB0ID8gW0FMTF9HRU5FUywgLi4ubGlzdGVkXSA6IFsuLi5saXN0ZWRdO1xufVxuXG4vKipcbiAqIENvZGVzIChpbmRpY2VzIGludG8gYGdlbmVzYCwgdGhlIGRhdGFzZXQncyBhbGwtZ2VuZSBjb2RlIG9yZGVyKSBzd2l0Y2hlZCBvZmYgd2l0aCB0aGVpciBleWVcbiAqIHRvZ2dsZSB3aGlsZSBldmVyeSBnZW5lIGlzIGRyYXduOyBudWxsIHdoZW4gbm9uZSBpcywgb3Igd2l0aG91dCB0aGUgZ2VuZSBsaXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZGVuQWxsR2VuZUNvZGVzKFxuICB2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICd0cmFuc2NyaXB0QWxsR2VuZXNIaWRkZW4nPixcbiAgZ2VuZXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoIWdlbmVzIHx8ICF2aWV3LnRyYW5zY3JpcHRBbGxHZW5lc0hpZGRlbi5sZW5ndGgpIHJldHVybiBudWxsO1xuICBjb25zdCBzaG93biA9IGFsbEdlbmVTaG93bkJ5KHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzSGlkZGVuKTtcbiAgY29uc3QgY29kZXMgPSBVaW50OEFycmF5LmZyb20oZ2VuZXMsIChnKSA9PiAoc2hvd24oZykgPyAwIDogMSkpO1xuICByZXR1cm4gY29kZXMuaW5jbHVkZXMoMSkgPyBjb2RlcyA6IG51bGw7XG59XG5cbi8qKiBFbnRyaWVzIGluIGEgaGlkZGVuIGdyb3VwJ3MgY2VsbCwgb3Igb2YgYSBoaWRkZW4gZ2VuZSwgcmVtb3ZlZCAod2l0aCB0aGVpciBzaXplcykuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyVHJhbnNjcmlwdHMoXG4gIHQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgcHg6IEZsb2F0MzJBcnJheSxcbiAgaGlkZGVuOiB7IGNvZGVzOiBVaW50MTZBcnJheTsgaGlkZGVuOiBVaW50OEFycmF5IH0gfCBudWxsLFxuICBoaWRkZW5HZW5lczogVWludDhBcnJheSB8IG51bGwsXG4pOiB7IG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlOyBweDogRmxvYXQzMkFycmF5IH0ge1xuICBpZiAoIWhpZGRlbiAmJiAhaGlkZGVuR2VuZXMpIHJldHVybiB7IG1lcmdlZDogdCwgcHggfTtcbiAgY29uc3Qga2VlcDogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICBpZiAoaGlkZGVuR2VuZXMgJiYgaGlkZGVuR2VuZXNbdC5nZW5lW2ldXSkgY29udGludWU7XG4gICAgY29uc3QgbyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgaWYgKGhpZGRlbiAmJiBvICE9PSBOT19PQlNFUlZBVElPTikge1xuICAgICAgY29uc3QgY29kZSA9IGhpZGRlbi5jb2Rlc1tvXTtcbiAgICAgIGlmIChjb2RlICE9PSBOT19DQVRFR09SWSAmJiBoaWRkZW4uaGlkZGVuW2NvZGVdKSBjb250aW51ZTtcbiAgICB9XG4gICAga2VlcC5wdXNoKGkpO1xuICB9XG4gIGNvbnN0IHBpY2sgPSA8VCBleHRlbmRzIEZsb2F0MzJBcnJheSB8IFVpbnQzMkFycmF5IHwgVWludDE2QXJyYXk+KGE6IFQpOiBUID0+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgKGEuY29uc3RydWN0b3IgYXMgbmV3IChuOiBudW1iZXIpID0+IFQpKGtlZXAubGVuZ3RoKTtcbiAgICBrZWVwLmZvckVhY2goKGksIGspID0+IHtcbiAgICAgIG91dFtrXSA9IGFbaV07XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtZXJnZWQ6IHtcbiAgICAgIGNvdW50OiBrZWVwLmxlbmd0aCxcbiAgICAgIGFnZ3JlZ2F0ZWQ6IHQuYWdncmVnYXRlZCxcbiAgICAgIHg6IHBpY2sodC54KSxcbiAgICAgIHk6IHBpY2sodC55KSxcbiAgICAgIHo6IHBpY2sodC56KSxcbiAgICAgIHdlaWdodDogcGljayh0LndlaWdodCksXG4gICAgICBvYnNlcnZhdGlvbjogcGljayh0Lm9ic2VydmF0aW9uKSxcbiAgICAgIGdlbmU6IHBpY2sodC5nZW5lKSxcbiAgICB9LFxuICAgIHB4OiBwaWNrKHB4KSxcbiAgfTtcbn1cblxuLyoqIFRoZSBtZWRpYW4gb2YgYHZgLCBmcm9tIGEgc2FtcGxlIG9mIGFib3V0IDEwMjQgdmFsdWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lZGlhbih2OiBGbG9hdDMyQXJyYXkpOiBudW1iZXIge1xuICBpZiAoIXYubGVuZ3RoKSByZXR1cm4gMDtcbiAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iodi5sZW5ndGggLyAxMDI0KSk7XG4gIGNvbnN0IHNhbXBsZTogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSArPSBzdGVwKSBzYW1wbGUucHVzaCh2W2ldKTtcbiAgc2FtcGxlLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgcmV0dXJuIHNhbXBsZVtzYW1wbGUubGVuZ3RoID4+IDFdO1xufVxuXG4vKiogQ29uY2F0ZW5hdGUgdGlsZXMnIHJpbmdzIGludG8gb25lIHNldCwgZHJvcHBpbmcgcmluZ3MgYWxyZWFkeSBzZWVuIChhIGNlbGwgc3RyYWRkbGluZ1xuICogIHR3byB0aWxlcyBtYXkgYmUgbGlzdGVkIGJ5IGJvdGgpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUG9seWdvblRpbGVzKHRpbGVzOiBTcGF0aWFsUG9seWdvblRpbGVbXSk6IFNwYXRpYWxQb2x5Z29uVGlsZSB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgbGV0IHJpbmdzID0gMDtcbiAgbGV0IHZlcnRpY2VzID0gMDtcbiAgZm9yIChjb25zdCB0IG9mIHRpbGVzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgIGlmIChzZWVuLmhhcyh0Lm9ic2VydmF0aW9uW2ldKSkgY29udGludWU7XG4gICAgICBzZWVuLmFkZCh0Lm9ic2VydmF0aW9uW2ldKTtcbiAgICAgIHJpbmdzKys7XG4gICAgICB2ZXJ0aWNlcyArPSB0Lm9mZnNldHNbaSArIDFdIC0gdC5vZmZzZXRzW2ldO1xuICAgIH1cbiAgfVxuICBzZWVuLmNsZWFyKCk7XG4gIGNvbnN0IG9ic2VydmF0aW9uID0gbmV3IFVpbnQzMkFycmF5KHJpbmdzKTtcbiAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShyaW5ncyArIDEpO1xuICBjb25zdCBjb29yZHMgPSBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzICogMik7XG4gIGxldCByID0gMDtcbiAgbGV0IHYgPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQuY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgbyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgICBpZiAoc2Vlbi5oYXMobykpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQobyk7XG4gICAgICBvYnNlcnZhdGlvbltyXSA9IG87XG4gICAgICBvZmZzZXRzW3JdID0gdjtcbiAgICAgIGNvbnN0IGEgPSB0Lm9mZnNldHNbaV0gKiAyO1xuICAgICAgY29uc3QgYiA9IHQub2Zmc2V0c1tpICsgMV0gKiAyO1xuICAgICAgY29vcmRzLnNldCh0LmNvb3Jkcy5zdWJhcnJheShhLCBiKSwgdiAqIDIpO1xuICAgICAgdiArPSAoYiAtIGEpIC8gMjtcbiAgICAgIHIrKztcbiAgICB9XG4gIH1cbiAgb2Zmc2V0c1tyaW5nc10gPSB2O1xuICByZXR1cm4geyBjb3VudDogcmluZ3MsIG9ic2VydmF0aW9uLCBvZmZzZXRzLCBjb29yZHMgfTtcbn1cblxuLyoqIENvbmNhdGVuYXRlIHRyYW5zY3JpcHQgdGlsZXMsIHN0b3BwaW5nIGF0IGBsaW1pdGAgZW50cmllcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRyYW5zY3JpcHRUaWxlcyh0aWxlczogU3BhdGlhbFRyYW5zY3JpcHRUaWxlW10sIGxpbWl0ID0gSW5maW5pdHkpOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUge1xuICBsZXQgbiA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiB0aWxlcykgbiArPSB0LmNvdW50O1xuICBuID0gTWF0aC5taW4obiwgbGltaXQpO1xuICBjb25zdCBvdXQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSA9IHtcbiAgICBjb3VudDogbixcbiAgICBhZ2dyZWdhdGVkOiB0aWxlcy5zb21lKCh0KSA9PiB0LmFnZ3JlZ2F0ZWQpLFxuICAgIHg6IG5ldyBGbG9hdDMyQXJyYXkobiksXG4gICAgeTogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICB6OiBuZXcgRmxvYXQzMkFycmF5KG4pLFxuICAgIHdlaWdodDogbmV3IFVpbnQzMkFycmF5KG4pLFxuICAgIG9ic2VydmF0aW9uOiBuZXcgVWludDMyQXJyYXkobiksXG4gICAgZ2VuZTogbmV3IFVpbnQxNkFycmF5KG4pLFxuICB9O1xuICBsZXQgbyA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiB0aWxlcykge1xuICAgIGNvbnN0IGsgPSBNYXRoLm1pbih0LmNvdW50LCBuIC0gbyk7XG4gICAgaWYgKGsgPD0gMCkgYnJlYWs7XG4gICAgZm9yIChjb25zdCBmIG9mIFsneCcsICd5JywgJ3onLCAnd2VpZ2h0JywgJ29ic2VydmF0aW9uJywgJ2dlbmUnXSBhcyBjb25zdCkge1xuICAgICAgKG91dFtmXSBhcyBGbG9hdDMyQXJyYXkpLnNldCgodFtmXSBhcyBGbG9hdDMyQXJyYXkpLnN1YmFycmF5KDAsIGspLCBvKTtcbiAgICB9XG4gICAgbyArPSBrO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogT25lIG1hcmtlciBwZXIgKGNsdXN0ZXIsIGBiaW5gIHNxdWFyZSkgZnJvbSBwZXItY2x1c3RlciBkZW5zaXR5IGdyaWRzOiB0aGUgY291bnRzIG9mIHRoZSBncmlkXG4gKiBjZWxscyBpbnNpZGUgYGFyZWFgIHN1bW1lZCBwZXIgc3F1YXJlLCBhdCB0aGVpciBjb3VudC13ZWlnaHRlZCBjZW50cmUuIGBzbG90c1tjXWAgaXMgdGhlIGdlbmVcbiAqIHNsb3Qgd2hvc2UgaWNvbiBjbHVzdGVyIGMncyBtYXJrZXJzIHRha2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbHVzdGVyTWFya2VycyhcbiAgcmFzdGVyczogU3BhdGlhbERlbnNpdHlSYXN0ZXJbXSxcbiAgc2xvdHM6IG51bWJlcltdLFxuICBiaW46IG51bWJlcixcbiAgYXJlYTogRGF0YVJlY3QsXG4pOiB7IHRpbGU6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZTsgZ3JvdXA6IEludDMyQXJyYXkgfSB7XG4gIGNvbnN0IHg6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHk6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHc6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGdlbmU6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGdyb3VwOiBudW1iZXJbXSA9IFtdO1xuICByYXN0ZXJzLmZvckVhY2goKHIsIGMpID0+IHtcbiAgICBjb25zdCBbY3csIGNoXSA9IHIubWV0YS5ncmlkU2l6ZTtcbiAgICBjb25zdCBbb3gsIG95XSA9IHIubWV0YS5vcmlnaW47XG4gICAgY29uc3QgeyByb3dzLCBjb2xzIH0gPSByLm1ldGE7XG4gICAgY29uc3QgYzAgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChhcmVhLngwIC0gb3gpIC8gY3cpKTtcbiAgICBjb25zdCBjMSA9IE1hdGgubWluKGNvbHMgLSAxLCBNYXRoLmZsb29yKChhcmVhLngxIC0gb3gpIC8gY3cpKTtcbiAgICBjb25zdCByMCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKGFyZWEueTAgLSBveSkgLyBjaCkpO1xuICAgIGNvbnN0IHIxID0gTWF0aC5taW4ocm93cyAtIDEsIE1hdGguZmxvb3IoKGFyZWEueTEgLSBveSkgLyBjaCkpO1xuICAgIGNvbnN0IHNxdWFyZXMgPSBuZXcgTWFwPG51bWJlciwgeyBuOiBudW1iZXI7IHN4OiBudW1iZXI7IHN5OiBudW1iZXIgfT4oKTtcbiAgICBmb3IgKGxldCByb3cgPSByMDsgcm93IDw9IHIxOyByb3crKykge1xuICAgICAgZm9yIChsZXQgY29sID0gYzA7IGNvbCA8PSBjMTsgY29sKyspIHtcbiAgICAgICAgY29uc3QgdiA9IHIudmFsdWVzW3JvdyAqIGNvbHMgKyBjb2xdO1xuICAgICAgICBpZiAoISh2ID4gMCkpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBjeCA9IG94ICsgKGNvbCArIDAuNSkgKiBjdztcbiAgICAgICAgY29uc3QgY3kgPSBveSArIChyb3cgKyAwLjUpICogY2g7XG4gICAgICAgIGNvbnN0IGtleSA9IE1hdGguZmxvb3IoKGN5IC0gb3kpIC8gYmluKSAqIDFlNiArIE1hdGguZmxvb3IoKGN4IC0gb3gpIC8gYmluKTtcbiAgICAgICAgY29uc3QgcyA9IHNxdWFyZXMuZ2V0KGtleSkgPz8geyBuOiAwLCBzeDogMCwgc3k6IDAgfTtcbiAgICAgICAgcy5uICs9IHY7XG4gICAgICAgIHMuc3ggKz0gdiAqIGN4O1xuICAgICAgICBzLnN5ICs9IHYgKiBjeTtcbiAgICAgICAgc3F1YXJlcy5zZXQoa2V5LCBzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBzIG9mIHNxdWFyZXMudmFsdWVzKCkpIHtcbiAgICAgIHgucHVzaChzLnN4IC8gcy5uKTtcbiAgICAgIHkucHVzaChzLnN5IC8gcy5uKTtcbiAgICAgIHcucHVzaChNYXRoLnJvdW5kKHMubikpO1xuICAgICAgZ2VuZS5wdXNoKHNsb3RzW2NdKTtcbiAgICAgIGdyb3VwLnB1c2goYyk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgbiA9IHcubGVuZ3RoO1xuICByZXR1cm4ge1xuICAgIHRpbGU6IHtcbiAgICAgIGNvdW50OiBuLFxuICAgICAgYWdncmVnYXRlZDogdHJ1ZSxcbiAgICAgIHg6IEZsb2F0MzJBcnJheS5mcm9tKHgpLFxuICAgICAgeTogRmxvYXQzMkFycmF5LmZyb20oeSksXG4gICAgICB6OiBuZXcgRmxvYXQzMkFycmF5KG4pLFxuICAgICAgd2VpZ2h0OiBVaW50MzJBcnJheS5mcm9tKHcpLFxuICAgICAgb2JzZXJ2YXRpb246IG5ldyBVaW50MzJBcnJheShuKS5maWxsKE5PX09CU0VSVkFUSU9OKSxcbiAgICAgIGdlbmU6IFVpbnQxNkFycmF5LmZyb20oZ2VuZSksXG4gICAgfSxcbiAgICBncm91cDogSW50MzJBcnJheS5mcm9tKGdyb3VwKSxcbiAgfTtcbn1cbiJdfQ==
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC10aWxlLW1lcmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtdGlsZS1tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFHSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDakUsT0FBTyxFQUNMLFdBQVcsRUFDWCxjQUFjLEdBSWYsTUFBTSx1Q0FBdUMsQ0FBQztBQUcvQyxrRUFBa0U7QUFDbEUsTUFBTSxVQUFVLFdBQVcsQ0FDekIsS0FBeUIsRUFDekIsTUFBeUQ7SUFFekQsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxQixNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFDMUIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxJQUFJLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQUUsU0FBUztRQUMxRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2IsUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxD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QUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuQixPQUFPO1FBQ0wsSUFBSSxFQUFFO1lBQ0osS0FBSyxFQUFFLENBQUM7WUFDUixVQUFVLEVBQUUsSUFBSTtZQUNoQixDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNCLFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3BELElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUM3QjtRQUNELEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVyZ2luZyBhbmQgZmlsdGVyaW5nIG9mIHRoZSBzcGF0aWFsLXRpbGUgd2lyZSBmb3JtYXQgKG9ic2VydmF0aW9uIGlkcywgTk9fQ0FURUdPUlkpOiB0aGVcbiAqIHBpZWNlcyBvZiB0aGUgMkQgdmlldydzIHRpbGUgbG9vcCB0aGF0IGFyZSBwdXJlIOKAlCBjb25jYXRlbmF0aW5nIHRpbGVzLCBkcm9wcGluZyBoaWRkZW5cbiAqIGdyb3VwcyBhbmQgZ2VuZXMsIGFuZCB0aGUgZGVuc2l0eS1ncmlkIG1hcmtlcnMgb2YgYSB6b29tZWQtb3V0IGdlbmUgc2VsZWN0aW9uLlxuICpcbiAqIFRoZXNlIHdvcmsgb24gU0lWJ3Mgb3duIHRpbGUgY29udHJhY3QsIHNvIHRoZXkgc3RheSBpbiBTSVYgcmF0aGVyIHRoYW4gbW92aW5nIHRvIG5hcGFyaS1qcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBBTExfR0VORVMgfSBmcm9tICcuLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHtcbiAgTk9fQ0FURUdPUlksXG4gIE5PX09CU0VSVkFUSU9OLFxuICBTcGF0aWFsRGVuc2l0eVJhc3RlcixcbiAgU3BhdGlhbFBvbHlnb25UaWxlLFxuICBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG59IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBEYXRhUmVjdCB9IGZyb20gJy4vbG9kJztcblxuLyoqIFJpbmdzIHdob3NlIG93bmluZyBjZWxsIGlzIGluIGEgc3dpdGNoZWQtb2ZmIGdyb3VwIHJlbW92ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyUmluZ3MoXG4gIHJpbmdzOiBTcGF0aWFsUG9seWdvblRpbGUsXG4gIGhpZGRlbjogeyBjb2RlczogVWludDE2QXJyYXk7IGhpZGRlbjogVWludDhBcnJheSB9IHwgbnVsbCxcbik6IFNwYXRpYWxQb2x5Z29uVGlsZSB7XG4gIGlmICghaGlkZGVuKSByZXR1cm4gcmluZ3M7XG4gIGNvbnN0IGtlZXA6IG51bWJlcltdID0gW107XG4gIGxldCB2ZXJ0aWNlcyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmluZ3MuY291bnQ7IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBoaWRkZW4uY29kZXNbcmluZ3Mub2JzZXJ2YXRpb25baV1dO1xuICAgIGlmIChjb2RlICE9PSBOT19DQVRFR09SWSAmJiBoaWRkZW4uaGlkZGVuW2NvZGVdKSBjb250aW51ZTtcbiAgICBrZWVwLnB1c2goaSk7XG4gICAgdmVydGljZXMgKz0gcmluZ3Mub2Zmc2V0c1tpICsgMV0gLSByaW5ncy5vZmZzZXRzW2ldO1xuICB9XG4gIGlmIChrZWVwLmxlbmd0aCA9PT0gcmluZ3MuY291bnQpIHJldHVybiByaW5ncztcbiAgY29uc3Qgb2JzZXJ2YXRpb24gPSBuZXcgVWludDMyQXJyYXkoa2VlcC5sZW5ndGgpO1xuICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KGtlZXAubGVuZ3RoICsgMSk7XG4gIGNvbnN0IGNvb3JkcyA9IG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXMgKiAyKTtcbiAgbGV0IHYgPSAwO1xuICBrZWVwLmZvckVhY2goKGksIHIpID0+IHtcbiAgICBvYnNlcnZhdGlvbltyXSA9IHJpbmdzLm9ic2VydmF0aW9uW2ldO1xuICAgIG9mZnNldHNbcl0gPSB2O1xuICAgIGNvbnN0IGEgPSByaW5ncy5vZmZzZXRzW2ldICogMjtcbiAgICBjb25zdCBiID0gcmluZ3Mub2Zmc2V0c1tpICsgMV0gKiAyO1xuICAgIGNvb3Jkcy5zZXQocmluZ3MuY29vcmRzLnN1YmFycmF5KGEsIGIpLCB2ICogMik7XG4gICAgdiArPSAoYiAtIGEpIC8gMjtcbiAgfSk7XG4gIG9mZnNldHNba2VlcC5sZW5ndGhdID0gdjtcbiAgcmV0dXJuIHsgY291bnQ6IGtlZXAubGVuZ3RoLCBvYnNlcnZhdGlvbiwgb2Zmc2V0cywgY29vcmRzIH07XG59XG5cbi8qKiBTbG90cyAoaW5kaWNlcyBpbnRvIHRoZSBzZWxlY3RlZCBnZW5lcykgc3dpdGNoZWQgb2ZmIHdpdGggdGhlaXIgZXllIHRvZ2dsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaWRkZW5HZW5lU2xvdHModmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgaWYgKCF2aWV3LnRyYW5zY3JpcHRIaWRkZW5HZW5lcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICBjb25zdCBvZmYgPSBuZXcgU2V0KHZpZXcudHJhbnNjcmlwdEhpZGRlbkdlbmVzKTtcbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbSh2aWV3LnRyYW5zY3JpcHRHZW5lcywgKGcpID0+IChvZmYuaGFzKGcpID8gMSA6IDApKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIFwiQWxsIGdlbmVzXCIgaXMgc3dpdGNoZWQgb2ZmIGFzIGEgd2hvbGUgd2l0aCB0aGUgZ2VuZSB0cmVlJ3Mgcm9vdCBleWU6IGl0cyBoaWRkZW5cbiAqIGxpc3QgaXMgYFtBTExfR0VORVNdYCAoZXZlcnkgZ2VuZSBoaWRkZW4sIG5vbmUgZXhjZXB0ZWQpLiBIaWRpbmcgZXZlcnkgZ2VuZSBieSBuYW1lIHdvdWxkXG4gKiBuZWVkIHRoZSBnZW5lIGxpc3QsIHdoaWNoIGEgZGF0YXNldCBuZWVkIG5vdCBoYXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsR2VuZXNIaWRkZW4oXG4gIHZpZXc6IFBpY2s8U3BhdGlhbFZpZXdTdGF0ZSwgJ3RyYW5zY3JpcHRBbGxHZW5lcycgfCAndHJhbnNjcmlwdEFsbEdlbmVzSGlkZGVuJz4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzICYmIGV2ZXJ5R2VuZU9mZih2aWV3LnRyYW5zY3JpcHRBbGxHZW5lc0hpZGRlbik7XG59XG5cbi8qKiBXaGV0aGVyIGFuIFwiQWxsIGdlbmVzXCIgaGlkZGVuIGxpc3QgaGlkZXMgZXZlcnkgZ2VuZSwgbm9uZSBleGNlcHRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVyeUdlbmVPZmYob2ZmOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2ZmLmxlbmd0aCA9PT0gMSAmJiBvZmZbMF0gPT09IEFMTF9HRU5FUztcbn1cblxuLyoqIFdoZXRoZXIgYSBnZW5lIG9mIFwiQWxsIGdlbmVzXCIgaXMgZHJhd24sIGJ5IGl0cyBoaWRkZW4gbGlzdCAoc2VlIGB0cmFuc2NyaXB0QWxsR2VuZXNIaWRkZW5gKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGxHZW5lU2hvd25CeShvZmY6IHJlYWRvbmx5IHN0cmluZ1tdKTogKGdlbmU6IHN0cmluZykgPT4gYm9vbGVhbiB7XG4gIGNvbnN0IGxpc3RlZCA9IG5ldyBTZXQob2ZmKTtcbiAgY29uc3QgZXhjZXB0ID0gb2ZmWzBdID09PSBBTExfR0VORVM7XG4gIHJldHVybiAoZ2VuZSkgPT4gbGlzdGVkLmhhcyhnZW5lKSA9PT0gZXhjZXB0O1xufVxuXG4vKiogXCJBbGwgZ2VuZXNcIidzIGhpZGRlbiBsaXN0IHdpdGggYGdlbmVgIHNob3duIChgb25gKSBvciBoaWRkZW4sIGluIHRoZSBsaXN0J3Mgb3duIGZvcm0uICovXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlQWxsR2VuZUhpZGRlbihvZmY6IHJlYWRvbmx5IHN0cmluZ1tdLCBnZW5lOiBzdHJpbmcsIG9uOiBib29sZWFuKTogc3RyaW5nW10ge1xuICBjb25zdCBleGNlcHQgPSBvZmZbMF0gPT09IEFMTF9HRU5FUztcbiAgLy8gSGlkZGVuIGJ5IG5hbWU6IGxpc3RlZCBtZWFucyBvZmYuIExlZCBieSBBTExfR0VORVM6IGxpc3RlZCBtZWFucyBvbi5cbiAgY29uc3QgbGlzdGVkID0gbmV3IFNldChleGNlcHQgPyBvZmYuc2xpY2UoMSkgOiBvZmYpO1xuICBpZiAob24gPT09IGV4Y2VwdCkgbGlzdGVkLmFkZChnZW5lKTtcbiAgZWxzZSBsaXN0ZWQuZGVsZXRlKGdlbmUpO1xuICByZXR1cm4gZXhjZXB0ID8gW0FMTF9HRU5FUywgLi4ubGlzdGVkXSA6IFsuLi5saXN0ZWRdO1xufVxuXG4vKipcbiAqIENvZGVzIChpbmRpY2VzIGludG8gYGdlbmVzYCwgdGhlIGRhdGFzZXQncyBhbGwtZ2VuZSBjb2RlIG9yZGVyKSBzd2l0Y2hlZCBvZmYgd2l0aCB0aGVpciBleWVcbiAqIHRvZ2dsZSB3aGlsZSBldmVyeSBnZW5lIGlzIGRyYXduOyBudWxsIHdoZW4gbm9uZSBpcywgb3Igd2l0aG91dCB0aGUgZ2VuZSBsaXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZGVuQWxsR2VuZUNvZGVzKFxuICB2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICd0cmFuc2NyaXB0QWxsR2VuZXNIaWRkZW4nPixcbiAgZ2VuZXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoIWdlbmVzIHx8ICF2aWV3LnRyYW5zY3JpcHRBbGxHZW5lc0hpZGRlbi5sZW5ndGgpIHJldHVybiBudWxsO1xuICBjb25zdCBzaG93biA9IGFsbEdlbmVTaG93bkJ5KHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzSGlkZGVuKTtcbiAgY29uc3QgY29kZXMgPSBVaW50OEFycmF5LmZyb20oZ2VuZXMsIChnKSA9PiAoc2hvd24oZykgPyAwIDogMSkpO1xuICByZXR1cm4gY29kZXMuaW5jbHVkZXMoMSkgPyBjb2RlcyA6IG51bGw7XG59XG5cbi8qKiBFbnRyaWVzIGluIGEgaGlkZGVuIGdyb3VwJ3MgY2VsbCwgb3Igb2YgYSBoaWRkZW4gZ2VuZSwgcmVtb3ZlZCAod2l0aCB0aGVpciBzaXplcykuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyVHJhbnNjcmlwdHMoXG4gIHQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgcHg6IEZsb2F0MzJBcnJheSxcbiAgaGlkZGVuOiB7IGNvZGVzOiBVaW50MTZBcnJheTsgaGlkZGVuOiBVaW50OEFycmF5IH0gfCBudWxsLFxuICBoaWRkZW5HZW5lczogVWludDhBcnJheSB8IG51bGwsXG4pOiB7IG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlOyBweDogRmxvYXQzMkFycmF5IH0ge1xuICBpZiAoIWhpZGRlbiAmJiAhaGlkZGVuR2VuZXMpIHJldHVybiB7IG1lcmdlZDogdCwgcHggfTtcbiAgY29uc3Qga2VlcDogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICBpZiAoaGlkZGVuR2VuZXMgJiYgaGlkZGVuR2VuZXNbdC5nZW5lW2ldXSkgY29udGludWU7XG4gICAgY29uc3QgbyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgaWYgKGhpZGRlbiAmJiBvICE9PSBOT19PQlNFUlZBVElPTikge1xuICAgICAgY29uc3QgY29kZSA9IGhpZGRlbi5jb2Rlc1tvXTtcbiAgICAgIGlmIChjb2RlICE9PSBOT19DQVRFR09SWSAmJiBoaWRkZW4uaGlkZGVuW2NvZGVdKSBjb250aW51ZTtcbiAgICB9XG4gICAga2VlcC5wdXNoKGkpO1xuICB9XG4gIGNvbnN0IHBpY2sgPSA8VCBleHRlbmRzIEZsb2F0MzJBcnJheSB8IFVpbnQzMkFycmF5IHwgVWludDE2QXJyYXk+KGE6IFQpOiBUID0+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgKGEuY29uc3RydWN0b3IgYXMgbmV3IChuOiBudW1iZXIpID0+IFQpKGtlZXAubGVuZ3RoKTtcbiAgICBrZWVwLmZvckVhY2goKGksIGspID0+IHtcbiAgICAgIG91dFtrXSA9IGFbaV07XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtZXJnZWQ6IHtcbiAgICAgIGNvdW50OiBrZWVwLmxlbmd0aCxcbiAgICAgIGFnZ3JlZ2F0ZWQ6IHQuYWdncmVnYXRlZCxcbiAgICAgIHg6IHBpY2sodC54KSxcbiAgICAgIHk6IHBpY2sodC55KSxcbiAgICAgIHo6IHBpY2sodC56KSxcbiAgICAgIHdlaWdodDogcGljayh0LndlaWdodCksXG4gICAgICBvYnNlcnZhdGlvbjogcGljayh0Lm9ic2VydmF0aW9uKSxcbiAgICAgIGdlbmU6IHBpY2sodC5nZW5lKSxcbiAgICB9LFxuICAgIHB4OiBwaWNrKHB4KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgdHJhbnNjcmlwdHMgb2YgYSB0aWxlIHdob3NlIHogbGllcyBpbiBgYmFuZGAgKGBbbG8sIGhpKWAsIHNlZSBgcGxhbmVCYW5kYCksIHdpdGggdGhlaXJcbiAqIG1hcmtlciBzaXplczogdGhlIDJEIHZpZXcgb2Ygb25lIHBsYW5lIG9mIGEgM0QgYXNzYXkuIEFuIGFnZ3JlZ2F0ZWQgZW50cnkgc3RhbmRzIGZvciB0cmFuc2NyaXB0c1xuICogYXQgc2V2ZXJhbCBkZXB0aHMsIHNvIGEgdGlsZSBvZiB0aGVtIGlzIGtlcHQgd2hvbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2NyaXB0c0luQmFuZChcbiAgdDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxuICBweDogRmxvYXQzMkFycmF5LFxuICBiYW5kOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdLFxuKTogeyBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZTsgcHg6IEZsb2F0MzJBcnJheSB9IHtcbiAgaWYgKHQuYWdncmVnYXRlZCkgcmV0dXJuIHsgbWVyZ2VkOiB0LCBweCB9O1xuICBjb25zdCBrZWVwOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHQuY291bnQ7IGkrKykge1xuICAgIGNvbnN0IHogPSB0LnpbaV07XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZSh6KSAmJiB6ID49IGJhbmRbMF0gJiYgeiA8IGJhbmRbMV0pIGtlZXAucHVzaChpKTtcbiAgfVxuICBpZiAoa2VlcC5sZW5ndGggPT09IHQuY291bnQpIHJldHVybiB7IG1lcmdlZDogdCwgcHggfTtcbiAgY29uc3QgcGljayA9IDxUIGV4dGVuZHMgRmxvYXQzMkFycmF5IHwgVWludDMyQXJyYXkgfCBVaW50MTZBcnJheT4oYTogVCk6IFQgPT4ge1xuICAgIGNvbnN0IG91dCA9IG5ldyAoYS5jb25zdHJ1Y3RvciBhcyBuZXcgKG46IG51bWJlcikgPT4gVCkoa2VlcC5sZW5ndGgpO1xuICAgIGtlZXAuZm9yRWFjaCgoaSwgaykgPT4ge1xuICAgICAgb3V0W2tdID0gYVtpXTtcbiAgICB9KTtcbiAgICByZXR1cm4gb3V0O1xuICB9O1xuICByZXR1cm4ge1xuICAgIG1lcmdlZDoge1xuICAgICAgY291bnQ6IGtlZXAubGVuZ3RoLFxuICAgICAgYWdncmVnYXRlZDogZmFsc2UsXG4gICAgICB4OiBwaWNrKHQueCksXG4gICAgICB5OiBwaWNrKHQueSksXG4gICAgICB6OiBwaWNrKHQueiksXG4gICAgICB3ZWlnaHQ6IHBpY2sodC53ZWlnaHQpLFxuICAgICAgb2JzZXJ2YXRpb246IHBpY2sodC5vYnNlcnZhdGlvbiksXG4gICAgICBnZW5lOiBwaWNrKHQuZ2VuZSksXG4gICAgfSxcbiAgICBweDogcGljayhweCksXG4gIH07XG59XG5cbi8qKiBUaGUgbWVkaWFuIG9mIGB2YCwgZnJvbSBhIHNhbXBsZSBvZiBhYm91dCAxMDI0IHZhbHVlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZWRpYW4odjogRmxvYXQzMkFycmF5KTogbnVtYmVyIHtcbiAgaWYgKCF2Lmxlbmd0aCkgcmV0dXJuIDA7XG4gIGNvbnN0IHN0ZXAgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHYubGVuZ3RoIC8gMTAyNCkpO1xuICBjb25zdCBzYW1wbGU6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkgKz0gc3RlcCkgc2FtcGxlLnB1c2godltpXSk7XG4gIHNhbXBsZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIHJldHVybiBzYW1wbGVbc2FtcGxlLmxlbmd0aCA+PiAxXTtcbn1cblxuLyoqIENvbmNhdGVuYXRlIHRpbGVzJyByaW5ncyBpbnRvIG9uZSBzZXQsIGRyb3BwaW5nIHJpbmdzIGFscmVhZHkgc2VlbiAoYSBjZWxsIHN0cmFkZGxpbmdcbiAqICB0d28gdGlsZXMgbWF5IGJlIGxpc3RlZCBieSBib3RoKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVBvbHlnb25UaWxlcyh0aWxlczogU3BhdGlhbFBvbHlnb25UaWxlW10pOiBTcGF0aWFsUG9seWdvblRpbGUge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGxldCByaW5ncyA9IDA7XG4gIGxldCB2ZXJ0aWNlcyA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiB0aWxlcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgICBpZiAoc2Vlbi5oYXModC5vYnNlcnZhdGlvbltpXSkpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQodC5vYnNlcnZhdGlvbltpXSk7XG4gICAgICByaW5ncysrO1xuICAgICAgdmVydGljZXMgKz0gdC5vZmZzZXRzW2kgKyAxXSAtIHQub2Zmc2V0c1tpXTtcbiAgICB9XG4gIH1cbiAgc2Vlbi5jbGVhcigpO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShyaW5ncyk7XG4gIGNvbnN0IG9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkocmluZ3MgKyAxKTtcbiAgY29uc3QgY29vcmRzID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlcyAqIDIpO1xuICBsZXQgciA9IDA7XG4gIGxldCB2ID0gMDtcbiAgZm9yIChjb25zdCB0IG9mIHRpbGVzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSB0Lm9ic2VydmF0aW9uW2ldO1xuICAgICAgaWYgKHNlZW4uaGFzKG8pKSBjb250aW51ZTtcbiAgICAgIHNlZW4uYWRkKG8pO1xuICAgICAgb2JzZXJ2YXRpb25bcl0gPSBvO1xuICAgICAgb2Zmc2V0c1tyXSA9IHY7XG4gICAgICBjb25zdCBhID0gdC5vZmZzZXRzW2ldICogMjtcbiAgICAgIGNvbnN0IGIgPSB0Lm9mZnNldHNbaSArIDFdICogMjtcbiAgICAgIGNvb3Jkcy5zZXQodC5jb29yZHMuc3ViYXJyYXkoYSwgYiksIHYgKiAyKTtcbiAgICAgIHYgKz0gKGIgLSBhKSAvIDI7XG4gICAgICByKys7XG4gICAgfVxuICB9XG4gIG9mZnNldHNbcmluZ3NdID0gdjtcbiAgcmV0dXJuIHsgY291bnQ6IHJpbmdzLCBvYnNlcnZhdGlvbiwgb2Zmc2V0cywgY29vcmRzIH07XG59XG5cbi8qKiBDb25jYXRlbmF0ZSB0cmFuc2NyaXB0IHRpbGVzLCBzdG9wcGluZyBhdCBgbGltaXRgIGVudHJpZXMuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUcmFuc2NyaXB0VGlsZXModGlsZXM6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZVtdLCBsaW1pdCA9IEluZmluaXR5KTogU3BhdGlhbFRyYW5zY3JpcHRUaWxlIHtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIG4gKz0gdC5jb3VudDtcbiAgbiA9IE1hdGgubWluKG4sIGxpbWl0KTtcbiAgY29uc3Qgb3V0OiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUgPSB7XG4gICAgY291bnQ6IG4sXG4gICAgYWdncmVnYXRlZDogdGlsZXMuc29tZSgodCkgPT4gdC5hZ2dyZWdhdGVkKSxcbiAgICB4OiBuZXcgRmxvYXQzMkFycmF5KG4pLFxuICAgIHk6IG5ldyBGbG9hdDMyQXJyYXkobiksXG4gICAgejogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICB3ZWlnaHQ6IG5ldyBVaW50MzJBcnJheShuKSxcbiAgICBvYnNlcnZhdGlvbjogbmV3IFVpbnQzMkFycmF5KG4pLFxuICAgIGdlbmU6IG5ldyBVaW50MTZBcnJheShuKSxcbiAgfTtcbiAgbGV0IG8gPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIHtcbiAgICBjb25zdCBrID0gTWF0aC5taW4odC5jb3VudCwgbiAtIG8pO1xuICAgIGlmIChrIDw9IDApIGJyZWFrO1xuICAgIGZvciAoY29uc3QgZiBvZiBbJ3gnLCAneScsICd6JywgJ3dlaWdodCcsICdvYnNlcnZhdGlvbicsICdnZW5lJ10gYXMgY29uc3QpIHtcbiAgICAgIChvdXRbZl0gYXMgRmxvYXQzMkFycmF5KS5zZXQoKHRbZl0gYXMgRmxvYXQzMkFycmF5KS5zdWJhcnJheSgwLCBrKSwgbyk7XG4gICAgfVxuICAgIG8gKz0gaztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE9uZSBtYXJrZXIgcGVyIChjbHVzdGVyLCBgYmluYCBzcXVhcmUpIGZyb20gcGVyLWNsdXN0ZXIgZGVuc2l0eSBncmlkczogdGhlIGNvdW50cyBvZiB0aGUgZ3JpZFxuICogY2VsbHMgaW5zaWRlIGBhcmVhYCBzdW1tZWQgcGVyIHNxdWFyZSwgYXQgdGhlaXIgY291bnQtd2VpZ2h0ZWQgY2VudHJlLiBgc2xvdHNbY11gIGlzIHRoZSBnZW5lXG4gKiBzbG90IHdob3NlIGljb24gY2x1c3RlciBjJ3MgbWFya2VycyB0YWtlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2x1c3Rlck1hcmtlcnMoXG4gIHJhc3RlcnM6IFNwYXRpYWxEZW5zaXR5UmFzdGVyW10sXG4gIHNsb3RzOiBudW1iZXJbXSxcbiAgYmluOiBudW1iZXIsXG4gIGFyZWE6IERhdGFSZWN0LFxuKTogeyB0aWxlOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGU7IGdyb3VwOiBJbnQzMkFycmF5IH0ge1xuICBjb25zdCB4OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB5OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB3OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBnZW5lOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBncm91cDogbnVtYmVyW10gPSBbXTtcbiAgcmFzdGVycy5mb3JFYWNoKChyLCBjKSA9PiB7XG4gICAgY29uc3QgW2N3LCBjaF0gPSByLm1ldGEuZ3JpZFNpemU7XG4gICAgY29uc3QgW294LCBveV0gPSByLm1ldGEub3JpZ2luO1xuICAgIGNvbnN0IHsgcm93cywgY29scyB9ID0gci5tZXRhO1xuICAgIGNvbnN0IGMwID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigoYXJlYS54MCAtIG94KSAvIGN3KSk7XG4gICAgY29uc3QgYzEgPSBNYXRoLm1pbihjb2xzIC0gMSwgTWF0aC5mbG9vcigoYXJlYS54MSAtIG94KSAvIGN3KSk7XG4gICAgY29uc3QgcjAgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChhcmVhLnkwIC0gb3kpIC8gY2gpKTtcbiAgICBjb25zdCByMSA9IE1hdGgubWluKHJvd3MgLSAxLCBNYXRoLmZsb29yKChhcmVhLnkxIC0gb3kpIC8gY2gpKTtcbiAgICBjb25zdCBzcXVhcmVzID0gbmV3IE1hcDxudW1iZXIsIHsgbjogbnVtYmVyOyBzeDogbnVtYmVyOyBzeTogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChsZXQgcm93ID0gcjA7IHJvdyA8PSByMTsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IGMwOyBjb2wgPD0gYzE7IGNvbCsrKSB7XG4gICAgICAgIGNvbnN0IHYgPSByLnZhbHVlc1tyb3cgKiBjb2xzICsgY29sXTtcbiAgICAgICAgaWYgKCEodiA+IDApKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgY3ggPSBveCArIChjb2wgKyAwLjUpICogY3c7XG4gICAgICAgIGNvbnN0IGN5ID0gb3kgKyAocm93ICsgMC41KSAqIGNoO1xuICAgICAgICBjb25zdCBrZXkgPSBNYXRoLmZsb29yKChjeSAtIG95KSAvIGJpbikgKiAxZTYgKyBNYXRoLmZsb29yKChjeCAtIG94KSAvIGJpbik7XG4gICAgICAgIGNvbnN0IHMgPSBzcXVhcmVzLmdldChrZXkpID8/IHsgbjogMCwgc3g6IDAsIHN5OiAwIH07XG4gICAgICAgIHMubiArPSB2O1xuICAgICAgICBzLnN4ICs9IHYgKiBjeDtcbiAgICAgICAgcy5zeSArPSB2ICogY3k7XG4gICAgICAgIHNxdWFyZXMuc2V0KGtleSwgcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcyBvZiBzcXVhcmVzLnZhbHVlcygpKSB7XG4gICAgICB4LnB1c2gocy5zeCAvIHMubik7XG4gICAgICB5LnB1c2gocy5zeSAvIHMubik7XG4gICAgICB3LnB1c2goTWF0aC5yb3VuZChzLm4pKTtcbiAgICAgIGdlbmUucHVzaChzbG90c1tjXSk7XG4gICAgICBncm91cC5wdXNoKGMpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IG4gPSB3Lmxlbmd0aDtcbiAgcmV0dXJuIHtcbiAgICB0aWxlOiB7XG4gICAgICBjb3VudDogbixcbiAgICAgIGFnZ3JlZ2F0ZWQ6IHRydWUsXG4gICAgICB4OiBGbG9hdDMyQXJyYXkuZnJvbSh4KSxcbiAgICAgIHk6IEZsb2F0MzJBcnJheS5mcm9tKHkpLFxuICAgICAgejogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICAgIHdlaWdodDogVWludDMyQXJyYXkuZnJvbSh3KSxcbiAgICAgIG9ic2VydmF0aW9uOiBuZXcgVWludDMyQXJyYXkobikuZmlsbChOT19PQlNFUlZBVElPTiksXG4gICAgICBnZW5lOiBVaW50MTZBcnJheS5mcm9tKGdlbmUpLFxuICAgIH0sXG4gICAgZ3JvdXA6IEludDMyQXJyYXkuZnJvbShncm91cCksXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,208 @@
1
+ import { ALL_GENES } from '../contracts/ports/spatial-data.port';
2
+ import { NO_OBSERVATION, } from '../contracts/spatial-dataset.contract';
3
+ import { inBand } from './spatial-planes';
4
+ import { inBounds } from './spatial-selection';
5
+ /**
6
+ * The transcripts of a selection, by gene: the molecules of the selected cells (each transcript
7
+ * tile names the cell every molecule lies in), or those inside drawn regions — over the whole depth
8
+ * (spatial 3D) or on one plane (the 2D view of a sliced dataset).
9
+ *
10
+ * Read from the finest level of the transcript pyramid, every gene (`ALL_GENES`), and only the
11
+ * tiles the selection touches: a cell's transcripts lie near it, a region's inside its bounds.
12
+ * Pure but for the port; the facade decides what is selected.
13
+ */
14
+ /** At most this many tiles are read for one list; a selection spanning more is counted in part. */
15
+ export const TRANSCRIPT_LIST_MAX_TILES = 2048;
16
+ /** About this many transcripts at most are read for one list (estimated from the dataset's mean). */
17
+ export const TRANSCRIPT_LIST_MAX_TRANSCRIPTS = 20_000_000;
18
+ /** Tiles read at once. */
19
+ const CONCURRENCY = 8;
20
+ /**
21
+ * How far from a cell's centre its transcripts are looked for, in microns: past the largest cells'
22
+ * reach (a cell's molecules lie inside its outline; Baysor cells of the ileum are up to ~25 µm).
23
+ */
24
+ export const CELL_REACH_MICRONS = 30;
25
+ /**
26
+ * How many level-0 tiles one list may read: {@link TRANSCRIPT_LIST_MAX_TILES}, fewer when the
27
+ * dataset's tiles are dense (its transcripts over the tiles of its bounds), so that about
28
+ * {@link TRANSCRIPT_LIST_MAX_TRANSCRIPTS} are read at most — a whole cell type of a sparse section
29
+ * is read whole, of a dense one in part.
30
+ */
31
+ export function tileBudget(meta) {
32
+ const size = meta.levels[0]?.tileSize;
33
+ if (!(size > 0) || !meta.count)
34
+ return TRANSCRIPT_LIST_MAX_TILES;
35
+ const [x0, y0, x1, y1] = meta.bounds;
36
+ const tiles = (Math.floor(x1 / size) - Math.floor(x0 / size) + 1) * (Math.floor(y1 / size) - Math.floor(y0 / size) + 1);
37
+ const perTile = meta.count / Math.max(1, tiles);
38
+ return Math.max(16, Math.min(TRANSCRIPT_LIST_MAX_TILES, Math.floor(TRANSCRIPT_LIST_MAX_TRANSCRIPTS / perTile)));
39
+ }
40
+ /**
41
+ * Level-0 tiles within `reach` of the selected cells' centres (observation units), clipped to
42
+ * `bounds`. When there are more than `max`, those holding the most selected cells are kept and
43
+ * `partial` says so.
44
+ */
45
+ export function tilesAroundCells(obs, mask, reach, levels, bounds, max = TRANSCRIPT_LIST_MAX_TILES) {
46
+ const size = levels[0]?.tileSize;
47
+ if (!(size > 0))
48
+ return { tiles: [], partial: false };
49
+ const weight = new Map();
50
+ const n = Math.min(obs.count, mask.length);
51
+ for (let i = 0; i < n; i++) {
52
+ if (!mask[i])
53
+ continue;
54
+ const x = obs.x[i];
55
+ const y = obs.y[i];
56
+ if (!Number.isFinite(x) || !Number.isFinite(y))
57
+ continue;
58
+ const [gx0, gx1] = span(x - reach, x + reach, size, bounds?.[0], bounds?.[2]);
59
+ const [gy0, gy1] = span(y - reach, y + reach, size, bounds?.[1], bounds?.[3]);
60
+ for (let gy = gy0; gy <= gy1; gy++) {
61
+ for (let gx = gx0; gx <= gx1; gx++) {
62
+ const key = `${gx},${gy}`;
63
+ weight.set(key, (weight.get(key) ?? 0) + 1);
64
+ }
65
+ }
66
+ }
67
+ return pick(weight, max);
68
+ }
69
+ /**
70
+ * Level-0 tiles under `shapes` (image px, mapped to observation units through `imageRef`), clipped
71
+ * to `bounds`; at most `max`, the most covered first.
72
+ */
73
+ export function tilesUnderShapes(shapes, imageRef, levels, bounds, max = TRANSCRIPT_LIST_MAX_TILES) {
74
+ const size = levels[0]?.tileSize;
75
+ if (!(size > 0))
76
+ return { tiles: [], partial: false };
77
+ const [sx, sy] = imageRef?.scale ?? [1, 1];
78
+ const [tx, ty] = imageRef?.translate ?? [0, 0];
79
+ const weight = new Map();
80
+ for (const shape of shapes) {
81
+ const b = shape.bounds;
82
+ const ax = (b.minX - tx) / sx;
83
+ const bx = (b.maxX - tx) / sx;
84
+ const ay = (b.minY - ty) / sy;
85
+ const by = (b.maxY - ty) / sy;
86
+ const [gx0, gx1] = span(Math.min(ax, bx), Math.max(ax, bx), size, bounds?.[0], bounds?.[2]);
87
+ const [gy0, gy1] = span(Math.min(ay, by), Math.max(ay, by), size, bounds?.[1], bounds?.[3]);
88
+ for (let gy = gy0; gy <= gy1; gy++) {
89
+ for (let gx = gx0; gx <= gx1; gx++) {
90
+ const key = `${gx},${gy}`;
91
+ weight.set(key, (weight.get(key) ?? 0) + 1);
92
+ }
93
+ }
94
+ }
95
+ return pick(weight, max);
96
+ }
97
+ /** The tile indices `[g0, g1]` covering `[a, b]` along one axis, within the bounds' tiles. */
98
+ function span(a, b, size, lo, hi) {
99
+ let g0 = Math.floor(a / size);
100
+ let g1 = Math.floor(b / size);
101
+ if (lo !== undefined && Number.isFinite(lo))
102
+ g0 = Math.max(g0, Math.floor(lo / size));
103
+ if (hi !== undefined && Number.isFinite(hi))
104
+ g1 = Math.min(g1, Math.floor(hi / size));
105
+ return [g0, g1];
106
+ }
107
+ /** The `max` heaviest tiles of `weight` (`"gx,gy"` → weight), and whether any were left out. */
108
+ function pick(weight, max) {
109
+ let entries = [...weight.entries()];
110
+ const partial = entries.length > max;
111
+ if (partial)
112
+ entries = entries.sort((a, b) => b[1] - a[1]).slice(0, max);
113
+ const tiles = entries.map(([key]) => {
114
+ const [gx, gy] = key.split(',').map(Number);
115
+ return { level: 0, gx, gy };
116
+ });
117
+ return { tiles, partial };
118
+ }
119
+ /**
120
+ * Count the transcripts of `tiles` (level 0, every gene) that pass `filter` and, when given, lie in
121
+ * the z `band`, by gene (`names` are the dataset's genes by code, `transcriptTiles.genes`).
122
+ * Resolves null once `cancelled()` says so; a tile that fails to load leaves the count partial.
123
+ */
124
+ export async function countTranscripts(opts) {
125
+ const { port, tiles, filter, band } = opts;
126
+ const getTile = port.getTranscriptTile?.bind(port);
127
+ if (!getTile)
128
+ return null;
129
+ const byGene = new Map();
130
+ const cells = new Set();
131
+ let total = 0;
132
+ let failed = 0;
133
+ let next = 0;
134
+ const accept = acceptor(filter);
135
+ const add = (tile) => {
136
+ const { x, y, z, gene, weight, observation } = tile;
137
+ for (let i = 0; i < tile.count; i++) {
138
+ if (band && !inBand(z[i], band))
139
+ continue;
140
+ const o = observation[i];
141
+ if (!accept(x[i], y[i], o))
142
+ continue;
143
+ const w = weight[i] || 1;
144
+ total += w;
145
+ byGene.set(gene[i], (byGene.get(gene[i]) ?? 0) + w);
146
+ if (o !== NO_OBSERVATION)
147
+ cells.add(o);
148
+ }
149
+ };
150
+ const worker = async () => {
151
+ while (next < tiles.length) {
152
+ if (opts.cancelled?.())
153
+ return;
154
+ const k = tiles[next++];
155
+ try {
156
+ add(await getTile(0, k.gx, k.gy, { genes: [ALL_GENES], quality: opts.quality }));
157
+ }
158
+ catch {
159
+ failed++;
160
+ }
161
+ }
162
+ };
163
+ await Promise.all(Array.from({ length: Math.min(CONCURRENCY, tiles.length) }, worker));
164
+ if (opts.cancelled?.())
165
+ return null;
166
+ if (tiles.length > 0 && failed === tiles.length)
167
+ throw new Error('the transcripts could not be read');
168
+ const names = opts.names;
169
+ const genes = [...byGene.entries()]
170
+ .map(([code, count]) => ({ name: names?.[code] || `gene ${code}`, count }))
171
+ .sort((a, b) => b.count - a.count || a.name.localeCompare(b.name));
172
+ return { total, cells: cells.size, genes, partial: !!opts.partial || failed > 0 };
173
+ }
174
+ /** Whether a transcript at (x, y), in cell `o`, passes `filter`. */
175
+ function acceptor(filter) {
176
+ if (filter.kind === 'cells') {
177
+ const mask = filter.mask;
178
+ return (_x, _y, o) => o !== NO_OBSERVATION && o < mask.length && mask[o] === 1;
179
+ }
180
+ const shapes = filter.shapes;
181
+ const [sx, sy] = filter.imageRef?.scale ?? [1, 1];
182
+ const [tx, ty] = filter.imageRef?.translate ?? [0, 0];
183
+ return (x, y) => {
184
+ const px = x * sx + tx;
185
+ const py = y * sy + ty;
186
+ for (const shape of shapes) {
187
+ if (inBounds(shape.bounds, px, py) && shape.hit(px, py))
188
+ return true;
189
+ }
190
+ return false;
191
+ };
192
+ }
193
+ /** The cells of `categories` (names) in a categorical column's `codes`, as a selection mask. */
194
+ export function cellsOfCategories(codes, categories, names) {
195
+ const wanted = new Set(names);
196
+ const hit = new Uint8Array(categories.length);
197
+ categories.forEach((c, k) => (hit[k] = wanted.has(c) ? 1 : 0));
198
+ const mask = new Uint8Array(codes.length);
199
+ let count = 0;
200
+ for (let i = 0; i < codes.length; i++) {
201
+ if (hit[codes[i]]) {
202
+ mask[i] = 1;
203
+ count++;
204
+ }
205
+ }
206
+ return { mask, count };
207
+ }
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNjcmlwdHMtaW4tc2VsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3RyYW5zY3JpcHRzLWluLXNlbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDakUsT0FBTyxFQUNMLGNBQWMsR0FNZixNQUFNLHVDQUF1QyxDQUFDO0FBRS9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsUUFBUSxFQUFjLE1BQU0scUJBQXFCLENBQUM7QUFFM0Q7Ozs7Ozs7O0dBUUc7QUFFSCxtR0FBbUc7QUFDbkcsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDO0FBQzlDLHFHQUFxRztBQUNyRyxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRyxVQUFVLENBQUM7QUFDMUQsMEJBQTBCO0FBQzFCLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztBQUN0Qjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFFckM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLElBSTFCO0lBQ0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDdEMsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLHlCQUF5QixDQUFDO0lBQ2pFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JDLE1BQU0sS0FBSyxHQUNULENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxD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QUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxnR0FBZ0c7QUFDaEcsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixLQUF3QixFQUN4QixVQUE2QixFQUM3QixLQUF3QjtJQUV4QixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixNQUFNLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxNQUFNLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTcGF0aWFsRGF0YVBvcnQgfSBmcm9tICcuLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHsgQUxMX0dFTkVTIH0gZnJvbSAnLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB7XG4gIE5PX09CU0VSVkFUSU9OLFxuICB0eXBlIFNwYXRpYWxCb3VuZHMsXG4gIHR5cGUgU3BhdGlhbEltYWdlUmVmLFxuICB0eXBlIFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIHR5cGUgU3BhdGlhbFRpbGVMZXZlbCxcbiAgdHlwZSBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG59IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBUaWxlS2V5IH0gZnJvbSAnLi9sb2QnO1xuaW1wb3J0IHsgaW5CYW5kIH0gZnJvbSAnLi9zcGF0aWFsLXBsYW5lcyc7XG5pbXBvcnQgeyBpbkJvdW5kcywgdHlwZSBTaGFwZSB9IGZyb20gJy4vc3BhdGlhbC1zZWxlY3Rpb24nO1xuXG4vKipcbiAqIFRoZSB0cmFuc2NyaXB0cyBvZiBhIHNlbGVjdGlvbiwgYnkgZ2VuZTogdGhlIG1vbGVjdWxlcyBvZiB0aGUgc2VsZWN0ZWQgY2VsbHMgKGVhY2ggdHJhbnNjcmlwdFxuICogdGlsZSBuYW1lcyB0aGUgY2VsbCBldmVyeSBtb2xlY3VsZSBsaWVzIGluKSwgb3IgdGhvc2UgaW5zaWRlIGRyYXduIHJlZ2lvbnMg4oCUIG92ZXIgdGhlIHdob2xlIGRlcHRoXG4gKiAoc3BhdGlhbCAzRCkgb3Igb24gb25lIHBsYW5lICh0aGUgMkQgdmlldyBvZiBhIHNsaWNlZCBkYXRhc2V0KS5cbiAqXG4gKiBSZWFkIGZyb20gdGhlIGZpbmVzdCBsZXZlbCBvZiB0aGUgdHJhbnNjcmlwdCBweXJhbWlkLCBldmVyeSBnZW5lIChgQUxMX0dFTkVTYCksIGFuZCBvbmx5IHRoZVxuICogdGlsZXMgdGhlIHNlbGVjdGlvbiB0b3VjaGVzOiBhIGNlbGwncyB0cmFuc2NyaXB0cyBsaWUgbmVhciBpdCwgYSByZWdpb24ncyBpbnNpZGUgaXRzIGJvdW5kcy5cbiAqIFB1cmUgYnV0IGZvciB0aGUgcG9ydDsgdGhlIGZhY2FkZSBkZWNpZGVzIHdoYXQgaXMgc2VsZWN0ZWQuXG4gKi9cblxuLyoqIEF0IG1vc3QgdGhpcyBtYW55IHRpbGVzIGFyZSByZWFkIGZvciBvbmUgbGlzdDsgYSBzZWxlY3Rpb24gc3Bhbm5pbmcgbW9yZSBpcyBjb3VudGVkIGluIHBhcnQuICovXG5leHBvcnQgY29uc3QgVFJBTlNDUklQVF9MSVNUX01BWF9USUxFUyA9IDIwNDg7XG4vKiogQWJvdXQgdGhpcyBtYW55IHRyYW5zY3JpcHRzIGF0IG1vc3QgYXJlIHJlYWQgZm9yIG9uZSBsaXN0IChlc3RpbWF0ZWQgZnJvbSB0aGUgZGF0YXNldCdzIG1lYW4pLiAqL1xuZXhwb3J0IGNvbnN0IFRSQU5TQ1JJUFRfTElTVF9NQVhfVFJBTlNDUklQVFMgPSAyMF8wMDBfMDAwO1xuLyoqIFRpbGVzIHJlYWQgYXQgb25jZS4gKi9cbmNvbnN0IENPTkNVUlJFTkNZID0gODtcbi8qKlxuICogSG93IGZhciBmcm9tIGEgY2VsbCdzIGNlbnRyZSBpdHMgdHJhbnNjcmlwdHMgYXJlIGxvb2tlZCBmb3IsIGluIG1pY3JvbnM6IHBhc3QgdGhlIGxhcmdlc3QgY2VsbHMnXG4gKiByZWFjaCAoYSBjZWxsJ3MgbW9sZWN1bGVzIGxpZSBpbnNpZGUgaXRzIG91dGxpbmU7IEJheXNvciBjZWxscyBvZiB0aGUgaWxldW0gYXJlIHVwIHRvIH4yNSDCtW0pLlxuICovXG5leHBvcnQgY29uc3QgQ0VMTF9SRUFDSF9NSUNST05TID0gMzA7XG5cbi8qKlxuICogSG93IG1hbnkgbGV2ZWwtMCB0aWxlcyBvbmUgbGlzdCBtYXkgcmVhZDoge0BsaW5rIFRSQU5TQ1JJUFRfTElTVF9NQVhfVElMRVN9LCBmZXdlciB3aGVuIHRoZVxuICogZGF0YXNldCdzIHRpbGVzIGFyZSBkZW5zZSAoaXRzIHRyYW5zY3JpcHRzIG92ZXIgdGhlIHRpbGVzIG9mIGl0cyBib3VuZHMpLCBzbyB0aGF0IGFib3V0XG4gKiB7QGxpbmsgVFJBTlNDUklQVF9MSVNUX01BWF9UUkFOU0NSSVBUU30gYXJlIHJlYWQgYXQgbW9zdCDigJQgYSB3aG9sZSBjZWxsIHR5cGUgb2YgYSBzcGFyc2Ugc2VjdGlvblxuICogaXMgcmVhZCB3aG9sZSwgb2YgYSBkZW5zZSBvbmUgaW4gcGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVCdWRnZXQobWV0YToge1xuICBib3VuZHM6IFNwYXRpYWxCb3VuZHM7XG4gIGNvdW50PzogbnVtYmVyO1xuICBsZXZlbHM6IHJlYWRvbmx5IFNwYXRpYWxUaWxlTGV2ZWxbXTtcbn0pOiBudW1iZXIge1xuICBjb25zdCBzaXplID0gbWV0YS5sZXZlbHNbMF0/LnRpbGVTaXplO1xuICBpZiAoIShzaXplID4gMCkgfHwgIW1ldGEuY291bnQpIHJldHVybiBUUkFOU0NSSVBUX0xJU1RfTUFYX1RJTEVTO1xuICBjb25zdCBbeDAsIHkwLCB4MSwgeTFdID0gbWV0YS5ib3VuZHM7XG4gIGNvbnN0IHRpbGVzID1cbiAgICAoTWF0aC5mbG9vcih4MSAvIHNpemUpIC0gTWF0aC5mbG9vcih4MCAvIHNpemUpICsgMSkgKiAoTWF0aC5mbG9vcih5MSAvIHNpemUpIC0gTWF0aC5mbG9vcih5MCAvIHNpemUpICsgMSk7XG4gIGNvbnN0IHBlclRpbGUgPSBtZXRhLmNvdW50IC8gTWF0aC5tYXgoMSwgdGlsZXMpO1xuICByZXR1cm4gTWF0aC5tYXgoMTYsIE1hdGgubWluKFRSQU5TQ1JJUFRfTElTVF9NQVhfVElMRVMsIE1hdGguZmxvb3IoVFJBTlNDUklQVF9MSVNUX01BWF9UUkFOU0NSSVBUUyAvIHBlclRpbGUpKSk7XG59XG5cbi8qKiBPbmUgZ2VuZSdzIHRyYW5zY3JpcHRzIGluIHRoZSBzZWxlY3Rpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVDb3VudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuLyoqIFdoYXQge0BsaW5rIGNvdW50VHJhbnNjcmlwdHN9IGZvdW5kLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2NyaXB0Q291bnQge1xuICB0b3RhbDogbnVtYmVyO1xuICAvKiogRGlzdGluY3QgY2VsbHMgdGhlIGNvdW50ZWQgdHJhbnNjcmlwdHMgbGllIGluICh0aG9zZSBpbiBubyBjZWxsIGFyZSBub3QgY291bnRlZCBoZXJlKS4gKi9cbiAgY2VsbHM6IG51bWJlcjtcbiAgLyoqIEdlbmVzIGJ5IGNvdW50LCBtb3N0IGZpcnN0LiAqL1xuICBnZW5lczogR2VuZUNvdW50W107XG4gIC8qKiBTb21lIHRpbGVzIGNvdWxkIG5vdCBiZSByZWFkIChvciB3ZXJlIGxlZnQgb3V0KTogdGhlIGNvdW50cyBhcmUgYSBsb3dlciBib3VuZC4gKi9cbiAgcGFydGlhbDogYm9vbGVhbjtcbn1cblxuLyoqIFdoaWNoIHRyYW5zY3JpcHRzIGNvdW50OiB0aG9zZSBvZiB0aGVzZSBjZWxscywgb3IgdGhvc2UgaW5zaWRlIHRoZXNlIHNoYXBlcyAoaW1hZ2UgcHgpLiAqL1xuZXhwb3J0IHR5cGUgVHJhbnNjcmlwdEZpbHRlciA9XG4gIHsga2luZDogJ2NlbGxzJzsgbWFzazogVWludDhBcnJheSB9IHwgeyBraW5kOiAnc2hhcGVzJzsgc2hhcGVzOiByZWFkb25seSBTaGFwZVtdOyBpbWFnZVJlZj86IFNwYXRpYWxJbWFnZVJlZiB9O1xuXG4vKipcbiAqIExldmVsLTAgdGlsZXMgd2l0aGluIGByZWFjaGAgb2YgdGhlIHNlbGVjdGVkIGNlbGxzJyBjZW50cmVzIChvYnNlcnZhdGlvbiB1bml0cyksIGNsaXBwZWQgdG9cbiAqIGBib3VuZHNgLiBXaGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gYG1heGAsIHRob3NlIGhvbGRpbmcgdGhlIG1vc3Qgc2VsZWN0ZWQgY2VsbHMgYXJlIGtlcHQgYW5kXG4gKiBgcGFydGlhbGAgc2F5cyBzby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVzQXJvdW5kQ2VsbHMoXG4gIG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgbWFzazogVWludDhBcnJheSxcbiAgcmVhY2g6IG51bWJlcixcbiAgbGV2ZWxzOiByZWFkb25seSBTcGF0aWFsVGlsZUxldmVsW10sXG4gIGJvdW5kczogU3BhdGlhbEJvdW5kcyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG1heCA9IFRSQU5TQ1JJUFRfTElTVF9NQVhfVElMRVMsXG4pOiB7IHRpbGVzOiBUaWxlS2V5W107IHBhcnRpYWw6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IHNpemUgPSBsZXZlbHNbMF0/LnRpbGVTaXplO1xuICBpZiAoIShzaXplID4gMCkpIHJldHVybiB7IHRpbGVzOiBbXSwgcGFydGlhbDogZmFsc2UgfTtcbiAgY29uc3Qgd2VpZ2h0ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgY29uc3QgbiA9IE1hdGgubWluKG9icy5jb3VudCwgbWFzay5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGlmICghbWFza1tpXSkgY29udGludWU7XG4gICAgY29uc3QgeCA9IG9icy54W2ldO1xuICAgIGNvbnN0IHkgPSBvYnMueVtpXTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHkpKSBjb250aW51ZTtcbiAgICBjb25zdCBbZ3gwLCBneDFdID0gc3Bhbih4IC0gcmVhY2gsIHggKyByZWFjaCwgc2l6ZSwgYm91bmRzPy5bMF0sIGJvdW5kcz8uWzJdKTtcbiAgICBjb25zdCBbZ3kwLCBneTFdID0gc3Bhbih5IC0gcmVhY2gsIHkgKyByZWFjaCwgc2l6ZSwgYm91bmRzPy5bMV0sIGJvdW5kcz8uWzNdKTtcbiAgICBmb3IgKGxldCBneSA9IGd5MDsgZ3kgPD0gZ3kxOyBneSsrKSB7XG4gICAgICBmb3IgKGxldCBneCA9IGd4MDsgZ3ggPD0gZ3gxOyBneCsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGAke2d4fSwke2d5fWA7XG4gICAgICAgIHdlaWdodC5zZXQoa2V5LCAod2VpZ2h0LmdldChrZXkpID8/IDApICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBwaWNrKHdlaWdodCwgbWF4KTtcbn1cblxuLyoqXG4gKiBMZXZlbC0wIHRpbGVzIHVuZGVyIGBzaGFwZXNgIChpbWFnZSBweCwgbWFwcGVkIHRvIG9ic2VydmF0aW9uIHVuaXRzIHRocm91Z2ggYGltYWdlUmVmYCksIGNsaXBwZWRcbiAqIHRvIGBib3VuZHNgOyBhdCBtb3N0IGBtYXhgLCB0aGUgbW9zdCBjb3ZlcmVkIGZpcnN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGlsZXNVbmRlclNoYXBlcyhcbiAgc2hhcGVzOiByZWFkb25seSBTaGFwZVtdLFxuICBpbWFnZVJlZjogU3BhdGlhbEltYWdlUmVmIHwgdW5kZWZpbmVkLFxuICBsZXZlbHM6IHJlYWRvbmx5IFNwYXRpYWxUaWxlTGV2ZWxbXSxcbiAgYm91bmRzOiBTcGF0aWFsQm91bmRzIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbWF4ID0gVFJBTlNDUklQVF9MSVNUX01BWF9USUxFUyxcbik6IHsgdGlsZXM6IFRpbGVLZXlbXTsgcGFydGlhbDogYm9vbGVhbiB9IHtcbiAgY29uc3Qgc2l6ZSA9IGxldmVsc1swXT8udGlsZVNpemU7XG4gIGlmICghKHNpemUgPiAwKSkgcmV0dXJuIHsgdGlsZXM6IFtdLCBwYXJ0aWFsOiBmYWxzZSB9O1xuICBjb25zdCBbc3gsIHN5XSA9IGltYWdlUmVmPy5zY2FsZSA/PyBbMSwgMV07XG4gIGNvbnN0IFt0eCwgdHldID0gaW1hZ2VSZWY/LnRyYW5zbGF0ZSA/PyBbMCwgMF07XG4gIGNvbnN0IHdlaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVzKSB7XG4gICAgY29uc3QgYiA9IHNoYXBlLmJvdW5kcztcbiAgICBjb25zdCBheCA9IChiLm1pblggLSB0eCkgLyBzeDtcbiAgICBjb25zdCBieCA9IChiLm1heFggLSB0eCkgLyBzeDtcbiAgICBjb25zdCBheSA9IChiLm1pblkgLSB0eSkgLyBzeTtcbiAgICBjb25zdCBieSA9IChiLm1heFkgLSB0eSkgLyBzeTtcbiAgICBjb25zdCBbZ3gwLCBneDFdID0gc3BhbihNYXRoLm1pbihheCwgYngpLCBNYXRoLm1heChheCwgYngpLCBzaXplLCBib3VuZHM/LlswXSwgYm91bmRzPy5bMl0pO1xuICAgIGNvbnN0IFtneTAsIGd5MV0gPSBzcGFuKE1hdGgubWluKGF5LCBieSksIE1hdGgubWF4KGF5LCBieSksIHNpemUsIGJvdW5kcz8uWzFdLCBib3VuZHM/LlszXSk7XG4gICAgZm9yIChsZXQgZ3kgPSBneTA7IGd5IDw9IGd5MTsgZ3krKykge1xuICAgICAgZm9yIChsZXQgZ3ggPSBneDA7IGd4IDw9IGd4MTsgZ3grKykge1xuICAgICAgICBjb25zdCBrZXkgPSBgJHtneH0sJHtneX1gO1xuICAgICAgICB3ZWlnaHQuc2V0KGtleSwgKHdlaWdodC5nZXQoa2V5KSA/PyAwKSArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcGljayh3ZWlnaHQsIG1heCk7XG59XG5cbi8qKiBUaGUgdGlsZSBpbmRpY2VzIGBbZzAsIGcxXWAgY292ZXJpbmcgYFthLCBiXWAgYWxvbmcgb25lIGF4aXMsIHdpdGhpbiB0aGUgYm91bmRzJyB0aWxlcy4gKi9cbmZ1bmN0aW9uIHNwYW4oYTogbnVtYmVyLCBiOiBudW1iZXIsIHNpemU6IG51bWJlciwgbG8/OiBudW1iZXIsIGhpPzogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gIGxldCBnMCA9IE1hdGguZmxvb3IoYSAvIHNpemUpO1xuICBsZXQgZzEgPSBNYXRoLmZsb29yKGIgLyBzaXplKTtcbiAgaWYgKGxvICE9PSB1bmRlZmluZWQgJiYgTnVtYmVyLmlzRmluaXRlKGxvKSkgZzAgPSBNYXRoLm1heChnMCwgTWF0aC5mbG9vcihsbyAvIHNpemUpKTtcbiAgaWYgKGhpICE9PSB1bmRlZmluZWQgJiYgTnVtYmVyLmlzRmluaXRlKGhpKSkgZzEgPSBNYXRoLm1pbihnMSwgTWF0aC5mbG9vcihoaSAvIHNpemUpKTtcbiAgcmV0dXJuIFtnMCwgZzFdO1xufVxuXG4vKiogVGhlIGBtYXhgIGhlYXZpZXN0IHRpbGVzIG9mIGB3ZWlnaHRgIChgXCJneCxneVwiYCDihpIgd2VpZ2h0KSwgYW5kIHdoZXRoZXIgYW55IHdlcmUgbGVmdCBvdXQuICovXG5mdW5jdGlvbiBwaWNrKHdlaWdodDogTWFwPHN0cmluZywgbnVtYmVyPiwgbWF4OiBudW1iZXIpOiB7IHRpbGVzOiBUaWxlS2V5W107IHBhcnRpYWw6IGJvb2xlYW4gfSB7XG4gIGxldCBlbnRyaWVzID0gWy4uLndlaWdodC5lbnRyaWVzKCldO1xuICBjb25zdCBwYXJ0aWFsID0gZW50cmllcy5sZW5ndGggPiBtYXg7XG4gIGlmIChwYXJ0aWFsKSBlbnRyaWVzID0gZW50cmllcy5zb3J0KChhLCBiKSA9PiBiWzFdIC0gYVsxXSkuc2xpY2UoMCwgbWF4KTtcbiAgY29uc3QgdGlsZXMgPSBlbnRyaWVzLm1hcCgoW2tleV0pID0+IHtcbiAgICBjb25zdCBbZ3gsIGd5XSA9IGtleS5zcGxpdCgnLCcpLm1hcChOdW1iZXIpO1xuICAgIHJldHVybiB7IGxldmVsOiAwLCBneCwgZ3kgfTtcbiAgfSk7XG4gIHJldHVybiB7IHRpbGVzLCBwYXJ0aWFsIH07XG59XG5cbi8qKlxuICogQ291bnQgdGhlIHRyYW5zY3JpcHRzIG9mIGB0aWxlc2AgKGxldmVsIDAsIGV2ZXJ5IGdlbmUpIHRoYXQgcGFzcyBgZmlsdGVyYCBhbmQsIHdoZW4gZ2l2ZW4sIGxpZSBpblxuICogdGhlIHogYGJhbmRgLCBieSBnZW5lIChgbmFtZXNgIGFyZSB0aGUgZGF0YXNldCdzIGdlbmVzIGJ5IGNvZGUsIGB0cmFuc2NyaXB0VGlsZXMuZ2VuZXNgKS5cbiAqIFJlc29sdmVzIG51bGwgb25jZSBgY2FuY2VsbGVkKClgIHNheXMgc287IGEgdGlsZSB0aGF0IGZhaWxzIHRvIGxvYWQgbGVhdmVzIHRoZSBjb3VudCBwYXJ0aWFsLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY291bnRUcmFuc2NyaXB0cyhvcHRzOiB7XG4gIHBvcnQ6IFNwYXRpYWxEYXRhUG9ydDtcbiAgdGlsZXM6IHJlYWRvbmx5IFRpbGVLZXlbXTtcbiAgcXVhbGl0eTogJ2hpZ2gnIHwgJ2FsbCc7XG4gIGZpbHRlcjogVHJhbnNjcmlwdEZpbHRlcjtcbiAgYmFuZD86IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0gfCBudWxsO1xuICBuYW1lcz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbDtcbiAgY2FuY2VsbGVkPzogKCkgPT4gYm9vbGVhbjtcbiAgLyoqIFRpbGVzIGxlZnQgb3V0IGJlZm9yZSBjb3VudGluZyAoc2VlIHtAbGluayB0aWxlc0Fyb3VuZENlbGxzfSkuICovXG4gIHBhcnRpYWw/OiBib29sZWFuO1xufSk6IFByb21pc2U8VHJhbnNjcmlwdENvdW50IHwgbnVsbD4ge1xuICBjb25zdCB7IHBvcnQsIHRpbGVzLCBmaWx0ZXIsIGJhbmQgfSA9IG9wdHM7XG4gIGNvbnN0IGdldFRpbGUgPSBwb3J0LmdldFRyYW5zY3JpcHRUaWxlPy5iaW5kKHBvcnQpO1xuICBpZiAoIWdldFRpbGUpIHJldHVybiBudWxsO1xuICBjb25zdCBieUdlbmUgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBjb25zdCBjZWxscyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBsZXQgdG90YWwgPSAwO1xuICBsZXQgZmFpbGVkID0gMDtcbiAgbGV0IG5leHQgPSAwO1xuICBjb25zdCBhY2NlcHQgPSBhY2NlcHRvcihmaWx0ZXIpO1xuXG4gIGNvbnN0IGFkZCA9ICh0aWxlOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUpID0+IHtcbiAgICBjb25zdCB7IHgsIHksIHosIGdlbmUsIHdlaWdodCwgb2JzZXJ2YXRpb24gfSA9IHRpbGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aWxlLmNvdW50OyBpKyspIHtcbiAgICAgIGlmIChiYW5kICYmICFpbkJhbmQoeltpXSwgYmFuZCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbyA9IG9ic2VydmF0aW9uW2ldO1xuICAgICAgaWYgKCFhY2NlcHQoeFtpXSwgeVtpXSwgbykpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgdyA9IHdlaWdodFtpXSB8fCAxO1xuICAgICAgdG90YWwgKz0gdztcbiAgICAgIGJ5R2VuZS5zZXQoZ2VuZVtpXSwgKGJ5R2VuZS5nZXQoZ2VuZVtpXSkgPz8gMCkgKyB3KTtcbiAgICAgIGlmIChvICE9PSBOT19PQlNFUlZBVElPTikgY2VsbHMuYWRkKG8pO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB3b3JrZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgd2hpbGUgKG5leHQgPCB0aWxlcy5sZW5ndGgpIHtcbiAgICAgIGlmIChvcHRzLmNhbmNlbGxlZD8uKCkpIHJldHVybjtcbiAgICAgIGNvbnN0IGsgPSB0aWxlc1tuZXh0KytdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWRkKGF3YWl0IGdldFRpbGUoMCwgay5neCwgay5neSwgeyBnZW5lczogW0FMTF9HRU5FU10sIHF1YWxpdHk6IG9wdHMucXVhbGl0eSB9KSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgZmFpbGVkKys7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1pbihDT05DVVJSRU5DWSwgdGlsZXMubGVuZ3RoKSB9LCB3b3JrZXIpKTtcbiAgaWYgKG9wdHMuY2FuY2VsbGVkPy4oKSkgcmV0dXJuIG51bGw7XG4gIGlmICh0aWxlcy5sZW5ndGggPiAwICYmIGZhaWxlZCA9PT0gdGlsZXMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ3RoZSB0cmFuc2NyaXB0cyBjb3VsZCBub3QgYmUgcmVhZCcpO1xuXG4gIGNvbnN0IG5hbWVzID0gb3B0cy5uYW1lcztcbiAgY29uc3QgZ2VuZXMgPSBbLi4uYnlHZW5lLmVudHJpZXMoKV1cbiAgICAubWFwKChbY29kZSwgY291bnRdKSA9PiAoeyBuYW1lOiBuYW1lcz8uW2NvZGVdIHx8IGBnZW5lICR7Y29kZX1gLCBjb3VudCB9KSlcbiAgICAuc29ydCgoYSwgYikgPT4gYi5jb3VudCAtIGEuY291bnQgfHwgYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gIHJldHVybiB7IHRvdGFsLCBjZWxsczogY2VsbHMuc2l6ZSwgZ2VuZXMsIHBhcnRpYWw6ICEhb3B0cy5wYXJ0aWFsIHx8IGZhaWxlZCA+IDAgfTtcbn1cblxuLyoqIFdoZXRoZXIgYSB0cmFuc2NyaXB0IGF0ICh4LCB5KSwgaW4gY2VsbCBgb2AsIHBhc3NlcyBgZmlsdGVyYC4gKi9cbmZ1bmN0aW9uIGFjY2VwdG9yKGZpbHRlcjogVHJhbnNjcmlwdEZpbHRlcik6ICh4OiBudW1iZXIsIHk6IG51bWJlciwgbzogbnVtYmVyKSA9PiBib29sZWFuIHtcbiAgaWYgKGZpbHRlci5raW5kID09PSAnY2VsbHMnKSB7XG4gICAgY29uc3QgbWFzayA9IGZpbHRlci5tYXNrO1xuICAgIHJldHVybiAoX3gsIF95LCBvKSA9PiBvICE9PSBOT19PQlNFUlZBVElPTiAmJiBvIDwgbWFzay5sZW5ndGggJiYgbWFza1tvXSA9PT0gMTtcbiAgfVxuICBjb25zdCBzaGFwZXMgPSBmaWx0ZXIuc2hhcGVzO1xuICBjb25zdCBbc3gsIHN5XSA9IGZpbHRlci5pbWFnZVJlZj8uc2NhbGUgPz8gWzEsIDFdO1xuICBjb25zdCBbdHgsIHR5XSA9IGZpbHRlci5pbWFnZVJlZj8udHJhbnNsYXRlID8/IFswLCAwXTtcbiAgcmV0dXJuICh4LCB5KSA9PiB7XG4gICAgY29uc3QgcHggPSB4ICogc3ggKyB0eDtcbiAgICBjb25zdCBweSA9IHkgKiBzeSArIHR5O1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVzKSB7XG4gICAgICBpZiAoaW5Cb3VuZHMoc2hhcGUuYm91bmRzLCBweCwgcHkpICYmIHNoYXBlLmhpdChweCwgcHkpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xufVxuXG4vKiogVGhlIGNlbGxzIG9mIGBjYXRlZ29yaWVzYCAobmFtZXMpIGluIGEgY2F0ZWdvcmljYWwgY29sdW1uJ3MgYGNvZGVzYCwgYXMgYSBzZWxlY3Rpb24gbWFzay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZWxsc09mQ2F0ZWdvcmllcyhcbiAgY29kZXM6IEFycmF5TGlrZTxudW1iZXI+LFxuICBjYXRlZ29yaWVzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogeyBtYXNrOiBVaW50OEFycmF5OyBjb3VudDogbnVtYmVyIH0ge1xuICBjb25zdCB3YW50ZWQgPSBuZXcgU2V0KG5hbWVzKTtcbiAgY29uc3QgaGl0ID0gbmV3IFVpbnQ4QXJyYXkoY2F0ZWdvcmllcy5sZW5ndGgpO1xuICBjYXRlZ29yaWVzLmZvckVhY2goKGMsIGspID0+IChoaXRba10gPSB3YW50ZWQuaGFzKGMpID8gMSA6IDApKTtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGNvZGVzLmxlbmd0aCk7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaGl0W2NvZGVzW2ldXSkge1xuICAgICAgbWFza1tpXSA9IDE7XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuIl19